diff --git a/excel/equipment.xlsx b/excel/equipment.xlsx index 38ef622..613987b 100644 Binary files a/excel/equipment.xlsx and b/excel/equipment.xlsx differ diff --git a/excel/item.xlsx b/excel/item.xlsx index dcab07d..3374000 100644 Binary files a/excel/item.xlsx and b/excel/item.xlsx differ diff --git a/excel/language.xlsx b/excel/language.xlsx index 5c07a9b..4b9fef6 100644 Binary files a/excel/language.xlsx and b/excel/language.xlsx differ diff --git a/src/ReplicatedStorage/Base/UIList.luau b/src/ReplicatedStorage/Base/UIList.luau index a0c9f22..fb70853 100644 --- a/src/ReplicatedStorage/Base/UIList.luau +++ b/src/ReplicatedStorage/Base/UIList.luau @@ -40,6 +40,7 @@ function UIList:Init(Prefab: Instance) self.Data = {} self.Instances = {} self.Connections = {} + self.LayoutOrderKey = nil self.Component = nil self.UIRoot = Prefab self.Org = Utils:FindInDescendantsUI(Prefab, "__org") @@ -62,20 +63,45 @@ function UIList:AddData(data: table) self:SetSingleInstance(#self.Data, data) end +function UIList:SetLayoutOrder(keyName: string) + self.LayoutOrderKey = keyName + for _, ui in pairs(self.Instances) do + ui.UIRoot.LayoutOrder = tonumber(ui.Data[keyName]) + end +end + function UIList:SetSingleInstance(index: number, data: table) local child = self.Component:Init(data) + child.TopUI = self.TopUI + child.ListUI = self local uiInstance = self.Org:Clone() child.UIRoot = uiInstance uiInstance.Name = index uiInstance.Parent = self.Org.Parent + if self.LayoutOrderKey then + uiInstance.LayoutOrder = tonumber(child.Data[self.LayoutOrderKey]) + end self.Instances[index] = child AutoInjectVariables(child) + if child.OnInitFinish then child:OnInitFinish() end child:Refresh() uiInstance.Visible = true end +function UIList:GetMinLayoutOrderInstance() + local minOrder = math.huge + local minInstance = nil + for _, ui in pairs(self.Instances) do + if ui.UIRoot.LayoutOrder < minOrder then + minOrder = ui.UIRoot.LayoutOrder + minInstance = ui + end + end + return minInstance +end + function UIList:Refresh() for _, ui in pairs(self.Instances) do ui:Destroy() end self.Instances = {} @@ -90,6 +116,8 @@ function UIList:Refresh() end function UIList:Clean() + if self.TopUI then self.TopUI = nil end + if self.ListUI then self.ListUI = nil end -- 清除自己的内容 for _, connection in pairs(self.Connections) do connection:Disconnect() @@ -108,6 +136,7 @@ function UIList:Clean() end self.Connections = nil + if ui.UIRoot then ui.UIRoot:Destroy() end ui:Destroy() end self.Instances = {} diff --git a/src/ReplicatedStorage/Base/UIWindow.luau b/src/ReplicatedStorage/Base/UIWindow.luau index adf31e1..156fd5c 100644 --- a/src/ReplicatedStorage/Base/UIWindow.luau +++ b/src/ReplicatedStorage/Base/UIWindow.luau @@ -19,7 +19,7 @@ local FolderPlayerGui = LocalPlayer:WaitForChild("PlayerGui") function UIWindow:Init(UIManager: table, Data: table?) local self = {} self.UIManager = UIManager - self.Data = Data + self.Data = Data or {} self.Variables = {} self.Connections = {} self.SignalConnections = {} @@ -27,7 +27,6 @@ function UIWindow:Init(UIManager: table, Data: table?) self.UIParentName = nil self.CloseDestroy = true - -- 运行时操作变量 self.UIRoot = nil self.AutoInject = false @@ -53,6 +52,7 @@ function UIWindow:AutoInjectVariables() if sixChar == "__list" then local prefab = Utils:FindInDescendantsUI(self.UIRoot, varName) target = UIList:Init(prefab) + target.TopUI = self else -- _开头,递归查找 target = Utils:FindInDescendantsUI(self.UIRoot, varName) @@ -86,12 +86,27 @@ function UIWindow:OnOpenWindow() end function UIWindow:OnCloseWindow() + if self.SignalConnections then + for _, connection in pairs(self.SignalConnections) do + connection:DisconnectAll() + end + self.SignalConnections = nil + end + + if self.Connections then + for _, connection in pairs(self.Connections) do + connection:Disconnect() + end + self.Connections = nil + end + if self.CloseDestroy then self.UIRoot:Destroy() self.UIRoot = nil else self.UIRoot.Visible = false end + self:Destroy() end --> 覆盖用 @@ -100,13 +115,21 @@ function UIWindow:OnDataChanged() end function UIWindow:Refresh() end function UIWindow:Destroy() - for _, connection in pairs(self.SignalConnections) do - connection:DisconnectAll() + if self.TopUI then self.TopUI = nil end + + if self.SignalConnections then + for _, connection in pairs(self.SignalConnections) do + connection:DisconnectAll() + end end self.SignalConnections = nil - for _, connection in pairs(self.Connections) do - connection:Disconnect() + if self.Connections then + for _, connection in pairs(self.Connections) do + print("进入断开连接") + + connection:Disconnect() + end end self.Connections = nil diff --git a/src/ReplicatedStorage/Json/Equipment.json b/src/ReplicatedStorage/Json/Equipment.json index 67ca107..a7d7f4d 100644 --- a/src/ReplicatedStorage/Json/Equipment.json +++ b/src/ReplicatedStorage/Json/Equipment.json @@ -1,3 +1,18 @@ [ -{"id":1,"type":1,"name":1,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10} +{"id":40000,"type":1,"name":40000,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40001,"type":1,"name":40001,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40002,"type":1,"name":40002,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40003,"type":1,"name":40003,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40004,"type":1,"name":40004,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40005,"type":1,"name":40005,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40006,"type":1,"name":40006,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40007,"type":1,"name":40007,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40008,"type":1,"name":40008,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40009,"type":1,"name":40009,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40010,"type":1,"name":40010,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40011,"type":1,"name":40011,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40012,"type":1,"name":40012,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40013,"type":1,"name":40013,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40014,"type":1,"name":40014,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10}, +{"id":40015,"type":1,"name":40015,"attributes":[14,200,10,15,200,10,16,100,0],"recycle":10} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/ItemProp.json b/src/ReplicatedStorage/Json/ItemProp.json index e2858bd..60ae155 100644 --- a/src/ReplicatedStorage/Json/ItemProp.json +++ b/src/ReplicatedStorage/Json/ItemProp.json @@ -60,5 +60,37 @@ {"id":13105,"type":4,"typeArgs":[],"quality":6,"iconId":66,"nameId":23105,"textId":33105,"buyPrice":[11,60],"sellPrice":[11,60],"use":[],"showPackage":null}, {"id":13106,"type":4,"typeArgs":[],"quality":7,"iconId":67,"nameId":23106,"textId":33106,"buyPrice":[11,70],"sellPrice":[11,70],"use":[],"showPackage":null}, {"id":20000,"type":5,"typeArgs":[],"quality":1,"iconId":1,"nameId":30000,"textId":40000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, -{"id":30000,"type":6,"typeArgs":[],"quality":1,"iconId":2,"nameId":40000,"textId":50000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null} +{"id":30000,"type":6,"typeArgs":[],"quality":1,"iconId":2,"nameId":40000,"textId":50000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40000,"type":2,"typeArgs":[],"quality":1,"iconId":1,"nameId":40000,"textId":60000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40001,"type":2,"typeArgs":[],"quality":2,"iconId":2,"nameId":40001,"textId":60001,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40002,"type":2,"typeArgs":[],"quality":3,"iconId":3,"nameId":40002,"textId":60002,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40003,"type":2,"typeArgs":[],"quality":4,"iconId":4,"nameId":40003,"textId":60003,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40004,"type":2,"typeArgs":[],"quality":5,"iconId":5,"nameId":40004,"textId":60004,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40005,"type":2,"typeArgs":[],"quality":6,"iconId":6,"nameId":40005,"textId":60005,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40006,"type":2,"typeArgs":[],"quality":7,"iconId":7,"nameId":40006,"textId":60006,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40007,"type":2,"typeArgs":[],"quality":8,"iconId":8,"nameId":40007,"textId":60007,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40008,"type":2,"typeArgs":[],"quality":9,"iconId":9,"nameId":40008,"textId":60008,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40009,"type":2,"typeArgs":[],"quality":10,"iconId":10,"nameId":40009,"textId":60009,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40010,"type":2,"typeArgs":[],"quality":11,"iconId":11,"nameId":40010,"textId":60010,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40011,"type":2,"typeArgs":[],"quality":12,"iconId":12,"nameId":40011,"textId":60011,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40012,"type":2,"typeArgs":[],"quality":13,"iconId":13,"nameId":40012,"textId":60012,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40013,"type":2,"typeArgs":[],"quality":14,"iconId":14,"nameId":40013,"textId":60013,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40014,"type":2,"typeArgs":[],"quality":15,"iconId":15,"nameId":40014,"textId":60014,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":40015,"type":2,"typeArgs":[],"quality":16,"iconId":16,"nameId":40015,"textId":60015,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50000,"type":3,"typeArgs":[],"quality":1,"iconId":1,"nameId":50000,"textId":70000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50001,"type":3,"typeArgs":[],"quality":2,"iconId":2,"nameId":50001,"textId":70001,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50002,"type":3,"typeArgs":[],"quality":3,"iconId":3,"nameId":50002,"textId":70002,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50003,"type":3,"typeArgs":[],"quality":4,"iconId":4,"nameId":50003,"textId":70003,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50004,"type":3,"typeArgs":[],"quality":5,"iconId":5,"nameId":50004,"textId":70004,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50005,"type":3,"typeArgs":[],"quality":6,"iconId":6,"nameId":50005,"textId":70005,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50006,"type":3,"typeArgs":[],"quality":7,"iconId":7,"nameId":50006,"textId":70006,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50007,"type":3,"typeArgs":[],"quality":8,"iconId":8,"nameId":50007,"textId":70007,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50008,"type":3,"typeArgs":[],"quality":9,"iconId":9,"nameId":50008,"textId":70008,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50009,"type":3,"typeArgs":[],"quality":10,"iconId":10,"nameId":50009,"textId":70009,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50010,"type":3,"typeArgs":[],"quality":11,"iconId":11,"nameId":50010,"textId":70010,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50011,"type":3,"typeArgs":[],"quality":12,"iconId":12,"nameId":50011,"textId":70011,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50012,"type":3,"typeArgs":[],"quality":13,"iconId":13,"nameId":50012,"textId":70012,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50013,"type":3,"typeArgs":[],"quality":14,"iconId":14,"nameId":50013,"textId":70013,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50014,"type":3,"typeArgs":[],"quality":15,"iconId":15,"nameId":50014,"textId":70014,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":50015,"type":3,"typeArgs":[],"quality":16,"iconId":16,"nameId":50015,"textId":70015,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Json/Language_En_US.json b/src/ReplicatedStorage/Json/Language_En_US.json index fc6931f..3fbf934 100644 --- a/src/ReplicatedStorage/Json/Language_En_US.json +++ b/src/ReplicatedStorage/Json/Language_En_US.json @@ -1,4 +1,20 @@ [ {"id":100006,"text":"Coin+{0}"}, -{"id":100007,"text":"Score+{0}"} +{"id":100007,"text":"Score+{0}"}, +{"id":40000,"text":"测试装备1"}, +{"id":40001,"text":"测试装备2"}, +{"id":40002,"text":"测试装备3"}, +{"id":40003,"text":"测试装备4"}, +{"id":40004,"text":"测试装备5"}, +{"id":40005,"text":"测试装备6"}, +{"id":40006,"text":"测试装备7"}, +{"id":40007,"text":"测试装备8"}, +{"id":40008,"text":"测试装备9"}, +{"id":40009,"text":"测试装备10"}, +{"id":40010,"text":"测试装备11"}, +{"id":40011,"text":"测试装备12"}, +{"id":40012,"text":"测试装备13"}, +{"id":40013,"text":"测试装备14"}, +{"id":40014,"text":"测试装备15"}, +{"id":40015,"text":"测试装备16"} ] \ No newline at end of file diff --git a/src/ReplicatedStorage/Tools/Localization.luau b/src/ReplicatedStorage/Tools/Localization.luau index 5950cbc..055ad1f 100644 --- a/src/ReplicatedStorage/Tools/Localization.luau +++ b/src/ReplicatedStorage/Tools/Localization.luau @@ -32,13 +32,17 @@ local JsonLanguage, JsonImage = Localization:GetLocalizationJson() -- 获取文本Id数据 function Localization:GetLanguageData(Id: number) if not Id then return end - return Utils:GetIdDataFromJson(JsonLanguage, Id).text + local data = Utils:GetIdDataFromJson(JsonLanguage, Id) + if not data then return "" end + return data.text end -- 获取图片Id数据 function Localization:GetImageData(Id: number) if not Id then return end - return Utils:GetIdDataFromJson(JsonImage, Id).sourceId + local data = Utils:GetIdDataFromJson(JsonImage, Id) + if not data then return "" end + return data.sourceId end return Localization \ No newline at end of file diff --git a/src/ReplicatedStorage/Tools/Utils.luau b/src/ReplicatedStorage/Tools/Utils.luau index c943b2a..34454c0 100644 --- a/src/ReplicatedStorage/Tools/Utils.luau +++ b/src/ReplicatedStorage/Tools/Utils.luau @@ -164,7 +164,7 @@ function Utils:GetFlatDirectionAndEndPos(startPos: Vector3, targetPos: Vector3, end function Utils:CreateDataInstance(Player: Player, UniqueId: number, EquipmentData: table, Folder: Instance) - if Player or UniqueId or EquipmentData or Folder then + if not Player or not UniqueId or not EquipmentData or not Folder then warn('创建实例失败: ' , Player.Name, UniqueId, EquipmentData, Folder) return end diff --git a/src/ServerStorage/Proxy/DamageProxy.luau b/src/ServerStorage/Proxy/DamageProxy.luau index 0198d27..6c70367 100644 --- a/src/ServerStorage/Proxy/DamageProxy.luau +++ b/src/ServerStorage/Proxy/DamageProxy.luau @@ -146,7 +146,7 @@ function DamageProxy:TakeDamage(Caster: TypeList.Character, Victim: TypeList.Cha -- 伤害计算 local VictimHealth = Victim:GetAttributeValue("hp") local resultValue, isDied = Victim:ChangeAttributeValue("hp", math.max(0, VictimHealth - Damage)) - print("伤害数据打印", Damage, VictimHealth, resultValue, isDied) + -- print("伤害数据打印", Damage, VictimHealth, resultValue, isDied) if isDied then break end end -- 实际发送数据 diff --git a/src/ServerStorage/Proxy/HelpProxy.luau b/src/ServerStorage/Proxy/HelpProxy.luau index 8ee0dfa..3d657c9 100644 --- a/src/ServerStorage/Proxy/HelpProxy.luau +++ b/src/ServerStorage/Proxy/HelpProxy.luau @@ -3,6 +3,12 @@ local HelpProxy = {} --> Server local ReplicatedStorage = game:GetService("ReplicatedStorage") +--> Tools +local Utils = require(ReplicatedStorage.Tools.Utils) + +--> Json +local JsonItemProp = require(ReplicatedStorage.Json.ItemProp) + --> Events local RE_PlayerHelper = ReplicatedStorage.Events.RE_PlayerHelper @@ -16,7 +22,13 @@ RE_PlayerHelper.OnServerEvent:Connect(function(Player: Player, EventName: string HelpProxy:CleanPlayerData(Player) elseif EventName == "AddItem" then local PlayerInfoProxy = require(script.Parent.PlayerInfoProxy) - PlayerInfoProxy:ChangeItemCount(Player, EventData[1], EventData[2]) + local itemData = Utils:GetIdDataFromJson(JsonItemProp, EventData[1]) + if itemData.type == 3 then + local BookProxy = require(script.Parent.BookProxy) + BookProxy:UnlockBook(Player, EventData[1] - 10000) + else + PlayerInfoProxy:ChangeItemCount(Player, EventData[1], EventData[2]) + end print("添加物品成功", PlayerInfoProxy:GetItemCount(Player, EventData[1])) end end) diff --git a/src/ServerStorage/Proxy/PlayerFightProxy/init.luau b/src/ServerStorage/Proxy/PlayerFightProxy/init.luau index 5a8bee1..3e79da5 100644 --- a/src/ServerStorage/Proxy/PlayerFightProxy/init.luau +++ b/src/ServerStorage/Proxy/PlayerFightProxy/init.luau @@ -109,7 +109,6 @@ function PlayerFightProxy:GetPlayerRole(Player: Player) end function PlayerFightProxy:GetPlayerAI(Player: Player) - print(PlayerFightProxy.pData[Player.UserId]) return PlayerFightProxy.pData[Player.UserId].PlayerAI end diff --git a/src/StarterPlayerScripts/ClientMain/Helper.luau b/src/StarterPlayerScripts/ClientMain/Helper.luau index 4a17961..5d9f989 100644 --- a/src/StarterPlayerScripts/ClientMain/Helper.luau +++ b/src/StarterPlayerScripts/ClientMain/Helper.luau @@ -24,6 +24,8 @@ UserInputService.InputBegan:Connect(function(input, gameProcessed) RE_UpgradeAttributes:FireServer(3) elseif input.KeyCode == Enum.KeyCode.N then RE_UpgradeAttributes:FireServer(4) + elseif input.KeyCode == Enum.KeyCode.KeypadOne then + RE_PlayerHelper:FireServer("AddItem", {math.random(50000, 50015), 1}) end end end) diff --git a/src/StarterPlayerScripts/ClientMain/PerformanceClient/init.luau b/src/StarterPlayerScripts/ClientMain/PerformanceClient/init.luau index 1e294e6..db38889 100644 --- a/src/StarterPlayerScripts/ClientMain/PerformanceClient/init.luau +++ b/src/StarterPlayerScripts/ClientMain/PerformanceClient/init.luau @@ -109,4 +109,7 @@ RE_CleanPlayerPerformance.OnClientEvent:Connect(function(CleanedPlayer: Player) PerformanceClient.pData[UserId] = nil end) +-- 打开默认界面 +UIManager:OpenWindow("MainWindow") + return PerformanceClient \ No newline at end of file diff --git a/src/StarterPlayerScripts/UI/Windows/CreateWindow/WeaponItem.luau b/src/StarterPlayerScripts/UI/Windows/CreateWindow/WeaponItem.luau new file mode 100644 index 0000000..309c4cd --- /dev/null +++ b/src/StarterPlayerScripts/UI/Windows/CreateWindow/WeaponItem.luau @@ -0,0 +1,61 @@ +local WeaponItem = {} +WeaponItem.__index = WeaponItem + +local ReplicatedStorage = game:GetService("ReplicatedStorage") + +local Utils = require(ReplicatedStorage.Tools.Utils) +local Localization = require(ReplicatedStorage.Tools.Localization) +local Signal = require(ReplicatedStorage.Tools.Signal) + +local JsonItemProp = require(ReplicatedStorage.Json.ItemProp) + +function WeaponItem:Init(data: table) + local self = {} + self.Data = data + self.Variables = { + ["_imgIcon"] = 0, + ["_tmpName"] = 0, + ["_tmpQuality"] = 0, + ["_btnClick"] = 0, + ["_imgSelected"] = 0, + } + self.SignalConnections = {} + self.Connections = {} + + setmetatable(self, WeaponItem) + return self +end + +function WeaponItem:SetSelected(isSelected: boolean) + self.Variables._imgSelected.Visible = isSelected +end + +function WeaponItem:Refresh() + local itemData = Utils:GetIdDataFromJson(JsonItemProp, self.Data.OrgId) + self.Variables._imgIcon.Image = Localization:GetImageData(itemData.iconId) + self.Variables._tmpName.Text = Localization:GetLanguageData(itemData.nameId) + self.Variables._tmpQuality.Text = self.Data.Quality +end + +function WeaponItem:OnInitFinish() + -- 点击事件 + local con = self.Variables["_btnClick"].Activated:Connect(function() + self.TopUI:ShowDetailInfo(self.Data) + self:SetSelected(true) + + if self.TopUI.LastActiveItem then + self.TopUI.LastActiveItem:SetSelected(false) + end + self.TopUI.LastActiveItem = self + end) + table.insert(self.Connections, con) +end + +function WeaponItem:Destroy() + for k, v in pairs(self) do + self[k] = nil + end + self = nil +end + +return WeaponItem \ No newline at end of file diff --git a/src/StarterPlayerScripts/UI/Windows/CreateWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/CreateWindow/init.luau new file mode 100644 index 0000000..349f43b --- /dev/null +++ b/src/StarterPlayerScripts/UI/Windows/CreateWindow/init.luau @@ -0,0 +1,160 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") + +--> Dependencies +local UIWindow = require(ReplicatedStorage.Base.UIWindow) +local UIEnums = require(ReplicatedStorage.Base.UIEnums) + +--> Components +local WeaponItem = require(script.WeaponItem) + +--> Variables +local Utils = require(ReplicatedStorage.Tools.Utils) +local Localization = require(ReplicatedStorage.Tools.Localization) +local Signal = require(ReplicatedStorage.Tools.Signal) + +--> Json +local JsonItemProp = require(ReplicatedStorage.Json.ItemProp) + +--> Events +local RE_Forge = ReplicatedStorage.Events.RE_Forge + +local LocalPlayer = game.Players.LocalPlayer +-------------------------------------------------------------------------------- + +local CreateWindow = {} +CreateWindow.__index = CreateWindow +setmetatable(CreateWindow, {__index = UIWindow}) + +function CreateWindow:Init(UIManager: table, Data: table?) + local self = UIWindow:Init(UIManager, Data) + setmetatable(self, CreateWindow) + self.Variables = { + ["_btnBgClose"] = 0, + + ["_goWeaponPanel"] = 0, + ["_btnClose"] = 0, + + ["__listWeaponPackage"] = 0, + -- 详情面板 + ["_btnCreate"] = 0, + ["_btnMult"] = 0, + ["_imgIcon"] = 0, + ["_tmpName"] = 0, + ["_tmpQuality"] = 0, + ["_toggleAutoRecycle"] = 0, + ["_imgAutoRecycleActive"] = 0, + } + self.MultNumber = 1 + self.AutoRecycle = false + self.UIRootName = "ui_w_create" + self.UIParentName = UIEnums.UIParent.UIRoot + + self.LastActiveItem = nil + + return self +end + +function CreateWindow:ShowDetailInfo(data: table?) + if data then + self.Variables["_imgIcon"].Image = Localization:GetImageData(Utils:GetIdDataFromJson(JsonItemProp, data.OrgId).iconId) + self.Variables["_tmpName"].Text = Utils:GetIdDataFromJson(JsonItemProp, data.OrgId).nameId + self.Variables["_tmpQuality"].Text = Utils:GetIdDataFromJson(JsonItemProp, data.OrgId).quality + else + self.Variables["_imgIcon"].Image = "" + self.Variables["_tmpName"].Text = "" + self.Variables["_tmpQuality"].Text = "" + end +end + +function CreateWindow:OnClickMult() + self.MultNumber += 1 + if self.MultNumber > 10 then self.MultNumber = 1 end + self.Variables["_btnMult"].Text = "x" .. self.MultNumber +end + +function CreateWindow:OnToggleAutoRecycleClick() + self.AutoRecycle = not self.AutoRecycle + self.Variables["_imgAutoRecycleActive"].Visible = self.AutoRecycle +end + +function CreateWindow:OnClickCreate() + if self.LastActiveItem then + local data = self.LastActiveItem.Data + RE_Forge:FireServer(data.OrgId, self.MultNumber) + end +end + +function CreateWindow:OnOpenWindow() + UIWindow.OnOpenWindow(self) + + -- 自己进行数据处理 + local DataFolder = Utils:GetPlayerDataFolder(LocalPlayer):FindFirstChild("Book") + local data = {} + for _, child in DataFolder:GetChildren() do + data[child.Name] = { + OrgId = tonumber(child.Name), + Quality = child:GetAttribute("quality"), + Timestamp = child:GetAttribute("timestamp"), + } + end + self:SetData(data) + + -- 监听数据变化 + local childAddCon = DataFolder.ChildAdded:Connect(function(child) + self.Data[child.Name] = { + OrgId = tonumber(child.Name), + Quality = child:GetAttribute("quality"), + Timestamp = child:GetAttribute("timestamp"), + } + self.Variables["__listWeaponPackage"]:AddData(self.Data[child.Name]) + end) + table.insert(self.Connections, childAddCon) + + -- 点击事件 + 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) + local multCon = self.Variables["_btnMult"].Activated:Connect(function() + self:OnClickMult() + end) + local autoRecycleCon = self.Variables["_toggleAutoRecycle"].Activated:Connect(function() + self:OnToggleAutoRecycleClick() + end) + local createCon = self.Variables["_btnCreate"].Activated:Connect(function() + self:OnClickCreate() + end) + + table.insert(self.Connections, bgCloseCon) + table.insert(self.Connections, closeCon) + table.insert(self.Connections, multCon) + table.insert(self.Connections, autoRecycleCon) + table.insert(self.Connections, createCon) + + self.Variables["__listWeaponPackage"]:AddComponent(WeaponItem) + self.Variables["__listWeaponPackage"]:SetData(self.Data) + self.Variables["__listWeaponPackage"]:SetLayoutOrder("OrgId") + + if self.Data then + local minInstance = self.Variables["__listWeaponPackage"]:GetMinLayoutOrderInstance() + self:ShowDetailInfo(minInstance.Data) + + self.LastActiveItem = minInstance + minInstance:SetSelected(true) + else + self:ShowDetailInfo() + end +end + +function CreateWindow:OnCloseWindow() + UIWindow.OnCloseWindow(self) + + self.Variables["__listWeaponPackage"]:Clean() +end + + + +return CreateWindow \ No newline at end of file diff --git a/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau new file mode 100644 index 0000000..b998de6 --- /dev/null +++ b/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau @@ -0,0 +1,37 @@ +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") + +--> Dependencies +local UIWindow = require(ReplicatedStorage.Base.UIWindow) +local UIEnums = require(ReplicatedStorage.Base.UIEnums) + +-------------------------------------------------------------------------------- + +local MainWindow = {} +MainWindow.__index = MainWindow +setmetatable(MainWindow, {__index = UIWindow}) + +function MainWindow:Init(UIManager: table, Data: table?) + local self = UIWindow:Init(UIManager, Data) + setmetatable(self, MainWindow) + self.Variables = { + ["_btnMainCreate"] = 0, + } + self.UIRootName = "ui_w_main" + self.UIParentName = UIEnums.UIParent.UIRoot + + return self +end + +function MainWindow:OnOpenWindow() + UIWindow.OnOpenWindow(self) + + local createCon = self.Variables["_btnMainCreate"].Activated:Connect(function() + self.UIManager:OpenWindow("CreateWindow") + end) + table.insert(self.Connections, createCon) +end + + + +return MainWindow \ No newline at end of file