193 lines
5.4 KiB
Lua
193 lines
5.4 KiB
Lua
|
local modname = "protector_configurator"
|
|||
|
local S = minetest.get_translator(modname)
|
|||
|
|
|||
|
local context = {}
|
|||
|
|
|||
|
|
|||
|
local writer_formspec = function(itemstack, player)
|
|||
|
if not player then
|
|||
|
return
|
|||
|
end
|
|||
|
local player = player:get_player_name()
|
|||
|
if not player then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local meta = itemstack:get_meta()
|
|||
|
|
|||
|
local cords = protector_configurator:get_cords(meta)
|
|||
|
|
|||
|
-- if coordinates are not set, we will display information about this instead of coordinates
|
|||
|
local textlist = ""
|
|||
|
if not cords then
|
|||
|
textlist = protector_configurator:list2textlist({S("no coordinates have been set")})
|
|||
|
else
|
|||
|
textlist = protector_configurator:list2textlist(protector_configurator:cords2strings(cords))
|
|||
|
end
|
|||
|
|
|||
|
local formspec = 'size[8,8]'
|
|||
|
.. textlist
|
|||
|
.. "button[1,7;2,1;delete;" .. S("delete") .. "]"
|
|||
|
.. "button[3,7;3,1;clear;" .. S("clear all") .. "]"
|
|||
|
.. "button_exit[6,7;2,1;exit;" .. S("exit") .. "]"
|
|||
|
|
|||
|
minetest.show_formspec(player, modname .. ":writer_formspec", formspec)
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local function use_with_protecotr(itemstack, username, pos)
|
|||
|
local meta = itemstack:get_meta()
|
|||
|
protector_configurator:add_cord(meta, pos)
|
|||
|
|
|||
|
minetest.chat_send_player(username, S("added coordinates:") .. " "
|
|||
|
.. minetest.pos_to_string(pos))
|
|||
|
|
|||
|
return itemstack
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local function use_with_terminal(itemstack, username, pos)
|
|||
|
local terminal_meta = minetest.get_meta(pos)
|
|||
|
local writer_meta = itemstack:get_meta()
|
|||
|
|
|||
|
local writer_cords = protector_configurator:get_cords(writer_meta)
|
|||
|
if not writer_cords then return end
|
|||
|
|
|||
|
protector_configurator:add_cords(terminal_meta, writer_cords)
|
|||
|
|
|||
|
minetest.chat_send_player(username, S("coordinates added to terminal") )
|
|||
|
|
|||
|
terminal_meta:set_string("formspec", protector_configurator:terminal_formspec(terminal_meta))
|
|||
|
return itemstack
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local function on_use_writer(itemstack, user, pointed_thing)
|
|||
|
if not user or pointed_thing.type ~= "node" then
|
|||
|
return
|
|||
|
end
|
|||
|
local username = user:get_player_name()
|
|||
|
if not username then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local pos = pointed_thing.under
|
|||
|
local nodename = minetest.get_node(pos).name
|
|||
|
|
|||
|
if nodename == "protector:protect" or nodename == "protector:protect2" then
|
|||
|
if protector_configurator:check_owner(username, pos) then -- add protector cords
|
|||
|
return use_with_protecotr(itemstack, username, pos)
|
|||
|
else -- cant add protector
|
|||
|
minetest.chat_send_player(username, S("you can't add this protector!"))
|
|||
|
end
|
|||
|
elseif nodename == modname .. ":terminal" then
|
|||
|
if protector_configurator:check_owner(username, pos) then -- add cords to terminal
|
|||
|
return use_with_terminal(itemstack, username, pos)
|
|||
|
else -- cant add cords to terminal
|
|||
|
minetest.chat_send_player(username, S("you do not own this terminal!"))
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local function copy_to_writer(pos, itemstack)
|
|||
|
local terminal_meta = minetest.get_meta(pos)
|
|||
|
local writer_meta = itemstack:get_meta()
|
|||
|
|
|||
|
writer_meta:set_string("cords", terminal_meta:get_string("cords"))
|
|||
|
return itemstack
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
local function on_place(itemstack, placer, pointed_thing)
|
|||
|
if not placer then return end
|
|||
|
local name = placer:get_player_name()
|
|||
|
|
|||
|
if pointed_thing.type == "node" then
|
|||
|
local node = minetest.get_node(pointed_thing.under).name
|
|||
|
print("node")
|
|||
|
print(node)
|
|||
|
if node ~= modname .. ":terminal" then
|
|||
|
writer_formspec(itemstack, placer)
|
|||
|
return
|
|||
|
end
|
|||
|
if protector_configurator:check_owner(name, pointed_thing.under) then
|
|||
|
minetest.chat_send_player(name, S("coordinates copied to writer"))
|
|||
|
return copy_to_writer(pointed_thing.under, itemstack)
|
|||
|
else
|
|||
|
minetest.chat_send_player(name, S("you do not own this terminal!"))
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
minetest.register_craftitem(modname .. ":writer", {
|
|||
|
|
|||
|
description = S("protect writer") .. "\n"
|
|||
|
.. S("LMB on the protector block to add coordinates to the protect writer’s list") .. "\n"
|
|||
|
.. S("or") .. " " .. S("LMB on the terminal to insert coordinates from the protect writer into the terminal") .. "\n"
|
|||
|
.. S("and") .. " " .. S("shift + RMB to copy coordinates from the terminal to protect writer"),
|
|||
|
|
|||
|
stack_max = 1,
|
|||
|
|
|||
|
inventory_image = modname .. "_writer.png",
|
|||
|
|
|||
|
on_place = on_place,
|
|||
|
|
|||
|
on_secondary_use = writer_formspec,
|
|||
|
|
|||
|
on_use = on_use_writer
|
|||
|
})
|
|||
|
|
|||
|
-----for formspec-----
|
|||
|
|
|||
|
local function clear_writer(player, item)
|
|||
|
if not player then return end
|
|||
|
local meta = item:get_meta()
|
|||
|
meta:set_string("cords", "")
|
|||
|
player:set_wielded_item(item)
|
|||
|
end
|
|||
|
|
|||
|
local function textlist_work(player, field)
|
|||
|
if not player then return end
|
|||
|
local t = field:split(":")
|
|||
|
if t[1] ~= "CHG" then return end
|
|||
|
context[player:get_player_name()] = tonumber(t[2])
|
|||
|
end
|
|||
|
|
|||
|
local function delete(player, item)
|
|||
|
if not player or not item then return end
|
|||
|
local name = player:get_player_name()
|
|||
|
|
|||
|
local idx = context[name]
|
|||
|
if not idx then idx = 1 end
|
|||
|
|
|||
|
local meta = item:get_meta()
|
|||
|
protector_configurator:del_cord_by_index(meta, idx)
|
|||
|
|
|||
|
player:set_wielded_item(item)
|
|||
|
context[name] = nil
|
|||
|
end
|
|||
|
|
|||
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||
|
if formname ~= "protector_configurator:writer_formspec" then return end
|
|||
|
local item = player:get_wielded_item()
|
|||
|
if not item then return end
|
|||
|
if item:get_name() ~= modname .. ":writer" then return end
|
|||
|
|
|||
|
if fields.clear then clear_writer(player, item)
|
|||
|
elseif fields.text_list then textlist_work(player, fields.text_list)
|
|||
|
elseif fields.delete then delete(player, item) end
|
|||
|
|
|||
|
if not fields.exit then writer_formspec(item, player) end
|
|||
|
end)
|
|||
|
|
|||
|
minetest.register_craft({
|
|||
|
output = modname .. ":writer",
|
|||
|
|
|||
|
recipe = {
|
|||
|
{"default:mese_crystal"},
|
|||
|
{"default:steel_ingot"},
|
|||
|
{"default:stick"}
|
|||
|
}
|
|||
|
})
|