103 lines
3.3 KiB
Plaintext
Raw Normal View History

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)
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,
Cooldown = self.OrgCooldown,
}
})
self:StartCooldownTask()
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,
}
})
return false
end
return SwordWave