Waktu untuk mengkode fase terakhir permainan: bersihkan dan reset.Kode pada fase ini memastikan bahwa loop permainan berhenti dan bahwa pertandingan masa depan dimulai sama untuk setiap pemain.
Perbarui GUI
Sebelum melakukan pembersihan dan reset, beri tahu pemain bagaimana permainan berakhir menggunakan DisplayManager untuk menunjukkan status yang tepat.
Dapatkan nama pemenang
Mulai dengan mendapatkan nama pemain pemenang jika ada.Sebelumnya, kode memeriksa apakah ukuran tabel pemain aktif turun menjadi 1.Untuk mendapatkan nama pemain yang tersisa, kembalikan nama di indeks pertama dari tabel itu.
Di PlayerManager, mulai fungsi modul baru bernama getWinnerName() .
function PlayerManager.getWinnerName()end-- PeristiwaPlayers.PlayerAdded:Connect(onPlayerJoin)Tambahkan pernyataan if yang berjalan jika sesuatu ada di activePlayers[1] .Meskipun hitungan tabel sudah diperiksa sebelumnya, pemain mungkin telah terputus atau meninggalkan permainan.
function PlayerManager.getWinnerName()local winningPlayer = activePlayers[1]if winningPlayer thenendendDalam pernyataan if:
- Kembalikan nama pemain.
- Untuk sisanya, return string kesalahan.
function PlayerManager.getWinnerName()local winningPlayer = activePlayers[1]if winningPlayer thenreturn winningPlayer.Nameelsereturn "Error: No winning player found"endend
Dapatkan status akhir
Gunakan fungsi modul untuk mengambil informasi dari negara akhir yang benar, apakah timer berakhir atau satu pemain ditinggalkan.Kemudian, kirim variabel status itu ke DisplayManager untuk memperbarui status GUI dengan pesan yang sesuai.
Di MatchManager , kode fungsi modul baru bernama getEndStatus() dengan parameter bernama endState .Untuk menyimpan pesan yang akan dikirim, tambahkan variabel kosong bernama statusToReturn .
function MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endfunction MatchManager.getEndStatus(endState)local statusToReturnendmatchStart.Event:Connect(startTimer)matchEnd.Event:Connect(stopTimer)return MatchManagerTetapkan nilai statusToReturn menggunakan if dan pernyataan elseif.Periksa variabel negara akhir: FoundWinner dan TimerUp.Untuk memeriksa kesalahan, sertakan lainnya di akhir.
function MatchManager.getEndStatus(endState)local statusToReturnif endState == gameSettings.endStates.FoundWinner thenelseif endState == gameSettings.endStates.TimerUp thenelseendendTambahkan yang berikut untuk setiap kondisi:
FoundWinner
- Variabel untuk pemenang menggunakan playerManager.getWinnerName() .
- Perbarui statusToReturn dengan string yang mengumumkan pemenang.
TimerUp
- Perbarui statusToReturn dengan string yang mengumumkan waktu habis.
Else
- Perbarui statusToReturn dengan pesan kesalahan jika terdapat masalah dengan mendapatkan pesan permainan akhir.
function MatchManager.getEndStatus(endState)local statusToReturnif endState == gameSettings.endStates.FoundWinner thenlocal winnerName = playerManager.getWinnerName()statusToReturn = "Winner is : " .. winnerNameelseif endState == gameSettings.endStates.TimerUp thenstatusToReturn = "Time ran out!"elsestatusToReturn = "Error found"endendKirim kembali pesan dengan mengetik return statusToReturn .
function MatchManager.getEndStatus(endState)local statusToReturnif endState == gameSettings.endStates.FoundWinner thenlocal winnerName = playerManager.getWinnerName()statusToReturn = "Winner is : " .. winnerNameelseif endState == gameSettings.endStates.TimerUp thenstatusToReturn = "Time ran out!"elsestatusToReturn = "Error found"endreturn statusToReturnend
Tampilkan dan uji
Dapatkan pengumuman yang diperbarui di GameManager dan tampilkan kepada pemain yang menggunakan DisplayManager.
Buka GameManager .Selama loop benar, hapus pernyataan cetak terakhir.Kemudian, buat variabel bernama endStatus.Atur sebagai sama dengan memanggil matchManager.getEndStatus(endState).
while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()local endState = matchEnd.Event:Wait()local endStatus = matchManager.getEndStatus(endState)endUntuk menampilkan pesan yang dikembalikan di label GUI, panggil displayManager.updateStatus() dan berikan endStatus .
local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)Jadi permainan berhenti untuk membiarkan pemain melihat pesan, tambahkan tunggu menggunakan transitionTime .
local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)task.wait(gameSettings.transitionTime)Mulai server pengujian dan periksa apakah pemain melihat pesan berikut untuk waktu habis dan kondisi pemain pemenang.
Kondisi waktu habis Kondisi pemain pemenang
Tip pemecahan masalah
Pada titik ini, Anda tidak dapat melihat pesan, coba salah satu dari berikut ini.
- Jika pesan status akhir Anda adalah "Kesalahan Ditemukan", tidak satu pun kondisi berhasil. Periksa kode di MatchManager.getEndStatus() terhadap sampel kode.
- Jika status akhir tidak ditampilkan, periksa apakah task.wait(gameSettings.transitionTime) adalah setelah mengirim pesan ke displayManager.
Mulai pertandingan baru
Sebelum memulai pertandingan baru, akan ada transisi singkat.Ini memberi pemain waktu untuk melihat status akhir dan membuat teleportasi ke lobi terasa kurang tiba-tiba.
Pada akhir transisi, pemain yang tersisa akan dihapus dari arena, dan semua kode akan diatur ulang.Ini memastikan bahwa pemain akan memulai pertandingan berikutnya dengan versi bersih dari permainan.
Tangani transisi
Ketika pemain pindah ke negara transisi, hapus senjata mereka.
Di PlayerManager, temukan fungsi lokal.Salin dan tempel kode sorotan untuk removePlayerWeapon() di bawah ini.Kode akan menghapus senjata pemain individu jika aktif dilengkapi atau ada di ransel pemain.
local function removePlayerWeapon(whichPlayer)-- Periksa untuk melihat apakah pemain ada jika mereka terputus atau pergi.if whichPlayer thenlocal character = whichPlayer.Character-- Jika pemain memilikinya saat ini di karakter merekalocal weapon = character:FindFirstChild("Weapon")if weapon thenweapon:Destroy()end-- Jika pemain memiliki senjata di ransel merekalocal backpackWeapon = whichPlayer.Backpack:FindFirstChild("Weapon")if backpackWeapon thenbackpackWeapon:Destroy()endelseprint("No player to remove weapon")endendMulai fungsi modul baru bernama removeAllWeapons() .
function PlayerManager.removeAllWeapons()end-- PeristiwaPlayers.PlayerAdded:Connect(onPlayerJoin)return PlayerManagerDalam fungsi itu, gunakan loop for untuk melalui tabel pemain aktif. Di loop, panggil removePlayerWeapon() dan berikan pemain yang ditemukan.
function PlayerManager.removeAllWeapons()for playerKey, whichPlayer in activePlayers doremovePlayerWeapon(whichPlayer)endend
Bersihkan di antara pertandingan
Pembersihan akan menjadi fungsi sendiri di MatchManager.Saat ini, pembersihan hanya akan menggunakan fungsi yang sebelumnya dibuat untuk menghapus senjata pemain.Saat Anda memperluas permainan, lebih banyak bisa ditambahkan, seperti fungsi untuk mengatur ulang peta yang berubah selama pertandingan.
Buka MatchManager. Tambahkan fungsi modul baru bernama cleanupMatch() . Dalam fungsi itu, panggil playerManager.removeAllWeapons() .
function MatchManager.cleanupMatch()playerManager.removeAllWeapons()endmatchStart.Event:Connect(startTimer)matchEnd.Event:Connect(stopTimer)return MatchManagerSelanjutnya, hubungi fungsi pembersihan.Buka Manajer Permainan dan temukan sementara loop do benar.Jadi pemain memiliki senjata yang dihapus selama jeda akhir, panggil matchManager.cleanupMatch() sebelum terakhir task.wait().
while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()local endState = matchEnd.Event:Wait()local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)matchManager.cleanupMatch()task.wait(gameSettings.transitionTime)endMulai server pengujian dan jalankan pertandingan. Tunggu timer habis dan konfirmasikan bahwa senjata pemain dihapus selama jeda permainan akhir.
Selama pertandingan Setelah pertandingan
Setel ulang pertandingan
Anda mungkin telah memperhatikan beberapa hal lain dalam permainan, seperti pemain masih berada di arena setelah pertandingan berakhir.Dengan pertandingan dibersihkan, berikutnya reset game.Ini termasuk mengirim pemain di arena kembali ke lobi dan membersihkan meja pemain aktif.Dengan reset di tempat, loop permainan dapat berjalan tanpa batas.
Pertama, mulai fungsi untuk mengirim pemain kembali ke lobi.
Dalam PlayerManager:
- Buat fungsi modul bernama resetPlayers() .
- Tambahkan loop for untuk mengulangi melalui pemain aktif.
- Dalam loop, panggil respawnPlayerInLobby() dan berikan pemain sebagai parameter.
function PlayerManager.resetPlayers()for playerKey, whichPlayer in activePlayers dorespawnPlayerInLobby(whichPlayer)endend-- PeristiwaPlayers.PlayerAdded:Connect(onPlayerJoin)return PlayerManagerPastikan tabel activePlayers kosong untuk pertandingan berikutnya dengan menetapkannya sama dengan {}, yang merupakan cara cepat untuk mengatur ulang ke tabel kosong.
function PlayerManager.resetPlayers()for playerKey, whichPlayer in activePlayers dorespawnPlayerInLobby(whichPlayer)endactivePlayers = {}endBuka MatchManager. Kode fungsi modul baru bernama resetMatch() dan panggil playerManager.resetPlayers().
function MatchManager.resetMatch()playerManager.resetPlayers()endmatchStart.Event:Connect(startTimer)matchEnd.Event:Connect(stopTimer)return MatchManagerKembali ke GameManager . Pada akhir loop while true, panggil matchManager.resetMatch() .
while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()local endState = matchEnd.Event:Wait()local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)matchManager.cleanupMatch()task.wait(gameSettings.transitionTime)matchManager.resetMatch()endMulai server pengujian dan jalankan pertandingan. Konfirmasikan bahwa Anda dapat setidaknya melalui dua putaran permainan tanpa kesalahan.
Skrip selesai
Di bawah ini adalah skrip yang selesai untuk memeriksa ulang pekerjaan Anda.
Skrip Manajer Game
-- Layananlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))-- Peristiwalocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()local endState = matchEnd.Event:Wait()local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)matchManager.cleanupMatch()task.wait(gameSettings.transitionTime)matchManager.resetMatch()end
Skrip Manajer Pertandingan
local MatchManager = {}
-- Layanan
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Skrip Modul
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Peristiwa
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Nilai
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local timeLeft = displayValues:WaitForChild("TimeLeft")
-- Membuat objek penghitung waktu baru untuk digunakan untuk melacak waktu pertandingan.
local myTimer = timer.new()
-- Fungsi Lokal
local function stopTimer()
myTimer:stop()
end
local function timeUp()
matchEnd:Fire(gameSettings.endStates.TimerUp)
end
local function startTimer()
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
while myTimer:isRunning() do
-- Menambahkan +1 memastikan tampilan timer berakhir di 1 bukan 0.
timeLeft.Value = (myTimer:getTimeLeft() + 1) // 1
-- Dengan tidak menetapkan waktu untuk menunggu, ia menawarkan looping yang lebih akurat
task.wait()
end
end
-- Fungsi Modul
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
function MatchManager.getEndStatus(endState)
local messageToReturn
if endState == gameSettings.endStates.FoundWinner then
local winnerName = playerManager.getWinnerName()
messageToReturn = "Winner is : " .. winnerName
elseif endState == gameSettings.endStates.TimerUp then
messageToReturn = "Time ran out!"
else
messageToReturn = "Error found"
end
return messageToReturn
end
function MatchManager.cleanupMatch()
playerManager.removeAllWeapons()
end
function MatchManager.resetMatch()
playerManager.resetPlayers()
end
matchStart.Event:Connect(startTimer)
matchEnd.Event:Connect(stopTimer)
return MatchManager
Skrip Manajer Pemain
local PlayerManager = {}
-- Layanan
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Modul
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Peristiwa
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
-- Variabel Peta
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Nilai
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local playersLeft = displayValues:WaitForChild("PlayersLeft")
-- Variabel Pemain
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
local function checkPlayerCount()
if #activePlayers == 1 then
matchEnd:Fire(gameSettings.endStates.FoundWinner)
print("Found winner")
end
end
local function removeActivePlayer(player)
print("removing player")
for playerKey, whichPlayer in activePlayers do
if whichPlayer == player then
table.remove(activePlayers, playerKey)
playersLeft.Value = #activePlayers
checkPlayerCount()
end
end
end
local function respawnPlayerInLobby(player)
player.RespawnLocation = lobbySpawn
player:LoadCharacter()
end
local function preparePlayer(player, whichSpawn)
player.RespawnLocation = whichSpawn
player:LoadCharacter()
local character = player.Character or player.CharacterAdded:Wait()
-- Berikan pemain alat
local sword = playerWeapon:Clone()
sword.Parent = character
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
respawnPlayerInLobby(player)
removeActivePlayer(player)
end)
end
local function onPlayerJoin(player)
player.RespawnLocation = lobbySpawn
end
local function removePlayerWeapon(whichPlayer)
-- Periksa untuk melihat apakah pemain ada jika mereka terputus atau pergi.
if whichPlayer then
local character = whichPlayer.Character
-- Jika pemain memilikinya saat ini di karakter mereka
local weapon = character:FindFirstChild("Weapon")
if weapon then
weapon:Destroy()
end
-- Jika pemain memiliki senjata di ransel mereka
local backpackWeapon = whichPlayer.Backpack:FindFirstChild("Weapon")
if backpackWeapon then
backpackWeapon:Destroy()
end
else
print("No player to remove weapon")
end
end
function PlayerManager.sendPlayersToMatch()
local availableSpawnPoints = spawnLocations:GetChildren()
for playerKey, whichPlayer in Players:GetPlayers() do
table.insert(activePlayers,whichPlayer)
-- Mendapatkan lokasi spawn dan kemudian menghapusnya dari tabel sehingga pemain berikutnya mendapatkan spawn berikutnya
local spawnLocation = table.remove(availableSpawnPoints, 1)
preparePlayer(whichPlayer, spawnLocation)
end
playersLeft.Value = #activePlayers
end
function PlayerManager.getWinnerName()
local winningPlayer = activePlayers[1]
if winningPlayer then
return winningPlayer.Name
else
return "Error: No player found"
end
end
function PlayerManager.removeAllWeapons()
for playerKey, whichPlayer in activePlayers do
removePlayerWeapon(whichPlayer)
end
end
function PlayerManager.resetPlayers()
for playerKey, whichPlayer in activePlayers do
respawnPlayerInLobby(whichPlayer)
end
activePlayers = {}
end
-- Peristiwa
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager