2025-08-05 15:19:19 +08:00

143 lines
4.7 KiB
Plaintext

-- 图鉴系统
local BookProxy = {}
--> Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
--> Variables
local Utils = require(ReplicatedStorage.Tools.Utils)
local ArchiveProxy = require(ServerStorage.Proxy.ArchiveProxy)
--> Json
local JsonItem = require(ReplicatedStorage.Json.ItemProp)
local JsonGem = require(ReplicatedStorage.Json.Gem)
local JsonParam = require(ReplicatedStorage.Json.Param)
--> Events
local RE_PlayerTip = ReplicatedStorage.Events.RE_PlayerTip
local RE_UpgradeAttributes = ReplicatedStorage.Events.RE_UpgradeAttributes
--> Constants
local STORE_NAME = "Book"
--------------------------------------------------------------------------------
-- 获取玩家信息文件夹
local function GetPlayerBookFolder(Player: Player)
local pData = Utils:GetPlayerDataFolder(Player)
if not pData then return end
local BookFolder = pData:FindFirstChild("Book")
return BookFolder
end
--------------------------------------------------------------------------------
-- 初始化玩家
function BookProxy:InitPlayer(Player: Player)
local pData = Utils:GetPlayerDataFolder(Player)
if not pData then return end
local BookFolder = Utils:CreateFolder("Book", pData)
-- 新玩家数据初始化
local isNew = false
if not ArchiveProxy.pData[Player.UserId][STORE_NAME] then
ArchiveProxy.pData[Player.UserId][STORE_NAME] = {}
ArchiveProxy.pData[Player.UserId][STORE_NAME].Books = {}
isNew = true
end
-- 创建玩家信息实例
for BookId, BookData in ArchiveProxy.pData[Player.UserId][STORE_NAME].Books do
Utils:CreateDataInstance(Player, BookId, BookData, BookFolder)
end
if isNew then
local ItemProxy = require(ServerStorage.Proxy.ItemProxy)
local newData = Utils:GetIdDataFromJson(JsonParam, 6)
for i = 1, #newData.intArray, 2 do
ItemProxy:AddItem(Player, newData.intArray[i], newData.intArray[i + 1])
end
end
end
--------------------------------------------------------------------------------
-- 添加图鉴记录
function BookProxy:AddBook(Player: Player, BookId: number, UniqueEquipmentId: number)
local pData = Utils:GetPlayerDataFolder(Player)
if not pData then return end
local BookFolder = GetPlayerBookFolder(Player)
if not BookFolder then return end
local EquipmentProxy = require(ServerStorage.Proxy.EquipmentProxy)
local EquipmentData = EquipmentProxy:GetEquipmentData(Player, UniqueEquipmentId)
if not EquipmentData then return end
-- 变成字符串,因为在次读取后,是字典
local BookId = tostring(BookId)
local orgBookData = ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId]
-- 检查是否已经存在
if orgBookData then
-- 图鉴没原先品质高就返回
if orgBookData.quality > EquipmentData.quality then return end
else
-- 原来没有时解锁图鉴
BookProxy:UnlockBook(Player, BookId)
end
-- 添加图鉴记录
ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId] = {
timestamp = tick(),
quality = EquipmentData.quality,
}
local bookInstance = BookFolder:FindFirstChild(BookId)
bookInstance:SetAttribute("quality", ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId].quality)
bookInstance:SetAttribute("timestamp", ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId].timestamp)
end
-- 解锁图鉴
function BookProxy:UnlockBook(Player: Player, BookId: number)
local BookId = tostring(BookId)
local pData = Utils:GetPlayerDataFolder(Player)
if not pData then return end
local BookFolder = GetPlayerBookFolder(Player)
if not BookFolder then return end
-- 添加图鉴记录
ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId] = {
timestamp = 0,
quality = 0,
}
Utils:CreateDataInstance(Player, BookId, ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[BookId], BookFolder)
end
-- 检查是否解锁对应图鉴
function BookProxy:IsBookUnlocked(Player: Player, BookId: number)
return ArchiveProxy.pData[Player.UserId][STORE_NAME].Books[tostring(BookId)]
end
--------------------------------------------------------------------------------
-- TODO: 获取玩家属性(之后要是图鉴加属性就在这)
function BookProxy:GetPlayerAttributes(Player: Player)
local attributesList = {}
return attributesList
end
--------------------------------------------------------------------------------
function BookProxy:OnPlayerRemoving(Player: Player)
end
ReplicatedStorage.Remotes.PlayerRemoving.Event:Connect(function(Player: Player)
BookProxy:OnPlayerRemoving(Player)
end)
return BookProxy