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

180 lines
6.9 KiB
Lua

-- 技能任务脚本,实际技能效果实现在此
local SimpleSkillTask = LuaClass("SimpleSkillTask")
SimpleSkillTask.OwnerSkill = nil
SimpleSkillTask.SkillName = ESkillName.Default
SimpleSkillTask.TaskName = ""
SimpleSkillTask.SkillLevel = 1
SimpleSkillTask.CasterPawn = nil
SimpleSkillTask.DurationPolicy = ETaskDurationPolicy.Instant
SimpleSkillTask.Duration = 0
SimpleSkillTask.DurationTimer = 0
SimpleSkillTask.Period = 0
SimpleSkillTask.ExecuteOnApply = true
SimpleSkillTask.IsActivated = false
SimpleSkillTask.EffectId = 0
SimpleSkillTask.TaskTimer = nil
SimpleSkillTask.Selector = nil
SimpleSkillTask.SkillEffects = {}
SimpleSkillTask.TargetPawns = {}
function SimpleSkillTask:ctor(OwnerSkill)
self.OwnerSkill = OwnerSkill
self.SkillName = OwnerSkill.SkillName
self.SkillLevel = OwnerSkill.SkillLevel
end
function SimpleSkillTask:UpdateSkillLevel(NewSkillLevel)
self.SkillLevel = NewSkillLevel
end
function SimpleSkillTask:InitTaskFromData(TaskData, CasterPawn)
self.CasterPawn = CasterPawn
self.DurationPolicy = TaskData.DurationPolicy
self.Duration = TaskData.Duration
self.Period = TaskData.Period
self.ExecuteOnApply = TaskData.ExecuteOnApply
self.EffectId = TaskData.EffectId
self.IsActivated = false
end
--子类实现
function SimpleSkillTask:ActivateTask()
if self.IsActivated then
return
end
UE.Log("[SimpleSkillTask] [%s][%s] Task Activated", KismetSystemLibrary.GetObjectName(self.CasterPawn), self.TaskName)
if self.DurationPolicy == ETaskDurationPolicy.HasDuration and self.Duration > 0 then
self.IsActivated = true
if self.Period > 0 then
if self.ExecuteOnApply then
self:ActivateTaskInTimer()
self:PlaySkillSound(self.CasterPawn)
end
self.TaskTimer = EventSystem.SetTimerLoop(self.CasterPawn, function()
self:ActivateTaskInTimer()
self:PlaySkillSound(self.CasterPawn)
self.DurationTimer = self.DurationTimer + self.Period
UE.Log("[SimpleSkillTask] [%s][%s] DurationTimer = %.2f", KismetSystemLibrary.GetObjectName(self.CasterPawn), self.TaskName, self.DurationTimer)
if self.DurationTimer >= self.Duration then
self:EndTask()
end
end, self.Period)
else
--- 如果Period小于等于0,则直接执行一次任务,在Duration后进行移除
self:ActivateTaskInTimer()
self:PlaySkillSound(self.CasterPawn)
self.TaskTimer = EventSystem.SetTimer(self.CasterPawn, function()
self:EndTask()
end, self.Duration)
end
else
self:PlaySkillSound(self.CasterPawn)
end
end
function SimpleSkillTask:EndTask()
UE.Log("[SimpleSkillTask] [%s][%s] Task End", KismetSystemLibrary.GetObjectName(self.CasterPawn), self.TaskName)
if self.TaskTimer ~= nil then
EventSystem.StopTimer(self.TaskTimer)
end
self:DeactivateTask()
self.IsActivated = false
end
-- 子类实现,非瞬时的技能任务结束时执行
function SimpleSkillTask:DeactivateTask()
end
-- 如果Task需要周期性执行,则子类需将Task执行逻辑实现
function SimpleSkillTask:ActivateTaskInTimer()
end
---播放技能特效: 默认SpawnLocationType为Attach
---@param Pawn APawn 玩家
---@param ActorList BP_MonsterBase_C[] 目标怪物
---@param SpawnLocationType EEffectSpawnLocationType 位置类型
---@param BoneName string 绑定骨骼名称
function SimpleSkillTask:EnableSkillEffect(Pawn, ActorList, SpawnLocationType, BoneName)
UE.Log("[SimpleSkillTask:EnableSkillEffect] SkillName: %d", self.SkillName)
if SpawnLocationType == nil then
SpawnLocationType = EEffectSpawnLocationType.Attach
end
local Duration = 0
if self.DurationPolicy == ETaskDurationPolicy.HasDuration and self.Duration > 0 then
Duration = self.Duration
end
local InstanceId = GameDataManager.GetEffectInstanceId()
local EffectId = self.EffectId
UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "Client_MulticastRPC_PlayEffect", InstanceId, EffectId, Pawn, ActorList, Duration, SpawnLocationType, BoneName)
end
---@param EffectId number 特效实例ID
---@param Pawn APawn 特效起始
---@param ActorList APawn[] 特效终点(若为空,则需填入指定旋转)
---@param Duration number 持续时间(默认0,自动销毁)
---@param SpawnLocationType EEffectSpawnLocationType 位置类型(默认为Bottom)
---@param BoneName string 绑定骨骼名称
function SimpleSkillTask:EnableEffectWithId(EffectId, Pawn, ActorList, Duration, SpawnLocationType, BoneName)
UE.Log("[SimpleSkillTask:EnableEffectWithId] SkillName: %d", self.SkillName)
if SpawnLocationType == nil then
SpawnLocationType = EEffectSpawnLocationType.Bottom
end
if Duration == nil then
Duration = 0
end
local InstanceId = GameDataManager.GetEffectInstanceId()
UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "Client_MulticastRPC_PlayEffect", InstanceId, EffectId, Pawn, ActorList, Duration, SpawnLocationType, BoneName)
end
---播放指向型特效(InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation)
---@param EffectId number 特效实例ID
---@param CasterActor APawn 特效起始
---@param DestActor APawn 特效终点(若为空,则需填入指定旋转)
---@param Duration number 持续时间(默认0,自动销毁)
---@param Rotation FRotator 指定旋转(DestActor为空时才生效)
function SimpleSkillTask:EnableDirectionalEffect(EffectId, CasterActor, DestActor, Duration, Rotation)
UE.Log("[SimpleSkillTask:EnableDirectionalEffect] SkillName: %d", self.SkillName)
local InstanceId = GameDataManager.GetEffectInstanceId()
UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "Client_MulticastRPC_PlayDirectionalEffect", InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation)
end
---生成技能Actor
function SimpleSkillTask:SpawnSkillActor(BPClassPath, CasterActor, Location, Rotation)
local Class = UE.LoadClass(BPClassPath)
local SkillActor = UGCGameSystem.SpawnActor(CasterActor, Class, Location, Rotation, VectorHelper.ScaleOne(), nil)
if not SkillActor then
return nil
end
SkillActor:SetOwner(CasterActor)
SkillActor:SetCasterPawn(CasterActor)
SkillActor:SetLevel(self.SkillLevel)
return SkillActor
end
---播放技能音效
function SimpleSkillTask:PlaySkillSound(CasterActor)
SoundManager.MulticastPlaySoundAtLocation(100 + self.SkillName, CasterActor:K2_GetActorLocation(), CasterActor:K2_GetActorRotation())
end
---获取目标Pawn
---@return TargetPawns[]
function SimpleSkillTask:GetTargetPawns()
self.OwnerSkill.TargetPawns = self.OwnerSkill:GetTargetPawns()
return self.OwnerSkill.TargetPawns
end
return SimpleSkillTask;