mirror of
https://github.com/theFox6/microexpansion.git
synced 2024-11-22 15:13:51 +01:00
176 lines
5.1 KiB
Lua
176 lines
5.1 KiB
Lua
-- power/ctrl.lua
|
|
|
|
local me = microexpansion
|
|
local network = me.network
|
|
|
|
local function update_ctrl(pos)
|
|
local cnetwork = me.get_network(pos)
|
|
if cnetwork == nil then
|
|
minetest.log("error","no network for ctrl at pos "..minetest.pos_to_string(pos))
|
|
return
|
|
end
|
|
local size = cnetwork:get_item_capacity()
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("main", me.int_to_stacks(size))
|
|
end
|
|
|
|
function me.insert_item(stack, inv, listname)
|
|
if me.settings.huge_stacks == false then
|
|
inv:add_item(listname, stack)
|
|
return
|
|
end
|
|
local stack_name
|
|
local stack_count
|
|
if type(stack) == "string" then
|
|
local split_string = stack:split(" ")
|
|
stack_name = split_string[1]
|
|
if (#split_string > 1) then
|
|
stack_count = tonumber(split_string[2])
|
|
else
|
|
stack_count = 1
|
|
end
|
|
else
|
|
stack_name = stack:get_name()
|
|
stack_count = stack:get_count()
|
|
end
|
|
local found = false
|
|
for i = 0, inv:get_size(listname) do
|
|
local inside = inv:get_stack(listname, i)
|
|
if inside:get_name() == stack_name then
|
|
local total_count = inside:get_count() + stack_count
|
|
-- bigger item count is not possible we only have unsigned 16 bit
|
|
if total_count <= math.pow(2,16) then
|
|
if not inside:set_count(total_count) then
|
|
minetest.log("error"," adding items to stack in microexpansion network failed")
|
|
print("stack is now " .. inside:to_string())
|
|
end
|
|
inv:set_stack(listname, i, inside)
|
|
found = true
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
if not found then
|
|
inv:add_item(listname, stack)
|
|
end
|
|
end
|
|
|
|
-- [register node] Controller
|
|
me.register_node("ctrl", {
|
|
description = "ME Controller",
|
|
tiles = {
|
|
"ctrl_sides",
|
|
"ctrl_bottom",
|
|
"ctrl_sides",
|
|
"ctrl_sides",
|
|
"ctrl_sides",
|
|
"ctrl_sides"
|
|
},
|
|
drawtype = "nodebox",
|
|
paramtype = "light",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.375, -0.375, -0.375, 0.375, 0.375, 0.375}, -- Core
|
|
{0.1875, -0.5, -0.5, 0.5, 0.5, -0.1875}, -- Corner1
|
|
{-0.5, -0.5, -0.5, -0.1875, 0.5, -0.1875}, -- Corner2
|
|
{-0.5, -0.5, 0.1875, -0.1875, 0.5, 0.5}, -- Corner3
|
|
{0.1875, -0.5, 0.1875, 0.5, 0.5, 0.5}, -- Corner4
|
|
{-0.5, -0.4375, -0.5, 0.5, -0.1875, 0.5}, -- Bottom
|
|
{-0.5, 0.1875, -0.5, 0.5, 0.5, -0.1875}, -- Top1
|
|
{0.1875, 0.1875, -0.5, 0.5, 0.5, 0.5}, -- Top2
|
|
{-0.5, 0.1875, -0.5, -0.1875, 0.5, 0.5}, -- Top3
|
|
{-0.5, 0.1875, 0.1875, 0.5, 0.5, 0.5}, -- Top4
|
|
{-0.1875, -0.5, -0.1875, 0.1875, -0.25, 0.1875}, -- Bottom2
|
|
},
|
|
},
|
|
groups = { cracky = 1, me_connect = 1, },
|
|
connect_sides = "nobottom",
|
|
me_update = update_ctrl,
|
|
after_place_node = function(pos, player)
|
|
local name = player:get_player_name()
|
|
local meta = minetest.get_meta(pos)
|
|
table.insert(me.networks,network:new({controller_pos = pos}))
|
|
me.update_connected_machines(pos)
|
|
|
|
meta:set_string("infotext", "Network Controller (owned by "..name..")")
|
|
meta:set_string("owner", name)
|
|
end,
|
|
on_destruct = function(pos)
|
|
local net,idx = me.get_network(pos)
|
|
if net then
|
|
net.controller_pos = nil
|
|
end
|
|
if idx then
|
|
table.remove(me.networks,idx)
|
|
end
|
|
end,
|
|
after_dig_node = function(pos)
|
|
me.update_connected_machines(pos)
|
|
end,
|
|
allow_metadata_inventory_put = function(pos, listname, index, stack)
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
local inside_stack = inv:get_stack(listname, index)
|
|
local stack_name = stack:get_name()
|
|
-- improve performance by skipping unnessecary calls
|
|
if inside_stack:get_name() ~= stack_name or inside_stack:get_count() >= inside_stack:get_stack_max() then
|
|
if inv:get_stack(listname, index+1):get_name() ~= "" then
|
|
return stack:get_count()
|
|
end
|
|
end
|
|
local max_slots = inv:get_size(listname)
|
|
local max_items = math.floor(max_slots * 99)
|
|
|
|
local slots, items = 0, 0
|
|
-- Get amount of items in drive
|
|
for i = 1, max_slots do
|
|
local dstack = inv:get_stack("main", i)
|
|
if dstack:get_name() ~= "" then
|
|
slots = slots + 1
|
|
local num = dstack:get_count()
|
|
if num == 0 then num = 1 end
|
|
items = items + num
|
|
end
|
|
end
|
|
return math.max(math.min(stack:get_count(),max_items-items),0)
|
|
end,
|
|
on_metadata_inventory_put = function(pos, listname, _, stack)
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
inv:remove_item(listname, stack)
|
|
me.insert_item(stack, inv, listname)
|
|
end,
|
|
allow_metadata_inventory_take = function(_, _, _, stack)
|
|
return math.min(stack:get_count(),stack:get_stack_max())
|
|
end,
|
|
machine = {
|
|
type = "transporter",
|
|
},
|
|
})
|
|
|
|
-- [register node] Cable
|
|
me.register_machine("cable", {
|
|
description = "ME Cable",
|
|
tiles = {
|
|
"cable",
|
|
},
|
|
drawtype = "nodebox",
|
|
node_box = {
|
|
type = "connected",
|
|
fixed = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25},
|
|
connect_top = {-0.25, -0.25, -0.25, 0.25, 0.5, 0.25}, -- y+
|
|
connect_bottom = {-0.25, -0.5, -0.25, 0.25, 0.25, 0.25}, -- y-
|
|
connect_front = {-0.25, -0.25, -0.5, 0.25, 0.25, 0.25}, -- z-
|
|
connect_back = {-0.25, -0.25, 0.25, 0.25, 0.25, 0.5 }, -- z+
|
|
connect_left = {-0.5, -0.25, -0.25, 0.25, 0.25, 0.25}, -- x-
|
|
connect_right = {-0.25, -0.25, -0.25, 0.5, 0.25, 0.25}, -- x+
|
|
},
|
|
paramtype = "light",
|
|
groups = { crumbly = 1, },
|
|
after_place_node = me.update_connected_machines,
|
|
after_dig_node = me.update_connected_machines,
|
|
machine = {
|
|
type = "transporter",
|
|
},
|
|
})
|