3 Mods hinzugefügt, Fehlende Nahrungspunkteangaben im Inventar ergänzt, falsche Nahrungspunkte berichtigt
This commit is contained in:
parent
763ba03e6c
commit
23dda4593a
151 changed files with 6445 additions and 109 deletions
164
mods/protector/tool.lua
Normal file
164
mods/protector/tool.lua
Normal file
|
@ -0,0 +1,164 @@
|
|||
|
||||
-- protector placement tool (thanks to Shara for code and idea)
|
||||
|
||||
local S = core.get_translator("protector")
|
||||
|
||||
-- get protection radius
|
||||
|
||||
local r = protector.radius
|
||||
|
||||
-- protector placement tool
|
||||
|
||||
core.register_craftitem("protector:tool", {
|
||||
description = S("Protector Placer Tool (stand near protector, face direction and use)"),
|
||||
inventory_image = "protector_tool.png",
|
||||
stack_max = 1,
|
||||
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
|
||||
local name = user:get_player_name()
|
||||
|
||||
-- check for protector near player (2 block radius)
|
||||
local pos = user:get_pos()
|
||||
local pp = core.find_nodes_in_area(
|
||||
vector.subtract(pos, 2), vector.add(pos, 2),
|
||||
{"protector:protect", "protector:protect2", "protector:protect_hidden"})
|
||||
|
||||
if #pp == 0 then return end -- none found
|
||||
|
||||
pos = pp[1] -- take position of first protector found
|
||||
|
||||
-- get members on protector
|
||||
local meta = core.get_meta(pos)
|
||||
local members = meta:get_string("members") or ""
|
||||
|
||||
-- get direction player is facing
|
||||
local dir = core.dir_to_facedir( user:get_look_dir() )
|
||||
local vec = {x = 0, y = 0, z = 0}
|
||||
local gap = (r * 2) + 1
|
||||
local pit = user:get_look_vertical()
|
||||
|
||||
-- set placement coords
|
||||
if pit > 1.2 then vec.y = -gap -- up
|
||||
elseif pit < -1.2 then vec.y = gap -- down
|
||||
elseif dir == 0 then vec.z = gap -- north
|
||||
elseif dir == 1 then vec.x = gap -- east
|
||||
elseif dir == 2 then vec.z = -gap -- south
|
||||
elseif dir == 3 then vec.x = -gap -- west
|
||||
end
|
||||
|
||||
-- new position
|
||||
pos.x = pos.x + vec.x
|
||||
pos.y = pos.y + vec.y
|
||||
pos.z = pos.z + vec.z
|
||||
|
||||
-- does placing a protector overlap existing area
|
||||
if not protector.can_dig(r * 2, pos, user:get_player_name(), true, 3) then
|
||||
|
||||
core.chat_send_player(name,
|
||||
S("Overlaps into above players protected area"))
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
-- does a protector already exist ?
|
||||
if #core.find_nodes_in_area(vector.subtract(pos, 1), vector.add(pos, 1),
|
||||
{"protector:protect", "protector:protect2",
|
||||
"protector:protect_hidden"}) > 0 then
|
||||
|
||||
core.chat_send_player(name, S("Protector already in place!"))
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
-- do not place protector out of map bounds or replace bedrock
|
||||
if #core.find_nodes_in_area(pos, pos, {"ignore", "mcl_core:bedrock"}) > 0 then
|
||||
|
||||
core.chat_send_player(name, S("Out of bounds!"))
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
-- do we have protectors to use ?
|
||||
local nod
|
||||
local inv = user:get_inventory()
|
||||
|
||||
if not inv:contains_item("main", "protector:protect")
|
||||
and not inv:contains_item("main", "protector:protect2") then
|
||||
|
||||
core.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
|
||||
|
||||
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
|
||||
|
||||
-- do not replace containers with inventory space
|
||||
local inv = core.get_inventory({type = "node", pos = pos})
|
||||
|
||||
if inv then
|
||||
core.chat_send_player(name,
|
||||
S("Cannot place protector, container at @1",
|
||||
core.pos_to_string(pos)))
|
||||
return
|
||||
end
|
||||
|
||||
-- protection check for other mods like Areas
|
||||
if core.is_protected(pos, name) then
|
||||
|
||||
core.chat_send_player(name,
|
||||
S("Cannot place protector, already protected at @1",
|
||||
core.pos_to_string(pos)))
|
||||
return
|
||||
end
|
||||
|
||||
-- place protector
|
||||
core.set_node(pos, {name = nod, param2 = 1})
|
||||
|
||||
-- set protector metadata
|
||||
local meta = core.get_meta(pos)
|
||||
|
||||
meta:set_string("owner", name)
|
||||
meta:set_string("infotext", "Protection (owned by " .. name .. ")")
|
||||
|
||||
-- copy members across if holding sneak when using tool
|
||||
if user:get_player_control().sneak then
|
||||
meta:set_string("members", members)
|
||||
else
|
||||
meta:set_string("members", "")
|
||||
end
|
||||
|
||||
core.chat_send_player(name,
|
||||
S("Protector placed at @1", core.pos_to_string(pos)))
|
||||
end
|
||||
})
|
||||
|
||||
-- tool recipe
|
||||
|
||||
local df = "default:steel_ingot"
|
||||
|
||||
if core.get_modpath("mcl_core") then
|
||||
df = "mcl_core:iron_ingot"
|
||||
end
|
||||
|
||||
core.register_craft({
|
||||
output = "protector:tool",
|
||||
recipe = {
|
||||
{df, df, df},
|
||||
{df, "protector:protect", df},
|
||||
{df, df, df}
|
||||
}
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue