forked from Mineclonia/Mineclonia
Add moving marker for the player
This commit is contained in:
parent
ea272c40a0
commit
b6540c0d80
|
@ -26,16 +26,20 @@ local loaded_maps = {}
|
||||||
local c_air = minetest.get_content_id("air")
|
local c_air = minetest.get_content_id("air")
|
||||||
|
|
||||||
function mcl_maps.create_map(pos)
|
function mcl_maps.create_map(pos)
|
||||||
|
local minp = vector.multiply(vector.floor(vector.divide(pos, 128)), 128)
|
||||||
|
local maxp = vector.add(minp, vector.new(127, 127, 127))
|
||||||
|
|
||||||
local itemstack = ItemStack("mcl_maps:filled_map")
|
local itemstack = ItemStack("mcl_maps:filled_map")
|
||||||
local meta = itemstack:get_meta()
|
local meta = itemstack:get_meta()
|
||||||
local next_id = storage:get_int("next_id")
|
local next_id = storage:get_int("next_id")
|
||||||
storage:set_int("next_id", next_id + 1)
|
storage:set_int("next_id", next_id + 1)
|
||||||
local id = tostring(next_id)
|
local id = tostring(next_id)
|
||||||
meta:set_string("mcl_maps:id", id)
|
meta:set_string("mcl_maps:id", id)
|
||||||
|
meta:set_string("mcl_maps:minp", minetest.pos_to_string(minp))
|
||||||
|
meta:set_string("mcl_maps:maxp", minetest.pos_to_string(maxp))
|
||||||
tt.reload_itemstack_description(itemstack)
|
tt.reload_itemstack_description(itemstack)
|
||||||
|
|
||||||
creating_maps[id] = true
|
creating_maps[id] = true
|
||||||
local minp = vector.multiply(vector.floor(vector.divide(pos, 128)), 128)
|
|
||||||
local maxp = vector.add(minp, vector.new(127, 127, 127))
|
|
||||||
minetest.emerge_area(minp, maxp, function(blockpos, action, calls_remaining)
|
minetest.emerge_area(minp, maxp, function(blockpos, action, calls_remaining)
|
||||||
if calls_remaining > 0 then
|
if calls_remaining > 0 then
|
||||||
return
|
return
|
||||||
|
@ -259,14 +263,20 @@ local maps = {}
|
||||||
local huds = {}
|
local huds = {}
|
||||||
|
|
||||||
minetest.register_on_joinplayer(function(player)
|
minetest.register_on_joinplayer(function(player)
|
||||||
huds[player] = player:hud_add({
|
local map_def = {
|
||||||
hud_elem_type = "image",
|
hud_elem_type = "image",
|
||||||
text = "blank.png",
|
text = "blank.png",
|
||||||
position = {x = 0.875, y = 0.8},
|
position = {x = 0.75, y = 0.8},
|
||||||
alignment = {x = -1, y = -1},
|
alignment = {x = 0, y = -1},
|
||||||
offset = {x = 0, y = 0},
|
offset = {x = 0, y = 0},
|
||||||
scale = {x = 2, y = 2},
|
scale = {x = 2, y = 2},
|
||||||
})
|
}
|
||||||
|
local marker_def = table.copy(map_def)
|
||||||
|
marker_def.alignment = {x = 0, y = 0}
|
||||||
|
huds[player] = {
|
||||||
|
map = player:hud_add(map_def),
|
||||||
|
marker = player:hud_add(marker_def),
|
||||||
|
}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
minetest.register_on_leaveplayer(function(player)
|
minetest.register_on_leaveplayer(function(player)
|
||||||
|
@ -278,6 +288,7 @@ minetest.register_globalstep(function(dtime)
|
||||||
for _, player in pairs(minetest.get_connected_players()) do
|
for _, player in pairs(minetest.get_connected_players()) do
|
||||||
local wield = player:get_wielded_item()
|
local wield = player:get_wielded_item()
|
||||||
local texture = mcl_maps.load_map_item(wield)
|
local texture = mcl_maps.load_map_item(wield)
|
||||||
|
local hud = huds[player]
|
||||||
if texture then
|
if texture then
|
||||||
local wield_def = wield:get_definition()
|
local wield_def = wield:get_definition()
|
||||||
local hand_def = player:get_inventory():get_stack("hand", 1):get_definition()
|
local hand_def = player:get_inventory():get_stack("hand", 1):get_definition()
|
||||||
|
@ -288,11 +299,43 @@ minetest.register_globalstep(function(dtime)
|
||||||
end
|
end
|
||||||
|
|
||||||
if texture ~= maps[player] then
|
if texture ~= maps[player] then
|
||||||
player:hud_change(huds[player], "text", "[combine:140x140:0,0=mcl_maps_map_background.png:6,6=" .. texture)
|
player:hud_change(hud.map, "text", "[combine:140x140:0,0=mcl_maps_map_background.png:6,6=" .. texture)
|
||||||
maps[player] = texture
|
maps[player] = texture
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local pos = vector.round(player:get_pos())
|
||||||
|
local meta = wield:get_meta()
|
||||||
|
local minp = minetest.string_to_pos(meta:get_string("mcl_maps:minp"))
|
||||||
|
local maxp = minetest.string_to_pos(meta:get_string("mcl_maps:maxp"))
|
||||||
|
|
||||||
|
local marker = "mcl_maps_player_arrow.png"
|
||||||
|
|
||||||
|
if pos.x < minp.x then
|
||||||
|
marker = "mcl_maps_player_dot.png"
|
||||||
|
pos.x = minp.x
|
||||||
|
elseif pos.x > maxp.x then
|
||||||
|
marker = "mcl_maps_player_dot.png"
|
||||||
|
pos.x = maxp.x
|
||||||
|
end
|
||||||
|
|
||||||
|
if pos.z < minp.z then
|
||||||
|
marker = "mcl_maps_player_dot.png"
|
||||||
|
pos.z = minp.z
|
||||||
|
elseif pos.z > maxp.z then
|
||||||
|
marker = "mcl_maps_player_dot.png"
|
||||||
|
pos.z = maxp.z
|
||||||
|
end
|
||||||
|
|
||||||
|
if marker == "mcl_maps_player_arrow.png" then
|
||||||
|
local yaw = (math.floor(player:get_look_horizontal() * 180 / math.pi / 90 + 0.5) % 4) * 90
|
||||||
|
marker = marker .. "^[transformR" .. yaw
|
||||||
|
end
|
||||||
|
|
||||||
|
player:hud_change(hud.marker, "text", marker)
|
||||||
|
player:hud_change(hud.marker, "offset", {x = (6 - 140 / 2 + pos.x - minp.x) * 2, y = (6 - 140 + maxp.z - pos.z) * 2})
|
||||||
elseif maps[player] then
|
elseif maps[player] then
|
||||||
player:hud_change(huds[player], "text", "blank.png")
|
player:hud_change(hud.map, "text", "blank.png")
|
||||||
|
player:hud_change(hud.marker, "text", "blank.png")
|
||||||
maps[player] = nil
|
maps[player] = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.0 KiB |
Loading…
Reference in New Issue