2025-07-12 05:06:14 +08:00
|
|
|
-- 移动行为
|
|
|
|
|
|
|
|
--> Services
|
|
|
|
local ServerStorage = game:GetService("ServerStorage")
|
|
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
|
|
|
|
|
|
--> Dependencies
|
|
|
|
local TypeList = require(ServerStorage.Base.TypeList)
|
|
|
|
local Behaviour = require(ServerStorage.Base.Behaviour)
|
|
|
|
local MobsProxy = require(ServerStorage.Proxy.MobsProxy)
|
|
|
|
local DamageProxy = require(ServerStorage.Proxy.DamageProxy)
|
|
|
|
local Utils = require(ReplicatedStorage.Tools.Utils)
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
local SwordWave = {}
|
|
|
|
SwordWave.__index = SwordWave
|
|
|
|
setmetatable(SwordWave, {__index = Behaviour})
|
|
|
|
|
|
|
|
local CAST_DISTANCE = 50
|
|
|
|
local PROJECTILE_LENGTH = 50
|
|
|
|
local PROJECTILE_DURATION = 3
|
|
|
|
local COOLDOWN = 1
|
|
|
|
|
|
|
|
function SwordWave:Init(PlayerAI, Character: TypeList.Character, Player: Player)
|
|
|
|
local self = Behaviour:Init(PlayerAI, Character, script.Name)
|
|
|
|
self.Player = Player
|
|
|
|
setmetatable(self, SwordWave)
|
|
|
|
self.OrgCooldown = COOLDOWN
|
2025-07-15 01:12:05 +08:00
|
|
|
self:StartCooldownTask()
|
2025-07-12 05:06:14 +08:00
|
|
|
|
|
|
|
-- 客户端表现
|
|
|
|
self:SendPerformanceEvent("Init", self.Player, script.Name, true, {})
|
|
|
|
return self
|
|
|
|
end
|
|
|
|
|
|
|
|
function SwordWave:Check(CheckInfo: table)
|
|
|
|
if Behaviour.CheckStat(self) then return -1, self.CheckData end
|
|
|
|
|
|
|
|
local PlayerMobs = MobsProxy:GetPlayerMobs(self.Player)
|
|
|
|
if not PlayerMobs then return end
|
|
|
|
|
|
|
|
local closestMob, minDistance = nil, CAST_DISTANCE
|
|
|
|
for _, Mob in PlayerMobs do
|
|
|
|
if Mob.Instance and Mob.Instance.PrimaryPart then
|
|
|
|
local dist = (Mob.Instance.PrimaryPart.Position - self.Character.Instance.PrimaryPart.Position).Magnitude
|
|
|
|
if dist < minDistance then
|
|
|
|
minDistance = dist
|
|
|
|
closestMob = Mob
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
self.CheckData = {}
|
|
|
|
if closestMob then
|
|
|
|
self.CheckData["ClosestCharacter"] = closestMob
|
|
|
|
return 200, self.CheckData
|
|
|
|
end
|
|
|
|
|
|
|
|
-- 返回优先级,执行数据
|
|
|
|
return -1, self.CheckData
|
|
|
|
end
|
|
|
|
|
|
|
|
function SwordWave:Execute()
|
|
|
|
self.ExeTask = task.spawn(function ()
|
|
|
|
self:ChangeExecutingState(true)
|
2025-07-16 00:45:20 +08:00
|
|
|
-- cd放前面之后发送事件才能正常记录cd
|
|
|
|
self:StartCooldownTask()
|
|
|
|
|
2025-07-12 05:06:14 +08:00
|
|
|
task.wait(0.5)
|
|
|
|
-- 伤害逻辑部分
|
|
|
|
local StartPos = self.Character.Instance:GetPivot().Position
|
|
|
|
local EndPos = StartPos + (self.CheckData["ClosestCharacter"].Instance:GetPivot().Position - StartPos).Unit * PROJECTILE_LENGTH
|
|
|
|
|
|
|
|
StartPos, EndPos = Utils:GetFlatDirectionAndEndPos(StartPos, self.CheckData["ClosestCharacter"].Instance:GetPivot().Position, PROJECTILE_LENGTH)
|
|
|
|
DamageProxy:CastFreeProjectile(self.Character, StartPos, EndPos, PROJECTILE_DURATION, 4,
|
|
|
|
function (Victim: TypeList.Character)
|
|
|
|
self:OnHit(Victim)
|
|
|
|
end)
|
|
|
|
|
|
|
|
-- 表现部分
|
|
|
|
self:SendPerformanceEvent("Show", self.Player, self.ScriptName, true, {
|
|
|
|
{ UniqueId = self.PlayerAI:GetBehaviourUniqueId(),
|
|
|
|
StartPos = StartPos,
|
|
|
|
EndPos = EndPos,
|
|
|
|
Duration = PROJECTILE_DURATION,
|
2025-07-16 00:45:20 +08:00
|
|
|
Cooldown = self.Cooldown,
|
2025-07-12 05:06:14 +08:00
|
|
|
}
|
|
|
|
})
|
|
|
|
self:ChangeExecutingState(false)
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
function SwordWave:OnHit(Victim: TypeList.Character)
|
|
|
|
DamageProxy:TakeDamage(self.Character, Victim, {
|
|
|
|
{
|
|
|
|
Damage = 30,
|
|
|
|
Type = DamageProxy.DamageType.SKILL,
|
|
|
|
Tag = DamageProxy.DamageTag.NORMAL,
|
2025-07-17 00:12:35 +08:00
|
|
|
ElementType = DamageProxy.ElementType.NONE,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Damage = 5,
|
|
|
|
Type = DamageProxy.DamageType.SKILL,
|
|
|
|
Tag = DamageProxy.DamageTag.NORMAL,
|
|
|
|
ElementType = DamageProxy.ElementType.FIRE,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Damage = 5,
|
|
|
|
Type = DamageProxy.DamageType.SKILL,
|
|
|
|
Tag = DamageProxy.DamageTag.NORMAL,
|
|
|
|
ElementType = DamageProxy.ElementType.ICE,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Damage = 5,
|
|
|
|
Type = DamageProxy.DamageType.SKILL,
|
|
|
|
Tag = DamageProxy.DamageTag.NORMAL,
|
|
|
|
ElementType = DamageProxy.ElementType.SHADOW,
|
2025-07-12 05:06:14 +08:00
|
|
|
}
|
|
|
|
})
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
return SwordWave
|