seats dynamic creation

This commit is contained in:
Alexsandro Percy 2024-03-29 15:54:56 -03:00
parent d5f037a79e
commit 9b88a7b943
2 changed files with 55 additions and 73 deletions

View file

@ -117,7 +117,7 @@ function airutils.on_activate(self, staticdata, dtime_s)
self._inv = inv self._inv = inv
end end
airutils.seats_create(self) --airutils.seats_create(self)
self._passengers = {} self._passengers = {}
if not self._vehicle_custom_data then self._vehicle_custom_data = {} end --initialize when it does not exists if not self._vehicle_custom_data then self._vehicle_custom_data = {} end --initialize when it does not exists
@ -817,6 +817,8 @@ function airutils.on_rightclick(self, clicker)
copilot_name = self.co_pilot copilot_name = self.co_pilot
end end
--minetest.chat_send_all(dump(self.driver_name))
local touching_ground, liquid_below = airutils.check_node_below(self.object, 2.5) local touching_ground, liquid_below = airutils.check_node_below(self.object, 2.5)
local is_on_ground = self.isinliquid or touching_ground or liquid_below local is_on_ground = self.isinliquid or touching_ground or liquid_below
local is_under_water = airutils.check_is_under_water(self.object) local is_under_water = airutils.check_is_under_water(self.object)
@ -831,6 +833,7 @@ function airutils.on_rightclick(self, clicker)
local plane = seat:get_attach() local plane = seat:get_attach()
if plane == self.object then is_attached = true end if plane == self.object then is_attached = true end
end end
if name == self.driver_name then if name == self.driver_name then
if is_attached then if is_attached then
local itmstck=clicker:get_wielded_item() local itmstck=clicker:get_wielded_item()
@ -911,19 +914,20 @@ function airutils.on_rightclick(self, clicker)
end end
--attach player --attach player
airutils.seat_create(self, 1)
airutils.seat_create(self, 2)
if clicker:get_player_control().sneak == true and max_seats > 1 then if clicker:get_player_control().sneak == true and max_seats > 1 then
-- flight instructor mode -- flight instructor mode
self._instruction_mode = true self._instruction_mode = true
self.co_pilot_seat_base = self._passengers_base[1] self.co_pilot_seat_base = self._passengers_base[1]
self.pilot_seat_base = self._passengers_base[2] self.pilot_seat_base = self._passengers_base[2]
airutils.attach(self, clicker)
else else
-- no driver => clicker is new driver -- no driver => clicker is new driver
self._instruction_mode = false self._instruction_mode = false
self.co_pilot_seat_base = self._passengers_base[2] self.co_pilot_seat_base = self._passengers_base[2]
self.pilot_seat_base = self._passengers_base[1] self.pilot_seat_base = self._passengers_base[1]
airutils.attach(self, clicker)
end end
airutils.attach(self, clicker)
self._command_is_given = false self._command_is_given = false
end end
else else

View file

