Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang
  1. Tulis hurt(humanoid, amount) di atas swing: lakukan return jika Humanoid sudah kalah, jika tidak, jalankan TakeDamage(amount). Buat swing memanggilnya.
  2. Tambahkan abilities.Slam: semua orang (masing-masing satu kali, kecuali kamu) yang memiliki root dalam jarak Settings.SlamRadius menerima damage melalui hurt sebesar Settings.SlamDamage, lalu terdorong menjauh darimu dengan Settings.SlamKnockback dan gaya ke atas sebesar 40.
  3. 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)
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