Compare commits

...

28 Commits

Author SHA1 Message Date
Juraj Vajda d22ae53a89 add gitignore 2021-03-14 15:59:08 -04:00
Juraj Vajda 2b1f685a30 merge https://notabug.org/TenPlus1/protector and resolve conflicts 2021-02-21 14:26:20 -05:00
tenplus1 ffee992ed1 replace deprecated settings functions 2021-02-11 20:00:49 +00:00
tenplus1 034029b0f4 add nil check for prot display removal 2021-01-03 19:25:29 +00:00
tenplus1 6bca4ffdff added missing nil check 2020-12-25 19:11:16 +00:00
Juraj Vajda 49f1bec72e tool: check for protected areas (mod) also 2018-12-11 18:46:43 -05:00
Juraj Vajda 97c4b93945 fix reversed up/down pitch 2018-12-05 19:01:25 -05:00
Juraj Vajda a631b6b9e6 more pvp assignements 2018-12-02 11:53:55 -05:00
Juraj Vajda cbf0dc25b3 fix deprecated function 2018-11-25 13:31:13 -05:00
Juraj Vajda 533a7ca89d cleanup 2018-10-31 17:31:06 -04:00
Juraj Vajda a5c3679eda added PvP protector (PvP Enabled areas) 2018-10-31 17:23:41 -04:00
Juraj Vajda d1f9788946 protector protect nodebox and new textures 2018-10-27 13:14:20 -04:00
Juraj Vajda c21e1c408f updated from protector redo repo 2018-10-27 12:15:16 -04:00
Juraj Vajda 071574b961 disable admin 2018-01-24 01:10:01 -05:00
Juraj Vajda 6ca636a763 use new intllib api 2018-01-10 18:58:01 -05:00
Juraj Vajda 3621b2e9af Merge https://github.com/tenplus1/protector into develop 2018-01-06 18:19:25 -05:00
Juraj Vajda 5b4a82d6dc updated admin ban list 2018-01-05 23:41:25 -05:00
Juraj Vajda 4a45b02f40 add 'AngryBird' to removal list 2017-12-31 16:32:22 -05:00
Juraj Vajda 51e9abf923 enable admin commands 2017-12-31 16:21:32 -05:00
Juraj Vajda f13e727b3a replace deprecated functions 2017-12-10 16:53:46 -05:00
Juraj Vajda 48860a5367 update from protector redo repository 2017-12-10 16:46:59 -05:00
Juraj Vajda 6595f054d5 new chest texture 2017-08-02 12:11:07 +02:00
Juraj Vajda 5d6a453b28 disable deprecated call 2017-07-31 00:13:41 +02:00
Juraj Vajda 1b122a44f3 adjust recipe 2017-07-10 19:36:27 +02:00
Juraj Vajda e8f7b565f9 merge and resolve conflicts 2017-07-08 17:48:31 +02:00
Juraj Vajda 2e2142575d Merge https://github.com/tenplus1/protector into develop 2017-01-15 15:49:29 +01:00
Juraj Vajda 1a94c1a6d0 Merge https://github.com/tenplus1/protector into develop 2016-12-14 01:08:22 +01:00
Juraj Vajda 23c6158c39 initial commit 2016-12-03 15:02:15 +01:00
22 changed files with 450 additions and 90 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.DS_Store

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

View File

