missions/hud.lua
2018-07-20 09:27:13 +02:00

179 lines
4.3 KiB
Lua

local HUD_POSITION = {x = 0.5, y = 0.2}
local HUD_ALIGNMENT = {x = 1, y = 0}
local hud = {} -- playerName -> {}
-- returns the image (item, node, tool) or ""
local get_image = function(name)
-- minetest.registered_items[name].inventory_image
-- minetest.registered_tools[name].inventory_image
-- minetest.registered_nodes["default:stone"].tiles[1]
-- TODO: look at drawer code
if name == nil then
return ""
end
local node = minetest.registered_nodes[name]
if node ~= nil and node.tiles ~= nil and table.getn(node.tiles) == 1 then
return minetest.inventorycube(node.tiles[1],node.tiles[1],node.tiles[1])
end
local item = minetest.registered_items[name]
if item ~= nil and item.inventory_image ~= nil then
return item.inventory_image
end
local tool = minetest.registered_tools[name]
if tool ~= nil and tool.inventory_image ~= nil then
return tool.inventory_image
end
-- none found
return ""
end
minetest.register_on_joinplayer(function(player)
local playername = player:get_player_name()
local data = {}
data.title = player:hud_add({
hud_elem_type = "text",
position = HUD_POSITION,
offset = {x = 0, y = 0},
text = "",
alignment = HUD_ALIGNMENT,
scale = {x = 100, y = 100},
number = 0xFFFFFF
})
data.mission = player:hud_add({
hud_elem_type = "text",
position = HUD_POSITION,
offset = {x = 0, y = 35},
text = "",
alignment = HUD_ALIGNMENT,
scale = {x = 100, y = 100},
number = 0x00FF00
})
data.time = player:hud_add({
hud_elem_type = "text",
position = HUD_POSITION,
offset = {x = 0, y = 70},
text = "",
alignment = HUD_ALIGNMENT,
scale = {x = 100, y = 100},
number = 0x00FF00
})
hud[playername] = data
end)
minetest.register_on_leaveplayer(function(player)
local playername = player:get_player_name()
hud[playername] = nil
end)
local format_time = function(seconds)
local minutes = math.floor(seconds / 60)
local secs = seconds - (minutes * 60)
if secs < 10 then
return minutes .. ":0" .. secs
else
return minutes .. ":" ..secs
end
end
missions.hud_remove_mission = function(player, mission)
-- remove waypoints from elapsed mission
if mission.hud ~= nil and mission.hud.source ~= nil then
player:hud_remove(mission.hud.source)
end
if mission.hud ~= nil and mission.hud.target ~= nil then
player:hud_remove(mission.hud.target)
end
end
missions.hud_update = function(player, playermissions)
local playername = player:get_player_name()
local now = os.time(os.date("!*t"))
local data = hud[playername]
local topMission = nil
if data ~= nil and playermissions ~= nil then
for i,mission in pairs(playermissions) do
if mission.hud == nil then
if mission.type == "transport" then
-- add waypoint markers if new mission
mission.hud = {}
mission.hud.target = player:hud_add({
hud_elem_type = "waypoint",
name = mission.target.title .. "(Destination)",
text = "m",
number = 0x0000FF,
world_pos = {x=mission.target.x, y=mission.target.y, z=mission.target.z}
})
end
end
-- top mission check
if topMission == nil then
topMission = mission
else
local remainingTime = mission.time - (now - mission.start)
local topRemainingTime = topMission.time - (now - topMission.start)
if remainingTime < topRemainingTime then
topMission = mission
end
end
end
end
if topMission ~= nil then
-- show the first mission to time out
local remainingTime = topMission.time - (now - topMission.start)
player:hud_change(data.title, "text", "Missions: (1/" .. table.getn(playermissions) .. ")")
player:hud_change(data.mission, "text", topMission.name .. " (" .. topMission.type .. ")")
player:hud_change(data.time, "text", "" .. format_time(remainingTime))
if remainingTime > 60 then
player:hud_change(data.time, "number", 0x00FF00)
player:hud_change(data.mission, "number", 0x00FF00)
else
player:hud_change(data.time, "number", 0xFF0000)
player:hud_change(data.mission, "number", 0xFF0000)
end
else
-- no missions running
player:hud_change(data.title, "text", "")
player:hud_change(data.mission, "text", "")
player:hud_change(data.time, "text", "")
local i = 1
while i <= hud_context_count do -- 1..n
player:hud_change(data.context[i], "text", "")
player:hud_change(data.contextcount[i], "text", "")
i = i + 1
end
end
end