247 lines
5.6 KiB
Lua
247 lines
5.6 KiB
Lua
|
|
-- translation and default name vars
|
|
|
|
local S = minetest.get_translator("protector")
|
|
local removal_names = ""
|
|
local replace_names = ""
|
|
|
|
-- remove protection command
|
|
|
|
minetest.register_chatcommand("protector_remove", {
|
|
params = S("<names list>"),
|
|
description = S("Remove Protectors around players (separate names with spaces)"),
|
|
privs = {server = true},
|
|
|
|
func = function(name, param)
|
|
|
|
if not param or param == "" then
|
|
|
|
minetest.chat_send_player(name,
|
|
S("Protector Names to remove: @1", removal_names))
|
|
|
|
return
|
|
end
|
|
|
|
if param == "-" then
|
|
|
|
minetest.chat_send_player(name, S("Name List Reset"))
|
|
|
|
removal_names = ""
|
|
|
|
return
|
|
end
|
|
|
|
removal_names = param
|
|
end
|
|
})
|
|
|
|
-- replace protection command
|
|
|
|
minetest.register_chatcommand("protector_replace", {
|
|
params = S("<owner name> <name to replace with>"),
|
|
description = S("Replace Protector Owner with name provided"),
|
|
privs = {server = true},
|
|
|
|
func = function(name, param)
|
|
|
|
-- reset list to empty
|
|
if param == "-" then
|
|
|
|
minetest.chat_send_player(name, S("Name List Reset"))
|
|
|
|
replace_names = ""
|
|
|
|
return
|
|
end
|
|
|
|
-- show name info
|
|
if param == "" and replace_names ~= "" then
|
|
|
|
local names = replace_names:split(" ")
|
|
|
|
minetest.chat_send_player(name, S("Replacing Protector name @1 with @2",
|
|
names[1] or "", names[2] or ""))
|
|
|
|
return
|
|
end
|
|
|
|
replace_names = param
|
|
end
|
|
})
|
|
|
|
-- Abm to remove or replace protectors within active player area
|
|
|
|
minetest.register_abm({
|
|
nodenames = {"protector:protect", "protector:protect2", "protector:protect_hidden"},
|
|
interval = 6,
|
|
chance = 1,
|
|
catch_up = false,
|
|
|
|
action = function(pos, node)
|
|
|
|
if removal_names == "" and replace_names == "" then return end
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
if not meta then return end
|
|
|
|
local owner = meta:get_string("owner")
|
|
|
|
if removal_names ~= "" then
|
|
|
|
local names = removal_names:split(" ")
|
|
|
|
for _, n in pairs(names) do
|
|
if n == owner then minetest.set_node(pos, {name = "air"}) end
|
|
end
|
|
end
|
|
|
|
if replace_names ~= "" then
|
|
|
|
local names = replace_names:split(" ")
|
|
|
|
if names[1] and names[2] and owner == names[1] then
|
|
meta:set_string("owner", names[2])
|
|
meta:set_string("infotext", S("Protection (owned by @1)", names[2]))
|
|
end
|
|
end
|
|
end
|
|
})
|
|
|
|
-- get protection radius (max 30)
|
|
|
|
local r = tonumber(minetest.settings:get("protector_radius")) or 5
|
|
|
|
if r > 30 then r = 30 end
|
|
|
|
-- show protection areas of nearby protectors owned by you (thanks agaran)
|
|
|
|
minetest.register_chatcommand("protector_show_area", {
|
|
params = "",
|
|
description = S("Show protected areas of your nearby protectors"),
|
|
privs = {},
|
|
|
|
func = function(name, param)
|
|
|
|
local player = minetest.get_player_by_name(name)
|
|
local pos = player:get_pos()
|
|
|
|
-- find the protector nodes
|
|
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_hidden"})
|
|
|
|
local meta, owner
|
|
|
|
-- show a maximum of 5 protected areas only
|
|
for n = 1, math.min(#pos, 5) do
|
|
|
|
meta = minetest.get_meta(pos[n])
|
|
owner = meta:get_string("owner") or ""
|
|
|
|
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},
|
|
is_ground_content = false,
|
|
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}
|
|
}
|
|
})
|
|
|
|
-- make own protectors visible in area
|
|
|
|
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
|
|
})
|
|
|
|
-- make own protectors invisible in area
|
|
|
|
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
|
|
})
|