Try to fix some bugs that happen on server restart

This commit is contained in:
Novatux 2014-07-01 18:42:52 +02:00
parent d532e646f6
commit 99a902a8b8
1 changed files with 42 additions and 30 deletions

View File

@ -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
elseif math.abs(vel.z) == 1 then
local next_node = math.abs(pos.z-self.start_pos.z)
local next_node = math.abs(pos.y - self.start_pos.y)
if next_node >= 1 then
self.start_pos.z = self.start_pos.z+vel.z
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)
if next_node >= 1 then
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