mirror of
https://github.com/theFox6/microexpansion.git
synced 2024-11-29 18:33:51 +01:00
356 lines
10 KiB
Lua
356 lines
10 KiB
Lua
local me = microexpansion
|
|
|
|
--technic = rawget(_G, "technic") or {}
|
|
|
|
--local S = technic.getter
|
|
|
|
local S = function(t)
|
|
return t
|
|
end
|
|
|
|
local function get_metadata(toolstack)
|
|
local m = minetest.deserialize(toolstack:get_metadata())
|
|
if not m then m = {} end
|
|
if not m.charge then m.charge = 1000 end
|
|
if not m.page then m.page = 1 end
|
|
if not m.query then m.query = "" end
|
|
if not m.crafts then m.crafts = "false" end
|
|
if not m.inv_name then m.inv_name = "main" end
|
|
if not m.query then m.query = "" end
|
|
return m
|
|
end
|
|
|
|
local function chest_formspec(s, pos, start_id, listname)
|
|
local list
|
|
local page_number = ""
|
|
local buttons = ""
|
|
local net,cpos = me.get_connected_network(pos)
|
|
|
|
if net then
|
|
local inv = net:get_inventory()
|
|
if listname and (inv:get_size(listname) > 0 or net:get_item_capacity() > 0) then
|
|
local ctrlinvname = net:get_inventory_name()
|
|
if listname == "main" then
|
|
list = "list[detached:"..ctrlinvname..";"
|
|
.. listname .. ";0,0.3;8,4;" .. (start_id - 1) .. "]"
|
|
else
|
|
list = "list[current_player;" .. listname .. ";0,0.3;8,4;" .. (start_id - 1) .. "]"
|
|
end
|
|
if minetest.get_modpath("i3") then
|
|
list = list .. [[
|
|
list[current_player;main;0,8.5;9,4;]
|
|
]]
|
|
else
|
|
list = list .. [[
|
|
list[current_player;main;0,8.5;8,1;]
|
|
list[current_player;main;0,9.73;8,3;8]
|
|
]]
|
|
end
|
|
list = list .. [[
|
|
list[current_player;recipe;0.22,5.22;3,3;]
|
|
list[current_player;output;4,6.22;1,1;]
|
|
]]
|
|
list = list .. [[
|
|
listring[current_player;main]
|
|
listring[detached:]]..ctrlinvname..[[;main]
|
|
listring[current_player;main]
|
|
listring[current_player;recipe]
|
|
listring[current_player;main]
|
|
listring[current_player;output]
|
|
listring[current_player;main]
|
|
]]
|
|
buttons = [[
|
|
button[3.56,4.35;1.8,0.9;tochest;To Drive]
|
|
tooltip[tochest;Move everything from your inventory to the ME network.]
|
|
button[5.4,4.35;0.8,0.9;prev;<]
|
|
button[7.25,4.35;0.8,0.9;next;>]
|
|
tooltip[prev;Previous]
|
|
tooltip[next;Next]
|
|
field[0.29,4.6;2.2,1;filter;;]]..s.query..[[]
|
|
button[2.1,4.5;0.8,0.5;search;?]
|
|
button[2.75,4.5;0.8,0.5;clear;X]
|
|
tooltip[search;Search]
|
|
tooltip[clear;Reset]
|
|
field[6,5.42;2,1;autocraft;;1]
|
|
tooltip[autocraft;Number of items to Craft]
|
|
checkbox[6,6.45;crafts;crafts;]]..s.crafts..[[]
|
|
tooltip[crafts;Show only craftable items]
|
|
]]
|
|
else
|
|
list = "label[3,2;" .. minetest.colorize("red", "No connected storage!") .. "]"
|
|
end
|
|
else
|
|
list = "label[3,2;" .. minetest.colorize("red", "No connected network!") .. "]"
|
|
end
|
|
if s.page_max then
|
|
page_number = "label[6.15,4.5;" .. math.floor((start_id / 32)) + 1 ..
|
|
"/" .. s.page_max .."]"
|
|
end
|
|
|
|
return [[
|
|
size[9,12.5]
|
|
]]..
|
|
microexpansion.gui_bg ..
|
|
microexpansion.gui_slots ..
|
|
list ..
|
|
[[
|
|
label[0,-0.23;ME Remote Crafting Terminal]
|
|
label[5,-0.23;Charge level: ]]..s.charge..[[]
|
|
field_close_on_enter[filter;false]
|
|
field_close_on_enter[autocraft;false]
|
|
]]..
|
|
page_number ..
|
|
buttons
|
|
end
|
|
|
|
minetest.register_tool("microexpansion:remote", {
|
|
description = S("Microexpansion Remote"),
|
|
inventory_image = "technic_prospector.png",
|
|
wear_represents = "technic_RE_charge",
|
|
on_refill = technic.refill_RE_charge,
|
|
on_use = function(toolstack, user, pointed_thing)
|
|
if not user or not user:is_player() or user.is_fake_player then return end
|
|
local toolmeta = get_metadata(toolstack)
|
|
if pointed_thing.type == "node" then
|
|
local pos = pointed_thing.under
|
|
pos.z = pos.z - 1
|
|
local net,cpos = me.get_connected_network(pos)
|
|
if net then
|
|
if not net:powered(user:get_player_name()) then return end
|
|
minetest.chat_send_player(user:get_player_name(), "Connected to ME network, right-click to use.")
|
|
toolmeta.terminal = pos
|
|
local pinv = user:get_inventory()
|
|
pinv:set_size("recipe", 3*3)
|
|
pinv:set_size("output", 1)
|
|
toolstack:set_metadata(minetest.serialize(toolmeta))
|
|
user:set_wielded_item(toolstack)
|
|
else
|
|
minetest.chat_send_player(user:get_player_name(), "Left-click on ME block to connect to ME network.")
|
|
return
|
|
end
|
|
end
|
|
end,
|
|
on_secondary_use = function(toolstack, user, pointed_thing)
|
|
if not user or not user:is_player() or user.is_fake_player then return end
|
|
local toolmeta = get_metadata(toolstack)
|
|
local pos = toolmeta.terminal
|
|
if not pos then
|
|
minetest.chat_send_player(user:get_player_name(), "Left-click on ME block to connect to ME network.")
|
|
return
|
|
end
|
|
local net,cpos = me.get_connected_network(pos)
|
|
|
|
local charge_to_take = 100
|
|
if net then
|
|
-- 25 to 1062 eu per operation, rich people pay for distance.
|
|
local distance = vector.distance(net.controller_pos, user:get_pos())
|
|
local charge_to_take = math.pow(math.log(distance),2) * 10
|
|
end
|
|
|
|
if toolmeta.charge < charge_to_take then
|
|
minetest.chat_send_player(user:get_player_name(), "No power left, recharge in technic battery.")
|
|
return
|
|
end
|
|
|
|
if technic and not technic.creative_mode then
|
|
toolmeta.charge = toolmeta.charge - charge_to_take
|
|
toolstack:set_metadata(minetest.serialize(toolmeta))
|
|
technic.set_RE_wear(toolstack, toolmeta.charge, technic.power_tools[toolstack:get_name()])
|
|
end
|
|
|
|
if net and not net:powered(user:get_player_name()) then return end
|
|
|
|
local page = toolmeta.page
|
|
local inv_name = toolmeta.inv_name
|
|
local query = toolmeta.query
|
|
local crafts = toolmeta.crafts
|
|
|
|
local inv
|
|
local own_inv = user:get_inventory()
|
|
local ctrl_inv
|
|
if net then
|
|
ctrl_inv = net:get_inventory()
|
|
end
|
|
if inv_name == "main" then
|
|
inv = ctrl_inv
|
|
else
|
|
inv = own_inv
|
|
end
|
|
if net then
|
|
toolmeta.page_max = math.floor(inv:get_size(inv_name) / 32) + 1
|
|
toolstack:set_metadata(minetest.serialize(toolmeta))
|
|
end
|
|
|
|
minetest.show_formspec(user:get_player_name(), "microexpansion:remote_control",
|
|
chest_formspec(toolmeta, pos, page, inv_name))
|
|
|
|
return toolstack
|
|
end,
|
|
})
|
|
|
|
minetest.register_on_player_receive_fields(function(user, formname, fields)
|
|
if formname ~= "microexpansion:remote_control" then return false end
|
|
if not user or not user:is_player() or user.is_fake_player then return end
|
|
local toolstack = user:get_wielded_item()
|
|
if toolstack:get_name() ~= "microexpansion:remote" then return true end
|
|
|
|
local toolmeta = get_metadata(toolstack)
|
|
|
|
local pos = toolmeta.terminal
|
|
local net
|
|
if pos then
|
|
net = me.get_connected_network(pos)
|
|
end
|
|
|
|
local page_max
|
|
local inv
|
|
local own_inv = user:get_inventory()
|
|
local ctrl_inv
|
|
if net then
|
|
ctrl_inv = net:get_inventory()
|
|
end
|
|
local inv_name = toolmeta.inv_name
|
|
if inv_name == "main" then
|
|
inv = ctrl_inv
|
|
else
|
|
inv = own_inv
|
|
end
|
|
|
|
local page = toolmeta.page
|
|
local did_update = false
|
|
local update_search = false
|
|
local do_autocraft = false
|
|
for field, value in pairs(fields) do
|
|
me.log("REMOTE: form "..field.." value "..value, "error")
|
|
if field == "next" then
|
|
if page + 32 <= inv:get_size(inv_name) then
|
|
page = page + 32
|
|
toolmeta.page = page
|
|
did_update = true
|
|
end
|
|
elseif field == "prev" then
|
|
if page - 32 >= 1 then
|
|
page = page - 32
|
|
toolmeta.page = page
|
|
did_update = true
|
|
end
|
|
elseif field == "crafts" then
|
|
toolmeta.crafts = value
|
|
page = 1
|
|
toolmeta.page = page
|
|
update_search = true
|
|
elseif (field == "key_enter_field" and value == "filter")
|
|
or field == "filter" or field == "search" then
|
|
if field == "filter" then
|
|
toolmeta.query = value
|
|
end
|
|
if (field == "key_enter_field" and value == "filter") or field == "search" then
|
|
page = 1
|
|
toolmeta.page = page
|
|
update_search = true
|
|
end
|
|
elseif field == "clear" then
|
|
own_inv:set_size("me_search", 0)
|
|
own_inv:set_size("me_crafts", 0)
|
|
page = 1
|
|
toolmeta.page = page
|
|
toolmeta.inv_name = "main"
|
|
toolmeta.query = ""
|
|
toolmeta.crafts = "false"
|
|
toolmeta.page_max = math.floor(inv:get_size(inv_name) / 32) + 1
|
|
update_search = true
|
|
did_update = true
|
|
elseif field == "tochest" then
|
|
elseif field == "autocraft" then
|
|
if tonumber(value) ~= nil then
|
|
toolmeta.autocraft = value
|
|
end
|
|
elseif field == "key_enter_field" and value == "autocraft" then
|
|
local count = tonumber(toolmeta.autocraft)
|
|
if not own_inv:get_stack("output", 1):is_empty() and count < math.pow(2,16) then
|
|
do_autocraft = true
|
|
end
|
|
end
|
|
end
|
|
|
|
if do_autocraft then
|
|
local count = tonumber(toolmeta.autocraft)
|
|
me.autocraft(me.autocrafterCache, pos, net, own_inv, ctrl_inv, count)
|
|
end
|
|
|
|
if update_search then
|
|
inv_name = "main"
|
|
if toolmeta.crafts == "true" then
|
|
inv_name = "me_crafts"
|
|
local tab = {}
|
|
if net then
|
|
if not net.process then
|
|
net:reload_network()
|
|
end
|
|
for name,pos in pairs(net.autocrafters) do
|
|
tab[#tab + 1] = ItemStack(name)
|
|
end
|
|
tab[#tab + 1] = ItemStack("")
|
|
for name,pos in pairs(net.process) do
|
|
tab[#tab + 1] = ItemStack(name)
|
|
end
|
|
end
|
|
own_inv:set_size(inv_name, #tab)
|
|
own_inv:set_list(inv_name, tab)
|
|
toolmeta.inv_name = inv_name
|
|
page_max = math.floor(own_inv:get_size(inv_name) / 32) + 1
|
|
toolmeta.page_max = page_max
|
|
did_update = true
|
|
else
|
|
if toolmeta.query == "" then
|
|
own_inv:set_size("me_crafts", 0)
|
|
toolmeta.inv_name = inv_name
|
|
page_max = math.floor(ctrl_inv:get_size(inv_name) / 32) + 1
|
|
toolmeta.page_max = page_max
|
|
did_update = true
|
|
end
|
|
end
|
|
if toolmeta.query ~= "" then
|
|
inv = own_inv
|
|
if inv_name == "main" then
|
|
inv = ctrl_inv
|
|
end
|
|
local tab = {}
|
|
for i = 1, inv:get_size(inv_name) do
|
|
local match = inv:get_stack(inv_name, i):get_name():find(toolmeta.query)
|
|
if match then
|
|
tab[#tab + 1] = inv:get_stack(inv_name, i)
|
|
end
|
|
end
|
|
inv_name = "me_search"
|
|
own_inv:set_size(inv_name, #tab)
|
|
own_inv:set_list(inv_name, tab)
|
|
toolmeta.inv_name = inv_name
|
|
page_max = math.floor(own_inv:get_size(inv_name) / 32) + 1
|
|
toolmeta.page_max = page_max
|
|
did_update = true
|
|
end
|
|
end
|
|
|
|
if did_update then
|
|
minetest.show_formspec(user:get_player_name(), "microexpansion:remote_control",
|
|
chest_formspec(toolmeta, pos, page, inv_name))
|
|
end
|
|
toolstack:set_metadata(minetest.serialize(toolmeta))
|
|
user:set_wielded_item(toolstack)
|
|
return true
|
|
end)
|
|
|
|
minetest.register_craft({
|
|
output = "microexpansion:remote",
|
|
recipe = {
|
|
{"basic_materials:brass_ingot", "", "pipeworks:teleport_tube_1"},
|
|
{"", (technic and "technic:control_logic_unit") or "", "basic_materials:brass_ingot"},
|
|
{"", "", ""},
|
|
}
|
|
})
|
|
|
|
if technic then
|
|
technic.register_power_tool("microexpansion:remote", 450000)
|
|
end
|