using "RO.RoleAvatar" autoImport("Appellation") autoImport("Occupation") local MyselfProxy = class('MyselfProxy', pm.Proxy) MyselfProxy.Instance = nil; MyselfProxy.NAME = "MyselfProxy" --玩家自身的管理 function MyselfProxy:ctor(proxyName, data) self.proxyName = proxyName or MyselfProxy.NAME if(MyselfProxy.Instance == nil) then MyselfProxy.Instance = self end if data ~= nil then self:setData(data) end self.selectAutoNormalAtk = true end function MyselfProxy:onRegister() self.myself = nil self.vars = nil self.buffers = nil self.buffAttr = nil self.buffersProps = RolePropsContainer.CreateAsTable() self.extraProps = RolePropsContainer.CreateAsTable() self:ClearProps() self.buffAttr = {} self.traceItems = {}; self.equipPosStateTimeMap = {}; self.unlockActionIds = {}; self.unlockEmojiIds = {}; end function MyselfProxy:ClearProps( ) -- body if(self.buffersProps)then for _, o in pairs(self.buffersProps.configs) do self.buffersProps:SetValueById(o.id,0) end end if(self.extraProps)then for _, o in pairs(self.extraProps.configs) do self.extraProps:SetValueById(o.id,0) end end end function MyselfProxy:CurMaxJobLevel() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.CUR_MAXJOB) or 0 end function MyselfProxy:onRemove() self.buffersProps:Destroy() self.buffersProps = nil self.extraProps:Destroy() self.extraProps = nil end function MyselfProxy:SetUserRolesInfo(snapShotUserInfo) if(self.snapShotUserInfo == nil)then self.snapShotUserInfo = {}; else TableUtility.TableClear(self.snapShotUserInfo) end local client_datas = {}; local server_datas = snapShotUserInfo.data; for i=1,#server_datas do local server_data = server_datas[i]; local snapShotDataPB = {}; snapShotDataPB.id = server_data.id; snapShotDataPB.baselv = server_data.baselv; snapShotDataPB.hair = server_data.hair; snapShotDataPB.haircolor = server_data.haircolor; snapShotDataPB.lefthand = server_data.lefthand; snapShotDataPB.righthand = server_data.righthand; snapShotDataPB.body = server_data.body; snapShotDataPB.head = server_data.head; snapShotDataPB.back = server_data.back; snapShotDataPB.face = server_data.face; snapShotDataPB.tail = server_data.tail; snapShotDataPB.mount = server_data.mount; snapShotDataPB.eye = server_data.eye; snapShotDataPB.partnerid = server_data.partnerid; snapShotDataPB.portrait = server_data.portrait; snapShotDataPB.mouth = server_data.mouth; snapShotDataPB.clothcolor = server_data.clothcolor; snapShotDataPB.name = server_data.name; snapShotDataPB.sequence = server_data.sequence; snapShotDataPB.isopen = server_data.isopen; snapShotDataPB.deletetime = server_data.deletetime; snapShotDataPB.gender = server_data.gender; snapShotDataPB.profession = server_data.profession; table.insert(client_datas, snapShotDataPB); end self.snapShotUserInfo.data = client_datas; self.snapShotUserInfo.lastselect = snapShotUserInfo.lastselect; self.snapShotUserInfo.deletechar = snapShotUserInfo.deletechar; self.snapShotUserInfo.deletecdtime = snapShotUserInfo.deletecdtime; self.snapShotUserInfo.maincharid = snapShotUserInfo.maincharid; end function MyselfProxy:GetUserRolesInfo() return self.snapShotUserInfo; end function MyselfProxy:GetROB() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.SILVER) or 0 end function MyselfProxy:GetGold() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.GOLD) or 0 end function MyselfProxy:GetDiamond() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.DIAMOND) or 0 end function MyselfProxy:GetGarden() return BagProxy.Instance:GetItemNumByStaticID(GameConfig.MoneyId.Happy) end function MyselfProxy:GetLaboratory() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.LABORATORY) or 0 end function MyselfProxy:RoleLevel() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.ROLELEVEL) or 0 end function MyselfProxy:JobLevel() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.JOBLEVEL) or 0 end function MyselfProxy:GetMyProfession() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.PROFESSION) or 0 end function MyselfProxy:GetMyProfessionType() local profession = self:GetMyProfession() profession = Table_Class[profession] return profession and profession.Type or 0 end function MyselfProxy:GetMyMapID() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.MAPID) or 0 end function MyselfProxy:GetMySex() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.SEX) or 1 end function MyselfProxy:GetZoneId() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.ZONEID) or 0 end function MyselfProxy:GetZoneString() return ChangeZoneProxy.Instance:ZoneNumToString(self:GetZoneId()) end --交易所贈送額度 function MyselfProxy:GetQuota() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.QUOTA) or 0 end --凍結額度 function MyselfProxy:GetQuotaLock() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.QUOTA_LOCK) or 0 end function MyselfProxy:GetHasCharge() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.HASCHARGE) or 0 end function MyselfProxy:GetFashionHide() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.FASHIONHIDE) or 0 end function MyselfProxy:GetPvpCoin() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.PVPCOIN) or 0 end function MyselfProxy:GetLottery() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.LOTTERY) or 0 end function MyselfProxy:GetGuildHonor() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.GUILDHONOR) or 0 end function MyselfProxy:GetServantFavorability() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.FAVORABILITY) or 0 end function MyselfProxy:GetBoothScore() return Game.Myself and Game.Myself.data.userdata:Get(UDEnum.BOOTH_SCORE) or 0 end function MyselfProxy:ResetMyBornPos(x,y,z) LogUtility.Info("bornPos.."..x.." "..y.." "..z) if(Game.Myself) then Game.Myself:Server_SetPosXYZCmd(x,y,z,1000) end -- Player.Me.bornID = -1 -- Player.Me.bornPos = PosUtil.DevideVector3(x,y,z) end function MyselfProxy:ResetMyPos(x,y,z,isgomap) if(isgomap==nil) then isgomap = false end if(Game.Myself) then Game.Myself:Server_SetPosXYZCmd(x,y,z,1000) else LogUtility.Info("嘗試重置位置,但未找到myself") end EventManager.Me():DispatchEvent(ServiceEvent.SceneGoToUserCmd,isgomap) end function MyselfProxy:SetProps(UserAttrSyncCmd,update) -- self.myself:SetDatas(UserAttrSyncCmd.datas,update) -- self.myself:HandleDirtyData() self:setExtraProps(UserAttrSyncCmd.pointattrs,update) -- self.myself:SetProps(UserAttrSyncCmd.attrs,update) if(Game.Myself) then Game.Myself:Server_SetUserDatas(UserAttrSyncCmd.datas,not update) Game.Myself:Server_SetAttrs(UserAttrSyncCmd.attrs) end end function MyselfProxy:InitNMyself(data) if(Game.Myself == nil) then local myData = MyselfData.CreateAsTable(data) Game.Myself = NMyselfPlayer.CreateAsTable(myData) end FunctionSkillEnableCheck.Me():SetMySelf(Game.Myself) end function MyselfProxy:SetMySelfCurRole(data) -- if(self.myself) then -- self.myself:Dispose() -- end if(not self.myself) then -- self.myself = self:InitRole(data) -- EventManager.Me():PassEvent(MyselfEvent.Inited,self.myself) -- FunctionSkillEnableCheck.Me():SetMySelf(self.myself) -- Player.Me.activeRoleData = self.myself.roleInfo --TODO self:InitNMyself(data) end FunctionPlayerPrefs.Me():InitUser(data.id) LocalSaveProxy.Instance:InitDontShowAgain() FunctionPerformanceSetting.Me():Load() end function MyselfProxy:InitRole(data) local p = self.myself or MySelfPlayer.new(data.id) p.name = data.name p.roleInfo.ID = data.id -- p.props = RolePropsContainer.new() p:ResetPropToRoleInfo() return p end function MyselfProxy:SetChooseRoleId(id) self.chooseRoleId = id; end function MyselfProxy:GetChooseRoleId() return self.chooseRoleId; end function MyselfProxy:SetShortCuts(shortCuts) if(shortCuts ~= nil )then for i=1,#shortCuts do end end end function MyselfProxy:RecvVarUpdate( data ) if(self.vars == nil)then self.vars = {}; end if(data ~= nil)then for i=1,#data do local single = data[i] if(single)then local varData = self.vars[single.type]; if(not varData)then varData = { type = single.type, time = single.time, }; self.vars[single.type] = varData; end varData.value = single.value; end end end end function MyselfProxy:getVarByType( type ) if self.vars == nil then return end return self.vars[type] end function MyselfProxy:getVarValueByType( type ) if not self.vars then return; end return self.vars[type] and self.vars[type].value; end function MyselfProxy:RecvBufferUpdate( data ) -- body printRed("MyselfProxy:RecvBufferUpdate( data )") self.buffers = self.buffers or {} local updateBffs = {} local addBffs = {} if(data.buff)then for i=1,#data.buff do local single = data.buff[i] if(self.buffers[single.id])then local data = {} data.id = single.id data.oldLayer = self.buffers[single.id] data.newLayer = single.layer table.insert(updateBffs,data) else table.insert(addBffs,single) end self.buffers[single.id] = single.layer end end for i=1,#updateBffs do local single = updateBffs[i] local buffData = Table_Buffer[single.id] local effect = buffData["BuffEffect"] local newLayer = single.newLayer local oldLayer = single.oldLayer if(effect.type == "AttrChange")then for j,w in pairs(effect) do local prop = self.buffersProps[j] if(j ~= "type" and prop and type(w) == "number")then local oldValue = self.buffersProps:GetValueByName(j) local deltaValue = (newLayer - oldLayer)*w if(prop.propVO.isPercent)then deltaValue = deltaValue*1000 oldValue = oldValue*1000 end local value = oldValue + deltaValue self.buffersProps:SetValueByName(j,value) self.buffAttr[j] = value end end end end for i=1,#addBffs do local single = addBffs[i] local buffData = Table_Buffer[single.id] if buffData==nil or buffData["BuffEffect"]==nil then break end local effect = buffData["BuffEffect"] local v = single.layer if(effect.type == "AttrChange")then for j,w in pairs(effect) do if(j ~= "type" and type(w) == "number")then local prop = self.buffersProps[j] if(prop)then local oldValue = self.buffersProps:GetValueByName(j) local deltaValue = w*v if(prop.propVO.isPercent)then deltaValue = deltaValue*1000 oldValue = oldValue*1000 end local vl = deltaValue + oldValue self.buffersProps:SetValueByName(j,vl) self.buffAttr[j] = vl end end end end end end function MyselfProxy:setExtraProps( props ,update ) -- body if(props~=nil and #props >0)then for i = 1, #props do if props[i] ~= nil then -- print("prop type:"..props[i].type.." value:"..props[i].value) self.extraProps:SetValueById(props[i].type,props[i].value) end end end end --profession GameConfig.AdvancedBranch 職業的一轉 function MyselfProxy:checkProfessionIsOpenById( profession ) -- body self:checkProfessionIsOpenByProfessionData(Table_Class[profession]) return false end function MyselfProxy:checkProfessionIsOpenByProfessionData( professionData ) -- body -- local firstId = 0 -- if(professionData)then -- local sameTList = SkillProxy.Instance.sameProfessionType[professionData.Type] -- for i=1,#sameTList do -- local single = sameTList[i] -- if(single.id == professionData.id)then -- local data = single -- while #data.AdvanceClass <= 2 -- do -- data = data.previousClasses -- end -- firstId = data.id -- break -- end -- end -- local list = GameConfig.AdvancedBranch[firstId] -- if(list and list[2] ~= 0)then -- return true -- end -- end return false end function MyselfProxy:initAllTitle( data ) -- printRed("MyselfProxy:initAllTitle") self.appellations = {} local titles = data.title_datas for i=1,#titles do local title = titles[i] -- printRed("playerTitle:",title.id,title.title_type,title.createtime) local Appellation = Appellation.new(title.id,title.title_type,title.createtime) self.appellations[#self.appellations+1] = Appellation end end function MyselfProxy:newTitle( data ) local titleData = data.title_data local id = data.charid if(id == Game.Myself.data.id)then local Appellation = Appellation.new(titleData.id,titleData.title_type,titleData.createtime) for i=1,#self.appellations do local title = self.appellations[i] if(title.id == Appellation.id)then self.appellations[i] = Appellation return end end self.appellations[#self.appellations+1] = Appellation end if(titleData.title_type == UserEvent_pb.ETITLE_TYPE_MANNUAL)then --play levelup anim local creature = NSceneUserProxy.Instance:Find(id) if(creature)then GameFacade.Instance:sendNotification(SceneUserEvent.LevelUp, creature,SceneUserEvent.AppellationUp) end end -- printRed("playerTitle:",titleData.id,titleData.title_type,titleData.createtime) end function MyselfProxy:GetCurManualAppellation( ) -- body local curApp = nil for i=1,#self.appellations do local title = self.appellations[i] if title.titleType == UserEvent_pb.ETITLE_TYPE_MANNUAL and not curApp then curApp = title break end end -- printRed("curApp",curApp) if(curApp)then local nextApp = self:getAppellationById(curApp.staticData.PostID) -- printRed("next",nextApp) while(nextApp) do curApp = nextApp nextApp = self:getAppellationById(curApp.staticData.PostID) end end return curApp end function MyselfProxy:GetCurFoodCookerApl( ) -- body local curApp = nil for i=1,#self.appellations do local title = self.appellations[i] if title.titleType == UserEvent_pb.ETITLE_TYPE_FOODCOOKER and not curApp then curApp = title break end end -- printRed("curApp",curApp) if(curApp)then local nextApp = self:getAppellationById(curApp.staticData.PostID) -- printRed("next",nextApp) while(nextApp) do curApp = nextApp nextApp = self:getAppellationById(curApp.staticData.PostID) end end return curApp end function MyselfProxy:GetCurFoodTasteApl( ) -- body local curApp = nil for i=1,#self.appellations do local title = self.appellations[i] if title.titleType == UserEvent_pb.ETITLE_TYPE_FOODTASTER and not curApp then curApp = title break end end -- printRed("curApp",curApp) if(curApp)then local nextApp = self:getAppellationById(curApp.staticData.PostID) -- printRed("next",nextApp) while(nextApp) do curApp = nextApp nextApp = self:getAppellationById(curApp.staticData.PostID) end end return curApp end function MyselfProxy:getAppellationById( id ) -- body if(not id)then return end for i=1,#self.appellations do local title = self.appellations[i] if title.id == id then return title end end end function MyselfProxy:SetTraceItem(updates, dels) if(updates)then for i=1,#updates do local upItem = updates[i]; self.traceItems[upItem.itemid] = upItem; end end if(dels)then for i=1,#dels do local delid = dels[i]; self.traceItems[delid] = nil; end end end function MyselfProxy:GetTraceItems() local result = {}; for _,item in pairs(self.traceItems)do table.insert(result, item); end return result; end function MyselfProxy:GetTraceItemByItemId(itemid) return self.traceItems[itemid] end -- My Unlock EmojiIds And ActionIdss -- Begin function MyselfProxy:SetUnlockActionIdMap(ids) -- TableUtility.TableClear(self.unlockActionIds) for i=1,#ids do local id = ids[i]; self.unlockActionIds[id] = 1; end end function MyselfProxy:GetUnlockActionMap() return self.unlockActionIds; end function MyselfProxy:SetUnlockEmojiMap(ids) -- TableUtility.TableClear(self.unlockEmojiIds) for i=1,#ids do local id = ids[i]; self.unlockEmojiIds[id] = 1; end end function MyselfProxy:GetUnlockEmojiMap() return self.unlockEmojiIds; end function MyselfProxy:HasJobBreak() if(GameConfig.SystemForbid.Peak) then return false end return FunctionUnLockFunc.Me():CheckCanOpen(450) end function MyselfProxy:HasJobNewBreak() return FunctionUnLockFunc.Me():CheckCanOpen(451) end function MyselfProxy:HasMaxJobBreak() return self:HasJobBreak() and self:CurMaxJobLevel() >= GameConfig.Dead.max_peaklv or false end function MyselfProxy:UpdateRandomFunc(array, beginIndex, endIndex) if nil ~= self.myself then self.myself:UpdateRandomFunc(array, beginIndex, endIndex) end if nil ~= Game.Myself then Game.Myself.data:UpdateRandomFunc(array, beginIndex, endIndex) end end function MyselfProxy:Test_SetEquipPos() local server_EquipPosDatas = {}; for i=1, 3 do local t = {}; t.pos = i; t.offstarttime = ServerTime.CurServerTime()/1000; t.offendtime = t.offstarttime + 60; t.protecttime = 0; t.protectalways = 1; table.insert(server_EquipPosDatas, t); end self:Server_SetEquipPos_StateTime(server_EquipPosDatas); end -- Equip Pos Begin function MyselfProxy:Server_SetEquipPos_StateTime(server_EquipPosDatas) local logStr = "脫卸裝備:"; for i=1,#server_EquipPosDatas do local d = server_EquipPosDatas[i]; local ld = self.equipPosStateTimeMap[d.pos]; if(ld == nil)then ld = {}; self.equipPosStateTimeMap[d.pos] = ld; end ld.offstarttime = d.offstarttime; ld.offendtime = d.offendtime; ld.offduration = d.offendtime - d.offstarttime; ld.protecttime = d.protecttime; ld.protectalways = d.protectalways; logStr = logStr .. string.format("部位:%s || 脫卸開始時間:%s 脫卸結束時間:%s 裝備保護時間:%s 裝備永久保護:%s", tostring(d.pos), os.date("%m月%d日%H點%M分%S秒", d.offstarttime), os.date("%m月%d日%H點%M分%S秒", d.offendtime), os.date("%m月%d日%H點%M分%S秒", d.protecttime), tostring(d.protectalways) ) logStr = logStr .. "\n"; end helplog(logStr); FunctionBuff.Me():UpdateOffingEquipBuff(); FunctionBuff.Me():UpdateProtectEquipBuff(); end function MyselfProxy:EquipPos_UpdateBuff() end function MyselfProxy:GetEquipPos_StateTime(site) return self.equipPosStateTimeMap[site]; end function MyselfProxy:IsEquipPosInOffing(site) local stateTime = self:GetEquipPos_StateTime(site); if(stateTime)then if(stateTime.offendtime and stateTime.offendtime > 0)then return ServerTime.ServerDeltaSecondTime(stateTime.offendtime * 1000) > 0; end end return false; end function MyselfProxy:GetOffingEquipPoses() local offPoses = {}; for k,v in pairs(self.equipPosStateTimeMap)do if(self:IsEquipPosInOffing(k))then table.insert(offPoses, k); end end table.sort(offPoses, function (a, b) return a < b; end); return offPoses; end function MyselfProxy:IsEquipPosInProtecting(site) local stateTime = self:GetEquipPos_StateTime(site); if(stateTime)then if(stateTime.protectalways > 0)then return true; end if((stateTime.protecttime and stateTime.protecttime > 0))then return ServerTime.ServerDeltaSecondTime(stateTime.protecttime * 1000) > 0; end end return false; end function MyselfProxy:HandleRelieveCd(data) self.reliveStamp = data.time + ServerTime.CurServerTime()/1000 self.reliveName = data.name end function MyselfProxy:ClearReliveCd() self.reliveStamp = nil self.reliveName = nil end function MyselfProxy:GetProtectEquipPoses() local protectPoses = {}; for k,v in pairs(self.equipPosStateTimeMap)do if(self:IsEquipPosInProtecting(k))then table.insert(protectPoses, k); end end table.sort(protectPoses, function (a, b) return a < b; end); return protectPoses; end function MyselfProxy:IsUnlockAstrolabe() local panelId = PanelConfig.AstrolabeView.id; return FunctionUnLockFunc.Me():CheckCanOpenByPanelId(panelId); end return MyselfProxy