local PetComponent = class("PetComponent") local Const_BornPosOffset = FP.newV2(1,-1) -- 出生位置的偏移 function PetComponent:initialize(entity) self.entity = entity --位置 self.logicPos = FP.newV2(0,0) --朝向 self.logicDir = FP.newV2(0,0) --每n秒计算出的需要跟随的位置 self.followPos = FP.newV2(0,0) --普攻当前CD ms self.normalSkillCurCD = 0 --普攻总CD ms self.normalSkillMaxCD = 0 -- 技能数据 (如果没有技能则为nil) self.skillData = nil --技能当前CD ms self.skillCurCD = 0 --技能总CD ms 宠物的技能不一定有,但是普攻一定有 self.skillMaxCD = 0 self.searchTargetCdFrame = 0 --找目标的cd帧数,0代表cd转好了,可以找目标了 --是否暂停攻击 self.pauseAttack = false self.isInTownLevel = LevelManager.IsNoBattleLevel() -- 纯粹是为了优化才加的这个值【不可被修改】 --宠物是否是自由攻击(只有两种模式;自由攻击和随主人打中人而开始攻击) if self.isInTownLevel then self.autoAttack = false else self.autoAttack = not LevelPlayerManager.GetPlayerSetting(entity:GetPlayerID() ,LuaConst.BattleSettingEnum.NotAutoPetAttack) end --在主城中,主人跟随队长时,宠物的速度 self.townFollowHorseSpd = nil self.searchRadius = nil -- 寻敌半径 self.searchRadiusSqr = FP.newV1(0) -- 寻敌半径的平方 self.petBattleData = nil -- 宠物数据 self:InitData() --region 缓存数据 self.curPetState = nil -- 当前状态机 self.lastAttackFrame = -1 -- 上一次攻击时的帧号 self.attackTarget = nil -- 攻击时的被攻击目标 self.attackTargetPos = FP.newV2(0,0) -- 攻击开始的被攻击目标的位置 self.missileBornFrame = -1 -- 当处于attack状态时,子弹出生的时间点 self.attackQuitFrame = -1 -- 当处于attack状态时,退出attack的时间 self.curSkillType = nil -- 当前处于攻击时,是什么攻击 普攻或技能 self.idleShowPlayFrame = -1 -- 需要播放idle_show动画的帧号 self.idleShowToIdlePlayFrame = -1 -- 需要播放idle动画的帧号 self.lastHitOthersFrame = -9999 -- 主人最近一次打中人的帧号 --endregion 缓存数据 end function PetComponent:OnEntityInitialized(entity) if entity._logicInitData.EntityID and entity._logicInitData.EntityID > 0 then self.findFollowPosBatchIndex = entity._logicInitData.EntityID % 10 -- 10帧(0.5秒)所有宠物分帧执行查询跟随点 end -- 非同步代码,只在主城用到了(主城中我的宠物实时设置followPos) if LevelManager.IsNoBattleLevel() and entity:GetPlayerID() == LevelPlayerManager.MyPlayerIDInRoom then self.findFollowPosBatchIndex = -1 end end function PetComponent:InitData() local petID, petStage = self.entity:GetPetIDAndStage() local petBattleData = DataSheetManager.PetBattleData:GetDataByID_Stage(petID, petStage) self.petBattleData = petBattleData self.searchRadius = petBattleData.SearchRadius self.searchRadiusSqr:Reset(self.searchRadius):Mul(self.searchRadius) self:SetNormalSkillMaxCD(petBattleData.NormalSkillCD) local petSkillId = self.entity:GetPetSkillID() if petSkillId and petSkillId > 0 then self.skillData = DataSheetManager.PetSkillData:GetDataByID(petSkillId) self:SetSkillMaxCD(self.skillData.SkillCD) end self:SetPetInitPos() if LevelManager.ShouldAddCanUseSkillToHeroWhenBorn() then -- 如果是等待他人一起开始战斗的玩法,宠物要先暂停战斗 self:SetPauseAttack(false) else self:SetPauseAttack(true) end end function PetComponent:ResetCacheData() self:SetPetState(nil) -- 当前状态机 self:SetPetSkillType(nil)-- 当前处于攻击时,是什么攻击 普攻或技能 end function PetComponent:SetPetInitPos() local moveComp = self.entity.components.move local forward = moveComp:GetLogicRotateDir() FP.V2.GetOffsetToForward(forward, Const_BornPosOffset, self.logicPos) self.logicPos:Add(moveComp.LogicPos) self:SetPetFollowPos(LuaShoveManager.GetFinalInitPos(self.logicPos)) self:SetPetLogicDir(forward) end function PetComponent:SetNormalSkillMaxCD(val) self.normalSkillMaxCD = val end function PetComponent:SetSkillMaxCD(val) self.skillMaxCD = val end function PetComponent:SetNormalSkillCurCD(val) if val < 0 then val = 0 end self.normalSkillCurCD = val end function PetComponent:SetSkillCurCD(val) if val < 0 then val = 0 end self.skillCurCD = val end function PetComponent:SetPetLogicPos(val) self.logicPos:Reset(val) end function PetComponent:SetPetLogicDir(val) self.logicDir:Reset(val) end function PetComponent:SetPetFollowPos(val) self.followPos:Reset(val) end function PetComponent:SetPetState(val) self.curPetState = val -- 当前状态机 end function PetComponent:SetPetSkillType(skillType,target) self.curSkillType = skillType self.lastAttackFrame = skillType and LogicUpdateManager._clientHandleFrame or -1 self.attackTarget = target self.attackTargetPos:Reset(target and target:GetLogicPos() or nil) if skillType == LuaConst.PetSkillEnum.Normal then self.missileBornFrame = LogicUpdateManager._clientHandleFrame + self.petBattleData.NormalMissileBornFrame self.attackQuitFrame = LogicUpdateManager._clientHandleFrame + self.petBattleData.NormalAnimFrame elseif skillType == LuaConst.PetSkillEnum.Skill then self.missileBornFrame = LogicUpdateManager._clientHandleFrame + self.skillData.MissileBornFrame self.attackQuitFrame = LogicUpdateManager._clientHandleFrame + self.skillData.SkillAnimFrame else self.missileBornFrame = -1 self.attackQuitFrame = -1 end end function PetComponent:SetPauseAttack(val) self.pauseAttack = val end function PetComponent:SetLastHitOthersFrame(frame) if self.autoAttack == false then self.lastHitOthersFrame = frame end end return PetComponent