Menu
CoddyTech

Minta ke Server

Pelajaran 6 dari 25 dalam kursus Game Roblox: Battlegrounds di Coddy.

Ability dimulai di perangkat pemain. BattleClient adalah LocalScript di HUD. ContextActionService mengaitkan aksi dengan tombol, dan dengan true sebagai argumen ketiga, layanan ini juga menampilkan tombol untuk aksi tersebut di layar ponsel:

ContextActionService:BindAction("Wave", use, true, Enum.KeyCode.T)

Fungsi menerima nama aksi dan status input, yaitu Begin saat tombol ditekan. Server mengatur aturan, jadi client hanya mengirim permintaan melalui RemoteEvent Remotes.Ability. Di server, OnServerEvent menerima permintaan itu, dan Roblox memberikan pemain yang memicunya sebagai argumen pertama:

remotes.Ability.OnServerEvent:Connect(function(player, name)
	print(name .. " from " .. player.Name)
end)
challenge icon

Tantangan

Sedang

Buat Q meminta server melakukan dash.

  1. Di BattleClient, tulis use(name, state): saat Enum.UserInputState.Begin, panggil remotes.Ability:FireServer(name).
  2. Ikat: ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q).
  3. Di BattleServer, hubungkan remotes.Ability.OnServerEvent ke print(player.Name .. " asked for " .. name).

Tekan tombol “Main” lalu tekan Q: Output menampilkan Player1 asked for Dash. Lalu tekan tombol “Periksa”.

Coba sendiri

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local lastSwing = {} -- player -> waktu terakhir mereka mengayunkan pedang

-- Animasi pedang bawaan Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

print("Swords deal " .. Settings.SwordDamage .. " damage")

-- Satu ayunan: animasi dimainkan, lalu semua yang berada di dalam kotak di depanmu terkena serangan
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()
	-- kotak di depanmu, tidak pernah mencakup tubuhmu sendiri
	local params = OverlapParams.new()
	params.FilterDescendantsInstances = { character }
	local box = root.CFrame * CFrame.new(0, 0, -3)
	local hit = {} -- setiap humanoid hanya sekali per ayunan
	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

-- Setiap player mendapat pedang setiap kali hidup
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)

-- Boneka latihan: bilah kesehatannya mengikuti kesehatannya, dan boneka yang dikalahkan
-- muncul kembali tak lama kemudian sebagai salinan baru di tempat yang sama
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)

Semua pelajaran di Game Roblox: Battlegrounds

Latihan sendiri: Playground Roblox