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)Görev
OrtaQ tuşunun sunucudan atılma yeteneğini istemesini sağla.
BattleClientiçindeuse(name, state)yaz:Enum.UserInputState.Begindurumundaremotes.Ability:FireServer(name)çağır.- Bağla:
ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q). BattleServeriçinderemotes.Ability.OnServerEventolayı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