Den Server fragen
Lektion 6 von 25 im Kurs Roblox-Spiel: Kampfarenen von Coddy.
Fähigkeiten werden auf dem Gerät des Spielers gestartet. BattleClient ist ein LocalScript im HUD. ContextActionService verknüpft eine Aktion mit Tasten und fügt mit true als drittem Argument auch eine Schaltfläche dafür auf einem Telefonbildschirm hinzu:
ContextActionService:BindAction("Wave", use, true, Enum.KeyCode.T)Die Funktion erhält den Namen der Aktion und den Zustand der Eingabe, Begin, wenn die Taste gedrückt wird. Der Server legt die Regeln fest, daher fragt der Client nur über das RemoteEvent Remotes.Ability an. Auf dem Server empfängt OnServerEvent das Ereignis, und Roblox übergibt zuerst den Spieler, der es ausgelöst hat:
remotes.Ability.OnServerEvent:Connect(function(player, name)
print(name .. " from " .. player.Name)
end)Aufgabe
MittelLass Q beim Server einen Sprint anfordern.
- Schreibe in
BattleClientuse(name, state): Rufe beiEnum.UserInputState.Beginremotes.Ability:FireServer(name)auf. - Binde die Funktion:
ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q). - Verbinde in
BattleServerremotes.Ability.OnServerEventmitprint(player.Name .. " asked for " .. name).
Klicke auf „Spielen“ und drücke Q: In der Ausgabe steht Player1 asked for Dash. Klicke dann auf „Prüfen“.
Probier es selbst
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player -> Zeitpunkt des letzten Schlags
-- Roblox’ eigene Schwertanimationen
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- Ein Schwerthieb: Erst kommt die Animation, dann werden alle in der Box vor dir getroffen
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()
-- die Box vor dir, niemals dein eigener Körper
local params = OverlapParams.new()
params.FilterDescendantsInstances = { character }
local box = root.CFrame * CFrame.new(0, 0, -3)
local hit = {} -- jeder Humanoid nur einmal pro Schwerthieb
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
-- Jeder Spieler bekommt bei jedem neuen Leben ein Schwert
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)
-- Die Trainingspuppe: Ihre Gesundheitsanzeige zeigt ihre Gesundheit an, und eine besiegte
-- Puppe erscheint nach kurzer Zeit als frische Kopie an derselben Stelle wieder
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)
Alle Lektionen in Roblox-Spiel: Kampfarenen
Übe selbstständig: Roblox-Playground