From e80640ecc24e7bacb991ceb92dd5dd41327a5715 Mon Sep 17 00:00:00 2001 From: gechangfu Date: Mon, 25 Aug 2025 15:43:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=89=8D=E7=AB=AF=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excel/Rune.xlsx | Bin 14753 -> 14764 bytes excel/language.xlsx | Bin 25029 -> 27419 bytes src/ReplicatedStorage/Base/UIList.luau | 16 ++++-- .../Json/Language_En_US.json | 54 +++++++++++++++++- .../Json/Language_Zh_CN.json | 54 +++++++++++++++++- src/ReplicatedStorage/Json/Rune.json | 20 +++---- src/ReplicatedStorage/Tools/Utils.luau | 2 +- src/ServerStorage/Proxy/HelpProxy.luau | 18 +++--- src/ServerStorage/Proxy/RuneProxy/init.luau | 14 ++--- .../ClientMain/Helper.luau | 14 +++-- .../UI/Common/RuneShow.luau | 7 +++ .../UI/Windows/ChaWindow/PackageShow.luau | 1 + .../RecycleWindow/RecyclePackageShow.luau | 12 ++++ .../UI/Windows/RecycleWindow/init.luau | 8 +++ .../UI/Windows/RuneWindow/PackageShow.luau | 7 +++ .../UI/Windows/RuneWindow/init.luau | 35 ++++++++++-- .../SelectEquipmentWindow/PackageShow.luau | 6 ++ .../Windows/SelectEquipmentWindow/init.luau | 1 - 18 files changed, 223 insertions(+), 46 deletions(-) diff --git a/excel/Rune.xlsx b/excel/Rune.xlsx index 70236d806590376d6d119d7792c9f4e05432dff1..3b325ebca26b46789baf417ce2f7f744a2021324 100644 GIT binary patch delta 6799 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 Z5Yc}@dlN-OBvBL-pNl-eBojg|{ST9RiZ=iN delta 6789 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 diff --git a/excel/language.xlsx b/excel/language.xlsx index 593768c686e8de346653575f53fac530826ea220..d5b1da5dc3dddd46510e249d28af051954e988a8 100644 GIT binary patch delta 12413 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 JWM*$M{|Dp}zWRaws#4^6AR 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 XF#TU4AQJgZNfTjhFyKb@{vrH7dp_;> diff --git a/src/ReplicatedStorage/Base/UIList.luau b/src/ReplicatedStorage/Base/UIList.luau index bac759e..5aa9c5a 100644 --- a/src/ReplicatedStorage/Base/UIList.luau +++ b/src/ReplicatedStorage/Base/UIList.luau @@ -101,11 +101,19 @@ end function UIList:SetLayoutOrder(keyName: string, reverse: boolean?) self.LayoutOrderKey = keyName if reverse then self.reverse = true else self.reverse = false end + self:ApplyLayoutOrder() +end + +function UIList:ApplyLayoutOrder() + if not self.LayoutOrderKey then return end + for _, ui in pairs(self.Instances) do - if self.reverse then - ui.UIRoot.LayoutOrder = 1000 - tonumber(ui.Data[keyName]) - else - ui.UIRoot.LayoutOrder = tonumber(ui.Data[keyName]) + if ui.Data and ui.Data[self.LayoutOrderKey] then + if self.reverse then + ui.UIRoot.LayoutOrder = 1000 - tonumber(ui.Data[self.LayoutOrderKey]) + else + ui.UIRoot.LayoutOrder = tonumber(ui.Data[self.LayoutOrderKey]) + end end end end diff --git a/src/ReplicatedStorage/Json/Language_En_US.json b/src/ReplicatedStorage/Json/Language_En_US.json index 64793e2..cdc948c 100644 --- a/src/ReplicatedStorage/Json/Language_En_US.json +++ b/src/ReplicatedStorage/Json/Language_En_US.json @@ -65,6 +65,56 @@ {"id":40014,"text":"测试装备15"}, {"id":40015,"text":"测试装备16"}, {"id":60000,"text":"火焰伤害符文"}, -{"id":61000,"text":"冰棺符文"}, -{"id":62000,"text":"测试符文"} +{"id":60001,"text":"冰冻伤害符文"}, +{"id":60002,"text":"雷电伤害符文"}, +{"id":60003,"text":"暗影伤害符文"}, +{"id":60004,"text":"紫色符文"}, +{"id":60005,"text":"匕首符文"}, +{"id":60006,"text":"单手剑符文"}, +{"id":60007,"text":"长枪符文"}, +{"id":60008,"text":"双手剑符文"}, +{"id":60009,"text":"火焰暴伤符文"}, +{"id":60010,"text":"寒冰暴伤符文"}, +{"id":60011,"text":"雷电暴伤符文"}, +{"id":60012,"text":"暗影爆伤符文"}, +{"id":60013,"text":"空槽位符文"}, +{"id":60014,"text":"穿戴槽位符文"}, +{"id":60015,"text":"混合符文"}, +{"id":60016,"text":"爆发符文"}, +{"id":60017,"text":"回收符文"}, +{"id":60018,"text":"词条符文"}, +{"id":60019,"text":"挑战boss符文"}, +{"id":60020,"text":"防御boss符文"}, +{"id":60021,"text":"重量打击符文"}, +{"id":60022,"text":"快攻符文"}, +{"id":60023,"text":"雷暴符文"}, +{"id":60024,"text":"元素快攻符文"}, +{"id":61000,"text":"连电符文"}, +{"id":61001,"text":"金色符文"}, +{"id":61002,"text":"朴实符文"}, +{"id":61003,"text":"万能符文"}, +{"id":61004,"text":"物理暴击符文"}, +{"id":61005,"text":"单槽位符文"}, +{"id":61006,"text":"牺牲符文"}, +{"id":61007,"text":"物理符文"}, +{"id":61008,"text":"爆金币符文"}, +{"id":61009,"text":"禁魔符文"}, +{"id":61010,"text":"首位元素符文"}, +{"id":61011,"text":"末位元素符文"}, +{"id":61012,"text":"冰霜攻击符文"}, +{"id":61013,"text":"吸血符文"}, +{"id":61014,"text":"掠夺铁矿符文"}, +{"id":61015,"text":"主动技能符文"}, +{"id":61016,"text":"被动技能符文"}, +{"id":61017,"text":"左侧复制符文"}, +{"id":61018,"text":"右侧复制符文"}, +{"id":61019,"text":"全部主动符文"}, +{"id":61020,"text":"攻击符文"}, +{"id":61021,"text":"血量符文"}, +{"id":61022,"text":"冰棺符文"}, +{"id":61023,"text":"损血符文"}, +{"id":61024,"text":"会心治疗符文"}, +{"id":61025,"text":"暴击翻倍符文"}, +{"id":61026,"text":"一板一眼符文"}, +{"id":62000,"text":"测试符文3"} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/Language_Zh_CN.json b/src/ReplicatedStorage/Json/Language_Zh_CN.json index 64793e2..cdc948c 100644 --- a/src/ReplicatedStorage/Json/Language_Zh_CN.json +++ b/src/ReplicatedStorage/Json/Language_Zh_CN.json @@ -65,6 +65,56 @@ {"id":40014,"text":"测试装备15"}, {"id":40015,"text":"测试装备16"}, {"id":60000,"text":"火焰伤害符文"}, -{"id":61000,"text":"冰棺符文"}, -{"id":62000,"text":"测试符文"} +{"id":60001,"text":"冰冻伤害符文"}, +{"id":60002,"text":"雷电伤害符文"}, +{"id":60003,"text":"暗影伤害符文"}, +{"id":60004,"text":"紫色符文"}, +{"id":60005,"text":"匕首符文"}, +{"id":60006,"text":"单手剑符文"}, +{"id":60007,"text":"长枪符文"}, +{"id":60008,"text":"双手剑符文"}, +{"id":60009,"text":"火焰暴伤符文"}, +{"id":60010,"text":"寒冰暴伤符文"}, +{"id":60011,"text":"雷电暴伤符文"}, +{"id":60012,"text":"暗影爆伤符文"}, +{"id":60013,"text":"空槽位符文"}, +{"id":60014,"text":"穿戴槽位符文"}, +{"id":60015,"text":"混合符文"}, +{"id":60016,"text":"爆发符文"}, +{"id":60017,"text":"回收符文"}, +{"id":60018,"text":"词条符文"}, +{"id":60019,"text":"挑战boss符文"}, +{"id":60020,"text":"防御boss符文"}, +{"id":60021,"text":"重量打击符文"}, +{"id":60022,"text":"快攻符文"}, +{"id":60023,"text":"雷暴符文"}, +{"id":60024,"text":"元素快攻符文"}, +{"id":61000,"text":"连电符文"}, +{"id":61001,"text":"金色符文"}, +{"id":61002,"text":"朴实符文"}, +{"id":61003,"text":"万能符文"}, +{"id":61004,"text":"物理暴击符文"}, +{"id":61005,"text":"单槽位符文"}, +{"id":61006,"text":"牺牲符文"}, +{"id":61007,"text":"物理符文"}, +{"id":61008,"text":"爆金币符文"}, +{"id":61009,"text":"禁魔符文"}, +{"id":61010,"text":"首位元素符文"}, +{"id":61011,"text":"末位元素符文"}, +{"id":61012,"text":"冰霜攻击符文"}, +{"id":61013,"text":"吸血符文"}, +{"id":61014,"text":"掠夺铁矿符文"}, +{"id":61015,"text":"主动技能符文"}, +{"id":61016,"text":"被动技能符文"}, +{"id":61017,"text":"左侧复制符文"}, +{"id":61018,"text":"右侧复制符文"}, +{"id":61019,"text":"全部主动符文"}, +{"id":61020,"text":"攻击符文"}, +{"id":61021,"text":"血量符文"}, +{"id":61022,"text":"冰棺符文"}, +{"id":61023,"text":"损血符文"}, +{"id":61024,"text":"会心治疗符文"}, +{"id":61025,"text":"暴击翻倍符文"}, +{"id":61026,"text":"一板一眼符文"}, +{"id":62000,"text":"测试符文3"} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/Rune.json b/src/ReplicatedStorage/Json/Rune.json index 5dd1789..5817767 100644 --- a/src/ReplicatedStorage/Json/Rune.json +++ b/src/ReplicatedStorage/Json/Rune.json @@ -41,15 +41,15 @@ {"id":61014,"quality":2,"type":null,"icon":1,"nameId":61014,"runeName":"RuneIronBonus","behaviorName":null,"recycle":[],"isInPool":1}, {"id":61015,"quality":2,"type":null,"icon":1,"nameId":61015,"runeName":"RuneActiveAbilityAttackRate","behaviorName":null,"recycle":[],"isInPool":1}, {"id":61016,"quality":2,"type":null,"icon":1,"nameId":61016,"runeName":"RunePassiveAbilityAttackRate","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61017,"quality":2,"type":null,"icon":1,"nameId":61018,"runeName":"RuneLeftTrigger","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61018,"quality":2,"type":null,"icon":1,"nameId":61019,"runeName":"RuneRightTrigger","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61019,"quality":2,"type":null,"icon":1,"nameId":61020,"runeName":"RuneAllActiveAbility","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61020,"quality":2,"type":null,"icon":1,"nameId":61021,"runeName":"RuneAttack","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61021,"quality":2,"type":null,"icon":1,"nameId":61022,"runeName":"RuneHp","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61022,"quality":2,"type":null,"icon":1,"nameId":61023,"runeName":"RuneIceCoffin","behaviorName":"IceCoffine","recycle":[],"isInPool":1}, -{"id":61023,"quality":2,"type":null,"icon":1,"nameId":61024,"runeName":"RuneFirstHpDamage","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61024,"quality":2,"type":null,"icon":1,"nameId":61025,"runeName":"RuneHealCrit","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61025,"quality":2,"type":null,"icon":1,"nameId":61026,"runeName":"RuneCritRateDouble","behaviorName":null,"recycle":[],"isInPool":1}, -{"id":61026,"quality":2,"type":null,"icon":1,"nameId":61027,"runeName":"RuneAtkSpeedToAtkRate","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61017,"quality":2,"type":null,"icon":1,"nameId":61017,"runeName":"RuneLeftTrigger","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61018,"quality":2,"type":null,"icon":1,"nameId":61018,"runeName":"RuneRightTrigger","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61019,"quality":2,"type":null,"icon":1,"nameId":61019,"runeName":"RuneAllActiveAbility","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61020,"quality":2,"type":null,"icon":1,"nameId":61020,"runeName":"RuneAttack","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61021,"quality":2,"type":null,"icon":1,"nameId":61021,"runeName":"RuneHp","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61022,"quality":2,"type":null,"icon":1,"nameId":61022,"runeName":"RuneIceCoffin","behaviorName":"IceCoffine","recycle":[],"isInPool":1}, +{"id":61023,"quality":2,"type":null,"icon":1,"nameId":61023,"runeName":"RuneFirstHpDamage","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61024,"quality":2,"type":null,"icon":1,"nameId":61024,"runeName":"RuneHealCrit","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61025,"quality":2,"type":null,"icon":1,"nameId":61025,"runeName":"RuneCritRateDouble","behaviorName":null,"recycle":[],"isInPool":1}, +{"id":61026,"quality":2,"type":null,"icon":1,"nameId":61026,"runeName":"RuneAtkSpeedToAtkRate","behaviorName":null,"recycle":[],"isInPool":1}, {"id":62000,"quality":3,"type":1,"icon":1,"nameId":62000,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Tools/Utils.luau b/src/ReplicatedStorage/Tools/Utils.luau index 581e640..3a1a37e 100644 --- a/src/ReplicatedStorage/Tools/Utils.luau +++ b/src/ReplicatedStorage/Tools/Utils.luau @@ -355,7 +355,7 @@ function Utils:GetWearingRuneData(equipmentUniqueId) } for k, v in pairs(runeInstance:GetAttributes()) do runeInfo[k] = v end - table.insert(runeData, runeInfo) + -- 只使用索引赋值,避免重复添加 runeData[runeInstance:GetAttribute("wearingSlot")] = runeInfo end end diff --git a/src/ServerStorage/Proxy/HelpProxy.luau b/src/ServerStorage/Proxy/HelpProxy.luau index 59b67b3..09bab38 100644 --- a/src/ServerStorage/Proxy/HelpProxy.luau +++ b/src/ServerStorage/Proxy/HelpProxy.luau @@ -20,13 +20,15 @@ function HelpProxy:CleanPlayerData(Player: Player) ArchiveProxy:CleanPlayerData(Player) end -RE_PlayerHelper.OnServerEvent:Connect(function(Player: Player, EventName: string, EventData: any) - if EventName == "CleanPlayerData" then - HelpProxy:CleanPlayerData(Player) - elseif EventName == "AddItem" then - ItemProxy:AddItem(Player, EventData[1], EventData[2]) - print("添加物品成功", EventData) - end -end) +if game:GetService("RunService"):IsStudio() then + RE_PlayerHelper.OnServerEvent:Connect(function(Player: Player, EventName: string, EventData: any) + if EventName == "CleanPlayerData" then + HelpProxy:CleanPlayerData(Player) + elseif EventName == "AddItem" then + ItemProxy:AddItem(Player, EventData[1], EventData[2]) + print("添加物品成功", EventData) + end + end) +end return HelpProxy \ No newline at end of file diff --git a/src/ServerStorage/Proxy/RuneProxy/init.luau b/src/ServerStorage/Proxy/RuneProxy/init.luau index a7b2302..781e0ee 100644 --- a/src/ServerStorage/Proxy/RuneProxy/init.luau +++ b/src/ServerStorage/Proxy/RuneProxy/init.luau @@ -167,7 +167,12 @@ function RuneProxy:WearRune(Player: Player, RuneUniqueId: number, EquipmentUniqu -- 获取装备数据 local EquipmentProxy = require(ServerStorage.Proxy.EquipmentProxy) local EquipmentData = EquipmentProxy:GetEquipmentData(Player, EquipmentUniqueId) - print(EquipmentData, EquipmentUniqueId) + + -- 检查装备是否有符文槽位 + if EquipmentData.maxRuneNumber <= 0 then + RE_PlayerTip:FireClient(Player, "装备没有符文槽位") + return + end -- 遍历符文查看现在穿了几个 local wearingCount = 0 @@ -179,14 +184,7 @@ function RuneProxy:WearRune(Player: Player, RuneUniqueId: number, EquipmentUniqu end end - -- 检查装备是否有符文槽位 - if EquipmentData.maxRuneNumber <= 0 then - RE_PlayerTip:FireClient(Player, "装备没有符文槽位") - return - end - -- 检查槽位数量是否充足 - print(wearingCount, EquipmentData.maxRuneNumber) if wearingCount >= EquipmentData.maxRuneNumber then RE_PlayerTip:FireClient(Player, "装备已满符文槽位") return diff --git a/src/StarterPlayerScripts/ClientMain/Helper.luau b/src/StarterPlayerScripts/ClientMain/Helper.luau index 0812cca..82ca310 100644 --- a/src/StarterPlayerScripts/ClientMain/Helper.luau +++ b/src/StarterPlayerScripts/ClientMain/Helper.luau @@ -7,6 +7,9 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") local RE_PlayerHelper = ReplicatedStorage.Events.RE_PlayerHelper local RE_UpgradeAttributes = ReplicatedStorage.Events.RE_UpgradeAttributes +--> Json +local JsonRune = require(ReplicatedStorage.Json.Rune) + local UserInputService = game:GetService("UserInputService") UserInputService.InputBegan:Connect(function(input, gameProcessed) @@ -22,11 +25,14 @@ UserInputService.InputBegan:Connect(function(input, gameProcessed) elseif input.KeyCode == Enum.KeyCode.K then -- RE_UpgradeAttributes:FireServer(1) RE_PlayerHelper:FireServer("AddItem", {2, 1000}) - RE_PlayerHelper:FireServer("AddItem", {60000, 1}) - RE_PlayerHelper:FireServer("AddItem", {61000, 1}) - RE_PlayerHelper:FireServer("AddItem", {62000, 1}) + -- RE_PlayerHelper:FireServer("AddItem", {60000, 1}) + -- RE_PlayerHelper:FireServer("AddItem", {61000, 1}) + -- RE_PlayerHelper:FireServer("AddItem", {62000, 1}) elseif input.KeyCode == Enum.KeyCode.L then - RE_UpgradeAttributes:FireServer(2) + -- RE_UpgradeAttributes:FireServer(2) + for k, v in JsonRune do + RE_PlayerHelper:FireServer("AddItem", {v.id, 1}) + end elseif input.KeyCode == Enum.KeyCode.M then RE_UpgradeAttributes:FireServer(3) elseif input.KeyCode == Enum.KeyCode.N then diff --git a/src/StarterPlayerScripts/UI/Common/RuneShow.luau b/src/StarterPlayerScripts/UI/Common/RuneShow.luau index 96bcc3d..3ffb8cd 100644 --- a/src/StarterPlayerScripts/UI/Common/RuneShow.luau +++ b/src/StarterPlayerScripts/UI/Common/RuneShow.luau @@ -69,6 +69,13 @@ function RuneShow:OnInitFinish() end function RuneShow:Destroy() + if self.Connections then + for _, con in pairs(self.Connections) do + if con and typeof(con) == "RBXScriptConnection" then + con:Disconnect() + end + end + end for k, v in pairs(self) do self[k] = nil end diff --git a/src/StarterPlayerScripts/UI/Windows/ChaWindow/PackageShow.luau b/src/StarterPlayerScripts/UI/Windows/ChaWindow/PackageShow.luau index 48069af..bce50d9 100644 --- a/src/StarterPlayerScripts/UI/Windows/ChaWindow/PackageShow.luau +++ b/src/StarterPlayerScripts/UI/Windows/ChaWindow/PackageShow.luau @@ -45,6 +45,7 @@ function PackageShow:Refresh() self.Variables["__listRuneWearing"]:AddComponent(RuneShow) local runeData = Utils:GetWearingRuneData(self.Data.id) + print("RuneData", runeData) self.Variables["__listRuneWearing"]:SetData(runeData) -- 模型展示 diff --git a/src/StarterPlayerScripts/UI/Windows/RecycleWindow/RecyclePackageShow.luau b/src/StarterPlayerScripts/UI/Windows/RecycleWindow/RecyclePackageShow.luau index 5c627fc..987bf0e 100644 --- a/src/StarterPlayerScripts/UI/Windows/RecycleWindow/RecyclePackageShow.luau +++ b/src/StarterPlayerScripts/UI/Windows/RecycleWindow/RecyclePackageShow.luau @@ -8,8 +8,15 @@ local Localization = require(ReplicatedStorage.Tools.Localization) local JsonEquipment = require(ReplicatedStorage.Json.Equipment) local JsonItemProp = require(ReplicatedStorage.Json.ItemProp) +--> Variables +local LocalPlayer = game.Players.LocalPlayer + local FolderEquipment = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments") +--> Components +local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common") +local RuneShow = require(CommonFolder:WaitForChild("RuneShow")) + function RecyclePackageShow:Init(data: table) local self = {} self.Data = data @@ -20,6 +27,7 @@ function RecyclePackageShow:Init(data: table) ["_tmpName"] = 0, ["_imgView"] = 0, ["_imgSelected"] = 0, + ["__listRuneWearing"] = 0, } self.Connections = {} @@ -49,6 +57,10 @@ function RecyclePackageShow:Refresh() viewportCamera.Parent = self.Variables["_imgView"] viewportCamera.CFrame = CFrame.new(Vector3.new(0, 0, 6), part.Handle.Position) self.ViewCamera = viewportCamera + + -- 符文展示 + self.Variables["__listRuneWearing"]:AddComponent(RuneShow) + self.Variables["__listRuneWearing"]:SetData(Utils:GetWearingRuneData(self.Data.id)) end function RecyclePackageShow:OnInitFinish() diff --git a/src/StarterPlayerScripts/UI/Windows/RecycleWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/RecycleWindow/init.luau index 32f5978..4ee49de 100644 --- a/src/StarterPlayerScripts/UI/Windows/RecycleWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/RecycleWindow/init.luau @@ -115,7 +115,15 @@ function RecycleWindow:OnOpenWindow() local con = self.Variables._btnRecycle.MouseButton1Click:Connect(function() self:Recycle() end) + -- local bgCloseCon = self.Variables["_btnBgClose"].Activated:Connect(function() + -- self.UIManager:CloseWindow(script.Name) + -- end) + local closeCon = self.Variables["_btnClose"].Activated:Connect(function() + self.UIManager:CloseWindow(script.Name) + end) table.insert(self.Connections, con) + -- table.insert(self.Connections, bgCloseCon) + table.insert(self.Connections, closeCon) end return RecycleWindow \ No newline at end of file diff --git a/src/StarterPlayerScripts/UI/Windows/RuneWindow/PackageShow.luau b/src/StarterPlayerScripts/UI/Windows/RuneWindow/PackageShow.luau index 7d27717..35654a1 100644 --- a/src/StarterPlayerScripts/UI/Windows/RuneWindow/PackageShow.luau +++ b/src/StarterPlayerScripts/UI/Windows/RuneWindow/PackageShow.luau @@ -60,6 +60,13 @@ function PackageShow:OnInitFinish() end function PackageShow:Destroy() + if self.Connections then + for _, con in pairs(self.Connections) do + if con and typeof(con) == "RBXScriptConnection" then + con:Disconnect() + end + end + end for k, v in pairs(self) do self[k] = nil end diff --git a/src/StarterPlayerScripts/UI/Windows/RuneWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/RuneWindow/init.luau index 308734b..92346d9 100644 --- a/src/StarterPlayerScripts/UI/Windows/RuneWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/RuneWindow/init.luau @@ -74,7 +74,7 @@ end function RuneWindow:ShowDetailData(uniqueId: number, orgId: number) if uniqueId then - if self.NowMaxRuneNumber == 0 then warn("当前最大符文数量为0") return end + if self.NowMaxRuneNumber == 0 then warn("当前最大符文数量为0", uniqueId, orgId) return end self.NowSelectRuneId = uniqueId local runeData = Utils:GetIdDataFromJson(JsonRune, orgId) self.Variables["_tmpNowRuneName"].Text = Localization:GetLanguageData(runeData.nameId) @@ -103,13 +103,17 @@ function RuneWindow:RefreshEquipmentName() end function RuneWindow:WearRefresh(data: table) - local newSlot = data.instance:GetAttribute("wearing") + local newSlot = data.instance:GetAttribute("wearingSlot") self.Variables["__listRuneWearing"]:RemoveData("slot"..newSlot) self.Variables["__listRunePackage"]:RemoveData(tostring(data.id)) -- 更新穿戴数据,要不再点击前端就不好使了 data.wearing = newSlot + data.wearingSlot = newSlot -- 确保wearingSlot字段正确设置 self.Variables["__listRuneWearing"]:AddData("slot"..newSlot, data) + + -- 重新应用布局顺序 + self.Variables["__listRuneWearing"]:ApplyLayoutOrder() -- 穿戴后,如果当前穿戴的符文是当前选中的符文,则刷新当前选中的符文为空 if data.id == self.NowSelectRuneId then self:ShowDetailData() end @@ -119,11 +123,15 @@ function RuneWindow:UnwearRefresh(data: table) local oldSlot = data.wearing self.Variables["__listRuneWearing"]:RemoveData("slot"..oldSlot) data.wearing = 0 + data.wearingSlot = 0 -- 重置wearingSlot字段 self.Variables["__listRunePackage"]:AddData(tostring(data.id), data) - self.Data.Wearing["slot"..oldSlot] = { - wearing = oldSlot, + self.Data.WearingRune["slot"..oldSlot] = { + wearingSlot = oldSlot, } - self.Variables["__listRuneWearing"]:AddData("slot"..oldSlot, self.Data.Wearing["slot"..oldSlot]) + self.Variables["__listRuneWearing"]:AddData("slot"..oldSlot, self.Data.WearingRune["slot"..oldSlot]) + + -- 重新应用布局顺序 + self.Variables["__listRuneWearing"]:ApplyLayoutOrder() end function RuneWindow:InlayRune() @@ -143,12 +151,24 @@ function RuneWindow:AddInstanceData(configInstance: Instance, Data: table?) parentName = "WearingRune" secondName = "slot"..attributes.wearingSlot end + + -- 如果是背包内,其他装备的符文,则不添加 + if parentName == "PackageRune" and attributes.wearingSlot > 0 then + return nil, nil + end + data[parentName][secondName] = {} for attributeKey, attributeValue in attributes do data[parentName][secondName][attributeKey] = attributeValue end data[parentName][secondName].instance = configInstance + + -- 确保wearingSlot字段正确设置 + if parentName == "WearingRune" then + data[parentName][secondName].wearingSlot = attributes.wearingSlot + end + return data[parentName][secondName], parentName end @@ -263,7 +283,10 @@ function RuneWindow:OnOpenWindow() local addCon = DataFolder.ChildAdded:Connect(function(child) local data, parentName = self:AddInstanceData(child, self.Data) if parentName == "WearingRune" then - self.Variables["__listRuneWearing"]:AddData("slot"..data.wearingSlot, data) + -- 确保wearingSlot字段存在 + if data and data.wearingSlot then + self.Variables["__listRuneWearing"]:AddData("slot"..data.wearingSlot, data) + end else self.Variables["__listRunePackage"]:AddData(child.Name, data) end diff --git a/src/StarterPlayerScripts/UI/Windows/SelectEquipmentWindow/PackageShow.luau b/src/StarterPlayerScripts/UI/Windows/SelectEquipmentWindow/PackageShow.luau index 83f1765..f7b074d 100644 --- a/src/StarterPlayerScripts/UI/Windows/SelectEquipmentWindow/PackageShow.luau +++ b/src/StarterPlayerScripts/UI/Windows/SelectEquipmentWindow/PackageShow.luau @@ -16,6 +16,7 @@ local LocalPlayer = game.Players.LocalPlayer --> Components local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common") local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail")) +local RuneShow = require(CommonFolder:WaitForChild("RuneShow")) function PackageShow:Init(data: table) local self = {} @@ -26,6 +27,7 @@ function PackageShow:Init(data: table) ["_tmpQuality"] = 0, ["_tmpName"] = 0, ["_imgView"] = 0, + ["__listRuneWearing"] = 0, } self.Connections = {} @@ -43,6 +45,10 @@ function PackageShow:Refresh() -- 模型展示 EquipmentModelDetail:ShowDetail(self.Variables["_imgView"], self.Data.orgId, false) + + -- 符文展示 + self.Variables["__listRuneWearing"]:AddComponent(RuneShow) + self.Variables["__listRuneWearing"]:SetData(Utils:GetWearingRuneData(self.Data.id)) end function PackageShow:OnInitFinish() diff --git a/src/StarterPlayerScripts/UI/Windows/SelectEquipmentWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/SelectEquipmentWindow/init.luau index cf35dc3..ee93536 100644 --- a/src/StarterPlayerScripts/UI/Windows/SelectEquipmentWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/SelectEquipmentWindow/init.luau @@ -54,7 +54,6 @@ function SelectEquipmentWindow:OnOpenWindow() table.insert(self.Data.ShowData, newData) end end - print(self.Data) local bgCloseCon = self.Variables["_btnBgClose"].Activated:Connect(function() self.UIManager:CloseWindow(script.Name)