Merge 1eb4c76265 into 289d0e623c
				
					
				
			
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,2 +1,3 @@ | |||||||
| *~ | *~ | ||||||
|  | *.swp | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										108
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						| @@ -14,6 +14,13 @@ function areas:getExternalHudEntries(pos) | |||||||
| 	return areas | 	return areas | ||||||
| end | end | ||||||
|  |  | ||||||
|  | --plants to place in openfarming | ||||||
|  | local plants = { ["farming:blueberries"]="air", ["farming:carrot"]="air", ["farming:coffee_beans"]="air", ["farming:corn"]="air", ["farming:cucumber"]="air", | ||||||
|  | 				["farming:melon_slice"]="air", ["farming:potato"]="air", ["farming:pumpkin_slice"]="air", ["farming:raspberries"]="air", ["farming:rhubarb"]="air", | ||||||
|  | 				 ["farming:tomato"]="air", ["farming:seed_cotton"]="air", ["farming:seed_wheat"]="air",["default:papyrus"]="air", ["farming:trellis"]="air", | ||||||
|  | 				 ["farming:grapes"]="farming:trellis", ["farming:beanpole"]="air", ["farming:beans"]="farming:beanpole", | ||||||
|  | 				} | ||||||
|  |  | ||||||
| --- Returns a list of areas that include the provided position. | --- Returns a list of areas that include the provided position. | ||||||
| function areas:getAreasAtPos(pos) | function areas:getAreasAtPos(pos) | ||||||
| 	local res = {} | 	local res = {} | ||||||
| @@ -73,9 +80,42 @@ function areas:canInteract(pos, name) | |||||||
| 		return true | 		return true | ||||||
| 	end | 	end | ||||||
| 	local owned = false | 	local owned = false | ||||||
|  | 	 | ||||||
|  | 	-- to avoid crash with water lily | ||||||
|  | 	if pos == nil  then | ||||||
|  | 		return not owned | ||||||
|  | 	end | ||||||
|  | 	 | ||||||
| 	for _, area in pairs(self:getAreasAtPos(pos)) do | 	for _, area in pairs(self:getAreasAtPos(pos)) do | ||||||
| 		if area.owner == name or area.open then | 		if area.owner == name or area.open then | ||||||
| 			return true | 			return true | ||||||
|  | 		 | ||||||
|  | 		elseif area.openfarming then | ||||||
|  | 			-- if area is openfarming | ||||||
|  | 			local node = minetest.get_node(pos).name | ||||||
|  | 			if not minetest.registered_nodes[node] then | ||||||
|  | 				return false | ||||||
|  | 			end | ||||||
|  | 			local player = minetest.get_player_by_name(name) | ||||||
|  | 			if not player then | ||||||
|  | 				return false | ||||||
|  | 			end | ||||||
|  | 			local wstack = player:get_wielded_item():get_name() | ||||||
|  | 			if wstack == "" then | ||||||
|  | 				wstack = "hand" | ||||||
|  | 			end | ||||||
|  |  | ||||||
|  | 			--on_dig | ||||||
|  | 			if minetest.get_item_group(node, "plant") == 1 and (wstack == "hand" or minetest.registered_tools[wstack]) then | ||||||
|  | 				return true | ||||||
|  | 			end | ||||||
|  |  | ||||||
|  | 			--on_place | ||||||
|  | 			if plants[wstack] ~= nil and plants[wstack] == node then | ||||||
|  | 				return true | ||||||
|  | 			end | ||||||
|  |  | ||||||
|  | 			owned = true | ||||||
| 		else | 		else | ||||||
| 			owned = true | 			owned = true | ||||||
| 		end | 		end | ||||||
| @@ -83,6 +123,74 @@ function areas:canInteract(pos, name) | |||||||
| 	return not owned | 	return not owned | ||||||
| end | end | ||||||
|  |  | ||||||
|  | function areas:canMakeArea(pos1, pos2, name) --MFF crabman(25/02/2016) fix areas in areas | ||||||
|  | 	if name and minetest.check_player_privs(name, self.adminPrivs) then | ||||||
|  | 		return true | ||||||
|  | 	end | ||||||
|  | 	areas:sortPos(pos1, pos2) | ||||||
|  |  | ||||||
|  | 	local id_areas_intersect = {} | ||||||
|  | 	local areas = self:getAreasIntersectingArea(pos1, pos2) | ||||||
|  |  | ||||||
|  | 	if not areas then return true end | ||||||
|  |  | ||||||
|  | 	for id, area in pairs(areas) do | ||||||
|  | 		if area.owner == name and self:isSubarea(pos1, pos2, id) then | ||||||
|  | 			return true | ||||||
|  | 		end | ||||||
|  | 		if not area.open and not self:isAreaOwner(id, name) then | ||||||
|  | 			table.insert(id_areas_intersect, id) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	if #id_areas_intersect > 0 then | ||||||
|  | 		return false, id_areas_intersect[1] | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	return true | ||||||
|  | end | ||||||
|  |  | ||||||
|  |  | ||||||
|  | --MFF crabman(5/03/2016 ) return special area pos if a spawn is set. | ||||||
|  | --1 party (2 party in beds mod) | ||||||
|  | function areas:getSpawn(pos) | ||||||
|  | 	for _, area in pairs(areas:getAreasAtPos(pos)) do | ||||||
|  | 		if area.spawn and area.spawn.x then | ||||||
|  | 			return area.spawn | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	return nil | ||||||
|  | end | ||||||
|  |  | ||||||
|  | --MFF DEBUT crabman(17/09/2015 ) respawn player in special area(event) if a spawn is set. | ||||||
|  | --1 party (2 party in beds mod) | ||||||
|  | local dead_players = {} | ||||||
|  | minetest.register_on_dieplayer(function(player) | ||||||
|  | 	local player_name = player:get_player_name() | ||||||
|  | 	if not player_name then return end | ||||||
|  | 	local pos = player:getpos() | ||||||
|  | 	if pos then | ||||||
|  | 		dead_players[player_name] = pos | ||||||
|  | 	end | ||||||
|  | end) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | function areas:onRespawn(player) | ||||||
|  | 	local player_name = player:get_player_name() | ||||||
|  | 	if not player_name or not dead_players[player_name] then return false end | ||||||
|  | 	local pos = dead_players[player_name] | ||||||
|  | 	dead_players[player_name] = nil | ||||||
|  | 	if pos then | ||||||
|  | 		for _, area in pairs(areas:getAreasAtPos(pos)) do | ||||||
|  | 			if area.spawn then | ||||||
|  | 				player:setpos(area.spawn) | ||||||
|  | 				return true | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	return false | ||||||
|  | end | ||||||
|  |  | ||||||
| -- Returns a table (list) of all players that own an area | -- Returns a table (list) of all players that own an area | ||||||
| function areas:getNodeOwners(pos) | function areas:getNodeOwners(pos) | ||||||
| 	local owners = {} | 	local owners = {} | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								api.md
									
									
									
									
									
								
							
							
						
						| @@ -1,3 +1,50 @@ | |||||||
|  | # API Extension | ||||||
|  |  | ||||||
|  | Adding your protections to the HUD | ||||||
|  | ---------------------------------- | ||||||
|  |  | ||||||
|  | If you are providing an extra protection mod to work in conjunction with the | ||||||
|  | HUD feature of `areas`, you can register a callback to add your mod's code to | ||||||
|  | display your protection's existence. | ||||||
|  |  | ||||||
|  | Registering a handler: | ||||||
|  |  | ||||||
|  | * `areas.registerHudHandler(handler) --> nil` | ||||||
|  |  | ||||||
|  | Handler specification: | ||||||
|  |  | ||||||
|  | * `handler(pos,area_list) --> new_area_list` | ||||||
|  | 	* `pos` - the position at which to check for protection coverage by your mod | ||||||
|  | 	* `area_list` - the current list of protected areas | ||||||
|  | 	* `new_area_list` - the list of protected areas, updated with your entries | ||||||
|  |  | ||||||
|  | Area list items: | ||||||
|  |  | ||||||
|  | The area list item is a map table identified with an ID, and properties | ||||||
|  |  | ||||||
|  | The ID should be in the format `modname:` and appended with an identifier for the protection. | ||||||
|  |  | ||||||
|  | Each area list item should be a table with the following properties | ||||||
|  |  | ||||||
|  | * `owner` - (required) the name of the protection owner | ||||||
|  | * `name` - (optional) the name of the area | ||||||
|  |  | ||||||
|  | Example | ||||||
|  | ------- | ||||||
|  |  | ||||||
|  | 	local myhandler = function(pos,area_list) | ||||||
|  | 		local areaowner = find_my_protections(pos) | ||||||
|  |  | ||||||
|  | 		if areaowner then | ||||||
|  | 			arealist["mymodname:first"] = { | ||||||
|  | 				name = "Protection name", | ||||||
|  | 				owner = areaowner,  | ||||||
|  | 			} | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	areas.register_hud_handler(myhandler) | ||||||
|  | ======= | ||||||
| Areas mod API | Areas mod API | ||||||
| === | === | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										253
									
								
								chatcommands.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,59 +1,59 @@ | |||||||
