diff --git a/excel/cha.xlsx b/excel/cha.xlsx index aa490c1..64e1aba 100644 Binary files a/excel/cha.xlsx and b/excel/cha.xlsx differ diff --git a/excel/enemy.xlsx b/excel/enemy.xlsx index acac085..b5f6840 100644 Binary files a/excel/enemy.xlsx and b/excel/enemy.xlsx differ diff --git a/src/ReplicatedStorage/Json/Enemy.json b/src/ReplicatedStorage/Json/Enemy.json index 3a16439..32312dd 100644 --- a/src/ReplicatedStorage/Json/Enemy.json +++ b/src/ReplicatedStorage/Json/Enemy.json @@ -1,5 +1,5 @@ [ {"id":1,"type":1,"name":1,"attack":83,"hp":400,"walkSpeed":8,"attackSpeed":1,"model":"Thief"}, {"id":2,"type":1,"name":2,"attack":30,"hp":300,"walkSpeed":8,"attackSpeed":1,"model":"Thief"}, -{"id":1000,"type":2,"name":1000,"attack":240,"hp":2000,"walkSpeed":4,"attackSpeed":1,"model":"Thief"} +{"id":1000,"type":2,"name":1000,"attack":120,"hp":1000,"walkSpeed":4,"attackSpeed":1,"model":"Thief"} ] \ No newline at end of file diff --git a/src/ServerStorage/Proxy/LevelProxy.luau b/src/ServerStorage/Proxy/LevelProxy.luau index 3ea53c8..c15576d 100644 --- a/src/ServerStorage/Proxy/LevelProxy.luau +++ b/src/ServerStorage/Proxy/LevelProxy.luau @@ -183,6 +183,7 @@ end -- 挑战关卡(挑战副本用另一个函数) function LevelProxy:ChallengeLevel(Player: Player, LevelId: number) + print("挑战关卡", LevelId) local LevelData = Utils:GetIdDataFromJson(JsonLevel, LevelId) if not LevelData then warn("Level Data not found", LevelId) return end -- 给前端传数据,做表现 @@ -259,7 +260,7 @@ function LevelProxy:ChallengeEnd(Player: Player, result: boolean) end -- 清除剩余怪物 - for _, mob in LevelProxy.pData[Player.UserId].Mobs do mob:Died(true) end + for _, mob in pairs(LevelProxy.pData[Player.UserId].Mobs) do mob:Died(true) end LevelProxy.pData[Player.UserId].Mobs = {} -- 清除玩家表现 diff --git a/src/ServerStorage/Proxy/MobsProxy/init.luau b/src/ServerStorage/Proxy/MobsProxy/init.luau index 0f3f4be..458ff6b 100644 --- a/src/ServerStorage/Proxy/MobsProxy/init.luau +++ b/src/ServerStorage/Proxy/MobsProxy/init.luau @@ -81,13 +81,12 @@ function Mob.new(Player: Player, MobId: number, OnMobDied: ((Player: Player, Mob return self end --- IsSkinOnDied:暂时意义不明,忘了之前为啥写了 -function Mob:Died(IsSkinOnDied: boolean?) +-- isChallengeFailed 挑战失败清除怪物传参 +function Mob:Died(isChallengeFailed: boolean?) MobsProxy:RemoveMob(self.Player, self.Instance) - -- if not IsSkinOnDied then - -- if self.OnDied then self.OnDied(self.Player, self) end - -- end - if self.OnDied then self.OnDied(self.Player, self) end + if not isChallengeFailed then + if self.OnDied then self.OnDied(self.Player, self) end + end Character.Died(self) end @@ -110,7 +109,7 @@ end -- 清除玩家单个怪物 function MobsProxy:RemoveMob(Player: Player, MobInstance: Instance) local playerMobsFolder = GetPlayerMobsFolder(Player) - if not playerMobsFolder then return end + if not playerMobsFolder then warn("playerMobsFolder not found", Player.Name) return end if not MobsProxy.pData[Player.UserId][MobInstance] then warn("Mob not found", MobInstance) return end MobsProxy.pData[Player.UserId][MobInstance] = nil diff --git a/src/ServerStorage/Proxy/PlayerFightProxy/LevelLoop.luau b/src/ServerStorage/Proxy/PlayerFightProxy/LevelLoop.luau index 6452865..4756f64 100644 --- a/src/ServerStorage/Proxy/PlayerFightProxy/LevelLoop.luau +++ b/src/ServerStorage/Proxy/PlayerFightProxy/LevelLoop.luau @@ -6,6 +6,7 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") --> Events local BD_ChallengeEnd = ReplicatedStorage.Events.BD_ChallengeEnd +local RE_ChallengeBoss = ReplicatedStorage.Events.RE_ChallengeBoss --> Dependencies local LevelProxy = require(ServerStorage.Proxy.LevelProxy) @@ -31,12 +32,16 @@ function LevelLoop.new(Player: Player, PlayerRole: TypeList.Character) if Player ~= self.Player then return end self:OnChallengeEnd(Player, LevelId) end) + self.ConChallengeBoss = RE_ChallengeBoss.OnServerEvent:Connect(function(Player: Player) + if Player ~= self.Player then return end + self:OnChallengeBoss(Player) + end) self:AutoChallenge() return self end -function LevelLoop:AutoChallenge() +function LevelLoop:AutoChallenge(ignoreBoss: boolean?) print("AutoChallenge") -- TODO: 回退有bug,不能一关一关回退 @@ -47,7 +52,9 @@ function LevelLoop:AutoChallenge() local LevelId = ProgressFolder:FindFirstChild("Main").Value local FailBossId = ProgressFolder:FindFirstChild("BossFail").Value -- Boss失败了就去挑战上一个关卡 - if FailBossId == LevelId then + if ignoreBoss then + LevelId = LevelId + elseif FailBossId == LevelId then LevelId = LevelId - 1 end @@ -55,6 +62,7 @@ function LevelLoop:AutoChallenge() end function LevelLoop:OnChallengeEnd(Player: Player, LevelId: number, result: boolean) + if self.ChallengeBoss then self.ChallengeBoss = nil return end self.TaskAutoChallenge = task.spawn(function() task.wait(3) -- 重置玩家状态(先临时调用角色复活,之后复杂的内容再说) @@ -63,11 +71,26 @@ function LevelLoop:OnChallengeEnd(Player: Player, LevelId: number, result: boole end) end +function LevelLoop:OnChallengeBoss(Player: Player) + self.TaskAutoChallenge = task.spawn(function() + self.ChallengeBoss = true + LevelProxy:ChallengeEnd(self.Player, false) + -- 重置玩家状态(先临时调用角色复活,之后复杂的内容再说) + task.wait(1) + self.PlayerRole:Respawn() + self:AutoChallenge(true) + end) +end + function LevelLoop:Destroy() if self.TaskAutoChallenge then task.cancel(self.TaskAutoChallenge) self.TaskAutoChallenge = nil end + if self.ConChallengeBoss then + self.ConChallengeBoss:Disconnect() + self.ConChallengeBoss = nil + end if self.ConChallengeEnd then self.ConChallengeEnd:Disconnect() self.ConChallengeEnd = nil diff --git a/src/StarterPlayerScripts/ClientMain/Camera.client.luau b/src/StarterPlayerScripts/ClientMain/Camera.client.luau index fb9d04d..633aa9b 100644 --- a/src/StarterPlayerScripts/ClientMain/Camera.client.luau +++ b/src/StarterPlayerScripts/ClientMain/Camera.client.luau @@ -6,7 +6,7 @@ local player = Players.LocalPlayer local camera = workspace.CurrentCamera local CAMERA_DISTANCE = 30 -local CAMERA_HEIGHT = 40 +local CAMERA_HEIGHT = 35 local CAMERA_ANGLE = math.rad(-45) local SCREEN_OFFSET = 5 diff --git a/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau index ddbb2fe..bb6df74 100644 --- a/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau @@ -7,9 +7,13 @@ local UIEnums = require(ReplicatedStorage.Base.UIEnums) --> Json local JsonLevel = require(ReplicatedStorage.Json.Level) +local JsonForge = require(ReplicatedStorage.Json.Forge) local Utils = require(ReplicatedStorage.Tools.Utils) +--> Events +local RE_ChallengeBoss = ReplicatedStorage.Events.RE_ChallengeBoss + local LocalPlayer = game:GetService("Players").LocalPlayer -------------------------------------------------------------------------------- @@ -26,8 +30,16 @@ function MainWindow:Init(UIManager: table, Data: table?) ["_btnMainCha"] = 0, ["_btnMainAttributeUpgrade"] = 0, + -- 关卡 ["_tmpNowLevel"] = 0, ["_imgBoss"] = 0, + ["_btnChallengeBoss"] = 0, + + -- 锻造条 + ["_goForgeBar"] = 0, + ["_goForgeFill"] = 0, + ["_tmpForgeMoney"] = 0, + ["_tmpForgeTime"] = 0, } self.UIRootName = "ui_w_main" self.UIParentName = UIEnums.UIParent.UIRoot @@ -35,6 +47,7 @@ function MainWindow:Init(UIManager: table, Data: table?) return self end +-- 设置关卡显示 function MainWindow:SetShowLevel(level: number) self.Variables["_tmpNowLevel"].Text = string.format("第%d关", level) local levelData = Utils:GetIdDataFromJson(JsonLevel, level) @@ -45,6 +58,46 @@ function MainWindow:SetShowLevel(level: number) end end +-- 设置boss挑战按钮显示 +function MainWindow:SetShowBossChallenge(newValue: number) + local playerDataFolder = game.Workspace:WaitForChild("Level"):WaitForChild(LocalPlayer.UserId) + local ProgressFolder = playerDataFolder:WaitForChild("Progress") + local mainValue = ProgressFolder:FindFirstChild("Main").Value + local levelIdValue = playerDataFolder:WaitForChild("Challenge"):WaitForChild("LevelId").Value + + if levelIdValue == mainValue then + self.Variables["_btnChallengeBoss"].Visible = false + else + self.Variables["_btnChallengeBoss"].Visible = (newValue == mainValue) + end +end + +-- 手动点击按钮,挑战boss +function MainWindow:OnClickChallengeBoss() + RE_ChallengeBoss:FireServer() + + self.Variables["_btnChallengeBoss"].Visible = false +end + +function MainWindow:SetShowForgeBar(nowForgeTime : number, moneyValue: number) + local maxForgeId = Utils:GetMaxIdFromJson(JsonForge) + local forgeTime = nowForgeTime > maxForgeId and maxForgeId or nowForgeTime + local forgeData = Utils:GetIdDataFromJson(JsonForge, forgeTime) + + -- 进度条 + self.Variables["_goForgeFill"].Size = UDim2.new(math.min(moneyValue / forgeData.cost[2], 1), 0, 1, 0) + self.Variables["_tmpForgeMoney"].Text = string.format("%d/%d", moneyValue, forgeData.cost[2]) + + -- 右上角红点 + local timeRecorder = math.ceil(moneyValue / forgeData.cost[2]) + if timeRecorder > 0 then + self.Variables["_tmpForgeTime"].Visible = true + self.Variables["_tmpForgeTime"].Text = timeRecorder + else + self.Variables["_tmpForgeTime"].Visible = false + end +end + function MainWindow:OnOpenWindow() UIWindow.OnOpenWindow(self) @@ -57,22 +110,73 @@ function MainWindow:OnOpenWindow() local attributeUpgradeCon = self.Variables["_btnMainAttributeUpgrade"].Activated:Connect(function() self.UIManager:OpenWindow("AttributeLvupWindow") end) - + local challengeBossCon = self.Variables["_btnChallengeBoss"].Activated:Connect(function() + self:OnClickChallengeBoss() + end) + table.insert(self.Connections, createCon) table.insert(self.Connections, chaCon) table.insert(self.Connections, attributeUpgradeCon) + table.insert(self.Connections, challengeBossCon) -- TODO: 暂时用主关卡数显示,我记得之前这里主要是记录的,Challenge中才是正在挑战的内容 -- TODO: 之后LevelProxy也应该挪到ReplicatedStorage下,之前可能是因为觉得Challenge是临时的内容所以放在workspace下,但是逻辑做的不统一 local playerDataFolder = game.Workspace:WaitForChild("Level"):WaitForChild(LocalPlayer.UserId) - local StatsFolder = playerDataFolder:WaitForChild("Progress") - local levelCon = StatsFolder.Main.Changed:Connect(function(newValue) + local StatsFolder = playerDataFolder:WaitForChild("Challenge") + local ProgressFolder = playerDataFolder:WaitForChild("Progress") + + local levelCon = StatsFolder.LevelId.Changed:Connect(function(newValue) self:SetShowLevel(newValue) + self:SetShowBossChallenge(ProgressFolder.BossFail.Value) + end) + local bossChallengeCon = ProgressFolder.BossFail.Changed:Connect(function(newValue) + self:SetShowBossChallenge(newValue) end) -- 初始值设置 - self:SetShowLevel(StatsFolder.Main.Value) + self:SetShowLevel(StatsFolder.LevelId.Value) + self:SetShowBossChallenge(ProgressFolder.BossFail.Value) + table.insert(self.Connections, levelCon) + table.insert(self.Connections, bossChallengeCon) + + + -- 货币进度条显示 + local rePlayerDataFolder = Utils:GetPlayerDataFolder(LocalPlayer) + local playerInfoFolder = rePlayerDataFolder:WaitForChild("PlayerInfo") + local forgeInstance = playerInfoFolder:WaitForChild("Stats"):WaitForChild("forge") + + local itemFolder = playerInfoFolder:WaitForChild("Items") + local hasItem = playerInfoFolder:FindFirstChild("2") + + -- 设置锻造货币变动链接 + local function SetForgeCostChange() + local costChangeCon = hasItem.Changed:Connect(function(newValue) + self:SetShowForgeBar(forgeInstance.Value, newValue) + end) + table.insert(self.Connections, costChangeCon) + end + + if hasItem then + -- 后续变动设置 + SetForgeCostChange() + -- 初始化设置 + self:SetShowForgeBar(forgeInstance.Value, hasItem.Value) + else + -- 没有货币时监听设置 + local addCon + addCon = itemFolder.ChildAdded:Connect(function(child) + if child.Name == "2" then + self:SetShowForgeBar(forgeInstance.Value, child.Value) + addCon:Disconnect() + addCon = nil + + SetForgeCostChange() + end + end) + table.insert(self.Connections, addCon) + end + end