local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") local SimpleSkillTask_Weaken = LuaClass("SimpleSkillTask_Weaken", SimpleSkillTask) SimpleSkillTask_Weaken.AdditionalAttackRateTable = {0.01, 0.02, 0.03, 0.04} SimpleSkillTask_Weaken.CurAdditionalAttackRate = 0 SimpleSkillTask_Weaken.BindWeapon = nil function SimpleSkillTask_Weaken:ctor(OwnerSkill) SimpleSkillTask_Weaken.super.ctor(self, OwnerSkill) end function SimpleSkillTask_Weaken:InitTaskFromData(TaskData, CasterPawn) SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) self.TaskName = "Weaken" self.AffectedMonsterInfoList = {} --@type table end function SimpleSkillTask_Weaken:UpdateSkillLevel(NewSkillLevel) SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) self.CurAdditionalAttackRate = self.AdditionalAttackRateTable[NewSkillLevel] end function SimpleSkillTask_Weaken:ActivateTask() SimpleSkillTask.ActivateTask(self) local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then self.BindWeapon = CasterPawnWeapon self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) else self.CasterPawn.OnWeaponSpawnedDelegate:Add(self.OnWeaponSpawned, self) end end function SimpleSkillTask_Weaken:DeactivateTask() self.CasterPawn.OnWeaponSpawnedDelegate:Remove(self.OnWeaponSpawned, self) if self.BindWeapon ~= nil and UE.IsValid(self.BindWeapon) then self.BindWeapon.OnFireDelegate:Remove(self.OnCasterPawnFire, self) self.BindWeapon = nil end for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do MonsterInfo.Monster:RemoveModifyDamageDelegation("ActivateWeaken"..KismetSystemLibrary.GetObjectName(self.CasterPawn)) EventSystem.StopTimer(MonsterInfo.TimerHandle) self.AffectedMonsterInfoList[index] = nil end self.AffectedMonsterInfoList = {} end function SimpleSkillTask_Weaken:OnWeaponSpawned(Pawn) if Pawn ~= self.CasterPawn then return end local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then self.BindWeapon = CasterPawnWeapon self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) end end function SimpleSkillTask_Weaken:OnCasterPawnFire(Weapon, BaseDamage) if self.BindWeapon ~= Weapon then return end local ShootTarget = Weapon.TargetMonster local HitCount = self:GetMonsterHitCount(ShootTarget) HitCount = HitCount + 1 if HitCount == 1 then local TimerHandle = EventSystem.SetTimer(self.CasterPawn, function() ShootTarget:RemoveModifyDamageDelegation("ActivateWeaken"..KismetSystemLibrary.GetObjectName(self.CasterPawn)) self:RemoveMonsterInfo(ShootTarget) end, 5.0) local MonsterInfo = { Monster = ShootTarget, HitCount = HitCount, TimerHandle = TimerHandle, } table.insert(self.AffectedMonsterInfoList, MonsterInfo) self:EnableEffectWithId(self.EffectId, ShootTarget, nil, 5.0, EEffectSpawnLocationType.Attach, 'spine_01') end ShootTarget:AddModifyDamageDelegationFun( "ActivateExhaust"..KismetSystemLibrary.GetObjectName(self.CasterPawn), function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) return DamageAmount * (1 + HitCount * self.CurAdditionalAttackRate) end ) end function SimpleSkillTask_Weaken:GetAffectedMonsterInfo(Monster) for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do if MonsterInfo.Monster == Monster then return MonsterInfo end end return nil end function SimpleSkillTask_Weaken:GetMonsterHitCount(Monster) for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do if MonsterInfo.Monster == Monster then return MonsterInfo.HitCount end end return 0 end function SimpleSkillTask_Weaken:RemoveMonsterInfo(Monster) for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do if MonsterInfo.Monster == Monster then EventSystem.StopTimer(MonsterInfo.TimerHandle) self.AffectedMonsterInfoList[index] = nil return end end end function SimpleSkillTask_Weaken:OnMonsterDeath(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) self:RemoveMonsterInfo(DeadMonster) end return SimpleSkillTask_Weaken;