270 lines
7.7 KiB
Plaintext
Raw Normal View History

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
2025-07-15 01:12:05 +08:00
if type(Value) ~= "table" then
Object:SetAttribute(Attribute, Value)
end
2025-07-02 00:21:32 +08:00
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-18 01:11:49 +08:00
function Utils:GetSpecialKeyDataFromJson(JsonData: table, Key: string, Value: string)
-- 遍历JsonData查找id字段等于目标id的项
for _, item in ipairs(JsonData) do
if item[Key] == Value then
return item
end
end
return nil -- 没有找到对应id
end
2025-07-14 00:30:47 +08:00
-- 获取随机idExceptIdList为可选参数如果传入则排除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
-- 获取随机idExceptIdList为可选参数如果传入则排除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-15 01:12:05 +08:00
-- 随机获取权重Index
function Utils:GetRandomWeightIndex(WeightTable: table)
local totalWeight = 0
for _, weight in ipairs(WeightTable) do
totalWeight = totalWeight + weight
end
if totalWeight == 0 then
return nil -- 没有有效权重
end
local rng = Random.new()
local rand = rng:NextInteger(1, totalWeight)
local sum = 0
for i, weight in ipairs(WeightTable) do
sum = sum + weight
if rand <= sum then
return i
end
end
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
Utils:SetAttributesList(Config, EquipmentData)
Config.Parent = Folder
2025-07-15 01:12:05 +08:00
for KeyName, Value in EquipmentData do
if type(Value) == "table" then
local newKeyConfig = Instance.new("Configuration")
newKeyConfig.Name = KeyName
Utils:SetAttributesList(newKeyConfig, Value)
newKeyConfig.Parent = Config
end
end
2025-07-12 05:06:14 +08:00
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-15 01:12:05 +08:00
-- 合并表(加法合并)
function Utils:MergeTable(t1: table, t2: table)
for k, v in pairs(t2) do
if type(v) == "number" then
t1[k] = t1[k] + v
end
end
return t1
end
-- 给表增加keyvalue加法计算
function Utils:TableSafeAddValue(AttributesData: table, AttributeName: string, AttributeValue: number)
AttributesData[AttributeName] = (AttributesData[AttributeName] or 0) + AttributeValue
end
-- 给表增加keyvalue加法计算按第二个参数表的内容增加
function Utils:TableSafeAddTableValue(AttributesData: table, AddTableValue: table)
for AttributeName, AttributeValue in AddTableValue do
AttributesData[AttributeName] = (AttributesData[AttributeName] or 0) + AttributeValue
end
end
2025-07-18 01:11:49 +08:00
-- 递归查找
function Utils:FindInDescendants(root, name)
if root:FindFirstChild(name) then
return root:FindFirstChild(name)
end
for _, child in ipairs(root:GetChildren()) do
local found = Utils:FindInDescendants(child, name)
if found then
return found
end
end
return nil
end
-- 非递归查找
function Utils:FindInRoot(root, name)
return root:FindFirstChild(name)
end
-- UI递归查找
function Utils:FindInDescendantsUI(root, name)
if root:FindFirstChild(name) then
return root:FindFirstChild(name)
end
for _, child in ipairs(root:GetChildren()) do
local firstTwo = string.sub(child.Name, 1, 2)
if firstTwo ~= "__" then
local found = Utils:FindInDescendantsUI(child, name)
if found then
return found
end
end
end
return nil
end
2025-07-15 01:12:05 +08:00
2025-07-02 00:21:32 +08:00
--------------------------------------------------------------------------------
return Utils