mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2025-01-10 00:59:35 +01:00
Merge pull request 'Fix bobber collision, ender pearl crash' (#4806) from fix-bobber into master
Reviewed-on: https://git.minetest.land/VoxeLibre/VoxeLibre/pulls/4806 Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
This commit is contained in:
commit
ae5353b070
5 changed files with 44 additions and 53 deletions
|
@ -35,8 +35,7 @@ local fish = function(itemstack, player, pointed_thing)
|
|||
local pos = player:get_pos()
|
||||
|
||||
local objs = minetest.get_objects_inside_radius(pos, 125)
|
||||
local num = 0
|
||||
local ent = nil
|
||||
local ent
|
||||
local noent = true
|
||||
|
||||
local durability = FISHING_ROD_DURABILITY
|
||||
|
@ -53,9 +52,7 @@ local fish = function(itemstack, player, pointed_thing)
|
|||
if (player:get_player_name() == ent.player) then
|
||||
noent = false
|
||||
if ent._dive == true then
|
||||
local itemname
|
||||
local items
|
||||
local itemcount = 1
|
||||
local pr = PseudoRandom(os.time() * math.random(1, 100))
|
||||
local r = pr:next(1, 100)
|
||||
local fish_values = {85, 84.8, 84.7, 84.5}
|
||||
|
@ -173,15 +170,13 @@ local fish = function(itemstack, player, pointed_thing)
|
|||
end
|
||||
end
|
||||
--Check for flying bobber.
|
||||
local player_name = player:get_player_name()
|
||||
for n = 1, #objs do
|
||||
ent = objs[n]:get_luaentity()
|
||||
if ent then
|
||||
if ent._thrower and ent.objtype=="fishing" then
|
||||
if player:get_player_name() == ent._thrower then
|
||||
noent = false
|
||||
break
|
||||
end
|
||||
end
|
||||
if ent and ent._owner == player_name and ent.objtype=="fishing" then
|
||||
noent = false
|
||||
mcl_util.remove_entity(ent)
|
||||
break
|
||||
end
|
||||
end
|
||||
--If no bobber or flying_bobber exists then throw bobber.
|
||||
|
@ -313,17 +308,19 @@ bobber_ENTITY.on_step = bobber_on_step
|
|||
core.register_entity("mcl_fishing:bobber_entity", bobber_ENTITY)
|
||||
|
||||
vl_projectile.register("mcl_fishing:flying_bobber_entity", {
|
||||
physical = false,
|
||||
physical = true,
|
||||
collide_with_objects = false,
|
||||
timer=0,
|
||||
textures = {"mcl_fishing_bobber.png"}, --FIXME: Replace with correct texture.
|
||||
visual_size = {x=0.5, y=0.5},
|
||||
collisionbox = {0,0,0,0,0,0},
|
||||
collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1},
|
||||
pointable = false,
|
||||
|
||||
get_staticdata = mcl_throwing.get_staticdata,
|
||||
on_activate = mcl_throwing.on_activate,
|
||||
|
||||
_vl_projectile = {
|
||||
survive_collision = true,
|
||||
behaviors = {
|
||||
vl_projectile.collides_with_solids,
|
||||
},
|
||||
|
@ -331,8 +328,6 @@ vl_projectile.register("mcl_fishing:flying_bobber_entity", {
|
|||
on_collide_with_solid = function(self, pos, node)
|
||||
local player = self._owner
|
||||
|
||||
mcl_util.remove_entity(self)
|
||||
|
||||
-- Make sure the player field is valid for when we create the floating bobber
|
||||
if not player then return end
|
||||
|
||||
|
@ -343,12 +338,16 @@ vl_projectile.register("mcl_fishing:flying_bobber_entity", {
|
|||
local ent = core.add_entity(pos, "mcl_fishing:bobber_entity"):get_luaentity()
|
||||
ent.player = player
|
||||
ent.child = true
|
||||
mcl_util.remove_entity(self)
|
||||
else
|
||||
local obj = self.object
|
||||
obj:set_velocity(vector.zero())
|
||||
obj:set_acceleration(vector.zero())
|
||||
end
|
||||
end
|
||||
},
|
||||
|
||||
_lastpos={},
|
||||
_thrower = nil,
|
||||
objtype="fishing",
|
||||
})
|
||||
|
||||
|
@ -357,14 +356,12 @@ mcl_throwing.register_throwable_object("mcl_fishing:flying_bobber", "mcl_fishing
|
|||
-- If player leaves area, remove bobber.
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
local objs = minetest.get_objects_inside_radius(player:get_pos(), 250)
|
||||
local ent = nil
|
||||
local noent = true
|
||||
for n = 1, #objs do
|
||||
ent = objs[n]:get_luaentity()
|
||||
local ent = objs[n]:get_luaentity()
|
||||
if ent then
|
||||
if ent.player and ent.objtype=="fishing" then
|
||||
ent.object:remove()
|
||||
elseif ent._thrower and ent.objtype=="fishing" then
|
||||
elseif ent._owner and ent.objtype=="fishing" then
|
||||
ent.object:remove()
|
||||
end
|
||||
end
|
||||
|
@ -374,16 +371,13 @@ end)
|
|||
-- If player dies, remove bobber.
|
||||
minetest.register_on_dieplayer(function(player)
|
||||
local objs = minetest.get_objects_inside_radius(player:get_pos(), 250)
|
||||
local num = 0
|
||||
local ent = nil
|
||||
local noent = true
|
||||
|
||||
for n = 1, #objs do
|
||||
ent = objs[n]:get_luaentity()
|
||||
local ent = objs[n]:get_luaentity()
|
||||
if ent then
|
||||
if ent.player and ent.objtype=="fishing" then
|
||||
ent.object:remove()
|
||||
elseif ent._thrower and ent.objtype=="fishing" then
|
||||
elseif ent._owner and ent.objtype=="fishing" then
|
||||
ent.object:remove()
|
||||
end
|
||||
end
|
||||
|
@ -518,10 +512,8 @@ minetest.register_craftitem("mcl_fishing:pufferfish_raw", {
|
|||
|
||||
|
||||
minetest.register_on_item_eat(function (hp_change, replace_with_item, itemstack, user, pointed_thing)
|
||||
|
||||
if itemstack:get_name() == "mcl_fishing:pufferfish_raw" then
|
||||
mcl_potions.give_effect_by_level("poison", user, 3, 60)
|
||||
mcl_potions.give_effect_by_level("nausea", user, 2, 20)
|
||||
end
|
||||
|
||||
end )
|
||||
|
|
|
@ -32,11 +32,11 @@ local function egg_spawn_chicks(pos)
|
|||
end
|
||||
|
||||
vl_projectile.register("mcl_throwing:egg_entity",{
|
||||
physical = false,
|
||||
physical = true,
|
||||
timer=0,
|
||||
textures = {"mcl_throwing_egg.png"},
|
||||
visual_size = {x=0.45, y=0.45},
|
||||
collisionbox = {0,0,0,0,0,0},
|
||||
collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1},
|
||||
pointable = false,
|
||||
|
||||
get_staticdata = mcl_throwing.get_staticdata,
|
||||
|
|
|
@ -31,7 +31,7 @@ function on_collide(self, pos, node)
|
|||
end
|
||||
|
||||
-- Make sure we have a reference to the player
|
||||
local player = self._thrower and core.get_player_by_name(self._thrower)
|
||||
local player = self._owner and core.get_player_by_name(self._owner)
|
||||
if not player then return end
|
||||
|
||||
-- Teleport and hurt player
|
||||
|
@ -101,11 +101,11 @@ end
|
|||
|
||||
-- Ender pearl entity
|
||||
vl_projectile.register("mcl_throwing:ender_pearl_entity",{
|
||||
physical = false,
|
||||
physical = true,
|
||||
timer=0,
|
||||
textures = {"mcl_throwing_ender_pearl.png"},
|
||||
visual_size = {x=0.9, y=0.9},
|
||||
collisionbox = {0,0,0,0,0,0},
|
||||
collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1},
|
||||
pointable = false,
|
||||
|
||||
get_staticdata = mcl_throwing.get_staticdata,
|
||||
|
@ -113,7 +113,6 @@ vl_projectile.register("mcl_throwing:ender_pearl_entity",{
|
|||
|
||||
on_step = vl_projectile.update_projectile,
|
||||
_lastpos={},
|
||||
_thrower = nil, -- Player ObjectRef of the player who threw the ender pearl
|
||||
_vl_projectile = {
|
||||
behaviors = {
|
||||
vl_projectile.collides_with_solids,
|
||||
|
|
|
@ -40,11 +40,11 @@ local function snowball_particles(pos, vel)
|
|||
})
|
||||
end
|
||||
vl_projectile.register("mcl_throwing:snowball_entity", {
|
||||
physical = false,
|
||||
physical = true,
|
||||
timer=0,
|
||||
textures = {"mcl_throwing_snowball.png"},
|
||||
visual_size = {x=0.5, y=0.5},
|
||||
collisionbox = {0,0,0,0,0,0},
|
||||
collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1},
|
||||
pointable = false,
|
||||
|
||||
get_staticdata = mcl_throwing.get_staticdata,
|
||||
|
|
|
@ -359,24 +359,24 @@ function mod.collides_with_solids(self, dtime, entity_def, projectile_def)
|
|||
local node_def = core.registered_nodes[node.name]
|
||||
local collides_with = projectile_def.collides_with
|
||||
|
||||
if entity_def.physical then
|
||||
-- Projectile has stopped in one axis, so it probably hit something.
|
||||
-- This detection is a bit clunky, but sadly, MT does not offer a direct collision detection for us. :-(
|
||||
local vel = self.object:get_velocity()
|
||||
if not self._last_velocity then
|
||||
self._last_velocity = vel
|
||||
return
|
||||
end
|
||||
if not collides_with or not mcl_util.match_node_to_filter(node.name, collides_with) then
|
||||
if entity_def.physical then
|
||||
-- Projectile has stopped in one axis, so it probably hit something.
|
||||
-- This detection is a bit clunky, but sadly, MT does not offer a direct collision detection for us. :-(
|
||||
local vel = self.object:get_velocity()
|
||||
if not self._last_velocity then
|
||||
self._last_velocity = vel
|
||||
return
|
||||
end
|
||||
|
||||
local delta_v = (vel - self._last_velocity)
|
||||
local vel_length = vector.length(vel)
|
||||
if vel_length > 1 then delta_v = delta_v / vel_length end
|
||||
self._last_velocity = vel
|
||||
if math.abs(delta_v.x) <= 0.1 and math.abs(delta_v.z) <= 0.1 and math.abs(delta_v.y) <= 0.2 then
|
||||
return
|
||||
end
|
||||
else
|
||||
if node_def and not node_def.walkable and (not collides_with or not mcl_util.match_node_to_filter(node.name, collides_with)) then
|
||||
local delta_v = (vel - self._last_velocity)
|
||||
local vel_length = vector.length(vel)
|
||||
if vel_length > 1 then delta_v = delta_v / vel_length end
|
||||
self._last_velocity = vel
|
||||
if math.abs(delta_v.x) <= 0.1 and math.abs(delta_v.z) <= 0.1 and math.abs(delta_v.y) <= 0.2 then
|
||||
return
|
||||
end
|
||||
elseif node_def and not node_def.walkable then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
@ -430,7 +430,7 @@ function mod.collides_with_solids(self, dtime, entity_def, projectile_def)
|
|||
if hook then hook(self, self._stuckin, snode, sdef) end
|
||||
end
|
||||
|
||||
-- Call entity collied hook
|
||||
-- Call entity collided hook
|
||||
local hook = projectile_def.on_collide_with_solid
|
||||
if hook then hook(self, pos, node, node_def) end
|
||||
|
||||
|
|
Loading…
Reference in a new issue