minetest_orienteering/init.lua

326 lines
9.7 KiB
Lua
Raw Normal View History

2016-07-29 11:37:16 +02:00
local S
2016-07-29 11:02:10 +02:00
if (minetest.get_modpath("intllib")) then
dofile(minetest.get_modpath("intllib").."/intllib.lua")
S = intllib.Getter(minetest.get_current_modname())
else
S = function ( s ) return s end
end
local orienteering = {}
orienteering.playerhuds = {}
2016-07-28 02:58:20 +02:00
orienteering.settings = {}
2016-07-29 11:02:10 +02:00
orienteering.settings.speed_unit = S("m/s")
orienteering.settings.length_unit = S("m")
-- Helper function to switch between 12h and 24 mode for the time
function toggle_time_mode(itemstack, user, pointed_thing)
local name = user:get_player_name()
if orienteering.playerhuds[name].twelve then
orienteering.playerhuds[name].twelve = false
else
orienteering.playerhuds[name].twelve = true
end
update_hud_displays(user)
end
2015-08-28 20:39:05 +02:00
-- Displays height (Y)
minetest.register_tool("orienteering:altimeter", {
2016-07-29 11:02:10 +02:00
description = S("Altimeter"),
2015-08-28 20:39:05 +02:00
wield_image = "orienteering_altimeter.png",
inventory_image = "orienteering_altimeter.png",
})
-- Displays X and Z coordinates
minetest.register_tool("orienteering:triangulator", {
2016-07-29 11:02:10 +02:00
description = S("Triangulator"),
2015-08-28 20:39:05 +02:00
wield_image = "orienteering_triangulator.png",
inventory_image = "orienteering_triangulator.png",
})
2016-07-28 23:46:52 +02:00
-- Displays player yaw
-- TODO: calculate yaw difference between 2 points
2015-08-28 20:39:05 +02:00
minetest.register_tool("orienteering:compass", {
2016-07-29 11:02:10 +02:00
description = S("Compass"),
2015-08-28 20:39:05 +02:00
wield_image = "orienteering_compass_wield.png",
inventory_image = "orienteering_compass_inv.png",
})
2016-07-28 23:46:52 +02:00
-- Displays player pitch
-- TODO: calculate pitch difference between 2 points
2015-08-28 20:39:05 +02:00
minetest.register_tool("orienteering:sextant", {
2016-07-29 11:02:10 +02:00
description = S("Sextant"),
2015-08-28 20:39:05 +02:00
wield_image = "orienteering_sextant_wield.png",
inventory_image = "orienteering_sextant_inv.png",
})
2016-07-28 23:46:12 +02:00
-- Ultimate orienteering tool: Displays X,Y,Z, yaw, pitch, time, speed and enables the minimap
minetest.register_tool("orienteering:quadcorder", {
2016-07-29 11:02:10 +02:00
description = S("Quadcorder"),
2016-07-28 23:46:12 +02:00
wield_image = "orienteering_quadcorder.png",
wield_scale = { x=1, y=1, z=3.5 },
inventory_image = "orienteering_quadcorder.png",
on_use = toggle_time_mode,
2016-07-28 23:46:12 +02:00
})
2015-08-28 20:39:05 +02:00
-- Displays game time
minetest.register_tool("orienteering:watch", {
2016-07-29 11:02:10 +02:00
description = S("Watch"),
2015-08-28 20:39:05 +02:00
wield_image = "orienteering_watch.png",
inventory_image = "orienteering_watch.png",
on_use = toggle_time_mode,
2015-08-28 20:39:05 +02:00
})
-- Displays speed
minetest.register_tool("orienteering:speedometer", {
2016-07-29 11:02:10 +02:00
description = S("Speedometer"),
2015-08-28 20:39:05 +02:00
wield_image = "orienteering_speedometer_wield.png",
inventory_image = "orienteering_speedometer_inv.png",
})
-- Enables minimap
minetest.register_tool("orienteering:automapper", {
2016-07-29 11:02:10 +02:00
description = S("Automapper"),
2015-08-28 20:39:05 +02:00
wield_image = "orienteering_automapper_wield.png",
2016-07-28 23:46:12 +02:00
wield_scale = { x=1, y=1, z=2 },
2015-08-28 20:39:05 +02:00
inventory_image = "orienteering_automapper_inv.png",
})
2016-07-28 03:39:33 +02:00
-- Displays X,Y,Z coordinates, yaw and game time
2015-08-28 20:39:05 +02:00
minetest.register_tool("orienteering:gps", {
2016-07-29 11:02:10 +02:00
description = S("GPS device"),
2015-08-28 20:39:05 +02:00
wield_image = "orienteering_gps_wield.png",
2016-07-28 23:46:12 +02:00
wield_scale = { x=1, y=1, z=2 },
2015-08-28 20:39:05 +02:00
inventory_image = "orienteering_gps_inv.png",
on_use = toggle_time_mode,
2015-08-28 20:39:05 +02:00
})
2016-07-28 03:39:33 +02:00
if minetest.get_modpath("default") ~= nil then
-- Register crafts
minetest.register_craft({
output = "orienteering:altimeter",
recipe = {
{"default:copper_ingot"},
{"default:copper_ingot"},
{"default:copper_ingot"},
}
})
minetest.register_craft({
output = "orienteering:triangulator",
recipe = {
{"", "default:bronze_ingot", ""},
{"default:bronze_ingot", "", "default:bronze_ingot"},
}
})
minetest.register_craft({
output = "orienteering:sextant",
recipe = {
{"", "default:gold_ingot", ""},
{"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"},
}
})
minetest.register_craft({
output = "orienteering:compass",
recipe = {
{"", "default:copper_ingot", ""},
{"default:copper_ingot", "group:stick", "default:copper_ingot"},
{"", "default:copper_ingot", ""},
}
})
minetest.register_craft({
output = "orienteering:speedometer",
recipe = {
{"", "default:steel_ingot", ""},
{"default:steel_ingot", "group:stick", "default:steel_ingot"},
{"", "default:steel_ingot", ""},
}
})
minetest.register_craft({
output = "orienteering:automapper",
recipe = {
{"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"},
{"default:mese_crystal", "default:obsidian_shard", "default:mese_crystal"},
{"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}
}
})
minetest.register_craft({
output = "orienteering:gps",
recipe = {
{ "default:gold_ingot", "orienteering:triangulator", "default:gold_ingot" },
{ "orienteering:compass", "default:bronze_ingot", "orienteering:watch" },
{ "default:steel_ingot", "orienteering:altimeter", "default:steel_ingot" }
}
})
2016-07-29 00:25:28 +02:00
minetest.register_craft({
output = "orienteering:quadcorder",
recipe = {
{ "default:gold_ingot", "default:gold_ingot", "default:gold_ingot" },
{ "orienteering:speedometer", "default:diamond", "orienteering:automapper", },
{ "orienteering:sextant", "default:diamond", "orienteering:gps" }
}
})
2016-07-28 03:39:33 +02:00
minetest.register_craft({
output = "orienteering:watch",
recipe = {
{ "default:copper_ingot" },
{ "default:glass" },
{ "default:copper_ingot" }
}
})
end
2015-08-28 20:39:05 +02:00
2015-08-28 21:02:08 +02:00
function update_automapper(player)
local inv = player:get_inventory()
2016-07-28 23:53:53 +02:00
if inv:contains_item("main", "orienteering:automapper") or inv:contains_item("main", "orienteering:quadcorder") then
2015-08-28 21:02:08 +02:00
player:hud_set_flags({minimap = true})
else
player:hud_set_flags({minimap = false})
end
end
function init_hud(player)
2015-08-28 21:02:08 +02:00
update_automapper(player)
local name = player:get_player_name()
orienteering.playerhuds[name] = {}
local tablenames = { "pos", "angles", "time", "speed" }
for i=1, #tablenames do
orienteering.playerhuds[name][tablenames[i]] = player:hud_add({
hud_elem_type = "text",
text = "",
position = { x = 0.5, y = 0.001 },
offset = { x = 0, y = 0+20*i },
alignment = { x = 0, y = 0 },
number = 0xFFFFFF,
scale= { x = 100, y = 20 },
})
end
orienteering.playerhuds[name].twelve = false
end
2015-08-28 21:02:08 +02:00
function update_hud_displays(player)
local name = player:get_player_name()
local inv = player:get_inventory()
2016-07-28 23:46:12 +02:00
local gps, altimeter, triangulator, compass, sextant, watch, speedometer, quadcorder
if inv:contains_item("main", "orienteering:gps") then
gps = true
end
if inv:contains_item("main", "orienteering:altimeter") then
altimeter = true
end
if inv:contains_item("main", "orienteering:triangulator") then
triangulator = true
end
if inv:contains_item("main", "orienteering:compass") then
compass = true
end
if inv:contains_item("main", "orienteering:sextant") then
sextant = true
end
if inv:contains_item("main", "orienteering:watch") then
watch = true
end
if inv:contains_item("main", "orienteering:speedometer") then
speedometer = true
end
2016-07-28 23:46:12 +02:00
if inv:contains_item("main", "orienteering:quadcorder") then
quadcorder = true
end
local str_pos, str_angles, str_time, str_speed
local pos = vector.apply(player:getpos(), math.floor)
2016-07-28 23:46:12 +02:00
if (altimeter and triangulator) or gps or quadcorder then
2016-07-29 11:02:10 +02:00
str_pos = string.format(S("Coordinates: X=%d, Y=%d, Z=%d"), pos.x, pos.y, pos.z)
elseif altimeter then
2016-07-29 11:02:10 +02:00
str_pos = string.format(S("Height: Y=%d"), pos.y)
elseif triangulator then
2016-07-29 11:02:10 +02:00
str_pos = string.format(S("Coordinates: X=%d, Z=%d"), pos.x, pos.z)
else
str_pos = ""
end
2016-07-29 11:02:10 +02:00
local yaw = (player:get_look_yaw()-math.pi*0.5)/(2*math.pi)*360
local pitch = player:get_look_pitch()/math.pi*360
2016-07-28 23:46:12 +02:00
if ((compass or gps) and sextant) or quadcorder then
2016-07-29 11:02:10 +02:00
str_angles = string.format(S("Yaw: %.1f°, pitch: %.1f°"), yaw, pitch)
elseif compass or gps then
2016-07-29 11:02:10 +02:00
str_angles = string.format(S("Yaw: %.1f°"), yaw)
elseif sextant then
2016-07-29 11:02:10 +02:00
str_angles = string.format(S("Pitch: %.1f°"), pitch)
else
str_angles = ""
end
local time = minetest.get_timeofday()
2016-07-28 23:46:12 +02:00
if watch or gps or quadcorder then
local totalminutes = time * 1440
local hours = math.floor(totalminutes / 60)
local minutes = math.floor(math.fmod(totalminutes, 60))
local twelve = orienteering.playerhuds[name].twelve
if twelve then
local ampm
if hours == 12 and minutes == 0 then
2016-07-29 11:02:10 +02:00
str_time = S("Time: noon")
elseif hours == 0 and minutes == 0 then
2016-07-29 11:02:10 +02:00
str_time = S("Time: midnight")
else
2016-07-29 11:02:10 +02:00
if hours >= 12 then ampm = S("p.m.") else ampm = S("a.m.") end
hours = math.fmod(hours, 12)
if hours == 0 then hours = 12 end
2016-07-29 11:02:10 +02:00
str_time = string.format(S("Time: %i:%02i %s"), hours, minutes, ampm)
end
else
2016-07-29 11:02:10 +02:00
str_time = string.format(S("Time: %02i:%02i"), hours, minutes)
end
else
str_time = ""
end
2016-07-28 02:58:20 +02:00
local speed = vector.length(player:get_player_velocity())
2016-07-28 23:46:12 +02:00
if speedometer or quadcorder then
2016-07-29 11:39:58 +02:00
str_speed = string.format(S("Speed: %.1f %s"), speed, orienteering.settings.speed_unit)
else
str_speed = ""
end
player:hud_change(orienteering.playerhuds[name].pos, "text", str_pos)
player:hud_change(orienteering.playerhuds[name].angles, "text", str_angles)
player:hud_change(orienteering.playerhuds[name].time, "text", str_time)
player:hud_change(orienteering.playerhuds[name].speed, "text", str_speed)
end
minetest.register_on_newplayer(init_hud)
minetest.register_on_joinplayer(init_hud)
minetest.register_on_leaveplayer(function(player)
orienteering.playerhuds[player:get_player_name()] = nil
2015-08-28 21:02:08 +02:00
end)
local updatetimer = 0
minetest.register_globalstep(function(dtime)
updatetimer = updatetimer + dtime
if updatetimer > 0.1 then
local players = minetest.get_connected_players()
for i=1, #players do
update_automapper(players[i])
update_hud_displays(players[i])
2015-08-28 21:02:08 +02:00
end
updatetimer = updatetimer - dtime
end
end)
2016-08-01 15:26:56 +02:00
if minetest.get_modpath("awards") ~= nil and minetest.get_modpath("default") ~= nil then
awards.register_achievement("orienteering_quadcorder", {
title = S("Master of Orienteering"),
description = S("Craft a quadcorder."),
icon = "orienteering_quadcorder.png",
trigger = {
type = "craft",
item = "orienteering:quadcorder",
target = 1
}
})
end