mirror of
https://codeberg.org/SumianVoice/sum_airship.git
synced 2025-03-22 07:32:22 +00:00
balloon can't be used for spelunking any more - added collisions, stop sounds when break
This commit is contained in:
parent
49c53b06a7
commit
cf9c70e1b0
1 changed files with 85 additions and 3 deletions
88
init.lua
88
init.lua
|
@ -353,6 +353,18 @@ function boat.on_death(self, killer)
|
||||||
end
|
end
|
||||||
self._driver = nil
|
self._driver = nil
|
||||||
self._passenger = 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
|
end
|
||||||
|
|
||||||
function boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
|
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
|
||||||
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)
|
function boat.on_step(self, dtime, moveresult)
|
||||||
boat.sound_countdown(self, dtime)
|
boat.sound_countdown(self, dtime)
|
||||||
if minetest.get_modpath("mcl_burning") then
|
if minetest.get_modpath("mcl_burning") then
|
||||||
|
@ -525,13 +596,24 @@ function boat.on_step(self, dtime, moveresult)
|
||||||
if forward == 0 then
|
if forward == 0 then
|
||||||
slowdown = 0.97
|
slowdown = 0.97
|
||||||
end
|
end
|
||||||
v.x = v.x * slowdown
|
|
||||||
v.z = v.z * slowdown
|
if self._driver then
|
||||||
v.y = v.y * 0.97
|
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
|
if is_on_floor and not self._driver then
|
||||||
vel = vector.new(0, 0, 0)
|
vel = vector.new(0, 0, 0)
|
||||||
self.object:set_velocity(vel)
|
self.object:set_velocity(vel)
|
||||||
else
|
else
|
||||||
|
v.x = v.x * slowdown
|
||||||
|
v.z = v.z * slowdown
|
||||||
|
v.y = v.y * 0.97
|
||||||
self.object:set_velocity(v)
|
self.object:set_velocity(v)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue