Menu
CoddyTech

Yere Vuruş

Coddy'nin Roblox Oyunu: Savaş Arenası kursunda ders 9 / 20.

İkinci bir yetenek, E tuşunda: etrafındaki herkese vuran ve onları uzağa savuran bir yere çarpma hareketi. workspace:GetPartBoundsInRadius(position, radius, params), belirli bir mesafe içindeki parçaları bulur ve bir köke uygulanan ApplyImpulse, tüm gövdesini iter. Bir itki, kütle ile hız değişiminin çarpımıdır; bu yüzden AssemblyMass ile çarpmak, hafif ve ağır donanımları aynı şekilde savurur:

theirRoot:ApplyImpulse((away * Settings.SlamKnockback + Vector3.new(0, 40, 0)) * theirRoot.AssemblyMass)

Artık oyunda birine zarar vermenin iki yolu var ve yenileri de geliyor. Her vuruş, hurt(humanoid, amount) adlı tek bir işlevden geçer; böylece hasarla ilgili bir kural (engelleme, sonraki ders) yalnızca bir kez yazılır.

challenge icon

Görev

Orta
  1. swing'in üstüne hurt(humanoid, amount) yaz: Humanoid zaten yenilmişse geri dön, aksi hâlde TakeDamage(amount) çağır. swing'in bunu çağırmasını sağla.
  2. abilities.Slam ekle: Settings.SlamRadius içinde bir root'u olan herkes (her biri bir kez, sen değil) hurt aracılığıyla Settings.SlamDamage kadar hasar alır ve Settings.SlamKnockback ile senden uzağa ve 40 birim yukarı itilir.
  3. BattleClient içinde "Slam"'i E tuşuna bağla ve bekleme süresi göstergesine ekle.

Play'e, ardından Check'e bas.

Kendin dene

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

local remotes = game.ReplicatedStorage.Remotes
local lastSwing = {} -- player -> son kılıcı ne zaman savurduğu

-- Roblox'un kendi kılıç animasyonları
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

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

-- Bir kılıç savuruşu: önce animasyon oynar, ardından önündeki kutunun içindeki herkes darbe alır
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()
	-- önündeki kutu; kendi vücudun asla dahil değil
	local params = OverlapParams.new()
	params.FilterDescendantsInstances = { character }
	local box = root.CFrame * CFrame.new(0, 0, -3)
	local hit = {} -- her humanoid, her savuruşta yalnızca bir kez
	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

-- Yetenekler, adlarına göre: her birinin ne yaptığı
local abilities = {}

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

-- İstemci, bir yeteneği adıyla kullanmak ister. Sunucu şunları kontrol eder: geçerli bir
-- yetenek olması, oyuncunun hayatta olması ve yeteneğin bekleme süresinin dolmuş olması. Yeteneğin yeniden ne zaman hazır olacağı
-- oyuncunun bir niteliğidir; böylece oyuncunun ekranında gösterilebilir.
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)

-- Her oyuncunun skor tablosunda Kills değeri olur ve her yeniden doğduğunda bir kılıç alır
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)

-- Antrenman mankeni: can çubuğu can durumunu gösterir; yenilen
-- manken kısa bir süre sonra aynı yerde yeni bir kopya olarak geri gelir
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Roblox Oyunu: Savaş Arenası bölümündeki tüm dersler