-- 玩家循环代理 local PlayerFightProxy = {} --> Services local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerStorage = game:GetService("ServerStorage") --> Variables local Character = require(ServerStorage.Base.Character) local Utils = require(ReplicatedStorage.Tools.Utils) local LevelProxy = require(ServerStorage.Proxy.LevelProxy) --> Json local JsonCharacter = require(ReplicatedStorage.Json.Character) --> Dependencies local LevelLoop = require(script.LevelLoop) local PlayerAI = require(script.PlayerAI) local Communicate = require(ServerStorage.Modules.Tools.Communicate) --> Events local RE_CleanPlayerPerformance = ReplicatedStorage.Events.RE_CleanPlayerPerformance -------------------------------------------------------------------------------- local function WaitForCharacter(Player: Player) while not Player.Character or not Player.Character.Parent do Player.CharacterAdded:Wait() end return Player.Character end -------------------------------------------------------------------------------- local PlayerRole = {} PlayerRole.__index = PlayerRole setmetatable(PlayerRole, {__index = Character}) function PlayerRole.new(Player: Player, CharacterId: number) local playerCharacter = WaitForCharacter(Player) -- 获取玩家初始数据 local CharacterData = Utils:GetIdDataFromJson(JsonCharacter, CharacterId) if not CharacterData then warn("CharacterId Data not found", CharacterId) return end -- 调用父类Character的new方法,初始化通用属性 local self = Character.new(Player, playerCharacter, CharacterData) setmetatable(self, PlayerRole) -- 玩家放到Character目录下 playerCharacter.Parent = game.Workspace.Characters return self end function PlayerRole:Died() self:ChangeState("Died", true) self.Humanoid.WalkSpeed = 0 LevelProxy:ChallengeEnd(self.Player, false) end function PlayerRole:Respawn() self:ChangeState("Died", false) self.Humanoid.WalkSpeed = self.Config.walkSpeed self:ChangeAttributeValue("hp", self.Config.maxhp) -- 重置玩家位置 end -------------------------------------------------------------------------------- function PlayerFightProxy:InitPlayer(Player: Player) if not PlayerFightProxy.pData then PlayerFightProxy.pData = {} end if not PlayerFightProxy.pData[Player.UserId] then PlayerFightProxy.pData[Player.UserId] = {} end -- 生成玩家状态 local PlayerRole = PlayerRole.new(Player, 1) PlayerFightProxy.pData[Player.UserId].PlayerRole = PlayerRole -- 生成关卡循环 local LevelLoop = LevelLoop.new(Player, PlayerRole) PlayerFightProxy.pData[Player.UserId].LevelLoop = LevelLoop -- 生成玩家AI local PlayerAI = PlayerAI.new(Player, PlayerRole) PlayerFightProxy.pData[Player.UserId].PlayerAI = PlayerAI PlayerAI:AddBehaviour("Move") PlayerAI:AddBehaviour("SwordWave") 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) -- 玩家角色重生 PlayerFightProxy.pData[Player.UserId].PlayerRole:Respawn() -- AI重新生成 PlayerFightProxy.pData[Player.UserId].PlayerAI:Destroy() PlayerFightProxy.pData[Player.UserId].PlayerAI = nil local PlayerAI = PlayerAI.new(PlayerRole) PlayerFightProxy.pData[Player.UserId].PlayerAI = PlayerAI end function PlayerFightProxy:OnPlayerRemoving(Player: Player) -- 玩家离开时,通知其他客户端销毁玩家表现内容 Communicate:SendToClientFree(RE_CleanPlayerPerformance, Player) -- 正常清除玩家该模块下数据 if not PlayerFightProxy.pData[Player.UserId] then warn("PlayerFight Remove Data not found", Player.Name) return end PlayerFightProxy.pData[Player.UserId] = nil end Players.PlayerRemoving:Connect(function(Player: Player) PlayerFightProxy:OnPlayerRemoving(Player) end) return PlayerFightProxy