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 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;