diff options
Diffstat (limited to 'item_transport.lua')
-rw-r--r-- | item_transport.lua | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/item_transport.lua b/item_transport.lua index ab1ce55..43adeea 100644 --- a/item_transport.lua +++ b/item_transport.lua @@ -1,3 +1,8 @@ +local luaentity = pipeworks.luaentity +local enable_max_limit = minetest.setting_get("pipeworks_enable_items_per_tube_limit") +local max_tube_limit = tonumber(minetest.setting_get("pipeworks_max_items_per_tube")) or 30 +if enable_max_limit == nil then enable_max_limit = true end + function pipeworks.tube_item(pos, item) error("obsolete pipeworks.tube_item() called; change caller to use pipeworks.tube_inject_item() instead") end @@ -29,6 +34,21 @@ function pipeworks.notvel(tbl, vel) return tbl2 end +local tube_item_count = {} + +minetest.register_globalstep(function(dtime) + if not luaentity.entities then + return + end + tube_item_count = {} + for id, entity in pairs(luaentity.entities) do + if entity.name == "pipeworks:tubed_item" then + local h = minetest.hash_node_position(vector.round(entity._pos)) + tube_item_count[h] = (tube_item_count[h] or 0) + 1 + end + end +end) + local function go_next(pos, velocity, stack) local next_positions = {} local max_priority = 0 @@ -55,7 +75,7 @@ local function go_next(pos, velocity, stack) end for _, vect in ipairs(can_go) do local npos = vector.add(pos, vect) - minetest.load_position(npos) + pipeworks.load_position(npos) local node = minetest.get_node(npos) local reg_node = minetest.registered_nodes[node.name] if reg_node then @@ -75,6 +95,17 @@ local function go_next(pos, velocity, stack) end end + if enable_max_limit then + local h = minetest.hash_node_position(pos) + local itemcount = tube_item_count[h] or 0 + if itemcount > max_tube_limit then + cmeta:set_string("the_tube_was", minetest.serialize(cnode)) + print("[Pipeworks] Warning - a tube at "..minetest.pos_to_string(pos).." broke due to too many items ("..itemcount..")") + minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"}) + pipeworks.scan_for_tube_objects(pos) + end + end + if not next_positions[1] then return false, nil end @@ -200,15 +231,13 @@ luaentity.register_entity("pipeworks:tubed_item", { end, on_step = function(self, dtime) + local pos = self:getpos() if self.start_pos == nil then - local pos = self:getpos() self.start_pos = vector.round(pos) self:setpos(pos) end - local pos = self:getpos() local stack = ItemStack(self.itemstring) - local drop_pos local velocity = self:getvelocity() @@ -219,13 +248,14 @@ luaentity.register_entity("pipeworks:tubed_item", { moved = true end local vel = {x = velocity.x / speed, y = velocity.y / speed, z = velocity.z / speed, speed = speed} + local moved_by = vector.distance(pos, self.start_pos) - if vector.distance(pos, self.start_pos) >= 1 then + if moved_by >= 1 then self.start_pos = vector.add(self.start_pos, vel) moved = true end - minetest.load_position(self.start_pos) + pipeworks.load_position(self.start_pos) local node = minetest.get_node(self.start_pos) if moved and minetest.get_item_group(node.name, "tubedevice_receiver") == 1 then local leftover @@ -239,6 +269,7 @@ luaentity.register_entity("pipeworks:tubed_item", { return end velocity = vector.multiply(velocity, -1) + self:setpos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1))) self:setvelocity(velocity) self:set_item(leftover:to_string()) return @@ -251,24 +282,25 @@ luaentity.register_entity("pipeworks:tubed_item", { local rev_node = minetest.get_node(vector.round(vector.add(self.start_pos,rev_dir))) local tube_present = minetest.get_item_group(rev_node.name,"tubedevice") == 1 if not found_next then - if pipeworks.drop_on_routing_fail or not tube_present then - drop_pos = minetest.find_node_near(vector.add(self.start_pos, velocity), 1, "air") - if drop_pos then - -- Using add_item instead of item_drop since this makes pipeworks backward - -- compatible with Minetest 0.4.13. - -- Using item_drop here makes Minetest 0.4.13 crash. - minetest.add_item(drop_pos, stack) - self:remove() - return - end + if pipeworks.drop_on_routing_fail or not tube_present or + minetest.get_item_group(rev_node.name,"tube") ~= 1 then + -- Using add_item instead of item_drop since this makes pipeworks backward + -- compatible with Minetest 0.4.13. + -- Using item_drop here makes Minetest 0.4.13 crash. + local dropped_item = minetest.add_item(self.start_pos, stack) + dropped_item:setvelocity(vector.multiply(velocity, 5)) + self:remove() + return else velocity = vector.multiply(velocity, -1) + self:setpos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1))) self:setvelocity(velocity) end end if new_velocity and not vector.equals(velocity, new_velocity) then - self:setpos(self.start_pos) + local nvelr = math.abs(new_velocity.x + new_velocity.y + new_velocity.z) + self:setpos(vector.add(self.start_pos, vector.multiply(new_velocity, (moved_by - 1) / nvelr))) self:setvelocity(new_velocity) end end |