Compare commits
28 Commits
5672606432
...
d22ae53a89
Author | SHA1 | Date |
---|---|---|
Juraj Vajda | d22ae53a89 | |
Juraj Vajda | 2b1f685a30 | |
tenplus1 | ffee992ed1 | |
tenplus1 | 034029b0f4 | |
tenplus1 | 6bca4ffdff | |
Juraj Vajda | 49f1bec72e | |
Juraj Vajda | 97c4b93945 | |
Juraj Vajda | a631b6b9e6 | |
Juraj Vajda | cbf0dc25b3 | |
Juraj Vajda | 533a7ca89d | |
Juraj Vajda | a5c3679eda | |
Juraj Vajda | d1f9788946 | |
Juraj Vajda | c21e1c408f | |
Juraj Vajda | 071574b961 | |
Juraj Vajda | 6ca636a763 | |
Juraj Vajda | 3621b2e9af | |
Juraj Vajda | 5b4a82d6dc | |
Juraj Vajda | 4a45b02f40 | |
Juraj Vajda | 51e9abf923 | |
Juraj Vajda | f13e727b3a | |
Juraj Vajda | 48860a5367 | |
Juraj Vajda | 6595f054d5 | |
Juraj Vajda | 5d6a453b28 | |
Juraj Vajda | 1b122a44f3 | |
Juraj Vajda | e8f7b565f9 | |
Juraj Vajda | 2e2142575d | |
Juraj Vajda | 1a94c1a6d0 | |
Juraj Vajda | 23c6158c39 |
|
@ -0,0 +1 @@
|
|||
.DS_Store
|
After Width: | Height: | Size: 533 B |
After Width: | Height: | Size: 507 B |
After Width: | Height: | Size: 477 B |
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
@ -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
|
@ -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
|
||||
|
||||
|
|
Before Width: | Height: | Size: 421 B |
Before Width: | Height: | Size: 375 B |
Before Width: | Height: | Size: 418 B |
Before Width: | Height: | Size: 862 B |
After Width: | Height: | Size: 533 B |
After Width: | Height: | Size: 507 B |
After Width: | Height: | Size: 477 B |
Before Width: | Height: | Size: 96 B After Width: | Height: | Size: 108 B |
After Width: | Height: | Size: 270 B |
After Width: | Height: | Size: 240 B |
After Width: | Height: | Size: 252 B |
After Width: | Height: | Size: 216 B |
100
tool.lua
|
@ -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"},
|
||||
}
|
||||
})
|
||||
|
|