autoImport("LCarrier") autoImport("SceneObjectProxy") SceneCarrierProxy = class('SceneCarrierProxy', SceneObjectProxy) SceneCarrierProxy.Instance = nil; SceneCarrierProxy.NAME = "SceneCarrierProxy" --場景玩家(可見玩家)數據管理,新增、刪除、查詢玩家 function SceneCarrierProxy:ctor(proxyName, data) self.proxyName = proxyName or SceneCarrierProxy.NAME self.waitMembers = {} self:Reset() self.addMode = SceneObjectProxy.AddMode.Normal if(SceneCarrierProxy.Instance == nil) then SceneCarrierProxy.Instance = self end EventManager.Me():AddEventListener(SceneCreatureEvent.CreatureRemove,self.CreatureRemoveHandler,self) EventManager.Me():AddEventListener(MyselfEvent.LeaveCarrier,self.MeLeaveCarrierHandler,self) end function SceneCarrierProxy:Reset() self.carrierMap = {} self.inCarriers = {} self.myCarrier = nil -- self.waitMembers = {} end function SceneCarrierProxy:GetMyCarrier() return self.myCarrier end function SceneCarrierProxy:GetMyWaitMembers() return self.myCarrier and self.waitMembers[self.myCarrier.masterID] or nil end function SceneCarrierProxy:RemoveOtherWaitMembers(masterid) for k,v in pairs(self.waitMembers) do if(k~=masterid) then self.waitMembers[k] = nil end end end function SceneCarrierProxy:CarrierWaitMembers(masterid,members) local waits = {} self.waitMembers = self.waitMembers or {} self.waitMembers[masterid] = waits -- local str = "" local member local data local myselfID = Game.Myself.data.id for i=1,#members do member = members[i] if(member.id ~= myselfID) then data = {id = member.id,name = member.name} waits[#waits + 1] = data -- str = str..member.name.." " if(member.id == masterid) then data.agree = true end end end -- print(str) end function SceneCarrierProxy:MemberAgree(data) local waits = self.waitMembers[data.masterid] local member if(waits) then for i=1,#waits do member = waits[i] if(member.name == data.membername) then member.agree = data.agree break end end end end function SceneCarrierProxy:SetInCarrier(id,carrier) self.inCarriers[id] = carrier end function SceneCarrierProxy:CreatureIsInCarrier(id) return self.inCarriers[id] ~= nil end function SceneCarrierProxy:Find(guid) -- print("try find id:"..guid.." type:"..type(guid)) return self.carrierMap[guid] end function SceneCarrierProxy:CreatureRemoveHandler(evt) local id = evt.data local carrier = self:Find(id) if(carrier) then if(not carrier.isMine) then self:RemoveCarrier(carrier) end end end function SceneCarrierProxy:TryCreateCarrier(carrierID,masterID) local carrier = self:Find(masterID) if(not carrier) then local alreadyInCarrier = self:CreatureIsInCarrier(masterID) if(not alreadyInCarrier) then carrier = LCarrier.CreateAsTable() carrier:Reset(masterID,carrierID) self.carrierMap[masterID] = carrier else errorLog(string.format("場景中已經有masterid為%s的載具了,伺服器九屏又通知新增了一次",masterID)) end end return carrier end function SceneCarrierProxy:ChangeCarrier(masterid,carrierid) local carrier = self:Find(masterid) if(carrier) then carrier:ChangeCarrier(carrierid) end end function SceneCarrierProxy:CarrierChangeMaster(carrier,masterID,newMasterID) local carrier = carrier or self:Find(data.masterid) if(carrier) then self.carrierMap[masterID] = nil self.carrierMap[newMasterID] = carrier carrier:Reset(newMasterID) carrier:GetOn(newMasterID,LCarrier.MasterSeat) if(newMasterID==Game.Myself.data.id) then self.myCarrier = carrier end end end function SceneCarrierProxy:CarrierAddMember(carrier,memberID,index,needAnim) if(carrier) then --九屏自己的話忽略,別人的話,移除 local myselfID = Game.Myself.data.id if(memberID == myselfID) then self.myCarrier = carrier GameFacade.Instance:sendNotification(InviteConfirmEvent.RemoveInviteByType,InviteType.Carrier) FunctionCheck.Me():SetSyncMove(FunctionCheck.CannotSyncMoveReason.OnCarrier,false) self:RemoveOtherWaitMembers(carrier.masterID) -- print("start",carrier.carrierID,index) else -- SceneUserProxy.Instance:Remove(memberID) end carrier:GetOn(memberID,index,needAnim) end end function SceneCarrierProxy:CreateMyCarrier(data) -- if(self.myCarrier) then -- FunctionBus.Me():Launch(self.myCarrier.carrierID,1) -- end end function SceneCarrierProxy:SyncCarrierMove(data) local carrier = self:Find(data.masterid) if(carrier) then carrier:SetProgress(data.progress/100) end end function SceneCarrierProxy:CarrierStart(data) local carrier = self:Find(data.masterid) -- print(carrier.masterID,carrier.line,"server 發車") if(carrier) then carrier.line = data.line if(carrier:StartMove() and carrier.isMine) then GameFacade.Instance:sendNotification(CarrierEvent.MyCarrierStart) end end end function SceneCarrierProxy:ReachCarrier(data) local carrier = self:Find(data.masterid) if(carrier) then self:RemoveCarrier(carrier,data.pos) end end function SceneCarrierProxy:LeaveCarrier(data) local carrier = self:Find(data.masterid) -- print(string.format("%s車中,玩家%s離開,新的駕駛者%s ,離開座標:%s %s %s,是否全部:%s",data.masterid,data.charid,data.newmasterid,data.pos.x,data.pos.y,data.pos.z,tostring(data.all))) if(carrier) then carrier:GetOff(data.charid,data.pos) if(carrier.isMine) then FunctionCheck.Me():SetSyncMove(FunctionCheck.CannotSyncMoveReason.OnCarrier,true) --通知UI有人離開 GameFacade.Instance:sendNotification(CarrierEvent.MyCarrierLeaveMember,data.charid) end if(data.newmasterid>0) then self:CarrierChangeMaster(carrier,data.masterid,data.newmasterid) elseif(data.all) then self:RemoveCarrier(carrier,data.pos) end end end function SceneCarrierProxy:MeLeaveCarrierHandler(bus) -- helplog("MeLeaveCarrierHandler") self.myCarrier = nil self.waitMembers = {} end function SceneCarrierProxy:Add(data) local carrierInfo = data.carrier if(data.guid ~= Game.Myself.data.id) then if(carrierInfo and carrierInfo.masterid>0 and carrierInfo.id>0) then print(data.guid,"add",carrierInfo.id,carrierInfo.masterid,"進度:",carrierInfo.progress) local carrier = self:TryCreateCarrier(carrierInfo.id,carrierInfo.masterid) carrier.line = carrierInfo.line if(carrierInfo.progress>0) then carrier:SetProgress(carrierInfo.progress/100) if(carrierInfo.masterid==data.guid) then carrier:StartMove() end end if(carrierInfo.assemble and carrierInfo.assemble >0) then carrier:ChangeCarrier(carrierInfo.assemble) end self:CarrierAddMember(carrier,data.guid,carrierInfo.index) end elseif(carrierInfo and carrierInfo.id ==0 and carrierInfo.masterid ==0 and self.myCarrier) then self.myCarrier:GetOff(data.guid,data.pos) self:RemoveCarrier(self.myCarrier,data.pos) end end function SceneCarrierProxy:PureAddSome(datas) for i = 1, #datas do if datas[i] ~= nil then self:Add(datas[i]) end end end function SceneCarrierProxy:RefreshAdd(datas) return nil end function SceneCarrierProxy:AddSome(datas) if(self.addMode == SceneObjectProxy.AddMode.Normal) then return self:PureAddSome(datas) elseif(self.addMode == SceneObjectProxy.AddMode.Refresh) then return self:RefreshAdd(datas) end end function SceneCarrierProxy:InfoAdd(data) -- print("InfoAdd",data.carrierid,data.masterid) local carrier = self:TryCreateCarrier(data.carrierid,data.masterid) if(carrier) then local needAnim = (data.needanimation == 1) --master單獨處理 self:CarrierAddMember(carrier,data.masterid,LCarrier.MasterSeat,needAnim) for i=1,#data.members do -- print(data.members[i].id,data.members[i].index) self:CarrierAddMember(carrier,data.members[i].id,data.members[i].index,needAnim) end end end function SceneCarrierProxy:InfoPureAddSome(datas) for i = 1, #datas do if datas[i] ~= nil then self:InfoAdd(datas[i]) end end end function SceneCarrierProxy:InfoRefreshAdd(datas) return nil end function SceneCarrierProxy:InfoAddSome(datas) if(self.addMode == SceneObjectProxy.AddMode.Normal) then return self:InfoPureAddSome(datas) elseif(self.addMode == SceneObjectProxy.AddMode.Refresh) then return self:InfoRefreshAdd(datas) end end function SceneCarrierProxy:RemoveCarrier(carrier,pos) if(carrier) then if(carrier.isMine) then FunctionCheck.Me():SetSyncMove(FunctionCheck.CannotSyncMoveReason.OnCarrier,true) end self.carrierMap[carrier.masterID] = nil carrier:DestroyCarrier(pos) -- print("SceneCarrierProxy移除載具",carrier.masterID) end end function SceneCarrierProxy:Remove(guid) local carrier = self:Find(guid) --TODO end function SceneCarrierProxy:RemoveSome(guids) if(guids ~= nil and #guids >0) then for i = 1, #guids do self:Remove(guids[i]) end end end function SceneCarrierProxy:Clear() -- helplog("清空carrier") self:ChangeAddMode(SceneObjectProxy.AddMode.Normal) for k,v in pairs(self.carrierMap)do if(v==self.myCarrier) then v:MyForceLeave() end v:DestroyCarrier() end -- FunctionBus.Me():Shutdown() self:Reset() -- GameFacade.Instance:sendNotification(SceneUserEvent.SceneRemoveRoles,roles) end