2025-06-04 05:02:57 +08:00

302 lines
5.6 KiB
Plaintext

autoImport ("SceneSeat")
-- actionIDs
local SitAction = 60
local DisplaySkillID = 50031001
local DisplayDuration = 10
SceneSeatManager = class("SceneSeatManager")
function SceneSeatManager:ctor()
self.staticData = nil
self.seats = {}
self.sittingCreatures = {}
self.displaying = false
self.displayEndTime = 0
end
function SceneSeatManager:Display(duration)
self.displayEndTime = Time.time + duration
self:SetDisplay(true)
end
function SceneSeatManager:SetDisplay(on)
if on == self.displaying then
return
end
self.displaying = on
local seats = self.seats
if on then
for k,v in pairs(seats) do
v:DeterminShow()
end
else
for k,v in pairs(seats) do
v:Hide()
end
self.displayEndTime = 0
end
end
function SceneSeatManager:SeatIsCustom(seatID)
local seat = self.seats[seatID]
if(seat) then
return seat.isCustomSeat
end
return false
end
function SceneSeatManager:SetSeatsDisplay(seats,on)
if(seats) then
local seat
for i=1,#seats do
seat = self.seats[seats[i]]
if(seat) then
if(on) then
seat:Server_Show()
else
seat:Hide()
end
end
end
end
end
function SceneSeatManager:IsDisplaying()
return self.displaying
end
function SceneSeatManager:GetCreatureSeat(creature)
return self.sittingCreatures[creature]
end
function SceneSeatManager:GetOnSeat(creature, seatID)
local seat = self.seats[seatID]
if nil == seat then
return false
end
local oldSeat = self:GetCreatureSeat(creature)
if nil ~= oldSeat then
if oldSeat:GetID() == seatID then
return true
end
self.sittingCreatures[creature] = nil
oldSeat:GetOff(creature)
end
if not seat:GetOn(creature) then
return false
end
self.sittingCreatures[creature] = seat
creature:RegisterWeakObserver(self)
return true
end
function SceneSeatManager:MyselfManualGetOffSeat()
local creature = Game.Myself
local seat = self:GetCreatureSeat(creature)
if nil == seat then
return false
end
self.sittingCreatures[creature] = nil
seat:GetOff(creature)
ServiceNUserProxy.Instance:CallCheckSeatUserCmd(
seat:GetID(),
false)
return true
end
function SceneSeatManager:GetOffSeat(creature)
local seat = self:GetCreatureSeat(creature)
if nil == seat then
return false
end
self.sittingCreatures[creature] = nil
seat:GetOff(creature)
return true
end
function SceneSeatManager:TryGetOffSeat(creature, seatID)
local seat = self:GetCreatureSeat(creature)
if nil == seat then
return true
end
if seat:GetID() ~= seatID then
return false
end
self.sittingCreatures[creature] = nil
seat:GetOff(creature)
return true
end
function SceneSeatManager:ClickSeat(obj)
local creature = Game.Myself
local seat = self:GetCreatureSeat(creature)
if nil ~= seat then
return
end
local seatID = obj.ID
seat = self.seats[seatID]
if nil == seat then
return
end
local accessPos = seat:GetAccessPosition()
if VectorUtility.AlmostEqual_3_XZ(accessPos, creature:GetPosition()) then
self:_OnSeatAccessed(seatID)
return
end
creature:Client_MoveXYZTo(
accessPos[1],accessPos[2],accessPos[3],
nil,
nil,
SceneSeatManager._OnSeatAccessed,
self,
seatID)
end
function SceneSeatManager:_OnSeatAccessed(seatID)
local creature = Game.Myself
local seat = self:GetCreatureSeat(creature)
if nil ~= seat then
return
end
seat = self.seats[seatID]
if nil == seat then
return
end
if 0 < seat:GetPassengerCount() then
return
end
helplog("OnSeatAccessed", seatID)
-- 1.
FunctionSystem.InterruptMyselfAll()
-- 2.
self:GetOnSeat(creature, seatID)
-- 3.
ServiceNUserProxy.Instance:CallCheckSeatUserCmd(
seatID,
true)
-- 4.
creature:Client_PlayMotionAction(SitAction)
creature:Client_SetDirCmd(
AI_CMD_SetAngleY.Mode.SetAngleY,
seat:GetDir(),
true)
self:SetDisplay(false)
end
function SceneSeatManager:_CreateSeats()
local seats = self.seats
for k,v in pairs(self.staticData) do
local seat
if(v.PrefabID == nil) then
seat = SceneSeat.Create(v)
else
seat = CustomSceneSeat.Create(v)
end
if self.displaying then
seat:DeterminShow()
end
seats[k] = seat
end
end
function SceneSeatManager:_DestroySeats()
local seats = self.seats
for k,v in pairs(seats) do
seats[k] = nil
v:Destroy()
end
end
function SceneSeatManager:_ClearSittingCreatures()
for k,v in pairs(self.sittingCreatures) do
v:GetOff(k)
k:UnregisterWeakObserver(self)
self.sittingCreatures[k] = nil
end
end
function SceneSeatManager:_OnSkillUsed(skillID)
if DisplaySkillID == skillID then
self:Display(DisplayDuration)
end
end
function SceneSeatManager:ObserverDestroyed(creature)
self:GetOffSeat(creature)
end
function SceneSeatManager:Launch()
if self.running then
return
end
local mapID = Game.MapManager:GetMapID()
local mapInfo = Table_Map[mapID]
if nil == mapInfo then
return
end
local seatFile = "Table_Seat_"..mapInfo.NameEn
if not ResourceID.CheckFileIsRecorded(seatFile) then
return
end
if _G[seatFile] == nil then
autoImport(seatFile)
end
self.staticData = _G[seatFile]
if nil == self.staticData then
return
end
self.running = true
EventManager.Me():AddEventListener(
MyselfEvent.UsedSkill,
SceneSeatManager._OnSkillUsed,
self)
self:_CreateSeats()
end
function SceneSeatManager:Shutdown()
if not self.running then
return
end
self.running = false
EventManager.Me():RemoveEventListener(
MyselfEvent.UsedSkill,
SceneSeatManager._OnSkillUsed,
self)
-- 1.
self:_ClearSittingCreatures()
-- 2.
self:_DestroySeats()
-- 3.
self.staticData = nil
self.displaying = false
self.displayEndTime = 0
end
function SceneSeatManager:Update(time, deltaTime)
if not self.running then
return
end
if self.displaying
and 0 < self.displayEndTime
and time > self.displayEndTime then
self:SetDisplay(false)
end
end