129 lines
4.6 KiB
Lua
129 lines
4.6 KiB
Lua
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<Monster, AffectedCount>
|
|
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; |