更新-基础符文ui

This commit is contained in:
gechangfu 2025-08-15 17:28:23 +08:00
parent 47c238cfcd
commit 2d0690f24f
31 changed files with 859 additions and 145 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -70,7 +70,7 @@ function UIWindow:AutoInjectVariables()
end
if not target then
error("自动注入失败未找到UI节点 " .. varName)
error("自动注入失败未找到UI节点 "..self.UIRootName.." "..varName)
end
self.Variables[varName] = target

View File

@ -3,6 +3,7 @@ local SignalEnum = {}
SignalEnum = {
SHOW_ABILITY = "SHOW_ABILITY",
CHALLENGE_LEVEL_END = "CHALLENGE_LEVEL_END",
SELECT_RUNE_INLAY_EQUIPMENT = "SELECT_RUNE_INLAY_EQUIPMENT",
}
return SignalEnum

View File

@ -29,5 +29,6 @@
{"id":52,"type":1,"specialType":null,"effectAttribute":"extraAttributeNumber","battleValue":[1,10],"iconId":28,"nameId":252},
{"id":53,"type":1,"specialType":null,"effectAttribute":"elementNumber","battleValue":[1,10],"iconId":29,"nameId":253},
{"id":54,"type":1,"specialType":null,"effectAttribute":"elementDefNumber","battleValue":[1,10],"iconId":30,"nameId":254},
{"id":55,"type":1,"specialType":null,"effectAttribute":"gemNumber","battleValue":[1,10],"iconId":31,"nameId":255}
{"id":55,"type":1,"specialType":null,"effectAttribute":"gemNumber","battleValue":[1,10],"iconId":31,"nameId":255},
{"id":56,"type":1,"specialType":null,"effectAttribute":"runeNumber","battleValue":[1,10],"iconId":31,"nameId":256}
]

View File

@ -9,5 +9,5 @@
{"id":12,"type":2,"effectAttribute":"extraAttributeNumber","cost":[1,300,0],"lvAdd":[1,1],"battleValueLimit":[5,20],"maxLv":3},
{"id":13,"type":2,"effectAttribute":"elementNumber","cost":[1,300,0],"lvAdd":[1,1],"battleValueLimit":[5,20],"maxLv":3},
{"id":14,"type":2,"effectAttribute":"elementDefNumber","cost":[1,300,0],"lvAdd":[1,1],"battleValueLimit":[5,20],"maxLv":3},
{"id":15,"type":2,"effectAttribute":"gemNumber","cost":[1,300,0],"lvAdd":[1,1],"battleValueLimit":[5,20],"maxLv":3}
{"id":15,"type":2,"effectAttribute":"runeNumber","cost":[1,300,0],"lvAdd":[1,1],"battleValueLimit":[5,20],"maxLv":4}
]

View File

@ -96,5 +96,7 @@
{"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":60000,"type":7,"typeArgs":[],"quality":1,"iconId":60000,"nameId":60000,"textId":80000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}
{"id":60000,"type":7,"typeArgs":[],"quality":4,"iconId":60000,"nameId":60000,"textId":80000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null},
{"id":61000,"type":7,"typeArgs":[],"quality":5,"iconId":61000,"nameId":61000,"textId":61000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null},
{"id":62000,"type":7,"typeArgs":[],"quality":6,"iconId":62000,"nameId":62000,"textId":62000,"buyPrice":[],"sellPrice":[],"use":[],"showPackage":null}
]

View File

@ -45,6 +45,7 @@
{"id":1011,"text":"祝福:出现{0}属性的概率+{1}"},
{"id":1012,"text":"祝福:出现{0}技能的概率+{1}"},
{"id":1013,"text":"祝福:出现{0}晶石的概率+{1}"},
{"id":1200,"text":"该装备无符文槽位"},
{"id":20000,"text":"普攻"},
{"id":20001,"text":"剑气"},
{"id":40000,"text":"测试装备1"},
@ -62,5 +63,8 @@
{"id":40012,"text":"测试装备13"},
{"id":40013,"text":"测试装备14"},
{"id":40014,"text":"测试装备15"},
{"id":40015,"text":"测试装备16"}
{"id":40015,"text":"测试装备16"},
{"id":60000,"text":"火焰伤害符文"},
{"id":61000,"text":"冰棺符文"},
{"id":62000,"text":"测试符文"}
]

View File

@ -45,6 +45,7 @@
{"id":1011,"text":"祝福:出现{0}属性的概率+{1}"},
{"id":1012,"text":"祝福:出现{0}技能的概率+{1}"},
{"id":1013,"text":"祝福:出现{0}晶石的概率+{1}"},
{"id":1200,"text":"该装备无符文槽位"},
{"id":20000,"text":"普攻"},
{"id":20001,"text":"剑气"},
{"id":40000,"text":"测试装备1"},
@ -62,5 +63,8 @@
{"id":40012,"text":"测试装备13"},
{"id":40013,"text":"测试装备14"},
{"id":40014,"text":"测试装备15"},
{"id":40015,"text":"测试装备16"}
{"id":40015,"text":"测试装备16"},
{"id":60000,"text":"火焰伤害符文"},
{"id":61000,"text":"冰棺符文"},
{"id":62000,"text":"测试符文"}
]

View File

@ -1,3 +1,5 @@
[
{"id":60000,"type":1,"icon":1,"nameId":20000,"behaviourName":"Attack","recycle":[]}
{"id":60000,"quality":1,"type":1,"icon":1,"nameId":60000,"runeName":"RuneFireDamage","behaviorName":null,"recycle":[],"isInPool":1},
{"id":61000,"quality":2,"type":1,"icon":1,"nameId":61000,"runeName":"RuneIceCoffin","behaviorName":"IceCoffin","recycle":[],"isInPool":1},
{"id":62000,"quality":3,"type":1,"icon":1,"nameId":62000,"runeName":null,"behaviorName":null,"recycle":[],"isInPool":1}
]

View File

@ -50,6 +50,16 @@ function Utils:GenUniqueId(t: table)
return min_id
end
function Utils:GenUniqueIdString(t: table)
local min_id = 1
while t[tostring(min_id)] ~= nil do
min_id = min_id + 1
end
return tostring(min_id)
end
function Utils:GenUniqueIdPlayerAI(LastTime: number, Counter: number)
local now = os.time() -- 或 tick(),精度更高
if now ~= LastTime then

