forked from VoxeLibre/VoxeLibre
Refactor item entity physics code
This commit is contained in:
parent
55623644a3
commit
be5d1c08db
|
@ -28,6 +28,30 @@ local check_pickup_achievements = function(object, player)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local enable_physics = function(object, luaentity)
|
||||||
|
if luaentity.physical_state == false then
|
||||||
|
luaentity.physical_state = true
|
||||||
|
object:set_properties({
|
||||||
|
physical = true
|
||||||
|
})
|
||||||
|
object:set_velocity({x=0,y=0,z=0})
|
||||||
|
object:set_acceleration({x=0,y=-get_gravity(),z=0})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local disable_physics = function(object, luaentity, reset_movement)
|
||||||
|
if luaentity.physical_state == true then
|
||||||
|
luaentity.physical_state = false
|
||||||
|
object:set_properties({
|
||||||
|
physical = false
|
||||||
|
})
|
||||||
|
if reset_movement ~= false then
|
||||||
|
object:set_velocity({x=0,y=0,z=0})
|
||||||
|
object:set_acceleration({x=0,y=0,z=0})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_globalstep(function(dtime)
|
minetest.register_globalstep(function(dtime)
|
||||||
for _,player in ipairs(minetest.get_connected_players()) do
|
for _,player in ipairs(minetest.get_connected_players()) do
|
||||||
if player:get_hp() > 0 or not minetest.setting_getbool("enable_damage") then
|
if player:get_hp() > 0 or not minetest.setting_getbool("enable_damage") then
|
||||||
|
@ -72,10 +96,7 @@ minetest.register_globalstep(function(dtime)
|
||||||
vec = vector.add(opos, vector.divide(vec, 2))
|
vec = vector.add(opos, vector.divide(vec, 2))
|
||||||
object:moveto(vec)
|
object:moveto(vec)
|
||||||
|
|
||||||
object:get_luaentity().physical_state = false
|
disable_physics(object, object:get_luaentity(), false)
|
||||||
object:get_luaentity().object:set_properties({
|
|
||||||
physical = false
|
|
||||||
})
|
|
||||||
|
|
||||||
--fix eternally falling items
|
--fix eternally falling items
|
||||||
minetest.after(0, function(object)
|
minetest.after(0, function(object)
|
||||||
|
@ -110,11 +131,7 @@ minetest.register_globalstep(function(dtime)
|
||||||
object:get_luaentity().itemstring = ""
|
object:get_luaentity().itemstring = ""
|
||||||
object:remove()
|
object:remove()
|
||||||
else
|
else
|
||||||
object:setvelocity({x=0,y=0,z=0})
|
enable_physics(object, object:get_luaentity())
|
||||||
object:get_luaentity().physical_state = true
|
|
||||||
object:get_luaentity().object:set_properties({
|
|
||||||
physical = true
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
end, {player, object})
|
end, {player, object})
|
||||||
end
|
end
|
||||||
|
@ -387,20 +404,12 @@ core.register_entity(":__builtin:item", {
|
||||||
-- If no collector was found for a long enough time, declare the magnet as disabled
|
-- If no collector was found for a long enough time, declare the magnet as disabled
|
||||||
if self._magnet_active and (self._collector_timer == nil or (self._collector_timer > item_drop_settings.magnet_time)) then
|
if self._magnet_active and (self._collector_timer == nil or (self._collector_timer > item_drop_settings.magnet_time)) then
|
||||||
self._magnet_active = false
|
self._magnet_active = false
|
||||||
self.object:setvelocity({x=0,y=0,z=0})
|
enable_physics(self.object, self)
|
||||||
self.object:setacceleration({x = 0, y = -get_gravity(), z = 0})
|
|
||||||
self.physical_state = true
|
|
||||||
self.object:set_properties({physical = true})
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if in_unloaded then
|
if in_unloaded then
|
||||||
if self.physical_state == true then
|
|
||||||
-- Don't infinetly fall into unloaded map
|
-- Don't infinetly fall into unloaded map
|
||||||
self.object:setvelocity({x = 0, y = 0, z = 0})
|
disable_physics(self.object, self)
|
||||||
self.object:setacceleration({x = 0, y = 0, z = 0})
|
|
||||||
self.physical_state = false
|
|
||||||
self.object:set_properties({physical = false})
|
|
||||||
end
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -469,10 +478,7 @@ core.register_entity(":__builtin:item", {
|
||||||
self.object:setacceleration({x = 0, y = 0, z = 0})
|
self.object:setacceleration({x = 0, y = 0, z = 0})
|
||||||
self.object:setvelocity(newv)
|
self.object:setvelocity(newv)
|
||||||
|
|
||||||
self.physical_state = false
|
disable_physics(self.object, self, false)
|
||||||
self.object:set_properties({
|
|
||||||
physical = false
|
|
||||||
})
|
|
||||||
|
|
||||||
if shootdir.y == 0 then
|
if shootdir.y == 0 then
|
||||||
self._force = newv
|
self._force = newv
|
||||||
|
@ -499,20 +505,14 @@ core.register_entity(":__builtin:item", {
|
||||||
if ok then
|
if ok then
|
||||||
self._forcetimer = -1
|
self._forcetimer = -1
|
||||||
self._force = nil
|
self._force = nil
|
||||||
self.object:setvelocity({x=0,y=0,z=0})
|
enable_physics(self.object, self)
|
||||||
self.object:setacceleration({x = 0, y = -get_gravity(), z = 0})
|
|
||||||
self.physical_state = true
|
|
||||||
self.object:set_properties({physical = true})
|
|
||||||
else
|
else
|
||||||
self._forcetimer = self._forcetimer - dtime
|
self._forcetimer = self._forcetimer - dtime
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
elseif self._force then
|
elseif self._force then
|
||||||
self._force = nil
|
self._force = nil
|
||||||
self.object:setvelocity({x=0,y=0,z=0})
|
enable_physics(self.object, self)
|
||||||
self.object:setacceleration({x = 0, y = -get_gravity(), z = 0})
|
|
||||||
self.physical_state = true
|
|
||||||
self.object:set_properties({physical = true})
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -530,6 +530,7 @@ core.register_entity(":__builtin:item", {
|
||||||
-- Set new item moving speed into the direciton of the liquid
|
-- Set new item moving speed into the direciton of the liquid
|
||||||
local newv = vector.multiply(vec, f)
|
local newv = vector.multiply(vec, f)
|
||||||
self.object:setacceleration({x = 0, y = 0, z = 0})
|
self.object:setacceleration({x = 0, y = 0, z = 0})
|
||||||
|
-- FIXME: This makes the item wiggle on flowing water
|
||||||
self.object:setvelocity({x = newv.x, y = -0.22, z = newv.z})
|
self.object:setvelocity({x = newv.x, y = -0.22, z = newv.z})
|
||||||
|
|
||||||
self.object:setacceleration({x = 0, y = -get_gravity(), z = 0})
|
self.object:setacceleration({x = 0, y = -get_gravity(), z = 0})
|
||||||
|
@ -558,17 +559,11 @@ core.register_entity(":__builtin:item", {
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self.object:setvelocity({x = 0, y = 0, z = 0})
|
disable_physics(self.object, self)
|
||||||
self.object:setacceleration({x = 0, y = 0, z = 0})
|
|
||||||
self.physical_state = false
|
|
||||||
self.object:set_properties({physical = false})
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if not self.physical_state and self._magnet_active == false then
|
if self._magnet_active == false then
|
||||||
self.object:setvelocity({x = 0, y = 0, z = 0})
|
enable_physics(self.object, self)
|
||||||
self.object:setacceleration({x = 0, y = -get_gravity(), z = 0})
|
|
||||||
self.physical_state = true
|
|
||||||
self.object:set_properties({physical = true})
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
Loading…
Reference in New Issue