更新
This commit is contained in:
parent
af4fc50c38
commit
4ccf2a6709
BIN
excel/Rune.xlsx
Normal file
BIN
excel/Rune.xlsx
Normal file
Binary file not shown.
Binary file not shown.
BIN
excel/cha.xlsx
BIN
excel/cha.xlsx
Binary file not shown.
Binary file not shown.
BIN
excel/item.xlsx
BIN
excel/item.xlsx
Binary file not shown.
Binary file not shown.
@ -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}
|
||||
]
|
@ -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"},
|
||||
|
@ -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"},
|
||||
|
3
src/ReplicatedStorage/Json/Rune.json
Normal file
3
src/ReplicatedStorage/Json/Rune.json
Normal file
@ -0,0 +1,3 @@
|
||||
[
|
||||
{"id":60000,"type":1,"icon":1,"nameId":20000,"behaviourName":"Attack","recycle":[]}
|
||||
]
|
@ -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
|
||||
|
@ -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
|
@ -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
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
-- 添加图鉴记录
|
||||
|
279
src/ServerStorage/Proxy/RuneProxy.luau
Normal file
279
src/ServerStorage/Proxy/RuneProxy.luau
Normal file
@ -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
|
@ -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})
|
||||
|
@ -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()
|
||||
|
@ -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
|
249
src/StarterPlayerScripts/UI/Windows/BlessingWindow/init.luau
Normal file
249
src/StarterPlayerScripts/UI/Windows/BlessingWindow/init.luau
Normal file
@ -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
|
@ -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 = ""
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user