minetest-mm/mods/ts_workshop/init.lua
2024-12-19 12:55:40 +01:00

190 lines
No EOL
6.1 KiB
Lua
Executable file

ts_workshop = {}
function ts_workshop.register_workshop(mod, name, def)
if not ts_workshop[mod] then
ts_workshop[mod] = {}
end
if not ts_workshop[mod][name] then
ts_workshop[mod][name] = {}
end
ts_workshop[mod][name].enough_supply = def.enough_supply
ts_workshop[mod][name].remove_supply_raw = def.remove_supply
ts_workshop[mod][name].update_formspec_raw = def.update_formspec
ts_workshop[mod][name].update_inventory_raw = def.update_inventory
ts_workshop[mod][name].remove_supply = function(pos, selection)
ts_workshop[mod][name].remove_supply_raw(pos, selection)
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].start = function(pos)
local node = minetest.get_node(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
if node.name ~= mod .. ":" .. name or not ts_workshop[mod][name] then
return
end
local meta = minetest.get_meta(pos)
if meta:get_string("working_on") ~= "" then
return
end
local selection = meta:get_string("selection")
if selection and selection ~= "" then
if not ts_workshop[mod][name].enough_supply(pos, selection) then
return
end
else
return
end
local inv = meta:get_inventory()
if not inv:room_for_item("output", { name = selection, count = 1 }) then
return
end
meta:set_string("working_on", selection)
meta:set_int("progress", 0)
ts_workshop[mod][name].remove_supply(pos, selection)
ts_workshop[mod][name].step(pos)
end
ts_workshop[mod][name].step = function(pos)
local node = minetest.get_node(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
if node.name ~= mod .. ":" .. name or not ts_workshop[mod][name] then
return
end
local meta = minetest.get_meta(pos)
local working_on = meta:get_string("working_on")
if working_on == "" then
return
end
local progress = meta:get_int("progress")
progress = progress + 1
local duration = 10
if minetest.registered_items[working_on] and
minetest.registered_items[working_on].workshop_duration then
duration = minetest.registered_items[working_on].workshop_duration
end
if progress < duration then
meta:set_int("progress", progress)
local timer = minetest.get_node_timer(pos)
timer:start(0.2)
else
progress = 0
meta:set_int("progress", progress)
local inv = meta:get_inventory()
inv:add_item("output", working_on)
meta:set_string("working_on", "")
ts_workshop[mod][name].start(pos)
end
ts_workshop[mod][name].update_formspec(pos)
end
ts_workshop[mod][name].update_formspec = function(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
local node = minetest.get_node(pos)
if node.name ~= mod .. ":" .. name or not ts_workshop[mod][name] then
return
end
ts_workshop[mod][name].update_formspec_raw(pos)
end
ts_workshop[mod][name].update_inventory = function(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
local node = minetest.get_node(pos)
if node.name ~= mod .. ":" .. name or not ts_workshop[mod][name] then
return
end
ts_workshop[mod][name].update_inventory_raw(pos)
ts_workshop[mod][name].update_formspec(pos)
ts_workshop[mod][name].start(pos)
end
ts_workshop[mod][name].on_receive_fields = function(pos, formname, fields, sender)
def.on_receive_fields(pos, formname, fields, sender)
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].on_construct = function(pos)
def.on_construct(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
return def.allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
end
ts_workshop[mod][name].allow_metadata_inventory_put = function(pos, listname, index, stack, player)
return def.allow_metadata_inventory_put(pos, listname, index, stack, player)
end
ts_workshop[mod][name].allow_metadata_inventory_take = function(pos, listname, index, stack, player)
return def.allow_metadata_inventory_take(pos, listname, index, stack, player)
end
ts_workshop[mod][name].on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].on_metadata_inventory_put = function(pos, listname, index, stack, player)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].on_metadata_inventory_take = function(pos, listname, index, stack, player)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].can_dig = function(pos, player)
return def.can_dig(pos, player)
end
local ndef = table.copy(def)
ndef.on_receive_fields = ts_workshop[mod][name].on_receive_fields
ndef.on_construct = ts_workshop[mod][name].on_construct
ndef.allow_metadata_inventory_move = ts_workshop[mod][name].allow_metadata_inventory_move
ndef.allow_metadata_inventory_put = ts_workshop[mod][name].allow_metadata_inventory_put
ndef.allow_metadata_inventory_take = ts_workshop[mod][name].allow_metadata_inventory_take
ndef.on_metadata_inventory_move = ts_workshop[mod][name].on_metadata_inventory_move
ndef.on_metadata_inventory_put = ts_workshop[mod][name].on_metadata_inventory_put
ndef.on_metadata_inventory_take = ts_workshop[mod][name].on_metadata_inventory_take
ndef.can_dig = ts_workshop[mod][name].can_dig
ndef.on_timer = function(pos, elapsed)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].step(pos)
end
minetest.register_node(mod .. ":" .. name, ndef)
end