Menu
CoddyTech

Q ile Atıl

Coddy'nin Roblox Oyunu: Savaş Arenası kursunda ders 7 / 25.

Bir atılma bir itiştir: bir kökün AssemblyLinearVelocity değerini ayarlamak karakteri fırlatır. Ancak Roblox, her oyuncunun cihazının kendi karakterinin fiziğini çalıştırmasına izin verir; bu nedenle sunucunun ayarladığı bir itiş onları neredeyse hiç hareket ettirmez. Kararı sunucu verir, itişi ise oyuncunun kendi LocalScript'i uygular.

Sunucu, yeteneklerini ada göre bir tabloda tutar ve atılma izni, FireClient ile o oyuncunun istemcisine gönderilir; orada OnClientEvent tarafından alınır:

remotes.Ability.OnClientEvent:Connect(function(name)
	if name == "Hop" then
		root.AssemblyLinearVelocity = Vector3.new(0, 50, 0)
	end
end)
challenge icon

Görev

Orta

Q ile atılma yap: sunucu onay verir, cihazın seni ileri iter.

  1. BattleServer içinde print ifadesini bir abilities tablosuyla değiştir: abilities.Dash(player), remotes.Ability:FireClient(player, "Dash") çağırır.
  2. İşleyici, varsa abilities[name](player, character, root) çalıştırır.
  3. BattleClient içinde, remotes.Ability.OnClientEvent üzerinde "Dash" geldiğinde, kök parçanın hızını root.CFrame.LookVector * Settings.DashSpeed + Vector3.new(0, 15, 0) olarak ayarla.

“Oyna” düğmesine bas ve Q'ya bas: ileri doğru atılırsın. Ardından “Kontrol et”.

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 -> en son ne zaman kılıç 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ıç savurma: 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 kılıç savurmada 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)
			print(humanoid.Parent.Name .. " is at " .. humanoid.Health)
		end
	end
end

-- İstemci, bir yeteneği adıyla ister
remotes.Ability.OnServerEvent:Connect(function(player, name)
	print(player.Name .. " asked for " .. name)
end)

-- Her oyuncu, her yeniden doğuşunda bir kılıç alır
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)

-- Antrenman kuklası: can çubuğu can durumuna göre değişir; yenilen
-- kukla 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)

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

Kendi başına pratik yap: Roblox playground