This commit is contained in:
Ggafrik 2025-07-09 02:01:45 +08:00
parent 962aedcb0d
commit f1728a045b
10 changed files with 41 additions and 27 deletions

Binary file not shown.

View File

@ -1,5 +1,5 @@
[ [
{"id":1,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1]]}, {"id":1,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1]]},
{"id":2,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1]]}, {"id":2,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1]]},
{"id":3,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1]]}, {"id":3,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1]]},
{"id":4,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1]]}, {"id":4,"type":1,"timeLimit":null,"atkBonus":1000,"hpBonus":1000,"wave":[[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1],[10,1,1,10,2,1]]},

View File

@ -9,8 +9,9 @@ local TypeList = require(script.Parent.TypeList)
-- 刷新时,重新载入,暂时不考虑性能 -- 刷新时,重新载入,暂时不考虑性能
-- 初始化内容 -- 初始化内容
function Behaviour:Init(Character: TypeList.Character) function Behaviour:Init(PlayerAI, Character: TypeList.Character)
local self = {} local self = {}
self.PlayerAI = PlayerAI
self.Character = Character self.Character = Character
self.CheckData = nil self.CheckData = nil
self.ExeTask = nil self.ExeTask = nil
@ -44,18 +45,16 @@ function Behaviour:CheckStat()
if self.Character:GetState("Died") then return false end if self.Character:GetState("Died") then return false end
-- 执行状态中检查 -- 执行状态中检查
local FightingFolder = self.Character:FindFirstChild("Fighting") local ExecutingState = self.PlayerAI.ExecutingState
local ExecutingState = FightingFolder:FindFirstChild("ExecutingState")
-- 其他内容执行中就false -- 其他内容执行中就false
if ExecutingState.Value == true then return false end if ExecutingState == true then return false end
return true return true
end end
-- 改变当前执行状态标记 -- 改变当前执行状态标记
function Behaviour:ChangeExecutingState(State: boolean) function Behaviour:ChangeExecutingState(State: boolean)
if not self.Character then warn("Behaviour Character not found") return end if not self.Character then warn("Behaviour Character not found") return end
local FightingFolder = self.Character:FindFirstChild("Fighting") local ExecutingState = self.PlayerAI.ExecutingState
local ExecutingState = FightingFolder:FindFirstChild("ExecutingState")
ExecutingState.Value = State ExecutingState.Value = State
end end

View File