@ -75,9 +75,11 @@ function airutils.attach(self, player, instructor_mode)
local eye_y = 0 local eye_y = 0
if instructor_mode == true and self._have_copilot then if instructor_mode == true and self._have_copilot then
eye_y = -4 eye_y = -4
airutils.seat_create(self, 2)
player:set_attach(self.co_pilot_seat_base, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_attach(self.co_pilot_seat_base, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
else else
eye_y = -4 eye_y = -4
airutils.seat_create(self, 1)
player:set_attach(self.pilot_seat_base, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_attach(self.pilot_seat_base, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
end end
if airutils.detect_player_api(player) == 1 then if airutils.detect_player_api(player) == 1 then
@ -151,6 +153,7 @@ function airutils.check_passenger_is_attached(self, name)
end end
local function attach_copilot(self, name, player, eye_y) local function attach_copilot(self, name, player, eye_y)
airutils.seat_create(self, 2)
if not self.co_pilot_seat_base or not player then return end if not self.co_pilot_seat_base or not player then return end
self.co_pilot = name self.co_pilot = name
self._passengers[2] = name self._passengers[2] = name
@ -205,6 +208,7 @@ function airutils.attach_pax(self, player, is_copilot)
if self._passengers[i] == nil then if self._passengers[i] == nil then
--minetest.chat_send_all(self.driver_name) --minetest.chat_send_all(self.driver_name)
self._passengers[i] = name self._passengers[i] = name
airutils.seat_create(self, i)
player:set_attach(self._passengers_base[i], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_attach(self._passengers_base[i], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player:set_eye_offset({x = 0, y = eye_y, z = 0}, {x = 0, y = 3, z = -30}) player:set_eye_offset({x = 0, y = eye_y, z = 0}, {x = 0, y = 3, z = -30})
@ -280,8 +284,10 @@ function airutils.checkAttach(self, player)
local max_seats = table.getn(self._seats) local max_seats = table.getn(self._seats)
for i = max_seats,1,-1 for i = max_seats,1,-1
do do
if player_attach == self._passengers_base[i] then if self._passengers_base[i] then
return true if player_attach == self._passengers_base[i] then
return true
end
end end
end end
end end
@ -595,85 +601,26 @@ function airutils.rescueConnectionFailedPassengers(self)
end end
function airutils.checkattachBug(self) function airutils.checkattachBug(self)
-- for some engine error the player can be detached from the submarine, so lets set him attached again
--[[local have_driver = (self.driver_name ~= nil)
if have_driver then
local max_seats = table.getn(self._passengers_base)
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:get_attach() == nil then
if self._passengers[i] == self.driver_name then
--attach the driver again
if player:get_hp() > 0 then
self._passengers[i] = nil --clear the slot first
airutils.attach(self, player, self._instruction_mode)
else
--he is dead, so good bye!
airutils.dettachPlayer(self, player)
end
else
--normal player
if player:get_hp() > 0 then
self._passengers[i] = nil --clear the slot first
do_attach(self, player, i) --attach
else
--let the work for the gravity
self._passengers[i] = nil
end
end
end
else
--the player is gone
if self._passengers[i] == self.driver_name then
--oh nooo! The pilot is gone!
self.driver_name = nil
self._autopilot = false
airutils.transfer_control(self, true)
else
--no player, so clean it
self._passengers[i] = nil
end
end
end
end ---end for
end]]--
--[[local max_seats = table.getn(self._passengers_base)
if max_seats > 2 then
for i = max_seats,3,-1 do
if self._passengers[i] then
local player = minetest.get_player_by_name(self._passengers[i])
if not player:get_attach() then
do_attach(self, player, i)
end
end
end
end]]--
-- for some engine error the player can be detached from the submarine, so lets set him attached again -- for some engine error the player can be detached from the submarine, so lets set him attached again
local have_driver = (self.driver_name ~= nil) local have_driver = (self.driver_name ~= nil)
if have_driver then if have_driver then
-- attach the driver again -- attach the driver again
if self.driver_name ~= self.owner then
self.driver_name = nil
return
end
local player = minetest.get_player_by_name(self.driver_name) local player = minetest.get_player_by_name(self.driver_name)
if player then if player then
if player:get_hp() > 0 then if player:get_hp() > 0 then
if player:get_attach() == nil then if player:get_attach() == nil then
airutils.attach(self, player, self._instruction_mode) airutils.attach(self, player, self._instruction_mode)
else else
self.driver_name = nil if self.owner and self.driver_name ~= self.owner then
self.driver_name = nil
return
end
end end
else else
airutils.dettachPlayer(self, player) airutils.dettachPlayer(self, player)
end end
else else
if self._passenger ~= nil and self._command_is_given == false then if (self._passenger ~= nil or self.co_pilot ~= nil) and self._command_is_given == false then
self._autopilot = false self._autopilot = false
airutils.transfer_control(self, true) airutils.transfer_control(self, true)
end end
@ -1134,16 +1081,46 @@ function airutils.seats_create(self)
end end
end end
function airutils.seat_create(self, index)
if self.object then
local pos = self.object:get_pos()
if not self._passengers_base then
self._passengers_base = {}
if self._seats then
local max_seats = table.getn(self._seats)
for i=1, max_seats do
self._passengers_base[i] = 0
end
end
end
if self._passengers_base[index] == 0 then
if self._seats then
local max_seats = table.getn(self._seats)
for i=1, max_seats do
if i == index then
self._passengers_base[i] = minetest.add_entity(pos,'airutils:seat_base')
local rot = self._seats_rot[i] or 0
self._passengers_base[i]:set_attach(self.object,'',self._seats[i],{x=0,y=rot,z=0})
break
end
end
end
end
end
end
function airutils.seats_update(self) function airutils.seats_update(self)
if self.object then if self.object then
local pos = self.object:get_pos() local pos = self.object:get_pos()
if self._passengers_base then if self._passengers_base then
local max_seats = table.getn(self._passengers_base) local max_seats = table.getn(self._passengers_base)
for i=1, max_seats do for i=1, max_seats do
if not self._seats_rot then if self._passengers_base[i] then
self._passengers_base[i]:set_attach(self.object,'',self._seats[i],{x=0,y=0,z=0}) if not self._seats_rot then
else self._passengers_base[i]:set_attach(self.object,'',self._seats[i],{x=0,y=0,z=0})
self._passengers_base[i]:set_attach(self.object,'',self._seats[i],{x=0,y=self._seats_rot[i],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
end end
end end
@ -1242,6 +1219,7 @@ local function do_attach(self, player, slot)
local name = player:get_player_name() local name = player:get_player_name()
--minetest.chat_send_all(self.driver_name) --minetest.chat_send_all(self.driver_name)
self._passengers[slot] = name self._passengers[slot] = name
airutils.seat_create(self, slot)
player:set_attach(self._passengers_base[slot], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_attach(self._passengers_base[slot], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
local eye_y = -4 local eye_y = -4