Menu
CoddyTech

Gửi yêu cầu đến máy chủ

Bài học 6 trên 25 trong khóa học Trò chơi Roblox: Đấu trường của Coddy.

Kỹ năng bắt đầu trên thiết bị của người chơi. BattleClient là một LocalScript trong HUD. ContextActionService gắn một hành động với các phím, và khi dùng true làm đối số thứ ba, nó cũng thêm một nút cho hành động đó trên màn hình điện thoại:

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

Hàm nhận tên hành động và trạng thái đầu vào, Begin khi bạn nhấn phím. Máy chủ quản lý các quy tắc, nên client chỉ gửi yêu cầu qua RemoteEvent Remotes.Ability. Ở phía máy chủ, OnServerEvent nhận sự kiện này, và Roblox truyền người chơi kích hoạt sự kiện làm đối số đầu tiên:

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

Thử thách

Trung bình

Nhấn Q để yêu cầu máy chủ thực hiện cú lướt.

  1. Trong BattleClient, viết use(name, state): khi Enum.UserInputState.Begin, gọi remotes.Ability:FireServer(name).
  2. Gán phím cho hàm: ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q).
  3. Trong BattleServer, kết nối remotes.Ability.OnServerEvent với print(player.Name .. " asked for " .. name).

Nhấn Chơi rồi nhấn Q: đầu ra hiển thị Player1 asked for Dash. Sau đó nhấn Kiểm tra.

Tự làm thử

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

local lastSwing = {} -- player -> thời điểm vung kiếm gần nhất

-- Hoạt ảnh vung kiếm có sẵn của Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

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

-- Một lần vung kiếm: phát hoạt ảnh, rồi đánh trúng mọi đối tượng trong vùng hộp phía trước bạn
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()
	-- Vùng hộp phía trước bạn, không bao gồm cơ thể bạn
	local params = OverlapParams.new()
	params.FilterDescendantsInstances = { character }
	local box = root.CFrame * CFrame.new(0, 0, -3)
	local hit = {} -- Mỗi humanoid chỉ bị đánh trúng một lần trong mỗi lần vung kiếm
	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

-- Mỗi người chơi nhận một thanh kiếm ở mỗi lượt sống
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)

-- Hình nộm tập luyện: thanh máu thay đổi theo lượng máu; khi bị đánh bại,
-- hình nộm xuất hiện lại sau chốc lát dưới dạng bản sao mới ở cùng vị trí
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)

Tất cả bài học trong Trò chơi Roblox: Đấu trường

Tự luyện tập: Playground Roblox