@ -5,7 +5,7 @@ Character.__index = Character
local TypeList = require(script.Parent.TypeList) local TypeList = require(script.Parent.TypeList)
local LIMIT_ATTRIBUTE = { local LIMIT_ATTRIBUTE = {
"health" "hp"
} }
function Character.new(Player: Player, CharacterModel: Model, CharacterData: table): TypeList.Character function Character.new(Player: Player, CharacterModel: Model, CharacterData: table): TypeList.Character
@ -36,10 +36,12 @@ function Character.new(Player: Player, CharacterModel: Model, CharacterData: tab
Attributes:SetAttribute("max" .. attributeKey, attributeValue) Attributes:SetAttribute("max" .. attributeKey, attributeValue)
end end
end end
local conAttribute = Attributes.AttributeChanged:Connect(function(attributeKey: string, attributeValue: number)
self:ChangeAttribute(attributeKey, attributeValue) -- 通过函数调用了,不绑定事件了
end) -- local conAttribute = Attributes.AttributeChanged:Connect(function(attributeKey: string, attributeValue: number)
table.insert(self.Connections, conAttribute) -- self:ChangeAttributeValue(attributeKey, attributeValue)
-- end)
-- table.insert(self.Connections, conAttribute)
-- 配置角色状态数据 -- 配置角色状态数据
local statsData = { local statsData = {
@ -71,7 +73,9 @@ function Character:GetAttributeValue(attributeKey: string)
return self.Config[attributeKey], self.Instance.Attributes:GetAttribute(attributeKey) return self.Config[attributeKey], self.Instance.Attributes:GetAttribute(attributeKey)
end end
function Character:ChangeAttribute(attributeKey: string, value: any) function Character:ChangeAttributeValue(attributeKey: string, value: any)
if not attributeKey then warn("attributeKey is nil", attributeKey) return end
if not value then warn("value is nil", value) return end
local newValue = value local newValue = value
-- 限制最大值 -- 限制最大值
if table.find(LIMIT_ATTRIBUTE, attributeKey) then if table.find(LIMIT_ATTRIBUTE, attributeKey) then
@ -84,7 +88,7 @@ function Character:ChangeAttribute(attributeKey: string, value: any)
self.Instance.Attributes:SetAttribute(attributeKey, newValue) self.Instance.Attributes:SetAttribute(attributeKey, newValue)
-- 死亡判断 -- 死亡判断
if attributeKey == "health" and self.Stats.Died == false then if attributeKey == "hp" and self.Stats.Died == false then
if self.Config[attributeKey] <= 0 then if self.Config[attributeKey] <= 0 then
self:Died() self:Died()
end end

View File

@ -13,8 +13,8 @@ local MobsProxy = require(ServerStorage.Proxy.MobsProxy)
local Move = {} local Move = {}
Move.__index = Move Move.__index = Move
function Move:Init(Character: TypeList.Character, Player: Player) function Move:Init(PlayerAI, Character: TypeList.Character, Player: Player)
local self = Behaviour:Init(Character) local self = Behaviour:Init(PlayerAI, Character)
self.Player = Player self.Player = Player
setmetatable(self, Move) setmetatable(self, Move)
return self return self

View File

@ -56,7 +56,7 @@ function DamageProxy:TakeDamage(Caster: TypeList.Character, Victim: TypeList.Cha
-- 伤害计算 -- 伤害计算
local VictimHealth = Victim:GetAttributeValue("hp") local VictimHealth = Victim:GetAttributeValue("hp")
Victim:ChangeAttribute("hp", math.max(0, VictimHealth - Damage)) Victim:ChangeAttributeValue("hp", math.max(0, VictimHealth - Damage))
end end
end end

View File

@ -91,9 +91,9 @@ task.defer(function()
if not Player then return end if not Player then return end
if AI:GetModelDistance(MobInstance, Player.Character) <= 5 then if AI:GetModelDistance(MobInstance, Player.Character) <= 5 then
-- 调用伤害模块 -- 调用伤害模块
DamageProxy:TakeDamage(MobInstance, Player.Character, { DamageProxy:TakeDamage(Mob, Mob.PlayerRole, {
{ {
Damage = 10, Damage = Mob.Config.attack,
DamageType = DamageProxy.DamageType.PHYSICAL, DamageType = DamageProxy.DamageType.PHYSICAL,
DamageTag = DamageProxy.DamageTag.NORMAL DamageTag = DamageProxy.DamageTag.NORMAL
} }

View File

@ -8,7 +8,6 @@ local Players = game:GetService("Players")
--> Variables --> Variables
local Utils = require(ReplicatedStorage.Tools.Utils) local Utils = require(ReplicatedStorage.Tools.Utils)
local PlayerInfoProxy = require(ServerStorage.Proxy.PlayerInfoProxy)
local AI = require(script.AI) local AI = require(script.AI)
local Character = require(ServerStorage.Base.Character) local Character = require(ServerStorage.Base.Character)
local TypeList = require(ServerStorage.Base.TypeList) local TypeList = require(ServerStorage.Base.TypeList)
@ -39,7 +38,8 @@ end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
local Mob = {} local Mob = {}
Mob.__index = Character Mob.__index = Mob
setmetatable(Mob, {__index = Character})
function Mob.new(Player: Player, MobId: number, OnMobDied: ((Player: Player, Mob: TypeList.Character) -> ())?) function Mob.new(Player: Player, MobId: number, OnMobDied: ((Player: Player, Mob: TypeList.Character) -> ())?)
-- 获取玩家怪物目录 -- 获取玩家怪物目录
@ -60,6 +60,8 @@ function Mob.new(Player: Player, MobId: number, OnMobDied: ((Player: Player, Mob
-- 调用父类Character的new方法初始化通用属性 -- 调用父类Character的new方法初始化通用属性
local self = Character.new(Player, newMobModel, MobData) local self = Character.new(Player, newMobModel, MobData)
setmetatable(self, Mob) -- 继承Mob方法 setmetatable(self, Mob) -- 继承Mob方法
local PlayerFightProxy = require(ServerStorage.Proxy.PlayerFightProxy)
self.PlayerRole = PlayerFightProxy:GetPlayerRole(Player)
-- 放入关卡中 -- 放入关卡中
newMobModel.Parent = playerMobsFolder newMobModel.Parent = playerMobsFolder
@ -91,8 +93,8 @@ function MobsProxy:CreateMob(Player: Player, MobId: number, AtkBonus: number?, H
local Mob = Mob.new(Player, MobId, OnMobDied) local Mob = Mob.new(Player, MobId, OnMobDied)
AI:StartTracking(Mob) AI:StartTracking(Mob)
-- 关卡系数 -- 关卡系数
if AtkBonus then Mob:ChangeAttribute("attack", math.floor(Mob.Config.attack * (AtkBonus / 1000))) end -- if AtkBonus then Mob:ChangeAttributeValue("attack", math.floor(Mob.Config.attack * (AtkBonus / 1000))) end
if HpBonus then Mob:ChangeAttribute("hp", math.floor(Mob.Config.hp * (HpBonus / 1000))) end -- if HpBonus then Mob:ChangeAttributeValue("hp", math.floor(Mob.Config.hp * (HpBonus / 1000))) end
MobsProxy.pData[Player.UserId][Mob.Instance] = Mob MobsProxy.pData[Player.UserId][Mob.Instance] = Mob
return Mob return Mob
end end

View File

@ -41,6 +41,7 @@ function PlayerAI.new(Player: Player, PlayerRole: TypeList.Character)
setmetatable(self, PlayerAI) setmetatable(self, PlayerAI)
self.Character = PlayerRole self.Character = PlayerRole
self.Player = Player self.Player = Player
self.ExecutingState = false
self.BehaviourList = {} self.BehaviourList = {}
self.LoopTask = task.spawn(function() self.LoopTask = task.spawn(function()
@ -75,7 +76,7 @@ end
-- 动态添加行为 -- 动态添加行为
function PlayerAI:AddBehaviour(BehaviourName: string) function PlayerAI:AddBehaviour(BehaviourName: string)
if not Behaviours[BehaviourName] then warn("Behaviour not found") return end if not Behaviours[BehaviourName] then warn("Behaviour not found") return end
local newBehaviour = Behaviours[BehaviourName]:Init(self.Character, self.Player) local newBehaviour = Behaviours[BehaviourName]:Init(self, self.Character, self.Player)
self.BehaviourList[BehaviourName] = newBehaviour self.BehaviourList[BehaviourName] = newBehaviour
end end

View File

@ -30,12 +30,13 @@ end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
local PlayerRole = {} local PlayerRole = {}
PlayerRole.__index = Character PlayerRole.__index = PlayerRole
setmetatable(PlayerRole, {__index = Character})
function PlayerRole.new(Player: Player, CharacterId: number) function PlayerRole.new(Player: Player, CharacterId: number)
local playerCharacter = WaitForCharacter(Player) local playerCharacter = WaitForCharacter(Player)
-- 获取怪物数据 -- 获取玩家初始数据
local CharacterData = Utils:GetIdDataFromJson(JsonCharacter, CharacterId) local CharacterData = Utils:GetIdDataFromJson(JsonCharacter, CharacterId)
if not CharacterData then warn("CharacterId Data not found", CharacterId) return end if not CharacterData then warn("CharacterId Data not found", CharacterId) return end
@ -52,7 +53,7 @@ end
function PlayerRole:Respawn() function PlayerRole:Respawn()
self:ChangeState("Died", false) self:ChangeState("Died", false)
self:ChangeAttribute("hp", self.Config.maxhp) self:ChangeAttributeValue("hp", self.Config.maxhp)
-- 重置玩家位置 -- 重置玩家位置
end end
@ -79,6 +80,13 @@ function PlayerFightProxy:InitPlayer(Player: Player)
PlayerAI:AddBehaviour("Move") PlayerAI:AddBehaviour("Move")
end end
function PlayerFightProxy:GetPlayerRole(Player: Player)
return PlayerFightProxy.pData[Player.UserId].PlayerRole
end
function PlayerFightProxy:GetPlayerAI(Player: Player)
return PlayerFightProxy.pData[Player.UserId].PlayerAI
end
-- 重置玩家状态,但是不删除 -- 重置玩家状态,但是不删除
function PlayerFightProxy:CleanPlayer(Player: Player) function PlayerFightProxy:CleanPlayer(Player: Player)