302 lines
5.6 KiB
Plaintext
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 |