2025-07-02 00:21:32 +08:00
|
|
|
|
local Utils = {}
|
|
|
|
|
|
|
|
|
|
--> Services
|
|
|
|
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|
|
|
|
|
|
|
|
|
--> Variables
|
2025-07-03 01:48:06 +08:00
|
|
|
|
local PlayerDataFolder = ReplicatedStorage:WaitForChild("PlayerData")
|
2025-07-02 00:21:32 +08:00
|
|
|
|
|
|
|
|
|
--> Constants
|
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
function Utils:GetPlayerDataFolder(Player: Player)
|
|
|
|
|
local pData = PlayerDataFolder:FindFirstChild(Player.UserId)
|
|
|
|
|
if pData then return pData end
|
|
|
|
|
warn("玩家数据不存在: " .. Player.Name)
|
|
|
|
|
return nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Utils:CreateFolder(Name: string, Parent: Instance)
|
|
|
|
|
local Folder = Instance.new("Folder")
|
|
|
|
|
Folder.Name = Name
|
|
|
|
|
Folder.Parent = Parent
|
|
|
|
|
return Folder
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Utils:SetAttributesList(Object: Instance, Attributes: table)
|
|
|
|
|
for Attribute, Value in Attributes do
|
|
|
|
|
Object:SetAttribute(Attribute, Value)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Utils:GenUniqueId(t: table)
|
|
|
|
|
local min_id = 1
|
|
|
|
|
while t[min_id] ~= nil do
|
|
|
|
|
min_id = min_id + 1
|
|
|
|
|
end
|
|
|
|
|
return min_id
|
|
|
|
|
end
|
|
|
|
|
|
2025-07-12 05:06:14 +08:00
|
|
|
|
function Utils:GenUniqueIdPlayerAI(LastTime: number, Counter: number)
|
|
|
|
|
local now = os.time() -- 或 tick(),精度更高
|
|
|
|
|
if now ~= LastTime then
|
|
|
|
|
Counter = 0
|
|
|
|
|
LastTime = now
|
|
|
|
|
end
|
|
|
|
|
Counter = Counter + 1
|
|
|
|
|
return tostring(now) .. "_" .. tostring(Counter)
|
|
|
|
|
end
|
|
|
|
|
|
2025-07-03 01:48:06 +08:00
|
|
|
|
-- function Utils:GetJsonIdData(JsonName: string, id: number)
|
|
|
|
|
-- local JsonData = require(ReplicatedStorage.Json[JsonName])
|
|
|
|
|
-- for _, item in ipairs(JsonData) do
|
|
|
|
|
-- if item.id == id then
|
|
|
|
|
-- return item
|
|
|
|
|
-- end
|
|
|
|
|
-- end
|
|
|
|
|
-- return nil -- 没找到对应id
|
|
|
|
|
-- end
|
|
|
|
|
|
|
|
|
|
function Utils:GetIdDataFromJson(JsonData: table, id: number)
|
|
|
|
|
-- 遍历JsonData,查找id字段等于目标id的项
|
2025-07-02 00:21:32 +08:00
|
|
|
|
for _, item in ipairs(JsonData) do
|
|
|
|
|
if item.id == id then
|
|
|
|
|
return item
|
|
|
|
|
end
|
|
|
|
|
end
|
2025-07-03 01:48:06 +08:00
|
|
|
|
return nil -- 没有找到对应id
|
2025-07-02 00:21:32 +08:00
|
|
|
|
end
|
|
|
|
|
|
2025-07-14 00:30:47 +08:00
|
|
|
|
-- 获取随机id,ExceptIdList为可选参数,如果传入则排除ExceptIdList中的id
|
|
|
|
|
function Utils:GetRandomIdFromJson(JsonData: table, ExceptIdList: table?)
|
|
|
|
|
local rng = Random.new()
|
|
|
|
|
local randomId = rng:NextInteger(1, #JsonData)
|
|
|
|
|
while ExceptIdList and table.find(ExceptIdList, randomId) do
|
|
|
|
|
randomId = rng:NextInteger(1, #JsonData)
|
|
|
|
|
end
|
|
|
|
|
return randomId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- 获取随机id,ExceptIdList为可选参数,如果传入则排除ExceptIdList中的id
|
|
|
|
|
function Utils:GetRandomIdFromJsonWithType(JsonData: table, Type: number, ExceptIdList: table?)
|
|
|
|
|
local result = {}
|
|
|
|
|
for _, item in ipairs(JsonData) do
|
|
|
|
|
if item.type == Type then
|
|
|
|
|
table.insert(result, item.id)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
local rng = Random.new()
|
|
|
|
|
local randomId = rng:NextInteger(1, #result)
|
|
|
|
|
while ExceptIdList and table.find(ExceptIdList, randomId) do
|
|
|
|
|
randomId = rng:NextInteger(1, #result)
|
|
|
|
|
end
|
|
|
|
|
return randomId
|
|
|
|
|
end
|
|
|
|
|
|
2025-07-03 01:48:06 +08:00
|
|
|
|
function Utils:GetMaxIdFromJson(JsonData: table)
|
|
|
|
|
local maxId = 0
|
2025-07-02 00:21:32 +08:00
|
|
|
|
for _, item in ipairs(JsonData) do
|
2025-07-03 01:48:06 +08:00
|
|
|
|
if item.id > maxId then
|
|
|
|
|
maxId = item.id
|
2025-07-02 00:21:32 +08:00
|
|
|
|
end
|
|
|
|
|
end
|
2025-07-03 01:48:06 +08:00
|
|
|
|
return maxId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 将字符串数组转化成真正的数组表,"[1,10,2,10]" -> {1,10,2,10}
|
|
|
|
|
function Utils:StringArrayToTable(StringArray: string)
|
|
|
|
|
if type(StringArray) ~= "string" then return {} end
|
|
|
|
|
-- 去除首尾的中括号
|
|
|
|
|
local content = StringArray:match("%[(.*)%]")
|
|
|
|
|
if not content or content == "" then return {} end
|
|
|
|
|
local result = {}
|
|
|
|
|
for value in string.gmatch(content, "[^,]+") do
|
|
|
|
|
local num = tonumber(value)
|
|
|
|
|
if num then
|
|
|
|
|
table.insert(result, num)
|
|
|
|
|
else
|
|
|
|
|
table.insert(result, value)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return result
|
2025-07-02 00:21:32 +08:00
|
|
|
|
end
|
|
|
|
|
|
2025-07-12 05:06:14 +08:00
|
|
|
|
function Utils:GetFlatDirectionAndEndPos(startPos: Vector3, targetPos: Vector3, length: number)
|
|
|
|
|
local flatStartPos = Vector3.new(startPos.X, 0, startPos.Z)
|
|
|
|
|
local flatTarget = Vector3.new(targetPos.X, 0, targetPos.Z)
|
|
|
|
|
local direction = (flatTarget - flatStartPos).Unit
|
|
|
|
|
local endPos = flatStartPos + direction * length
|
|
|
|
|
return flatStartPos, endPos, direction
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Utils:CreateDataInstance(Player: Player, UniqueId: number, EquipmentData: table, Folder: Instance)
|
|
|
|
|
if Player or UniqueId or EquipmentData or Folder then
|
|
|
|
|
warn('创建实例失败: ' , Player.Name, UniqueId, EquipmentData, Folder)
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local Config = Instance.new("Configuration")
|
|
|
|
|
Config.Name = UniqueId
|
2025-07-14 00:30:47 +08:00
|
|
|
|
-- TODO: 子表数据也要处理
|
2025-07-12 05:06:14 +08:00
|
|
|
|
Utils:SetAttributesList(Config, EquipmentData)
|
|
|
|
|
Config.Parent = Folder
|
|
|
|
|
return Config
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 复制表
|
|
|
|
|
function Utils:CopyTable(t: table)
|
|
|
|
|
local newTable = {}
|
|
|
|
|
for k, v in pairs(t) do
|
|
|
|
|
newTable[k] = v
|
|
|
|
|
end
|
|
|
|
|
return newTable
|
|
|
|
|
end
|
|
|
|
|
|
2025-07-14 00:30:47 +08:00
|
|
|
|
-- 深度复制表
|
|
|
|
|
function Utils:DeepCopyTable(t: table)
|
|
|
|
|
local newTable = {}
|
|
|
|
|
for k, v in pairs(t) do
|
|
|
|
|
if type(v) == "table" then
|
|
|
|
|
newTable[k] = self:DeepCopyTable(v)
|
|
|
|
|
else
|
|
|
|
|
newTable[k] = v
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return newTable
|
|
|
|
|
end
|
2025-07-02 00:21:32 +08:00
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
return Utils
|