mirror of
				https://bitbucket.org/s_l_teichmann/mtsatellite
				synced 2025-11-04 09:55:34 +01:00 
			
		
		
		
	Added mod for "POI" that can become visible on the map.
This commit is contained in:
		
							
								
								
									
										2
									
								
								mods/mappointer/depends.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								mods/mappointer/depends.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					default
 | 
				
			||||||
 | 
					signs_lib
 | 
				
			||||||
							
								
								
									
										233
									
								
								mods/mappointer/init.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								mods/mappointer/init.lua
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,233 @@
 | 
				
			|||||||
 | 
					mappointer = {}
 | 
				
			||||||
 | 
					mappointer.points = {}
 | 
				
			||||||
 | 
					mappointer.count = 1
 | 
				
			||||||
 | 
					local S = signs_lib.gettext
 | 
				
			||||||
 | 
					local MAX_INPUT_CHARS = 400
 | 
				
			||||||
 | 
					local function trim_input(text)
 | 
				
			||||||
 | 
					        return text:sub(1, math.min(MAX_INPUT_CHARS, text:len()))
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					local function make_infotext(text)
 | 
				
			||||||
 | 
					        text = trim_input(text)
 | 
				
			||||||
 | 
					        local lines = signs_lib.split_lines_and_words(text) or {}
 | 
				
			||||||
 | 
					        local lines2 = { }
 | 
				
			||||||
 | 
					        for _, line in ipairs(lines) do
 | 
				
			||||||
 | 
					                table.insert(lines2, (table.concat(line, " "):gsub("#[0-9a-fA-F#^]", function (s)
 | 
				
			||||||
 | 
					                        return s:sub(2):find("[#^]") and s:sub(2) or ""
 | 
				
			||||||
 | 
					                end)))
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        return table.concat(lines2, "\n")
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function mappointer.update_sign(pos, fields)
 | 
				
			||||||
 | 
					        local meta = minetest.get_meta(pos)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        -- legacy udpate
 | 
				
			||||||
 | 
					        if meta:get_string("formspec") ~= "" then
 | 
				
			||||||
 | 
					                meta:set_string("formspec", "")
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        local text = fields and fields.text or meta:get_string("text")
 | 
				
			||||||
 | 
					        local poiType = fields and fields.poiType or meta:get_string("poiType")
 | 
				
			||||||
 | 
					        text = trim_input(text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        local owner = meta:get_string("owner")
 | 
				
			||||||
 | 
					        local ownstr = ""
 | 
				
			||||||
 | 
					        if owner ~= "" then ownstr = S("Locked sign, owned by @1\n", owner) end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        meta:set_string("text", text)
 | 
				
			||||||
 | 
					        meta:set_string("infotext", ownstr..make_infotext(text).." ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        local glow = meta:get_string("glow")
 | 
				
			||||||
 | 
					        signs_lib.set_obj_text(pos, text, glow)
 | 
				
			||||||
 | 
						local found = false
 | 
				
			||||||
 | 
						for i, poi in pairs(mappointer.points) do
 | 
				
			||||||
 | 
					            if poi['pos']['x'] == pos.x and
 | 
				
			||||||
 | 
					                poi['pos']['y'] == pos.y and
 | 
				
			||||||
 | 
					                poi['pos']['z'] == pos.z then
 | 
				
			||||||
 | 
							found = true
 | 
				
			||||||
 | 
							poi.text = text
 | 
				
			||||||
 | 
							poi.type = poiType
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
						if found == false then
 | 
				
			||||||
 | 
							table.insert(mappointer.points, {pos=pos, text=text, type=poiType})
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						mappointer.save_data()
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function mappointer.get_sign_formspec(pos, nodename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        local meta = minetest.get_meta(pos)
 | 
				
			||||||
 | 
					        local txt = meta:get_string("text")
 | 
				
			||||||
 | 
					        local state = meta:get_int("unifont") == 1 and "on" or "off"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        local formspec = {
 | 
				
			||||||
 | 
					                "size[6,4.8]",
 | 
				
			||||||
 | 
					                "background[-0.5,-0.5;7,5;signs_lib_sign_bg.png]",
 | 
				
			||||||
 | 
					                "image[0.1,3;7,1;signs_lib_sign_color_palette.png]",
 | 
				
			||||||
 | 
					                "textarea[0.15,-0.2;6.3,2.8;text;;" .. minetest.formspec_escape(txt) .. "]",
 | 
				
			||||||
 | 
							"dropdown[0.1,2.2;6.1,0;poiType;Building,Travelnet,Point of Interest,Other;1]",
 | 
				
			||||||
 | 
					                "button_exit[3.7,4.2;2,1;ok;" .. S("Write") .. "]",
 | 
				
			||||||
 | 
					                "label[0.3,4;Unicode font]",
 | 
				
			||||||
 | 
					                "image_button[0.6,4.3;1,0.6;signs_lib_switch_" .. state .. ".png;uni_"
 | 
				
			||||||
 | 
					                        .. state .. ";;;false;signs_lib_switch_interm.png]",
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if minetest.registered_nodes[nodename].allow_widefont then
 | 
				
			||||||
 | 
					                state = meta:get_int("widefont") == 1 and "on" or "off"
 | 
				
			||||||
 | 
					                formspec[#formspec+1] = "label[2.1,4;Wide font]"
 | 
				
			||||||
 | 
					                formspec[#formspec+1] = "image_button[2.3,4.3;1,0.6;signs_lib_switch_" .. state .. ".png;wide_"
 | 
				
			||||||
 | 
					                                .. state .. ";;;false;signs_lib_switch_interm.png]"
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return table.concat(formspec, "")
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function mappointer.rightclick_sign(pos, node, player, itemstack, pointed_thing)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if not player or not signs_lib.can_modify(pos, player) then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        player:get_meta():set_string("signslib:pos", minetest.pos_to_string(pos))
 | 
				
			||||||
 | 
						minetest.log("test open formspec")
 | 
				
			||||||
 | 
					        minetest.show_formspec(player:get_player_name(), "mappointer:poi", mappointer.get_sign_formspec(pos, node.name))
 | 
				
			||||||
 | 
						minetest.log("test close formspec")
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mappointer.save_data = function()
 | 
				
			||||||
 | 
					    local data = minetest.write_json(mappointer.points);
 | 
				
			||||||
 | 
					    local path = minetest.get_worldpath().."/mod_poi.data";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    local file = io.open( path, "w" );
 | 
				
			||||||
 | 
					    if( file ) then
 | 
				
			||||||
 | 
					        file:write( data );
 | 
				
			||||||
 | 
					        file:close();
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        print("[Mod mappointer] Error: Savefile '"..tostring( path ).."' could not be written.");
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mappointer.restore_data = function()
 | 
				
			||||||
 | 
					    local path = minetest.get_worldpath().."/mod_poi.data";
 | 
				
			||||||
 | 
					    local file = io.open( path, "r" );
 | 
				
			||||||
 | 
					    if(file) then
 | 
				
			||||||
 | 
					        local data = file:read("*all");
 | 
				
			||||||
 | 
					        mappointer.points = minetest.parse_json(data);
 | 
				
			||||||
 | 
					        file:close();
 | 
				
			||||||
 | 
						if mappointer.points == nil then mappointer.points = {} end
 | 
				
			||||||
 | 
						for _ in pairs(mappointer.points) do mappointer.count = mappointer.count + 1 end
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        print("[Mod mappointer] Error: Read file '"..tostring( path ).."': not found.");
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if formname ~= "mappointer:poi" then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        local pos_string = player:get_meta():get_string("signslib:pos")
 | 
				
			||||||
 | 
					        local pos = minetest.string_to_pos(pos_string)
 | 
				
			||||||
 | 
					        local playername = player:get_player_name()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if fields.text and fields.ok then
 | 
				
			||||||
 | 
					                minetest.log("action", S("@1 wrote \"@2\" to sign at @3 of type @4",
 | 
				
			||||||
 | 
					                        (playername or ""),
 | 
				
			||||||
 | 
					                        fields.text:gsub('\\', '\\\\'):gsub("\n", "\\n"),
 | 
				
			||||||
 | 
					                        pos_string,
 | 
				
			||||||
 | 
								fields.poiType
 | 
				
			||||||
 | 
					                ))
 | 
				
			||||||
 | 
					                mappointer.update_sign(pos, fields)
 | 
				
			||||||
 | 
					        elseif fields.wide_on or fields.wide_off or fields.uni_on or fields.uni_off then
 | 
				
			||||||
 | 
					                local node = minetest.get_node(pos)
 | 
				
			||||||
 | 
					                local meta = minetest.get_meta(pos)
 | 
				
			||||||
 | 
					                local change_wide
 | 
				
			||||||
 | 
					                local change_uni
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if fields.wide_on and meta:get_int("widefont") == 1 then
 | 
				
			||||||
 | 
					                        meta:set_int("widefont", 0)
 | 
				
			||||||
 | 
					                        change_wide = true
 | 
				
			||||||
 | 
					                elseif fields.wide_off and meta:get_int("widefont") == 0 then
 | 
				
			||||||
 | 
					                        meta:set_int("widefont", 1)
 | 
				
			||||||
 | 
					                        change_wide = true
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					                if fields.uni_on and meta:get_int("unifont") == 1 then
 | 
				
			||||||
 | 
					                        meta:set_int("unifont", 0)
 | 
				
			||||||
 | 
					                        change_uni = true
 | 
				
			||||||
 | 
					                elseif fields.uni_off and meta:get_int("unifont") == 0 then
 | 
				
			||||||
 | 
					                        meta:set_int("unifont", 1)
 | 
				
			||||||
 | 
					                        change_uni = true
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if change_wide then
 | 
				
			||||||
 | 
					                        minetest.log("action", S("@1 flipped the wide-font switch to \"@2\" at @3",
 | 
				
			||||||
 | 
					                                (playername or ""),
 | 
				
			||||||
 | 
					                                (fields.wide_on and "off" or "on"),
 | 
				
			||||||
 | 
					                                minetest.pos_to_string(pos)
 | 
				
			||||||
 | 
					                        ))
 | 
				
			||||||
 | 
					                        mappointer.update_sign(pos, fields)
 | 
				
			||||||
 | 
					                        minetest.show_formspec(playername, "mappointer:poi", mappointer.get_sign_formspec(pos, node.name))
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					                if change_uni then
 | 
				
			||||||
 | 
					                        minetest.log("action", S("@1 flipped the unicode-font switch to \"@2\" at @3",
 | 
				
			||||||
 | 
					                                (playername or ""),
 | 
				
			||||||
 | 
					                                (fields.uni_on and "off" or "on"),
 | 
				
			||||||
 | 
					                                minetest.pos_to_string(pos)
 | 
				
			||||||
 | 
					                        ))
 | 
				
			||||||
 | 
					                        mappointer.update_sign(pos, fields)
 | 
				
			||||||
 | 
					                        minetest.show_formspec(playername, "mappointer:poi", mappointer.get_sign_formspec(pos, node.name))
 | 
				
			||||||
 | 
					                end
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function mappointer.destruct_sign(pos)
 | 
				
			||||||
 | 
					        local meta = minetest.get_meta(pos)
 | 
				
			||||||
 | 
					        local glow = meta:get_string("glow")
 | 
				
			||||||
 | 
					        if glow ~= "" and not minetest.is_creative_enabled("") then
 | 
				
			||||||
 | 
					                local num = tonumber(glow)
 | 
				
			||||||
 | 
					                minetest.add_item(pos, ItemStack(signs_lib.glow_item .. " " .. num))
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        signs_lib.delete_objects(pos)
 | 
				
			||||||
 | 
						for i, poi in pairs(mappointer.points) do
 | 
				
			||||||
 | 
						    minetest.log("about to remove "..i)
 | 
				
			||||||
 | 
					            if poi['pos']['x'] == pos.x and
 | 
				
			||||||
 | 
					                poi['pos']['y'] == pos.y and
 | 
				
			||||||
 | 
					                poi['pos']['z'] == pos.z then
 | 
				
			||||||
 | 
							minetest.log("removed poi")
 | 
				
			||||||
 | 
					                table.remove(mappointer.points, i)
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
						mappointer.save_data()
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					signs_lib.register_sign("mappointer:point_of_interest", {
 | 
				
			||||||
 | 
					        description = "Sign for POI",
 | 
				
			||||||
 | 
					        inventory_image = "signs_lib_sign_wall_steel_inv.png",
 | 
				
			||||||
 | 
					        tiles = {
 | 
				
			||||||
 | 
					                "signs_lib_sign_wall_steel.png",
 | 
				
			||||||
 | 
					                "signs_lib_sign_wall_steel_edges.png",
 | 
				
			||||||
 | 
					                nil, -- not set, so it'll use the standard pole mount texture
 | 
				
			||||||
 | 
					                nil, -- not set, so it'll use the standard hanging chains texture
 | 
				
			||||||
 | 
					                "default_steel_block.png" -- for the yard sign's stick
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        groups = signs_lib.standard_steel_groups,
 | 
				
			||||||
 | 
					        sounds = signs_lib.standard_steel_sign_sounds,
 | 
				
			||||||
 | 
					        locked = true,
 | 
				
			||||||
 | 
					        entity_info = "standard",
 | 
				
			||||||
 | 
					        allow_hanging = true,
 | 
				
			||||||
 | 
					        allow_widefont = true,
 | 
				
			||||||
 | 
					        allow_onpole = true,
 | 
				
			||||||
 | 
					        allow_onpole_horizontal = true,
 | 
				
			||||||
 | 
					        allow_yard = true,
 | 
				
			||||||
 | 
					        use_texture_alpha = "clip",
 | 
				
			||||||
 | 
						on_punch = mappointer.update_sign,
 | 
				
			||||||
 | 
						on_rightclick = mappointer.rightclick_sign,
 | 
				
			||||||
 | 
						on_destruct = mappointer.destruct_sign,
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					minetest.register_craft({
 | 
				
			||||||
 | 
					    output = 'mappointer:point_of_interest',
 | 
				
			||||||
 | 
					    recipe = {
 | 
				
			||||||
 | 
					        {'default:sign_wall_steel', 'default:book'},
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mappointer.restore_data()
 | 
				
			||||||
		Reference in New Issue
	
	Block a user