mirror of
https://github.com/APercy/airutils.git
synced 2025-03-15 08:01:22 +00:00
new flap code
This commit is contained in:
parent
4d24a0dd25
commit
6b985286b8
3 changed files with 139 additions and 15 deletions
|
@ -43,10 +43,16 @@ function airutils.control(self, dtime, hull_direction, longit_speed, longit_drag
|
|||
if player then
|
||||
ctrl = player:get_player_control()
|
||||
|
||||
--engine and power control
|
||||
if ctrl.aux1 and self._last_time_command > 0.5 then
|
||||
self._last_time_command = 0
|
||||
|
||||
|
||||
end
|
||||
----------------------------------
|
||||
-- flap operation
|
||||
----------------------------------
|
||||
if ctrl.aux1 and ctrl.sneak and self._last_time_command >= 0.3 and self._wing_angle_extra_flaps then
|
||||
self._last_time_command = 0
|
||||
airutils.flap_operate(self, player)
|
||||
end
|
||||
|
||||
self._acceleration = 0
|
||||
|
|
|
@ -17,6 +17,8 @@ function airutils.get_staticdata(self) -- unloaded/unloads ... is now saved
|
|||
stored_last_accell = self._last_accell,
|
||||
stored_engine_running = self._engine_running,
|
||||
stored_inv_id = self._inv_id,
|
||||
stored_flap = self._flap,
|
||||
stored_passengers = self._passengers,
|
||||
stored_vehicle_custom_data = self._vehicle_custom_data
|
||||
})
|
||||
end
|
||||
|
@ -27,6 +29,7 @@ end
|
|||
|
||||
function airutils.on_activate(self, staticdata, dtime_s)
|
||||
airutils.actfunc(self, staticdata, dtime_s)
|
||||
|
||||
if staticdata ~= "" and staticdata ~= nil then
|
||||
local data = minetest.deserialize(staticdata) or {}
|
||||
self._energy = data.stored_energy
|
||||
|
@ -39,6 +42,8 @@ function airutils.on_activate(self, staticdata, dtime_s)
|
|||
self._last_accell = data.stored_last_accell
|
||||
self._engine_running = data.stored_engine_running
|
||||
self._inv_id = data.stored_inv_id
|
||||
self._flap = data.stored_flap
|
||||
self._passengers = data.stored_passengers or {}
|
||||
local custom_data = data.stored_vehicle_custom_data
|
||||
if custom_data then
|
||||
self._vehicle_custom_data = custom_data
|
||||
|
@ -51,7 +56,7 @@ function airutils.on_activate(self, staticdata, dtime_s)
|
|||
self._last_applied_power = -1 --signal to start
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if self._register_parts_method then
|
||||
self._register_parts_method(self)
|
||||
end
|
||||
|
@ -352,9 +357,11 @@ function airutils.logic(self)
|
|||
accel = airutils.autopilot(self, self.dtime, hull_direction, longit_speed, accel, curr_pos)
|
||||
end
|
||||
end
|
||||
|
||||
--end accell
|
||||
|
||||
--get disconnected players
|
||||
airutils.rescueConnectionFailedPassengers(self)
|
||||
|
||||
if accel == nil then accel = {x=0,y=0,z=0} end
|
||||
|
||||
--lift calculation
|
||||
|
@ -485,6 +492,21 @@ function airutils.logic(self)
|
|||
self.object:set_rotation({x=newpitch,y=newyaw,z=newroll})
|
||||
--end
|
||||
|
||||
if self._wing_configuration == self._wing_angle_of_attack and self._flap then
|
||||
airutils.flap_on(self)
|
||||
end
|
||||
if self._wing_configuration ~= self._wing_angle_of_attack and self._flap == false then
|
||||
airutils.flap_off(self)
|
||||
end
|
||||
|
||||
if longit_speed > self._max_speed and self._flap == true then
|
||||
if is_attached and self.driver_name then
|
||||
minetest.chat_send_player(self.driver_name, core.colorize('#ff0000', " >>> Flaps retracted due for overspeed"))
|
||||
end
|
||||
self._flap = false
|
||||
end
|
||||
|
||||
|
||||
--adjust elevator pitch (3d model)
|
||||
self.object:set_bone_position("elevator", self._elevator_pos, {x=-self._elevator_angle*2 - 90, y=0, z=0})
|
||||
--adjust rudder
|
||||
|
|
|
@ -683,19 +683,21 @@ function airutils.seats_create(self)
|
|||
if self.object then
|
||||
local pos = self.object:get_pos()
|
||||
self._passengers_base = {}
|
||||
local max_seats = table.getn(self._seats)
|
||||
for i=1, max_seats do
|
||||
self._passengers_base[i] = minetest.add_entity(pos,'airutils:seat_base')
|
||||
if not self._seats_rot then
|
||||
self._passengers_base[i]:set_attach(self.object,'',self._seats[i],{x=0,y=0,z=0})
|
||||
else
|
||||
self._passengers_base[i]:set_attach(self.object,'',self._seats[i],{x=0,y=self._seats_rot[i],z=0})
|
||||
if self._seats then
|
||||
local max_seats = table.getn(self._seats)
|
||||
for i=1, max_seats do
|
||||
self._passengers_base[i] = minetest.add_entity(pos,'airutils:seat_base')
|
||||
if not self._seats_rot then
|
||||
self._passengers_base[i]:set_attach(self.object,'',self._seats[i],{x=0,y=0,z=0})
|
||||
else
|
||||
self._passengers_base[i]:set_attach(self.object,'',self._seats[i],{x=0,y=self._seats_rot[i],z=0})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.pilot_seat_base = self._passengers_base[1] --sets pilot seat reference
|
||||
if self._have_copilot and self.pilot_seat_base[2] then
|
||||
self.co_pilot_seat_base = self.pilot_seat_base[2] --sets copilot seat reference
|
||||
self.pilot_seat_base = self._passengers_base[1] --sets pilot seat reference
|
||||
if self._have_copilot and self.pilot_seat_base[2] then
|
||||
self.co_pilot_seat_base = self.pilot_seat_base[2] --sets copilot seat reference
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -706,3 +708,97 @@ function airutils.seats_destroy(self)
|
|||
if self._passengers_base[i] then self._passengers_base[i]:remove() end
|
||||
end
|
||||
end
|
||||
|
||||
function airutils.flap_on(self)
|
||||
if self._wing_angle_extra_flaps == nil then self._wing_angle_extra_flaps = 0 end --if not, just keep the same as normal angle of attack
|
||||
local flap_limit = 15
|
||||
if self._flap_limit then flap_limit = self._flap_limit end
|
||||
self._wing_configuration = self._wing_angle_of_attack + self._wing_angle_extra_flaps
|
||||
self.object:set_bone_position("flap.l", {x=0, y=0, z=0}, {x=-flap_limit, y=0, z=0})
|
||||
self.object:set_bone_position("flap.r", {x=0, y=0, z=0}, {x=-flap_limit, y=0, z=0})
|
||||
end
|
||||
|
||||
function airutils.flap_off(self)
|
||||
self._wing_configuration = self._wing_angle_of_attack
|
||||
self.object:set_bone_position("flap.l", {x=0, y=0, z=0}, {x=0, y=0, z=0})
|
||||
self.object:set_bone_position("flap.r", {x=0, y=0, z=0}, {x=0, y=0, z=0})
|
||||
end
|
||||
|
||||
function airutils.flap_operate(self, player)
|
||||
if self._flap == false then
|
||||
minetest.chat_send_player(player:get_player_name(), ">>> Flap down")
|
||||
self._flap = true
|
||||
airutils.flap_on(self)
|
||||
minetest.sound_play("airutils_collision", {
|
||||
object = self.object,
|
||||
max_hear_distance = 15,
|
||||
gain = 1.0,
|
||||
fade = 0.0,
|
||||
pitch = 0.5,
|
||||
}, true)
|
||||
else
|
||||
minetest.chat_send_player(player:get_player_name(), ">>> Flap up")
|
||||
self._flap = false
|
||||
airutils.flap_off(self)
|
||||
minetest.sound_play("airutils_collision", {
|
||||
object = self.object,
|
||||
max_hear_distance = 15,
|
||||
gain = 1.0,
|
||||
fade = 0.0,
|
||||
pitch = 0.7,
|
||||
}, true)
|
||||
end
|
||||
end
|
||||
|
||||
local function do_attach(self, player, slot)
|
||||
if slot == 0 then return end
|
||||
if self._passengers[slot] == nil then
|
||||
local name = player:get_player_name()
|
||||
--minetest.chat_send_all(self.driver_name)
|
||||
self._passengers[slot] = name
|
||||
player:set_attach(self._passengers_base[slot], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
|
||||
player_api.player_attached[name] = true
|
||||
|
||||
local eye_y = -4
|
||||
if airutils.detect_player_api(player) == 1 then
|
||||
eye_y = 2.5
|
||||
end
|
||||
player:set_eye_offset({x = 0, y = eye_y, z = 2}, {x = 0, y = 3, z = -30})
|
||||
|
||||
player_api.set_animation(player, "sit")
|
||||
-- make the driver sit
|
||||
minetest.after(1, function()
|
||||
player = minetest.get_player_by_name(name)
|
||||
if player then
|
||||
airutils.sit(player)
|
||||
--apply_physics_override(player, {speed=0,gravity=0,jump=0})
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
--this method checks for a disconected player who comes back
|
||||
function airutils.rescueConnectionFailedPassengers(self)
|
||||
if self._disconnection_check_time == nil then self._disconnection_check_time = 1 end
|
||||
self._disconnection_check_time = self._disconnection_check_time + self.dtime
|
||||
local max_seats = table.getn(self._passengers_base)
|
||||
if self._disconnection_check_time > 1 then
|
||||
--minetest.chat_send_all(dump(self._passengers))
|
||||
self._disconnection_check_time = 0
|
||||
for i = max_seats,1,-1
|
||||
do
|
||||
if self._passengers[i] then
|
||||
local player = minetest.get_player_by_name(self._passengers[i])
|
||||
if player then --we have a player!
|
||||
if player_api.player_attached[self._passengers[i]] == nil then --but isn't attached?
|
||||
--minetest.chat_send_all("okay")
|
||||
if player:get_hp() > 0 then
|
||||
self._passengers[i] = nil --clear the slot first
|
||||
do_attach(self, player, i) --attach
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue