Menu
CoddyTech

Sunucuya Sor

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

Yetenekler oyuncunun cihazında başlar. BattleClient, HUD içindeki bir LocalScript'tir. ContextActionService bir eylemi tuşlara bağlar ve üçüncü argüman olarak true verildiğinde telefon ekranına bu eylem için bir düğme de ekler:

ContextActionService:BindAction("Wave", use, true, Enum.KeyCode.T)

Fonksiyon, eylemin adını ve girişin durumunu alır; tuşa basıldığında durum Begin olur. Kurallar sunucunun kontrolündedir, bu nedenle istemci yalnızca RemoteEvent Remotes.Ability üzerinden istekte bulunur. Sunucuda OnServerEvent bu isteği dinler ve Roblox, isteği gönderen oyuncuyu ilk argüman olarak iletir:

remotes.Ability.OnServerEvent:Connect(function(player, name)
	print(name .. " from " .. player.Name)
end)
challenge icon

Görev

Orta

Q tuşunun sunucudan atılma yeteneğini istemesini sağla.

  1. BattleClient içinde use(name, state) yaz: Enum.UserInputState.Begin durumunda remotes.Ability:FireServer(name) çağır.
  2. Bağla: ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q).
  3. BattleServer içinde remotes.Ability.OnServerEvent olayını print(player.Name .. " asked for " .. name) işlevine bağla.

“Oyna” düğmesine bas ve Q tuşuna bas: Output'ta Player1 asked for Dash yazar. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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

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ıç savuruşu: önce animasyon oynatılır, 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, asla kendi bedenin 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)
			print(humanoid.Parent.Name .. " is at " .. humanoid.Health)
		end
	end
end

-- Her oyuncu her canında 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 durumunu gösterir ve yenilen
-- kukla 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)

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

Kendi başına pratik yap: Roblox playground