Interroger le serveur
Leçon 6 sur 25 du cours Jeu Roblox : Arène de combat de Coddy.
Les capacités commencent sur l'appareil du joueur. BattleClient est un LocalScript dans le HUD. ContextActionService associe une action à des touches et, avec true comme troisième argument, affiche aussi un bouton correspondant sur l'écran d'un téléphone :
ContextActionService:BindAction("Wave", use, true, Enum.KeyCode.T)La fonction reçoit le nom de l'action et l'état de l'entrée, Begin lorsque la touche est enfoncée. Le serveur gère les règles, donc le client se contente d'envoyer une requête via le RemoteEvent Remotes.Ability. Sur le serveur, OnServerEvent la reçoit, et Roblox transmet en premier le joueur qui l'a déclenchée :
remotes.Ability.OnServerEvent:Connect(function(player, name)
print(name .. " from " .. player.Name)
end)Défi
MoyenFais en sorte que la touche Q demande une accélération au serveur.
- Dans
BattleClient, écrisuse(name, state): lorsque l’état estEnum.UserInputState.Begin, appelleremotes.Ability:FireServer(name). - Liez-la :
ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q). - Dans
BattleServer, connecteremotes.Ability.OnServerEventàprint(player.Name .. " asked for " .. name).
Clique sur « Jouer » et appuie sur Q : la fenêtre Output affiche Player1 asked for Dash. Puis clique sur « Vérifier ».
Essayez vous-même
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player -> moment de son dernier coup d’épée
-- Les animations d’épée propres à Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- Un coup d’épée : l’animation, puis tous ceux qui se trouvent dans la zone devant vous sont touchés
local function swing(player)
local character = player.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
if not root or character.Humanoid.Health <= 0 then
return
end
local now = time()
if lastSwing[player] and now - lastSwing[player] < Settings.SwingCooldown then
return
end
lastSwing[player] = now
character.Humanoid.Animator:LoadAnimation(slash):Play()
-- la zone devant vous, jamais votre propre corps
local params = OverlapParams.new()
params.FilterDescendantsInstances = { character }
local box = root.CFrame * CFrame.new(0, 0, -3)
local hit = {} -- chaque humanoid une seule fois par coup d’épée
for _, part in workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params) do
local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
if humanoid and not hit[humanoid] then
hit[humanoid] = true
humanoid:TakeDamage(Settings.SwordDamage)
print(humanoid.Parent.Name .. " is at " .. humanoid.Health)
end
end
end
-- Chaque joueur reçoit une épée à chaque nouvelle vie
Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function()
local sword = ServerStorage.Sword:Clone()
sword.Parent = player.Backpack
sword.Activated:Connect(function()
swing(player)
end)
end)
end)
-- Le mannequin d’entraînement : sa barre de vie reflète sa santé, et un mannequin vaincu
-- réapparaît après un instant sous forme d’une nouvelle copie au même endroit
local function setupDummy(dummy)
local humanoid = dummy.Humanoid
humanoid.HealthChanged:Connect(function(health)
dummy.HealthBar.Back.Fill.Size = UDim2.fromScale(health / humanoid.MaxHealth, 1)
end)
humanoid.Died:Connect(function()
local spot = dummy:GetPivot()
task.wait(0.5)
dummy:Destroy()
task.wait(Settings.DummyRespawn)
local fresh = ServerStorage.Dummy:Clone()
fresh:PivotTo(spot)
fresh.Parent = workspace
setupDummy(fresh)
end)
end
setupDummy(workspace.Dummy)
Toutes les leçons de Jeu Roblox : Arène de combat
2Client et serveur
Interroger le serveurEntraînez-vous par vous-même : Playground Roblox