Hantaman Tanah
Pelajaran 9 dari 20 dalam kursus Game Roblox: Battlegrounds di Coddy.
Kemampuan kedua, dengan E: hantaman tanah yang mengenai semua orang di sekitarmu dan melempar mereka menjauh. workspace:GetPartBoundsInRadius(position, radius, params) menemukan bagian-bagian dalam jarak tertentu, dan ApplyImpulse pada root memberi dorongan pada seluruh tubuhnya. Impuls adalah perubahan kecepatan dikalikan massa, jadi mengalikannya dengan AssemblyMass akan melempar rig ringan dan berat dengan cara yang sama:
theirRoot:ApplyImpulse((away * Settings.SlamKnockback + Vector3.new(0, 40, 0)) * theirRoot.AssemblyMass)Sekarang game memiliki dua cara untuk melukai seseorang, dan cara lainnya akan segera hadir. Setiap serangan melewati satu fungsi, hurt(humanoid, amount), jadi aturan tentang damage (pemblokiran, pelajaran berikutnya) ditulis sekali.
Tantangan
Sedang- Tulis
hurt(humanoid, amount)di atasswing: lakukan return jika Humanoid sudah kalah, jika tidak, jalankanTakeDamage(amount). Buatswingmemanggilnya. - Tambahkan
abilities.Slam: semua orang (masing-masing satu kali, kecuali kamu) yang memiliki root dalam jarakSettings.SlamRadiusmenerima damage melaluihurtsebesarSettings.SlamDamage, lalu terdorong menjauh darimu denganSettings.SlamKnockbackdan gaya ke atas sebesar 40. - Di
BattleClient, ikat"Slam"ke E, lalu tambahkan ke tampilan cooldown.
Tekan Play, lalu Check.
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 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 ada di 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)
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 waktu tunggunya sudah selesai. Waktu kemampuan itu siap lagi
-- disimpan sebagai atribut player, agar bisa ditampilkan di layarnya.
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 nyawanya mengikuti sisa nyawanya, 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)
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Game Roblox: Battlegrounds
Latihan sendiri: Playground Roblox