autoImport("BehaviourData") autoImport("AttrEffect") CreatureData = class("CreatureData",ReusableObject) CreatureData.MoveSpeedFactor = 3.5 CreatureData.RotateSpeedFactor = 720 CreatureData.ScaleSpeedFactor = 1 local CompatibilityMode_V9 = BackwardCompatibilityUtil.CompatibilityMode_V9 local CullingIDUtility = CullingIDUtility local ArrayRemove = TableUtility.ArrayRemove local DestroyArray = ReusableTable.DestroyArray -- 生物的數據基類 function CreatureData:ctor() CreatureData.super.ctor(self) --唯一標識ID self.id = nil --陣營 self:SetCamp(RoleDefines_Camp.NEUTRAL) self.bodyScale = nil -- options -- self.petIDs = nil end function CreatureData:GetHoldScale() return 1 end function CreatureData:GetHoldDir() return 0 end local defaultOffest = {} function CreatureData:GetHoldOffset() return defaultOffest end function CreatureData:GetDefaultGear() return nil end function CreatureData:GetName() return nil end function CreatureData:SetCamp(camp) self.camp = camp end function CreatureData:GetCamp() return self.camp end function CreatureData:NoAccessable() return true end function CreatureData:NoPlayIdle() return false end function CreatureData:NoPlayShow() return false end function CreatureData:NoAutoAttack() return false end function CreatureData:GetGuid() return self.id end function CreatureData:GetFollowEP() return 0 end function CreatureData:GetFollowType() return 0 end function CreatureData:GetInnerRange() return 0 end function CreatureData:GetOutterRange() return 0 end function CreatureData:GetOutterHeight() return 0 end function CreatureData:GetDampDuration() return 0 end function CreatureData:ReturnMoveSpeedWithFactor(moveSpeed) return (moveSpeed or 1 )*CreatureData.MoveSpeedFactor end function CreatureData:ReturnRotateSpeedWithFactor(rotateSpeed) return (rotateSpeed or 1 )*CreatureData.RotateSpeedFactor end function CreatureData:ReturnScaleSpeedWithFactor(scaleSpeed) return (scaleSpeed or 1 )*CreatureData.ScaleSpeedFactor end function CreatureData:GetClickPriority() local camp = self:GetCamp() if(camp == RoleDefines_Camp.ENEMY) then return 0 elseif(camp == RoleDefines_Camp.NEUTRAL)then return 1 elseif(camp == RoleDefines_Camp.FRIEND)then return 2 end return 0 end function CreatureData:SetDressEnable(v) self.dressEnable = v end function CreatureData:IsDressEnable() return self.dressEnable end function CreatureData:SetBaseLv(value) self.BaseLv = value; end function CreatureData:AddPetID(petID) if(self.petIDs == nil) then self.petIDs = ReusableTable.CreateArray() end if(TableUtility.ArrayFindIndex(self.petIDs, petID) < 1) then self.petIDs[#self.petIDs+1] = petID end end function CreatureData:RemovePetID(petID) if(self.petIDs ~= nil) then TableUtility.ArrayRemove(self.petIDs, petID) end end function CreatureData:SpawnCullingID() if CompatibilityMode_V9 then self.cullingID = CullingIDUtility.GetID() else self.cullingID = self.id end end function CreatureData:ClearCullingID() if CompatibilityMode_V9 and self.cullingID ~=nil then CullingIDUtility.ClearID(self.cullingID) end self.cullingID = nil end function CreatureData:GetDefaultScale() return 1 end function CreatureData:GetClassID() return 0 end function CreatureData:IsBeingPresent(beingID) local being = PetProxy.Instance:GetMyBeingNpcInfo(beingID) if(being) then return being:IsSummoned() end return false end function CreatureData:InGuildZone() return false; end function CreatureData:InSuperGvg() return false; end --features start function CreatureData:GetFeature(bit) return false end function CreatureData:GetFeature_ChangeLinePunish() return false end function CreatureData:GetFeature_BeHold() return false end --features end -- override begin function CreatureData:DoConstruct(asArray, parts) self.dressEnable = false end function CreatureData:DoDeconstruct(asArray) if(self.petIDs ~= nil) then ReusableTable.DestroyArray(self.petIDs) self.petIDs = nil end self:ClearCullingID() end CreatureDataWithPropUserdata = class("CreatureDataWithPropUserdata",CreatureData) -- 生物的數據(帶有屬性) function CreatureDataWithPropUserdata:ctor() CreatureDataWithPropUserdata.super.ctor(self) --生物屬性 self.props = RolePropsContainer.CreateAsTable() self.clientProps = ClientProps.new(self.props.config) --生物數據 self.userdata = UserData.CreateAsTable() self.attrEffect = AttrEffect.new() self.attrEffect2 = AttrEffectB.new() self:Reset() end function CreatureDataWithPropUserdata:Reset() --action self.idleAction = nil self.moveAction = nil --some props self.normalAtkID = nil self.noStiff = 0; self.noAttack = 0; self.noSkill = 0; self.noPicked = 0; self.noAccessable = 0; self.noMove = 0; self.noAction = 0; self.noAttacked = 0; --commonfun要計算的屬性 self.shape = nil self.race = nil self.bodyScale = nil end --CommonFun begin --獲取屬性 function CreatureDataWithPropUserdata:GetProperty(name) if nil == self.props[name] then return 0 end return self.props[name]:GetValue() end function CreatureDataWithPropUserdata:GetJobLv() if( nil ~= self.userdata ) then return self.userdata:Get(UDEnum.JOBLEVEL) end return 1 end function CreatureDataWithPropUserdata:GetBaseLv() if( nil ~= self.userdata ) then return self.userdata:Get(UDEnum.ROLELEVEL) end return 1 end function CreatureDataWithPropUserdata:GetLernedSkillLevel(skillID) return 0 end function CreatureDataWithPropUserdata:GetDynamicSkillInfo(skillID) return nil end function CreatureDataWithPropUserdata:IsEnemy(creatureData) return creatureData:GetCamp() == RoleDefines_Camp.ENEMY end function CreatureDataWithPropUserdata:IsImmuneSkill(skillID) return false end function CreatureDataWithPropUserdata:IgnoreJinzhanDamage() return nil ~= self.attrEffect and self.attrEffect:IgnoreJinzhanDamage() end function CreatureDataWithPropUserdata:IsFly() return false end function CreatureDataWithPropUserdata:SelfBuffChangeSkill(skillIDAndLevel_0) if nil == self.skillBuffs then return nil end local buff = self.skillBuffs:GetOwner(BuffConfig.SelfBuff) if nil == buff then return nil end return buff:GetParamsByType(BuffConfig.changeskill)[skillIDAndLevel_0] end function CreatureDataWithPropUserdata:GetProfressionID() return nil ~= self.userdata and self.userdata:Get(UDEnum.PROFESSION) or 0 end function CreatureDataWithPropUserdata:DefiniteHitAndCritical() return nil ~= self.attrEffect and self.attrEffect:DefiniteHitAndCritical() end function CreatureDataWithPropUserdata:NextPointTargetSkillLargeLaunchRange() return nil ~= self.attrEffect2 and self.attrEffect2:NextPointTargetSkillLargeLaunchRange() end function CreatureDataWithPropUserdata:NextSkillNoReady() return nil ~= self.attrEffect2 and self.attrEffect2:NextSkillNoReady() end function CreatureDataWithPropUserdata:CanNotBeSkillTargetByEnemy() return nil ~= self.attrEffect2 and self.attrEffect2:CanNotBeSkillTargetByEnemy() end --普攻Id function CreatureDataWithPropUserdata:GetAttackSkillIDAndLevel() return self.normalAtkID or 0 end function CreatureDataWithPropUserdata:DamageAlways1() return false end function CreatureDataWithPropUserdata:GetRandom() return nil end function CreatureDataWithPropUserdata:RemoveInvalidHatred() end function CreatureDataWithPropUserdata:RefreshHatred(id) end function CreatureDataWithPropUserdata:CheckHatred(id, time) return false end function CreatureDataWithPropUserdata:GetArrowID() return 0 end function CreatureDataWithPropUserdata:GetEquipedRefineLv(site) return 0 end function CreatureDataWithPropUserdata:GetEquipedItemNum(itemid) return 0 end function CreatureDataWithPropUserdata:GetEquipedWeaponType() return 0 end function CreatureDataWithPropUserdata:GetEquipedType(site) return 0 end function CreatureDataWithPropUserdata:GetEquipedID(site) return 0 end function CreatureDataWithPropUserdata:GetCartNums() return 0,0 end function CreatureDataWithPropUserdata:GetPackageItemNum(itemid) return 0 end function CreatureDataWithPropUserdata:GetEnchantAttrsBySite(site) return nil end function CreatureDataWithPropUserdata:GetCombineEffectsBySite(site) return nil end function CreatureDataWithPropUserdata:GetCurrentSkill() return self.currentSkill end function CreatureDataWithPropUserdata:SetCurrentSkill(skillLogic) self.currentSkill = skillLogic end function CreatureDataWithPropUserdata:ClearCurrentSkill(skillLogic) if self.currentSkill == skillLogic then self.currentSkill = nil end end --訪問距離 function CreatureDataWithPropUserdata:GetAccessRange() return 2 end --攻擊速度 function CreatureDataWithPropUserdata:SetAttackSpeed(s) self.attackSpeed = s self.attackSpeedAdjusted = 1/(1/s+0.1)*1.05 end function CreatureDataWithPropUserdata:GetAttackSpeed() return self.attackSpeed end function CreatureDataWithPropUserdata:GetAttackSpeed_Adjusted() return self.attackSpeedAdjusted end function CreatureDataWithPropUserdata:NoStiff() return 0 < self.noStiff end function CreatureDataWithPropUserdata:NoAttack() return 0 < self.noAttack end function CreatureDataWithPropUserdata:NoSkill() return 0 < self.noSkill end function CreatureDataWithPropUserdata:NoMagicSkill() return self.props.NoMagicSkill:GetValue() > 0 end function CreatureDataWithPropUserdata:NoHitEffectMove() return self.props.NoEffectMove:GetValue() & 1 >0 end function CreatureDataWithPropUserdata:NoAttackEffectMove() return self.props.NoEffectMove:GetValue() & 2 >0 end function CreatureDataWithPropUserdata:NoPicked() return 0 < self.noPicked end function CreatureDataWithPropUserdata:NoAccessable() return 0 < self.noAccessable or 0 < self.noPicked end function CreatureDataWithPropUserdata:NoMove() return 0 < self.noMove end function CreatureDataWithPropUserdata:NoAttacked() return 0 < self.noAttacked end function CreatureDataWithPropUserdata:NoAct() return 0 < self.props.NoAct:GetValue() end function CreatureDataWithPropUserdata:Freeze() if(self:WeakFreeze()) then return true end return 0 < self.props.Freeze:GetValue() end --client use function CreatureDataWithPropUserdata:WeakFreeze() if(self.weakFreezeBuffs and self.weakFreezeBuffs.count > 0) then return true end return false end function CreatureDataWithPropUserdata:FearRun() return 0 < self.props.FearRun:GetValue() end function CreatureDataWithPropUserdata:FreeCast() return self.props.MoveChant:GetValue() > 0 end function CreatureDataWithPropUserdata:PlusClientProp(prop) return prop:GetValue() + self.clientProps:GetValueByName(prop.propVO.name) end function CreatureDataWithPropUserdata:IsTransformed() local prop = self.props.TransformID:GetValue() return prop~=0 end function CreatureDataWithPropUserdata:IsSolo() return self.props.Solo:GetValue() > 0 end function CreatureDataWithPropUserdata:IsEnsemble() return self.props.Ensemble:GetValue() > 0 end function CreatureDataWithPropUserdata:GetNpcID() return 0 end function CreatureDataWithPropUserdata:GetClassID() if(self.userdata) then return self.userdata:Get(UDEnum.PROFESSION) or 0 end return 0 end function CreatureDataWithPropUserdata:HasBuffID(buffID) if(self.buffIDs==nil) then return false end return self.buffIDs[buffID]~=nil end function CreatureDataWithPropUserdata:GetEquipCardNum(site,cardID) return 0 end function CreatureDataWithPropUserdata:GetRunePoint(specialEffectID) return 0 end function CreatureDataWithPropUserdata:GetActiveAstrolabePoints() return 0 end function CreatureDataWithPropUserdata:GetAdventureSavedHeadWear(quality) return 0 end function CreatureDataWithPropUserdata:GetAdventureSavedCard(quality) return 0 end function CreatureDataWithPropUserdata:GetAdventureTitle() return 0 end function CreatureDataWithPropUserdata:GetBuffListByType(typeParam) if(typeParam==nil or self.buffIDs == nil) then return nil end local buff,result local configs = Table_Buffer for k,v in pairs(self.buffIDs) do buff = configs[k] if(buff ~= nil and buff.BuffEffect ~= nil and buff.BuffEffect.type == typeParam) then result = result or {} result[#result+1] = k end end return result end function CreatureDataWithPropUserdata:GetBuffEffectByType(typeParam) if(typeParam==nil or self.buffIDs == nil) then return nil end local buff local configs = Table_Buffer for k,v in pairs(self.buffIDs) do buff = configs[k] if(buff ~= nil and buff.BuffEffect ~= nil and buff.BuffEffect.type == typeParam) then return buff.BuffEffect end end return nil end function CreatureDataWithPropUserdata:GetBuffFromID(buffID) return self:_GetBuffRelate(self.buffIDs,buffID,0) end function CreatureDataWithPropUserdata:GetBuffLayer(buffID) return self:_GetBuffRelate(self.buffIDLayers,buffID,0) end function CreatureDataWithPropUserdata:GetBuffLevel(buffID) return self:_GetBuffRelate(self.buffIDLevels,buffID,0) end function CreatureDataWithPropUserdata:_GetBuffRelate(t,buffID,defaultValue) if(t==nil) then return defaultValue or 0 end return t[buffID] or defaultValue end function CreatureDataWithPropUserdata:GetDistance(buffFromGuid) local proxy = SceneCreatureProxy local me = proxy.FindCreature(self.id) if(me) then local fromCreature = proxy.FindCreature(buffFromGuid) if(fromCreature) then return VectorUtility.DistanceXZ(me:GetPosition(),fromCreature:GetPosition()) end end return 999999 end function CreatureDataWithPropUserdata:GetRangeEnemy(range) return 0 end function CreatureDataWithPropUserdata:GetMapInfo() return 0,0 end function CreatureDataWithPropUserdata:GetBeingGUID() return 0 end function CreatureDataWithPropUserdata:IsRide(id) if self.userdata ~= nil then return self.userdata:Get(UDEnum.MOUNT) == id end return false end function CreatureDataWithPropUserdata:IsPartner(id) local me = SceneCreatureProxy.FindCreature(self.id) if me ~= nil then return me:GetPartnerID() == id end return false end function CreatureDataWithPropUserdata:getCurElementElfID() return 0 end function CreatureDataWithPropUserdata:GetEnsemblePartner() return nil end --CommonFun end function CreatureDataWithPropUserdata:HasLimitSkill() return false end function CreatureDataWithPropUserdata:HasLimitNotSkill() return false end function CreatureDataWithPropUserdata:GetLimitSkillTarget(skillID) return nil end function CreatureDataWithPropUserdata:GetLimitNotSkill(skillID) return nil end function CreatureDataWithPropUserdata:GetLimitSkillTargetBySortID(sortID) return nil end function CreatureDataWithPropUserdata:AddBuff(buffID,fromID,layer,level) if(buffID==nil) then return end if(self.buffIDs==nil) then self.buffIDs = ReusableTable.CreateTable() end if(self.buffIDLayers==nil) then self.buffIDLayers = ReusableTable.CreateTable() end if(level~=nil and level>0) then if(self.buffIDLevels==nil) then self.buffIDLevels = ReusableTable.CreateTable() end self.buffIDLevels[buffID] = level end self.buffIDs[buffID] = fromID self.buffIDLayers[buffID] = layer end function CreatureDataWithPropUserdata:_AddBuffRelate(t,buffID,value) end function CreatureDataWithPropUserdata:RemoveBuff(buffID) if(buffID==nil) then return end self:_RemoveBuffRelate(self.buffIDs,buffID) self:_RemoveBuffRelate(self.buffIDLayers,buffID) self:_RemoveBuffRelate(self.buffIDLevels,buffID) end function CreatureDataWithPropUserdata:_RemoveBuffRelate(t,buffID) if(t~=nil) then t[buffID] = nil end end function CreatureDataWithPropUserdata:_AddWeakFreezeSkillBuff( buffInfo,skillIDs ) if(self.weakFreezeBuffs==nil) then self.weakFreezeBuffs = {} self.weakFreezeBuffs.count = 0 self.weakFreezeBuffs.relateBuffs = {} end local buffID = buffInfo.id if(self.weakFreezeBuffs.relateBuffs[buffID]==nil) then self.weakFreezeBuffs.count = self.weakFreezeBuffs.count + 1 self.weakFreezeBuffs.relateBuffs[buffID] = 1 local skillBuff for i=1,#skillIDs do skillBuff = self.weakFreezeBuffs[skillIDs[i]] if(skillBuff==nil) then skillBuff = ReusableTable.CreateArray() self.weakFreezeBuffs[skillIDs[i]] = skillBuff end skillBuff[#skillBuff+1] = buffID end end end function CreatureDataWithPropUserdata:_RemoveWeakFreezeSkillBuff( buffInfo,skillIDs ) if(self.weakFreezeBuffs) then local buffID = buffInfo.id if(self.weakFreezeBuffs.relateBuffs[buffID]) then self.weakFreezeBuffs.relateBuffs[buffID] = nil self.weakFreezeBuffs.count = self.weakFreezeBuffs.count - 1 local skillBuff for i=1,#skillIDs do skillBuff = self.weakFreezeBuffs[skillIDs[i]] ArrayRemove(skillBuff, buffID) if(#skillBuff==0) then self.weakFreezeBuffs[skillIDs[i]] = nil DestroyArray(skillBuff) end end end end end function CreatureDataWithPropUserdata:_ClearBuffs() if(self.buffIDs~=nil) then ReusableTable.DestroyAndClearTable(self.buffIDs) self.buffIDs = nil end if(self.buffIDLayers~=nil) then ReusableTable.DestroyAndClearTable(self.buffIDLayers) self.buffIDLayers = nil end if(self.buffIDLevels~=nil) then ReusableTable.DestroyAndClearTable(self.buffIDLevels) self.buffIDLevels = nil end end function CreatureDataWithPropUserdata:AddClientProp(propName,value) local p = self.clientProps:GetPropByName(propName) local old ,clientp = self.clientProps:SetValueByName(propName,p.value + value) return p,clientp end local PartIndex = nil local PartIndexEx = nil function CreatureDataWithPropUserdata: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 -- guild begin autoImport("SimpleGuildData"); function CreatureDataWithPropUserdata:SetGuildData( data ) if(data and data[1] and data[1]~=0)then if(not self.guildData)then self.guildData = SimpleGuildData.CreateAsTable(); end self.guildData:SetData(data); else self:DestroyGuildData(); end end function CreatureDataWithPropUserdata:DestroyGuildData() if(self.guildData)then self.guildData:Destroy(); self.guildData = nil; end end function CreatureDataWithPropUserdata:GetGuildData( ) return self.guildData end -- guild end function CreatureDataWithPropUserdata:GetUserDataStatus() return self.userdata:Get(UDEnum.STATUS) end -- override begin function CreatureDataWithPropUserdata:DoConstruct(asArray, parts) self:SetAttackSpeed(1) self.bodyScale = self:GetDefaultScale() CreatureDataWithPropUserdata.super.DoConstruct(self,asArray,parts) end function CreatureDataWithPropUserdata:DoDeconstruct(asArray) CreatureDataWithPropUserdata.super.DoDeconstruct(self,asArray) self:Reset() self.userdata:Reset() self.props:Reset() self.clientProps:Reset() self.attrEffect:Set(0) self.attrEffect2:Reset() self:_ClearBuffs() self:DestroyGuildData(); end -- override end function CreatureData:IsInMagicMachine() return nil ~= self.attrEffect2 and self.attrEffect2:IsInMagicMachine() end