|  | local S = areas.intllib | ||||||
|  |  | ||||||
| minetest.register_chatcommand("protect", { | minetest.register_chatcommand("protect", { | ||||||
| 	params = "<AreaName>", | 	params = "<AreaName>", | ||||||
| 	description = "Protect your own area", | 	description = S("Protect your own area"), | ||||||
| 	privs = {[areas.config.self_protection_privilege]=true}, | 	privs = {[areas.config.self_protection_privilege]=true}, | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		if param == "" then | 		if param == "" then | ||||||
| 			return false, "Invalid usage, see /help protect." | 			return false, S("Invalid usage, see /help protect.") | ||||||
| 		end | 		end | ||||||
| 		local pos1, pos2 = areas:getPos(name) | 		local pos1, pos2 = areas:getPos(name) | ||||||
| 		if not (pos1 and pos2) then | 		if not (pos1 and pos2) then | ||||||
| 			return false, "You need to select an area first." | 			return false, S("You need to select an area first.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		minetest.log("action", "/protect invoked, owner="..name.. | 		minetest.log("action", S("/protect invoked, Owner =")..name.. | ||||||
| 				" AreaName="..param.. | 				" AreaName="..param.. | ||||||
| 				" StartPos="..minetest.pos_to_string(pos1).. | 				" StartPos="..minetest.pos_to_string(pos1).. | ||||||
| 				" EndPos="  ..minetest.pos_to_string(pos2)) | 				" EndPos="  ..minetest.pos_to_string(pos2)) | ||||||
|  |  | ||||||
| 		local canAdd, errMsg = areas:canPlayerAddArea(pos1, pos2, name) | 		local canAdd, errMsg = areas:canPlayerAddArea(pos1, pos2, name) | ||||||
| 		if not canAdd then | 		if not canAdd then | ||||||
| 			return false, "You can't protect that area: "..errMsg | 			return false, S("You can't protect that area: ")..errMsg | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		local id = areas:add(name, param, pos1, pos2, nil) | 		local id = areas:add(name, param, pos1, pos2, nil) | ||||||
| 		areas:save() | 		areas:save() | ||||||
|  |  | ||||||
| 		return true, "Area protected. ID: "..id | 		return true, S("Area protected. ID: ")..id | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("set_owner", { | minetest.register_chatcommand("set_owner", { | ||||||
| 	params = "<PlayerName> <AreaName>", | 	params = "<PlayerName> <AreaName>", | ||||||
| 	description = "Protect an area beetween two positions and give" | 	description = S("Protect an area beetween two positions and give" | ||||||
| 		.." a player access to it without setting the parent of the" | 		.." a player access to it without setting the parent of the" | ||||||
| 		.." area to any existing area", | 		.." area to any existing area"), | ||||||
| 	privs = areas.adminPrivs, | 	privs = areas.adminPrivs, | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local ownerName, areaName = param:match('^(%S+)%s(.+)$') | 		local ownerName, areaName = param:match('^(%S+)%s(.+)$') | ||||||
|  |  | ||||||
| 		if not ownerName then | 		if not ownerName then | ||||||
| 			return false, "Incorrect usage, see /help set_owner." | 			return false, S("Incorrect usage, see /help set_owner.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		local pos1, pos2 = areas:getPos(name) | 		local pos1, pos2 = areas:getPos(name) | ||||||
| 		if not (pos1 and pos2) then | 		if not (pos1 and pos2) then | ||||||
| 			return false, "You need to select an area first." | 			return false, S("You need to select an area first.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not areas:player_exists(ownerName) then | 		if not areas:player_exists(ownerName) then | ||||||
| 			return false, "The player \"" | 			return false, S("The player \"@1\" does not exist.", ownerName) | ||||||
| 					..ownerName.."\" does not exist." |  | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		minetest.log("action", name.." runs /set_owner. Owner = "..ownerName.. | 		minetest.log("action", name..S(" runs /set_owner. Owner = ")..ownerName.. | ||||||
| 				" AreaName = "..areaName.. | 				" AreaName = "..areaName.. | ||||||
| 				" StartPos = "..minetest.pos_to_string(pos1).. | 				" StartPos = "..minetest.pos_to_string(pos1).. | ||||||
| 				" EndPos = "  ..minetest.pos_to_string(pos2)) | 				" EndPos = "  ..minetest.pos_to_string(pos2)) | ||||||
| @@ -62,37 +62,36 @@ minetest.register_chatcommand("set_owner", { | |||||||
| 		areas:save() | 		areas:save() | ||||||
| 	 | 	 | ||||||
| 		minetest.chat_send_player(ownerName, | 		minetest.chat_send_player(ownerName, | ||||||
| 				"You have been granted control over area #".. | 				S("You have been granted control over area #@1. Type /list_areas to show your areas.", id)) | ||||||
| 				id..". Type /list_areas to show your areas.") | 		return true, S("Area protected. ID: ")..id | ||||||
| 		return true, "Area protected. ID: "..id |  | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("add_owner", { | minetest.register_chatcommand("add_owner", { | ||||||
| 	params = "<ParentID> <Player> <AreaName>", | 	params = "<ParentID> <Player> <AreaName>", | ||||||
| 	description = "Give a player access to a sub-area beetween two" | 	description = S("Give a player access to a sub-area beetween two" | ||||||
| 		.." positions that have already been protected," | 		.." positions that have already been protected," | ||||||
| 		.." Use set_owner if you don't want the parent to be set.", | 		.." Use set_owner if you don't want the parent to be set."), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local pid, ownerName, areaName | 		local pid, ownerName, areaName | ||||||
| 				= param:match('^(%d+) ([^ ]+) (.+)$') | 				= param:match('^(%d+) ([^ ]+) (.+)$') | ||||||
|  |  | ||||||
| 		if not pid then | 		if not pid then | ||||||
| 			minetest.chat_send_player(name, "Incorrect usage, see /help add_owner") | 			minetest.chat_send_player(name, S("Incorrect usage, see /help add_owner")) | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		local pos1, pos2 = areas:getPos(name) | 		local pos1, pos2 = areas:getPos(name) | ||||||
| 		if not (pos1 and pos2) then | 		if not (pos1 and pos2) then | ||||||
| 			return false, "You need to select an area first." | 			return false, S("You need to select an area first.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not areas:player_exists(ownerName) then | 		if not areas:player_exists(ownerName) then | ||||||
| 			return false, "The player \""..ownerName.."\" does not exist." | 			return false, S("The player \"@1\" does not exist.", ownerName) | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		minetest.log("action", name.." runs /add_owner. Owner = "..ownerName.. | 		minetest.log("action", name..S(" runs /add_owner. Owner = ")..ownerName.. | ||||||
| 				" AreaName = "..areaName.." ParentID = "..pid.. | 				" AreaName = "..areaName.." ParentID = "..pid.. | ||||||
| 				" StartPos = "..pos1.x..","..pos1.y..","..pos1.z.. | 				" StartPos = "..pos1.x..","..pos1.y..","..pos1.z.. | ||||||
| 				" EndPos = "  ..pos2.x..","..pos2.y..","..pos2.z) | 				" EndPos = "  ..pos2.x..","..pos2.y..","..pos2.z) | ||||||
| @@ -101,52 +100,51 @@ minetest.register_chatcommand("add_owner", { | |||||||
| 		pid = tonumber(pid) | 		pid = tonumber(pid) | ||||||
| 		if (not areas:isAreaOwner(pid, name)) or | 		if (not areas:isAreaOwner(pid, name)) or | ||||||
| 		   (not areas:isSubarea(pos1, pos2, pid)) then | 		   (not areas:isSubarea(pos1, pos2, pid)) then | ||||||
| 			return false, "You can't protect that area." | 			return false, S("You can't protect that area.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		local id = areas:add(ownerName, areaName, pos1, pos2, pid) | 		local id = areas:add(ownerName, areaName, pos1, pos2, pid) | ||||||
| 		areas:save() | 		areas:save() | ||||||
|  |  | ||||||
| 		minetest.chat_send_player(ownerName, | 		minetest.chat_send_player(ownerName, | ||||||
| 				"You have been granted control over area #".. | 				S("You have been granted control over area #@1. Type /list_areas to show your areas.", id)) | ||||||
| 				id..". Type /list_areas to show your areas.") | 		return true, S("Area protected. ID: ")..id | ||||||
| 		return true, "Area protected. ID: "..id |  | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("rename_area", { | minetest.register_chatcommand("rename_area", { | ||||||
| 	params = "<ID> <newName>", | 	params = "<ID> <newName>", | ||||||
| 	description = "Rename a area that you own", | 	description = S("Rename a area that you own"), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local id, newName = param:match("^(%d+)%s(.+)$") | 		local id, newName = param:match("^(%d+)%s(.+)$") | ||||||
| 		if not id then | 		if not id then | ||||||
| 			return false, "Invalid usage, see /help rename_area." | 			return false, S("Invalid usage, see /help rename_area.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		id = tonumber(id) | 		id = tonumber(id) | ||||||
| 		if not id then | 		if not id then | ||||||
| 			return false, "That area doesn't exist." | 			return false, S("That area doesn't exist.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not areas:isAreaOwner(id, name) then | 		if not areas:isAreaOwner(id, name) then | ||||||
| 			return true, "You don't own that area." | 			return true, S("You don't own that area.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		areas.areas[id].name = newName | 		areas.areas[id].name = newName | ||||||
| 		areas:save() | 		areas:save() | ||||||
| 		return true, "Area renamed." | 		return true, S("Area renamed.") | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("find_areas", { | minetest.register_chatcommand("find_areas", { | ||||||
| 	params = "<regexp>", | 	params = "<regexp>", | ||||||
| 	description = "Find areas using a Lua regular expression", | 	description = S("Find areas using a Lua regular expression"),, | ||||||
| 	privs = areas.adminPrivs, | 	privs = areas.adminPrivs, | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		if param == "" then | 		if param == "" then | ||||||
| 			return false, "A regular expression is required." | 			return false, S("A regular expression is required.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		-- Check expression for validity | 		-- Check expression for validity | ||||||
| @@ -154,7 +152,7 @@ minetest.register_chatcommand("find_areas", { | |||||||
| 			("Test [1]: Player (0,0,0) (0,0,0)"):find(param) | 			("Test [1]: Player (0,0,0) (0,0,0)"):find(param) | ||||||
| 		end | 		end | ||||||
| 		if not pcall(testRegExp) then | 		if not pcall(testRegExp) then | ||||||
| 			return false, "Invalid regular expression." | 			return false, S("Invalid regular expression.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		local matches = {} | 		local matches = {} | ||||||
| @@ -167,14 +165,14 @@ minetest.register_chatcommand("find_areas", { | |||||||
| 		if #matches > 0 then | 		if #matches > 0 then | ||||||
| 			return true, table.concat(matches, "\n") | 			return true, table.concat(matches, "\n") | ||||||
| 		else | 		else | ||||||
| 			return true, "No matches found." | 			return true, S("No matches found.") | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("list_areas", { | minetest.register_chatcommand("list_areas", { | ||||||
| 	description = "List your areas, or all areas if you are an admin.", | 	description = S("List your areas, or all areas if you are an admin."), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local admin = minetest.check_player_privs(name, areas.adminPrivs) | 		local admin = minetest.check_player_privs(name, areas.adminPrivs) | ||||||
| 		local areaStrings = {} | 		local areaStrings = {} | ||||||
| @@ -184,7 +182,7 @@ minetest.register_chatcommand("list_areas", { | |||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 		if #areaStrings == 0 then | 		if #areaStrings == 0 then | ||||||
| 			return true, "No visible areas." | 			return true, S("No visible areas.") | ||||||
| 		end | 		end | ||||||
| 		return true, table.concat(areaStrings, "\n") | 		return true, table.concat(areaStrings, "\n") | ||||||
| 	end | 	end | ||||||
| @@ -193,129 +191,151 @@ minetest.register_chatcommand("list_areas", { | |||||||
|  |  | ||||||
| minetest.register_chatcommand("recursive_remove_areas", { | minetest.register_chatcommand("recursive_remove_areas", { | ||||||
| 	params = "<id>", | 	params = "<id>", | ||||||
| 	description = "Recursively remove areas using an id", | 	description = S("Recursively remove areas using an id"), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local id = tonumber(param) | 		local id = tonumber(param) | ||||||
| 		if not id then | 		if not id then | ||||||
| 			return false, "Invalid usage, see" | 			return false, S("Invalid usage, see" | ||||||
| 					.." /help recursive_remove_areas" | 					.." /help recursive_remove_areas") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not areas:isAreaOwner(id, name) then | 		if not areas:isAreaOwner(id, name) then | ||||||
| 			return false, "Area "..id.." does not exist or is" | 			return false, S("Area @1 does not exist or is" | ||||||
| 					.." not owned by you." | 					.." not owned by you.", id) | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		areas:remove(id, true) | 		areas:remove(id, true) | ||||||
| 		areas:save() | 		areas:save() | ||||||
| 		return true, "Removed area "..id.." and it's sub areas." | 		return true, S("Removed area @1 and it's sub areas.", id) | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("remove_area", { | minetest.register_chatcommand("remove_area", { | ||||||
| 	params = "<id>", | 	params = "<id>", | ||||||
| 	description = "Remove an area using an id", | 	description = S("Remove an area using an id"), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local id = tonumber(param) | 		local id = tonumber(param) | ||||||
| 		if not id then | 		if not id then | ||||||
| 			return false, "Invalid usage, see /help remove_area" | 			return false, S("Invalid usage, see /help remove_area") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not areas:isAreaOwner(id, name) then | 		if not areas:isAreaOwner(id, name) then | ||||||
| 			return false, "Area "..id.." does not exist or" | 			return false, S("Area @1 does not exist or" | ||||||
| 					.." is not owned by you." | 					.." is not owned by you.", id) | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		areas:remove(id) | 		areas:remove(id) | ||||||
| 		areas:save() | 		areas:save() | ||||||
| 		return true, "Removed area "..id | 		return true, S("Removed area @1", id) | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("change_owner", { | minetest.register_chatcommand("change_owner", { | ||||||
| 	params = "<ID> <NewOwner>", | 	params = "<ID> <NewOwner>", | ||||||
| 	description = "Change the owner of an area using it's ID", | 	description = S("Change the owner of an area using it's ID"), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local id, newOwner = param:match("^(%d+)%s(%S+)$") | 		local id, newOwner = param:match("^(%d+)%s(%S+)$") | ||||||
| 		if not id then | 		if not id then | ||||||
| 			return false, "Invalid usage, see" | 			return false, S("Invalid usage, see" | ||||||
| 					.." /help change_owner." | 					.." /help change_owner.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not areas:player_exists(newOwner) then | 		if not areas:player_exists(newOwner) then | ||||||
| 			return false, "The player \""..newOwner | 			return false, S("The player \"@1\" does not exist.", newOwner) | ||||||
| 					.."\" does not exist." |  | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		id = tonumber(id) | 		id = tonumber(id) | ||||||
| 		if not areas:isAreaOwner(id, name) then | 		if not areas:isAreaOwner(id, name) then | ||||||
| 			return false, "Area "..id.." does not exist" | 			return false, S("Area @1 does not exist" | ||||||
| 					.." or is not owned by you." | 					.." or is not owned by you.", id) | ||||||
| 		end | 		end | ||||||
| 		areas.areas[id].owner = newOwner | 		areas.areas[id].owner = newOwner | ||||||
| 		areas:save() | 		areas:save() | ||||||
| 		minetest.chat_send_player(newOwner, | 		minetest.chat_send_player(newOwner, | ||||||
| 			("%s has given you control over the area %q (ID %d).") | 			S("@1 has given you control over the area @2 (ID @3).",name, areas.areas[id].name, id)) | ||||||
| 				:format(name, areas.areas[id].name, id)) | 		return true, S("Owner changed.") | ||||||
| 		return true, "Owner changed." |  | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("area_open", { | minetest.register_chatcommand("area_open", { | ||||||
| 	params = "<ID>", | 	params = "<ID>", | ||||||
| 	description = "Toggle an area open (anyone can interact) or closed", | 	description = S("Toggle an area open (anyone can interact) or closed"), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local id = tonumber(param) | 		local id = tonumber(param) | ||||||
| 		if not id then | 		if not id then | ||||||
| 			return false, "Invalid usage, see /help area_open." | 			return false, S("Invalid usage, see /help area_open.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not areas:isAreaOwner(id, name) then | 		if not areas:isAreaOwner(id, name) then | ||||||
| 			return false, "Area "..id.." does not exist" | 			return false, S("Area @1 does not exist" | ||||||
| 					.." or is not owned by you." | 					.." or is not owned by you.", id) | ||||||
| 		end | 		end | ||||||
| 		local open = not areas.areas[id].open | 		local open = not areas.areas[id].open | ||||||
|  | 		local open_msg = open and S("opened") or S("closed") | ||||||
| 		-- Save false as nil to avoid inflating the DB. | 		-- Save false as nil to avoid inflating the DB. | ||||||
| 		areas.areas[id].open = open or nil | 		areas.areas[id].open = open or nil | ||||||
| 		areas:save() | 		areas:save() | ||||||
| 		return true, ("Area %s."):format(open and "opened" or "closed") | 		-- Translators: @1 is one of the previous 'opened' or 'closed' | ||||||
|  | 		return true, S("Area @1.", open_msg) | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | minetest.register_chatcommand("area_openfarming", { | ||||||
|  | 	params = "<ID>", | ||||||
|  | 	description = S("Toggle an area open (anyone can interact farming) or closed"), | ||||||
|  | 	func = function(name, param) | ||||||
|  | 		local id = tonumber(param) | ||||||
|  | 		if not id then | ||||||
|  | 			return false, S("Invalid usage, see /help area_openfarming.") | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		if not areas:isAreaOwner(id, name) then | ||||||
|  | 			return false, S("Area @1 does not exist" | ||||||
|  | 					.." or is not owned by you.", id) | ||||||
|  | 		end | ||||||
|  | 		local openfarming = not areas.areas[id].openfarming | ||||||
|  | 		local openfarming_msg = openfarming and S("opened") or S("closed") | ||||||
|  | 		-- Save false as nil to avoid inflating the DB. | ||||||
|  | 		areas.areas[id].openfarming = openfarming or nil | ||||||
|  | 		areas:save() | ||||||
|  | 		-- Translators: @1 is one of the previous 'opened' or 'closed' | ||||||
|  | +		return true, S("Area @1 to farming.", openfarming_msg) | ||||||
|  | 	end | ||||||
|  | }) | ||||||
|  |  | ||||||
| minetest.register_chatcommand("move_area", { | minetest.register_chatcommand("move_area", { | ||||||
| 	params = "<ID>", | 	params = "<ID>", | ||||||
| 	description = "Move (or resize) an area to the current positions.", | 	description = S("Move (or resize) an area to the current positions."), | ||||||
| 	privs = areas.adminPrivs, | 	privs = areas.adminPrivs, | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local id = tonumber(param) | 		local id = tonumber(param) | ||||||
| 		if not id then | 		if not id then | ||||||
| 			return false, "Invalid usage, see /help move_area." | 			return false, S("Invalid usage, see /help move_area.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		local area = areas.areas[id] | 		local area = areas.areas[id] | ||||||
| 		if not area then | 		if not area then | ||||||
| 			return false, "Area does not exist." | 			return false, S("Area does not exist.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		local pos1, pos2 = areas:getPos(name) | 		local pos1, pos2 = areas:getPos(name) | ||||||
| 		if not pos1 then | 		if not pos1 then | ||||||
| 			return false, "You need to select an area first." | 			return false, S("You need to select an area first.") | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		areas:move(id, area, pos1, pos2) | 		areas:move(id, area, pos1, pos2) | ||||||
| 		areas:save() | 		areas:save() | ||||||
|  |  | ||||||
| 		return true, "Area successfully moved." | 		return true, S("Area successfully moved.") | ||||||
| 	end, | 	end, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| minetest.register_chatcommand("area_info", { | minetest.register_chatcommand("area_info", { | ||||||
| 	description = "Get information about area configuration and usage.", | 	description = S("Get information about area configuration and usage."), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local lines = {} | 		local lines = {} | ||||||
| 		local privs = minetest.get_player_privs(name) | 		local privs = minetest.get_player_privs(name) | ||||||
| @@ -338,26 +358,25 @@ minetest.register_chatcommand("area_info", { | |||||||
| 			size_limit_high or size_limit | 			size_limit_high or size_limit | ||||||
|  |  | ||||||
| 		-- Privilege information | 		-- Privilege information | ||||||
| 		local self_prot_line = ("Self protection is %sabled"):format( | 		local self_prot_msg = self_prot and S("enabled") or S("disabled") | ||||||
| 				self_prot and "en" or "dis") | 		-- Translators: @1 is one of the previous 'enabled' or 'disabled' | ||||||
|  | 		local self_prot_line = S("Self protection is @1 ", self_prot_msg) | ||||||
| 		if self_prot and prot_priv then | 		if self_prot and prot_priv then | ||||||
|  | 			local has_prot_priv_msg = has_prot_priv and S("and you") or S("but you don't") | ||||||
|  | 			-- Translators: @1 is one of the previous 'and you' or 'but you don't' | ||||||
| 			self_prot_line = self_prot_line.. | 			self_prot_line = self_prot_line.. | ||||||
| 				(" %s have the neccessary privilege (%q).") | 				S(" @1 have the neccessary privilege (@2).", has_prot_priv_msg, prot_priv) | ||||||
| 				:format( |  | ||||||
| 					has_prot_priv and "and you" or |  | ||||||
| 						"but you don't", |  | ||||||
| 					prot_priv) |  | ||||||
| 		else | 		else | ||||||
| 			self_prot_line = self_prot_line.."." | 			self_prot_line = self_prot_line.."." | ||||||
| 		end | 		end | ||||||
| 		table.insert(lines, self_prot_line) | 		table.insert(lines, self_prot_line) | ||||||
| 		if privs.areas then | 		if privs.areas then | ||||||
| 			table.insert(lines, "You are an area".. | 			table.insert(lines, S("You are an area".. | ||||||
| 				" administrator (\"areas\" privilege).") | 				" administrator (\"areas\" privilege).")) | ||||||
| 		elseif has_high_limit then | 		elseif has_high_limit then | ||||||
| 			table.insert(lines, | 			table.insert(lines, | ||||||
| 				"You have extended area protection".. | 				S("You have extended area protection".. | ||||||
| 				" limits (\"areas_high_limit\" privilege).") | 				" limits (\"areas_high_limit\" privilege).")) | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		-- Area count | 		-- Area count | ||||||
| @@ -367,25 +386,24 @@ minetest.register_chatcommand("area_info", { | |||||||
| 				area_num = area_num + 1 | 				area_num = area_num + 1 | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 		local count_line = ("You have %d area%s"):format( | 		-- Translators: need to use NS gettext to be more precise | ||||||
| 			area_num, area_num == 1 and "" or "s") | 		local count_line = S("You have @1 area@2", area_num, area_num == 1 and "" or "s") | ||||||
| 		if privs.areas then | 		if privs.areas then | ||||||
| 			count_line = count_line.. | 			count_line = count_line.. | ||||||
| 				" and have no area protection limits." | 				S(" and have no area protection limits.") | ||||||
| 		elseif can_prot then | 		elseif can_prot then | ||||||
| 			count_line = count_line..(", out of a maximum of %d.") | 			count_line = count_line..S(", out of a maximum of @1.", max_count) | ||||||
| 				:format(max_count) |  | ||||||
| 		end | 		end | ||||||
| 		table.insert(lines, count_line) | 		table.insert(lines, count_line) | ||||||
|  |  | ||||||
| 		-- Area size limits | 		-- Area size limits | ||||||
| 		local function size_info(str, size) | 		local function size_info(str, size) | ||||||
| 			table.insert(lines, ("%s spanning up to %dx%dx%d.") | 			table.insert(lines, (S("%s spanning up to %dx%dx%d.")) | ||||||
| 				:format(str, size.x, size.y, size.z)) | 				:format(str, size.x, size.y, size.z)) | ||||||
| 		end | 		end | ||||||
| 		local function priv_limit_info(priv, max_count, max_size) | 		local function priv_limit_info(priv, max_count, max_size) | ||||||
| 			size_info(("Players with the %q privilege".. | 			size_info((S("Players with the %q privilege" | ||||||
| 				" can protect up to %d areas"):format( | 				.." can protect up to %d areas")):format( | ||||||
| 					priv, max_count), max_size) | 					priv, max_count), max_size) | ||||||
| 		end | 		end | ||||||
| 		if self_prot then | 		if self_prot then | ||||||
| @@ -395,7 +413,7 @@ minetest.register_chatcommand("area_info", { | |||||||
| 				priv_limit_info("areas_high_limit", | 				priv_limit_info("areas_high_limit", | ||||||
| 					limit_high, size_limit_high) | 					limit_high, size_limit_high) | ||||||
| 			elseif has_prot_priv then | 			elseif has_prot_priv then | ||||||
| 				size_info("You can protect areas", max_size) | 				size_info(S("You can protect areas"), max_size) | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| @@ -403,3 +421,60 @@ minetest.register_chatcommand("area_info", { | |||||||
| 	end, | 	end, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | --MFF DEBUT crabman(17/09/2015 ) respawn player at in special area(event) if a spawn is set. | ||||||
|  | +minetest.register_chatcommand("area_addspawn", { | ||||||
|  | 	params = "<ID>", | ||||||
|  | 		privs = areas.adminPrivs, | ||||||
|  | 	description = S("Define special spawn for area"), | ||||||
|  | 	func = function(name, param) | ||||||
|  | 		local id = param:match("^(%d+)") | ||||||
|  | 		if not id then | ||||||
|  | 			return false, S("Invalid usage, see /help area_addspawn.") | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		id = tonumber(id) | ||||||
|  | 		if not id then | ||||||
|  | 			return false, S("Error, Param id must be int.") | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		local player = minetest.get_player_by_name(name) | ||||||
|  | 		if not player then | ||||||
|  | 			return false, S("Error, there is not such player") | ||||||
|  | 		end | ||||||
|  | 		local pos = player:getpos() | ||||||
|  | 		if not pos then | ||||||
|  | 			return false, S("Error, there is not pos.") | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		if not areas.areas[id] then | ||||||
|  | 			return false, S("Area @1 does not exist.", id) | ||||||
|  | 		end | ||||||
|  | 		areas.areas[id].spawn = pos | ||||||
|  | 		areas:save() | ||||||
|  | 		return true, S("spawn of area @1 defined.", id) | ||||||
|  | 	end | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | minetest.register_chatcommand("area_delspawn", { | ||||||
|  | 	params = "<ID>", | ||||||
|  | 		privs = areas.adminPrivs, | ||||||
|  | 	description = S("Delete special spawn of area"), | ||||||
|  | 	func = function(name, param) | ||||||
|  | 		local id = param:match("^(%d+)") | ||||||
|  | 		if not id then | ||||||
|  | 			return false, S("Invalid usage, see /help area_delspawn.") | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		id = tonumber(id) | ||||||
|  | 		if not id then | ||||||
|  | 			return false, S("Error, Param id must be int.") | ||||||
|  | 		end | ||||||
|  |  | ||||||
|  | 		if not areas.areas[id] then | ||||||
|  | 			return false, S("Area @1 does not exist.", id) | ||||||
|  | 		end | ||||||
|  | 		areas.areas[id].spawn = nil | ||||||
|  | 		areas:save() | ||||||
|  | 		return true, S("spawn of area @1 deleted.", id) | ||||||
|  | 	end | ||||||
|  | }) | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								depends.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | intllib? | ||||||
							
								
								
									
										86
									
								
								hud.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,17 +1,37 @@ | |||||||
| -- This is inspired by the landrush mod by Bremaweb | -- This is inspired by the landrush mod by Bremaweb | ||||||
|  | local S = areas.intllib | ||||||
|  |  | ||||||
| areas.hud = {} | areas.hud = {} | ||||||
|  |  | ||||||
| minetest.register_globalstep(function(dtime) | local function tick() | ||||||
| 	for _, player in pairs(minetest.get_connected_players()) do | 	for _, player in pairs(minetest.get_connected_players()) do | ||||||
| 		local name = player:get_player_name() | 		local name = player:get_player_name() | ||||||
| 		local pos = vector.round(player:getpos()) | 		local pos = vector.round(player:getpos()) | ||||||
| 		local areaStrings = {} | 		local area_text = S("No area(s)").."\n\n" | ||||||
|  | 		local area_owner_name = "" | ||||||
|  | 		local mod_owner = 0 | ||||||
|  | 		local mod_open = 0 | ||||||
|  | 		local mod_farming = 0 | ||||||
|  | 		local area_name = "" | ||||||
|  | 		local nb_areas = 0 | ||||||
|  |  | ||||||
| 		for id, area in pairs(areas:getAreasAtPos(pos)) do | 		for id, area in pairs(areas:getAreasAtPos(pos)) do | ||||||
| 			table.insert(areaStrings, ("%s [%u] (%s%s)") | 			nb_areas = nb_areas+1 | ||||||
| 					:format(area.name, id, area.owner, | 			if areas:isAreaOwner(id, name) then | ||||||
| 					area.open and ":open" or "")) | 				mod_owner = 1 | ||||||
|  | 			end | ||||||
|  |  | ||||||
|  | 			if area.open then | ||||||
|  | 				mod_open = 1 | ||||||
|  | 			end | ||||||
|  | 			if area.openfarming then | ||||||
|  | 				mod_farming = 1 | ||||||
|  | 			end | ||||||
|  |  | ||||||
|  | 			if not area.parent then | ||||||
|  | 				area_owner_name = area.owner | ||||||
|  | 				area_name = area.name | ||||||
|  | 			end | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		for i, area in pairs(areas:getExternalHudEntries(pos)) do | 		for i, area in pairs(areas:getExternalHudEntries(pos)) do | ||||||
| @@ -22,33 +42,53 @@ minetest.register_globalstep(function(dtime) | |||||||
| 			table.insert(areaStrings, str) | 			table.insert(areaStrings, str) | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		local areaString = "Areas:" | 		local icon = "areas_not_area.png" | ||||||
| 		if #areaStrings > 0 then | 		if nb_areas > 0 then | ||||||
| 			areaString = areaString.."\n".. | 			local plural = "" | ||||||
| 				table.concat(areaStrings, "\n") | 			if nb_areas > 1 then | ||||||
|  | 				plural = "s" | ||||||
| 			end | 			end | ||||||
| 		local hud = areas.hud[name] | 			-- Translators: need to use NS gettext to be more precise | ||||||
| 		if not hud then | 			area_text = (S("%s\nOwner: %s\n%u area") .. plural):format(area_name, area_owner_name, nb_areas) | ||||||
| 			hud = {} | 			icon = ("areas_%u_%u_%u.png"):format(mod_owner, mod_open, mod_farming) | ||||||
| 			areas.hud[name] = hud | 		end | ||||||
| 			hud.areasId = player:hud_add({ | 		if not areas.hud[name] then | ||||||
|  | 			areas.hud[name] = {} | ||||||
|  | 			areas.hud[name].icon = player:hud_add({ | ||||||
|  | 				hud_elem_type = "image", | ||||||
|  | 				position = {x=0,y=1}, | ||||||
|  | 				scale = {x=1,y=1}, | ||||||
|  | 				offset = {x=26,y=-60}, | ||||||
|  | 				text = icon, | ||||||
|  | 			}) | ||||||
|  |  | ||||||
|  | 			areas.hud[name].areas_id = player:hud_add({ | ||||||
| 				hud_elem_type = "text", | 				hud_elem_type = "text", | ||||||
| 				name = "Areas", | 				name = "Areas", | ||||||
| 				number = 0xFFFFFF, | 				number = 0xFFFFFF, | ||||||
| 				position = {x=0, y=1}, | 				position = {x=0, y=1}, | ||||||
| 				offset = {x=8, y=-8}, | 				offset = {x=48, y=-40}, | ||||||
| 				text = areaString, | 				text = area_text, | ||||||
| 				scale = {x=200, y=60}, | 				scale = {x=1, y=1}, | ||||||
| 				alignment = {x=1, y=-1}, | 				alignment = {x=1, y=-1}, | ||||||
| 			}) | 			}) | ||||||
| 			hud.oldAreas = areaString | 			areas.hud[name].old_area_text = area_text | ||||||
| 			return | 			areas.hud[name].old_icon = icon | ||||||
| 		elseif hud.oldAreas ~= areaString then | 		else | ||||||
| 			player:hud_change(hud.areasId, "text", areaString) | 			if areas.hud[name].old_area_text ~= area_text then | ||||||
| 			hud.oldAreas = areaString | 				player:hud_change(areas.hud[name].areas_id, "text", area_text) | ||||||
|  | 				areas.hud[name].old_area_text = area_text | ||||||
|  | 			end | ||||||
|  | 			if areas.hud[name].old_icon ~= icon then | ||||||
|  | 				player:hud_change(areas.hud[name].icon, "text", icon) | ||||||
|  | 				areas.hud[name].old_icon = icon | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| end) | 	end | ||||||
|  | 	minetest.after(1.5, tick) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | tick() | ||||||
|  |  | ||||||
| minetest.register_on_leaveplayer(function(player) | minetest.register_on_leaveplayer(function(player) | ||||||
| 	areas.hud[player:get_player_name()] = nil | 	areas.hud[player:get_player_name()] = nil | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						| @@ -4,6 +4,11 @@ | |||||||
|  |  | ||||||
| areas = {} | areas = {} | ||||||
|  |  | ||||||
|  | -- Load support for intllib. | ||||||
|  | local MP = minetest.get_modpath(minetest.get_current_modname()) | ||||||
|  | local S, NS = dofile(MP.."/intllib.lua") | ||||||
|  | areas.intllib = S | ||||||
|  |  | ||||||
| areas.adminPrivs = {areas=true} | areas.adminPrivs = {areas=true} | ||||||
| areas.startTime = os.clock() | areas.startTime = os.clock() | ||||||
|  |  | ||||||
| @@ -20,20 +25,20 @@ dofile(areas.modpath.."/hud.lua") | |||||||
| areas:load() | areas:load() | ||||||
|  |  | ||||||
| minetest.register_privilege("areas", { | minetest.register_privilege("areas", { | ||||||
| 	description = "Can administer areas." | 	description = S("Can administer areas.") | ||||||
| }) | }) | ||||||
| minetest.register_privilege("areas_high_limit", { | minetest.register_privilege("areas_high_limit", { | ||||||
| 	description = "Can can more, bigger areas." | 	description = S("Can can more, bigger areas.") | ||||||
| }) | }) | ||||||
|  |  | ||||||
| if not minetest.registered_privileges[areas.config.self_protection_privilege] then | if not minetest.registered_privileges[areas.config.self_protection_privilege] then | ||||||
| 	minetest.register_privilege(areas.config.self_protection_privilege, { | 	minetest.register_privilege(areas.config.self_protection_privilege, { | ||||||
| 		description = "Can protect areas.", | 		description = S("Can protect areas."), | ||||||
| 	}) | 	}) | ||||||
| end | end | ||||||
|  |  | ||||||
| if minetest.settings:get_bool("log_mod") then | if minetest.settings:get_bool("log_mod") then | ||||||
| 	local diffTime = os.clock() - areas.startTime | 	local diffTime = os.clock() - areas.startTime | ||||||
| 	minetest.log("action", "areas loaded in "..diffTime.."s.") | 	minetest.log("action", S("[MOD]areas loaded in @1s.", diffTime)) | ||||||
| end | end | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								interact.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,3 +1,4 @@ | |||||||
|  | local S = areas.intllib | ||||||
|  |  | ||||||
| local old_is_protected = minetest.is_protected | local old_is_protected = minetest.is_protected | ||||||
| function minetest.is_protected(pos, name) | function minetest.is_protected(pos, name) | ||||||
| @@ -8,12 +9,16 @@ function minetest.is_protected(pos, name) | |||||||
| end | end | ||||||
|  |  | ||||||
| minetest.register_on_protection_violation(function(pos, name) | minetest.register_on_protection_violation(function(pos, name) | ||||||
|  | 	local player = minetest.get_player_by_name(name) | ||||||
|  | 	local playerpos = player:getpos() | ||||||
| 	if not areas:canInteract(pos, name) then | 	if not areas:canInteract(pos, name) then | ||||||
| 		local owners = areas:getNodeOwners(pos) | 		local owners = areas:getNodeOwners(pos) | ||||||
| 		minetest.chat_send_player(name, | 		--minetest.chat_send_player(name,	(S("%s is protected by %s.")):format(minetest.pos_to_string(pos), table.concat(owners, ", "))) | ||||||
| 			("%s is protected by %s."):format( | 		minetest.chat_send_player(name,(S("%s is protected by %s.")),minetest.pos_to_string(pos),table.concat(owners, ", "))) | ||||||
| 				minetest.pos_to_string(pos), | 		minetest.after(1,anti_lag,{player=player,playerpos=playerpos}) | ||||||
| 				table.concat(owners, ", "))) |  | ||||||
| 	end | 	end | ||||||
| end) | end) | ||||||
|  |  | ||||||
|  | function anti_lag(player) | ||||||
|  | 	player.player:setpos(player.playerpos) | ||||||
|  | end | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								internal.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,21 +1,32 @@ | |||||||
|  | local S = areas.intllib | ||||||
|  |  | ||||||
|  | -- Mega_builder privilege | ||||||
|  | minetest.register_privilege("megabuilder",S("Can protect an infinite amount of areas.")) | ||||||
|  |  | ||||||
| function areas:player_exists(name) | function areas:player_exists(name) | ||||||
| 	return minetest.get_auth_handler().get_auth(name) ~= nil | 	return minetest.get_auth_handler().get_auth(name) ~= nil | ||||||
| end | end | ||||||
|  |  | ||||||
|  | local safe_file_write = minetest.safe_file_write | ||||||
|  | if safe_file_write == nil then | ||||||
|  | 	function safe_file_write(path, content) | ||||||
|  | 		local file, err = io.open(path, "w") | ||||||
|  | 		if err then | ||||||
|  | 			return err | ||||||
|  | 		end | ||||||
|  | 		file:write(content) | ||||||
|  | 		file:close() | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
| -- Save the areas table to a file | -- Save the areas table to a file | ||||||
| function areas:save() | function areas:save() | ||||||
| 	local datastr = minetest.serialize(self.areas) | 	local datastr = minetest.serialize(self.areas) | ||||||
| 	if not datastr then | 	if not datastr then | ||||||
| 		minetest.log("error", "[areas] Failed to serialize area data!") | 		minetest.log("error", S("[areas] Failed to serialize area data!")) | ||||||
| 		return | 		return | ||||||
| 	end | 	end | ||||||
| 	local file, err = io.open(self.config.filename, "w") | 	return safe_file_write(self.config.filename, datastr) | ||||||
| 	if err then |  | ||||||
| 		return err |  | ||||||
| 	end |  | ||||||
| 	file:write(datastr) |  | ||||||
| 	file:close() |  | ||||||
| end | end | ||||||
|  |  | ||||||
| -- Load the areas table from the save file | -- Load the areas table from the save file | ||||||
| @@ -39,8 +50,8 @@ end | |||||||
| -- @return Whether the ID was valid. | -- @return Whether the ID was valid. | ||||||
| function areas:checkAreaStoreId(sid) | function areas:checkAreaStoreId(sid) | ||||||
| 	if not sid then | 	if not sid then | ||||||
| 		minetest.log("error", "AreaStore failed to find an ID for an " | 		minetest.log("error", S("AreaStore failed to find an ID for an " | ||||||
| 			.."area!  Falling back to iterative area checking.") | 			.."area!  Falling back to iterative area checking.")) | ||||||
| 		self.store = nil | 		self.store = nil | ||||||
| 		self.store_ids = nil | 		self.store_ids = nil | ||||||
| 	end | 	end | ||||||
| @@ -191,10 +202,13 @@ function areas:canPlayerAddArea(pos1, pos2, name) | |||||||
| 	-- and if the area is too big. | 	-- and if the area is too big. | ||||||
| 	if not self.config.self_protection or | 	if not self.config.self_protection or | ||||||
| 			not privs[areas.config.self_protection_privilege] then | 			not privs[areas.config.self_protection_privilege] then | ||||||
| 		return false, "Self protection is disabled or you do not have" | 		return false, S("Self protection is disabled or you do not have" | ||||||
| 				.." the necessary privilege." | 				.." the necessary privilege.") | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	-- MFF: megabuilders skip checks on size and number of areas. | ||||||
|  | 	if not privs["megabuilder"] then | ||||||
|  | 		-- Check size | ||||||
| 		local max_size = privs.areas_high_limit and | 		local max_size = privs.areas_high_limit and | ||||||
| 				self.config.self_protection_max_size_high or | 				self.config.self_protection_max_size_high or | ||||||
| 				self.config.self_protection_max_size | 				self.config.self_protection_max_size | ||||||
| @@ -202,7 +216,7 @@ function areas:canPlayerAddArea(pos1, pos2, name) | |||||||
| 				(pos2.x - pos1.x) > max_size.x or | 				(pos2.x - pos1.x) > max_size.x or | ||||||
| 				(pos2.y - pos1.y) > max_size.y or | 				(pos2.y - pos1.y) > max_size.y or | ||||||
| 				(pos2.z - pos1.z) > max_size.z then | 				(pos2.z - pos1.z) > max_size.z then | ||||||
| 		return false, "Area is too big." | 			return false, S("Area is too big.") | ||||||
| 		end | 		end | ||||||
| 		 | 		 | ||||||
| 		-- Check number of areas the user has and make sure it not above the max | 		-- Check number of areas the user has and make sure it not above the max | ||||||
| @@ -216,15 +230,17 @@ function areas:canPlayerAddArea(pos1, pos2, name) | |||||||
| 				self.config.self_protection_max_areas_high or | 				self.config.self_protection_max_areas_high or | ||||||
| 				self.config.self_protection_max_areas | 				self.config.self_protection_max_areas | ||||||
| 		if count >= max_areas then | 		if count >= max_areas then | ||||||
| 		return false, "You have reached the maximum amount of" | 			return false, S("You have reached the maximum amount of" | ||||||
| 				.." areas that you are allowed to  protect." | 					.." areas that you are allowed to protect.") | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
| 	-- Check intersecting areas | 	-- Check intersecting areas | ||||||
| 	local can, id = self:canInteractInArea(pos1, pos2, name) | 	local can, id = self:canMakeArea(pos1, pos2, name)  --MFF crabman(25/02/2016) fix areas in areas | ||||||
| 	if not can then | 	if not can then | ||||||
| 		local area = self.areas[id] | 		local area = self.areas[id] | ||||||
| 		return false, ("The area intersects with %s [%u] (%s).") | 		return false, (S("The area intersects with %s [%u] (%s).")) | ||||||
| 				:format(area.name, id, area.owner) | 				:format(area.name, id, area.owner) | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								intllib.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,45 @@ | |||||||
|  |  | ||||||
|  | -- Fallback functions for when `intllib` is not installed. | ||||||
|  | -- Code released under Unlicense <http://unlicense.org>. | ||||||
|  |  | ||||||
|  | -- Get the latest version of this file at: | ||||||
|  | --   https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua | ||||||
|  |  | ||||||
|  | local function format(str, ...) | ||||||
|  | 	local args = { ... } | ||||||
|  | 	local function repl(escape, open, num, close) | ||||||
|  | 		if escape == "" then | ||||||
|  | 			local replacement = tostring(args[tonumber(num)]) | ||||||
|  | 			if open == "" then | ||||||
|  | 				replacement = replacement..close | ||||||
|  | 			end | ||||||
|  | 			return replacement | ||||||
|  | 		else | ||||||
|  | 			return "@"..open..num..close | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | local gettext, ngettext | ||||||
|  | if minetest.get_modpath("intllib") then | ||||||
|  | 	if intllib.make_gettext_pair then | ||||||
|  | 		-- New method using gettext. | ||||||
|  | 		gettext, ngettext = intllib.make_gettext_pair() | ||||||
|  | 	else | ||||||
|  | 		-- Old method using text files. | ||||||
|  | 		gettext = intllib.Getter() | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  |  | ||||||
|  | -- Fill in missing functions. | ||||||
|  |  | ||||||
|  | gettext = gettext or function(msgid, ...) | ||||||
|  | 	return format(msgid, ...) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | ngettext = ngettext or function(msgid, msgid_plural, n, ...) | ||||||
|  | 	return format(n==1 and msgid or msgid_plural, ...) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | return gettext, ngettext | ||||||
							
								
								
									
										22
									
								
								legacy.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,25 +1,27 @@ | |||||||
| -- This file contains functions to convert from | -- This file contains functions to convert from | ||||||
| -- the old areas format and other compatability code. | -- the old areas format and other compatability code. | ||||||
|  |  | ||||||
|  | local S = areas.intllib | ||||||
|  |  | ||||||
| minetest.register_chatcommand("legacy_load_areas", { | minetest.register_chatcommand("legacy_load_areas", { | ||||||
| 	params = "<version>", | 	params = "<version>", | ||||||
| 	description = "Loads, converts, and saves the areas from" | 	description = S("Loads, converts, and saves the areas from" | ||||||
| 		.." a legacy save file.", | 		.." a legacy save file."), | ||||||
| 	privs = {areas=true, server=true}, | 	privs = {areas=true, server=true}, | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		minetest.chat_send_player(name, "Converting areas...") | 		minetest.chat_send_player(name, S("Converting areas...")) | ||||||
| 		local version = tonumber(param) | 		local version = tonumber(param) | ||||||
| 		if version == 0 then | 		if version == 0 then | ||||||
| 			err = areas:node_ownership_load() | 			err = areas:node_ownership_load() | ||||||
| 			if err then | 			if err then | ||||||
| 				minetest.chat_send_player(name, "Error loading legacy file: "..err) | 				minetest.chat_send_player(name, S("Error loading legacy file: ")..err) | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
| 		else | 		else | ||||||
| 			minetest.chat_send_player(name, "Invalid version number. (0 allowed)") | 			minetest.chat_send_player(name, S("Invalid version number. (0 allowed)")) | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		minetest.chat_send_player(name, "Legacy file loaded.") | 		minetest.chat_send_player(name, S("Legacy file loaded.")) | ||||||
|  |  | ||||||
| 		for k, area in pairs(areas.areas) do | 		for k, area in pairs(areas.areas) do | ||||||
| 			-- New position format | 			-- New position format | ||||||
| @@ -34,15 +36,15 @@ minetest.register_chatcommand("legacy_load_areas", { | |||||||
| 			areas:sortPos(area.pos1, area.pos2) | 			areas:sortPos(area.pos1, area.pos2) | ||||||
|  |  | ||||||
| 			-- Add name | 			-- Add name | ||||||
| 			area.name = "unnamed" | 			area.name = S("unnamed") | ||||||
|  |  | ||||||
| 			-- Remove ID | 			-- Remove ID | ||||||
| 			area.id = nil | 			area.id = nil | ||||||
| 		end | 		end | ||||||
| 		minetest.chat_send_player(name, "Table format updated.") | 		minetest.chat_send_player(name, S("Table format updated.")) | ||||||
|  |  | ||||||
| 		areas:save() | 		areas:save() | ||||||
| 		minetest.chat_send_player(name, "Converted areas saved. Done.") | 		minetest.chat_send_player(name, S("Converted areas saved. Done.")) | ||||||
| 	end | 	end | ||||||
| }) | }) | ||||||
|  |  | ||||||
| @@ -129,7 +131,7 @@ if areas.config.legacy_table then | |||||||
| 					{x=a.x2, y=a.y2, z=a.z2} | 					{x=a.x2, y=a.y2, z=a.z2} | ||||||
| 			a.x1, a.y1, a.z1, a.x2, a.y2, a.z2 = | 			a.x1, a.y1, a.z1, a.x2, a.y2, a.z2 = | ||||||
| 				nil, nil, nil, nil, nil, nil | 				nil, nil, nil, nil, nil, nil | ||||||
| 			a.name = a.name or "unnamed" | 			a.name = a.name or S("unnamed") | ||||||
| 			a.id = nil | 			a.id = nil | ||||||
| 			return rawset(areas.areas, key, a) | 			return rawset(areas.areas, key, a) | ||||||
| 		end | 		end | ||||||
|   | |||||||
							
								
								
									
										520
									
								
								locale/fr.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,520 @@ | |||||||
|  | # SOME DESCRIPTIVE TITLE. | ||||||
|  | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER | ||||||
|  | # This file is distributed under the same license as the PACKAGE package. | ||||||
|  | # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. | ||||||
|  | # | ||||||
|  | msgid "" | ||||||
|  | msgstr "" | ||||||
|  | "Project-Id-Version: \n" | ||||||
|  | "Report-Msgid-Bugs-To: \n" | ||||||
|  | "POT-Creation-Date: 2017-08-02 14:48+0200\n" | ||||||
|  | "PO-Revision-Date: 2017-08-02 15:35+0200\n" | ||||||
|  | "Last-Translator: fat115 <fat115@framasoft.org>\n" | ||||||
|  | "Language-Team: \n" | ||||||
|  | "Language: fr\n" | ||||||
|  | "MIME-Version: 1.0\n" | ||||||
|  | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
|  | "Content-Transfer-Encoding: 8bit\n" | ||||||
|  | "X-Generator: Poedit 1.8.12\n" | ||||||
|  | "Plural-Forms: nplurals=2; plural=(n > 1);\n" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Protect your own area" | ||||||
|  | msgstr "Protéger votre zone" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help protect." | ||||||
|  | msgstr "Usage incorrect, consultez /help protect" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You need to select an area first." | ||||||
|  | msgstr "Vous devez d'abord sélectionner une zone." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "/protect invoked, Owner =" | ||||||
|  | msgstr "/protect invoqué, Propriétaire =" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You can't protect that area: " | ||||||
|  | msgstr "Vous ne pouvez pas protéger cette zone : " | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area protected. ID: " | ||||||
|  | msgstr "La zone est désormais protégée. Elle porte le N°" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "" | ||||||
|  | "Protect an area beetween two positions and give a player access to it " | ||||||
|  | "without setting the parent of the area to any existing area" | ||||||
|  | msgstr "" | ||||||
|  | "Protéger la zone entre deux positions et en donner l'accès à un joueur sans " | ||||||
|  | "définir de parent pour cette zone." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Incorrect usage, see /help set_owner." | ||||||
|  | msgstr "Usage incorrect, consultez /help set_owner" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "The player \"@1\" does not exist." | ||||||
|  | msgstr "Le joueur \"@1\" n'existe pas." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid " runs /set_owner. Owner = " | ||||||
|  | msgstr " a lancé /set_owner. Propriétaire = " | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "" | ||||||
|  | "You have been granted control over area #@1. Type /list_areas to show your " | ||||||
|  | "areas." | ||||||
|  | msgstr "" | ||||||
|  | "Vous avez le contrôle sur la zone N°@1. Tapez /list pour voir la liste de " | ||||||
|  | "vos zones." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "" | ||||||
|  | "Give a player access to a sub-area beetween two positions that have already " | ||||||
|  | "been protected, Use set_owner if you don't want the parent to be set." | ||||||
|  | msgstr "" | ||||||
|  | "Donne l'accès à un joueur pour la zone comprise entre deux positions déja " | ||||||
|  | "protégée. Utilisez plutot set_owner si vous ne souhaitez pas définir le " | ||||||
|  | "parent." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Incorrect usage, see /help add_owner" | ||||||
|  | msgstr "Usage incorrect, consultez /help add_owner" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid " runs /add_owner. Owner = " | ||||||
|  | msgstr " a lancé /add_owner. Propriétaire = " | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You can't protect that area." | ||||||
|  | msgstr "Vous ne pouvez pas protéger cette zone." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Rename a area that you own" | ||||||
|  | msgstr "Renommer une zone que vous possédez" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help rename_area." | ||||||
|  | msgstr "Usage incorrect, consultez /help rename_area." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "That area doesn't exist." | ||||||
|  | msgstr "Cette zone n'existe pas." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You don't own that area." | ||||||
|  | msgstr "Vous ne possédez pas cette zone." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area renamed." | ||||||
|  | msgstr "Zone renommée." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Find areas using a Lua regular expression" | ||||||
|  | msgstr "Rechercher des zones en utilisant une expression régulière Lua" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "A regular expression is required." | ||||||
|  | msgstr "Une expression régulière est requise." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid regular expression." | ||||||
|  | msgstr "Expression régulière invalide." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "No matches found." | ||||||
|  | msgstr "Aucun résultat." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "List your areas, or all areas if you are an admin." | ||||||
|  | msgstr "Affiche vos zones (ou toutes les zones si vous êtes administrateur)." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "No visible areas." | ||||||
|  | msgstr "Aucune zone visible." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Recursively remove areas using an id" | ||||||
|  | msgstr "Supprimer récursivement des zones en utilisant un numéro" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help recursive_remove_areas" | ||||||
|  | msgstr "Usage incorrect, consultez /help recursive_remove_areas" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area @1 does not exist or is not owned by you." | ||||||
|  | msgstr "La zone @1 n'existe pas ou ne vous appartient pas." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Removed area @1 and it's sub areas." | ||||||
|  | msgstr "Zone @1 supprimée ainsi que toutes ses sous-zones." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Remove an area using an id" | ||||||
|  | msgstr "Supprimer une zone en utilisant son numéro" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help remove_area" | ||||||
|  | msgstr "Usage incorrect, consultez /help remove_area" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Removed area @1" | ||||||
|  | msgstr "Zone @1 supprimée" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Change the owner of an area using it's ID" | ||||||
|  | msgstr "Modifier le propriétaire d'une zone en utilisant son numéro" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help change_owner." | ||||||
|  | msgstr "Usage incorrect, consultez /help change_owner." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "@1 has given you control over the area @2 (ID @3)." | ||||||
|  | msgstr "@1 vous a donné le contrôle sur la zone @2 (N° @3)." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Owner changed." | ||||||
|  | msgstr "Propriétaire modifié." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Toggle an area open (anyone can interact) or closed" | ||||||
|  | msgstr "" | ||||||
|  | "Bascule une zone en mode ouvert (n’importe qui peut interagir) ou fermé" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help area_open." | ||||||
|  | msgstr "Usage incorrect, consultez /help area_open." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "closed" | ||||||
|  | msgstr "fermée" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "opened" | ||||||
|  | msgstr "ouverte" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'opened' or 'closed' | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area @1." | ||||||
|  | msgstr "Zone @1." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Toggle an area open (anyone can interact farming) or closed" | ||||||
|  | msgstr "" | ||||||
|  | "Bascule une zone en mode culture ouverte (n’importe qui peut cultiver) ou " | ||||||
|  | "fermée" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help area_openfarming." | ||||||
|  | msgstr "Usage incorrect, consultez /help area_openfarming." | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'opened' or 'closed' | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area @1 to farming." | ||||||
|  | msgstr "Zone @1 à la culture." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Move (or resize) an area to the current positions." | ||||||
|  | msgstr "Déplace (ou redimensionne) une zone avec les positions actuelles." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help move_area." | ||||||
|  | msgstr "Usage incorrect, consultez /help move_area" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area does not exist." | ||||||
|  | msgstr "La zone n'existe pas." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area successfully moved." | ||||||
|  | msgstr "La zone a été déplacée." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Get information about area configuration and usage." | ||||||
|  | msgstr "Affiche les informations sur la configuration des zones et leur usage." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "disabled" | ||||||
|  | msgstr "désactivée" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "enabled" | ||||||
|  | msgstr "activée" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'enabled' or 'disabled' | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Self protection is @1 " | ||||||
|  | msgstr "L'auto-protection est @1 " | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "and you" | ||||||
|  | msgstr "et vous avez" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "but you don't" | ||||||
|  | msgstr "mais vous n'avez pas" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'and you' or 'but you don't' | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid " @1 have the neccessary privilege (@2)." | ||||||
|  | msgstr " @1 le privilège requis (@2)." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You are an area administrator (\"areas\" privilege)." | ||||||
|  | msgstr "Vous êtes administrateur de zones (privilège \\\"areas\\\" )." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "" | ||||||
|  | "You have extended area protection limits (\"areas_high_limit\" privilege)." | ||||||
|  | msgstr "" | ||||||
|  | "Vous pouvez protéger de grandes zones (privilège \\\"areas_high_limit\\\")." | ||||||
|  |  | ||||||
|  | #. Translators: need to use NS gettext to be more precise | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You have @1 area@2" | ||||||
|  | msgstr "Vous êtes propriétaire de @1 zone@2" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid " and have no area protection limits." | ||||||
|  | msgstr " et n'avez pas de limite de protection de zones." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid ", out of a maximum of @1." | ||||||
|  | msgstr ", sur un maximum de @1." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "%s spanning up to %dx%dx%d." | ||||||
|  | msgstr "%s étendue jusqu’à %dx%dx%d." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "Players with the %q privilege can protect up to %d areas" | ||||||
|  | msgstr "Les joueurs avec le privilège %q peuvent protéger jusqu'à %d zones" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You can protect areas" | ||||||
|  | msgstr "Vous pouvez protéger des zones" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Define special spawn for area" | ||||||
|  | msgstr "Définit un spawn spécifique à une zone" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help area_addspawn." | ||||||
|  | msgstr "Usage incorrect, consultez /help area_addspawn." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Error, Param id must be int." | ||||||
|  | msgstr "Erreur, le paramètre id doit être un entier" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Error, there is not such player" | ||||||
|  | msgstr "Erreur, pas de joueur à ce nom" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Error, there is not pos." | ||||||
|  | msgstr "Erreur, position invalide." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area @1 does not exist." | ||||||
|  | msgstr "La zone @1 n'existe pas." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "spawn of area @1 defined." | ||||||
|  | msgstr "spawn de la zone @1 défini." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Delete special spawn of area" | ||||||
|  | msgstr "Supprime le spawn spécifique à une zone" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help area_delspawn." | ||||||
|  | msgstr "Usage incorrect, consultez /help area_delspawn." | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "spawn of area @1 deleted." | ||||||
|  | msgstr "spawn de la zone @1 supprimé." | ||||||
|  |  | ||||||
|  | #: hud.lua | ||||||
|  | msgid "No area(s)" | ||||||
|  | msgstr "Pas de zone" | ||||||
|  |  | ||||||
|  | #. Translators: need to use NS gettext to be more precise | ||||||
|  | #: hud.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "" | ||||||
|  | "%s\n" | ||||||
|  | "Owner: %s\n" | ||||||
|  | "%u area" | ||||||
|  | msgstr "" | ||||||
|  | "%s\n" | ||||||
|  | "Propriétaire : %s\n" | ||||||
|  | "%u zone" | ||||||
|  |  | ||||||
|  | #: init.lua | ||||||
|  | msgid "Can administer areas." | ||||||
|  | msgstr "Droit d’administrer des zones" | ||||||
|  |  | ||||||
|  | #: init.lua | ||||||
|  | msgid "Can can more, bigger areas." | ||||||
|  | msgstr "Droit de créer des zones plus grandes." | ||||||
|  |  | ||||||
|  | #: init.lua | ||||||
|  | msgid "Can protect areas." | ||||||
|  | msgstr "Droit de protéger des zones." | ||||||
|  |  | ||||||
|  | #: init.lua | ||||||
|  | msgid "[MOD]areas loaded in @1s." | ||||||
|  | msgstr "[MOD]areas chargé en @1s." | ||||||
|  |  | ||||||
|  | #: interact.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "%s is protected by %s." | ||||||
|  | msgstr "%s est protégée par %s" | ||||||
|  |  | ||||||
|  | #: internal.lua | ||||||
|  | msgid "Self protection is disabled or you do not have the necessary privilege." | ||||||
|  | msgstr "" | ||||||
|  | "L'auto-protection est désactivée ou vous n'avez pas les privilèges requis." | ||||||
|  |  | ||||||
|  | #: internal.lua | ||||||
|  | msgid "Area is too big." | ||||||
|  | msgstr "La zone est trop grande." | ||||||
|  |  | ||||||
|  | #: internal.lua | ||||||
|  | msgid "" | ||||||
|  | "You have reached the maximum amount of areas that you are allowed to protect." | ||||||
|  | msgstr "" | ||||||
|  | "Vous avez atteint le nombre maximum de zones que vous êtes autorisé a " | ||||||
|  | "protéger." | ||||||
|  |  | ||||||
|  | #: internal.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "The area intersects with %s [%u] (%s)." | ||||||
|  | msgstr "Cette zone se recoupe avec %s [%u] (%s)." | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Loads, converts, and saves the areas from a legacy save file." | ||||||
|  | msgstr "Charge, convertit et sauvegarde les zones depuis un ancien fichier" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Converting areas..." | ||||||
|  | msgstr "Conversion des zones..." | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Error loading legacy file: " | ||||||
|  | msgstr "Erreur de chargement du fichier : " | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Invalid version number. (0 allowed)" | ||||||
|  | msgstr "Numéro de version incorrect. (0 autorisé)" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Legacy file loaded." | ||||||
|  | msgstr "Ancien fichier chargé." | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "unnamed" | ||||||
|  | msgstr "sans nom" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Table format updated." | ||||||
|  | msgstr "Format de table mis à jour." | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Converted areas saved. Done." | ||||||
|  | msgstr "Zones converties sauvegardées. Terminé." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Select a area by id." | ||||||
|  | msgstr "Sélectionnez une zone par son numéro" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Invalid usage, see /help select_area." | ||||||
|  | msgstr "Usage incorrect, consultez /help select_area." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "The area @1 does not exist." | ||||||
|  | msgstr "La zone @1 n'existe pas." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Area @1 selected." | ||||||
|  | msgstr "La zone @1 est sélectionnée." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "" | ||||||
|  | "Set area protection region position 1 to your location or the one specified" | ||||||
|  | msgstr "" | ||||||
|  | "Définit la position 1 de la zone à protéger à votre position ou à celle " | ||||||
|  | "spécifiée" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Unable to get position." | ||||||
|  | msgstr "Impossible d'utiliser cette position." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Invalid usage, see /help area_pos1." | ||||||
|  | msgstr "Usage incorect, consultez /help area_pos1." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Area position 1 set to " | ||||||
|  | msgstr "Position 1 de la zone définie en " | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "" | ||||||
|  | "Set area protection region position 2 to your location or the one specified" | ||||||
|  | msgstr "" | ||||||
|  | "Définit la position 2 de la zone à protéger à votre position ou à celle " | ||||||
|  | "spécifiée" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Invalid usage, see /help area_pos2." | ||||||
|  | msgstr "Usage incorrect, consultez /help area_pos2." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Area position 2 set to " | ||||||
|  | msgstr "Position 2 de la zone définie en " | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "" | ||||||
|  | "Set area protection region, position 1, or position 2 by punching nodes, or " | ||||||
|  | "display the region" | ||||||
|  | msgstr "" | ||||||
|  | "Définit la région de votre zone protégée, position 1 ou position 2 en tapant " | ||||||
|  | "sur un bloc ou, affiche la région" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Select positions by punching two nodes." | ||||||
|  | msgstr "Tapez sur deux blocs pour sélectionner les positions." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Select position 1 by punching a node." | ||||||
|  | msgstr "Choisissez la position 1 en tapant sur un bloc." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Select position 2 by punching a node." | ||||||
|  | msgstr "Choisissez la position 2 en tapant sur un bloc." | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "<not set>" | ||||||
|  | msgstr "<non défini>" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Unknown subcommand: " | ||||||
|  | msgstr "Sous-commande inconnue : " | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Position 1 set to " | ||||||
|  | msgstr "Position 1 définie en " | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Position 2 set to " | ||||||
|  | msgstr "Position 2 définie en " | ||||||
|  |  | ||||||
|  | #: settings.lua | ||||||
|  | msgid "Invalid setting type!" | ||||||
|  | msgstr "Type de réglage invalide !" | ||||||
							
								
								
									
										395
									
								
								locale/ru.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,395 @@ | |||||||
|  | # SOME DESCRIPTIVE TITLE. | ||||||
|  | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER | ||||||
|  | # This file is distributed under the same license as the PACKAGE package. | ||||||
|  | # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. | ||||||
|  | # | ||||||
|  | msgid "" | ||||||
|  | msgstr "" | ||||||
|  | "Project-Id-Version: \n" | ||||||
|  | "Report-Msgid-Bugs-To: \n" | ||||||
|  | "POT-Creation-Date: 2017-08-02 14:48+0200\n" | ||||||
|  | "PO-Revision-Date: 2017-08-15 10:31+0300\n" | ||||||
|  | "Language-Team: \n" | ||||||
|  | "MIME-Version: 1.0\n" | ||||||
|  | "Content-Type: text/plain; charset=UTF-8\n" | ||||||
|  | "Content-Transfer-Encoding: 8bit\n" | ||||||
|  | "X-Generator: Poedit 2.0.3\n" | ||||||
|  | "Last-Translator: inpos <inpos@yandex.ru>\n" | ||||||
|  | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" | ||||||
|  | "Language: ru\n" | ||||||
|  |  | ||||||
|  | msgid "Protect your own area" | ||||||
|  | msgstr "Защитить свою область" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help protect." | ||||||
|  | msgstr "Неверное использование, см. /help protect." | ||||||
|  |  | ||||||
|  | msgid "You need to select an area first." | ||||||
|  | msgstr "Сначала надо выбрать область." | ||||||
|  |  | ||||||
|  | msgid "/protect invoked, Owner =" | ||||||
|  | msgstr "/protect вызван, Владелец =" | ||||||
|  |  | ||||||
|  | msgid "You can't protect that area: " | ||||||
|  | msgstr "Вы не можете защитить эту область: " | ||||||
|  |  | ||||||
|  | msgid "Area protected. ID: " | ||||||
|  | msgstr "Область защищена. ID: " | ||||||
|  |  | ||||||
|  | msgid "" | ||||||
|  | "Protect an area beetween two positions and give a player access to it " | ||||||
|  | "without setting the parent of the area to any existing area" | ||||||
|  | msgstr "Защитите область между двумя позициями и дайте игроку доступ к ней, не " | ||||||
|  | "устанавливая родителя области в любую существующую область" | ||||||
|  |  | ||||||
|  | msgid "Incorrect usage, see /help set_owner." | ||||||
|  | msgstr "Неверное использование, см. /help set_owner." | ||||||
|  |  | ||||||
|  | msgid "The player \"@1\" does not exist." | ||||||
|  | msgstr "Игрок \"@1\" не существует." | ||||||
|  |  | ||||||
|  | msgid " runs /set_owner. Owner = " | ||||||
|  | msgstr " выполняется /set_owner. Владелец = " | ||||||
|  |  | ||||||
|  | msgid "" | ||||||
|  | "You have been granted control over area #@1. Type /list_areas to show your " | ||||||
|  | "areas." | ||||||
|  | msgstr "Вы дали доступ на управление областью #@1. Наберите /list_areas для вывода " | ||||||
|  | "списка своих областей." | ||||||
|  |  | ||||||
|  | msgid "" | ||||||
|  | "Give a player access to a sub-area beetween two positions that have already " | ||||||
|  | "been protected, Use set_owner if you don't want the parent to be set." | ||||||
|  | msgstr "Предоставьте игроку доступ к подзоне между двумя уже защищенными позициями. " | ||||||
|  | "Используйте set_owner, чтобы не устанавливать из родительской области." | ||||||
|  |  | ||||||
|  | msgid "Incorrect usage, see /help add_owner" | ||||||
|  | msgstr "Неверное использование, см. /help add_owner" | ||||||
|  |  | ||||||
|  | msgid " runs /add_owner. Owner = " | ||||||
|  | msgstr " выполняется /add_owner. Владелец = " | ||||||
|  |  | ||||||
|  | msgid "You can't protect that area." | ||||||
|  | msgstr "Вы не можете защитить эту область." | ||||||
|  |  | ||||||
|  | msgid "Rename a area that you own" | ||||||
|  | msgstr "Переименовать вашу область" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help rename_area." | ||||||
|  | msgstr "Неверное использование, см. /help rename_area." | ||||||
|  |  | ||||||
|  | msgid "That area doesn't exist." | ||||||
|  | msgstr "Такой области не существует." | ||||||
|  |  | ||||||
|  | msgid "You don't own that area." | ||||||
|  | msgstr "Это не ваша область." | ||||||
|  |  | ||||||
|  | msgid "Area renamed." | ||||||
|  | msgstr "Область переименована." | ||||||
|  |  | ||||||
|  | msgid "Find areas using a Lua regular expression" | ||||||
|  | msgstr "Найти области с помощью регулярных выражений Lua" | ||||||
|  |  | ||||||
|  | msgid "A regular expression is required." | ||||||
|  | msgstr "Требуется регулярное выражение." | ||||||
|  |  | ||||||
|  | msgid "Invalid regular expression." | ||||||
|  | msgstr "Неверное регулярное выражение." | ||||||
|  |  | ||||||
|  | msgid "No matches found." | ||||||
|  | msgstr "Совпадений не найдено." | ||||||
|  |  | ||||||
|  | msgid "List your areas, or all areas if you are an admin." | ||||||
|  | msgstr "Вывести список ваших областей или всех областей, если вы администратор." | ||||||
|  |  | ||||||
|  | msgid "No visible areas." | ||||||
|  | msgstr "Нет видимых областей." | ||||||
|  |  | ||||||
|  | msgid "Recursively remove areas using an id" | ||||||
|  | msgstr "Рекурсивно удалить области используя id" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help recursive_remove_areas" | ||||||
|  | msgstr "Неверное использование, см. /help recursive_remove_areas" | ||||||
|  |  | ||||||
|  | msgid "Area @1 does not exist or is not owned by you." | ||||||
|  | msgstr "Область @1 не существует или не принадлежит вам." | ||||||
|  |  | ||||||
|  | msgid "Removed area @1 and it's sub areas." | ||||||
|  | msgstr "Удалена область @1 и её подзоны." | ||||||
|  |  | ||||||
|  | msgid "Remove an area using an id" | ||||||
|  | msgstr "Удалить область используя id" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help remove_area" | ||||||
|  | msgstr "Неверное использование, см. /help remove_area" | ||||||
|  |  | ||||||
|  | msgid "Removed area @1" | ||||||
|  | msgstr "Удалена область @1" | ||||||
|  |  | ||||||
|  | msgid "Change the owner of an area using it's ID" | ||||||
|  | msgstr "Изменить владельца области используя её ID" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help change_owner." | ||||||
|  | msgstr "Неверное использование, см. /help change_owner." | ||||||
|  |  | ||||||
|  | msgid "@1 has given you control over the area @2 (ID @3)." | ||||||
|  | msgstr "@1 дал передал вам управление над областью @2 (ID @3)" | ||||||
|  |  | ||||||
|  | msgid "Owner changed." | ||||||
|  | msgstr "Владелец изменён." | ||||||
|  |  | ||||||
|  | msgid "Toggle an area open (anyone can interact) or closed" | ||||||
|  | msgstr "Переключить область в режим открытой (любой может взаимодействовать) или " | ||||||
|  | "закрытой" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help area_open." | ||||||
|  | msgstr "Неверное использование, см. /help area_open." | ||||||
|  |  | ||||||
|  | msgid "closed" | ||||||
|  | msgstr "закрыта" | ||||||
|  |  | ||||||
|  | msgid "opened" | ||||||
|  | msgstr "открыта" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'opened' or 'closed' | ||||||
|  | msgid "Area @1." | ||||||
|  | msgstr "Область @1." | ||||||
|  |  | ||||||
|  | msgid "Toggle an area open (anyone can interact farming) or closed" | ||||||
|  | msgstr "Переключить область в режим открытой (любой может изменять местность) или " | ||||||
|  | "закрытой" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help area_openfarming." | ||||||
|  | msgstr "Неверное использование, см. /help area_openfarming." | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'opened' or 'closed' | ||||||
|  | msgid "Area @1 to farming." | ||||||
|  | msgstr "Область @1 для добычи." | ||||||
|  |  | ||||||
|  | msgid "Move (or resize) an area to the current positions." | ||||||
|  | msgstr "Переместить (или изменить размер) область в текущую позицию." | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help move_area." | ||||||
|  | msgstr "Неверное использование, см. /help move_area." | ||||||
|  |  | ||||||
|  | msgid "Area does not exist." | ||||||
|  | msgstr "Область не существует." | ||||||
|  |  | ||||||
|  | msgid "Area successfully moved." | ||||||
|  | msgstr "Область перемещена." | ||||||
|  |  | ||||||
|  | msgid "Get information about area configuration and usage." | ||||||
|  | msgstr "Получить информацию о конфигурации и использовании области." | ||||||
|  |  | ||||||
|  | msgid "disabled" | ||||||
|  | msgstr "отключено" | ||||||
|  |  | ||||||
|  | msgid "enabled" | ||||||
|  | msgstr "включено" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'enabled' or 'disabled' | ||||||
|  | msgid "Self protection is @1 " | ||||||
|  | msgstr "Самозащита @1 " | ||||||
|  |  | ||||||
|  | msgid "and you" | ||||||
|  | msgstr "и вы" | ||||||
|  |  | ||||||
|  | msgid "but you don't" | ||||||
|  | msgstr "но вы не" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'and you' or 'but you don't' | ||||||
|  | msgid " @1 have the neccessary privilege (@2)." | ||||||
|  | msgstr " @1 имеет соответствующие права (@2)." | ||||||
|  |  | ||||||
|  | msgid "You are an area administrator (\"areas\" privilege)." | ||||||
|  | msgstr "Вы администратор области (права \"areas\")." | ||||||
|  |  | ||||||
|  | msgid "" | ||||||
|  | "You have extended area protection limits (\"areas_high_limit\" privilege)." | ||||||
|  | msgstr "У вас расширенный ограничения защиты области (права \"areas_high_limit\")." | ||||||
|  |  | ||||||
|  | #. Translators: need to use NS gettext to be more precise | ||||||
|  | msgid "You have @1 area@2" | ||||||
|  | msgstr "У вас @1 область@2" | ||||||
|  |  | ||||||
|  | msgid " and have no area protection limits." | ||||||
|  | msgstr " и нет ограничений защиты области." | ||||||
|  |  | ||||||
|  | msgid ", out of a maximum of @1." | ||||||
|  | msgstr ", превышен @1." | ||||||
|  |  | ||||||
|  | #, lua-format | ||||||
|  | msgid "%s spanning up to %dx%dx%d." | ||||||
|  | msgstr "%s охватывает до %dx%dx%d." | ||||||
|  |  | ||||||
|  | #, lua-format | ||||||
|  | msgid "Players with the %q privilege can protect up to %d areas" | ||||||
|  | msgstr "Игроки с правами %q могут защитить до %d областей." | ||||||
|  |  | ||||||
|  | msgid "You can protect areas" | ||||||
|  | msgstr "Вы можете защитить области" | ||||||
|  |  | ||||||
|  | msgid "Define special spawn for area" | ||||||
|  | msgstr "Определить специальную точку порождения для области" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help area_addspawn." | ||||||
|  | msgstr "Неверное использование, см. /help area_addspawn." | ||||||
|  |  | ||||||
|  | msgid "Error, Param id must be int." | ||||||
|  | msgstr "Ошибка, параметр id должен быть целым числом." | ||||||
|  |  | ||||||
|  | msgid "Error, there is not such player" | ||||||
|  | msgstr "Ошибка, не такого игрока" | ||||||
|  |  | ||||||
|  | msgid "Error, there is not pos." | ||||||
|  | msgstr "Ошибка, это не позиция." | ||||||
|  |  | ||||||
|  | msgid "Area @1 does not exist." | ||||||
|  | msgstr "Область @1 не существует." | ||||||
|  |  | ||||||
|  | msgid "spawn of area @1 defined." | ||||||
|  | msgstr "точка порождения области @1 определена." | ||||||
|  |  | ||||||
|  | msgid "Delete special spawn of area" | ||||||
|  | msgstr "Удалить специальную точку порождения области" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help area_delspawn." | ||||||
|  | msgstr "Неверное использование, см. /help area_delspawn." | ||||||
|  |  | ||||||
|  | msgid "spawn of area @1 deleted." | ||||||
|  | msgstr "точка порождения области @1 удалена." | ||||||
|  |  | ||||||
|  | msgid "No area(s)" | ||||||
|  | msgstr "Нет области(ей)" | ||||||
|  |  | ||||||
|  | #. Translators: need to use NS gettext to be more precise | ||||||
|  | #, lua-format | ||||||
|  | msgid "" | ||||||
|  | "%s\n" | ||||||
|  | "Owner: %s\n" | ||||||
|  | "%u area" | ||||||
|  | msgstr "%s\n" | ||||||
|  | "Владелец: %s\n" | ||||||
|  | "%u область" | ||||||
|  |  | ||||||
|  | msgid "Can administer areas." | ||||||
|  | msgstr "Может администрировать область." | ||||||
|  |  | ||||||
|  | msgid "Can can more, bigger areas." | ||||||
|  | msgstr "Может больше (количество и размер) областей." | ||||||
|  |  | ||||||
|  | msgid "Can protect areas." | ||||||
|  | msgstr "Может защитить области." | ||||||
|  |  | ||||||
|  | msgid "[MOD]areas loaded in @1s." | ||||||
|  | msgstr "[MOD]areas загружен в @1s." | ||||||
|  |  | ||||||
|  | #, lua-format | ||||||
|  | msgid "%s is protected by %s." | ||||||
|  | msgstr "%s защищено %s." | ||||||
|  |  | ||||||
|  | msgid "Self protection is disabled or you do not have the necessary privilege." | ||||||
|  | msgstr "Самозащита отключена или у вас нет соответствующих прав." | ||||||
|  |  | ||||||
|  | msgid "Area is too big." | ||||||
|  | msgstr "Область слишком большая." | ||||||
|  |  | ||||||
|  | msgid "" | ||||||
|  | "You have reached the maximum amount of areas that you are allowed to protect." | ||||||
|  | msgstr "Вы превысили допустимое количество областей, которые можете защитить." | ||||||
|  |  | ||||||
|  | #, lua-format | ||||||
|  | msgid "The area intersects with %s [%u] (%s)." | ||||||
|  | msgstr "Область пересекается с %s [%u] (%s)." | ||||||
|  |  | ||||||
|  | msgid "Loads, converts, and saves the areas from a legacy save file." | ||||||
|  | msgstr "Загружает, конвертирует и сохраняет области в файл сохранения наследия." | ||||||
|  |  | ||||||
|  | msgid "Converting areas..." | ||||||
|  | msgstr "Конвертация областей..." | ||||||
|  |  | ||||||
|  | msgid "Error loading legacy file: " | ||||||
|  | msgstr "Ошибка загрузки файла наследия: " | ||||||
|  |  | ||||||
|  | msgid "Invalid version number. (0 allowed)" | ||||||
|  | msgstr "Неверный номер версии. (0 разрешён)" | ||||||
|  |  | ||||||
|  | msgid "Legacy file loaded." | ||||||
|  | msgstr "Файл наследия загружен." | ||||||
|  |  | ||||||
|  | msgid "unnamed" | ||||||
|  | msgstr "безымянное" | ||||||
|  |  | ||||||
|  | msgid "Table format updated." | ||||||
|  | msgstr "Формат таблицы обновлён." | ||||||
|  |  | ||||||
|  | msgid "Converted areas saved. Done." | ||||||
|  | msgstr "Сконвертированные области сохранены. Выполнено." | ||||||
|  |  | ||||||
|  | msgid "Select a area by id." | ||||||
|  | msgstr "Выбрать область по id" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help select_area." | ||||||
|  | msgstr "Неверное использование, см. /help select_area." | ||||||
|  |  | ||||||
|  | msgid "The area @1 does not exist." | ||||||
|  | msgstr "Область @1 не существует." | ||||||
|  |  | ||||||
|  | msgid "Area @1 selected." | ||||||
|  | msgstr "Область @1 выбрана." | ||||||
|  |  | ||||||
|  | msgid "" | ||||||
|  | "Set area protection region position 1 to your location or the one specified" | ||||||
|  | msgstr "Установить позицию 1 зоны защиты области в своё местоположение или в " | ||||||
|  | "указанное" | ||||||
|  |  | ||||||
|  | msgid "Unable to get position." | ||||||
|  | msgstr "Невозможно получить позицию." | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help area_pos1." | ||||||
|  | msgstr "Неверное использование, см. /help area_pos1." | ||||||
|  |  | ||||||
|  | msgid "Area position 1 set to " | ||||||
|  | msgstr "Позиция 1 области установлена в " | ||||||
|  |  | ||||||
|  | msgid "" | ||||||
|  | "Set area protection region position 2 to your location or the one specified" | ||||||
|  | msgstr "Установить позицию 2 зоны защиты области в своё местоположение или в " | ||||||
|  | "указанное" | ||||||
|  |  | ||||||
|  | msgid "Invalid usage, see /help area_pos2." | ||||||
|  | msgstr "Неверное использование, см. /help area_pos2." | ||||||
|  |  | ||||||
|  | msgid "Area position 2 set to " | ||||||
|  | msgstr "Позиция 2 области установлена в " | ||||||
|  |  | ||||||
|  | msgid "" | ||||||
|  | "Set area protection region, position 1, or position 2 by punching nodes, or " | ||||||
|  | "display the region" | ||||||
|  | msgstr "Установить зону защиты области, позицию 1 или 2 ударяя узлы, или отобразить " | ||||||
|  | "зону" | ||||||
|  |  | ||||||
|  | msgid "Select positions by punching two nodes." | ||||||
|  | msgstr "Выберите позиции ударив два узла." | ||||||
|  |  | ||||||
|  | msgid "Select position 1 by punching a node." | ||||||
|  | msgstr "Выберите позицию 1 ударив узел." | ||||||
|  |  | ||||||
|  | msgid "Select position 2 by punching a node." | ||||||
|  | msgstr "Выберите позицию 2 ударив узел." | ||||||
|  |  | ||||||
|  | msgid "<not set>" | ||||||
|  | msgstr "<не установлено>" | ||||||
|  |  | ||||||
|  | msgid "Unknown subcommand: " | ||||||
|  | msgstr "Неизвестная подкоманда: " | ||||||
|  |  | ||||||
|  | msgid "Position 1 set to " | ||||||
|  | msgstr "Позиция 1 установлена в " | ||||||
|  |  | ||||||
|  | msgid "Position 2 set to " | ||||||
|  | msgstr "Позиция 2 установлена в " | ||||||
|  |  | ||||||
|  | msgid "Invalid setting type!" | ||||||
|  | msgstr "Неверный тип установки!" | ||||||
|  |  | ||||||
							
								
								
									
										496
									
								
								locale/template.pot
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,496 @@ | |||||||
|  | # SOME DESCRIPTIVE TITLE. | ||||||
|  | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER | ||||||
|  | # This file is distributed under the same license as the PACKAGE package. | ||||||
|  | # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. | ||||||
|  | # | ||||||
|  | #, fuzzy | ||||||
|  | msgid "" | ||||||
|  | msgstr "" | ||||||
|  | "Project-Id-Version: PACKAGE VERSION\n" | ||||||
|  | "Report-Msgid-Bugs-To: \n" | ||||||
|  | "POT-Creation-Date: 2017-08-02 14:48+0200\n" | ||||||
|  | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||||
|  | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||||
|  | "Language-Team: LANGUAGE <LL@li.org>\n" | ||||||
|  | "Language: \n" | ||||||
|  | "MIME-Version: 1.0\n" | ||||||
|  | "Content-Type: text/plain; charset=CHARSET\n" | ||||||
|  | "Content-Transfer-Encoding: 8bit\n" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Protect your own area" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help protect." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You need to select an area first." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "/protect invoked, Owner =" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You can't protect that area: " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area protected. ID: " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "" | ||||||
|  | "Protect an area beetween two positions and give a player access to it " | ||||||
|  | "without setting the parent of the area to any existing area" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Incorrect usage, see /help set_owner." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "The player \"@1\" does not exist." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid " runs /set_owner. Owner = " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "" | ||||||
|  | "You have been granted control over area #@1. Type /list_areas to show your " | ||||||
|  | "areas." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "" | ||||||
|  | "Give a player access to a sub-area beetween two positions that have already " | ||||||
|  | "been protected, Use set_owner if you don't want the parent to be set." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Incorrect usage, see /help add_owner" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid " runs /add_owner. Owner = " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You can't protect that area." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Rename a area that you own" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help rename_area." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "That area doesn't exist." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You don't own that area." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area renamed." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Find areas using a Lua regular expression" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "A regular expression is required." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid regular expression." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "No matches found." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "List your areas, or all areas if you are an admin." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "No visible areas." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Recursively remove areas using an id" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help recursive_remove_areas" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area @1 does not exist or is not owned by you." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Removed area @1 and it's sub areas." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Remove an area using an id" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help remove_area" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Removed area @1" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Change the owner of an area using it's ID" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help change_owner." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "@1 has given you control over the area @2 (ID @3)." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Owner changed." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Toggle an area open (anyone can interact) or closed" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help area_open." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "closed" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "opened" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'opened' or 'closed' | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area @1." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Toggle an area open (anyone can interact farming) or closed" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help area_openfarming." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'opened' or 'closed' | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area @1 to farming." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Move (or resize) an area to the current positions." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help move_area." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area does not exist." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area successfully moved." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Get information about area configuration and usage." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "disabled" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "enabled" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'enabled' or 'disabled' | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Self protection is @1 " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "and you" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "but you don't" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #. Translators: @1 is one of the previous 'and you' or 'but you don't' | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid " @1 have the neccessary privilege (@2)." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You are an area administrator (\"areas\" privilege)." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "" | ||||||
|  | "You have extended area protection limits (\"areas_high_limit\" privilege)." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #. Translators: need to use NS gettext to be more precise | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You have @1 area@2" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid " and have no area protection limits." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid ", out of a maximum of @1." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "%s spanning up to %dx%dx%d." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "Players with the %q privilege can protect up to %d areas" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "You can protect areas" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Define special spawn for area" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help area_addspawn." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Error, Param id must be int." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Error, there is not such player" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Error, there is not pos." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Area @1 does not exist." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "spawn of area @1 defined." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Delete special spawn of area" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "Invalid usage, see /help area_delspawn." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: chatcommands.lua | ||||||
|  | msgid "spawn of area @1 deleted." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: hud.lua | ||||||
|  | msgid "No area(s)" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #. Translators: need to use NS gettext to be more precise | ||||||
|  | #: hud.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "" | ||||||
|  | "%s\n" | ||||||
|  | "Owner: %s\n" | ||||||
|  | "%u area" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: init.lua | ||||||
|  | msgid "Can administer areas." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: init.lua | ||||||
|  | msgid "Can can more, bigger areas." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: init.lua | ||||||
|  | msgid "Can protect areas." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: init.lua | ||||||
|  | msgid "[MOD]areas loaded in @1s." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: interact.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "%s is protected by %s." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: internal.lua | ||||||
|  | msgid "Self protection is disabled or you do not have the necessary privilege." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: internal.lua | ||||||
|  | msgid "Area is too big." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: internal.lua | ||||||
|  | msgid "" | ||||||
|  | "You have reached the maximum amount of areas that you are allowed to protect." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: internal.lua | ||||||
|  | #, lua-format | ||||||
|  | msgid "The area intersects with %s [%u] (%s)." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Loads, converts, and saves the areas from a legacy save file." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Converting areas..." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Error loading legacy file: " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Invalid version number. (0 allowed)" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Legacy file loaded." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "unnamed" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Table format updated." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: legacy.lua | ||||||
|  | msgid "Converted areas saved. Done." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Select a area by id." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Invalid usage, see /help select_area." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "The area @1 does not exist." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Area @1 selected." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "" | ||||||
|  | "Set area protection region position 1 to your location or the one specified" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Unable to get position." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Invalid usage, see /help area_pos1." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Area position 1 set to " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "" | ||||||
|  | "Set area protection region position 2 to your location or the one specified" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Invalid usage, see /help area_pos2." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Area position 2 set to " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "" | ||||||
|  | "Set area protection region, position 1, or position 2 by punching nodes, or " | ||||||
|  | "display the region" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Select positions by punching two nodes." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Select position 1 by punching a node." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Select position 2 by punching a node." | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "<not set>" | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Unknown subcommand: " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Position 1 set to " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: pos.lua | ||||||
|  | msgid "Position 2 set to " | ||||||
|  | msgstr "" | ||||||
|  |  | ||||||
|  | #: settings.lua | ||||||
|  | msgid "Invalid setting type!" | ||||||
|  | msgstr "" | ||||||
							
								
								
									
										53
									
								
								pos.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,10 +1,11 @@ | |||||||
|  |  | ||||||
| -- I could depend on WorldEdit for this, but you need to have the 'worldedit' | -- I could depend on WorldEdit for this, but you need to have the 'worldedit' | ||||||
| -- permission to use those commands and you don't have | -- permission to use those commands and you don't have | ||||||
| -- /area_pos{1,2} [X Y Z|X,Y,Z]. | -- /area_pos{1,2} [X Y Z|X,Y,Z]. | ||||||
| -- Since this is mostly copied from WorldEdit it is mostly | -- Since this is mostly copied from WorldEdit it is mostly | ||||||
| -- licensed under the AGPL. (select_area is a exception) | -- licensed under the AGPL. (select_area is a exception) | ||||||
|  |  | ||||||
|  | local S = areas.intllib | ||||||
|  |  | ||||||
| areas.marker1 = {} | areas.marker1 = {} | ||||||
| areas.marker2 = {} | areas.marker2 = {} | ||||||
| areas.set_pos = {} | areas.set_pos = {} | ||||||
| @@ -13,26 +14,26 @@ areas.pos2 = {} | |||||||
|  |  | ||||||
| minetest.register_chatcommand("select_area", { | minetest.register_chatcommand("select_area", { | ||||||
| 	params = "<ID>", | 	params = "<ID>", | ||||||
| 	description = "Select a area by id.", | 	description = S("Select a area by id."), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local id = tonumber(param) | 		local id = tonumber(param) | ||||||
| 		if not id then | 		if not id then | ||||||
| 			return false, "Invalid usage, see /help select_area." | 			return false, S("Invalid usage, see /help select_area.") | ||||||
| 		end | 		end | ||||||
| 		if not areas.areas[id] then | 		if not areas.areas[id] then | ||||||
| 			return false, "The area "..id.." does not exist." | 			return false, S("The area @1 does not exist.", id) | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		areas:setPos1(name, areas.areas[id].pos1) | 		areas:setPos1(name, areas.areas[id].pos1) | ||||||
| 		areas:setPos2(name, areas.areas[id].pos2) | 		areas:setPos2(name, areas.areas[id].pos2) | ||||||
| 		return true, "Area "..id.." selected." | 		return true, S("Area @1 selected.", id) | ||||||
| 	end, | 	end, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_chatcommand("area_pos1", { | minetest.register_chatcommand("area_pos1", { | ||||||
| 	params = "[X Y Z|X,Y,Z]", | 	params = "[X Y Z|X,Y,Z]", | ||||||
| 	description = "Set area protection region position 1 to your" | 	description = S("Set area protection region position 1 to your" | ||||||
| 		.." location or the one specified", | 		.." location or the one specified"), | ||||||
| 	privs = {}, | 	privs = {}, | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local pos = nil | 		local pos = nil | ||||||
| @@ -45,22 +46,22 @@ minetest.register_chatcommand("area_pos1", { | |||||||
| 			if player then | 			if player then | ||||||
| 				pos = player:getpos() | 				pos = player:getpos() | ||||||
| 			else | 			else | ||||||
| 				return false, "Unable to get position." | 				return false, S("Unable to get position.") | ||||||
| 			end | 			end | ||||||
| 		else | 		else | ||||||
| 			return false, "Invalid usage, see /help area_pos1." | 			return false, S("Invalid usage, see /help area_pos1.") | ||||||
| 		end | 		end | ||||||
| 		pos = vector.round(pos) | 		pos = vector.round(pos) | ||||||
| 		areas:setPos1(name, pos) | 		areas:setPos1(name, pos) | ||||||
| 		return true, "Area position 1 set to " | 		return true, S("Area position 1 set to ") | ||||||
| 				..minetest.pos_to_string(pos) | 				..minetest.pos_to_string(pos) | ||||||
| 	end, | 	end, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| minetest.register_chatcommand("area_pos2", { | minetest.register_chatcommand("area_pos2", { | ||||||
| 	params = "[X Y Z|X,Y,Z]", | 	params = "[X Y Z|X,Y,Z]", | ||||||
| 	description = "Set area protection region position 2 to your" | 	description = S("Set area protection region position 2 to your" | ||||||
| 		.." location or the one specified", | 		.." location or the one specified"), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		local pos = nil | 		local pos = nil | ||||||
| 		local found, _, x, y, z = param:find( | 		local found, _, x, y, z = param:find( | ||||||
| @@ -72,14 +73,14 @@ minetest.register_chatcommand("area_pos2", { | |||||||
| 			if player then | 			if player then | ||||||
| 				pos = player:getpos() | 				pos = player:getpos() | ||||||
| 			else | 			else | ||||||
| 				return false, "Unable to get position." | 				return false, S("Unable to get position.") | ||||||
| 			end | 			end | ||||||
| 		else | 		else | ||||||
| 			return false, "Invalid usage, see /help area_pos2." | 			return false, S("Invalid usage, see /help area_pos2.") | ||||||
| 		end | 		end | ||||||
| 		pos = vector.round(pos) | 		pos = vector.round(pos) | ||||||
| 		areas:setPos2(name, pos) | 		areas:setPos2(name, pos) | ||||||
| 		return true, "Area position 2 set to " | 		return true, S("Area position 2 set to ") | ||||||
| 				..minetest.pos_to_string(pos) | 				..minetest.pos_to_string(pos) | ||||||
| 	end, | 	end, | ||||||
| }) | }) | ||||||
| @@ -87,33 +88,33 @@ minetest.register_chatcommand("area_pos2", { | |||||||
|  |  | ||||||
| minetest.register_chatcommand("area_pos", { | minetest.register_chatcommand("area_pos", { | ||||||
| 	params = "set/set1/set2/get", | 	params = "set/set1/set2/get", | ||||||
| 	description = "Set area protection region, position 1, or position 2" | 	description = S("Set area protection region, position 1, or position 2" | ||||||
| 		.." by punching nodes, or display the region", | 		.." by punching nodes, or display the region"), | ||||||
| 	func = function(name, param) | 	func = function(name, param) | ||||||
| 		if param == "set" then -- Set both area positions | 		if param == "set" then -- Set both area positions | ||||||
| 			areas.set_pos[name] = "pos1" | 			areas.set_pos[name] = "pos1" | ||||||
| 			return true, "Select positions by punching two nodes." | 			return true, S("Select positions by punching two nodes.") | ||||||
| 		elseif param == "set1" then -- Set area position 1 | 		elseif param == "set1" then -- Set area position 1 | ||||||
| 			areas.set_pos[name] = "pos1only" | 			areas.set_pos[name] = "pos1only" | ||||||
| 			return true, "Select position 1 by punching a node." | 			return true, S("Select position 1 by punching a node.") | ||||||
| 		elseif param == "set2" then -- Set area position 2 | 		elseif param == "set2" then -- Set area position 2 | ||||||
| 			areas.set_pos[name] = "pos2" | 			areas.set_pos[name] = "pos2" | ||||||
| 			return true, "Select position 2 by punching a node." | 			return true, S("Select position 2 by punching a node.") | ||||||
| 		elseif param == "get" then -- Display current area positions | 		elseif param == "get" then -- Display current area positions | ||||||
| 			local pos1str, pos2str = "Position 1: ", "Position 2: " | 			local pos1str, pos2str = "Position 1: ", "Position 2: " | ||||||
| 			if areas.pos1[name] then | 			if areas.pos1[name] then | ||||||
| 				pos1str = pos1str..minetest.pos_to_string(areas.pos1[name]) | 				pos1str = pos1str..minetest.pos_to_string(areas.pos1[name]) | ||||||
| 			else | 			else | ||||||
| 				pos1str = pos1str.."<not set>" | 				pos1str = pos1str..S("<not set>") | ||||||
| 			end | 			end | ||||||
| 			if areas.pos2[name] then | 			if areas.pos2[name] then | ||||||
| 				pos2str = pos2str..minetest.pos_to_string(areas.pos2[name]) | 				pos2str = pos2str..minetest.pos_to_string(areas.pos2[name]) | ||||||
| 			else | 			else | ||||||
| 				pos2str = pos2str.."<not set>" | 				pos2str = pos2str..S("<not set>") | ||||||
| 			end | 			end | ||||||
| 			return true, pos1str.."\n"..pos2str | 			return true, pos1str.."\n"..pos2str | ||||||
| 		else | 		else | ||||||
| 			return false, "Unknown subcommand: "..param | 			return false, S("Unknown subcommand: ")..param | ||||||
| 		end | 		end | ||||||
| 	end, | 	end, | ||||||
| }) | }) | ||||||
| @@ -149,21 +150,21 @@ minetest.register_on_punchnode(function(pos, node, puncher) | |||||||
| 			areas.markPos1(name) | 			areas.markPos1(name) | ||||||
| 			areas.set_pos[name] = "pos2" | 			areas.set_pos[name] = "pos2" | ||||||
| 			minetest.chat_send_player(name, | 			minetest.chat_send_player(name, | ||||||
| 					"Position 1 set to " | 					S("Position 1 set to ") | ||||||
| 					..minetest.pos_to_string(pos)) | 					..minetest.pos_to_string(pos)) | ||||||
| 		elseif areas.set_pos[name] == "pos1only" then | 		elseif areas.set_pos[name] == "pos1only" then | ||||||
| 			areas.pos1[name] = pos | 			areas.pos1[name] = pos | ||||||
| 			areas.markPos1(name) | 			areas.markPos1(name) | ||||||
| 			areas.set_pos[name] = nil | 			areas.set_pos[name] = nil | ||||||
| 			minetest.chat_send_player(name, | 			minetest.chat_send_player(name, | ||||||
| 					"Position 1 set to " | 					S("Position 1 set to ") | ||||||
| 					..minetest.pos_to_string(pos)) | 					..minetest.pos_to_string(pos)) | ||||||
| 		elseif areas.set_pos[name] == "pos2" then | 		elseif areas.set_pos[name] == "pos2" then | ||||||
| 			areas.pos2[name] = pos | 			areas.pos2[name] = pos | ||||||
| 			areas.markPos2(name) | 			areas.markPos2(name) | ||||||
| 			areas.set_pos[name] = nil | 			areas.set_pos[name] = nil | ||||||
| 			minetest.chat_send_player(name, | 			minetest.chat_send_player(name, | ||||||
| 					"Position 2 set to " | 					S("Position 2 set to ") | ||||||
| 					..minetest.pos_to_string(pos)) | 					..minetest.pos_to_string(pos)) | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| local world_path = minetest.get_worldpath() | local world_path = minetest.get_worldpath() | ||||||
|  | local S = areas.intllib | ||||||
|  |  | ||||||
| areas.config = {} | areas.config = {} | ||||||
|  |  | ||||||
| @@ -14,7 +15,7 @@ local function setting(tp, name, default) | |||||||
| 	elseif tp == "number" then | 	elseif tp == "number" then | ||||||
| 		value = tonumber(minetest.settings:get(full_name)) | 		value = tonumber(minetest.settings:get(full_name)) | ||||||
| 	else | 	else | ||||||
| 		error("Invalid setting type!") | 		error(S("Invalid setting type!")) | ||||||
| 	end | 	end | ||||||
| 	if value == nil then | 	if value == nil then | ||||||
| 		value = default | 		value = default | ||||||
| @@ -30,7 +31,7 @@ setting("string", "filename", world_path.."/areas.dat") | |||||||
|  |  | ||||||
| -- Allow players with a privilege create their own areas | -- Allow players with a privilege create their own areas | ||||||
| -- within the maximum size and number. | -- within the maximum size and number. | ||||||
| setting("boolean",  "self_protection", false) | setting("boolean",  "self_protection", true) | ||||||
| setting("string",   "self_protection_privilege", "interact") | setting("string",   "self_protection_privilege", "interact") | ||||||
| setting("position", "self_protection_max_size",      {x=64,  y=128, z=64}) | setting("position", "self_protection_max_size",      {x=64,  y=128, z=64}) | ||||||
| setting("number",   "self_protection_max_areas",      4) | setting("number",   "self_protection_max_areas",      4) | ||||||
| @@ -40,4 +41,3 @@ setting("number",   "self_protection_max_areas_high", 32) | |||||||
|  |  | ||||||
| -- legacy_table (owner_defs) compatibility.  Untested and has known issues. | -- legacy_table (owner_defs) compatibility.  Untested and has known issues. | ||||||
| setting("boolean", "legacy_table", false) | setting("boolean", "legacy_table", false) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								textures/areas_0_0_0.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 275 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/areas_0_0_1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 440 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/areas_0_1_0.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 437 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/areas_0_1_1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 437 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/areas_1_0_0.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 341 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/areas_1_0_1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 491 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/areas_1_1_0.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 278 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/areas_1_1_1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 495 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/areas_not_area.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 288 B |