118 lines
4.3 KiB
Lua
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;
|