Menu
CoddyTech

Tampilan Cooldown

Pelajaran 8 dari 20 dalam kursus Game Roblox: Battlegrounds di Coddy.

Pemain harus dapat melihat kapan suatu kemampuan siap digunakan. HUD memiliki frame Cooldowns dengan satu label untuk tiap kemampuan, dan server sudah menyimpan DashReadyAt pada pemain, yang dapat dibaca oleh client mereka.

Hitung mundur berubah setiap frame, jadi client menggambarnya ulang pada RunService.Heartbeat, yang berjalan sekali per frame. string.format mempertahankan satu angka desimal:

string.format("%s %.1f", "Dash", 2.345) --> "Dash 2.3"

Client hanya menampilkan cooldown. Pemeriksaan server dari pelajaran sebelumnya tetap menentukan.

challenge icon

Tantangan

Sedang

Di BattleClient, ambil RunService, local me = Players.LocalPlayer, dan local hud = script.Parent. Pada setiap Heartbeat, untuk setiap nama di local shown = { "Dash" }, atur hud.Cooldowns[name].Text menjadi Dash 2.3 selama cooldown, dan Dash ready saat sudah siap.

Tekan Play, tekan Q, lalu amati labelnya. Kemudian tekan Periksa.

Coba sendiri

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

local remotes = game.ReplicatedStorage.Remotes
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 diputar, lalu semua yang berada 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 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)
		end
	end
end

-- Kemampuan berdasarkan nama: apa yang dilakukan masing-masing
local abilities = {}

function abilities.Dash(player, character, root)
	root.AssemblyLinearVelocity = root.CFrame.LookVector * Settings.DashSpeed + Vector3.new(0, 15, 0)
end

-- client meminta kemampuan berdasarkan nama. server memeriksa apakah kemampuan itu valid,
-- player masih hidup, dan masa tunggunya selesai. Waktu kemampuan itu siap lagi
-- disimpan sebagai atribut player agar bisa ditampilkan di layar mereka.
remotes.Ability.OnServerEvent:Connect(function(player, name)
	if typeof(name) ~= "string" or not abilities[name] then
		return
	end
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if not root or character.Humanoid.Health <= 0 then
		return
	end
	local now = workspace:GetServerTimeNow()
	if now < (player:GetAttribute(name .. "ReadyAt") or 0) then
		return
	end
	player:SetAttribute(name .. "ReadyAt", now + Settings.Cooldowns[name])
	abilities[name](player, character, root)
end)

-- Setiap player mendapat Kills di papan peringkat dan pedang setiap kali hidup
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local kills = Instance.new("IntValue")
	kills.Name = "Kills"
	kills.Parent = leaderstats

	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 setelah beberapa saat 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)
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Roblox: Battlegrounds

Latihan sendiri: Playground Roblox