milan2018_v3.2
Milan2018 2 years ago
parent 29d57bc728
commit 84668505d4

File diff suppressed because it is too large Load Diff

3
crops/.gitignore vendored

@ -0,0 +1,3 @@
## Generic ignorable patterns and files
*~
debug.txt

@ -184,9 +184,8 @@ minetest.register_abm({
return
end
if minetest.registered_nodes[n.name] and
(minetest.registered_nodes[n.name].drawtype == "plantlike" or
minetest.registered_nodes[n.name].groups.flora == 1) or
if minetest.registered_nodes[n.name].drawtype == "plantlike" or
minetest.registered_nodes[n.name].groups.flora == 1 or
n.name == "air" then
minetest.set_node(t, {name = "crops:pumpkin", param2 = faces[r].m})

@ -55,6 +55,12 @@ Change log:
- 2.5 - Added HUD text to show when player is inside a protected area (updates every 5 seconds)
- 2.6 - Add protection against CSM tampering, updated Intllib support (thanks codexp), tweaked block textures
- 2.7 - Remove protection field entity when protector has been dug
- 2.8 - Added 'protector_show_interval' setting to minetest.conf [default is 5], make protection field glow in dark.
- 2.9 - Added MineClone2 recipes for protection block but no official support as yet
- 3.0 - Added PlayerFactions support, 'protector_hud_interval' setting and listing in advanced settings for mod values.
- 3.1 - Ability to hide protection blocks using /protector_hide and /protector_show , italian local added (thanks Hamlet)
- 3.2 - Defaults to Minetest translation if found, otherwise intllib fallback if loaded, locale files updated for both. Added 'protector_msg' setting for player text.
- 3.3 - Added support for playerfactions new api (thanks louisroyer), added limiter to protection radius of 22.
Lucky Blocks: 10
@ -91,6 +97,11 @@ reset name list
show protected areas of your nearby protectors (max of 5)
/protector_show_area
A players own protection blocks can be hidden and shown using the following:
/protector_hide
/protector_show
@ -114,6 +125,15 @@ protector_hurt = 2
protector_flip = true
- When true players who dig inside a protected area will flipped around to stop them using lag to grief into someone else's build
protector_show_interval
- Number of seconds the protection field is visible, defaults to 5 seconds.
protector_recipe = true
- When true allows players to craft protection blocks
protector_msg = true
- When true shows protection messages in players chat when trying to interact in someone else's area
Protector Tool

@ -29,7 +29,6 @@ minetest.register_chatcommand("protector_remove", {
end
removal_names = param
end,
})
@ -57,20 +56,19 @@ minetest.register_chatcommand("protector_replace", {
local names = replace_names:split(" ")
minetest.chat_send_player(name,
S("Replacing Protector name '@1' with '@2'",
S("Replacing Protector name @1 with @2",
names[1] or "", names[2] or ""))
return
end
replace_names = param
end,
})
minetest.register_abm({
nodenames = {"protector:protect", "protector:protect2"},
nodenames = {"protector:protect", "protector:protect2", "protector:protect_hidden"},
interval = 8,
chance = 1,
catch_up = false,
@ -106,7 +104,6 @@ minetest.register_abm({
meta:set_string("owner", names[2])
meta:set_string("infotext", S("Protection (owned by @1)", names[2]))
end
end
end
})
@ -115,7 +112,7 @@ minetest.register_abm({
local r = tonumber(minetest.settings:get("protector_radius")) or 5
-- show protection areas of nearby protectors owned by you (thanks agaran)
minetest.register_chatcommand("protector_show", {
minetest.register_chatcommand("protector_show_area", {
params = "",
description = S("Show protected areas of your nearby protectors"),
privs = {},
@ -128,7 +125,7 @@ minetest.register_chatcommand("protector_show", {
local pos = minetest.find_nodes_in_area(
{x = pos.x - r, y = pos.y - r, z = pos.z - r},
{x = pos.x + r, y = pos.y + r, z = pos.z + r},
{"protector:protect", "protector:protect2"})
{"protector:protect", "protector:protect2", "protector:protect_hidden"})
local meta, owner
@ -138,9 +135,105 @@ minetest.register_chatcommand("protector_show", {
meta = minetest.get_meta(pos[n])
owner = meta:get_string("owner") or ""
if owner == name then
if owner == name
or minetest.check_player_privs(name, {protection_bypass = true}) then
minetest.add_entity(pos[n], "protector:display")
end
end
end
})
-- ability to hide protection blocks (borrowed from doors mod :)
minetest.register_node("protector:protect_hidden", {
description = "Hidden Protector",
drawtype = "airlike",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
-- has to be walkable for falling nodes to stop falling
walkable = true,
pointable = false,
diggable = false,
buildable_to = false,
floodable = false,
drop = "",
groups = {not_in_creative_inventory = 1, unbreakable = 1},
on_blast = function() end,
-- 1px block inside door hinge near node top
collision_box = {
type = "fixed",
fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32},
},
})
minetest.register_chatcommand("protector_show", {
params = "",
description = S("Show your nearby protection blocks"),
privs = {interact = true},
func = function(name, param)
local player = minetest.get_player_by_name(name)
if not player then
return false, "Player not found"
end
local pos = player:get_pos()
local a = minetest.find_nodes_in_area(
{x = pos.x - r, y = pos.y - r, z = pos.z - r},
{x = pos.x + r, y = pos.y + r, z = pos.z + r},
{"protector:protect_hidden"})
local meta, owner
for _, row in pairs(a) do
meta = minetest.get_meta(row)
owner = meta:get_string("owner") or ""
if owner == name
or minetest.check_player_privs(name, {protection_bypass = true}) then
minetest.swap_node(row, {name = "protector:protect"})
end
end
end
})
minetest.register_chatcommand("protector_hide", {
params = "",
description = S("Hide your nearby protection blocks"),
privs = {interact = true},
func = function(name, param)
local player = minetest.get_player_by_name(name)
if not player then
return false, "Player not found"
end
local pos = player:get_pos()
local a = minetest.find_nodes_in_area(
{x = pos.x - r, y = pos.y - r, z = pos.z - r},
{x = pos.x + r, y = pos.y + r, z = pos.z + r},
{"protector:protect", "protector:protect2"})
local meta, owner
for _, row in pairs(a) do
meta = minetest.get_meta(row)
owner = meta:get_string("owner") or ""
if owner == name
or minetest.check_player_privs(name, {protection_bypass = true}) then
minetest.swap_node(row, {name = "protector:protect_hidden"})
end
end
end
})

@ -1,4 +1,5 @@
default
default?
intllib?
lucky_block?
mesecons_mvps?
playerfactions?

@ -6,6 +6,9 @@
local S = protector.intllib
local F = minetest.formspec_escape
-- MineClone2 support
local mcl = not minetest.registered_items["default:steel_ingot"]
-- Registers a door
function register_door(name, def)
def.groups.not_in_creative_inventory = 1
@ -74,7 +77,7 @@ function register_door(name, def)
minetest.get_meta(pt2):set_int("right", 1)
end
if not minetest.setting_getbool("creative_mode") then
if not minetest.settings:get_bool("creative_mode") then
itemstack:take_item()
end
return itemstack
@ -147,6 +150,7 @@ function register_door(name, def)
tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"},
paramtype = "light",
paramtype2 = "facedir",
use_texture_alpha = "clip",
is_ground_content = false,
drop = name,
drawtype = "nodebox",
@ -184,6 +188,7 @@ function register_door(name, def)
tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"},
paramtype = "light",
paramtype2 = "facedir",
use_texture_alpha = "clip",
is_ground_content = false,
drop = "",
drawtype = "nodebox",
@ -221,6 +226,7 @@ function register_door(name, def)
tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]},
paramtype = "light",
paramtype2 = "facedir",
use_texture_alpha = "clip",
is_ground_content = false,
drop = name,
drawtype = "nodebox",
@ -258,6 +264,7 @@ function register_door(name, def)
tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]},
paramtype = "light",
paramtype2 = "facedir",
use_texture_alpha = "clip",
is_ground_content = false,
drop = "",
drawtype = "nodebox",
@ -310,6 +317,14 @@ register_door(name, {
sunlight = false,
})
if mcl then
minetest.register_craft({
output = name,
recipe = {
{"mcl_doors:wooden_door", "mcl_core:gold_ingot"}
}
})
else
minetest.register_craft({
output = name,
recipe = {
@ -325,6 +340,7 @@ minetest.register_craft({
{"doors:door_wood", "default:copper_ingot"}
}
})
end
-- Protected Steel Door
@ -343,6 +359,14 @@ register_door(name, {
sunlight = false,
})
if mcl then
minetest.register_craft({
output = name,
recipe = {
{"mcl_doors:iron_door", "mcl_core:gold_ingot"}
}
})
else
minetest.register_craft({
output = name,
recipe = {
@ -358,6 +382,7 @@ minetest.register_craft({
{"doors:door_steel", "default:copper_ingot"}
}
})
end
----trapdoor----
@ -383,6 +408,7 @@ function register_trapdoor(name, def)
def.drawtype = "nodebox"
def.paramtype = "light"
def.paramtype2 = "facedir"
def.use_texture_alpha = "clip"
def.is_ground_content = false
local def_opened = table.copy(def)
@ -408,8 +434,8 @@ function register_trapdoor(name, def)
fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5}
}
def_opened.tiles = { def.tile_side, def.tile_side,
def.tile_side .. '^[transform3',
def.tile_side .. '^[transform1',
def.tile_side .. "^[transform3",
def.tile_side .. "^[transform1",
def.tile_front, def.tile_front }
def_opened.drop = name_closed
@ -434,12 +460,19 @@ register_trapdoor("protector:trapdoor", {
sounds = default.node_sound_wood_defaults(),
})
if mcl then
minetest.register_craft({
output = "protector:trapdoor",
recipe = {
{"mcl_doors:trapdoor", "mcl_core:gold_ingot"}
}
})
else
minetest.register_craft({
output = 'protector:trapdoor 2',
output = "protector:trapdoor 2",
recipe = {
{'group:wood', 'default:copper_ingot', 'group:wood'},
{'group:wood', 'group:wood', 'group:wood'},
{'', '', ''},
{"group:wood", "default:copper_ingot", "group:wood"},
{"group:wood", "group:wood", "group:wood"},
}
})
@ -449,6 +482,7 @@ minetest.register_craft({
{"doors:trapdoor", "default:copper_ingot"}
}
})
end
-- Protected Steel Trapdoor
@ -465,11 +499,19 @@ register_trapdoor("protector:trapdoor_steel", {
sounds = default.node_sound_wood_defaults(),
})
if mcl then
minetest.register_craft({
output = "protector:trapdoor_steel",
recipe = {
{"mcl_doors:iron_trapdoor", "mcl_core:gold_ingot"}
}
})
else
minetest.register_craft({
output = 'protector:trapdoor_steel',
output = "protector:trapdoor_steel",
recipe = {
{'default:copper_ingot', 'default:steel_ingot'},
{'default:steel_ingot', 'default:steel_ingot'},
{"default:copper_ingot", "default:steel_ingot"},
{"default:steel_ingot", "default:steel_ingot"},
}
})
@ -479,6 +521,7 @@ minetest.register_craft({
{"doors:trapdoor_steel", "default:copper_ingot"}
}
})
end
-- Protected Chest
@ -501,7 +544,7 @@ minetest.register_node("protector:chest", {
local inv = meta:get_inventory()
meta:set_string("infotext", S("Protected Chest"))
meta:set_string("name", "")
meta:set_string("name", S("Protected Chest"))
inv:set_size("main", 8 * 4)
end,
@ -520,20 +563,24 @@ minetest.register_node("protector:chest", {
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", S("@1 moves stuff to protected chest at @2",
player:get_player_name(), minetest.pos_to_string(pos)))
minetest.log("action", player:get_player_name() ..
" moves stuff to protected chest at " ..
minetest.pos_to_string(pos))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", S("@1 takes stuff from protected chest at @2",
player:get_player_name(), minetest.pos_to_string(pos)))
minetest.log("action", player:get_player_name() ..
" takes stuff from protected chest at " ..
minetest.pos_to_string(pos))
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
on_metadata_inventory_move = function(
pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", S("@1 moves stuff inside protected chest at @2",
player:get_player_name(), minetest.pos_to_string(pos)))
minetest.log("action", player:get_player_name() ..
" moves stuff inside protected chest at " ..
minetest.pos_to_string(pos))
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
@ -554,7 +601,8 @@ minetest.register_node("protector:chest", {
return stack:get_count()
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
allow_metadata_inventory_move = function(
pos, from_list, from_index, to_list, to_index, count, player)
if minetest.is_protected(pos, player:get_player_name()) then
return 0
@ -577,9 +625,9 @@ minetest.register_node("protector:chest", {
local spos = pos.x .. "," .. pos.y .. "," ..pos.z
local formspec = "size[8,9]"
.. default.gui_bg
.. default.gui_bg_img
.. default.gui_slots
-- .. default.gui_bg
-- .. default.gui_bg_img
-- .. default.gui_slots
.. "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]"
.. "button[0,4.5;2,0.25;toup;" .. F(S("To Chest")) .. "]"
.. "field[2.3,4.8;4,0.25;chestname;;"
@ -599,15 +647,39 @@ minetest.register_node("protector:chest", {
on_blast = function() end,
})
-- Container transfer helper
local to_from = function(src, dst)
local stack, item, leftover
local size = dst:get_size("main")
for i = 1, size do
stack = src:get_stack("main", i)
item = stack:get_name()
if item ~= "" and dst:room_for_item("main", item) then
leftover = dst:add_item("main", stack)
if leftover and not leftover:is_empty() then
src:set_stack("main", i, leftover)
else
src:set_stack("main", i, nil)
end
end
end
end
-- Protected Chest formspec buttons
minetest.register_on_player_receive_fields(function(player, formname, fields)
if string.sub(formname, 0, string.len("protector:chest_")) ~= "protector:chest_" then
if string.sub(formname, 0, 16) ~= "protector:chest_" then
return
end
local pos_s = string.sub(formname,string.len("protector:chest_") + 1)
local pos_s = string.sub(formname, 17)
local pos = minetest.string_to_pos(pos_s)
if minetest.is_protected(pos, player:get_player_name()) then
@ -617,43 +689,16 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local meta = minetest.get_meta(pos) ; if not meta then return end
local chest_inv = meta:get_inventory() ; if not chest_inv then return end
local player_inv = player:get_inventory()
local leftover
-- copy contents of player inventory to chest
if fields.toup then
-- copy contents of players inventory to chest
for i, v in ipairs(player_inv:get_list("main") or {}) do
if chest_inv:room_for_item("main", v) then
leftover = chest_inv:add_item("main", v)
player_inv:remove_item("main", v)
if leftover
and not leftover:is_empty() then
player_inv:add_item("main", v)
end
end
end
to_from(player_inv, chest_inv)
-- copy contents of chest to player inventory
elseif fields.todn then
-- copy contents of chest to players inventory
for i, v in ipairs(chest_inv:get_list("main") or {}) do
if player_inv:room_for_item("main", v) then
leftover = player_inv:add_item("main", v)
chest_inv:remove_item("main", v)
if leftover
and not leftover:is_empty() then
chest_inv:add_item("main", v)
end
end
end
to_from(chest_inv, player_inv)
elseif fields.chestname then
@ -661,9 +706,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.chestname ~= "" then
meta:set_string("name", fields.chestname)
meta:set_string("infotext",
S("Protected Chest (@1)", fields.chestname))
meta:set_string("infotext", fields.chestname)
else
meta:set_string("name", S("Protected Chest"))
meta:set_string("infotext", S("Protected Chest"))
end
@ -672,18 +717,27 @@ end)
-- Protected Chest recipes
if mcl then
minetest.register_craft({
output = 'protector:chest',
output = "protector:chest",
recipe = {
{'group:wood', 'group:wood', 'group:wood'},
{'group:wood', 'default:copper_ingot', 'group:wood'},
{'group:wood', 'group:wood', 'group:wood'},
{"mcl_chests:chest", "mcl_core:gold_ingot"},
}
})
else
minetest.register_craft({
output = "protector:chest",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"group:wood", "default:copper_ingot", "group:wood"},
{"group:wood", "group:wood", "group:wood"},
}
})
minetest.register_craft({
output = 'protector:chest',
output = "protector:chest",
recipe = {
{'default:chest', 'default:copper_ingot', ''},
{"default:chest", "default:copper_ingot"},
}
})
end

@ -1,14 +1,20 @@
local S = protector.intllib
local radius = (tonumber(minetest.setting_get("protector_radius")) or 5)
local radius = (tonumber(minetest.settings:get("protector_radius")) or 5)
-- radius limiter (minetest cannot handle node volume of more than 4096000)
if radius > 22 then radius = 22 end
local hud = {}
local hud_timer = 0
local hud_interval = (tonumber(minetest.settings:get("protector_hud_interval")) or 5)
if hud_interval > 0 then
minetest.register_globalstep(function(dtime)
-- every 5 seconds
hud_timer = hud_timer + dtime
if hud_timer < 5 then
if hud_timer < hud_interval then
return
end
hud_timer = 0
@ -22,7 +28,7 @@ minetest.register_globalstep(function(dtime)
local protectors = minetest.find_nodes_in_area(
{x = pos.x - radius , y = pos.y - radius , z = pos.z - radius},
{x = pos.x + radius , y = pos.y + radius , z = pos.z + radius},
{"protector:protect","protector:protect2"})
{"protector:protect","protector:protect2", "protector:protect_hidden"})
if #protectors > 0 then
local npos = protectors[1]
@ -40,17 +46,15 @@ minetest.register_globalstep(function(dtime)
hud_elem_type = "text",
name = "Protector Area",
number = 0xFFFF22,
position = {x=0, y=0.95},
offset = {x=8, y=-8},
position = {x = 0, y = 0.95},
offset = {x = 8, y = -8},
text = hud_text,
scale = {x=200, y=60},
alignment = {x=1, y=-1},
scale = {x = 200, y = 60},
alignment = {x = 1, y = -1},
})
return
else
player:hud_change(hud[name].id, "text", hud_text)
end
end
@ -59,3 +63,5 @@ end)
minetest.register_on_leaveplayer(function(player)
hud[player:get_player_name()] = nil
end)
end

@ -1,14 +1,27 @@
-- default support (for use with MineClone2 and other [games]
default = default or {
node_sound_stone_defaults = function(table) end,
node_sound_wood_defaults = function(table) end,
gui_bg = "",
gui_bg_img = "",
gui_slots = "",
}
-- Load support for intllib.
local MP = minetest.get_modpath(minetest.get_current_modname())
local S = dofile(MP .. "/intllib.lua")
local F = minetest.formspec_escape
local S = minetest.get_translator and minetest.get_translator("protector") or
dofile(MP .. "/intllib.lua")
-- Load support for factions
local factions_available = minetest.global_exists("factions")
protector = {}
protector.mod = "redo"
protector.modpath = MP
protector.intllib = S
protector = {
mod = "redo",
modpath = MP,
intllib = S
}
local protector_max_share_count = 12
-- get minetest.conf settings
@ -17,6 +30,13 @@ local protector_flip = minetest.settings:get_bool("protector_flip") or false
local protector_hurt = tonumber(minetest.settings:get("protector_hurt")) or 0
local protector_spawn = tonumber(minetest.settings:get("protector_spawn")
or minetest.settings:get("protector_pvp_spawn")) or 0
local protector_show = tonumber(minetest.settings:get("protector_show_interval")) or 5
local protector_recipe = minetest.settings:get_bool("protector_recipe") ~= false
local protector_msg = minetest.settings:get_bool("protector_msg") ~= false
-- radius limiter (minetest cannot handle node volume of more than 4096000)
if protector_radius > 22 then protector_radius = 22 end
-- get static spawn position
local statspawn = minetest.string_to_pos(minetest.settings:get("static_spawnpoint"))
@ -45,7 +65,35 @@ end
-- check for member name
local is_member = function (meta, name)
local is_member = function(meta, name)
if factions_available
and meta:get_int("faction_members") == 1 then
if factions.version == nil then
-- backward compatibility
if factions.get_player_faction(name) ~= nil
and factions.get_player_faction(meta:get_string("owner")) ==
factions.get_player_faction(name) then
return true
end
else
-- is member if player and owner share at least one faction
local owner_factions = factions.get_player_factions(name)
local owner = meta:get_string("owner")
if owner_factions ~= nil and owner_factions ~= false then
for _, f in ipairs(owner_factions) do
if factions.player_is_in_faction(f, owner) then
return true
end
end
end
end
end
for _, n in pairs(get_member_list(meta)) do
@ -117,6 +165,36 @@ local protector_formspec = function(meta)
local members = get_member_list(meta)
local npp = protector_max_share_count -- max users added to protector list
local i = 0
local checkbox_faction = false
-- Display the checkbox only if the owner is member of at least 1 faction
if factions_available then
if factions.version == nil then
-- backward compatibility
if factions.get_player_faction(meta:get_string("owner")) then
checkbox_faction = true
end
else
local player_factions = factions.get_player_factions(meta:get_string("owner"))
if player_factions ~= nil and #player_factions >= 1 then
checkbox_faction = true
end
end
end
if checkbox_faction then
formspec = formspec .. "checkbox[0,5;faction_members;"
.. F(S("Allow faction access"))
.. ";" .. (meta:get_int("faction_members") == 1 and
"true" or "false") .. "]"
if npp > 8 then
npp = 8
end
end
for n = 1, #members do
@ -174,6 +252,18 @@ local inside_spawn = function(pos, radius)
end
-- show protection message if enabled
local show_msg = function(player, msg)
-- if messages disabled or no player name provided
if protector_msg == false or not player or player == "" then
return
end
minetest.chat_send_player(player, msg)
end
-- Infolevel:
-- 0 for no info
-- 1 for "This area is owned by <owner> !" if you can't dig
@ -198,7 +288,7 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel)
-- is spawn area protected ?
if inside_spawn(pos, protector_spawn) then
minetest.chat_send_player(digger,
show_msg(digger,
S("Spawn @1 has been protected up to a @2 block radius.",
minetest.pos_to_string(statspawn), protector_spawn))
@ -209,7 +299,7 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel)
local pos = minetest.find_nodes_in_area(
{x = pos.x - r, y = pos.y - r, z = pos.z - r},
{x = pos.x + r, y = pos.y + r, z = pos.z + r},
{"protector:protect", "protector:protect2"})
{"protector:protect", "protector:protect2", "protector:protect_hidden"})
local meta, owner, members
@ -225,7 +315,7 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel)
-- and you aren't on the member list
if onlyowner or not is_member(meta, digger) then
minetest.chat_send_player(digger,
show_msg(digger,
S("This area is owned by @1", owner) .. "!")
return false
@ -282,7 +372,11 @@ function minetest.is_protected(pos, digger)
-- hurt player if protection violated
if protector_hurt > 0 and player:get_hp() > 0 then
player:set_hp(player:get_hp() - protector_hurt)
-- This delay fixes item duplication bug (thanks luk3yx)
minetest.after(0.1, function()
player:set_hp(player:get_hp() - protector_hurt)
end)
end
-- flip player when protection violated
@ -356,6 +450,20 @@ local check_overlap = function(itemstack, placer, pointed_thing)
end
-- remove protector display entities
local del_display = function(pos)
local objects = minetest.get_objects_inside_radius(pos, 0.5)
for _, v in ipairs(objects) do
if v and v:get_luaentity()
and v:get_luaentity().name == "protector:display" then
v:remove()
end
end
end
-- temporary pos store
local player_pos = {}
@ -388,8 +496,9 @@ minetest.register_node("protector:protect", {
local meta = minetest.get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", S("Protection (owned by @1)", meta:get_string("owner")))
meta:set_string("members", "")
meta:set_string("infotext",
S("Protection (owned by @1)", meta:get_string("owner")))
end,
on_use = function(itemstack, user, pointed_thing)
@ -398,7 +507,8 @@ minetest.register_node("protector:protect", {
return
end
protector.can_dig(protector_radius, pointed_thing.under, user:get_player_name(), false, 2)
protector.can_dig(protector_radius, pointed_thing.under,
user:get_player_name(), false, 2)
end,
on_rightclick = function(pos, node, clicker, itemstack)
@ -431,23 +541,34 @@ minetest.register_node("protector:protect", {
on_blast = function() end,
after_destruct = function(pos, oldnode)
local objects = minetest.get_objects_inside_radius(pos, 0.5)
for _, v in ipairs(objects) do
v:remove()
end
end,
})
minetest.register_craft({
output = "protector:protect",
recipe = {
{"default:stone", "default:stone", "default:stone"},
{"default:stone", "default:gold_ingot", "default:stone"},
{"default:stone", "default:stone", "default:stone"},
}
after_destruct = del_display
})
-- default recipe and alternative for MineClone2
if protector_recipe then
if minetest.registered_items["default:stone"] then
minetest.register_craft({
output = "protector:protect",
recipe = {
{"default:stone", "default:stone", "default:stone"},
{"default:stone", "default:gold_ingot", "default:stone"},
{"default:stone", "default:stone", "default:stone"},
}
})
else
minetest.register_craft({
output = "protector:protect",
recipe = {
{"mcl_core:stone", "mcl_core:stone", "mcl_core:stone"},
{"mcl_core:stone", "mcl_core:gold_ingot", "mcl_core:stone"},
{"mcl_core:stone", "mcl_core:stone", "mcl_core:stone"},
}
})
end
end
-- protection logo
minetest.register_node("protector:protect2", {
@ -457,6 +578,7 @@ minetest.register_node("protector:protect2", {
inventory_image = "protector_logo.png",
sounds = default.node_sound_stone_defaults(),
groups = {dig_immediate = 2, unbreakable = 1},
use_texture_alpha = "clip",
paramtype = "light",
paramtype2 = "wallmounted",
legacy_wallmounted = true,
@ -479,8 +601,9 @@ minetest.register_node("protector:protect2", {
local meta = minetest.get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", S("Protection (owned by @1)", meta:get_string("owner")))
meta:set_string("members", "")
meta:set_string("infotext",
S("Protection (owned by @1)", meta:get_string("owner")))
end,
on_use = function(itemstack, user, pointed_thing)
@ -489,7 +612,8 @@ minetest.register_node("protector:protect2", {
return
end
protector.can_dig(protector_radius, pointed_thing.under, user:get_player_name(), false, 2)
protector.can_dig(protector_radius, pointed_thing.under,
user:get_player_name(), false, 2)
end,
on_rightclick = function(pos, node, clicker, itemstack)
@ -522,12 +646,7 @@ minetest.register_node("protector:protect2", {
on_blast = function() end,
after_destruct = function(pos, oldnode)
local objects = minetest.get_objects_inside_radius(pos, 0.5)
for _, v in ipairs(objects) do
v:remove()
end
end,
after_destruct = del_display
})
-- recipes to switch between protectors
@ -587,6 +706,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return
end
-- add faction members
if factions_available then
meta:set_int("faction_members", fields.faction_members == "true" and 1 or 0)
end
-- add member [+]
if add_member_input then
@ -616,16 +740,17 @@ minetest.register_entity("protector:display", {
collisionbox = {0, 0, 0, 0, 0, 0},
visual = "wielditem",
-- wielditem seems to be scaled to 1.5 times original node size
visual_size = {x = 1.0 / 1.5, y = 1.0 / 1.5},
visual_size = {x = 0.67, y = 0.67},
textures = {"protector:display_node"},
timer = 0,
glow = 10,
on_step = function(self, dtime)
self.timer = self.timer + dtime
-- remove after 5 seconds
if self.timer > 5 then
-- remove after set number of seconds
if self.timer > protector_show then
self.object:remove()
end
end,
@ -638,7 +763,7 @@ minetest.register_entity("protector:display", {
local x = protector_radius
minetest.register_node("protector:display_node", {
tiles = {"protector_display.png"},
use_texture_alpha = true,
use_texture_alpha = "clip", -- true,
walkable = false,
drawtype = "nodebox",
node_box = {

@ -19,10 +19,8 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
#: admin.lua
#, fuzzy
msgid "Remove Protectors around players (separate names with spaces)"
msgstr ""
"Entferne Störschützer von bestimmten Namen in der Nähe von Spielern (trenne "
msgstr "Entferne Störschützer von bestimmten Namen in der Nähe von Spielern (trenne "
"Namen durch Leerzeichen)"
#: admin.lua
@ -73,18 +71,6 @@ msgstr "Geschützte Stahlfalltür"
msgid "Protected Chest"
msgstr "Geschützte Truhe"
#: doors_chest.lua
msgid "@1 moves stuff to protected chest at @2"
msgstr "@1 verlagert Dinge in geschützte Truhe bei @2"
#: doors_chest.lua
msgid "@1 takes stuff from protected chest at @2"
msgstr "@1 nimmt Dinge aus geschützter Truhe bei @2"
#: doors_chest.lua
msgid "@1 moves stuff inside protected chest at @2"
msgstr "@1 verschiebt Dinge innerhalb der geschützten Truhe bei @2"
#: doors_chest.lua
msgid "To Chest"
msgstr "Zur Truhe"

@ -0,0 +1,177 @@
# Spanish translation for PROTECTOR MOD.
# Copyright (C) 2018 universales
# This file is distributed under the same license as the PROTECTOR MOD package.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROTECTOR MOD\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-10 17:33+0200\n"
"PO-Revision-Date: 2020-02-27\n"
"Last-Translator: Universales\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: admin.lua
msgid "Remove Protectors around players (separate names with spaces)"
msgstr "Eliminar protectores alrededor de los jugadores (nombres separados con espacios)"
#: admin.lua
msgid "<names list>"
msgstr "<Lista de nombres>"
#: admin.lua
msgid "Replace Protector Owner with name provided"
msgstr "Reemplace el propietario del protector con el nombre proporcionado"
#: admin.lua
msgid "<owner name> <name to replace with>"
msgstr "<Nombre del propietario> <Nombre del nuevo propietario>"
#: admin.lua
msgid "Replacing Protector name '@1' with '@2'"
msgstr "Reemplazando el nombre del protector '@1' a '@2'"
#: admin.lua
msgid "Show protected areas of your nearby protectors"
msgstr "Mostrar áreas protegidas de sus protectores cercanos"
#: admin.lua
msgid "Protector Names to remove: @1"
msgstr "Nombres de protectores para eliminar: @1"
#: admin.lua
msgid "Name List Reset"
msgstr "Restablecer lista de nombres"
#: doors_chest.lua
msgid "Protected Wooden Door"
msgstr "Puerta de madera protegida"
#: doors_chest.lua
msgid "Protected Steel Door"
msgstr "Puerta de hierro protegida"
#: doors_chest.lua
msgid "Protected Trapdoor"
msgstr "Trampilla Protegida"
#: doors_chest.lua
msgid "Protected Steel Trapdoor"
msgstr "Trampilla de hierro protegida"
#: doors_chest.lua
msgid "Protected Chest"
msgstr "Cofre protegido"
#: doors_chest.lua
msgid "To Chest"
msgstr "Al cofre"
#: doors_chest.lua
msgid "To Inventory"
msgstr "Al inventario"
#: doors_chest.lua
msgid "Protected Chest (@1)"
msgstr "Cofre protegido (@1)"
#: init.lua
msgid "-- Protector interface --"
msgstr "-- Interfaz del protector --"
#: init.lua
msgid "PUNCH node to show protected area"
msgstr "nodo de perforación para mostrar el área protegida"
#: init.lua
msgid "USE for area check"
msgstr "Usar para chequeo del área"
#: init.lua
msgid "Members:"
msgstr "Miembros:"
#: init.lua
msgid "Close"
msgstr "Cerrar"
#: init.lua
msgid "Protection located at: @1"
msgstr "Protección ubicada en: @1"
#: init.lua
msgid "Members: @1."
msgstr "Miembros: @1."
#: init.lua
msgid "This area is not protected."
msgstr "Esta área no está protegida."
#: init.lua
msgid "You can build here."
msgstr "Puedes construir aquí."
#: init.lua tool.lua
msgid "Overlaps into above players protected area"
msgstr "Se superpone en el área protegida de los jugadores anteriores"
#: init.lua
msgid "Protection Block"
msgstr "Bloque de protección"
#: admin.lua init.lua tool.lua
msgid "Protection (owned by @1)"
msgstr "Protegido (Propiedad de @1)"
#: init.lua
msgid "Protection Logo"
msgstr "Logotipo de la protección"
#: init.lua
msgid "[MOD] Protector Redo loaded"
msgstr "[MOD] Protector recargado"
#: init.lua
msgid "Spawn @1 has been protected up to a @2 block radius."
msgstr "Spawn @1 ha sido protegido hasta un radio de bloque @2."
#: init.lua
msgid "This area is owned by @1"
msgstr "Esta área es propiedad de @1"
#: pvp.lua
msgid "[Protector] on_punchplayer called with nil objects"
msgstr "[Protector] on_punchplayer llamado con objetos nulos."
#: pvp.lua
msgid "[Protector] pvp_protect not active, update your version of Minetest"
msgstr "[Protector] pvp_protect no está activo, actualiza tu versión de Minetest"
#: pvp.lua
msgid "[Protector] pvp_protect is disabled"
msgstr "[Protector] pvp_protect está deshabilitado"
#: hud.lua
msgid "Owner: @1"
msgstr "Propietario: @1"
#: tool.lua
msgid "Protector Placer Tool (stand near protector, face direction and use)"
msgstr ""
"Herramienta de colocación del protector (pararse cerca del protector, dirección de la cara y uso) "
#: tool.lua
msgid "Protector already in place!"
msgstr "¡El protector ya está en este lugar!"
#: tool.lua
msgid "No protectors available to place!"
msgstr "¡No hay protectores disponibles para colocar!"
#: tool.lua
msgid "Protector placed at @1"
msgstr "Protector colocado en @1"

@ -19,10 +19,8 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
#: admin.lua
#, fuzzy
msgid "Remove Protectors around players (separate names with spaces)"
msgstr ""
"Retirer les protecteurs près des joueurs avec les noms fournis (noms séparés "
msgstr "Retirer les protecteurs près des joueurs avec les noms fournis (noms séparés "
"avec des espaces)"
#: admin.lua
@ -73,19 +71,6 @@ msgstr "Trap en acier protégé"
msgid "Protected Chest"
msgstr "Coffre protégé"
#: doors_chest.lua
msgid "@1 moves stuff to protected chest at @2"
msgstr "@1 déplace des objets vers le coffre protégée à @2"
#: doors_chest.lua
msgid "@1 takes stuff from protected chest at @2"
msgstr "@1 prend des objets du coffre protégée à @2"
#: doors_chest.lua
#, fuzzy
msgid "@1 moves stuff inside protected chest at @2"
msgstr "@1 déplace des objets à l'intérieur de du coffre protégé à @2"
#: doors_chest.lua
msgid "To Chest"
msgstr "Vers le coffre"

@ -0,0 +1,180 @@
# Italian translation for PROTECTOR MOD.
# Copyright (C) 2020 Hamlet
# This file is distributed under the same license as the PROTECTOR MOD package.
# Xanthin <xanthin@wiuwiu.de>, 2016.
# CodeXP <codexp@gmx.net>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: PROTECTOR MOD\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-10 17:33+0200\n"
"PO-Revision-Date: \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.2.1\n"
"Last-Translator: Hamlet <hamlatgitlab@riseup.net>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: it\n"
#: admin.lua
msgid "Remove Protectors around players (separate names with spaces)"
msgstr "Elimina i protettori attorno ai giocatori (separa i nomi con gli spazi)"
#: admin.lua
msgid "<names list>"
msgstr "<elenco nomi>"
#: admin.lua
msgid "Replace Protector Owner with name provided"
msgstr "Sostituisci il proprietario del protettore col nome fornito"
#: admin.lua
msgid "<owner name> <name to replace with>"
msgstr "<nome proprietario> <nome con cui sostituirlo>"
#: admin.lua
msgid "Replacing Protector name '@1' with '@2'"
msgstr "Sostituzione del nome del protettore '@1' con '@2'"
#: admin.lua
msgid "Show protected areas of your nearby protectors"
msgstr "Mostra le aree protette dei protettori vicino a te"
#: admin.lua
msgid "Protector Names to remove: @1"
msgstr "Nomi dei protettori da eliminare: @1"
#: admin.lua
msgid "Name List Reset"
msgstr "Azzera l'elenco dei nomi"
#: doors_chest.lua
msgid "Protected Wooden Door"
msgstr "Porta di legno protetta"
#: doors_chest.lua
msgid "Protected Steel Door"
msgstr "Porta d'acciaio protetta"
#: doors_chest.lua
msgid "Protected Trapdoor"
msgstr "Botola protetta"
#: doors_chest.lua
msgid "Protected Steel Trapdoor"
msgstr "Botola d'acciaio protetta"
#: doors_chest.lua
msgid "Protected Chest"
msgstr "Baule protetto"
#: doors_chest.lua
msgid "To Chest"
msgstr "Al baule"
#: doors_chest.lua
msgid "To Inventory"
msgstr "All'inventario"
#: doors_chest.lua
msgid "Protected Chest (@1)"
msgstr "Baule protetto (@1)"
#: init.lua
msgid "-- Protector interface --"
msgstr "-- Interfaccia protettore --"
#: init.lua
msgid "PUNCH node to show protected area"
msgstr "COLPISCI il nodo per mostrare l'area protetta"
#: init.lua
msgid "USE for area check"
msgstr "USA per controllare l'area"
#: init.lua
msgid "Members:"
msgstr "Membri:"
#: init.lua
msgid "Close"
msgstr "Chiudi"
#: init.lua
msgid "Protection located at: @1"
msgstr "Protezione collocata a: @1"
#: init.lua
msgid "Members: @1."
msgstr "Membri: @1."
#: init.lua
msgid "This area is not protected."
msgstr "Quest'area non è protetta."
#: init.lua
msgid "You can build here."
msgstr "Qui puoi costruire."
#: init.lua tool.lua
msgid "Overlaps into above players protected area"
msgstr "Si sovrappone ad un'area sovrastante protetta dai giocatori"
#: init.lua
msgid "Protection Block"
msgstr "Blocco di protezione"
#: admin.lua init.lua tool.lua
msgid "Protection (owned by @1)"