From 99a902a8b88bb0bf6a76f91c608cb07478c0efb9 Mon Sep 17 00:00:00 2001 From: Novatux Date: Tue, 1 Jul 2014 18:42:52 +0200 Subject: Try to fix some bugs that happen on server restart --- item_transport.lua | 70 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/item_transport.lua b/item_transport.lua index 06a020b..558ea0d 100644 --- a/item_transport.lua +++ b/item_transport.lua @@ -353,15 +353,16 @@ minetest.register_entity("pipeworks:tubed_item", { hp_max = 1, physical = false, -- collisionbox = {0,0,0,0,0,0}, - collisionbox = {0.1,0.1,0.1,0.1,0.1,0.1}, + collisionbox = {0.1, 0.1, 0.1, 0.1, 0.1, 0.1}, visual = "sprite", - visual_size = {x=0.5, y=0.5}, + visual_size = {x = 0.5, y = 0.5}, textures = {""}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, + spritediv = {x = 1, y = 1}, + initial_sprite_basepos = {x = 0, y = 0}, is_visible = false, - start_pos={}, - route={} + start_pos = {}, + route = {}, + removed = false }, itemstring = '', @@ -389,23 +390,25 @@ minetest.register_entity("pipeworks:tubed_item", { if item_texture and item_texture ~= "" then prop.visual = "sprite" prop.textures = {item_texture} - prop.visual_size = {x=0.3, y=0.3} + prop.visual_size = {x = 0.3, y = 0.3} else prop.visual = "wielditem" prop.textures = {itemname} - prop.visual_size = {x=0.15, y=0.15} + prop.visual_size = {x = 0.15, y = 0.15} end self.object:set_properties(prop) end, get_staticdata = function(self) - if self.start_pos==nil then return end - local velocity=self.object:getvelocity() + if self.start_pos == nil or self.removed then + return + end + local velocity = self.object:getvelocity() self.object:setpos(self.start_pos) return minetest.serialize({ - itemstring=self.itemstring, - velocity=velocity, - start_pos=self.start_pos + itemstring = self.itemstring, + velocity = velocity, + start_pos = self.start_pos }) end, @@ -427,11 +430,20 @@ minetest.register_entity("pipeworks:tubed_item", { end self:set_item(item.itemstring) end, + + remove = function(self) + self.object:remove() + self.removed = true + self.itemstring = '' + end, on_step = function(self, dtime) - if self.start_pos==nil then + if self.removed then + return + end + if self.start_pos == nil then local pos = self.object:getpos() - self.start_pos=roundpos(pos) + self.start_pos = roundpos(pos) end local pos = self.object:getpos() local node = minetest.get_node(pos) @@ -440,32 +452,32 @@ minetest.register_entity("pipeworks:tubed_item", { local stack = ItemStack(self.itemstring) local drop_pos = nil - local velocity=self.object:getvelocity() + local velocity = self.object:getvelocity() if velocity == nil then return end local velocitycopy = {x = velocity.x, y = velocity.y, z = velocity.z} local moved = false - local speed = math.abs(velocity.x+velocity.y+velocity.z) - local vel = {x = velocity.x/speed, y = velocity.y/speed, z = velocity.z/speed, speed = speed} + local speed = math.abs(velocity.x + velocity.y + velocity.z) + local vel = {x = velocity.x / speed, y = velocity.y / speed, z = velocity.z / speed, speed = speed} if math.abs(vel.x) == 1 then - local next_node = math.abs(pos.x-self.start_pos.x) + local next_node = math.abs(pos.x - self.start_pos.x) if next_node >= 1 then - self.start_pos.x = self.start_pos.x+vel.x + self.start_pos.x = self.start_pos.x + vel.x moved = true end elseif math.abs(vel.y) == 1 then - local next_node = math.abs(pos.y-self.start_pos.y) - if next_node >= 1 then - self.start_pos.y = self.start_pos.y+vel.y - moved = true - end + local next_node = math.abs(pos.y - self.start_pos.y) + if next_node >= 1 then + self.start_pos.y = self.start_pos.y + vel.y + moved = true + end elseif math.abs(vel.z) == 1 then - local next_node = math.abs(pos.z-self.start_pos.z) + local next_node = math.abs(pos.z - self.start_pos.z) if next_node >= 1 then - self.start_pos.z = self.start_pos.z+vel.z + self.start_pos.z = self.start_pos.z + vel.z moved = true end end @@ -481,7 +493,7 @@ minetest.register_entity("pipeworks:tubed_item", { leftover = stack end if leftover:is_empty() then - self.object:remove() + self:remove() return end velocity.x = -velocity.x @@ -497,7 +509,7 @@ minetest.register_entity("pipeworks:tubed_item", { drop_pos = minetest.find_node_near(vector.add(self.start_pos, velocity), 1, "air") if drop_pos then minetest.item_drop(stack, "", drop_pos) - self.object:remove() + self:remove() end end end -- cgit v1.2.3