UGCProjects/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Weaken.lua
2025-01-08 22:46:12 +08:00

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;