Classe de moteur
DataModel
*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.
Résumé
Propriétés
Méthodes
BindToClose(function: function):() |
GetObjects(url: ContentId):Instances |
IsGearTypeAllowed(gearType: Enum.GearType):boolean |
SavePlace(saveFilter: Enum.SaveFilter):boolean |
SetPlaceId(placeId: number):() |
SetUniverseId(universeId: number):() |
Événements
GraphicsQualityChangeRequest(betterQuality: boolean):RBXScriptSignal |
ItemChanged(object: Instance,descriptor: string):RBXScriptSignal |
ServerRestartScheduled(restartTime: DateTime,source: Enum.CloseReason,attributes: Dictionary):RBXScriptSignal |
Échantillons de code
ObtenirService()
local Workspace = game:GetService("Workspace")
local Lighting = game:GetService("Lighting")
-- Exemples de modification des propriétés de ces services
Workspace.Gravity = 20
Lighting.ClockTime = 4Référence API
Propriétés
CreatorId
Échantillons de code
Détecter quand le propriétaire du lieu rejoint le jeu
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
if game.CreatorType == Enum.CreatorType.User then
if player.UserId == game.CreatorId then
print("Le propriétaire du lieu a rejoint le jeu !")
end
elseif game.CreatorType == Enum.CreatorType.Group then
if player:IsInGroupAsync(game.CreatorId) then
print("Un membre du groupe qui possède le lieu a rejoint le jeu !")
end
end
end)CreatorType
Échantillons de code
Détecter quand le propriétaire du lieu rejoint le jeu
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
if game.CreatorType == Enum.CreatorType.User then
if player.UserId == game.CreatorId then
print("Le propriétaire du lieu a rejoint le jeu !")
end
elseif game.CreatorType == Enum.CreatorType.Group then
if player:IsInGroupAsync(game.CreatorId) then
print("Un membre du groupe qui possède le lieu a rejoint le jeu !")
end
end
end)GearGenreSetting
Genre
lighting
PlaceVersion
Échantillons de code
GUI du numéro de version du serveur
local StarterGui = game:GetService("StarterGui")
local versionGui = Instance.new("ScreenGui")
local textLabel = Instance.new("TextLabel")
textLabel.Position = UDim2.new(1, -10, 1, 0)
textLabel.AnchorPoint = Vector2.new(1, 1)
textLabel.Size = UDim2.new(0, 150, 0, 40)
textLabel.BackgroundTransparency = 1
textLabel.TextColor3 = Color3.new(1, 1, 1)
textLabel.TextStrokeTransparency = 0
textLabel.TextXAlignment = Enum.TextXAlignment.Right
textLabel.TextScaled = true
local placeVersion = game.PlaceVersion
textLabel.Text = string.format("Version du serveur : %s", placeVersion)
textLabel.Parent = versionGui
versionGui.Parent = StarterGuiPrivateServerId
Échantillons de code
Détection des serveurs privés
local function getServerType()
if game.PrivateServerId ~= "" then
if game.PrivateServerOwnerId ~= 0 then
return "ServeurVIP"
else
return "ServeurRéservé"
end
else
return "ServeurStandard"
end
end
print(getServerType())PrivateServerOwnerId
Échantillons de code
Détection des serveurs privés
local function getServerType()
if game.PrivateServerId ~= "" then
if game.PrivateServerOwnerId ~= 0 then
return "ServeurVIP"
else
return "ServeurRéservé"
end
else
return "ServeurStandard"
end
end
print(getServerType())VIPServerId
VIPServerOwnerId
workspace
Méthodes
BindToClose
Paramètres
Retours
()
Échantillons de code
Sauvegarde des données du joueur avant l'arrêt
local DataStoreService = game:GetService("DataStoreService")
local RunService = game:GetService("RunService")
local playerDataStore = DataStoreService:GetDataStore("PlayerData")
local allPlayerSessionDataCache = {}
local function savePlayerDataAsync(userId, data)
return playerDataStore:UpdateAsync(userId, function(oldData)
return data
end)
end
local function onServerShutdown(closeReason)
if RunService:IsStudio() then
-- Évitez d'écrire des données de studio en production et de ralentir la fermeture de la session de test
return
end
-- Référence pour suspendre et reprendre plus tard
local mainThread = coroutine.running()
-- Compte le nombre de nouveaux threads, diminue quand le thread se termine. Quand 0 est atteint,
-- le thread individuel sait que c'est le dernier thread à terminer et doit reprendre le thread principal
local numThreadsRunning = 0
-- Appeler cette fonction plus tard démarre sur un nouveau thread à cause de coroutine.wrap
local startSaveThread = coroutine.wrap(function(userId, sessionData)
-- Effectuer l'opération de sauvegarde
local success, result = pcall(savePlayerDataAsync, userId, sessionData)
if not success then
-- Pourrait implémenter une tentative de réessai
warn(string.format("Échec de la sauvegarde des données de %d : %s", userId, result))
end
-- Le thread est terminé, décrémente le compteur
numThreadsRunning -= 1
if numThreadsRunning == 0 then
-- C'était le dernier thread à terminer, reprenez le thread principal
coroutine.resume(mainThread)
end
end)
-- Cela suppose que playerData est effacée de la table de données lors d'une sauvegarde finale sur PlayerRemoving,
-- donc cela itère sur toutes les données des joueurs encore dans le jeu qui n'ont pas été sauvegardées
for userId, sessionData in pairs(allPlayerSessionDataCache) do
numThreadsRunning += 1
-- Cette boucle termine l'exécution et le comptage numThreadsRunning avant que l'un des
-- threads de sauvegarde commence car coroutine.wrap a un délai d'attente intégré au démarrage
startSaveThread(userId, sessionData)
end
if numThreadsRunning > 0 then
-- Bloquer l'arrêt jusqu'à ce que les threads de sauvegarde se terminent. Repris par le dernier thread de sauvegarde lorsqu'il se termine
coroutine.yield()
end
end
game:BindToClose(onServerShutdown)Liaison et Gestion de l'Arrêt du Jeu
game:BindToClose(function(closeReason)
print(`Fermeture avec raison {closeReason}`)
task.wait(3)
print("Fait")
end)GetJobsInfo
Retours
Échantillons de code
Obtenir des informations sur les emplois
local jobInfo = game:GetJobsInfo()
local jobTitles = jobInfo[1]
table.remove(jobInfo, 1)
local divider = string.rep("-", 120)
print(divider)
warn("INFORMATIONS D'EMPLOI:")
print(divider)
for _, job in pairs(jobInfo) do
for jobIndex, jobValue in pairs(job) do
local jobTitle = jobTitles[jobIndex]
warn(jobTitle, "=", jobValue)
end
print(divider)
endGetMessage
GetObjects
GetRemoteBuildMode
IsGearTypeAllowed
IsLoaded
Retours
Échantillons de code
Écran de Chargement Personnalisé
local Players = game:GetService("Players")
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
-- Créer un écran de chargement basique
local screenGui = Instance.new("ScreenGui")
screenGui.IgnoreGuiInset = true
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(1, 0, 1, 0)
textLabel.BackgroundColor3 = Color3.fromRGB(0, 20, 40)
textLabel.Font = Enum.Font.GothamMedium
textLabel.TextColor3 = Color3.new(0.8, 0.8, 0.8)
textLabel.Text = "Chargement"
textLabel.TextSize = 28
textLabel.Parent = screenGui
-- Ajouter l'ensemble de l'interface graphique à l'interface du joueur
screenGui.Parent = playerGui
-- Supprimer l'écran de chargement par défaut
ReplicatedFirst:RemoveDefaultLoadingScreen()
--task.wait(3) -- Forcer éventuellement l'écran à s'afficher pendant un nombre minimum de secondes
if not game:IsLoaded() then
game.Loaded:Wait()
end
screenGui:Destroy()SavePlace
Événements
AllowedGearTypeChanged
GraphicsQualityChangeRequest
Paramètres
Échantillons de code
Gestion des modifications des utilisateurs dans la qualité graphique
game.GraphicsQualityChangeRequest:Connect(function(betterQuality)
if betterQuality then
print("L'utilisateur a demandé une augmentation de la qualité graphique !")
else
print("L'utilisateur a demandé une diminution de la qualité graphique !")
end
end)ItemChanged
ServerRestartScheduled
DataModel.ServerRestartScheduled(
Paramètres
Échantillons de code
RedémarrageServeurPrévu
local roundInProgress = false -- Défini ailleurs dans le code du jeu chaque fois qu'une manche de jeu commence ou se termine
local restartPending = false
game.ServerRestartScheduled:Connect(function(restartTime, source, attributes)
local msg = attributes and attributes.message or ""
local timeStr = restartTime:FormatLocalTime("LTS", "fr-fr") -- puisque cela s'exécute sur le serveur, il sera en UTC
-- Transmettez ces champs aux clients via remote:FireAllClients() pour afficher des messages personnalisés dans votre interface utilisateur
print(string.format("Redémarrage du serveur à %s depuis la source : %s. Raison : %s.", timeStr, tostring(source), msg))
if not roundInProgress then
print("Aucune manche en cours. Téléportation des joueurs dans 10 secondes")
task.wait(10)
-- La téléportation des joueurs lorsqu'un redémarrage a été prévu les amènera à un serveur sur la dernière version de lieu
game:GetService("TeleportService"):TeleportAsync(game.PlaceId, game:GetService("Players"):GetPlayers())
else
-- Vous pouvez ajouter du code pour téléporter les joueurs après la fin d'une manche de jeu si restartPending est vrai.
restartPending = true
end
end)Rappels
OnClose