mod-alternode/tools.lua

218 lines
6.2 KiB
Lua
Raw Normal View History

local S = core.get_translator(alternode.modname)
local use_s_protect = core.global_exists("s_protect")
local function check_permissions(player)
local pname = player:get_player_name()
local granted, missing = core.check_player_privs(pname, {server=true,})
if not granted then
core.chat_send_player(pname,
S("You do not have privileges to use this item (missing priviliges: @1)", table.concat(missing, ", ")))
return false
end
return true
end
local function target_is_node(target)
if target.type ~= "node" then
core.chat_send_player(pname, S("This item only works on nodes"))
return false
end
return true
end
local function is_area_owner(pos, pname)
if not pname then return false end
if use_s_protect then
local claim = s_protect.get_claim(pos)
if claim then return pname == claim.owner end
else
return core.is_protected(pos, pname)
end
return false
end
local function check_node_pos(target)
if target.type ~= "node" then return end
local pos = core.get_pointed_thing_position(target, false)
if not core.get_node_or_nil(pos) then return end
return pos
end
--- Admin tool to retrieve node node coordinates, name, & some select meta info.
--
-- @craftitem alternode:infostick
-- @use
-- @place
core.register_craftitem(alternode.modname .. ":infostick", {
description = S("Tool for retrieving information about a node"),
short_description = S("Info Stick"),
inventory_image = "alternode_infostick.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
if not user:is_player() then return end
if not check_permissions(user) then return end
if not target_is_node(pointed_thing) then return end
local pname = user:get_player_name()
local pos = core.get_pointed_thing_position(pointed_thing, false)
local node = core.get_node_or_nil(pos)
if not node then
core.chat_send_player(pname, S("That doesn't seem to be a proper node"))
return
end
local meta = core.get_meta(pos)
local infostring = S("pos: x@=@1, y@=@2, z@=@3; name@=@4",
tostring(pos.x), tostring(pos.y), tostring(pos.z), node.name)
for _, key in ipairs({"id", "infotext", "owner"}) do
local value = meta:get_string(key)
if value and value ~= "" then
infostring = infostring .. "; "
.. key .. "=" .. value
end
end
core.chat_send_player(pname, infostring)
end,
on_place = function(itemstack, placer, pointed_thing)
if not placer:is_player() then return end
if not check_permissions(placer) then return end
if not target_is_node(pointed_thing) then return end
local pos = core.get_pointed_thing_position(pointed_thing, false)
local node = core.get_node_or_nil(pos)
if not node then
core.chat_send_player(pname, S("That doesn't seem to be a proper node"))
return
end
alternode.show_formspec(pos, node, placer)
end,
})
--- Player tool to alter *infotext* meta value.
--
-- @craftitem alternode:pencil
-- @use
-- @place
core.register_craftitem(alternode.modname .. ":pencil", {
description = S("Tool for editing node infotext"),
short_description = S("Pencil"),
inventory_image = "alternode_pencil.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
if not user:is_player() then return end
local pos = check_node_pos(pointed_thing)
if not pos then return end
local pname = user:get_player_name()
if not is_area_owner(pos, pname) then
core.chat_send_player(pname, "You cannot alter nodes in areas you do not own")
return
end
local infotext = core.get_meta(pos):get_string("infotext")
local formspec = "formspec_version[4]"
.. "size[6,4]"
.. "textarea[1,1;4,1.5;input;Infotext;" .. infotext .. "]"
.. "button_exit[1.5,2.75;1.25,0.75;btn_write;Write]"
.. "button_exit[3.3,2.75;1.25,0.75;btn_erase;Erase]"
-- store pos info for retrieval in callbacks
user:get_meta():set_string(alternode.modname .. ":pencil:pos", core.serialize(pos))
core.show_formspec(pname, alternode.modname .. ":pencil", formspec)
end,
})
core.register_on_player_receive_fields(function(player, formname, fields)
if formname == alternode.modname .. ":pencil" then
-- FIXME: how to get node meta without storing in player meta?
local pmeta = player:get_meta()
local pos = core.deserialize(pmeta:get_string(alternode.modname .. ":pencil:pos"))
local nmeta = core.get_meta(pos)
if fields.btn_write then
if fields.input:trim() == "" then
nmeta:set_string("infotext", nil)
else
nmeta:set_string("infotext", fields.input)
end
elseif fields.btn_erase then
nmeta:set_string("infotext", nil)
end
pmeta:set_string(alternode.modname .. ":pencil:pos", nil)
end
end)
--- Player tool to set/unset *owner* meta value.
--
-- @craftitem alternode:wand
-- @use
-- @place
core.register_craftitem(alternode.modname .. ":wand", {
description = "Tool for setting node owner",
short_description = "Ownit Wand",
inventory_image = "alternode_wand.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
if not user:is_player() then return end
local pos = check_node_pos(pointed_thing)
if not pos then return end
local pname = user:get_player_name()
local nmeta = core.get_meta(pos)
local node_owner = nmeta:get_string("owner")
if node_owner ~= "" and pname ~= node_owner then
core.chat_send_player(pname, "You cannot take ownership of a node owned by " .. node_owner)
return
end
local unown = false
if pname == node_owner then unown = true end
if unown then
nmeta:set_string("owner", nil)
core.chat_send_player(pname, "You no longer own this node")
else
if not is_area_owner(pos, pname) then
2021-05-16 18:48:19 -07:00
core.chat_send_player(pname, "You cannot take ownership of nodes in areas you do not own")
return
end
nmeta:set_string("owner", pname)
core.chat_send_player(pname, "You now own this node")
end
end,
on_place = function(itemstack, placer, pointed_thing)
if not placer:is_player() then return end
local pos = check_node_pos(pointed_thing)
if not pos then return end
local pname = placer:get_player_name()
local node_owner = core.get_meta(pos):get_string("owner")
if node_owner == "" then
core.chat_send_player(pname, "This node is unowned")
else
core.chat_send_player(pname, "This node is owned by " .. node_owner)
end
end,
})
core.register_alias("ownit:wand", alternode.modname .. ":wand")