2025-07-07 23:52:31 +08:00
|
|
|
|
local Behaviour = {}
|
|
|
|
|
Behaviour.__index = Behaviour
|
|
|
|
|
|
2025-07-12 05:06:14 +08:00
|
|
|
|
--> 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")
|
|
|
|
|
|
2025-07-07 23:52:31 +08:00
|
|
|
|
--> Dependencies
|
2025-07-12 05:06:14 +08:00
|
|
|
|
local TypeList = require(ServerStorage.Base.TypeList)
|
|
|
|
|
local Communicate = require(ServerStorage.Modules.Tools.Communicate)
|
2025-07-30 19:46:01 +08:00
|
|
|
|
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
|
2025-07-07 23:52:31 +08:00
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
-- 刷新时,重新载入,暂时不考虑性能
|
|
|
|
|
|
|
|
|
|
-- 初始化内容
|
2025-07-12 05:06:14 +08:00
|
|
|
|
function Behaviour:Init(PlayerAI, Character: TypeList.Character, ScriptName: string)
|
2025-07-07 23:52:31 +08:00
|
|
|
|
local self = {}
|
2025-07-09 02:01:45 +08:00
|
|
|
|
self.PlayerAI = PlayerAI
|
2025-07-07 23:52:31 +08:00
|
|
|
|
self.Character = Character
|
|
|
|
|
self.CheckData = nil
|
|
|
|
|
self.ExeTask = nil
|
2025-07-12 05:06:14 +08:00
|
|
|
|
self.UniqueIdList = {}
|
|
|
|
|
self.ScriptName = ScriptName
|
|
|
|
|
self.Cooldown = 0
|
|
|
|
|
self.OrgCooldown = 0
|
|
|
|
|
self.CooldownTask = nil
|
2025-07-07 23:52:31 +08:00
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
2025-07-18 01:11:49 +08:00
|
|
|
|
-- 检查行为前先清理之前遗留的引用数据
|
|
|
|
|
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
|
|
|
|
|
|
2025-08-27 00:09:38 +08:00
|
|
|
|
function Behaviour:GetAttributeValue(AttributeName: string, IsOrgValue: boolean)
|
2025-07-30 19:46:01 +08:00
|
|
|
|
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
|
|
|
|
|
|
2025-08-27 00:09:38 +08:00
|
|
|
|
if IsOrgValue then return AttributeValue end
|
|
|
|
|
|
2025-07-30 19:46:01 +08:00
|
|
|
|
local typeValue = AttributeData.type
|
|
|
|
|
if typeValue == 1 then
|
|
|
|
|
return AttributeValue
|
|
|
|
|
elseif typeValue == 2 then
|
|
|
|
|
return AttributeValue / 100
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2025-07-12 05:06:14 +08:00
|
|
|
|
-- 启动冷却时间清除计时
|
|
|
|
|
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
|
|
|
|
|
|
2025-07-07 23:52:31 +08:00
|
|
|
|
-- 检查当前状态是否可执行
|
|
|
|
|
function Behaviour:CheckStat()
|
2025-07-09 23:59:56 +08:00
|
|
|
|
if not self.Character then return true end
|
2025-07-07 23:52:31 +08:00
|
|
|
|
-- 死亡检查
|
2025-07-09 23:59:56 +08:00
|
|
|
|
if self.Character:GetState("Died") then return true end
|
2025-07-07 23:52:31 +08:00
|
|
|
|
|
2025-07-12 05:06:14 +08:00
|
|
|
|
-- 冷却中检查
|
|
|
|
|
if self.Cooldown > 0 then return true end
|
|
|
|
|
|
2025-07-07 23:52:31 +08:00
|
|
|
|
-- 执行状态中检查
|
2025-07-09 02:01:45 +08:00
|
|
|
|
local ExecutingState = self.PlayerAI.ExecutingState
|
2025-07-07 23:52:31 +08:00
|
|
|
|
-- 其他内容执行中,就false
|
2025-07-09 23:59:56 +08:00
|
|
|
|
if ExecutingState == true then return true end
|
|
|
|
|
return false
|
2025-07-07 23:52:31 +08:00
|
|
|
|
end
|
|
|
|
|
|
2025-08-22 16:40:29 +08:00
|
|
|
|
-- 检查特殊状态是否可执行(禁止使用技能)
|
|
|
|
|
function Behaviour:CheckSpecialStat()
|
|
|
|
|
if not self.Character then return true end
|
|
|
|
|
if self.PlayerAI:GetSharedData("BanAbility") then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
2025-07-07 23:52:31 +08:00
|
|
|
|
-- 改变当前执行状态标记
|
|
|
|
|
function Behaviour:ChangeExecutingState(State: boolean)
|
|
|
|
|
if not self.Character then warn("Behaviour Character not found") return end
|
2025-07-09 23:59:56 +08:00
|
|
|
|
self.PlayerAI.ExecutingState = State
|
2025-07-07 23:52:31 +08:00
|
|
|
|
end
|
|
|
|
|
|
2025-08-01 19:23:12 +08:00
|
|
|
|
-- 打断执行
|
|
|
|
|
function Behaviour:StopExecute()
|
|
|
|
|
if self.ExeTask then
|
|
|
|
|
task.cancel(self.ExeTask)
|
|
|
|
|
self.ExeTask = nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2025-07-07 23:52:31 +08:00
|
|
|
|
-- 销毁
|
|
|
|
|
function Behaviour:Destroy()
|
2025-07-12 05:06:14 +08:00
|
|
|
|
-- 清除客户端对应行为表现
|
|
|
|
|
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 = {}
|
2025-07-07 23:52:31 +08:00
|
|
|
|
if self.ConAttribtueChanged then
|
|
|
|
|
self.ConAttribtueChanged:Disconnect()
|
|
|
|
|
self.ConAttribtueChanged = nil
|
|
|
|
|
end
|
|
|
|
|
if self.LoopTask then
|
|
|
|
|
task.cancel(self.LoopTask)
|
|
|
|
|
self.LoopTask = nil
|
|
|
|
|
end
|
2025-07-12 05:06:14 +08:00
|
|
|
|
for _, UniqueId in self.UniqueIdList do
|
|
|
|
|
self.PlayerAI:RemoveBehaviourUniqueId(UniqueId)
|
|
|
|
|
end
|
|
|
|
|
self.UniqueIdList = {}
|
2025-07-18 01:11:49 +08:00
|
|
|
|
for k, v in pairs(self) do
|
|
|
|
|
self[k] = nil
|
|
|
|
|
end
|
2025-07-07 23:52:31 +08:00
|
|
|
|
self = nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 死亡时,主要打断当前执行状态
|
|
|
|
|
function Behaviour:OnDied()
|
|
|
|
|
if self.ExeTask then
|
|
|
|
|
task.cancel(self.ExeTask)
|
|
|
|
|
self.ExeTask = nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return Behaviour
|