MyselfData = reusableClass("MyselfData",PlayerData) autoImport("Occupation") autoImport("GvGPvpPrayData") autoImport("BuffLimit") local _BuffType = BuffType -- random func begin RandomFunction = class("RandomFunction") function RandomFunction:ctor(a) self:UpdateArray(a, 1, #a) self.index = 1 end function RandomFunction:ResetIndex(i) self.index = i end function RandomFunction:UpdateArray(a, begIndex, endIndex) if nil == self.array then self.array = {} end for i=begIndex, endIndex do self.array[i] = a[i-begIndex+1] end end function RandomFunction:GetRandom() local p, newIndex = CommonFun.GetRandom(self.array, self.index) self.index = newIndex return p end -- random func end -- hatred func begin HatredFunction = class("HatredFunction") HatredFunction.ValidTime = 3 function HatredFunction.InfoValid(info, time) return info.lastAttackTime+HatredFunction.ValidTime > time end function HatredFunction:ctor() self.targets = {} end function HatredFunction:RefreshTargets() local invalidTargets = {} local time = Time.time for k,v in pairs(self.targets) do if not HatredFunction.InfoValid(v, time) then invalidTargets[#invalidTargets+1] = k end end for i=1, #invalidTargets do self.targets[invalidTargets[i]] = nil -- print(string.format("remove invalid hatred: %d", invalidTargets[i])) end end function HatredFunction:RefreshInfo(targetID) local info = self.targets[targetID] if nil == info then info = {} self.targets[targetID] = info end info.lastAttackTime = Time.time -- print(string.format("RefreshInfo: %d", targetID)) end function HatredFunction:CheckValid(targetID, time) local info = self.targets[targetID] if nil ~= info then -- print(string.format("check hatred: %d, %s, %f, %f", targetID, tostring(HatredFunction.InfoValid(info, time)), info.lastAttackTime, time)) return HatredFunction.InfoValid(info, time) end return false end -- hatred func end -- 玩家數據 function MyselfData:ctor() MyselfData.super.ctor(self) self.shape = CommonFun.Shape.M self.race = CommonFun.Race.DemiHuman self.transformData = TransformData.new() self.transformData:CacheOrigin(self) self:InitGuildPray() end function MyselfData:GetCamp() return RoleDefines_Camp.FRIEND end function MyselfData:GetName() return self.name end function MyselfData:GetTeamID() return self.teamID end function MyselfData:SetTeamID(teamID) self.teamID = teamID end local PartIndex = nil local PartIndexEx = nil function MyselfData:GetDressParts() if(PartIndex==nil) then PartIndex = Asset_Role.PartIndex end if(PartIndexEx==nil) then PartIndexEx = Asset_Role.PartIndexEx end local parts = Asset_Role.CreatePartArray() if(self.userdata) then local userData = self.userdata parts[PartIndex.Body] = userData:Get(UDEnum.BODY) or 0 parts[PartIndex.Hair] = userData:Get(UDEnum.HAIR) or 0 parts[PartIndex.LeftWeapon] = userData:Get(UDEnum.LEFTHAND) or 0 parts[PartIndex.RightWeapon] = userData:Get(UDEnum.RIGHTHAND) or 0 parts[PartIndex.Head] = userData:Get(UDEnum.HEAD) or 0 parts[PartIndex.Wing] = userData:Get(UDEnum.BACK) or 0 parts[PartIndex.Face] = userData:Get(UDEnum.FACE) or 0 parts[PartIndex.Tail] = userData:Get(UDEnum.TAIL) or 0 parts[PartIndex.Eye] = userData:Get(UDEnum.EYE) or 0 parts[PartIndex.Mouth] = userData:Get(UDEnum.MOUTH) or 0 parts[PartIndex.Mount] = userData:Get(UDEnum.MOUNT) or 0 parts[PartIndexEx.Gender] = userData:Get(UDEnum.SEX) or 0 parts[PartIndexEx.HairColorIndex] = userData:Get(UDEnum.HAIRCOLOR) or 0 parts[PartIndexEx.EyeColorIndex] = userData:Get(UDEnum.EYECOLOR) or 0 parts[PartIndexEx.BodyColorIndex] = userData:Get(UDEnum.CLOTHCOLOR) or 0 else for i=1,12 do parts[i] = 0 end end return parts end function MyselfData:GetLernedSkillLevel(skillID) return SkillProxy.Instance:GetLearnedSkillLevelBySortID(skillID) end function MyselfData:GetArrowID() local item = BagProxy.Instance:GetNowActiveItem() if nil ~= item and nil ~= item.staticData then return item.staticData.id end return MyselfData.super.GetArrowID(self) end function MyselfData:GetEquipedRefineLv(site) local weaponData = BagProxy.Instance.roleEquip:GetEquipBySite(site) if nil ~= weaponData and nil ~= weaponData.equipInfo and nil ~= weaponData.equipInfo.refinelv then return weaponData.equipInfo.refinelv end return MyselfData.super.GetEquipedRefineLv(self,site) end function MyselfData:GetEquipedItemNum(itemid) return BagProxy.Instance.roleEquip:GetEquipedItemNum( itemId ) end function MyselfData:GetEquipedWeaponType() return self:GetEquipedType(GameConfig.EquipType[1].site[1]) end function MyselfData:GetEquipedType(site) local weaponData = BagProxy.Instance.roleEquip:GetEquipBySite(site) if nil ~= weaponData and nil ~= weaponData.staticData and nil ~= weaponData.staticData.Type then return weaponData.staticData.Type end return MyselfData.super:GetEquipedType(self, site) end function MyselfData:GetEquipedID(site) local weaponData = BagProxy.Instance.roleEquip:GetEquipBySite(site) if nil ~= weaponData and nil ~= weaponData.staticData and nil ~= weaponData.staticData.id then return weaponData.staticData.id end return MyselfData.super:GetEquipedID(self, site) end function MyselfData:GetEnchantAttrsBySite(site) local weaponData = BagProxy.Instance.roleEquip:GetEquipBySite(site) if (weaponData and weaponData.enchantInfo) then return weaponData.enchantInfo:GetEnchantAttrs() end return MyselfData.super:GetEnchantAttrsBySite(self,site) end function MyselfData:GetCombineEffectsBySite(site) local weaponData = BagProxy.Instance.roleEquip:GetEquipBySite(site) if (weaponData and weaponData.enchantInfo) then return weaponData.enchantInfo:GetCombineEffects() end return MyselfData.super:GetCombineEffectsBySite(self,site) end function MyselfData:GetDynamicSkillInfo(skillID) return SkillProxy.Instance:GetDynamicSkillInfoByID(skillID) end function MyselfData:GetCartNums() local max = BagProxy.Instance.barrowBag:GetUplimit() local items = BagProxy.Instance.barrowBag:GetItems() return #items,max end function MyselfData:GetPackageItemNum( itemid ) return BagProxy.Instance:GetItemNumByStaticID( itemid ) end function MyselfData:GetEquipCardNum(site,cardID) return BagProxy.Instance.roleEquip:GetEquipCardNumBySiteAndCardID( site,cardID ) end function MyselfData:GetRunePoint(specialEffectID) return AstrolabeProxy.Instance:GetSpecialEffectCount(specialEffectID) end function MyselfData:GetActiveAstrolabePoints() return AstrolabeProxy.Instance:GetActiveStarPoints() end function MyselfData:GetAdventureSavedHeadWear(quality) return AdventureDataProxy.Instance:getNumOfStoredHeaddress(quality) end function MyselfData:GetAdventureSavedCard(quality) return AdventureDataProxy.Instance:getNumOfStoredCard(quality) end function MyselfData:GetAdventureTitle() return AdventureDataProxy.Instance:GetCurAdventureAppellation() end function MyselfData:GetGuildData() if(self.guildData==nil) then return GuildProxy.Instance.myGuildData end return self.guildData end -- 返回地圖ID,地圖型別(1野外 2PVP 3副本 4GVG) function MyselfData:GetMapInfo() local mapmanager = Game.MapManager local mode = 1 if(mapmanager:IsPVPMode()) then mode = 2 if(mapmanager:IsPVPMode_GVGDetailed()) then mode = 4 end elseif(mapmanager:IsRaidMode())then mode = 3 end return mapmanager:GetMapID(),mode end -- random func begin function MyselfData:UpdateRandomFunc(array, begIndex, endIndex) if nil ~= self.randomFunc then self.randomFunc:UpdateArray(array, begIndex, endIndex) else self.randomFunc = RandomFunction.new(array, begIndex, endIndex) end end function MyselfData:GetRandom() return self.randomFunc and self.randomFunc:GetRandom() or MyselfData.super.GetRandom(self) end function MyselfData:ResetRandom() if self.randomFunc then self.randomFunc:ResetIndex(1) end end -- random func end -- hatred func begin function MyselfData:RemoveInvalidHatred() if nil ~= self.hatredFunc then self.hatredFunc:RefreshTargets() end end function MyselfData:RefreshHatred(id) -- print(string.format("RefreshHatred: %d", id)) if nil == self.hatredFunc then self.hatredFunc = HatredFunction.new() end self.hatredFunc:RefreshInfo(id) end function MyselfData:CheckHatred(id, time) return nil ~= self.hatredFunc and self.hatredFunc:CheckValid(id, time) end -- hatred func end function MyselfData:InitGuildPray() self.guildPray = {}; self.gvgPvpPray={}; for _,data in pairs(Table_Guild_Faith) do if(GuildCmd_pb.EPRAYTYPE_GODDESS==data.Type)then local gpdata = {}; gpdata.staticData = data; gpdata.level = 0; self.guildPray[data.id] = gpdata; end end end function MyselfData:SetGuildPray(guildPray) for i=1,#guildPray do local gp = guildPray[i]; local prayData = GvGPvpPrayData.new() prayData:SetPrayData(gp) local t = prayData.type if(t>0)then if(nil==self.gvgPvpPray[t])then self.gvgPvpPray[t]={} end for i=1,#self.gvgPvpPray do for j=1,#self.gvgPvpPray[i] do if(self.gvgPvpPray[i][j].id==prayData.id)then self.gvgPvpPray[i][j]=prayData return; end end end table.insert(self.gvgPvpPray[t],prayData) else if(gp.pray and gp.lv)then local selfgp = self.guildPray[gp.pray]; if(selfgp)then selfgp.level = gp.lv; else errorLog(string.format("Not Find prayType:%s", gp.pray)); end end end end end function MyselfData:AddBuff(buffID,fromID,layer,level) if(buffID==nil) then return end local buffInfo = Table_Buffer[buffID] if nil == buffInfo then return end local buffeffect = buffInfo.BuffEffect if(buffeffect.type == _BuffType.LimitSkill) then -- local oldFrom = self:GetBuffFromID() -- if(oldFrom~=0 and oldFrom~=fromID) then -- --change 來源 -- self:_RemoveLimitBuff(buffID,oldFrom,buffeffect.id) -- end self:_AddLimitBuff(buffInfo,fromID,buffeffect.id,buffeffect.IgnoreTarget,buffeffect.notid) elseif buffeffect.type == _BuffType.LimitUseItem then ItemsWithRoleStatusChange:Instance():AddBuffLimitUseItem(buffeffect.ok_type, buffeffect.forbid_all) elseif buffeffect.type == _BuffType.ForbidEquip then ItemsWithRoleStatusChange:Instance():AddBuffForbidEquip(buffeffect) end MyselfData.super.AddBuff(self,buffID,fromID,layer,level) end function MyselfData:RemoveBuff(buffID) if(buffID==nil) then return end local buffInfo = Table_Buffer[buffID] if nil == buffInfo then return end local buffeffect = buffInfo.BuffEffect if(buffeffect.type == _BuffType.LimitSkill) then self:_RemoveLimitBuff(buffInfo,fromID,buffeffect.id,buffeffect.notid) elseif buffeffect.type == _BuffType.LimitUseItem then ItemsWithRoleStatusChange:Instance():RemoveBuffLimitUseItem(buffeffect.ok_type, buffeffect.forbid_all) elseif buffeffect.type == _BuffType.ForbidEquip then ItemsWithRoleStatusChange:Instance():RemoveBuffForbidEquip(buffeffect) end MyselfData.super.RemoveBuff(self,buffID) end function MyselfData:_AddLimitBuff(buffInfo,fromID,skillIDs,ignoreTarget,notSkillIDs) if skillIDs ~= nil then if self.limitBuffs == nil then self.limitBuffs = ReusableTable.CreateTable() self.limitBuffs.count = 0 end for i=1,#skillIDs do self:_AddLimitSkillBuff(self.limitBuffs, skillIDs[i], fromID, ignoreTarget) end EventManager.Me():PassEvent(MyselfEvent.EnableUseSkillStateChange) end if notSkillIDs ~= nil then if self.limitNotBuffs == nil then self.limitNotBuffs = ReusableTable.CreateTable() self.limitNotBuffs.count = 0 end for i=1,#notSkillIDs do self:_AddLimitSkillBuff(self.limitNotBuffs, notSkillIDs[i], fromID, ignoreTarget) end EventManager.Me():PassEvent(MyselfEvent.EnableUseSkillStateChange) end end function MyselfData:_AddLimitSkillBuff(map, skillid, fromID, ignoreTarget) local limitBuff = map[skillid] if limitBuff == nil then limitBuff = BuffLimit.CreateAsTable(data) map[skillid] = limitBuff map.count = map.count + 1 end limitBuff:SetData(fromID, ignoreTarget) end function MyselfData:_RemoveLimitBuff(buffInfo,fromID,skillIDs,notSkillIDs) if self.limitBuffs ~= nil and skillIDs ~= nil then for i=1,#skillIDs do self:_RemoveLimitSkillBuff(self.limitBuffs, skillIDs[i]) end EventManager.Me():PassEvent(MyselfEvent.EnableUseSkillStateChange) end if self.limitNotBuffs ~= nil and notSkillIDs ~= nil then for i=1,#notSkillIDs do self:_RemoveLimitSkillBuff(self.limitNotBuffs, notSkillIDs[i]) end EventManager.Me():PassEvent(MyselfEvent.EnableUseSkillStateChange) end end function MyselfData:_RemoveLimitSkillBuff(map, skillid) local limitBuff = map[skillid] if limitBuff ~= nil then limitBuff:Destroy() map[skillid] = nil map.count = map.count - 1 end end function MyselfData:ForceClearWeakFreezeSkillBuff() if(self.weakFreezeBuffs~=nil) then ReusableTable.DestroyAndClearTable(self.weakFreezeBuffs) self.weakFreezeBuffs = nil end end function MyselfData:CanBreakWeakFreezeBySkillID(skillIdAndLevel) return self:CanBreakWeakFreezeBySkillSortID(math.floor(skillIdAndLevel/1000)) end function MyselfData:CanBreakWeakFreezeBySkillSortID(sortID) if(self.weakFreezeBuffs and self.weakFreezeBuffs.count > 0) then local skillBuff = self.weakFreezeBuffs[sortID] if(skillBuff) then if(#skillBuff == self.weakFreezeBuffs.count) then return true end end end return false end function MyselfData:_ClearBuffs() if self.limitBuffs ~= nil then for i=#self.limitBuffs, 1, -1 do self.limitBuffs[i]:Destroy() self.limitBuffs[i] = nil end ReusableTable.DestroyTable(self.limitBuffs) self.limitBuffs = nil end if self.limitNotBuffs ~= nil then for i=#self.limitNotBuffs, 1, -1 do self.limitNotBuffs[i]:Destroy() self.limitNotBuffs[i] = nil end ReusableTable.DestroyTable(self.limitNotBuffs) self.limitNotBuffs = nil end self:ForceClearWeakFreezeSkillBuff() MyselfData.super._ClearBuffs(self) end function MyselfData:HasLimitSkill() if self.limitBuffs then return self.limitBuffs.count>0 end return false end function MyselfData:HasLimitNotSkill() if self.limitNotBuffs and not self:HasLimitSkill() then return self.limitNotBuffs.count>0 end return false end function MyselfData:GetLimitSkill(skillID) if self.limitBuffs ~= nil then return self.limitBuffs[math.floor(skillID/1000)] end end function MyselfData:GetLimitNotSkill(skillID) if self.limitNotBuffs ~= nil and not self:HasLimitSkill() then return self.limitNotBuffs[math.floor(skillID/1000)] end end function MyselfData:GetLimitSkillTarget(skillID) return self:GetLimitSkillTargetBySortID(math.floor(skillID/1000)) end function MyselfData:GetLimitSkillTargetBySortID(sortID) if(self.limitBuffs) then local limitBuff = self.limitBuffs[sortID] if limitBuff ~= nil then return limitBuff:GetFromID() end end return nil end function MyselfData:InGuildZone() local myGuildData = GuildProxy.Instance.myGuildData; if(myGuildData == nil)then return false; end local curZoneId = self.userdata:Get(UDEnum.ZONEID) or 0; return curZoneId == myGuildData.zoneid; end function MyselfData:InSuperGvg() local myGuildData = GuildProxy.Instance.myGuildData; if(myGuildData == nil)then return false; end return myGuildData.insupergvg == true; end function MyselfData:GetRangeEnemy(range) if range ~= nil then local me = Game.Myself if me then local count = 0 local pos = me:GetPosition() local _DistanceXZ = VectorUtility.DistanceXZ local users = NSceneUserProxy.Instance:GetAll() for k,v in pairs(users) do if self.id ~= k and v ~= nil then if self:IsEnemy(v.data) and _DistanceXZ(pos, v:GetPosition()) <= range then count = count + 1 end end end local npcs = NSceneNpcProxy.Instance:GetAll() for k,v in pairs(npcs) do if v ~= nil then if self:IsEnemy(v.data) and _DistanceXZ(pos, v:GetPosition()) <= range then count = count + 1 end end end return count end end return MyselfData.super:GetRangeEnemy(self, range) end function MyselfData:GetBeingGUID() local beingInfo = PetProxy.Instance:GetMySummonBeingInfo() if beingInfo ~= nil then return beingInfo.guid end return MyselfData.super:GetBeingGUID(self) end function MyselfData:getCurElementElfID() return Game.SkillOptionManager:GetSkillOption(SkillOptionManager.OptionEnum.SummonElement) end -- override begin function MyselfData:DoConstruct(asArray, serverData) MyselfData.super.DoConstruct(self,asArray,serverData) self.id = serverData.id self.name = serverData.name self.dressEnable = true -- print(self.id,self.name) end function MyselfData:DoDeconstruct(asArray) MyselfData.super.DoDeconstruct(self,asArray) end -- override end