2025-06-04 05:12:01 +08:00

297 lines
7.2 KiB
Plaintext

LCarrier = reusableClass('LCarrier')
LCarrier.PoolSize = 10
LCarrier.Status = {
Wait = 0,
Moving = 1,
Arrived = 2
}
LCarrier.MasterSeat = -1
local tmpPos = LuaVector3.zero
function LCarrier:ctor()
LCarrier.super.ctor(self)
self.member = {}
end
-- override begin
function LCarrier:DoConstruct(asArray, serverData)
self.myselfID = Game.Myself.data.id
self.status = LCarrier.Status.Wait
self.iAmMaster = false
self.isMine = false
self.masterID = 0
self.carrierID = -1
self.line = -1
self.progress = 0
self.destroyed = false
end
function LCarrier:DoDeconstruct(asArray)
end
-- override end
function LCarrier:SetIsMine(value)
if(self.isMine~=value) then
self.isMine = value
if(self.carrier) then
if(value) then
if(self:IsWaiting()) then
self:Visible(true)
end
self.carrier.progressListener = function (info)
-- print("sync carrier move")
ServiceCarrierCmdProxy.Instance:CallCarrierMoveUserCmd(info.position,info.progress*100)
end
self.carrier.arrivedListener = function (info)
-- print("my arrived!")
self:Arrive()
ServiceCarrierCmdProxy.Instance:CallReachCarrierUserCmd(info.position)
end
else
self.carrier.progressListener = nil
self.carrier.arrivedListener = nil
end
end
end
end
function LCarrier:Visible(value)
if(self.carrier) then
if(not value) then
GameObjectUtil.Instance:ChangeLayersRecursively(self.carrier.gameObject,RO.Config.Layer.INVISIBLE.Value)
else
GameObjectUtil.Instance:ChangeLayersRecursively(self.carrier.gameObject,RO.Config.Layer.DEFAULT.Value)
end
-- self.carrier.gameObject:SetActive(value)
end
self.visiblity = value
local passenger
for k,v in pairs(self.member) do
passenger = SceneCreatureProxy.FindCreature(k)
self:_VisiblePlayer(passenger,value)
end
end
function LCarrier:_VisiblePlayer( player , value )
if(player) then
player:SetVisible(value,LayerChangeReason.CarrierWaiting)
self:_VisiblePlayerUI(player , value)
end
end
function LCarrier:_VisiblePlayerUI(player,value)
if(value) then
FunctionPlayerUI.Me():UnMaskAllUI(player,PUIVisibleReason.CarrierWait)
else
FunctionPlayerUI.Me():MaskAllUI(player,PUIVisibleReason.CarrierWait)
end
end
function LCarrier:SetIAmMaster(value)
if(self.iAmMaster~=value) then
self.iAmMaster = value
end
end
function LCarrier:CreateBus()
if(self.carrier == nil) then
if(self.carrierID>0)then
self.carrier = BusManager.Instance:CloneBus(self.carrierID)
self:Visible(false)
end
end
end
function LCarrier:DestroyCarrier(pos)
self.destroyed = true
if(self.carrier) then
local passenger
for k,v in pairs(self.member) do
self:GetOff(k,pos)
end
if(self.carrier and not GameObjectUtil.Instance:ObjectIsNULL(self.carrier.gameObject)) then
-- LogUtility.InfoFormat("載具%s被銷燬 name:%s",self.masterID,self.carrier.gameObject.name)
if(not self.isMine) then
GameObject.Destroy(self.carrier.gameObject)
end
end
self.carrier = nil
end
if(not self.isMine) then
self:Destroy()
end
end
function LCarrier:IsWaiting()
return self.status == LCarrier.Status.Wait
end
function LCarrier:IsMoving()
return self.status == LCarrier.Status.Moving
end
function LCarrier:Reset(masterID,carrierID)
self.masterID = masterID
self.carrierID = carrierID or self.carrierID
self:CreateBus()
self:SetIAmMaster(self.masterID == self.myselfID)
end
function LCarrier:StartMove()
if(self.status~=LCarrier.Status.Moving) then
self.status = LCarrier.Status.Moving
self:Visible(true)
self.carrier:GO(self.line,self.progress)
return true
end
return false
end
function LCarrier:Arrive()
self.status = LCarrier.Status.Arrived
end
function LCarrier:GetOn(memberID,index,needAnim)
local oldIndex = self.member[memberID]
if(memberID == self.myselfID) then self:SetIsMine(true) end
self.member[memberID] = index
SceneCarrierProxy.Instance:SetInCarrier(memberID,self)
if(self.carrier) then
if(oldIndex~=nil or memberID ~= self.myselfID) then
--換位置或者其他人坐上來
local passenger = SceneCreatureProxy.FindCreature(memberID)
self:_GetOn(passenger,index)
else
Game.Myself:SetOnCarrier(true)
--我自己首次乘坐行為
FunctionBus.Me():Launch(self.carrier,self.carrierID, index,needAnim)
end
end
end
function LCarrier:MyForceLeave(pos)
if pos then
ProtolUtility.Better_S2C_Vector3(pos, tmpPos)
else
tmpPos[1],tmpPos[2],tmpPos[3] = 0,0,0
end
SceneCarrierProxy.Instance:SetInCarrier(self.myselfID,nil)
self.member[self.myselfID] = nil
if(self.carrier) then
if(self.myselfID ~= self.masterID and not self.destroyed) then
FunctionBus.Me():SetBusNil()
else
print("銷燬我自己的載具")
end
FunctionBus.Me():Shutdown(tmpPos,function()
Game.Myself:SetOnCarrier(false)
self:SetIsMine(false)
self:Visible(false)
if(self.destroyed) then
self:Destroy()
end
end,true)
end
end
function LCarrier:GetOff(memberID,pos)
if pos then
ProtolUtility.Better_S2C_Vector3(pos, tmpPos)
else
tmpPos[1],tmpPos[2],tmpPos[3] = 0,0,0
end
self.member[memberID] = nil
-- print(pos.x,pos.y,pos.z)
SceneCarrierProxy.Instance:SetInCarrier(memberID,nil)
if(self.carrier) then
if(memberID == self.myselfID) then
if(self.myselfID ~= self.masterID and not self.destroyed) then
FunctionBus.Me():SetBusNil()
else
print("銷燬我自己的載具")
end
FunctionBus.Me():Shutdown(tmpPos,function ()
Game.Myself:SetOnCarrier(false)
self:SetIsMine(false)
self:Visible(false)
if(self.destroyed) then
self:Destroy()
end
end)
else
local passenger = SceneCreatureProxy.FindCreature(memberID)
self:_GetOff(passenger,tmpPos)
end
end
end
function LCarrier:_GetOn(creature,seatID)
if(creature) then
local seat = self.carrier:GetSeat(seatID)
if(seat) then
creature:SetOnCarrier(true)
-- 0 坐下
creature.assetRole:PlayAction_Sitdown()
-- 1 setparent
creature:SetParent(seat.transform)
-- 2 去掉陰影
creature.assetRole:SetShadowEnable(false)
-- 3 角度設0
creature:Client_SetDirCmd(AI_CMD_SetAngleY.Mode.SetAngleY,0,true)
end
self:_VisiblePlayer(creature,self.visiblity)
end
end
function LCarrier:_GetOff(creature,pos)
if(creature) then
creature:SetOnCarrier(false)
FunctionSystem.InterruptCreature(creature)
-- 1 陰影整回來
creature.assetRole:SetShadowEnable(true)
-- 2
creature:SetParent(nil)
-- 3
pos = pos or creature:GetPosition()
creature:Client_PlaceXYZTo(pos[1],pos[2],pos[3])
self:_VisiblePlayer(creature,true)
end
end
function LCarrier:SetProgress(progress)
self.progress = progress
if(self.carrier and self:IsMoving()) then
self.carrier:GO(self.line,self.progress)
end
end
function LCarrier:AllGetOffAtOnce()
local passenger
local pos
for id,index in pairs(self.member) do
passenger = SceneCreatureProxy.FindCreature(id)
if(passenger) then
self:_GetOff(passenger)
end
end
end
function LCarrier:AllReGetOn()
local passenger
local pos
for id,index in pairs(self.member) do
passenger = SceneCreatureProxy.FindCreature(id)
self:_GetOn(passenger,index)
end
end
function LCarrier:ChangeCarrier(carrierID)
if(carrierID~=self.carrierID) then
self.carrierID = carrierID
self:AllGetOffAtOnce()
self.carrier:SResetAllCarriers(ResourcePathHelper.BusCarrier(carrierID))
self:AllReGetOn()
end
end