77 lines
2.5 KiB
Lua
77 lines
2.5 KiB
Lua
---@class BP_Skill_ToxicRain_C:BP_Skill_Actor_C
|
|
--Edit Below--
|
|
|
|
local SkillActorBase = require('Script.Blueprint.SceneObject.SkillActor.BP_Skill_Actor')
|
|
local BP_Skill_ToxicRain = setmetatable(
|
|
{
|
|
AdditionDamageRateTable = {1.2, 1.8, 2.4, 3.0},
|
|
DefenceReductionRateTable = {0.95, 0.90, 0.85, 0.75},
|
|
CurDamageRate = 0.0,
|
|
CurDefenceReductionRate = 0.0,
|
|
AffectedMonster = {},
|
|
|
|
TimerHandle = nil,
|
|
},
|
|
{
|
|
__index = SkillActorBase,
|
|
__metatable = SkillActorBase
|
|
}
|
|
)
|
|
|
|
|
|
function BP_Skill_ToxicRain:ReceiveBeginPlay()
|
|
SkillActorBase.ReceiveBeginPlay(self)
|
|
self:SetSphereRadius(150)
|
|
end
|
|
|
|
function BP_Skill_ToxicRain:ReceiveEndPlay()
|
|
for Monster, CachedDefence in pairs(self.AffectedMonster) do
|
|
if Monster ~= nil and UE.IsValid(Monster) then
|
|
Monster.PhysicalDefense = CachedDefence
|
|
end
|
|
end
|
|
self.AffectedMonster = {}
|
|
|
|
if self.TimerHandle then
|
|
EventSystem.StopTimer(self.TimerHandle)
|
|
end
|
|
|
|
self.SuperClass.ReceiveEndPlay(self)
|
|
end
|
|
|
|
function BP_Skill_ToxicRain:SetLevel(NewLevel)
|
|
SkillActorBase.SetLevel(self, NewLevel)
|
|
|
|
self.CurDamageRate = self.AdditionDamageRateTable[NewLevel]
|
|
self.CurDefenceReductionRate = self.DefenceReductionRateTable[NewLevel]
|
|
end
|
|
|
|
function BP_Skill_ToxicRain:OnMonsterBeginOverlap(Monster)
|
|
if self.TimerHandle == nil then
|
|
self:SetupTimer()
|
|
end
|
|
|
|
self.AffectedMonster[Monster] = Monster.PhysicalDefense
|
|
Monster.PhysicalDefense = Monster.PhysicalDefense * self.CurDefenceReductionRate
|
|
end
|
|
|
|
function BP_Skill_ToxicRain:OnMonsterEndOverlap(Monster)
|
|
if self.AffectedMonster[Monster] then
|
|
Monster.PhysicalDefense = self.AffectedMonster[Monster]
|
|
end
|
|
end
|
|
|
|
function BP_Skill_ToxicRain:SetupTimer()
|
|
self.TimerHandle = EventSystem.SetTimerLoop(self, function()
|
|
local DamageAmount = 120 + UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack * self.CurDamageRate
|
|
local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey)
|
|
|
|
for Monster, CachedDefence in pairs(self.AffectedMonster) do
|
|
if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then
|
|
UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage)
|
|
end
|
|
end
|
|
end, 1.0)
|
|
end
|
|
|
|
return BP_Skill_ToxicRain; |