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

118 lines
4.3 KiB
Lua

local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask")
local SimpleSkillTask_Scabbing = LuaClass("SimpleSkillTask_Scabbing", SimpleSkillTask)
SimpleSkillTask_Scabbing.DefenceReductionTable = {5, 10, 15, 25}
SimpleSkillTask_Scabbing.CurDefenceReduction = 0
SimpleSkillTask_Scabbing.BindWeapon = nil
function SimpleSkillTask_Scabbing:ctor(OwnerSkill)
SimpleSkillTask_Scabbing.super.ctor(self, OwnerSkill)
end
function SimpleSkillTask_Scabbing:InitTaskFromData(TaskData, CasterPawn)
SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn)
self.TaskName = "Scabbing"
self.AffectedMonsterInfoList = {} --@type table<Monster, AffectedCount>
end
function SimpleSkillTask_Scabbing:UpdateSkillLevel(NewSkillLevel)
SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel)
self.CurDefenceReduction = self.DefenceReductionTable[NewSkillLevel]
end
function SimpleSkillTask_Scabbing: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_Scabbing: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
EventSystem.StopTimer(MonsterInfo.TimerHandle)
self.AffectedMonsterInfoList[index] = nil
end
self.AffectedMonsterInfoList = {}
end
function SimpleSkillTask_Scabbing: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_Scabbing:OnCasterPawnFire(Weapon, BaseDamage)
if self.BindWeapon ~= Weapon then
return
end
local ShootTarget = Weapon.TargetMonster
local MonsterInfo = self:GetAffectedMonsterInfo(ShootTarget)
if MonsterInfo == nil then
local TimerHandle = EventSystem.SetTimer(self.CasterPawn, function()
if ShootTarget ~= nil and UE.IsValid(ShootTarget) and UGCSimpleCharacterSystem.GetHealth(ShootTarget) > 0 then
local CachedMonsterInfo = self:GetAffectedMonsterInfo(ShootTarget)
if CachedMonsterInfo then
ShootTarget.PhysicalDefense = CachedMonsterInfo.CachedDefence
end
end
self:RemoveMonsterInfo(ShootTarget)
end, 5.0)
local MonsterInfo = {
Monster = ShootTarget,
CachedDefence = ShootTarget.PhysicalDefense,
TimerHandle = TimerHandle,
}
table.insert(self.AffectedMonsterInfoList, MonsterInfo)
self:EnableEffectWithId(16, ShootTarget, nil, 5.0, EEffectSpawnLocationType.Attach, "spine_01")
end
ShootTarget.PhysicalDefense = math.clamp(ShootTarget.PhysicalDefense - self.CurDefenceReduction, 0, ShootTarget.PhysicalDefense)
end
function SimpleSkillTask_Scabbing:GetAffectedMonsterInfo(Monster)
for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do
if MonsterInfo.Monster == Monster then
return MonsterInfo
end
end
return nil
end
function SimpleSkillTask_Scabbing: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_Scabbing:OnMonsterDeath(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage)
self:RemoveMonsterInfo(DeadMonster)
end
return SimpleSkillTask_Scabbing;