From 4ccf2a6709b31175f4ae6198c38dd8eaf0b0e812 Mon Sep 17 00:00:00 2001 From: gechangfu Date: Wed, 13 Aug 2025 19:31:14 +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/Rune.xlsx | Bin 0 -> 10598 bytes excel/attribute.xlsx | Bin 13324 -> 13405 bytes excel/cha.xlsx | Bin 15314 -> 15288 bytes excel/equipment.xlsx | Bin 15852 -> 15866 bytes excel/item.xlsx | Bin 22781 -> 22865 bytes excel/language.xlsx | Bin 24642 -> 24856 bytes src/ReplicatedStorage/Json/ItemProp.json | 3 +- .../Json/Language_En_US.json | 4 + .../Json/Language_Zh_CN.json | 4 + src/ReplicatedStorage/Json/Rune.json | 3 + src/ReplicatedStorage/Tools/Utils.luau | 2 +- src/ServerStorage/Proxy/BookProxy.luau | 29 +- src/ServerStorage/Proxy/EquipmentProxy.luau | 19 ++ src/ServerStorage/Proxy/RuneProxy.luau | 279 ++++++++++++++++++ .../ClientMain/Helper.luau | 3 + .../UI/Common/SpecialShow.luau | 31 +- .../UI/Windows/BlessingWindow/WeaponItem.luau | 124 ++++++++ .../UI/Windows/BlessingWindow/init.luau | 249 ++++++++++++++++ .../UI/Windows/CreateWindow/init.luau | 4 +- .../UI/Windows/MainWindow/init.luau | 5 + 20 files changed, 748 insertions(+), 11 deletions(-) create mode 100644 excel/Rune.xlsx create mode 100644 src/ReplicatedStorage/Json/Rune.json create mode 100644 src/ServerStorage/Proxy/RuneProxy.luau create mode 100644 src/StarterPlayerScripts/UI/Windows/BlessingWindow/WeaponItem.luau create mode 100644 src/StarterPlayerScripts/UI/Windows/BlessingWindow/init.luau diff --git a/excel/Rune.xlsx b/excel/Rune.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d48bb19421f7438044f93ee2f1454c71d73caedb GIT binary patch literal 10598 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 a@IMTsssbEjb^!on$S(lm!zXBd{QG}iD1c-D literal 0 HcmV?d00001 diff --git a/excel/attribute.xlsx b/excel/attribute.xlsx index 47de1e783ad638a84fb40e47d1312afdf4d8ec0f..16f4933252c2b4922e99d3991cc530c47d77ae0e 100644 GIT binary patch delta 5129 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 SP)HWb3%)GG3RHaZSNcEGBFNJK delta 5032 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 H{zd*D_#1>a diff --git a/excel/cha.xlsx b/excel/cha.xlsx index c6b70c7a697d7d71b469679181024aa837a53899..241945073d312b24a9776a628de064884eb2be0e 100644 GIT binary patch delta 6597 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 diff --git a/excel/equipment.xlsx b/excel/equipment.xlsx index 229668c9d2b68751fa8036894359300f7ecb043a..e1ec9c39c75db4847694d50113cd23b7d673498a 100644 GIT binary patch delta 3058 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 diff --git a/excel/item.xlsx b/excel/item.xlsx index 9765d39f36890f7cbf67a96421bf23719c9871c4..28081fa7b7aa0a83d5380cef58809cae2d4db138 100644 GIT binary patch delta 9425 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 delta 9399 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 Fe*g!*6a)YO diff --git a/excel/language.xlsx b/excel/language.xlsx index 1ef273c0f06d3a84a894bd90c44154b34d418c4f..f2a2d9c8f48b3ca31c1275f98d4fbe6ecfe1401d 100644 GIT binary patch delta 9946 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 delta 9791 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 diff --git a/src/ReplicatedStorage/Json/ItemProp.json b/src/ReplicatedStorage/Json/ItemProp.json index c36a664..c5bd145 100644 --- a/src/ReplicatedStorage/Json/ItemProp.json +++ b/src/ReplicatedStorage/Json/ItemProp.json @@ -95,5 +95,6 @@ {"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} +{"id":50015,"type":3,"typeArgs":[],"quality":16,"iconId":16,"nameId":50015,"textId":70015,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}, +{"id":60000,"type":7,"typeArgs":[],"quality":1,"iconId":60000,"nameId":60000,"textId":80000,"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 ac1eb76..7d76d47 100644 --- a/src/ReplicatedStorage/Json/Language_En_US.json +++ b/src/ReplicatedStorage/Json/Language_En_US.json @@ -41,6 +41,10 @@ {"id":1001,"text":"鉴定出{0}属性时 {1}+{2}"}, {"id":1002,"text":"鉴定出{0}技能时 {1}+{2}"}, {"id":1003,"text":"鉴定出{0}晶石时 {1}+{2}"}, +{"id":1010,"text":"尚未祝福"}, +{"id":1011,"text":"祝福:出现{0}属性的概率+{1}"}, +{"id":1012,"text":"祝福:出现{0}技能的概率+{1}"}, +{"id":1013,"text":"祝福:出现{0}晶石的概率+{1}"}, {"id":20000,"text":"普攻"}, {"id":20001,"text":"剑气"}, {"id":40000,"text":"测试装备1"}, diff --git a/src/ReplicatedStorage/Json/Language_Zh_CN.json b/src/ReplicatedStorage/Json/Language_Zh_CN.json index ac1eb76..7d76d47 100644 --- a/src/ReplicatedStorage/Json/Language_Zh_CN.json +++ b/src/ReplicatedStorage/Json/Language_Zh_CN.json @@ -41,6 +41,10 @@ {"id":1001,"text":"鉴定出{0}属性时 {1}+{2}"}, {"id":1002,"text":"鉴定出{0}技能时 {1}+{2}"}, {"id":1003,"text":"鉴定出{0}晶石时 {1}+{2}"}, +{"id":1010,"text":"尚未祝福"}, +{"id":1011,"text":"祝福:出现{0}属性的概率+{1}"}, +{"id":1012,"text":"祝福:出现{0}技能的概率+{1}"}, +{"id":1013,"text":"祝福:出现{0}晶石的概率+{1}"}, {"id":20000,"text":"普攻"}, {"id":20001,"text":"剑气"}, {"id":40000,"text":"测试装备1"}, diff --git a/src/ReplicatedStorage/Json/Rune.json b/src/ReplicatedStorage/Json/Rune.json new file mode 100644 index 0000000..2da4fae --- /dev/null +++ b/src/ReplicatedStorage/Json/Rune.json @@ -0,0 +1,3 @@ +[ +{"id":60000,"type":1,"icon":1,"nameId":20000,"behaviourName":"Attack","recycle":[]} +] \ No newline at end of file diff --git a/src/ReplicatedStorage/Tools/Utils.luau b/src/ReplicatedStorage/Tools/Utils.luau index 86a3d47..4ed273f 100644 --- a/src/ReplicatedStorage/Tools/Utils.luau +++ b/src/ReplicatedStorage/Tools/Utils.luau @@ -114,7 +114,7 @@ function Utils:GetRandomIdFromJsonWithType(JsonData: table, Type: number, Except while ExceptIdList and table.find(ExceptIdList, randomId) do randomId = rng:NextInteger(1, #result) end - return randomId + return result[randomId] end -- 获取随机id,ExceptIdList为可选参数,如果传入则排除ExceptIdList中的id diff --git a/src/ServerStorage/Proxy/BookProxy.luau b/src/ServerStorage/Proxy/BookProxy.luau index c9278e7..615c0f0 100644 --- a/src/ServerStorage/Proxy/BookProxy.luau +++ b/src/ServerStorage/Proxy/BookProxy.luau @@ -19,7 +19,7 @@ local JsonEquipment = require(ReplicatedStorage.Json.Equipment) --> Events local RE_PlayerTip = ReplicatedStorage.Events.RE_PlayerTip -local RE_UpgradeAttributes = ReplicatedStorage.Events.RE_UpgradeAttributes +local RE_Blessing = ReplicatedStorage.Events.RE_Blessing --> Constants local STORE_NAME = "Book" @@ -141,14 +141,20 @@ function BookProxy:BlessingBook(Player: Player, BookId: number, BlessingType: nu local BlessingCostItemId = 20 + BlessingType - 1 local PlayerInfoProxy = require(ServerStorage.Proxy.PlayerInfoProxy) local hasEnoughItem = PlayerInfoProxy:HasEnoughItem(Player, BlessingCostItemId, BlessingCount) - if not hasEnoughItem then warn("没有足够货币, 无法祝福") return end + if not hasEnoughItem then + RE_PlayerTip:FireClient(Player, "没有足够货币, 无法祝福") + return + end -- 消耗祝福道具 PlayerInfoProxy:ChangeItemCount(Player, BlessingCostItemId, -BlessingCount) -- 获取祝福 local EquipmentData = Utils:GetIdDataFromJson(JsonEquipment, BookId) - if not EquipmentData then warn("获取装备数据失败") return end + if not EquipmentData then + RE_PlayerTip:FireClient(Player, "获取装备数据失败") + return + end -- 如果类型相同,则直接定向 local isNotDefine = true @@ -164,14 +170,23 @@ function BookProxy:BlessingBook(Player: Player, BookId: number, BlessingType: nu -- 没有定向的话, 就随机 if isNotDefine then -- 随机 - BlessingData = Utils:GetRandomIdFromJsonWithType(JsonBlessing, BlessingType) - if not BlessingData then warn("获取祝福数据失败, 请检查配置表内容", BlessingType) return end + BlessingData = Utils:GetIdDataFromJson(JsonBlessing, Utils:GetRandomIdFromJsonWithType(JsonBlessing, BlessingType)) + if not BlessingData then + RE_PlayerTip:FireClient(Player, "获取祝福数据失败, 请检查配置表内容", BlessingType) + return + end end -- 设置祝福属性 ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId].blessingId = BlessingData.id ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId].blessingRate = Rng:GetRandomInt(BlessingData.minRate, BlessingData.maxRate) + -- 修改实例的信息 + + local bookInstance = GetPlayerBookFolder(Player):FindFirstChild(BookId) + bookInstance:SetAttribute("blessingId", ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId].blessingId) + bookInstance:SetAttribute("blessingRate", ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId].blessingRate) + -- 设置祝福成功,向前端发送信息 end @@ -201,4 +216,8 @@ ReplicatedStorage.Remotes.PlayerRemoving.Event:Connect(function(Player: Player) BookProxy:OnPlayerRemoving(Player) end) +RE_Blessing.OnServerEvent:Connect(function(Player: Player, BookId: number, BlessingType: number, BlessingCount: number) + BookProxy:BlessingBook(Player, BookId, BlessingType, BlessingCount) +end) + return BookProxy \ No newline at end of file diff --git a/src/ServerStorage/Proxy/EquipmentProxy.luau b/src/ServerStorage/Proxy/EquipmentProxy.luau index 6083ab1..d30bc81 100644 --- a/src/ServerStorage/Proxy/EquipmentProxy.luau +++ b/src/ServerStorage/Proxy/EquipmentProxy.luau @@ -294,6 +294,25 @@ function EquipmentProxy:AddEquipment(Player: Player, EquipmentId: number) end end + -- 随机生成符文数量 + local RuneProxy = require(ServerStorage.Proxy.RuneProxy) + local maxRuneNumber = PlayerInfoProxy:GetPlayerInfo(Player).runeNumber or 0 + local runeNumber = rng:NextInteger(0, maxRuneNumber) + ResultData.maxRuneNumber = runeNumber + if runeNumber > 0 then + local spawnRunesId = {} + for i = 1, runeNumber do + -- 是否生成符文 + local isTrigger = Rng:GetRandomInt(1, 100) <= 5 + if isTrigger then + local newRuneId = RuneProxy:GetRandomRuneId(spawnRunesId) + table.insert(spawnRunesId, newRuneId) + local newRuneData, newRuneInstance = RuneProxy:AddRune(Player, newRuneId) + RuneProxy:WearRune(Player, newRuneData.id, UniqueId) + end + end + end + ------------------------------------------------------------ -- 添加图鉴记录 diff --git a/src/ServerStorage/Proxy/RuneProxy.luau b/src/ServerStorage/Proxy/RuneProxy.luau new file mode 100644 index 0000000..3d4096e --- /dev/null +++ b/src/ServerStorage/Proxy/RuneProxy.luau @@ -0,0 +1,279 @@ +-- 技能系统(存储用) +local RuneProxy = {} + +--> Services +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local ServerStorage = game:GetService("ServerStorage") + +--> Variables +local Utils = require(ReplicatedStorage.Tools.Utils) +local ArchiveProxy = require(ServerStorage.Proxy.ArchiveProxy) +local Rng = require(ReplicatedStorage.Tools.Rng) + +--> Json +local JsonRune = require(ReplicatedStorage.Json.Rune) + +--> Events +local RE_PlayerTip = ReplicatedStorage.Events.RE_PlayerTip + +--> Constants +local STORE_NAME = "Rune" + +-------------------------------------------------------------------------------- + +-- 获取玩家信息文件夹 +local function GetPlayerRuneFolder(Player: Player) + local pData = Utils:GetPlayerDataFolder(Player) + if not pData then return end + local RuneFolder = pData:FindFirstChild("Rune") + return RuneFolder +end + +-------------------------------------------------------------------------------- + +-- 初始化玩家 +function RuneProxy:InitPlayer(Player: Player) + local pData = Utils:WaitPlayerDataFolder(Player) + if not pData then return end + local RuneFolder = Utils:CreateFolder("Rune", pData) + + -- 新玩家数据初始化 + if not ArchiveProxy.pData[Player.UserId][STORE_NAME] then + ArchiveProxy.pData[Player.UserId][STORE_NAME] = {} + end + + -- 创建玩家信息实例 + for RuneUniqueId, RuneData in ArchiveProxy.pData[Player.UserId][STORE_NAME] do + Utils:CreateDataInstance(Player, RuneUniqueId, RuneData, RuneFolder) + end +end + +-------------------------------------------------------------------------------- + +-- 添加技能 +local EXCEPT_KEYS = {"id"} +function RuneProxy:AddRune(Player: Player, RuneId: number) + local pData = Utils:GetPlayerDataFolder(Player) + if not pData then return end + + local RuneData = Utils:GetIdDataFromJson(JsonRune, RuneId) + if not RuneData then return end + + local UniqueId = Utils:GenUniqueId(ArchiveProxy.pData[Player.UserId][STORE_NAME]) + -- 配置表内容 + local ResultData = {} + for key, value in pairs(RuneData) do + if not table.find(EXCEPT_KEYS, key) then + ResultData[key] = value + end + end + + ResultData.id = UniqueId + ResultData.orgId = RuneId + -- 记录穿戴的装备UniqueId + ResultData.wearing = 0 + ResultData.wearingSlot = 0 + + ArchiveProxy.pData[Player.UserId][STORE_NAME][UniqueId] = ResultData + local RuneInstance = Utils:CreateDataInstance(Player, UniqueId, ResultData, GetPlayerRuneFolder(Player)) + return Utils:DeepCopyTable(ResultData), RuneInstance +end + +-- 合成符文 +function RuneProxy:CombineRune(Player: Player, RuneData: table) + local pData = Utils:GetPlayerDataFolder(Player) + if not pData then return end + + if #RuneData ~= 3 then warn('符文合成数量不正确', Player.Name, RuneData) return end + + -- 获取合成符文数据 + local sameQuality = true + for _, rune in RuneData do + if rune.quality >= 3 then warn('符文品质已达到上限', Player.Name, RuneData) return end + if rune.quality ~= RuneData[1].quality then + sameQuality = false + break + end + end + + if not sameQuality then warn('符文品质不相同', Player.Name, RuneData) return end + + -- 获取合成符文品质 + local higherQuality = RuneData[1].quality + 1 + + -- 添加合成符文 + local newRuneId = self:GetRandomRuneIdByQuality(higherQuality) + if not newRuneId then warn('合成符文不存在', Player.Name, RuneData) return end + self:AddRune(Player, newRuneId) + + -- 销毁符文 + for _, rune in RuneData do self:DestroyRune(Player, rune.id) end +end + +-- 销毁符文 +function RuneProxy:DestroyRune(Player: Player, UniqueId: number) + local pData = Utils:GetPlayerDataFolder(Player) + if not pData then return end + + -- 获取符文实例存储数据 + local UniqueData = ArchiveProxy.pData[Player.UserId][UniqueId] + if not UniqueData then return end + + -- 检查是否有符文实例 + local RuneInstance = GetPlayerRuneFolder(Player):FindFirstChild(UniqueId) + if not RuneInstance then warn('符文实例不存在: ' , Player.Name, UniqueId) return end + + -- 销毁 + RuneInstance:Destroy() + ArchiveProxy.pData[Player.UserId][UniqueId] = nil +end + +-- 穿戴符文 +function RuneProxy:WearRune(Player: Player, RuneUniqueId: number, EquipmentUniqueId: number) + local pData = Utils:GetPlayerDataFolder(Player) + if not pData then print("pData不存在", Player.Name) return end + + -- 获取技能实例存储数据 + local UniqueData = ArchiveProxy.pData[Player.UserId][STORE_NAME][RuneUniqueId] + if not UniqueData then print("UniqueData不存在", Player.Name, RuneUniqueId) return end + + -- 检查是否有技能实例 + local RuneInstance = GetPlayerRuneFolder(Player):FindFirstChild(RuneUniqueId) + if not RuneInstance then warn('符文实例不存在: ' , Player.Name, RuneUniqueId) return end + + -- 获取装备数据 + local EquipmentProxy = require(ServerStorage.Proxy.EquipmentProxy) + local EquipmentData = EquipmentProxy:GetEquipmentData(Player, EquipmentUniqueId) + + -- 遍历符文查看现在穿了几个 + local wearingCount = 0 + local wearingSlot = {} + for _, RuneData in ArchiveProxy.pData[Player.UserId][STORE_NAME] do + if RuneData.wearing == EquipmentUniqueId then + wearingCount = wearingCount + 1 + table.insert(wearingSlot, RuneData.wearingSlot) + end + end + + -- 检查装备是否有符文槽位 + if EquipmentData.maxRuneNumber <= 0 then + RE_PlayerTip:FireClient(Player, "装备没有符文槽位") + return + end + + -- 检查槽位数量是否充足 + if wearingCount >= EquipmentData.maxRuneNumber then + RE_PlayerTip:FireClient(Player, "装备已满符文槽位") + return + end + + + -- 查找到空槽位 + local emptySlot = {} + for i = 1, EquipmentData.maxRuneNumber do + if not table.find(wearingSlot, i) then + table.insert(emptySlot, i) + end + end + + -- 随机镶嵌槽位 + UniqueData.wearingSlot = emptySlot[Rng:GetRandomInt(1, #emptySlot)] + UniqueData.wearing = EquipmentUniqueId + RuneInstance:SetAttribute("wearing", EquipmentUniqueId) + RuneInstance:SetAttribute("wearingSlot", UniqueData.wearingSlot) +end + +-- 获取随机指定品质符文 +function RuneProxy:GetRandomRuneIdByQuality(Quality: number, ExceptIdList: table) + ExceptIdList = ExceptIdList or {} + local candidateIds = {} + for _, rune in ipairs(JsonRune) do + if not table.find(ExceptIdList, rune.id) and rune.quality == Quality and rune.isInPool then + table.insert(candidateIds, rune.id) + end + end + + if #candidateIds == 0 then + return nil -- 没有可用技能 + end + local rng = Random.new() + local idx = rng:NextInteger(1, #candidateIds) + return candidateIds[idx] +end + + +-- 获取随机技能id +function RuneProxy:GetRandomRuneId(ExceptIdList: table) + ExceptIdList = ExceptIdList or {} + local candidateIds = {} + + -- TODO:这里之后还得做生成品质概率筛选,暂时只产出1级符文 + for _, rune in ipairs(JsonRune) do + local id = rune.id + if not table.find(ExceptIdList, id) and rune.isInPool and rune.quality == 1 then + table.insert(candidateIds, id) + end + end + if #candidateIds == 0 then + return nil -- 没有可用技能 + end + local rng = Random.new() + local idx = rng:NextInteger(1, #candidateIds) + return candidateIds[idx] +end + +-- 获取穿戴中的符文 +function RuneProxy:GetPlayerWearingRuneData(Player: Player) + local wearingRuneUniqueId = {} + local behaviourNames = {} + -- 穿戴中的填入 + local EquipmentProxy = require(ServerStorage.Proxy.EquipmentProxy) + local wearingEquipments = EquipmentProxy:GetPlayerWearingEquipmentUniqueId(Player) + for _, RuneData in ArchiveProxy.pData[Player.UserId][STORE_NAME] do + if RuneData.wearing > 0 and table.find(wearingEquipments, RuneData.wearing) then + table.insert(wearingRuneUniqueId, RuneData.id) + local RuneData = Utils:GetIdDataFromJson(JsonRune, RuneData.orgId) + table.insert(behaviourNames, RuneData.behaviourName) + end + end + return wearingRuneUniqueId, behaviourNames +end + +-- 获取对应装备槽位上的技能 +function RuneProxy:GetPlayerRuneByEquipmentUniqueId(Player: Player, EquipmentUniqueId: number) + local wearingUniqueId, wearingOrgId = {}, {} + local runeFolder = GetPlayerRuneFolder(Player) + for _, RuneInstance in runeFolder:GetChildren() do + if RuneInstance:GetAttribute("wearing") == EquipmentUniqueId then + table.insert(wearingUniqueId, RuneInstance:GetAttribute("uniqueId")) + table.insert(wearingOrgId, RuneInstance:GetAttribute("orgId")) + end + end + return wearingUniqueId, wearingOrgId +end + +-------------------------------------------------------------------------------- + +-- 获取技能属性 +function RuneProxy:GetPlayerRuneWearingAttributes(Player: Player) + -- TODO:暂时没有,之后如果技能附带属性值时再加 +end + +-- 获取玩家属性 +function RuneProxy:GetPlayerAttributes(Player: Player) + local attributesList = {} + attributesList.RuneWearingAttributes = self:GetPlayerRuneWearingAttributes(Player) + return attributesList +end + +-------------------------------------------------------------------------------- + +function RuneProxy:OnPlayerRemoving(Player: Player) + +end + +ReplicatedStorage.Remotes.PlayerRemoving.Event:Connect(function(Player: Player) + RuneProxy:OnPlayerRemoving(Player) +end) + +return RuneProxy \ No newline at end of file diff --git a/src/StarterPlayerScripts/ClientMain/Helper.luau b/src/StarterPlayerScripts/ClientMain/Helper.luau index d76e0fc..a4b0056 100644 --- a/src/StarterPlayerScripts/ClientMain/Helper.luau +++ b/src/StarterPlayerScripts/ClientMain/Helper.luau @@ -16,6 +16,9 @@ UserInputService.InputBegan:Connect(function(input, gameProcessed) RE_PlayerHelper:FireServer("CleanPlayerData") elseif input.KeyCode == Enum.KeyCode.J then RE_PlayerHelper:FireServer("AddItem", {1, 1000}) + RE_PlayerHelper:FireServer("AddItem", {20, 10}) + RE_PlayerHelper:FireServer("AddItem", {21, 10}) + RE_PlayerHelper:FireServer("AddItem", {22, 10}) elseif input.KeyCode == Enum.KeyCode.K then -- RE_UpgradeAttributes:FireServer(1) RE_PlayerHelper:FireServer("AddItem", {2, 1000}) diff --git a/src/StarterPlayerScripts/UI/Common/SpecialShow.luau b/src/StarterPlayerScripts/UI/Common/SpecialShow.luau index 3a9c161..c9ef8c0 100644 --- a/src/StarterPlayerScripts/UI/Common/SpecialShow.luau +++ b/src/StarterPlayerScripts/UI/Common/SpecialShow.luau @@ -9,6 +9,7 @@ local JsonEquipment = require(ReplicatedStorage.Json.Equipment) -- local JsonItemProp = require(ReplicatedStorage.Json.ItemProp) local JsonAttributes = require(ReplicatedStorage.Json.Attributes) local JsonAbility = require(ReplicatedStorage.Json.Ability) +local JsonBlessing = require(ReplicatedStorage.Json.Blessing) function SpecialShow:Init(data: table) local self = {} @@ -45,10 +46,36 @@ function SpecialShow:Refresh() thirdDesc = thirdDesc .. "%" end - print(baseDesc, firstDesc, secondDesc, thirdDesc) self.Variables._tmpDescTitle.Text = Localization:FormatString(baseDesc, firstDesc, secondDesc, thirdDesc) - self.Variables._tmpSpecialRate.Visible = false -- self.Variables._tmpSpecialRate.Text = Localization:GetLanguageData(itemData.nameId) + + -- 特殊祝福通过数据中的特殊标记进行显示设置 + if self.Data.showSpecialBlessing then + self.Variables._tmpSpecialRate.Visible = true + local baseRateDesc, firstRateDesc, secondRateDesc = "", "", "" + local specialRateDesc = "" + if self.Data.blessingId and self.Data.blessingRate then + local blessingData = Utils:GetIdDataFromJson(JsonBlessing, self.Data.blessingId) + if blessingData.type == 1 then + baseRateDesc = Localization:GetLanguageData(1011) + firstRateDesc = Localization:GetLanguageData(Utils:GetIdDataFromJson(JsonAttributes, blessingData.effect).nameId) + elseif blessingData.type == 2 then + baseRateDesc = Localization:GetLanguageData(1012) + firstRateDesc = Localization:GetLanguageData(Utils:GetIdDataFromJson(JsonAbility,blessingData.effect).nameId) + elseif blessingData.type == 3 then + baseRateDesc = Localization:GetLanguageData(1013) + end + secondRateDesc = self.Data.blessingRate .. "%" + specialRateDesc = Localization:FormatString(baseRateDesc, firstRateDesc, secondRateDesc) + else + -- 显示尚未祝福 + specialRateDesc = Localization:GetLanguageData(1010) + end + self.Variables._tmpSpecialRate.Text = specialRateDesc + else + self.Variables._tmpSpecialRate.Visible = false + end + end function SpecialShow:Destroy() diff --git a/src/StarterPlayerScripts/UI/Windows/BlessingWindow/WeaponItem.luau b/src/StarterPlayerScripts/UI/Windows/BlessingWindow/WeaponItem.luau new file mode 100644 index 0000000..550c8a5 --- /dev/null +++ b/src/StarterPlayerScripts/UI/Windows/BlessingWindow/WeaponItem.luau @@ -0,0 +1,124 @@ +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) +local JsonEquipment = require(ReplicatedStorage.Json.Equipment) +local JsonBlessing = require(ReplicatedStorage.Json.Blessing) + +local LocalPlayer = game.Players.LocalPlayer + +local FolderEquipment = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments") + +function WeaponItem:Init(data: table) + local self = {} + self.Data = data + self.Variables = { + ["_imgIcon"] = 0, + ["_tmpName"] = 0, + ["_tmpQuality"] = 0, + ["_btnClick"] = 0, + ["_imgSelected"] = 0, + ["_imgView"] = 0, + + ["_bgNowBlessingFrame"] = 0, + ["_imgNowBlessing"] = 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 = Localization:GetColoredEquipmentQualityDesc(self.Data.Quality) + + local equipmentData = Utils:GetIdDataFromJson(JsonEquipment, self.Data.OrgId) + -- 模型 + local part = FolderEquipment:FindFirstChild(equipmentData.modelName):Clone() + part.Handle.Position = Vector3.new(0, 0, 0) + part.Handle.CFrame = CFrame.new(0, 0, 0) * CFrame.Angles(math.rad(90), 0, 0) + part.Parent = self.Variables["_imgView"] + self.Prefab = part + + -- 相机 + local viewportCamera = Instance.new("Camera") + self.Variables["_imgView"].CurrentCamera = viewportCamera + viewportCamera.Parent = self.Variables["_imgView"] + viewportCamera.CFrame = CFrame.new(Vector3.new(0, 0, 6), part.Handle.Position) + self.ViewCamera = viewportCamera + + -- 如果图鉴没有,就设置成黑色的 + if self.Data.Timestamp == 0 then + part.Handle.Mesh.TextureId = Localization:GetBlackTexture() + end + + -- 宝石显示 + if self.Data.BlessingId then + self.Variables["_imgNowBlessing"].Visible = true + local blessingData = Utils:GetIdDataFromJson(JsonBlessing, self.Data.BlessingId) + local iconId = Utils:GetIdDataFromJson(JsonItemProp, 20 + blessingData.type - 1).iconId + self.Variables["_imgNowBlessing"].Image = Localization:GetImageData(iconId) + else + self.Variables["_imgNowBlessing"].Visible = false + end +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) + + -- 监听属性变化 + local DataFolder = Utils:GetPlayerDataFolder(LocalPlayer):FindFirstChild("Book") + local bookInstance = DataFolder:FindFirstChild(tostring(self.Data.OrgId)) + local bookCon = bookInstance.AttributeChanged:Connect(function(attribute) + local dataKey = nil + if attribute == "blessingId" then + dataKey = "BlessingId" + elseif attribute == "blessingRate" then + dataKey = "BlessingRate" + elseif attribute == "quality" then + dataKey = "Quality" + end + + if dataKey then + self.Data[dataKey] = bookInstance:GetAttribute(attribute) + self:Refresh() + + -- 更新父类显示 + self.TopUI:UpdateDetailInfo(self.Data) + end + end) + table.insert(self.Connections, bookCon) +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/BlessingWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/BlessingWindow/init.luau new file mode 100644 index 0000000..2b4f9ff --- /dev/null +++ b/src/StarterPlayerScripts/UI/Windows/BlessingWindow/init.luau @@ -0,0 +1,249 @@ +--> 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) +local JsonForge = require(ReplicatedStorage.Json.Forge) +local JsonBlessing = require(ReplicatedStorage.Json.Blessing) +local JsonEquipment = require(ReplicatedStorage.Json.Equipment) + +--> Events +local RE_Blessing = ReplicatedStorage.Events.RE_Blessing + +local LocalPlayer = game.Players.LocalPlayer + +local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common") +local SpecialShow = require(CommonFolder:WaitForChild("SpecialShow")) + + +-------------------------------------------------------------------------------- + +local BlessingWindow = {} +BlessingWindow.__index = BlessingWindow +setmetatable(BlessingWindow, {__index = UIWindow}) + +function BlessingWindow:Init(UIManager: table, Data: table?) + local self = UIWindow:Init(UIManager, Data) + setmetatable(self, BlessingWindow) + self.Variables = { + ["_btnBgClose"] = 0, + + ["_goWeaponPanel"] = 0, + ["_btnClose"] = 0, + + ["__listWeaponPackage"] = 0, + -- 详情面板 + ["_btnBlessing"] = 0, + ["_btnMult"] = 0, + ["_imgIcon"] = 0, + ["_tmpName"] = 0, + ["_tmpQuality"] = 0, + + ["_bgNowBlessingFrame"] = 0, + ["_imgNowBlessing"] = 0, + + ["__moneyCoin"] = 0, + ["__listSpecial"] = 0, + ["_goSelectBlessing"] = 0, + + ["_goBlessing1"] = 0, + ["_goBlessing2"] = 0, + ["_goBlessing3"] = 0, + + ["_imgBlessingSelected1"] = 0, + ["_imgBlessingSelected2"] = 0, + ["_imgBlessingSelected3"] = 0, + + ["_btnBlessing1"] = 0, + ["_btnBlessing2"] = 0, + ["_btnBlessing3"] = 0, + + ["__moneyBlessing1"] = 0, + ["__moneyBlessing2"] = 0, + ["__moneyBlessing3"] = 0, + + } + self.MultNumber = 1 + self.MultArray = {1, 2, 5, 10} + self.MultIndex = 1 + self.AutoRecycle = false + self.UIRootName = "ui_w_blessing" + self.UIParentName = UIEnums.UIParent.UIRoot + self.BlessingType = 1 + self.NowDetailBookId = nil + + self.LastActiveItem = nil + + return self +end + +function BlessingWindow:ShowDetailInfo(data: table?) + if data then + self.NowDetailBookId = data.OrgId + + self.Variables["_imgIcon"].Image = Localization:GetImageData(Utils:GetIdDataFromJson(JsonItemProp, data.OrgId).iconId) + self.Variables["_tmpName"].Text = Localization:GetLanguageData(Utils:GetIdDataFromJson(JsonItemProp, data.OrgId).nameId) + self.Variables["_tmpQuality"].Text = Localization:GetColoredEquipmentQualityDesc(data.Quality) + + -- 当前祝福显示 + self.Variables["_imgNowBlessing"].Visible = true + if data.BlessingId then + local blessingData = Utils:GetIdDataFromJson(JsonBlessing, data.BlessingId) + local iconId = Utils:GetIdDataFromJson(JsonItemProp, 20 + blessingData.type - 1).iconId + self.Variables["_imgNowBlessing"].Image = Localization:GetImageData(iconId) + end + + local equipmentData = Utils:GetIdDataFromJson(JsonEquipment, data.OrgId) + -- 祝福顶部特殊显示 + self.Variables["__listSpecial"]:SetData({[1] = { + orgId = data.OrgId, + specialType = equipmentData.specialType, + specialRequire = equipmentData.specialRequire, + showSpecialBlessing = true, + blessingId = data.BlessingId, + blessingRate = data.BlessingRate, + }}) + + else + self.NowDetailBookId = nil + + self.Variables["_imgIcon"].Image = "" + self.Variables["_tmpName"].Text = "" + self.Variables["_tmpQuality"].Text = "" + + self.Variables["_imgNowBlessing"].Visible = false + end +end + +function BlessingWindow:UpdateDetailInfo(data) + if self.NowDetailBookId == data.OrgId then + self:ShowDetailInfo(data) + end +end + +function BlessingWindow:OnClickMult() + self.MultIndex += 1 + if self.MultIndex > #self.MultArray then self.MultIndex = 1 end + self.MultNumber = self.MultArray[self.MultIndex] + self.Variables["_btnMult"].Text = "x" .. self.MultNumber +end + +function BlessingWindow:OnClickBlessing() + if self.LastActiveItem then + local data = self.LastActiveItem.Data + RE_Blessing:FireServer(data.OrgId, self.BlessingType, self.MultNumber) + end +end + +-- 设置祝福类型 +function BlessingWindow:SetBlessingType(type: number) + self.BlessingType = type + for i = 1, 3 do + self.Variables["_imgBlessingSelected" .. i].Visible = i == type + end +end + +function BlessingWindow: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"), + BlessingId = child:GetAttribute("blessingId"), + BlessingRate = child:GetAttribute("blessingRate"), + } + 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"), + BlessingId = child:GetAttribute("blessingId"), + BlessingRate = child:GetAttribute("blessingRate"), + } + self.Variables["__listWeaponPackage"]:AddData(child.Name, 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 createCon = self.Variables["_btnBlessing"].Activated:Connect(function() + self:OnClickBlessing() + end) + + table.insert(self.Connections, bgCloseCon) + table.insert(self.Connections, closeCon) + table.insert(self.Connections, multCon) + table.insert(self.Connections, createCon) + + -- 设置祝福类型 + local blessingBtn1Con = self.Variables["_btnBlessing1"].Activated:Connect(function() + self:SetBlessingType(1) + end) + local blessingBtn2Con = self.Variables["_btnBlessing2"].Activated:Connect(function() + self:SetBlessingType(2) + end) + local blessingBtn3Con = self.Variables["_btnBlessing3"].Activated:Connect(function() + self:SetBlessingType(3) + end) + table.insert(self.Connections, blessingBtn1Con) + table.insert(self.Connections, blessingBtn2Con) + table.insert(self.Connections, blessingBtn3Con) + + -- 默认祝福显示 + self:SetBlessingType(self.BlessingType) + + self.Variables["__listWeaponPackage"]:AddComponent(WeaponItem) + self.Variables["__listWeaponPackage"]:SetData(self.Data) + self.Variables["__listWeaponPackage"]:SetLayoutOrder("OrgId") + + self.Variables["__listSpecial"]:AddComponent(SpecialShow) + + if self.Data then + local minInstance = self.Variables["__listWeaponPackage"]:GetMinLayoutOrderInstance() + if minInstance then + self:ShowDetailInfo(minInstance.Data) + + self.LastActiveItem = minInstance + minInstance:SetSelected(true) + end + else + self:ShowDetailInfo() + end +end + +function BlessingWindow:OnCloseWindow() + UIWindow.OnCloseWindow(self) +end + + + +return BlessingWindow \ No newline at end of file diff --git a/src/StarterPlayerScripts/UI/Windows/CreateWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/CreateWindow/init.luau index b413f55..067ef97 100644 --- a/src/StarterPlayerScripts/UI/Windows/CreateWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/CreateWindow/init.luau @@ -92,8 +92,8 @@ 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 + self.Variables["_tmpName"].Text = Localization:GetLanguageData(Utils:GetIdDataFromJson(JsonItemProp, data.OrgId).nameId) + self.Variables["_tmpQuality"].Text = Localization:GetColoredEquipmentQualityDesc(data.Quality) else self.Variables["_imgIcon"].Image = "" self.Variables["_tmpName"].Text = "" diff --git a/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau b/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau index 3bc4894..0410f85 100644 --- a/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau +++ b/src/StarterPlayerScripts/UI/Windows/MainWindow/init.luau @@ -86,6 +86,7 @@ function MainWindow:Init(UIManager: table, Data: table?) ["_btnMainCha"] = 0, ["_btnMainAttributeUpgrade"] = 0, ["_btnStartChallenge"] = 0, + ["_btnBlessing"] = 0, -- 锻造条 ["_goForgeBar"] = 0, @@ -150,11 +151,15 @@ function MainWindow:OnOpenWindow() local startChallengeCon = self.Variables["_btnStartChallenge"].Activated:Connect(function() self:OnClickChallengeButton() end) + local blessingCon = self.Variables["_btnBlessing"].Activated:Connect(function() + self.UIManager:OpenWindow("BlessingWindow") + end) table.insert(self.Connections, createCon) table.insert(self.Connections, chaCon) table.insert(self.Connections, attributeUpgradeCon) table.insert(self.Connections, startChallengeCon) + table.insert(self.Connections, blessingCon) local challengeLevelEndCon = challengeLevelEndSignal:Connect(function(result: boolean) self.Variables["_btnStartChallenge"].Visible = true