From ce9e4a3909efb9eb41d3954de089ef0db6690cc8 Mon Sep 17 00:00:00 2001 From: gechangfu Date: Thu, 4 Sep 2025 16:06:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excel/level.xlsx | Bin 11437 -> 11450 bytes src/ReplicatedStorage/Base/UIList.luau | 7 ++++ src/ServerStorage/Proxy/EquipmentProxy.luau | 2 +- .../ClientMain/DefaultUIClose.luau | 1 + .../UI/InstanceScripts/Money.client.luau | 13 ++++--- .../AttributeLvupShow.luau | 33 +++++++++++++++--- .../UI/Windows/AttributeLvupWindow/init.luau | 33 ++++++++++++++++++ .../UI/Windows/LevelStageWindow/init.luau | 32 +++++++++++++++++ .../UI/Windows/MainWindow/init.luau | 7 ++-- 9 files changed, 116 insertions(+), 12 deletions(-) diff --git a/excel/level.xlsx b/excel/level.xlsx index a22c35d83503b336c1bc72615a7be89325f5b845..a0abeac954f8e52d6a018bde9d620092d7287bc1 100644 GIT binary patch delta 1842 zcmV-22hI4cS-M%U*9Hkj)w!2e0{{SHli&s#f1@}QeP3z+1M)k?CO`;kI+_H~Mrub@ zC)>PKsvK~NRluwxIddi+YO41x6OD zGm-Q9X^Q?_rgn&|R?#}ArKs5yy|Na4y88XM%dL>lYayO30I1t3DwJv>$7!>IRkXbj ze+{c)WFurn6*T3O(>9XPye$}0Rq41G2TnzKje3Mgo`WGa8=kRPWL?E-)q_Y@QU&ze zf;a7eR%PeFRa8EAjh%_A0f;p(xq3CA$f~kv@l*>**Coi_5#QQL_yzDM7z%e-35HIV zs(2mu^pq-xdiGG3|Lf(a7cN&B9e~>&!vKOv%cwi-i53&jlSiupD;9o`~U@ha7 z2!i)PH2=WOMOT*_Ub6e%x)yDkFSOE`Dv?#vRwX%CET5t=G{u%3J3y7}npww77yG`^e{soR zPl2^SCX_Ub=(@e7s<1j)PEi~^$n|cKmu$soBkBjX%UJpF#**~Z|Np_1G}Ce&(A#tB z-+$H))MPXm?^a0*-WTyT1ph02fmA@k^Zia;K&;8=vCd>f9>2SxH}~);uwybOw&&x- z4v9auv6sxr*dHat3x9wZ8AO?&f1N7!S=P`~ zG1(lx%4nHsn?q$LP6&1sFZ>Y{r2d@$ly{o_ID+M!xNZ6W0#Ck!#Pr*iHO# z5+^fXCrV!d(f@G}8n;Ko-J)3*RH~(<*)!ZocWg7GEjX(e1bp9;o%!JmkAR|=lGOId z1lzM&;Msnhj{Gr+=ZT*lQpsxhn-3mCp<}*gRCTaV^%gblNSEop_t3fNJN9XMw+W-W zSjT<;^}kL03hGOC=H&GL%!%_aH_Mwd=Uykv$5m>K^p9#ClMP)O4>>~)ul@$JI|^6= z2}rQI7@r9M0E?5H3@(4;EU*v}R#jKfy;N1VA7|rCh(#Qywpl<`|ND*&gq1iHEdq~; z{XXxEJ()f1bwggjI%V2|@+74MT4_qvt_%9}$6_#{#Cg${qA@KL^Z<@N%s+mZ?Tp>H z8o(1Iw637F_g&7IlQn4J64OD8E0wWYc>HVE%ykw-8AZBbS(<;2nHH+0M?!9IVVJ5? z5+04*YH0ltVxbWp^LMrC+?l53EjTUgX4?&<(H$aIs!{$Bp_FKuKdoD1#j3%&_k1WM z*<1W(_`5sX#OGH|T1ji1seFQDcFg&@{3)90qFq~;FN^kT^X|p8=vq|8tmeRfE3cJ7x)ZK zQ_v+JV*me%E;!GZd=hL}@AGzk_FTlC$J9%x#J2I@&F*RosCDhpe3)b-JdDsyd3ksQ zC$Wt&gCq-FX&Qv!NVLM&5xuq8$GB6auM0X!Cikdcf%6L$c$CPk^G5$ZuE*2q^|&+Y zG4}e~)#H;I<4HZ5#_XLxgjWK+Z_MNVM8bF?@htg&9V{NlE3>Z-=@kU7k)Cd|oFpg# ze@nwK6ouaf|3k@po21)h3vCA~^TmPSMDZ;ow_UMGOA_t&?@imSb|^mHdrrQ4?j_0k zpsL^tj4f-OA{r4CfEKkZb&;Z%-6mY3z&frauWAh`I)X*(?D{GZ4HLD2CsQ|ITnRSt zByE{!QnYujVHjJn2gPmV9oma|Z4`IDe>4SdxcJ}&;FypbtiW-}9mgFoY(^qFA*C3R z&8Mk)fD{-iP@tW~G@|&&>%b`c=Yw9EI92J6jo;}McgmJx5J&gHmZPz4+o+xOF?@cC z-?op>{iole)WI#jV@=Gv_79+hZp3;32`k`ySJ$LmpTl z1D}Hpsn5#m?CyTIL0L@bA|y8L!E~ION>2n6_R*ImTXQL zp%da6koCDQ|3dZ+vjrz!0|`dextCT0003i?Y${F!ObP%1lV1uNlh`T{97wRb7@r9M z0E;&O02lxO00000000000001x43nV@8j~I?DgkAaNh?4B8k34EIss~v#VbJp=#vL5 gBLuFIo^F#aEEWNmlSM2(0T`2nEF%WyDF6Tf0EDo7asU7T delta 1856 zcmV-G2fz5bS*=;H*9HlK%_|Q}0{{S7li&s#f15BAeV?@dfc#Fu1W1BPrxAh{shz4W zYhEf<4miasU}j81HSNFe+T^2YrYUQO5*uG%4(IqDoAXaySr|`LG>lgv!e=%zXqEDe zRSzNhK2OXMG8##$j1;`0A$q0_`gHN}!}*$v$0g^F1^`q|h;k|Gz_OY&rzL65cugyq ze_3%+5(z``U^TU%Bx`a?Wm#B`ZTnV9ScQ6oK%9cXS1Xp%n5S(?E7^kxS`Z2Jo1E3n z7OhNAfh&o4Y-=;+WepHZRxtUjL6K3W!R(>pf-DP=-C@t@1pIvXV;dT0`zDw=dR56% z!5hAkX8>*Wq>uDt+rs!@3A*DoI1S0Qe*}GEs)jpO!ha(xe~0Do!La>qGz`|#UI}3F z-iYSyxH;(Je8mcS+gsNlb^Vo;s!|0q3ew1F#w5)`G=w2v(|rI`iMEbfR=}(?@*E#o z7dty&3j^Fwd#riRn#IQFDhWLCxsX&;MA8YbBv^1G>AiN-*pr-txs4n8qh*4^f1Uzs zflO#g8jxjkO=NDgq6kqO+=*p3%L=-nq~_Hf?NVCYy|5%X_WwValB7zm1$ui<{rzk0 zKurW&<6TQ(!2K+~gvI|xo}d&^@NBbFXRy|Ia9^b&!1q5#(GWW$cVK$S#5Ub%Ff=2_ zi%snN1MIlib-nQ~5F`8`<)oGQf2PU`Iz%p%^l0jeblVwh2QAC?G=AEf%T)cVW;^#w z30CLXEu-sZ?*}zBx&^B;z7COz9T4?=I9%(=1}_Y zP8?&~8LJH1$;(FS9?Zpn9d_-{LwoF+_H^Kx?r7|oP%OusxUn;1B-C z@uxi=Y`-XqWln^g3z9y0s*xH?dmx&C`EN{08a^ zdSY^Ndt&0`>(%_~#N5m2{C<&WBmGgWrK_P@?ICMh!;9YllaVA8vswy70uJ5~kkOq9 z004(K000;OlMyQ#lg11Wf0Hb*5D`{YSF~KJs@spVaVEsVj#Jxwsp^04*g#l`L(xWw z$B8}9J2Rflo(@`(9atw#Thc5^DS=j)O1A5g{`kHaOek@lw-r~Wg_0h@(Wm+QceA~* z8`l7Mf`rzUwDGa!pCA?#_ZYuxWaln4E$+c-Za3R*AdK!1v64#qV}w$oMX_AB#`2ZIybsxs z3v#e{=lDEaWa9T5B`t+D&eT3ZGCRe5oBotd85ce2HvhXY*^pV-$#8&IRQ|S*vQf{< zuds(V!p1!;l*<-de_56EPkO!vXtOY+*Wt4Em(FLgPrh1$%?Mw(#xr;c?UqqCpH&i1 zKV(cS)Fu6p6`w}Kun?VoO4z$sbK?2x1r!Jm7(hlz=-rhuo3L?-pVA-~Hv}XXUhd!{ zC{@yB_K5xeJF0{^O0Ztz_57l@i2aUXS5Wh<^54w^+*s=$$`?-vPDnj05Wz<3M{RWqI=dJXkEpKeN0J=@kTIs>0>7sU#=? ze@}xj6oubS{12q>tQ6cb8(@i=`J#!57>#dDdtpRcnzqXJ?=7$)i^j)$&*^v1y=l7H z%O>~&W9wFBh%6!$fa0yFRh6NaVjHeeU>#F}HLZdS9l)YZetD5{O?hkJ$+Q}btHB1I zq%7q+Lp$d*#n|#4NM;w_p}bhOMl$D1e^X)2_y?;1$5FJx5*!oEG28<~JrU6nDfooc zpQafAf@5evf^rs<1;IaF2S(aI9}LRODQkDoey3yHIa}~ioZNd`PsXn67F{yL@c9XT zdwh5vRt;;_---juQ^6@Wz+7wcikB&#)&1=nX5FJdb6JD9Ipn+y?o<4`?=eH_Ly-j{ z@Hyz1`lP%jw|B)B<#9xoVYCXPWkJ@IT+`(0y&rq_zRxu_0||o7D-TNp003E&c`8l;L6gWTEgRktkkOq9004(K z000;O000000000000000g_95~MFLnBlYtf$lWZ$00S%LvD>?yPlhP|e0o#)lEF&9a us>0<;0RRA40ssIJ0000000000000000E&}REIt7XlaVYV2H7b90000iXm-&6 diff --git a/src/ReplicatedStorage/Base/UIList.luau b/src/ReplicatedStorage/Base/UIList.luau index 5aa9c5a..1330a75 100644 --- a/src/ReplicatedStorage/Base/UIList.luau +++ b/src/ReplicatedStorage/Base/UIList.luau @@ -142,6 +142,13 @@ function UIList:SetSingleInstance(index: number, data: table) uiInstance.Visible = true end +-- 所有子节点执行自身函数 +function UIList:ExecuteAllInstanceFunction(functionName: string, ...) + for _, ui in pairs(self.Instances) do + if ui[functionName] then ui[functionName](ui, ...) end + end +end + function UIList:GetMinLayoutOrderInstance() local minOrder = math.huge local minInstance = nil diff --git a/src/ServerStorage/Proxy/EquipmentProxy.luau b/src/ServerStorage/Proxy/EquipmentProxy.luau index 504ecc7..4c42f03 100644 --- a/src/ServerStorage/Proxy/EquipmentProxy.luau +++ b/src/ServerStorage/Proxy/EquipmentProxy.luau @@ -476,7 +476,7 @@ function EquipmentProxy:AutoRecycleEquipment(Player: Player) end for _, EquipmentData in EquipmentData do - if EquipmentData.quality < highestQuality and EquipmentData.maxRuneNumber == 0 then + if EquipmentData.quality < highestQuality and EquipmentData.maxRuneNumber == 0 and tonumber(EquipmentData.wearing) == 0 then self:RecycleEquipment(Player, EquipmentData.id) end end diff --git a/src/StarterPlayerScripts/ClientMain/DefaultUIClose.luau b/src/StarterPlayerScripts/ClientMain/DefaultUIClose.luau index aa43f22..6b5ce5f 100644 --- a/src/StarterPlayerScripts/ClientMain/DefaultUIClose.luau +++ b/src/StarterPlayerScripts/ClientMain/DefaultUIClose.luau @@ -2,5 +2,6 @@ local StarterGui = game:GetService("StarterGui") -- Disable default health bar and backpack StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false) +StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.PlayerList, false) return {} \ No newline at end of file diff --git a/src/StarterPlayerScripts/UI/InstanceScripts/Money.client.luau b/src/StarterPlayerScripts/UI/InstanceScripts/Money.client.luau index 77fc543..09a7744 100644 --- a/src/StarterPlayerScripts/UI/InstanceScripts/Money.client.luau +++ b/src/StarterPlayerScripts/UI/InstanceScripts/Money.client.luau @@ -35,6 +35,13 @@ local InstanceMoney = MoneyFolder:FindFirstChild(CheckMoneyId) local ItemData = Utils:GetIdDataFromJson(JsonItemProp, tonumber(CheckMoneyId)) imgIcon.Image = Localization:GetImageData(ItemData.iconId) +local function SetMoneyChange() + tmpValue.Text = InstanceMoney.Value + connection = InstanceMoney.Changed:Connect(function(newValue) + tmpValue.Text = newValue + end) +end + if not InstanceMoney then tmpValue.Text = "0" connectionFolder = MoneyFolder.ChildAdded:Connect(function(child) @@ -42,13 +49,11 @@ if not InstanceMoney then tmpValue.Text = child.Value InstanceMoney = child connectionFolder:Disconnect() + SetMoneyChange() end end) else - tmpValue.Text = InstanceMoney.Value - connection = InstanceMoney.Changed:Connect(function(newValue) - tmpValue.Text = newValue - end) + SetMoneyChange() end script.Destroying:Once(function() diff --git a/src/StarterPlayerScripts/UI/Windows/AttributeLvupWindow/AttributeLvupShow.luau b/src/StarterPlayerScripts/UI/Windows/AttributeLvupWindow/AttributeLvupShow.luau index 36673cb..150f4bf 100644 --- a/src/StarterPlayerScripts/UI/Windows/AttributeLvupWindow/AttributeLvupShow.luau +++ b/src/StarterPlayerScripts/UI/Windows/AttributeLvupWindow/AttributeLvupShow.luau @@ -82,22 +82,25 @@ function AttributeLvupShow:Refresh() end end + local costValue = 0 -- 花费按钮显示 if self.Data.maxLv then - self.Variables._btnUpgrade.Text = nowLv >= self.Data.maxLv and "满级" or self.Data.cost[2] + self.Data.cost[3] * (self.Data.maxLv - 1) + costValue = self.Data.cost[2] + self.Data.cost[3] * (self.Data.maxLv - 1) + self.Variables._btnUpgrade.Text = nowLv >= self.Data.maxLv and "满级" or costValue -- 满级不让点击 if nowLv >= self.Data.maxLv then self.Variables._btnUpgrade.Interactable = false end -- 属性值显示 - local caculateValue = self.Data.lvAdd[1] + self.Data.lvAdd[2] * (self.Data.maxLv - 1) + local attributeValue = self.Data.lvAdd[1] + self.Data.lvAdd[2] * (self.Data.maxLv - 1) if attributeData.type == 1 then - self.Variables._tmpValue.Text = "+"..caculateValue + self.Variables._tmpValue.Text = "+"..attributeValue else - self.Variables._tmpValue.Text = "+"..string.format("%.2f%%", caculateValue / 100) + self.Variables._tmpValue.Text = "+"..string.format("%.2f%%", attributeValue / 100) end else - self.Variables._btnUpgrade.Text = self.Data.cost[2] + self.Data.cost[3] * nowLv + costValue = self.Data.cost[2] + self.Data.cost[3] * nowLv + self.Variables._btnUpgrade.Text = costValue -- 属性值显示(下一级) if self.Data.id == 1 or self.Data.id == 2 then self.Variables._tmpValue.Text = "+"..math.floor(self.Data.lvAdd[1] * ((self.Data.lvAdd[2] / 10000) ^ nowLv)) @@ -115,6 +118,25 @@ function AttributeLvupShow:Refresh() end self.Variables._tmpBattleValueRequire.Text = Localization:FormatString(Localization:GetLanguageData(1021), limitBattleValue) + + self:CheckShowRed() +end + +function AttributeLvupShow:CheckShowRed() + local nowLv = self:GetNowLv() + if self.Data.maxLv then + costValue = self.Data.cost[2] + self.Data.cost[3] * (self.Data.maxLv - 1) + else + costValue = self.Data.cost[2] + self.Data.cost[3] * nowLv + end + + local ItemsFolder = Utils:GetPlayerDataFolder(LocalPlayer):FindFirstChild("PlayerInfo"):FindFirstChild("Items") + local nowMoney = ItemsFolder:FindFirstChild(1) and ItemsFolder:FindFirstChild(1).Value or 0 + if nowMoney < costValue then + self.Variables._tmpRed.Visible = false + else + self.Variables._tmpRed.Visible = true + end end function AttributeLvupShow:OnInitFinish() @@ -130,6 +152,7 @@ function AttributeLvupShow:OnInitFinish() -- TODO: 检查货币是否充足 RE_UpgradeAttributes:FireServer(self.Data.id) end + self.TopUI:UpdateRed() self.TopUI:UpdateBattleValue() self:Refresh() end) diff --git a/src/StarterPlayerScripts/UI/Windows/AttributeLvupWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/AttributeLvupWindow/init.luau index 3f86502..81a27e2 100644 --- a/src/StarterPlayerScripts/UI/Windows/AttributeLvupWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/AttributeLvupWindow/init.luau @@ -51,6 +51,11 @@ function AttributeLvupWindow:UpdateBattleValue() self.Variables["_tmpBattleValue"].Text = Localization:FormatString(Localization:GetLanguageData(1020), BattleUtils:GetPlayerBattleValue(LocalPlayer)) end +function AttributeLvupWindow:UpdateRed() + self.Variables["__listSpecialAttributes"]:ExecuteAllInstanceFunction("CheckShowRed") + self.Variables["__listBaseAttributes"]:ExecuteAllInstanceFunction("CheckShowRed") +end + function AttributeLvupWindow:OnOpenWindow() UIWindow.OnOpenWindow(self) @@ -85,6 +90,34 @@ function AttributeLvupWindow:OnOpenWindow() end) -- table.insert(self.Connections, bgCloseCon) table.insert(self.Connections, closeCon) + + + -- 金币变化监听 + local MoneyFolder = Utils:GetPlayerDataFolder(LocalPlayer):FindFirstChild("PlayerInfo"):FindFirstChild("Items") + local InstanceMoney = MoneyFolder:FindFirstChild(1) + + local function SetMoneyChange() + local con = InstanceMoney.Changed:Connect(function(newValue) + self:UpdateRed() + end) + table.insert(self.Connections, con) + end + + if InstanceMoney then + SetMoneyChange() + else + local addCon + addCon = MoneyFolder.ChildAdded:Connect(function(child) + if child.Name == "1" then + InstanceMoney = child + addCon:Disconnect() + addCon = nil + SetMoneyChange() + self:UpdateRed() + end + end) + table.insert(self.Connections, addCon) + end end diff --git a/src/StarterPlayerScripts/UI/Windows/LevelStageWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/LevelStageWindow/init.luau index 4b61188..236299f 100644 --- a/src/StarterPlayerScripts/UI/Windows/LevelStageWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/LevelStageWindow/init.luau @@ -8,9 +8,12 @@ local Signal = require(ReplicatedStorage.Tools.Signal) --> Json local JsonLevel = require(ReplicatedStorage.Json.Level) +local JsonEnemy = require(ReplicatedStorage.Json.Enemy) +local JsonAttributes = require(ReplicatedStorage.Json.Attributes) local JsonForge = require(ReplicatedStorage.Json.Forge) local Utils = require(ReplicatedStorage.Tools.Utils) +local BattleUtils = require(ReplicatedStorage.Tools.BattleUtils) --> Events local RE_ChallengeBoss = ReplicatedStorage.Events.RE_ChallengeBoss @@ -35,6 +38,8 @@ function LevelStageWindow:Init(UIManager: table, Data: table?) ["_tmpNowLevel"] = 0, ["_imgBoss"] = 0, ["_btnChallengeBoss"] = 0, + + ["_tmpLevelBattleValue"] = 0, } self.UIRootName = "ui_w_level_stage" self.UIParentName = UIEnums.UIParent.UIRoot @@ -51,6 +56,33 @@ function LevelStageWindow:SetShowLevel(level: number) else self.Variables["_imgBoss"].Visible = false end + + local attackTransData = Utils:GetSpecialKeyDataFromJson(JsonAttributes, "effectAttribute", "attack").battleValue + local hpTransData = Utils:GetSpecialKeyDataFromJson(JsonAttributes, "effectAttribute", "hp").battleValue + + -- 战斗力显示 + local playerBattleValue = BattleUtils:GetPlayerBattleValue(LocalPlayer) + -- 计算关卡怪物战力 + local JsonLevelData = Utils:GetIdDataFromJson(JsonLevel, level) + local enemyBattleValue = 0 + local maxAttackBattleValue = 0 + for _, enemyWaveInfo in ipairs(JsonLevelData.wave) do + local JsonEnemyData = Utils:GetIdDataFromJson(JsonEnemy, enemyWaveInfo[2]) + local hpBattleValue = math.floor(JsonEnemyData.hp *( JsonLevelData.hpBonus / 100) / hpTransData[1] * hpTransData[2]) * enemyWaveInfo[3] + local attackBattleValue = math.floor(JsonEnemyData.attack *( JsonLevelData.atkBonus / 100) / attackTransData[1] * attackTransData[2]) + enemyBattleValue += hpBattleValue + if attackBattleValue > maxAttackBattleValue then + enemyBattleValue += (attackBattleValue - maxAttackBattleValue) + maxAttackBattleValue = attackBattleValue + end + end + + if playerBattleValue < enemyBattleValue then + self.Variables["_tmpLevelBattleValue"].TextColor3 = Color3.fromRGB(255, 55, 55) + else + self.Variables["_tmpLevelBattleValue"].TextColor3 = Color3.fromRGB(255, 255, 255) + end + self.Variables["_tmpLevelBattleValue"].Text = enemyBattleValue end -- 设置boss挑战按钮显示 diff --git a/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau index 2ef428a..1fec47d 100644 --- a/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau @@ -172,9 +172,10 @@ function MainWindow:SetShowAttributeUpgradeRed() self:CheckShowAttributeUpgradeRed(newValue) end) table.insert(self.Connections, con) - -- 初始化显示设置 - self:CheckShowAttributeUpgradeRed(InstanceMoney.Value) end + + -- 初始化显示设置 + self:CheckShowAttributeUpgradeRed(InstanceMoney and InstanceMoney.Value or 0) end function MainWindow:OnOpenWindow() @@ -254,6 +255,8 @@ function MainWindow:OnOpenWindow() -- 初始化设置 self:SetShowForgeBar(forgeInstance.Value, 0) end + + self:SetShowAttributeUpgradeRed() end return MainWindow \ No newline at end of file