2025-08-27 00:09:38 +08:00

192 lines
5.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local Behaviour = {}
Behaviour.__index = Behaviour
--> Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
--> Events
local RE_PerformanceEvent = ReplicatedStorage:FindFirstChild("Events"):FindFirstChild("RE_PerformanceEvent")
local RE_CleanPlayerPerformance = ReplicatedStorage:FindFirstChild("Events"):FindFirstChild("RE_CleanPlayerPerformance")
--> Dependencies
local TypeList = require(ServerStorage.Base.TypeList)
local Communicate = require(ServerStorage.Modules.Tools.Communicate)
local Utils = require(ReplicatedStorage.Tools.Utils)
--> Json
local JsonAttributes = require(ReplicatedStorage.Json.Attributes)
--> 临时维护一个属性数据表,用于记录属性类型
local AttributesNameData = {}
for _, Attribute in JsonAttributes do
AttributesNameData[Attribute.effectAttribute] = Utils:DeepCopyTable(Attribute)
end
--------------------------------------------------------------------------------
-- 刷新时,重新载入,暂时不考虑性能
-- 初始化内容
function Behaviour:Init(PlayerAI, Character: TypeList.Character, ScriptName: string)
local self = {}
self.PlayerAI = PlayerAI
self.Character = Character
self.CheckData = nil
self.ExeTask = nil
self.UniqueIdList = {}
self.ScriptName = ScriptName
self.Cooldown = 0
self.OrgCooldown = 0
self.CooldownTask = nil
local Humanoid = self.Character.Humanoid
-- 监听属性变化
self.ConAttribtueChanged = Humanoid.AttributeChanged:Connect(function(attributeKey: string, attributeValue: any)
-- 以后这里要是有其他状态也可以加打断
if attributeKey == "Died" and attributeValue == true then
self:OnDied()
end
end)
return self
end
-- 执行检查(主要重写部分) return 优先级, 执行数据
function Behaviour:Check(CheckInfo: table)
-- 返回优先级,执行数据
return -1, self.CheckData
end
-- 具体执行内容(主要重写部分)
function Behaviour:Execute()
end
-- 检查行为前先清理之前遗留的引用数据
function Behaviour:CheckClean()
if self.Mobs then
for _, Mob in self.Mobs do
self.Mobs[Mob] = nil
end
self.Mobs = nil
end
if self.CheckData then
for key, cha in self.CheckData do
self.CheckData[key] = nil
end
self.CheckData = nil
end
end
function Behaviour:GetAttributeValue(AttributeName: string, IsOrgValue: boolean)
local AttributeValue = self.Character.Instance:FindFirstChild("Attributes"):GetAttribute(AttributeName)
if not AttributeValue then return nil end
-- 处理对应的值
local AttributeData = AttributesNameData[AttributeName]
if not AttributeData then return nil end
if IsOrgValue then return AttributeValue end
local typeValue = AttributeData.type
if typeValue == 1 then
return AttributeValue
elseif typeValue == 2 then
return AttributeValue / 100
end
end
-- 启动冷却时间清除计时
function Behaviour:StartCooldownTask()
self.Cooldown = self.OrgCooldown
self.CooldownTask = task.spawn(function()
task.wait(self.OrgCooldown)
self.Cooldown = 0
end)
end
function Behaviour:SendPerformanceEvent(...)
Communicate:SendToClient(RE_PerformanceEvent, ...)
end
-- 检查当前状态是否可执行
function Behaviour:CheckStat()
if not self.Character then return true end
-- 死亡检查
if self.Character:GetState("Died") then return true end
-- 冷却中检查
if self.Cooldown > 0 then return true end
-- 执行状态中检查
local ExecutingState = self.PlayerAI.ExecutingState
-- 其他内容执行中就false
if ExecutingState == true then return true end
return false
end
-- 检查特殊状态是否可执行(禁止使用技能)
function Behaviour:CheckSpecialStat()
if not self.Character then return true end
if self.PlayerAI:GetSharedData("BanAbility") then
return true
end
return false
end
-- 改变当前执行状态标记
function Behaviour:ChangeExecutingState(State: boolean)
if not self.Character then warn("Behaviour Character not found") return end
self.PlayerAI.ExecutingState = State
end
-- 打断执行
function Behaviour:StopExecute()
if self.ExeTask then
task.cancel(self.ExeTask)
self.ExeTask = nil
end
end
-- 销毁
function Behaviour:Destroy()
-- 清除客户端对应行为表现
for _, UniqueId in self.UniqueIdList do
self:SendPerformanceEvent("Destroy", self.Player, self.ScriptName, true, {UniqueId = UniqueId})
end
if self.CooldownTask then
task.cancel(self.CooldownTask)
self.CooldownTask = nil
end
if self.ExeTask then
task.cancel(self.ExeTask)
self.ExeTask = nil
end
-- 清除数据
self.UniqueIdList = {}
if self.ConAttribtueChanged then
self.ConAttribtueChanged:Disconnect()
self.ConAttribtueChanged = nil
end
if self.LoopTask then
task.cancel(self.LoopTask)
self.LoopTask = nil
end
for _, UniqueId in self.UniqueIdList do
self.PlayerAI:RemoveBehaviourUniqueId(UniqueId)
end
self.UniqueIdList = {}
for k, v in pairs(self) do
self[k] = nil
end
self = nil
end
-- 死亡时,主要打断当前执行状态
function Behaviour:OnDied()
if self.ExeTask then
task.cancel(self.ExeTask)
self.ExeTask = nil
end
end
return Behaviour