diff --git a/init.lua b/init.lua index 401663c..239ba1c 100644 --- a/init.lua +++ b/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