TUTORIELS

Script: Remotes

Les remotes sont des objets dans Roblox qui permettent au client et au serveur de communiquer, voici un schéma très simple pour illustrer les envois d'informations:

Untitled Diagram (1).png

Avec le FilteringEnabled, les LocalScripts dans un client et les Scripts dans un serveur ne peuvent pas communiquer entre eux, un LocalScript ne peut pas éditer des choses dans le workspace qui n'appartiennent pas au joueur par exemple.

Pour remédier à ça vous devez utiliser les remotes, il y a deux catégories:

- les RemoteEvent

- les RemoteFunction

Nous allons commencer avec les RemoteEvents.

Nous allons utiliser un exemple pour pouvoir vous expliquer les RemoteEvents. 

Le client a un code à quatre chiffres: 1337, il doit l'envoyer au serveur pour pouvoir ouvrir une porte qui s'appelle "Door" dans le workspace.

Placer le RemoteEvent dans ReplicatedStorage.

Ajoutez un script dans le client, moi par exemple je préfère ajouter les scripts clients dans StarterPlayer > StarterCharacterScripts ou StarterPlayerScripts. 

Le script devra ressembler à ça:

local Code = 1337

wait(5)

game:GetService("ReplicatedStorage").RemoteEvent:FireServer({"OpenDoor", Code})

Ici, on initialise le code à 1337, attendons 5 secondes et ensuite envoyons une table au RemoteEvent. 

Cette table a deux entrées, une chaîne de caractère "OpenDoor" et la valeur Code. Ceci est une méthode comme d'autres pour pouvoir envoyer plusieurs informations dans un RemoteEvent. 

Maintenant nous allons coder le script du serveur que nous posons dans ServerScriptService. 

local Code = 1337

game:GetService("ReplicatedStorage").RemoteEvent.OnServerEvent:connect(function(Player, Event)

local NomEvent = Event[1]

if NomEvent == "OpenDoor" then

local CodeJoueur = Event[2]

if CodeJoueur == Code then

game.Workspace.Door.Transparency = 1

game.Workspace.Door.CanColide = false

end

end

end)

Ici nous écrivons le code du serveur (qui est le même du client pour qu'il puisse l'ouvrir, mais vous pouvez faire que le joueur doit écrire le code et qu'ensuite le client l'envoi)

Quand le RemoteEvent reçoit un ":FireServer" il déclenche automatiquement un événement que nous récupérons avec "OnServerEvent:connect" du côté serveur. 

Ici nous utilisons deux paramètres, Player et Event, Player est tout simplement le joueur qui a envoyé l'événement, vous pourrez l'utiliser pour d'autres fonctions. Event est la table que nous avons envoyé. 

Donc nous vérifions le nom de l'événement, si il est égal à "OpenDoor" alors nous vérifions si le Code du joueur est égal au Code de la porte(du serveur), si oui, nous ouvrons tout simplement la porte en la rendant transparente et passable. 

Essayez de refaire le script plusieurs fois pour pouvoir l'assimiler, essayez aussi de le modifier comme par exemple rajouter un autre code qui ouvre une autre porte par exemple.

Nous allons donc passer au RemoteFunction.

Contrairement à ce que certains pensent, les RemoteFunction sont presque pareil que les RemoteEvent, mais comme l'indique son nom, un RemoteFunction est une fonction, donc l'écriture ne sera pas la même, mais vous pourrez renvoyer le résultat au client ou d'autres choses avec return.

Nous allons réutiliser le script Local, tout pareil sauf que la ligne d'envoi ne sera pas exactement la même:

local Code = 1337

wait(5)

game:GetService("ReplicatedStorage").RemoteFunction:InvokeServer({"OpenDoor", Code})

Comme vous pouvez le voir, pratiquement toute la ligne est la même, sauf que nous avons remplacer RemoteEvent:FireServer par RemoteFunction:InvokeServer. 

La plus grande différence, tout de même assez petite comme différence, se fera dans le script du serveur:

local Code = 1337

function game:GetService("ReplicatedStorage").RemoteFunction.OnServerInvoke(Player, Event)

local NomEvent = Event[1]

if NomEvent == "OpenDoor" then

local CodeJoueur = Event[2]

if CodeJoueur == Code then

game.Workspace.Door.Transparency = 1

game.Workspace.Door.CanColide = false

end

end

end

Comme vous pouvez le voir, la syntaxe de la ligne qui s'occupe de recevoir les informations a changé, mais tout fonctionne exactement pareil sauf que les paramètres sont juste après OnServerInvoke et qu'il n'y a pas besoin de :connect.

Maintenant, nous allons rajouté la possibilité de retourner une valeur, cela fonctionne pareil que n'importe quel fonction, sauf que la fonction est appelée en client et qu'elle est exécutée dans le serveur.

Script Client:

local Code = 1337

wait(5)

local Booleen = game:GetService("ReplicatedStorage").RemoteFunction:InvokeServer({"OpenDoor", Code})

Script Serveur:

local Code = 1337

function game:GetService("ReplicatedStorage").RemoteFunction.OnServerInvoke(Player, Event)

local NomEvent = Event[1]

if NomEvent == "OpenDoor" then

local CodeJoueur = Event[2]

if CodeJoueur == Code then

game.Workspace.Door.Transparency = 1

game.Workspace.Door.CanColide = false

return true

else

return false

end

end

return false -- retourner false si la fonction n'existe pas (pour éviter des erreurs)

end

Voilà, maintenant si le code est bon et que la porte s'est ouverte, la valeur "Booleen" dans le client sera égale à true car nous avons renvoyé true, sinon elle sera égale à false.

Essayez de refaire le script plusieurs fois pour pouvoir l'assimiler, essayez aussi de le modifier comme par exemple rajouter un autre code qui ouvre une autre porte par exemple.

EXERCICE

L'exercice ici est de refaire tout le script et d'utiliser l'objet Player, par exemple seulement un seul joueur peut ouvrir la porte donc vous pouvez utiliser Player.userId et le Code serait l'Id du joueur. 

Tutoriel créé par chichine