mirror of
https://codeberg.org/SumianVoice/sum_airship.git
synced 2025-03-15 04:11:23 +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
|
||||
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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue