diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 89a8f671..aa7cd930 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -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 diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index 2e1495a9..632bf6b2 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -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) diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index b6315127..998031d9 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -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 diff --git a/mods/ITEMS/mcl_maps/mod.conf b/mods/ITEMS/mcl_maps/mod.conf index e1f06896..e7145915 100644 --- a/mods/ITEMS/mcl_maps/mod.conf +++ b/mods/ITEMS/mcl_maps/mod.conf @@ -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 diff --git a/mods/ITEMS/mcl_maps/textures/mcl_maps_banner_location_marker.png b/mods/ITEMS/mcl_maps/textures/mcl_maps_banner_location_marker.png new file mode 100644 index 00000000..34c79a54 Binary files /dev/null and b/mods/ITEMS/mcl_maps/textures/mcl_maps_banner_location_marker.png differ