297 lines
7.2 KiB
Plaintext
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 |