balloon can't be used for spelunking any more - added collisions, stop sounds when break

This commit is contained in:
Sumyjkl 2022-08-13 17:45:44 +10:00
parent 49c53b06a7
commit cf9c70e1b0

View file

@ -353,6 +353,18 @@ function boat.on_death(self, killer)
end
self._driver = nil
self._passenger = nil
-- stop sounds
if self._sounds then
if self._sounds.engine
and self._sounds.engine.handle then
boat.sound_stop(self._sounds.engine)
end
if self._sounds.engine_stop
and self._sounds.engine_stop.handle then
boat.sound_stop(self._sounds.engine_stop)
end
end
end
function boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
@ -369,6 +381,65 @@ function boat.sound_countdown(self, dtime)
end
end
-- 10, 5, 5
-- this system ensures collision kind of works with balloons.
-- does not include entity to entity collisions
local balloon = {}
balloon.offset = 6
balloon.length = 3.5
balloon.height = 2.5
local balloon_nodes = {}
balloon_nodes[0] = { -- top
p = vector.new(0, balloon.offset + balloon.height, 0),
dir = vector.new(0, -5, 0),}
balloon_nodes[1] = { -- front
p = vector.new(0, balloon.offset, balloon.length),
dir = vector.new(0, -0.5, -1),}
balloon_nodes[2] = { -- back
p = vector.new(0, balloon.offset, -balloon.length),
dir = vector.new(0, 0, 1),}
balloon_nodes[3] = { -- left or right
p = vector.new(balloon.length, balloon.offset, 0),
dir = vector.new(-1, 0, 0),}
balloon_nodes[4] = { -- left or right
p = vector.new(-balloon.length, balloon.offset, 0),
dir = vector.new(1, 0, 0),}
-- diagonals
local vdiag = 0.7
balloon_nodes[5] = {
p = vector.new(-balloon.length*vdiag, balloon.offset, -balloon.length*vdiag),
dir = vector.new(vdiag, 0, vdiag),}
balloon_nodes[6] = {
p = vector.new(balloon.length*vdiag, balloon.offset, -balloon.length*vdiag),
dir = vector.new(-vdiag, 0, vdiag),}
balloon_nodes[7] = {
p = vector.new(-balloon.length*vdiag, balloon.offset, balloon.length*vdiag),
dir = vector.new(vdiag, 0, -vdiag),}
balloon_nodes[8] = {
p = vector.new(balloon.length*vdiag, balloon.offset, balloon.length*vdiag),
dir = vector.new(-vdiag, 0, -vdiag),}
function boat.get_balloon_collide(self)
local force = vector.new()
local o = self.object:get_pos()
for _, check in pairs(balloon_nodes) do
local n = minetest.get_node(vector.add(check.p, o))
-- minetest.add_particle({
-- pos = vector.add(o, check.p),
-- velocity = vector.new(0, 1, 0),
-- expirationtime = math.random(0.5, 2),
-- size = math.random(0.1, 4),
-- texture = "sum_airship_smoke.png",
-- })
if n and minetest.registered_nodes[n.name]
and minetest.registered_nodes[n.name].walkable then
force = vector.add(force, check.dir)
end
end
return force
end
function boat.on_step(self, dtime, moveresult)
boat.sound_countdown(self, dtime)
if minetest.get_modpath("mcl_burning") then
@ -525,13 +596,24 @@ function boat.on_step(self, dtime, moveresult)
if forward == 0 then
slowdown = 0.97
end
v.x = v.x * slowdown
v.z = v.z * slowdown
v.y = v.y * 0.97
if self._driver then
local collide_force = boat.get_balloon_collide(self)
-- collide_force = vector.normalize(collide_force)
if collide_force ~= vector.new() then
collide_force = vector.multiply(collide_force, 0.1)
v = vector.multiply(v, 0.95)
end
v = vector.add(v, collide_force)
end
if is_on_floor and not self._driver then
vel = vector.new(0, 0, 0)
self.object:set_velocity(vel)
else
v.x = v.x * slowdown
v.z = v.z * slowdown
v.y = v.y * 0.97
self.object:set_velocity(v)
end