local Utils = {} --> Services local ReplicatedStorage = game:GetService("ReplicatedStorage") --> Variables local PlayerDataFolder = ReplicatedStorage:WaitForChild("PlayerData") --> 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 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 -- 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的项 for _, item in ipairs(JsonData) do if item.id == id then return item end end return nil -- 没有找到对应id end -- 获取随机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 function Utils:GetMaxIdFromJson(JsonData: table) local maxId = 0 for _, item in ipairs(JsonData) do if item.id > maxId then maxId = item.id end end 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 end 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 -- TODO: 子表数据也要处理 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 -- 深度复制表 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 -------------------------------------------------------------------------------- return Utils