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)Tantangan
SedangBuat Q meminta server melakukan dash.
- Di
BattleClient, tulisuse(name, state): saatEnum.UserInputState.Begin, panggilremotes.Ability:FireServer(name). - Ikat:
ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q). - Di
BattleServer, hubungkanremotes.Ability.OnServerEventkeprint(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