forked from Mineclonia/Mineclonia
Add markers to maps (using banners)
This commit is contained in:
parent
f0a925aa20
commit
6ff0303802
|
@ -343,6 +343,18 @@ minetest.register_node("mcl_banners:hanging_banner", {
|
|||
end,
|
||||
})
|
||||
|
||||
function mcl_banners.get_banner_colorid(pos)
|
||||
local node_meta = minetest.get_meta(pos)
|
||||
local banner_item = node_meta:get_inventory():get_stack("banner", 1)
|
||||
local banner_item_name = banner_item:get_name()
|
||||
local colorid = colors_reverse[banner_item_name]
|
||||
return colorid
|
||||
end
|
||||
|
||||
function mcl_banners.colorid_to_hexcolor(colorid)
|
||||
return mcl_banners.colors[colorid][4]
|
||||
end
|
||||
|
||||
-- for pattern_name, pattern in pairs(patterns) do
|
||||
for colorid, colortab in pairs(mcl_banners.colors) do
|
||||
for i, pattern_name in ipairs(pattern_names) do
|
||||
|
|
|
@ -70,11 +70,24 @@ minetest.register_entity("mcl_itemframes:map", {
|
|||
self._pos = { x = 0/0, y = 0/0, z = 0/0 }
|
||||
self._minp = { x = 0/0, y = 0/0, z = 0/0 }
|
||||
self._maxp = { x = 0/0, y = 0/0, z = 0/0 }
|
||||
self._banners = {}
|
||||
else
|
||||
self.id = data.id
|
||||
self._pos = data._pos
|
||||
self._minp = data._minp
|
||||
self._maxp = data._maxp
|
||||
self._banners = data._banners
|
||||
end
|
||||
local texture = mcl_maps.load_map(self.id)
|
||||
if nil ~= self._banners and #self._banners > 0 then
|
||||
local border = { top = 0, left = 0, bottom = 0, right = 0 }
|
||||
local banner_overlay = mcl_maps.make_banner_overlay(
|
||||
self._banners,
|
||||
self._minp,
|
||||
self._maxp,
|
||||
border
|
||||
)
|
||||
texture = texture .. banner_overlay
|
||||
end
|
||||
local marker = ""
|
||||
if (
|
||||
|
@ -95,7 +108,7 @@ minetest.register_entity("mcl_itemframes:map", {
|
|||
end
|
||||
self.object:set_properties(
|
||||
{
|
||||
textures = { mcl_maps.load_map(self.id) .. marker }
|
||||
textures = { texture .. marker }
|
||||
}
|
||||
)
|
||||
end,
|
||||
|
@ -105,6 +118,7 @@ minetest.register_entity("mcl_itemframes:map", {
|
|||
_pos = self._pos,
|
||||
_minp = self._minp,
|
||||
_maxp = self._maxp,
|
||||
_banners = self._banners,
|
||||
}
|
||||
return minetest.serialize(data)
|
||||
end,
|
||||
|
@ -164,11 +178,19 @@ local update_item_entity = function(pos, node, param2)
|
|||
e:set_yaw(yaw)
|
||||
end
|
||||
else
|
||||
local banners
|
||||
local banners_string = meta:get_string("mcl_maps:banners")
|
||||
if "" == banners_string then
|
||||
banners = {}
|
||||
else
|
||||
banners = minetest.deserialize(banners_string)
|
||||
end
|
||||
local staticdata = {
|
||||
id = map_id,
|
||||
_pos = pos,
|
||||
_minp = minetest.string_to_pos(meta:get_string("mcl_maps:minp")),
|
||||
_maxp = minetest.string_to_pos(meta:get_string("mcl_maps:maxp")),
|
||||
_banners = banners,
|
||||
}
|
||||
local e = minetest.add_entity(pos, "mcl_itemframes:map", minetest.serialize(staticdata))
|
||||
e:set_yaw(yaw)
|
||||
|
|
|
@ -316,6 +316,44 @@ local filled_def = {
|
|||
|
||||
minetest.register_craftitem("mcl_maps:filled_map", filled_def)
|
||||
|
||||
local function add_marker(itemstack, placer, pointed_thing)
|
||||
local new_stack = mcl_util.call_on_rightclick(itemstack, placer, pointed_thing)
|
||||
if new_stack then
|
||||
return new_stack
|
||||
end
|
||||
|
||||
if "node" == pointed_thing.type then
|
||||
local item_meta = itemstack:get_meta()
|
||||
local node_pos = pointed_thing.under
|
||||
local node = minetest.get_node(node_pos)
|
||||
local name = node.name
|
||||
if name == "mcl_banners:hanging_banner" or name == "mcl_banners:standing_banner" then
|
||||
local banners_string = item_meta:get_string("mcl_maps:banners")
|
||||
local banners_table
|
||||
if "" == banners_string then
|
||||
banners_table = {}
|
||||
else
|
||||
banners_table = minetest.deserialize(banners_string)
|
||||
end
|
||||
local colorid = mcl_banners.get_banner_colorid(node_pos)
|
||||
local banner = {
|
||||
node_pos,
|
||||
colorid
|
||||
}
|
||||
table.insert(
|
||||
banners_table,
|
||||
banner
|
||||
)
|
||||
item_meta:set_string(
|
||||
"mcl_maps:banners",
|
||||
minetest.serialize(banners_table)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
return itemstack
|
||||
end
|
||||
|
||||
local filled_wield_def = table.copy(filled_def)
|
||||
filled_wield_def.use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false
|
||||
filled_wield_def.visual_scale = 1
|
||||
|
@ -324,7 +362,7 @@ filled_wield_def.paramtype = "light"
|
|||
filled_wield_def.drawtype = "mesh"
|
||||
filled_wield_def.node_placement_prediction = ""
|
||||
filled_wield_def.range = minetest.registered_items[""].range
|
||||
filled_wield_def.on_place = mcl_util.call_on_rightclick
|
||||
filled_wield_def.on_place = add_marker
|
||||
|
||||
for _, texture in pairs(mcl_skins.list) do
|
||||
local def = table.copy(filled_wield_def)
|
||||
|
@ -411,6 +449,30 @@ minetest.register_on_leaveplayer(function(player)
|
|||
huds[player] = nil
|
||||
end)
|
||||
|
||||
function mcl_maps.make_banner_overlay(banners, minp, maxp, border)
|
||||
local texture = ""
|
||||
for i=1, #banners do
|
||||
local banner_pos = banners[i][1]
|
||||
local banner_colorid = banners[i][2]
|
||||
local banner_hexcolor = mcl_banners.colorid_to_hexcolor(banner_colorid)
|
||||
if (
|
||||
banner_pos.x - 3 > minp.x and
|
||||
banner_pos.x - 3 < maxp.x and
|
||||
banner_pos.z - 7 > minp.z and
|
||||
banner_pos.z - 7 < maxp.z
|
||||
) then
|
||||
local height = math.abs(maxp.x - minp.x) + border.top + border.bottom
|
||||
local width = math.abs(maxp.z - minp.z) + border.left + border.right
|
||||
-- marker is 8×8 & points down, map is 140×140
|
||||
-- offsets have been experimentally determined
|
||||
local banner_x = banner_pos.x - minp.x - 3 + border.left
|
||||
local banner_z = maxp.z - banner_pos.z - 7 + border.top
|
||||
texture = texture .. "^([combine:" .. width .. "x" .. height .. ":" .. banner_x .. "," .. banner_z .. "=mcl_maps_banner_location_marker.png^[colorize:" .. banner_hexcolor .. ":127)"
|
||||
end
|
||||
end
|
||||
return texture
|
||||
end
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
for _, player in pairs(get_connected_players()) do
|
||||
local wield = player:get_wielded_item()
|
||||
|
@ -425,16 +487,31 @@ minetest.register_globalstep(function(dtime)
|
|||
player:set_wielded_item(wield)
|
||||
end
|
||||
|
||||
if texture ~= maps[player] then
|
||||
player:hud_change(hud.map, "text", "[combine:140x140:0,0=mcl_maps_map_background.png:6,6=" .. texture)
|
||||
maps[player] = texture
|
||||
end
|
||||
|
||||
local pos = vector.round(player:get_pos())
|
||||
local meta = wield:get_meta()
|
||||
local minp = string_to_pos(meta:get_string("mcl_maps:minp"))
|
||||
local maxp = string_to_pos(meta:get_string("mcl_maps:maxp"))
|
||||
|
||||
local banners_string = meta:get_string("mcl_maps:banners")
|
||||
if "" ~= banners_string then
|
||||
local banners = minetest.deserialize(banners_string)
|
||||
if #banners > 0 then
|
||||
local border = { top = 6, right = 6, bottom = 6, left = 6 }
|
||||
local banner_overlay = mcl_maps.make_banner_overlay(
|
||||
banners,
|
||||
minp,
|
||||
maxp,
|
||||
border
|
||||
)
|
||||
texture = texture .. banner_overlay
|
||||
end
|
||||
end
|
||||
|
||||
if texture ~= maps[player] then
|
||||
player:hud_change(hud.map, "text", "[combine:140x140:0,0=mcl_maps_map_background.png:6,6=" .. texture)
|
||||
maps[player] = texture
|
||||
end
|
||||
|
||||
local marker
|
||||
|
||||
if pos.x < minp.x then
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
name = mcl_maps
|
||||
depends = mcl_core, mcl_flowers, tga_encoder, tt, mcl_colors, mcl_skins, mcl_util
|
||||
depends = mcl_banners, mcl_core, mcl_flowers, tga_encoder, tt, mcl_colors, mcl_skins, mcl_util
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 108 B |
Loading…
Reference in New Issue