View File

@ -28,6 +28,9 @@ function ItemProxy:AddItem(Player: Player, ItemId: number, ItemCount: number)
elseif ItemData.type == 3 then
local BookProxy = require(script.Parent.BookProxy)
BookProxy:UnlockBook(Player, ItemId - 10000)
elseif ItemData.type == 7 then
local RuneProxy = require(script.Parent.RuneProxy)
RuneProxy:AddRune(Player, ItemId)
else
PlayerInfoProxy:ChangeItemCount(Player, ItemId, ItemCount)
end

View File

@ -17,6 +17,8 @@ local JsonRune = require(ReplicatedStorage.Json.Rune)
--> Events
local RE_PlayerTip = ReplicatedStorage.Events.RE_PlayerTip
local RE_RuneInlay = ReplicatedStorage.Events.RE_RuneInlay
local RE_RuneCombine = ReplicatedStorage.Events.RE_RuneCombine
--> SubFunctions
local RuneCalculation = require(script.RuneCalculation)
@ -65,7 +67,7 @@ function RuneProxy:AddRune(Player: Player, RuneId: number)
local RuneData = Utils:GetIdDataFromJson(JsonRune, RuneId)
if not RuneData then return end
local UniqueId = Utils:GenUniqueId(ArchiveProxy.pData[Player.UserId][STORE_NAME])
local UniqueId = Utils:GenUniqueIdString(ArchiveProxy.pData[Player.UserId][STORE_NAME])
-- 配置表内容
local ResultData = {}
for key, value in pairs(RuneData) do
@ -86,11 +88,22 @@ function RuneProxy:AddRune(Player: Player, RuneId: number)
end
-- 合成符文
function RuneProxy:CombineRune(Player: Player, RuneData: table)
function RuneProxy:CombineRune(Player: Player, RuneIds: table)
local pData = Utils:GetPlayerDataFolder(Player)
if not pData then return end
if #RuneData ~= 3 then warn('符文合成数量不正确', Player.Name, RuneData) return end
if #RuneIds ~= 3 then warn('符文合成数量不正确', Player.Name, RuneIds) return end
-- 查看符文id是否相同相同则返回
if RuneIds[1] == RuneIds[2] and RuneIds[2] == RuneIds[3] then warn('符文id相同', Player.Name, RuneIds) return end
local RuneData = {}
for _, RuneId in RuneIds do
RuneId = tostring(RuneId)
local RuneInstance = GetPlayerRuneFolder(Player):FindFirstChild(RuneId)
if not RuneInstance then warn('符文实例不存在', Player.Name, RuneId) return end
table.insert(RuneData, RuneInstance:GetAttributes())
end
-- 获取合成符文数据
local sameQuality = true
@ -110,20 +123,24 @@ function RuneProxy:CombineRune(Player: Player, RuneData: table)
-- 添加合成符文
local newRuneId = self:GetRandomRuneIdByQuality(higherQuality)
if not newRuneId then warn('合成符文不存在', Player.Name, RuneData) return end
self:AddRune(Player, newRuneId)
local newRuneData, newRuneInstance = self:AddRune(Player, newRuneId)
-- 销毁符文
for _, rune in RuneData do self:DestroyRune(Player, rune.id) end
-- 发送给前端结果信息
RE_RuneCombine:FireClient(Player, newRuneData.id, newRuneData.orgId)
end
-- 销毁符文
function RuneProxy:DestroyRune(Player: Player, UniqueId: number)
local pData = Utils:GetPlayerDataFolder(Player)
if not pData then return end
UniqueId = tostring(UniqueId)
-- 获取符文实例存储数据
local UniqueData = ArchiveProxy.pData[Player.UserId][UniqueId]
if not UniqueData then return end
local UniqueData = ArchiveProxy.pData[Player.UserId][STORE_NAME][UniqueId]
if not UniqueData then warn('UniqueData不存在', Player.Name, UniqueId) return end
-- 检查是否有符文实例
local RuneInstance = GetPlayerRuneFolder(Player):FindFirstChild(UniqueId)
@ -131,7 +148,7 @@ function RuneProxy:DestroyRune(Player: Player, UniqueId: number)
-- 销毁
RuneInstance:Destroy()
ArchiveProxy.pData[Player.UserId][UniqueId] = nil
ArchiveProxy.pData[Player.UserId][STORE_NAME][UniqueId] = nil
end
-- 穿戴符文
@ -292,4 +309,8 @@ RE_RuneInlay.OnServerEvent:Connect(function(Player: Player, RuneUniqueId: number
RuneProxy:WearRune(Player, RuneUniqueId, EquipmentUniqueId)
end)
RE_RuneCombine.OnServerEvent:Connect(function(Player: Player, RuneData: table)
RuneProxy:CombineRune(Player, RuneData)
end)
return RuneProxy

View File

@ -22,6 +22,9 @@ UserInputService.InputBegan:Connect(function(input, gameProcessed)
elseif input.KeyCode == Enum.KeyCode.K then
-- RE_UpgradeAttributes:FireServer(1)
RE_PlayerHelper:FireServer("AddItem", {2, 1000})
RE_PlayerHelper:FireServer("AddItem", {60000, 1})
RE_PlayerHelper:FireServer("AddItem", {61000, 1})
RE_PlayerHelper:FireServer("AddItem", {62000, 1})
elseif input.KeyCode == Enum.KeyCode.L then
RE_UpgradeAttributes:FireServer(2)
elseif input.KeyCode == Enum.KeyCode.M then

View File

@ -0,0 +1,42 @@
local EquipmentModelDetail = {}
--> Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--> Json
local JsonEquipment = require(ReplicatedStorage.Json.Equipment)
--> Components
local Utils = require(ReplicatedStorage.Tools.Utils)
--> Prefabs
local FolderEquipmentPrefabs = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments")
function EquipmentModelDetail:ShowDetail(prefab: Instance, orgId: number, isRotation: boolean?)
-- 模型展示
local equipmentData = Utils:GetIdDataFromJson(JsonEquipment, orgId)
local part = FolderEquipmentPrefabs: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 = prefab
-- 相机
local viewportCamera = Instance.new("Camera")
prefab.CurrentCamera = viewportCamera
viewportCamera.Parent = prefab
viewportCamera.CFrame = CFrame.new(Vector3.new(0, 0, 6), part.Handle.Position)
local taskRotation = nil
if isRotation then
taskRotation = task.spawn(function()
while true do
part.Handle.CFrame = part.Handle.CFrame * CFrame.Angles(0, 0, 0.01)
task.wait(0.01)
end
end)
end
return taskRotation, part, viewportCamera
end
return EquipmentModelDetail

View File

@ -10,6 +10,13 @@ local JsonItemProp = require(ReplicatedStorage.Json.ItemProp)
local FolderEquipment = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments")
--> Variables
local LocalPlayer = game.Players.LocalPlayer
--> Components
local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common")
local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail"))
function PackageShow:Init(data: table)
local self = {}
self.Data = data
@ -34,20 +41,8 @@ function PackageShow:Refresh()
self.Variables._tmpQuality.Text = Localization:GetColoredEquipmentQualityDesc(self.Data.quality)
self.Variables._tmpName.Text = Localization:GetLanguageData(itemData.nameId)
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
-- 模型展示
EquipmentModelDetail:ShowDetail(self.Variables["_imgView"], self.Data.orgId, false)
end
function PackageShow:OnInitFinish()

View File

@ -10,6 +10,11 @@ local JsonItemProp = require(ReplicatedStorage.Json.ItemProp)
local FolderEquipment = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments")
local LocalPlayer = game.Players.LocalPlayer
local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common")
local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail"))
function WearingShow:Init(data: table)
local self = {}
self.Data = data
@ -43,21 +48,8 @@ function WearingShow:Refresh()
self.Variables._tmpQuality.Text = Localization:GetColoredEquipmentQualityDesc(self.Data.quality)
self.Variables._tmpName.Text = Localization:GetLanguageData(itemData.nameId)
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
-- 模型展示
EquipmentModelDetail:ShowDetail(self.Variables["_imgView"], self.Data.orgId, false)
end
end

View File

@ -0,0 +1,54 @@
local PackageShow = {}
PackageShow.__index = PackageShow
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Utils = require(ReplicatedStorage.Tools.Utils)
local Localization = require(ReplicatedStorage.Tools.Localization)
local JsonRune = require(ReplicatedStorage.Json.Rune)
local JsonItemProp = require(ReplicatedStorage.Json.ItemProp)
function PackageShow:Init(data: table)
local self = {}
self.Data = data
self.Variables = {
["_btnClick"] = 0,
["_imgIcon"] = 0,
["_tmpName"] = 0,
["_imgView"] = 0,
}
self.Connections = {}
setmetatable(self, PackageShow)
return self
end
function PackageShow:Refresh()
local itemData = Utils:GetIdDataFromJson(JsonItemProp, self.Data.orgId)
local runeData = Utils:GetIdDataFromJson(JsonRune, self.Data.orgId)
self.Variables._imgIcon.Image = Localization:GetImageData(runeData.icon)
self.Variables._imgIcon.BackgroundColor3 = Localization:GetRuneQualityBgColor(runeData.quality)
self.Variables._tmpName.Text = Localization:GetLanguageData(itemData.nameId)
end
function PackageShow:OnInitFinish()
local con = self.Variables._btnClick.MouseButton1Click:Connect(function()
if self.Data == {} then
-- TODO: 之后做提示弹窗
else
self.TopUI:WearRefresh(self.Data)
end
end)
table.insert(self.Connections, con)
end
function PackageShow:Destroy()
for k, v in pairs(self) do
self[k] = nil
end
self = nil
end
return PackageShow

View File

@ -0,0 +1,60 @@
local WearingShow = {}
WearingShow.__index = WearingShow
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Utils = require(ReplicatedStorage.Tools.Utils)
local Localization = require(ReplicatedStorage.Tools.Localization)
local JsonRune = require(ReplicatedStorage.Json.Rune)
local JsonItemProp = require(ReplicatedStorage.Json.ItemProp)
function WearingShow:Init(data: table)
local self = {}
self.Data = data
self.Variables = {
["_btnClick"] = 0,
["_imgIcon"] = 0,
["_tmpName"] = 0,
["_imgView"] = 0,
}
self.Connections = {}
setmetatable(self, WearingShow)
return self
end
function WearingShow:Refresh()
if self.Data.instance then
local itemData = Utils:GetIdDataFromJson(JsonItemProp, self.Data.orgId)
local runeData = Utils:GetIdDataFromJson(JsonRune, self.Data.orgId)
self.Variables._imgIcon.Image = Localization:GetImageData(runeData.icon)
self.Variables._imgIcon.BackgroundColor3 = Localization:GetRuneQualityBgColor(runeData.quality)
self.Variables._tmpName.Text = Localization:GetLanguageData(itemData.nameId)
self.Variables._imgIcon.Visible = true
else
self.Variables._imgIcon.Image = ""
self.Variables._tmpName.Text = ""
self.Variables._imgIcon.Visible = false
end
end
function WearingShow:OnInitFinish()
local con = self.Variables._btnClick.MouseButton1Click:Connect(function()
if self.Data.instance then
self.TopUI:UnwearRefresh(self.Data)
end
end)
table.insert(self.Connections, con)
end
function WearingShow:Destroy()
print("Destroy WearingShow")
for k, v in pairs(self) do
self[k] = nil
end
self = nil
end
return WearingShow

View File

@ -0,0 +1,300 @@
--> Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--> Dependencies
local UIWindow = require(ReplicatedStorage.Base.UIWindow)
local UIEnums = require(ReplicatedStorage.Base.UIEnums)
--> Components
local WearingShow = require(script.WearingShow)
local PackageShow = require(script.PackageShow)
--> Dependencies
local Utils = require(ReplicatedStorage.Tools.Utils)
local Localization = require(ReplicatedStorage.Tools.Localization)
--> Json
local JsonAttributesUpgrade = require(ReplicatedStorage.Json.AttributesUpgrade)
local JsonRune = require(ReplicatedStorage.Json.Rune)
local JsonEquipment = require(ReplicatedStorage.Json.Equipment)
--> Events
local RE_RuneCombine = ReplicatedStorage.Events.RE_RuneCombine
--> Variables
local LocalPlayer = game.Players.LocalPlayer
--> Prefabs
local FolderEquipmentPrefabs = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments")
local EquipmentFolder = Utils:WaitPlayerDataFolder(LocalPlayer):WaitForChild("Equipment")
local DataFolder = Utils:WaitPlayerDataFolder(LocalPlayer):WaitForChild("Rune")
local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common")
local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail"))
--------------------------------------------------------------------------------
local CombineRuneWindow = {}
CombineRuneWindow.__index = CombineRuneWindow
setmetatable(CombineRuneWindow, {__index = UIWindow})
local MAX_RUNE_COMBINE_NUMBER = 3
function CombineRuneWindow:Init(UIManager: table, Data: table?)
local self = UIWindow:Init(UIManager, Data)
setmetatable(self, CombineRuneWindow)
self.Variables = {
["_goRunePanel"] = 0,
["__listRunePackage"] = 0,
["__listRuneCombine"] = 0,
["_tmpCombatValue"] = 0,
["_imgIcon"] = 0,
["_bgNewSelectFrame"] = 0,
["_imgNewRune"] = 0,
["_tmpNewRuneName"] = 0,
["_btnClose"] = 0,
["_btnBgClose"] = 0,
["_btnCombineRune"] = 0,
}
self.UIRootName = "ui_w_combine_rune"
self.UIParentName = UIEnums.UIParent.UIRoot
return self
end
function CombineRuneWindow:ShowCombineRuneResult(uniqueId: number, orgId: number)
if uniqueId then
local runeData = Utils:GetIdDataFromJson(JsonRune, orgId)
self.Variables["_tmpNewRuneName"].Text = Localization:GetLanguageData(runeData.nameId)
self.Variables["_imgNewRune"].Image = Localization:GetImageData(runeData.icon)
self.Variables["_imgNewRune"].BackgroundColor3 = Localization:GetRuneQualityBgColor(runeData.quality)
self.Variables["_imgNewRune"].Transparency = 0
else
self.NowSelectRuneId = nil
self.Variables["_tmpNewRuneName"].Text = ""
self.Variables["_imgNewRune"].Image = ""
self.Variables["_imgNewRune"].BackgroundColor3 = Color3.fromRGB(0, 0, 0)
self.Variables["_imgNewRune"].Transparency = 1
end
end
function CombineRuneWindow:WearRefresh(data: table)
-- 清除之前的显示内容
self:ShowCombineRuneResult()
-- 选择符文排查
local newSlot = self:GetEmptySlot()
if newSlot == 0 then warn("没有空槽位") return end
local isExist, isNotSameQuality = false, false
for i = 1, MAX_RUNE_COMBINE_NUMBER do
if self.Data.SelectRune["slot"..i].instance == data.instance then
isExist = true
break
elseif self.Data.SelectRune["slot"..i].quality then
if self.Data.SelectRune["slot"..i].quality ~= data.quality then
isNotSameQuality = true
break
end
end
end
if isExist then warn("槽位上已经存在该符文") return end
if isNotSameQuality then warn("符文品质不同无法穿戴") return end
-- 是否为相同品质且品质<3的符文
if data.quality >= 3 then warn("品质大于等于3的符文不能穿戴") return end
self.Variables["__listRuneCombine"]:RemoveData("slot"..newSlot)
self.Variables["__listRunePackage"]:RemoveData(tostring(data.id))
data.wearingSlot = newSlot
self.Variables["__listRuneCombine"]:AddData("slot"..newSlot, data)
end
function CombineRuneWindow:UnwearRefresh(data: table)
local oldSlot = data.wearingSlot
self.Variables["__listRuneCombine"]:RemoveData("slot"..oldSlot)
self.Variables["__listRunePackage"]:AddData(tostring(data.id), data)
self.Data.SelectRune["slot"..oldSlot] = {
wearingSlot = oldSlot,
}
self.Variables["__listRuneCombine"]:AddData("slot"..oldSlot, self.Data.SelectRune["slot"..oldSlot])
end
function CombineRuneWindow:CombineRune()
local combineRuneIds = {}
for i = 1, MAX_RUNE_COMBINE_NUMBER do
if not self.Data.SelectRune["slot"..i].instance then
warn("符文槽位"..i.."为空")
return
else
table.insert(combineRuneIds, self.Data.SelectRune["slot"..i].id)
end
end
RE_RuneCombine:FireServer(combineRuneIds)
end
function CombineRuneWindow:GetEmptySlot()
for i = 1, MAX_RUNE_COMBINE_NUMBER do
if self.Data.SelectRune["slot"..i].instance == nil then
return i
end
end
return 0
end
function CombineRuneWindow:AddInstanceData(configInstance: Instance, Data: table?, isSelect: boolean?)
local data = self.Data
if Data then data = Data end
local attributes = configInstance:GetAttributes()
-- 归类是否是穿戴的装备
local parentName, secondName = "PackageRune", configInstance.Name
if attributes.wearing == self.ShowEquipmentId then
parentName = "SelectRune"
secondName = "slot"..attributes.wearingSlot
end
if isSelect then
parentName = "SelectRune"
-- 是否有空槽位判断
local notHasEmptySlot = true
for i = 1, MAX_RUNE_COMBINE_NUMBER do
if self.Data.SelectRune["slot"..i].instance == nil then
notHasEmptySlot = false
secondName = "slot"..i
break
end
end
if notHasEmptySlot then warn("没有空槽位") return end
end
data[parentName][secondName] = {}
for attributeKey, attributeValue in attributes do
data[parentName][secondName][attributeKey] = attributeValue
end
data[parentName][secondName].instance = configInstance
return data[parentName][secondName], parentName
end
function CombineRuneWindow:RemoveInstanceData(configInstance: Instance, Data: table?)
for key, data in pairs(self.Data.SelectRune) do
if data.instance == configInstance then
return tostring(key), "SelectRune"
end
end
for key, data in pairs(self.Data.PackageRune) do
if data.instance == configInstance then
return tostring(key), "PackageRune"
end
end
return nil
end
function CombineRuneWindow:CleanSelectData()
for i = 1, MAX_RUNE_COMBINE_NUMBER do
self.Data.SelectRune["slot" .. i] = {
wearingSlot = i,
wearing = 0,
}
end
end
function CombineRuneWindow:ShowWearingSlot()
-- 清除旧数据
if self.Data then
if self.Data.SelectRune then
self.Data.SelectRune = nil
end
if self.Data.PackageRune then
self.Data.PackageRune = nil
end
end
self.Data = {
SelectRune = {},
PackageRune = {},
}
-- 添加符文数据
for _, child in DataFolder:GetChildren() do
self:AddInstanceData(child, self.Data)
end
-- 补充空槽位
for i = 1, MAX_RUNE_COMBINE_NUMBER do
local isExist = false
for k, data in pairs(self.Data.SelectRune) do
if data.wearingSlot == 0 and data.wearing == 0 then
isExist = true
break
end
end
if not isExist then
self.Data.SelectRune["slot" .. i] = {
wearingSlot = i,
wearing = 0,
}
end
end
self:SetData(self.Data)
self.Variables["__listRunePackage"]:SetData(self.Data.PackageRune)
self.Variables["__listRuneCombine"]:SetData(self.Data.SelectRune)
end
function CombineRuneWindow:OnOpenWindow()
UIWindow.OnOpenWindow(self)
self.Variables["__listRunePackage"]:AddComponent(PackageShow)
self.Variables["__listRuneCombine"]:AddComponent(WearingShow)
local bgCloseCon = self.Variables["_btnBgClose"].Activated:Connect(function()
self.UIManager:CloseWindow(script.Name)
end)
local closeCon = self.Variables["_btnClose"].Activated:Connect(function()
self.UIManager:CloseWindow(script.Name)
end)
table.insert(self.Connections, bgCloseCon)
table.insert(self.Connections, closeCon)
self:ShowWearingSlot()
local addCon = DataFolder.ChildAdded:Connect(function(child)
local data, parentName = self:AddInstanceData(child, self.Data)
if parentName == "SelectRune" then
self.Variables["__listRuneCombine"]:AddData("slot"..data.wearingSlot, data)
else
self.Variables["__listRunePackage"]:AddData(child.Name, data)
end
end)
local removeCon = DataFolder.ChildRemoved:Connect(function(child)
-- TODO: 这里清除逻辑不清晰,之后优化
local key, parentName = self:RemoveInstanceData(child, self.Data)
if parentName == "SelectRune" then
local removeIndex = self.Variables["__listRuneCombine"]:RemoveData(key)
else
local removeIndex = self.Variables["__listRunePackage"]:RemoveData(key)
end
end)
table.insert(self.Connections, addCon)
table.insert(self.Connections, removeCon)
self.Variables["__listRuneCombine"]:SetLayoutOrder("wearingSlot")
local combineCon = self.Variables["_btnCombineRune"].Activated:Connect(function()
self:CombineRune()
end)
table.insert(self.Connections, combineCon)
local combineResultCon = RE_RuneCombine.OnClientEvent:Connect(function(uniqueId, orgId)
self:ShowCombineRuneResult(uniqueId, orgId)
end)
table.insert(self.Connections, combineResultCon)
end
function CombineRuneWindow:OnCloseWindow()
UIWindow.OnCloseWindow(self)
end
return CombineRuneWindow

View File

@ -12,6 +12,10 @@ local JsonEquipment = require(ReplicatedStorage.Json.Equipment)
local FolderEquipment = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments")
local LocalPlayer = game.Players.LocalPlayer
local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common")
local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail"))
function WeaponItem:Init(data: table)
local self = {}
self.Data = data
@ -40,21 +44,10 @@ function WeaponItem:Refresh()
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"]
-- 模型展示
local taskRotation, part = EquipmentModelDetail:ShowDetail(self.Variables["_imgView"], self.Data.OrgId, false)
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()

View File

@ -22,6 +22,10 @@ local RE_Forge = ReplicatedStorage.Events.RE_Forge
local LocalPlayer = game.Players.LocalPlayer
--> Components
local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common")
local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail"))
--------------------------------------------------------------------------------
@ -70,6 +74,7 @@ function CreateWindow:Init(UIManager: table, Data: table?)
-- 详情面板
["_btnCreate"] = 0,
["_btnMult"] = 0,
["_imgView"] = 0,
["_imgIcon"] = 0,
["_tmpName"] = 0,
["_tmpQuality"] = 0,
@ -84,6 +89,9 @@ function CreateWindow:Init(UIManager: table, Data: table?)
self.UIRootName = "ui_w_create"
self.UIParentName = UIEnums.UIParent.UIRoot
self.OldPrefab = nil
self.OldViewportCamera = nil
self.LastActiveItem = nil
return self
@ -94,10 +102,21 @@ function CreateWindow:ShowDetailInfo(data: table?)
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)
local taskRotation, part, viewportCamera = EquipmentModelDetail:ShowDetail(self.Variables["_imgView"], data.OrgId, false)
self.OldPrefab = part
self.OldViewportCamera = viewportCamera
else
self.Variables["_imgIcon"].Image = ""
self.Variables["_tmpName"].Text = ""
self.Variables["_tmpQuality"].Text = ""
if self.OldPrefab then
self.OldPrefab:Destroy()
self.OldViewportCamera:Destroy()
self.OldPrefab = nil
self.OldViewportCamera = nil
end
end
end

View File

@ -27,6 +27,7 @@ local LocalPlayer = game.Players.LocalPlayer
--> Common
local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common")
local SpecialShow = require(CommonFolder:WaitForChild("SpecialShow"))
local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail"))
local FolderEquipment = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments")
@ -203,21 +204,12 @@ function EquipmentDetailWindow:OnOpenWindow()
self.Variables["_tmpQuality"].Text = Localization:GetColoredEquipmentQualityDesc(equipmentInstance:GetAttribute("quality"))
self.Variables["_tmpCombatValue"].Text = 0
local equipmentData = Utils:GetIdDataFromJson(JsonEquipment, equipmentInstance:GetAttribute("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"]
local taskRotation, part, viewportCamera = EquipmentModelDetail:ShowDetail(self.Variables["_imgView"], equipmentInstance:GetAttribute("orgId"), false)
self.TaskRotation = taskRotation
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
-- 穿戴状态按钮显示
self.Variables["_btnUnwear"].Visible = self.Data.base.wearing ~= 0

View File

@ -11,6 +11,10 @@ local JsonAttributes = require(ReplicatedStorage.Json.Attributes)
local FolderEquipment = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments")
local LocalPlayer = game.Players.LocalPlayer
local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common")
local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail"))
function EquipmentShow:Init(data: table)
local self = {}
self.Data = data
@ -25,29 +29,11 @@ function EquipmentShow:Init(data: table)
end
function EquipmentShow:Refresh()
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"]
local taskRotation, part, viewportCamera = EquipmentModelDetail:ShowDetail(self.Variables["_imgView"], self.Data.orgId, true)
self.TaskRotation = taskRotation
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
-- 旋转
self.taskRotation = task.spawn(function()
while true do
self.Prefab.Handle.CFrame = self.Prefab.Handle.CFrame * CFrame.Angles(0, 0, 0.01)
task.wait(0.01)
end
end)
print(taskRotation, part, viewportCamera)
end
function EquipmentShow:OnInitFinish()
@ -64,9 +50,10 @@ function EquipmentShow:Destroy()
v:Disconnect()
end
end
if self.taskRotation then
task.cancel(self.taskRotation)
self.taskRotation = nil
if self.TaskRotation then
task.cancel(self.TaskRotation)
self.TaskRotation = nil
end
for k, v in pairs(self) do
self[k] = nil

View File

@ -88,6 +88,7 @@ function MainWindow:Init(UIManager: table, Data: table?)
["_btnStartChallenge"] = 0,
["_btnBlessing"] = 0,
["_btnRune"] = 0,
["_btnRuneCombine"] = 0,
-- 锻造条
["_goForgeBar"] = 0,
@ -158,6 +159,9 @@ function MainWindow:OnOpenWindow()
local runeCon = self.Variables["_btnRune"].Activated:Connect(function()
self.UIManager:OpenWindow("RuneWindow")
end)
local combineRuneCon = self.Variables["_btnRuneCombine"].Activated:Connect(function()
self.UIManager:OpenWindow("CombineRuneWindow")
end)
table.insert(self.Connections, createCon)
table.insert(self.Connections, chaCon)
@ -165,6 +169,7 @@ function MainWindow:OnOpenWindow()
table.insert(self.Connections, startChallengeCon)
table.insert(self.Connections, blessingCon)
table.insert(self.Connections, runeCon)
table.insert(self.Connections, combineRuneCon)
local challengeLevelEndCon = challengeLevelEndSignal:Connect(function(result: boolean)
self.Variables["_btnStartChallenge"].Visible = true

View File

@ -38,7 +38,7 @@ function PackageShow:OnInitFinish()
if self.Data == {} then
-- TODO: 之后做提示弹窗
else
self.TopUI:ShowDetailData(self.Data.id)
self.TopUI:ShowDetailData(self.Data.id, self.Data.orgId)
end
end)
table.insert(self.Connections, con)

View File

@ -8,22 +8,33 @@ local UIEnums = require(ReplicatedStorage.Base.UIEnums)
--> Components
local WearingShow = require(script.WearingShow)
local PackageShow = require(script.PackageShow)
--> Dependencies
local Utils = require(ReplicatedStorage.Tools.Utils)
local Localization = require(ReplicatedStorage.Tools.Localization)
--> Json
local JsonAttributesUpgrade = require(ReplicatedStorage.Json.AttributesUpgrade)
local JsonRune = require(ReplicatedStorage.Json.Rune)
local JsonItem = require(ReplicatedStorage.Json.ItemProp)
local JsonEquipment = require(ReplicatedStorage.Json.Equipment)
--> Events
local RE_RuneInlay = ReplicatedStorage.Events.RE_RuneInlay
--> Variables
local LocalPlayer = game.Players.LocalPlayer
--> Prefabs
local FolderEquipmentPrefabs = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments")
local EquipmentFolder = Utils:WaitPlayerDataFolder(LocalPlayer):WaitForChild("Equipment")
local DataFolder = Utils:WaitPlayerDataFolder(LocalPlayer):WaitForChild("Rune")
local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common")
local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail"))
--> Signals
local Signal = require(ReplicatedStorage.Tools.Signal)
local selectRuneInlayEquipmentSignal = Signal.new(Signal.ENUM.SELECT_RUNE_INLAY_EQUIPMENT)
--------------------------------------------------------------------------------
local RuneWindow = {}
@ -37,29 +48,35 @@ function RuneWindow:Init(UIManager: table, Data: table?)
["_goRunePanel"] = 0,
["__listRunePackage"] = 0,
["__listRuneWearing"] = 0,
["_tmpCombatValue"] = 0,
["_tmpName"] = 0,
["_tmpQuality"] = 0,
["_imgIcon"] = 0,
["_bgNowSelectFrame"] = 0,
["_imgNowRune"] = 0,
["_tmpNowRuneName"] = 0,
["_tmpMaxRuneEmpty"] = 0,
["_imgView"] = 0,
["_btnClose"] = 0,
["_btnBgClose"] = 0,
["_btnInlay"] = 0,
["_btnChangeEquipment"] = 0,
}
self.UIRootName = "ui_w_rune"
self.UIParentName = UIEnums.UIParent.UIRoot
self.ShowEquipmentId = nil
self.NowSelectRuneId = nil
self.NowMaxRuneNumber = 0
return self
end
function RuneWindow:ShowDetailData(uniqueId: number)
function RuneWindow:ShowDetailData(uniqueId: number, orgId: number)
if uniqueId then
if self.NowMaxRuneNumber == 0 then warn("当前最大符文数量为0") return end
self.NowSelectRuneId = uniqueId
local runeData = Utils:GetIdDataFromJson(JsonRune, uniqueId)
local runeData = Utils:GetIdDataFromJson(JsonRune, orgId)
self.Variables["_tmpNowRuneName"].Text = Localization:GetLanguageData(runeData.nameId)
self.Variables["_imgNowRune"].Image = Localization:GetImageData(runeData.icon)
self.Variables["_imgNowRune"].BackgroundColor3 = Localization:GetRuneQualityBgColor(runeData.quality)
@ -73,6 +90,18 @@ function RuneWindow:ShowDetailData(uniqueId: number)
end
end
function RuneWindow:RefreshEquipmentName()
if self.ShowEquipmentId then
local equipmentInstance = EquipmentFolder:FindFirstChild(self.ShowEquipmentId)
local itemData = Utils:GetIdDataFromJson(JsonItem, equipmentInstance:GetAttribute("orgId"))
self.Variables["_tmpName"].Text = Localization:GetLanguageData(itemData.nameId)
self.Variables["_tmpQuality"].Text = Localization:GetColoredEquipmentQualityDesc(equipmentInstance:GetAttribute("quality"))
else
self.Variables["_tmpName"].Text = ""
self.Variables["_tmpQuality"].Text = ""
end
end
function RuneWindow:WearRefresh(data: table)
local newSlot = data.instance:GetAttribute("wearing")
self.Variables["__listRuneWearing"]:RemoveData("slot"..newSlot)
@ -101,7 +130,7 @@ function RuneWindow:InlayRune()
if self.NowSelectRuneId and self.ShowEquipmentId then
RE_RuneInlay:FireClient(self.NowSelectRuneId, self.ShowEquipmentId)
end
end
end
function RuneWindow:AddInstanceData(configInstance: Instance, Data: table?)
local data = self.Data
@ -137,6 +166,65 @@ function RuneWindow:RemoveInstanceData(configInstance: Instance, Data: table?)
return nil
end
function RuneWindow:ShowWearingSlot()
-- 清除旧数据
if self.Data then
if self.Data.WearingRune then
self.Data.WearingRune = nil
end
if self.Data.PackageRune then
self.Data.PackageRune = nil
end
end
self.Data = {
WearingRune = {},
PackageRune = {},
}
local equipmentInstance = EquipmentFolder:FindFirstChild(self.ShowEquipmentId)
local maxRuneNumber = equipmentInstance:GetAttribute("maxRuneNumber")
self.NowMaxRuneNumber = maxRuneNumber
self:RefreshEquipmentName()
-- 模型展示
EquipmentModelDetail:ShowDetail(self.Variables["_imgView"], equipmentInstance:GetAttribute("orgId"), false)
-- 如果当前最大槽位数为0刷新至空显示
if maxRuneNumber <= 0 then
self:ShowDetailData()
self.Variables["_bgNowSelectFrame"].Visible = false
self.Variables["_tmpMaxRuneEmpty"].Text = Localization:GetLanguageData(1200)
self.Variables["_tmpMaxRuneEmpty"].Visible = true
else
self.Variables["_bgNowSelectFrame"].Visible = true
self.Variables["_tmpMaxRuneEmpty"].Visible = false
end
-- 补充空槽位
for i = 1, self.NowMaxRuneNumber do
local isExist = false
for k, data in pairs(self.Data.WearingRune) do
if data.wearingSlot == i then
isExist = true
break
end
end
if not isExist then
self.Data.WearingRune["slot" .. i] = {
wearingSlot = i,
}
end
end
-- 添加符文数据
for _, child in DataFolder:GetChildren() do
self:AddInstanceData(child, self.Data)
end
self:SetData(self.Data)
self.Variables["__listRunePackage"]:SetData(self.Data.PackageRune)
self.Variables["__listRuneWearing"]:SetData(self.Data.WearingRune)
end
function RuneWindow:OnOpenWindow()
UIWindow.OnOpenWindow(self)
self.Variables["__listRunePackage"]:AddComponent(PackageShow)
@ -151,16 +239,8 @@ function RuneWindow:OnOpenWindow()
table.insert(self.Connections, bgCloseCon)
table.insert(self.Connections, closeCon)
-- 自己进行数据处理
local DataFolder = Utils:WaitPlayerDataFolder(LocalPlayer):FindFirstChild("Rune")
local data = {
WearingRune = {},
PackageRune = {},
}
-- 找到当前穿戴的装备
local EquipmentFolder = Utils:WaitPlayerDataFolder(LocalPlayer):FindFirstChild("Equipment")
for _, child in EquipmentFolder:GetChildren() do
if child:GetAttribute("wearing") ~= 0 then
self.ShowEquipmentId = child.Name
@ -170,6 +250,7 @@ function RuneWindow:OnOpenWindow()
-- 如果当前没有穿戴的装备,并且没有装备,则报错提示, 并返回内容
if not self.ShowEquipmentId and #EquipmentFolder:GetChildren() == 0 then
warn("没有找到当前穿戴的装备")
self.NowMaxRuneNumber = 0
return
end
@ -177,41 +258,10 @@ function RuneWindow:OnOpenWindow()
if not self.ShowEquipmentId then
self.ShowEquipmentId = EquipmentFolder:GetChildren()[1].Name
end
local equipmentInstance = EquipmentFolder:FindFirstChild(self.ShowEquipmentId)
local maxRuneNumber = equipmentInstance:GetAttribute("maxRuneNumber")
-- 如果当前最大槽位数为0刷新至空显示
if maxRuneNumber <= 0 then
self.Variables["__listRuneWearing"]:SetData({})
self:ShowDetailData()
return
end
-- 添加符文数据
for _, child in DataFolder:GetChildren() do
self:AddInstanceData(child, data)
end
self:SetData(data)
-- 补充空槽位
for i = 1, maxRuneNumber do
local isExist = false
for k, data in pairs(self.Data.WearingRune) do
if data.wearingSlot == i then
isExist = true
break
end
end
if not isExist then
self.Data.WearingRune["slot" .. i] = {
wearingSlot = i,
}
end
end
self:ShowWearingSlot()
local addCon = DataFolder.ChildAdded:Connect(function(child)
local data, parentName = self:AddInstanceData(child, data)
local data, parentName = self:AddInstanceData(child, self.Data)
if parentName == "WearingRune" then
self.Variables["__listRuneWearing"]:AddData("slot"..data.wearingSlot, data)
else
@ -229,14 +279,29 @@ function RuneWindow:OnOpenWindow()
end
end)
table.insert(self.Connections, addCon)
table.insert(self.Connections, removeCon)
print(self.Variables["__listRunePackage"], self.Variables["__listRuneWearing"])
self.Variables["__listRunePackage"]:SetData(self.Data.PackageRune)
self.Variables["__listRuneWearing"]:SetData(self.Data.WearingRune)
self.Variables["__listRuneWearing"]:SetLayoutOrder("wearingSlot")
local inlayCon = self.Variables["_btnInlay"].Activated:Connect(function()
self:InlayRune()
end)
table.insert(self.Connections, inlayCon)
local changeEquipmentCon = self.Variables["_btnChangeEquipment"].Activated:Connect(function()
self.UIManager:OpenWindow("SelectEquipmentWindow", {
ExpectIds = {tostring(self.ShowEquipmentId)},
})
end)
table.insert(self.Connections, changeEquipmentCon)
local selectRuneInlayEquipmentCon = selectRuneInlayEquipmentSignal:Connect(function(id)
self.ShowEquipmentId = id
self:RefreshEquipmentName()
self:ShowWearingSlot()
end)
table.insert(self.Connections, selectRuneInlayEquipmentCon)
end
function RuneWindow:OnCloseWindow()

View File

@ -0,0 +1,81 @@
local PackageShow = {}
PackageShow.__index = PackageShow
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Utils = require(ReplicatedStorage.Tools.Utils)
local Localization = require(ReplicatedStorage.Tools.Localization)
local JsonEquipment = require(ReplicatedStorage.Json.Equipment)
local JsonItemProp = require(ReplicatedStorage.Json.ItemProp)
local FolderEquipment = ReplicatedStorage:WaitForChild("Prefabs"):WaitForChild("Equipments")
--> Variables
local LocalPlayer = game.Players.LocalPlayer
--> Components
local CommonFolder = LocalPlayer:WaitForChild("PlayerScripts"):WaitForChild("UI"):WaitForChild("Common")
local EquipmentModelDetail = require(CommonFolder:WaitForChild("EquipmentModelDetail"))
function PackageShow:Init(data: table)
local self = {}
self.Data = data
self.Variables = {
["_btnClick"] = 0,
["_imgIcon"] = 0,
["_tmpQuality"] = 0,
["_tmpName"] = 0,
["_imgView"] = 0,
}
self.Connections = {}
setmetatable(self, PackageShow)
return self
end
function PackageShow:Refresh()
local itemData = Utils:GetIdDataFromJson(JsonItemProp, self.Data.orgId)
self.Variables._imgIcon.Image = Localization:GetImageData(itemData.iconId)
self.Variables._imgIcon.Visible = false
self.Variables._tmpQuality.Text = Localization:GetColoredEquipmentQualityDesc(self.Data.quality)
self.Variables._tmpName.Text = Localization:GetLanguageData(itemData.nameId)
-- 模型展示
EquipmentModelDetail:ShowDetail(self.Variables["_imgView"], self.Data.orgId, false)
end
function PackageShow:OnInitFinish()
local con = self.Variables._btnClick.MouseButton1Click:Connect(function()
if self.Data == {} then
-- TODO: 之后做提示弹窗
else
self.TopUI:SetSelectId(self.Data.id)
end
end)
table.insert(self.Connections, con)
if self.Data.instance then
local wearingCon = self.Data.instance:GetAttributeChangedSignal("wearing"):Connect(function()
local oldWearing = self.Data.wearing
local newWearing = self.Data.instance:GetAttribute("wearing")
if oldWearing ~= newWearing then
if newWearing > 0 then
self.TopUI:WearRefresh(self.Data)
else
self.TopUI:UnwearRefresh(self.Data)
end
end
end)
table.insert(self.Connections, wearingCon)
end
end
function PackageShow:Destroy()
for k, v in pairs(self) do
self[k] = nil
end
self = nil
end
return PackageShow

View File

@ -0,0 +1,78 @@
--> Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--> Dependencies
local UIWindow = require(ReplicatedStorage.Base.UIWindow)
local UIEnums = require(ReplicatedStorage.Base.UIEnums)
--> Components
local PackageShow = require(script.PackageShow)
--> Dependencies
local Utils = require(ReplicatedStorage.Tools.Utils)
--> Variables
local LocalPlayer = game.Players.LocalPlayer
local Signal = require(ReplicatedStorage.Tools.Signal)
local selectRuneInlayEquipmentSignal = Signal.new(Signal.ENUM.SELECT_RUNE_INLAY_EQUIPMENT)
--------------------------------------------------------------------------------
local SelectEquipmentWindow = {}
SelectEquipmentWindow.__index = SelectEquipmentWindow
setmetatable(SelectEquipmentWindow, {__index = UIWindow})
function SelectEquipmentWindow:Init(UIManager: table, Data: table?)
local self = UIWindow:Init(UIManager, Data)
setmetatable(self, SelectEquipmentWindow)
self.Variables = {
["__listWeaponPackage"] = 0,
["_btnClose"] = 0,
["_btnBgClose"] = 0,
}
self.UIRootName = "ui_w_select_equipment"
self.UIParentName = UIEnums.UIParent.UIRoot
return self
end
function SelectEquipmentWindow:SetSelectId(id: number)
selectRuneInlayEquipmentSignal:Fire(id)
self.UIManager:CloseWindow(script.Name)
end
function SelectEquipmentWindow:OnOpenWindow()
UIWindow.OnOpenWindow(self)
-- 自己进行数据处理
local DataFolder = Utils:WaitPlayerDataFolder(LocalPlayer):FindFirstChild("Equipment")
self.Data.ShowData = {}
for _, child in DataFolder:GetChildren() do
if not table.find(self.Data.ExpectIds, child.Name) then
local newData = child:GetAttributes()
newData.instance = child
table.insert(self.Data.ShowData, newData)
end
end
print(self.Data)
local bgCloseCon = self.Variables["_btnBgClose"].Activated:Connect(function()
self.UIManager:CloseWindow(script.Name)
end)
local closeCon = self.Variables["_btnClose"].Activated:Connect(function()
self.UIManager:CloseWindow(script.Name)
end)
table.insert(self.Connections, bgCloseCon)
table.insert(self.Connections, closeCon)
self.Variables["__listWeaponPackage"]:AddComponent(PackageShow)
self.Variables["__listWeaponPackage"]:SetData(self.Data.ShowData)
end
function SelectEquipmentWindow:OnCloseWindow()
UIWindow.OnCloseWindow(self)
end
return SelectEquipmentWindow