Menu
CoddyTech

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)
challenge icon

Défi

Moyen

Fais en sorte que la touche Q demande une accélération au serveur.

  1. Dans BattleClient, écris use(name, state) : lorsque l’état est Enum.UserInputState.Begin, appelle remotes.Ability:FireServer(name).
  2. Liez-la : ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q).
  3. Dans BattleServer, connecte remotes.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

Entraînez-vous par vous-même : Playground Roblox