-- 移动行为 --> 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 self.Mobs = nil setmetatable(self, SwordWave) self.OrgCooldown = COOLDOWN self:StartCooldownTask() -- 客户端表现 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 if self:CheckSpecialStat() then return -1, self.CheckData end self:CheckClean() self.Mobs = MobsProxy:GetPlayerMobs(self.Player) if not self.Mobs then return end local closestMob, minDistance = nil, CAST_DISTANCE for _, Mob in self.Mobs 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) -- cd放前面之后发送事件才能正常记录cd self:StartCooldownTask() 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.Cooldown, } }) 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, 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, } }) return false end return SwordWave