Muat Saat Bergabung
Pelajaran 19 dari 20 dalam kursus Game Roblox: Bertahan dari Bencana di Coddy.
Wins sudah tersimpan. Sekarang, pemain yang kembali seharusnya mendapatkannya. GetAsync(key) membaca data yang disimpan dengan sebuah kunci, atau nil jika belum ada data yang disimpan untuk pemain tersebut. Pemanggilan ini bisa gagal seperti pemanggilan DataStore lainnya, jadi gunakan pcall juga. Fungsi ini mengembalikan apakah pemanggilan berhasil, lalu nilai yang dikembalikan oleh fungsi tersebut:
local ok, saved = pcall(function()
return coinsStore:GetAsync(player.UserId)
end)
if ok and saved then
coins.Value = saved
endMuat data di PlayerAdded, tepat setelah nilai Wins pemain dibuat. Jika pemanggilan gagal atau tidak menemukan data, pemain mulai dari 0 seperti sebelumnya.
Tantangan
SulitBerikan setiap pemain Wins yang tersimpan saat mereka bergabung.
- Di PlayerAdded, setelah IntValue Wins dibuat, panggil
winsStore:GetAsync(player.UserId)di dalampcall:local ok, saved = pcall(...). - Jika
ok and saved, tetapkan nilai Wins kesaved.
Tekan tombol “Main”, bertahanlah selama satu ronde, hentikan permainan, lalu tekan tombol “Main” lagi: Wins-mu akan kembali. Lalu tekan tombol “Periksa”.
Coba sendiri
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local DataStoreService = game:GetService("DataStoreService")
local Settings = require(game.ReplicatedStorage.Settings)
local lobbySpawn = workspace.LobbySpawn
local winsStore = DataStoreService:GetDataStore("Wins")
print("Rounds last " .. Settings.RoundLength .. " seconds")
-- Setiap pemain mendapat Wins dan Streak di papan peringkat
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Parent = leaderstats
local streak = Instance.new("IntValue")
streak.Name = "Streak"
streak.Parent = leaderstats
-- Pelajaran 19: Load on Join ditempatkan di sini
end)
local function saveWins(player)
pcall(function()
winsStore:SetAsync(player.UserId, player.leaderstats.Wins.Value)
end)
end
Players.PlayerRemoving:Connect(saveWins)
game:BindToClose(function()
for _, player in Players:GetPlayers() do
saveWins(player)
end
end)
-- Papan status di lobi
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.StatusBoard
local status = Instance.new("TextLabel")
status.Name = "Status"
status.Size = UDim2.fromScale(1, 1)
status.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
status.TextColor3 = Color3.fromRGB(255, 255, 255)
status.TextScaled = true
status.Text = "Welcome to Disaster Survival!"
status.Parent = gui
local function setStatus(text)
status.Text = text
end
local function teleport(player, target)
local character = player.Character
if character then
character:PivotTo(target.CFrame + Vector3.new(0, 4, 0))
end
end
local function defeat(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- Label "Survivor" yang melayang di atas kepala pemain
local function tagSurvivor(character)
local tag = Instance.new("BillboardGui")
tag.Name = "SurvivorTag"
tag.Size = UDim2.fromOffset(120, 30)
tag.StudsOffset = Vector3.new(0, 2.5, 0)
tag.Parent = character.Head
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundTransparency = 1
label.Text = "Survivor"
label.TextColor3 = Color3.fromRGB(80, 255, 120)
label.TextScaled = true
label.Parent = tag
end
-- Daftar bencana berdasarkan nama
local Disasters = {}
function Disasters.Flood(map)
local base = map.Base
local water = Instance.new("Part")
water.Name = "Water"
water.Anchored = true
water.CanCollide = false
water.Transparency = 0.3
water.Color = Color3.fromRGB(40, 120, 255)
water.Size = Vector3.new(base.Size.X + 10, 1, base.Size.Z + 10)
water.Position = base.Position - Vector3.new(0, 2, 0)
water.Parent = map
water.Touched:Connect(defeat)
local rise = TweenInfo.new(Settings.RoundLength * 0.8, Enum.EasingStyle.Linear)
TweenService:Create(water, rise, { Position = water.Position + Vector3.new(0, 8, 0) }):Play()
end
function Disasters.Meteors(map)
local base = map.Base
task.spawn(function()
while map.Parent do
local meteor = Instance.new("Part")
meteor.Name = "Meteor"
meteor.Shape = Enum.PartType.Ball
meteor.Size = Vector3.new(3, 3, 3)
meteor.Color = Color3.fromRGB(255, 120, 30)
meteor.Material = Enum.Material.Neon
local x = base.Position.X + math.random(-15, 15)
local z = base.Position.Z + math.random(-15, 15)
meteor.Position = Vector3.new(x, 40, z)
meteor.Parent = map
meteor.Touched:Connect(defeat)
Debris:AddItem(meteor, 4)
task.wait(0.5)
end
end)
end
function Disasters.Shrink(map)
local base = map.Base
local shrink = TweenInfo.new(Settings.RoundLength * 0.7, Enum.EasingStyle.Linear)
TweenService:Create(base, shrink, { Size = Vector3.new(6, base.Size.Y, 6) }):Play()
end
local function pickDisaster()
-- Settings.Disaster menjalankan satu bencana jika tersedia dalam game
if Settings.Disaster and Disasters[Settings.Disaster] then
return Settings.Disaster
end
local names = {}
for name in Disasters do
table.insert(names, name)
end
table.sort(names)
return names[math.random(1, #names)]
end
local function pickMap()
local maps = ServerStorage.Maps
if Settings.Map then
return maps:FindFirstChild(Settings.Map)
end
local all = maps:GetChildren()
return all[math.random(1, #all)]
end
-- Perulangan ronde
while true do
for seconds = Settings.Intermission, 1, -1 do
setStatus("Intermission: " .. seconds)
task.wait(1)
end
local template = pickMap()
local map = template:Clone()
map.Name = "Map"
map.Parent = workspace
setStatus("Map: " .. template.Name)
local survivors = {}
for _, player in Players:GetPlayers() do
local character = player.Character
if character and character.Humanoid.Health > 0 then
teleport(player, map.Spawn)
tagSurvivor(character)
survivors[player] = true
character.Humanoid.Died:Connect(function()
survivors[player] = nil
player.leaderstats.Streak.Value = 0
end)
end
end
task.wait(2)
local disaster = pickDisaster()
Disasters[disaster](map)
for seconds = Settings.RoundLength, 1, -1 do
setStatus(disaster .. "! Time left: " .. seconds)
task.wait(1)
end
local names = {}
for player in survivors do
player.leaderstats.Wins.Value += 1
player.leaderstats.Streak.Value += 1
local tag = player.Character and player.Character.Head:FindFirstChild("SurvivorTag")
if tag then
tag:Destroy()
end
teleport(player, lobbySpawn)
table.insert(names, player.Name)
end
map:Destroy()
if #names > 0 then
setStatus("Winners: " .. table.concat(names, ", "))
else
setStatus("Nobody survived!")
end
task.wait(3)
end
Semua pelajaran di Game Roblox: Bertahan dari Bencana
4Jadikan Ini Game
Dua PetaLatihan sendiri: Playground Roblox