This commit is contained in:
gechangfu 2025-07-31 19:36:32 +08:00
parent 11ddf9fe1f
commit aa5baf00b5
8 changed files with 143 additions and 16 deletions

Binary file not shown.

Binary file not shown.

View File

@ -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"}
]

View File

@ -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 = {}
-- 清除玩家表现

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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