@ -68,7 +68,7 @@ minetest.register_chatcommand("protector_replace", {
minetest.register_abm({
nodenames = {"protector:protect", "protector:protect2", "protector:protect_hidden"},
nodenames = {"protector:protect", "protector:protect2", "protector:protect_pvp", "protector:protect2_pvp"},
interval = 8,
chance = 1,
catch_up = false,
@ -125,7 +125,7 @@ minetest.register_chatcommand("protector_show_area", {
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"})
{"protector:protect", "protector:protect2", "protector:protect_pvp", "protector:protect2_pvp"})
local meta, owner

View File

@ -77,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
@ -523,9 +523,9 @@ end
minetest.register_node("protector:chest", {
description = S("Protected Chest"),
tiles = {
"default_chest_top.png", "default_chest_top.png",
"default_chest_side.png", "default_chest_side.png",
"default_chest_side.png", "default_chest_front.png^protector_logo.png"
"protector_chest_top.png", "protector_chest_top.png",
"protector_chest_side.png", "protector_chest_side.png",
"protector_chest_side.png", "protector_chest_front.png"
},
paramtype2 = "facedir",
groups = {choppy = 2, oddly_breakable_by_hand = 2, unbreakable = 1},

29
hud.lua
View File

@ -1,13 +1,12 @@
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.setting_get("protector_hud_interval")) or 5)
local hud_interval = (tonumber(minetest.settings:get("protector_hud_interval")) or 5)
if hud_interval > 0 then
minetest.register_globalstep(function(dtime)
@ -24,18 +23,35 @@ minetest.register_globalstep(function(dtime)
local name = player:get_player_name()
local pos = vector.round(player:get_pos())
local hud_text = ""
local hud_text_color = 0xFFFF22; -- lemon yellow
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_hidden"})
{"protector:protect","protector:protect2","protector:protect_pvp","protector:protect2_pvp"})
if #protectors > 0 then
local npos = protectors[1]
local meta = minetest.get_meta(npos)
local is_pvp = meta:get_int("is_pvp")
if not is_pvp then
is_pvp = 0
end
if is_pvp == 1 then
hud_text_color = 0xFF0022 -- torch red
else
hud_text_color = 0xFFFF22 -- lemon yellow
end
local nodeowner = meta:get_string("owner")
hud_text = S("Owner: @1", nodeowner)
if is_pvp == 1 then
hud_text = S("Owner: @1", nodeowner) .. " (PvP Enabled)"
else
hud_text = S("Owner: @1", nodeowner)
end
end
if not hud[name] then
@ -45,7 +61,7 @@ minetest.register_globalstep(function(dtime)
hud[name].id = player:hud_add({
hud_elem_type = "text",
name = "Protector Area",
number = 0xFFFF22,
number = hud_text_color,
position = {x = 0, y = 0.95},
offset = {x = 8, y = -8},
text = hud_text,
@ -56,6 +72,7 @@ minetest.register_globalstep(function(dtime)
return
else
player:hud_change(hud[name].id, "text", hud_text)
player:hud_change(hud[name].id, "number", hud_text_color)
end
end
end)

398
init.lua
View File

@ -177,8 +177,10 @@ local protector_formspec = function(meta)
checkbox_faction = true
end
else
if next(factions.get_player_faction(meta:get_string("owner"))) then
checkbox_faction = true
if factions.get_player_factions(meta:get_string("owner")) ~= nil then
if next(factions.get_player_faction(meta:get_string("owner"))) then
checkbox_faction = true
end
end
end
end
@ -269,7 +271,6 @@ end
-- 3 for checking protector overlaps
protector.can_dig = function(r, pos, digger, onlyowner, infolevel)
if not digger or not pos then
return false
end
@ -289,34 +290,37 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel)
show_msg(digger,
S("Spawn @1 has been protected up to a @2 block radius.",
minetest.pos_to_string(statspawn), protector_spawn))
return false
end
-- find the protector nodes
local pos = minetest.find_nodes_in_area(
local pos, nodes = 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"})
{"protector:protect", "protector:protect2","protector:protect_pvp", "protector:protect2_pvp"})
local meta, owner, members
local is_pvp = false
if nodes["protector:protect_pvp"] > 0 or
nodes["protector:protect2_pvp"] > 0 then
is_pvp = true
end
for n = 1, #pos do
meta = minetest.get_meta(pos[n])
owner = meta:get_string("owner") or ""
members = meta:get_string("members") or ""
-- node change and digger isn't owner
if infolevel == 1 and owner ~= digger then
-- and you aren't on the member list
if onlyowner or not is_member(meta, digger) then
show_msg(digger,
S("This area is owned by @1", owner) .. "!")
return false
if not is_pvp then
show_msg(digger, S("This area is owned by @1", owner) .. "!")
end
return false, is_pvp
end
end
@ -333,8 +337,7 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel)
minetest.chat_send_player(digger, S("Members: @1.", members))
end
return false
return false, is_pvp
end
end
@ -349,8 +352,7 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel)
minetest.chat_send_player(digger, S("You can build here."))
end
return true
return true, is_pvp
end
@ -455,7 +457,8 @@ local del_display = function(pos)
for _, v in ipairs(objects) do
if v:get_luaentity().name == "protector:display" then
if v and v:get_luaentity()
and v:get_luaentity().name == "protector:display" then
v:remove()
end
end
@ -469,9 +472,12 @@ minetest.register_node("protector:protect", {
description = S("Protection Block") .. " (" .. S("USE for area check") .. ")",
drawtype = "nodebox",
tiles = {
"default_stone.png^protector_overlay.png",
"default_stone.png^protector_overlay.png",
"default_stone.png^protector_overlay.png^protector_logo.png"
"protector_protect_top.png",
"protector_protect_top.png",
"protector_protect_side.png",
"protector_protect_side.png",
"protector_protect_side.png",
"protector_protect_side.png"
},
sounds = default.node_sound_stone_defaults(),
groups = {dig_immediate = 2, unbreakable = 1},
@ -482,10 +488,76 @@ minetest.register_node("protector:protect", {
node_box = {
type = "fixed",
fixed = {
{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5},
{-0.375, -0.4375, -0.375, 0.375, 0.4375, 0.375},
{-0.5, 0.375, -0.5, -0.375, 0.5, 0.375},
{-0.375, 0.375, -0.5, 0.5, 0.5, -0.375},
{0.375, 0.375, -0.375, 0.5, 0.5, 0.5},
{-0.5, 0.375, 0.375, 0.375, 0.5, 0.5},
{-0.25, 0.4375, -0.25, -0.0625, 0.5, 0.0625},
{-0.25, 0.4375, 0.0625, 0.0625, 0.5, 0.25},
{0.0625, 0.4375, -0.0625, 0.25, 0.5, 0.25},
{-0.0625, 0.4375, -0.25, 0.25, 0.5, -0.0625},
{-0.5, -0.5, -0.5, -0.375, -0.375, 0.375},
{-0.375, -0.5, -0.5, 0.5, -0.375, -0.375},
{0.375, -0.5, -0.375, 0.5, -0.375, 0.5},
{-0.5, -0.5, 0.375, 0.375, -0.375, 0.5},
{0.375, -0.375, -0.5, 0.5, 0.375, -0.375},
{0.375, -0.375, 0.375, 0.5, 0.375, 0.5},
{-0.5, -0.375, -0.5, -0.375, 0.375, -0.375},
{-0.5, -0.375, 0.375, -0.375, 0.375, 0.5},
{-0.25, -0.5, -0.25, -0.0625, -0.4375, 0.0625},
{-0.25, -0.5, 0.0625, 0.0625, -0.4375, 0.25},
{0.0625, -0.5, -0.0625, 0.25, -0.4375, 0.25},
{-0.0625, -0.5, -0.25, 0.25, -0.4375, -0.0625},
{-0.0625, -0.25, -0.4375, 0.25, -0.0625, -0.375},
{-0.25, 0.0625, -0.4375, 0.0625, 0.25, -0.375},
{-0.25, -0.25, -0.4375, -0.0625, 0.0625, -0.375},
{0.0625, -0.0625, -0.4375, 0.25, 0.25, -0.375},
{0.375, -0.0625, -0.25, 0.4375, 0.25, -0.0625},
{0.375, -0.25, 0.0625, 0.4375, 0.0625001, 0.25},
{0.375, 0.0625, -0.0625, 0.4375, 0.25, 0.25},
{0.375, -0.25, -0.25, 0.4375, -0.0624999, 0.0624998},
{-0.0625, -0.25, 0.375, 0.25, -0.0625, 0.4375},
{-0.25, 0.0625, 0.375, 0.0624999, 0.25, 0.4375},
{0.0625, -0.0625, 0.375, 0.25, 0.25, 0.4375},
{-0.25, -0.25, 0.375, -0.0624999, 0.0625, 0.4375},
{-0.4375, -0.25, 0.0625, -0.375, 0.0625, 0.25},
{-0.4375, -0.0625, -0.25, -0.375, 0.25, -0.0624999},
{-0.4375, 0.0625, -0.0625, -0.375, 0.25, 0.25},
{-0.4375, -0.25, -0.25, -0.375, -0.0624999, 0.0625},
{-0.125, -0.125, 0.4375, 0.125, 0.125, 0.5},
{0.0625, 0.125, 0.4375, 0.125, 0.1875, 0.5},
{-0.125, 0.125, 0.4375, -0.0625, 0.1875, 0.5},
{-0.0625, -0.1875, 0.4375, 0.0624999, -0.125, 0.5},
{-0.125, -0.125, -0.5, 0.125, 0.125, -0.4375},
{0.0625, 0.125, -0.5, 0.125, 0.1875, -0.4375},
{-0.125, 0.125, -0.5, -0.0625, 0.1875, -0.4375},
{-0.0625, -0.1875, -0.5, 0.0624999, -0.125, -0.4375},
{-0.5, -0.125, -0.125, -0.4375, 0.125, 0.125},
{-0.5, 0.125, 0.0625, -0.4375, 0.1875, 0.125},
{-0.5, 0.125, -0.125, -0.4375, 0.1875, -0.0625003},
{-0.5, -0.1875, -0.0625, -0.4375, -0.125, 0.0625},
{0.4375, -0.125, -0.125, 0.5, 0.125, 0.125},
{0.4375, 0.125, -0.125, 0.5, 0.1875, -0.0625},
{0.4375, 0.125, 0.0625, 0.5, 0.1875, 0.125},
{0.4375, -0.1875, -0.0625, 0.5, -0.125, 0.0625},
}
},
collision_box = {
type = "fixed",
fixed = {
{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5},
},
},
on_place = check_overlap,
after_place_node = function(pos, placer)
@ -494,6 +566,7 @@ minetest.register_node("protector:protect", {
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("members", "")
meta:set_int("is_pvp", 0)
meta:set_string("infotext",
S("Protection (owned by @1)", meta:get_string("owner")))
end,
@ -541,6 +614,15 @@ minetest.register_node("protector:protect", {
after_destruct = del_display
})
minetest.register_craft({
output = "protector:protect",
recipe = {
{"default:stone", "default:copper_ingot", "default:stone"},
{"default:copper_ingot", "default:mese", "default:copper_ingot"},
{"default:stone", "default:copper_ingot", "default:stone"},
}
})
-- default recipe and alternative for MineClone2
if protector_recipe then
@ -598,6 +680,7 @@ minetest.register_node("protector:protect2", {
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("members", "")
meta:set_int("is_pvp", 0)
meta:set_string("infotext",
S("Protection (owned by @1)", meta:get_string("owner")))
end,
@ -659,6 +742,260 @@ minetest.register_craft({
})
-- protection PvP node
minetest.register_node("protector:protect_pvp", {
description = S("Protection Block") .. " PvP (" .. S("USE for area check") .. ")",
drawtype = "nodebox",
tiles = {
"protector_protect_pvp_top.png",
"protector_protect_pvp_top.png",
"protector_protect_pvp_side.png",
"protector_protect_pvp_side.png",
"protector_protect_pvp_side.png",
"protector_protect_pvp_side.png"
},
sounds = default.node_sound_stone_defaults(),
groups = {dig_immediate = 2, unbreakable = 1},
is_ground_content = false,
paramtype = "light",
light_source = 4,
node_box = {
type = "fixed",
fixed = {
{-0.375, -0.4375, -0.375, 0.375, 0.4375, 0.375},
{-0.5, 0.375, -0.5, -0.375, 0.5, 0.375},
{-0.375, 0.375, -0.5, 0.5, 0.5, -0.375},
{0.375, 0.375, -0.375, 0.5, 0.5, 0.5},
{-0.5, 0.375, 0.375, 0.375, 0.5, 0.5},
{-0.25, 0.4375, -0.25, -0.0625, 0.5, 0.0625},
{-0.25, 0.4375, 0.0625, 0.0625, 0.5, 0.25},
{0.0625, 0.4375, -0.0625, 0.25, 0.5, 0.25},
{-0.0625, 0.4375, -0.25, 0.25, 0.5, -0.0625},
{-0.5, -0.5, -0.5, -0.375, -0.375, 0.375},
{-0.375, -0.5, -0.5, 0.5, -0.375, -0.375},
{0.375, -0.5, -0.375, 0.5, -0.375, 0.5},
{-0.5, -0.5, 0.375, 0.375, -0.375, 0.5},
{0.375, -0.375, -0.5, 0.5, 0.375, -0.375},
{0.375, -0.375, 0.375, 0.5, 0.375, 0.5},
{-0.5, -0.375, -0.5, -0.375, 0.375, -0.375},
{-0.5, -0.375, 0.375, -0.375, 0.375, 0.5},
{-0.25, -0.5, -0.25, -0.0625, -0.4375, 0.0625},
{-0.25, -0.5, 0.0625, 0.0625, -0.4375, 0.25},
{0.0625, -0.5, -0.0625, 0.25, -0.4375, 0.25},
{-0.0625, -0.5, -0.25, 0.25, -0.4375, -0.0625},
{-0.0625, -0.25, -0.4375, 0.25, -0.0625, -0.375},
{-0.25, 0.0625, -0.4375, 0.0625, 0.25, -0.375},
{-0.25, -0.25, -0.4375, -0.0625, 0.0625, -0.375},
{0.0625, -0.0625, -0.4375, 0.25, 0.25, -0.375},
{0.375, -0.0625, -0.25, 0.4375, 0.25, -0.0625},
{0.375, -0.25, 0.0625, 0.4375, 0.0625001, 0.25},
{0.375, 0.0625, -0.0625, 0.4375, 0.25, 0.25},
{0.375, -0.25, -0.25, 0.4375, -0.0624999, 0.0624998},
{-0.0625, -0.25, 0.375, 0.25, -0.0625, 0.4375},
{-0.25, 0.0625, 0.375, 0.0624999, 0.25, 0.4375},
{0.0625, -0.0625, 0.375, 0.25, 0.25, 0.4375},
{-0.25, -0.25, 0.375, -0.0624999, 0.0625, 0.4375},
{-0.4375, -0.25, 0.0625, -0.375, 0.0625, 0.25},
{-0.4375, -0.0625, -0.25, -0.375, 0.25, -0.0624999},
{-0.4375, 0.0625, -0.0625, -0.375, 0.25, 0.25},
{-0.4375, -0.25, -0.25, -0.375, -0.0624999, 0.0625},
{-0.125, -0.125, 0.4375, 0.125, 0.125, 0.5},
{0.0625, 0.125, 0.4375, 0.125, 0.1875, 0.5},
{-0.125, 0.125, 0.4375, -0.0625, 0.1875, 0.5},
{-0.0625, -0.1875, 0.4375, 0.0624999, -0.125, 0.5},
{-0.125, -0.125, -0.5, 0.125, 0.125, -0.4375},
{0.0625, 0.125, -0.5, 0.125, 0.1875, -0.4375},
{-0.125, 0.125, -0.5, -0.0625, 0.1875, -0.4375},
{-0.0625, -0.1875, -0.5, 0.0624999, -0.125, -0.4375},
{-0.5, -0.125, -0.125, -0.4375, 0.125, 0.125},
{-0.5, 0.125, 0.0625, -0.4375, 0.1875, 0.125},
{-0.5, 0.125, -0.125, -0.4375, 0.1875, -0.0625003},
{-0.5, -0.1875, -0.0625, -0.4375, -0.125, 0.0625},
{0.4375, -0.125, -0.125, 0.5, 0.125, 0.125},
{0.4375, 0.125, -0.125, 0.5, 0.1875, -0.0625},
{0.4375, 0.125, 0.0625, 0.5, 0.1875, 0.125},
{0.4375, -0.1875, -0.0625, 0.5, -0.125, 0.0625},
}
},
collision_box = {
type = "fixed",
fixed = {
{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5},
},
},
selection_box = {
type = "fixed",
fixed = {
{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5},
},
},
on_place = check_overlap,
after_place_node = function(pos, placer)
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_int("is_pvp", 1)
end,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then
return
end
protector.can_dig(protector_radius, pointed_thing.under, user:get_player_name(), false, 2)
end,
on_rightclick = function(pos, node, clicker, itemstack)
local meta = minetest.get_meta(pos)
local name = clicker:get_player_name()
if meta
and protector.can_dig(1, pos, name, true, 1) then
player_pos[name] = pos
minetest.show_formspec(name, "protector:node", protector_formspec(meta))
end
end,
on_punch = function(pos, node, puncher)
if minetest.is_protected(pos, puncher:get_player_name()) then
return
end
minetest.add_entity(pos, "protector:display")
end,
can_dig = function(pos, player)
return player and protector.can_dig(1, pos, player:get_player_name(), true, 1)
end,
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_pvp",
recipe = {
{"protector:protect", "dye:red"}
}
})
-- protection PvP logo
minetest.register_node("protector:protect2_pvp", {
description = S("Protection Logo") .. " PvP (" .. S("USE for area check") .. ")",
tiles = {"protector_logo.png^[colorize:#820D0C90"},
wield_image = "protector_logo.png^[colorize:#820D0C90",
inventory_image = "protector_logo.png^[colorize:#820D0C90",
sounds = default.node_sound_stone_defaults(),
groups = {dig_immediate = 2, unbreakable = 1},
paramtype = "light",
paramtype2 = "wallmounted",
legacy_wallmounted = true,
light_source = 4,
drawtype = "nodebox",
sunlight_propagates = true,
walkable = true,
node_box = {
type = "wallmounted",
wall_top = {-0.375, 0.4375, -0.5, 0.375, 0.5, 0.5},
wall_bottom = {-0.375, -0.5, -0.5, 0.375, -0.4375, 0.5},
wall_side = {-0.5, -0.5, -0.375, -0.4375, 0.5, 0.375},
},
selection_box = {type = "wallmounted"},
on_place = check_overlap,
after_place_node = function(pos, placer)
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_int("is_pvp", 1)
end,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then
return
end
protector.can_dig(protector_radius, pointed_thing.under, user:get_player_name(), false, 2)
end,
on_rightclick = function(pos, node, clicker, itemstack)
local meta = minetest.get_meta(pos)
local name = clicker:get_player_name()
if meta
and protector.can_dig(1, pos, name, true, 1) then
player_pos[name] = pos
minetest.show_formspec(name, "protector:node", protector_formspec(meta))
end
end,
on_punch = function(pos, node, puncher)
if minetest.is_protected(pos, puncher:get_player_name()) then
return
end
minetest.add_entity(pos, "protector:display")
end,
can_dig = function(pos, player)
return player and protector.can_dig(1, pos, player:get_player_name(), true, 1)
end,
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,
})
-- recipes to switch between protectors PvP
minetest.register_craft({
type = "shapeless",
output = "protector:protect_pvp",
recipe = {"protector:protect2_pvp"}
})
minetest.register_craft({
type = "shapeless",
output = "protector:protect2_pvp",
recipe = {"protector:protect_pvp"}
})
-- check formspec buttons or when name entered
minetest.register_on_player_receive_fields(function(player, formname, fields)
@ -691,7 +1028,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local nod = minetest.get_node(pos).name
if nod ~= "protector:protect"
and nod ~= "protector:protect2" then
and nod ~= "protector:protect2"
and nod ~= "protector:protect_pvp"
and nod ~= "protector:protect2_pvp" then
player_pos[name] = nil
return
end
@ -787,18 +1126,21 @@ minetest.register_node("protector:display_node", {
})
dofile(MP .. "/doors_chest.lua")
dofile(MP .. "/pvp.lua")
dofile(MP .. "/admin.lua")
dofile(MP .. "/tool.lua")
dofile(MP .. "/hud.lua")
dofile(MP .. "/lucky_block.lua")
local path = minetest.get_modpath("protector")
dofile(path .. "/doors_chest.lua")
-- dofile(path .. "/pvp.lua")
-- dofile(path .. "/admin.lua")
dofile(path .. "/tool.lua")
dofile(path .. "/hud.lua")
-- dofile(path .. "/lucky_block.lua")
-- stop mesecon pistons from pushing protectors
if minetest.get_modpath("mesecons_mvps") then
mesecon.register_mvps_stopper("protector:protect")
mesecon.register_mvps_stopper("protector:protect2")
mesecon.register_mvps_stopper("protector:protect_pvp")
mesecon.register_mvps_stopper("protector:protect2_pvp")
mesecon.register_mvps_stopper("protector:chest")
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 B

After

Width:  |  Height:  |  Size: 108 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

100
tool.lua
View File

@ -1,16 +1,11 @@
-- protector placement tool (thanks to Shara for code and idea)
local S = protector.intllib
-- get protection radius
local r = tonumber(minetest.settings:get("protector_radius")) or 5
-- radius limiter (minetest cannot handle node volume of more than 4096000)
if r > 22 then r = 22 end
minetest.register_craftitem("protector:tool", {
description = S("Protector Placer Tool (stand near protector, face direction and use)"),
description = "Protector Placer Tool (stand near protector, face direction and use)",
inventory_image = "protector_display.png^protector_logo.png",
stack_max = 1,
@ -22,7 +17,7 @@ minetest.register_craftitem("protector:tool", {
local pos = user:get_pos()
local pp = minetest.find_nodes_in_area(
vector.subtract(pos, 2), vector.add(pos, 2),
{"protector:protect", "protector:protect2", "protector:protect_hidden"})
{"protector:protect", "protector:protect2","protector:protect_pvp", "protector:protect2_pvp"})
if #pp == 0 then return end -- none found
@ -31,6 +26,7 @@ minetest.register_craftitem("protector:tool", {
-- get members on protector
local meta = minetest.get_meta(pos)
local members = meta:get_string("members") or ""
local is_pvp = meta:get_int("is_pvp") or 0
-- get direction player is facing
local dir = minetest.dir_to_facedir( user:get_look_dir() )
@ -40,9 +36,9 @@ minetest.register_craftitem("protector:tool", {
-- set placement coords
if pit > 1.2 then
vec.y = -gap -- up
vec.y = -gap -- down
elseif pit < -1.2 then
vec.y = gap -- down
vec.y = gap -- up
elseif dir == 0 then
vec.z = gap -- north
elseif dir == 1 then
@ -58,11 +54,18 @@ minetest.register_craftitem("protector:tool", {
pos.y = pos.y + vec.y
pos.z = pos.z + vec.z
-- areas
if not areas:canInteract(pos, name) then
minetest.chat_send_player(name, "Overlaps into another player protected area")
return
end
-- does placing a protector overlap existing area
if not protector.can_dig(r * 2, pos, user:get_player_name(), true, 3) then
minetest.chat_send_player(name,
S("Overlaps into above players protected area"))
"Overlaps into above players protected area")
return
end
@ -70,11 +73,9 @@ minetest.register_craftitem("protector:tool", {
-- does a protector already exist ?
if #minetest.find_nodes_in_area(
vector.subtract(pos, 1), vector.add(pos, 1),
{"protector:protect", "protector:protect2",
"protector:protect_hidden"}) > 0 then
minetest.chat_send_player(name, S("Protector already in place!"))
{"protector:protect", "protector:protect2","protector:protect_pvp", "protector:protect2_pvp"}) > 0 then
minetest.chat_send_player(name, "Protector already in place!")
return
end
@ -82,27 +83,42 @@ minetest.register_craftitem("protector:tool", {
local nod
local inv = user:get_inventory()
if not inv:contains_item("main", "protector:protect")
and not inv:contains_item("main", "protector:protect2") then
minetest.chat_send_player(name,
S("No protectors available to place!"))
return
end
-- take protector (block first then logo)
if inv:contains_item("main", "protector:protect") then
if is_pvp == 1 then
if not inv:contains_item("main", "protector:protect_pvp") and
not inv:contains_item("main", "protector:protect2_pvp") then
minetest.chat_send_player(name, "No protectors available to place!")
return
end
inv:remove_item("main", "protector:protect")
if inv:contains_item("main", "protector:protect_pvp") then
nod = "protector:protect"
inv:remove_item("main", "protector:protect_pvp")
nod = "protector:protect_pvp"
elseif inv:contains_item("main", "protector:protect2") then
elseif inv:contains_item("main", "protector:protect2_pvp") then
inv:remove_item("main", "protector:protect2")
inv:remove_item("main", "protector:protect2_pvp")
nod = "protector:protect2_pvp"
end
else
if not inv:contains_item("main", "protector:protect") and
not inv:contains_item("main", "protector:protect2") then
minetest.chat_send_player(name, "No protectors available to place!")
return
end
nod = "protector:protect2"
if inv:contains_item("main", "protector:protect") then
inv:remove_item("main", "protector:protect")
nod = "protector:protect"
elseif inv:contains_item("main", "protector:protect2") then
inv:remove_item("main", "protector:protect2")
nod = "protector:protect2"
end
end
-- do not replace containers with inventory space
@ -110,16 +126,7 @@ minetest.register_craftitem("protector:tool", {
if inv then
minetest.chat_send_player(name,
S("Cannot place protector, container at") ..
" " .. minetest.pos_to_string(pos))
return
end
-- protection check for other mods like Areas
if minetest.is_protected(pos, name) then
minetest.chat_send_player(name,
S("Cannot place protector, already protected at") ..
" " .. minetest.pos_to_string(pos))
"Cannot place protector, container at " .. minetest.pos_to_string(pos))
return
end
@ -131,6 +138,7 @@ minetest.register_craftitem("protector:tool", {
meta:set_string("owner", name)
meta:set_string("infotext", "Protection (owned by " .. name .. ")")
meta:set_int("is_pvp", is_pvp)
-- copy members across if holding sneak when using tool
if user:get_player_control().sneak then
@ -140,25 +148,17 @@ minetest.register_craftitem("protector:tool", {
end
minetest.chat_send_player(name,
S("Protector placed at") ..
" " .. minetest.pos_to_string(pos))
"Protector placed at " .. minetest.pos_to_string(pos))
end,
})
-- tool recipe
local df = "default:steel_ingot"
if not minetest.registered_items[df] then
df = "mcl_core:iron_ingot"
end
minetest.register_craft({
output = "protector:tool",
recipe = {
{df, df, df},
{df, "protector:protect", df},
{df, df, df},
{"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"},
{"default:mese_crystal", "protector:protect", "default:mese_crystal"},
{"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"},
}
})