Menu
CoddyTech

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

Aufgabe

Mittel

Lass Q beim Server einen Sprint anfordern.

  1. Schreibe in BattleClient use(name, state): Rufe bei Enum.UserInputState.Begin remotes.Ability:FireServer(name) auf.
  2. Binde die Funktion: ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q).
  3. Verbinde in BattleServer remotes.Ability.OnServerEvent mit print(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