From b56598a4770961d583c90291d9398d5934375401 Mon Sep 17 00:00:00 2001 From: LissoBone Date: Mon, 18 Sep 2023 15:54:40 +0900 Subject: [PATCH] Slightly improved first two functions in init.lua, added protection support. --- init.lua | 129 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 76 insertions(+), 53 deletions(-) diff --git a/init.lua b/init.lua index b4961c6..4e8e74b 100644 --- a/init.lua +++ b/init.lua @@ -15,34 +15,41 @@ Codezeilen und schreibe das auch nicht dran. ]]-- +local protector = minetest.get_modpath ("protector") + +-- Detect stopping colors. +function tga_encoder.image:detect_stop_colors(icon, pos, stop_colors) + local x = pos.x + local z = pos.z + for i_z = 1,#icon do + for i_x = 1,#icon[i_z] do + if stop_colors[self.pixels[z + i_z][x + i_x][1]] then + return true + end + end + end +end + -- blit an icon into the image unless its rect overlaps pixels that --- have any of the stop_colors, treating a nil pixel as transparent +-- have any of the stop_colors, treating a nil pixel as transparent function tga_encoder.image:blit_icon(icon, pos, stop_colors) local x = pos.x local z = pos.z - local overlap = false - for i_z = 1,#icon do - for i_x = 1,#icon[i_z] do - local color = self.pixels[z + i_z][x + i_x][1] - if stop_colors[color] then - overlap = true - break - end - end - if overlap then - break - end - end - if overlap then - return + + -- Just as the comment above says, exit IMMEDIATELY if there + -- are stop_colors present in the image. + if self:detect_stop_colors(icon, pos, stop_colors) then + return end + for i_z = 1,#icon do - for i_x = 1,#icon[i_z] do - local color = icon[i_z][i_x][1] - if color then - self.pixels[z + i_z][x + i_x] = { color } - end - end + for i_x = 1,#icon[i_z] do + local color = icon[i_z][i_x][1] + + if color then + self.pixels[z + i_z][x + i_x] = { color } + end + end end end @@ -65,24 +72,26 @@ local worldpath = minetest.get_worldpath() local textures_dir = worldpath .. "/xmaps/" minetest.mkdir(textures_dir) -xmaps.get_map_filename = function(map_id) - return "xmaps_map_texture_" .. map_id .. ".tga" +function xmaps.get_map_filename(map_id) + return "xmaps_map_texture_" .. map_id .. ".tga" end -xmaps.create_map_item = function(pos, properties) - properties = properties or {} +function xmaps.create_map_item(pos, properties) + properties = properties or {} - local itemstack = ItemStack("xmaps:map") - local meta = itemstack:get_meta() + local itemstack = ItemStack("xmaps:map") + local meta = itemstack:get_meta() - local map_id = tostring(os.time() + math.random()) - meta:set_string("xmaps:id", map_id) - - local minp = vector.multiply(vector.floor(vector.divide(pos, size)), size) - meta:set_string("xmaps:minp", minetest.pos_to_string(minp)) - - local maxp = vector.add(minp, vector.new(size - 1, size - 1, size - 1)) - meta:set_string("xmaps:maxp", minetest.pos_to_string(maxp)) + local map_id = tostring(os.time() + math.random()) + meta:set_string("xmaps:id", map_id) + + -- Size is defined above + -- I love this, it's so clever + local minp = vector.multiply(vector.floor(vector.divide(pos, size)), size) + meta:set_string("xmaps:minp", minetest.pos_to_string(minp)) + + local maxp = vector.add(minp, vector.new(size - 1, size - 1, size - 1)) + meta:set_string("xmaps:maxp", minetest.pos_to_string(maxp)) if properties.draw_x then local xpos = vector.round(pos) @@ -511,7 +520,7 @@ xmaps.load_map_item = function(itemstack) ) end else - -- no texture file → could be a world download + -- no texture file -> could be a world download -- so we look for missing texture in item meta -- and write that to the map texture file here if texture_item_meta_exists then @@ -843,17 +852,23 @@ minetest.register_entity( } ) end, - on_punch = function(self) - -- TODO: implement protection - local pos = self.object:get_pos() - local itemstring = self._itemstring - if pos and itemstring then - minetest.add_item( - pos, - itemstring - ) - self.object:remove() - end + on_punch = function(self, puncher) + -- Protection implemented. + local pos = self.object:get_pos() + if protector then + if minetest.is_protected (pos, puncher) then + return + end + end + local itemstring = self._itemstring + + if pos and itemstring then + minetest.add_item( + pos, + itemstring + ) + self.object:remove() + end end } ) @@ -865,7 +880,7 @@ minetest.register_craftitem( inventory_image = "xmaps_map.tga", groups = { not_in_creative_inventory = 1 }, on_place = function(itemstack, player, pointed_thing) - if "node" ~= pointed_thing.type then + if pointed_thing.type ~= "node" then return end @@ -875,7 +890,10 @@ minetest.register_craftitem( end local node_pos = pointed_thing.under - + if protector and minetest.is_protected (pointed_thing.above, player) + then + return + end local direction = vector.normalize( vector.subtract( node_pos, @@ -927,7 +945,11 @@ if minetest.registered_items["map:mapping_kit"] then "map:mapping_kit", { on_place = function(itemstack, player, pointed_thing) - local pos = pointed_thing.under + local pos = pointed_thing.under + if protector and minetest.is_protected (pointed_thing.above, player) + then + return + end if pos then local map = xmaps.create_map_item( pos, @@ -939,8 +961,9 @@ if minetest.registered_items["map:mapping_kit"] then on_secondary_use = function(itemstack, player, pointed_thing) local pos = player:get_pos() if pos then - local map = xmaps.create_map_item(pos) - return map + + local map = xmaps.create_map_item(pos) + return map end end, }