Menu
CoddyTech

Katılırken Yükle

Coddy'nin Roblox Oyunu: Sonsuz Kule kursunda ders 21 / 21.

Kayıtlar hazır; şimdi onları geri okuyun. GetAsync, bir anahtar altında kaydedilen değeri döndürür ya da hiç oynamamış bir oyuncu için nil döndürür. Hata da verebilir, bu yüzden pcall içine alınır; pcall işlemin başarılı olup olmadığını ve ardından değeri döndürür:

local ok, saved = pcall(function()
	return coinStore:GetAsync(player.UserId)
end)
if ok and saved then
	coins.Value = saved.Coins or 0
end

or 0, oyunun bu alanı içermeyen eski bir sürümünden kalan bir kaydı ele alır.

challenge icon

Görev

Zor

Oyunculara en son kaydettiklerini geri yükle.

  1. PlayerAdded içinde, BestTime'ı oluşturduktan sonra: local ok, saved = pcall(function() return towerStore:GetAsync(player.UserId) end).
  2. ok and saved doğruysa Wins değerini saved.Wins or 0, BestTime değerini de saved.BestTime or 0 olarak ayarla.

“Oyna”'ya bas, kazan, Stop'a ve tekrar “Oyna”'ya bas: Wins ve BestTime değerlerin geri gelir. Ardından “Kontrol et”'e bas.

Kendin dene

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local DataStoreService = game:GetService("DataStoreService")
local Settings = require(game.ReplicatedStorage.Settings)

local stages = ServerStorage.Stages
local lobbySpawn = workspace.Lobby.SpawnLocation
local towerStore = DataStoreService:GetDataStore("Tower")
local tower = nil
local towerStages = {}
local lava = nil
local roundStart = 0
local finished = {}

print("Each tower has " .. Settings.StageCount .. " stages")

-- Her oyuncunun liderlik tablosunda Wins, Stage ve BestTime değerleri bulunur
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 stage = Instance.new("IntValue")
	stage.Name = "Stage"
	stage.Parent = leaderstats

	local best = Instance.new("NumberValue")
	best.Name = "BestTime"
	best.Parent = leaderstats

	-- Ders 21: Load on Join buraya gelecek
	-- Düşen bir oyuncu, ulaştığı son aşamadan yeniden başlar,
	-- lav o aşamayı kaplamışsa lobide bekler
	player.CharacterAdded:Connect(function(character)
		task.wait()
		local checkpoint = towerStages[stage.Value]
		local covered = checkpoint and lava and checkpoint.Start.Position.Y < lava.Position.Y + lava.Size.Y / 2
		if checkpoint and not covered and not finished[player] then
			character:PivotTo(checkpoint.Start.CFrame + Vector3.new(0, 4, 0))
		end
	end)
end)

-- Lobideki pano
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.Lobby.Board

local boardLabel = Instance.new("TextLabel")
boardLabel.Name = "Status"
boardLabel.Size = UDim2.fromScale(1, 1)
boardLabel.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
boardLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
boardLabel.TextScaled = true
boardLabel.Text = "Endless Tower"
boardLabel.Parent = gui

local function setBoard(text)
	boardLabel.Text = text
end

-- Kill etiketi taşıyan her şey bir canı sona erdirir
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Kaybolan bir basamak, üzerine biri bastıktan kısa süre sonra silikleşir ve ardından geri gelir
local function makeVanish(part)
	part.Touched:Connect(function(hit)
		if part:GetAttribute("Gone") or not hit.Parent:FindFirstChild("Humanoid") then
			return
		end
		part:SetAttribute("Gone", true)
		task.wait(Settings.VanishDelay)
		part.Transparency = 0.8
		part.CanCollide = false
		task.wait(Settings.VanishTime)
		part.Transparency = 0
		part.CanCollide = true
		part:SetAttribute("Gone", nil)
	end)
end

-- Bir lazer, Slide kadar kayıp geri döner; bu hareketi sürekli tekrarlar
local function makeSlide(part)
	local info = TweenInfo.new(Settings.SlideTime, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1, true)
	local goal = { Position = part.Position + part:GetAttribute("Slide") }
	TweenService:Create(part, info, goal):Play()
end

-- Bir zıplama platformu, üzerine basanı havaya fırlatır
local function bounce(hit)
	local root = hit.Parent:FindFirstChild("HumanoidRootPart")
	if root then
		root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
	end
end

-- Dönen nesneler her karede biraz döner
RunService.Heartbeat:Connect(function(dt)
	for _, spinner in CollectionService:GetTagged("Spinner") do
		if spinner:IsDescendantOf(workspace) then
			spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0))
		end
	end
end)

-- Bir aşamadaki tüm engelleri etiketlerine göre etkinleştir
local function setupStage(stage, index)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
		if part:HasTag("Vanish") then
			makeVanish(part)
		end
		if part:HasTag("Conveyor") then
			part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeed
		end
		if part:HasTag("Slider") then
			makeSlide(part)
		end
		if part:HasTag("Bounce") then
			part.Touched:Connect(bounce)
		end
	end
	-- Bir aşamanın Start noktasına ulaşmak liderlik tablosuna işlenir
	stage.Start.Touched:Connect(function(hit)
		local player = Players:GetPlayerFromCharacter(hit.Parent)
		if player and player.leaderstats.Stage.Value < index then
			player.leaderstats.Stage.Value = index
		end
	end)
end

-- Yukarı çıktıkça aşamalar zorlaşır: alt üçte birlik bölüm kolay, üst üçte birlik bölüm zordur
local function pickStage(index)
	local difficulty = math.ceil(index / Settings.StageCount * 3)
	local choices = {}
	for _, stage in stages:GetChildren() do
		if stage:GetAttribute("Difficulty") == difficulty then
			table.insert(choices, stage)
		end
	end
	return choices[math.random(1, #choices)]
end

-- Bir modelin kopyasını kulenin tepesine yerleştirir; kopyayı ve yeni tepe noktasını döndürür
local function stack(template, bottom)
	local copy = template:Clone()
	local box, size = copy:GetBoundingBox()
	local lift = bottom - (box.Position.Y - size.Y / 2)
	copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
	copy.Parent = tower
	return copy, bottom + size.Y
end

-- Kulenin tepesi: bir galibiyet ve lobiye dönüş
local function reachTop(hit)
	local player = Players:GetPlayerFromCharacter(hit.Parent)
	if not player or finished[player] then
		return
	end
	finished[player] = true
	player.leaderstats.Wins.Value += 1
	local seconds = math.floor((time() - roundStart) * 10) / 10
	local best = player.leaderstats.BestTime
	if best.Value == 0 or seconds < best.Value then
		best.Value = seconds
	end
	print(player.Name .. " reached the top in " .. seconds .. " seconds")
	hit.Parent:PivotTo(lobbySpawn.CFrame + Vector3.new(0, 4, 0))
end

-- Aşağıdan yukarıya yeni bir rastgele kule oluşturur
local function buildTower()
	tower = Instance.new("Model")
	tower.Name = "Tower"
	tower.Parent = workspace
	towerStages = {}
	local top = 0
	for i = 1, Settings.StageCount do
		local stage, newTop = stack(pickStage(i), top)
		top = newTop
		setupStage(stage, i)
		towerStages[i] = stage
	end
	local finish = stack(ServerStorage.Finish, top)
	finish.FinishPad.Touched:Connect(reachTop)
	return top
end

-- Lav, yerden kulenin tepesinin hemen altına kadar yükselir
local function startLava(top)
	lava = Instance.new("Part")
	lava.Name = "Lava"
	lava.Anchored = true
	lava.CanCollide = false
	lava.Size = Vector3.new(30, 2, 30)
	lava.Position = Vector3.new(0, -2, 0)
	lava.Color = Color3.fromRGB(255, 90, 20)
	lava.Material = Enum.Material.Neon
	lava.Parent = workspace
	lava.Touched:Connect(killOnTouch)
	local info = TweenInfo.new(top / Settings.LavaSpeed, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, 0, false, Settings.LavaDelay)
	TweenService:Create(lava, info, { Position = Vector3.new(0, top - 2, 0) }):Play()
end

local function startRound()
	finished = {}
	for _, player in Players:GetPlayers() do
		player.leaderstats.Stage.Value = 0
	end
	local top = buildTower()
	startLava(top)
	roundStart = time()
	for _, player in Players:GetPlayers() do
		if player.Character then
			player.Character:PivotTo(towerStages[1].Start.CFrame + Vector3.new(0, 4, 0))
		end
	end
end

local function endRound()
	for _, player in Players:GetPlayers() do
		if player.Character and not finished[player] then
			player.Character:PivotTo(lobbySpawn.CFrame + Vector3.new(0, 4, 0))
		end
		player.leaderstats.Stage.Value = 0
	end
	tower:Destroy()
	lava:Destroy()
	towerStages = {}
end

-- Kaydetme: Wins ve BestTime
local function saveProgress(player)
	local data = {
		Wins = player.leaderstats.Wins.Value,
		BestTime = player.leaderstats.BestTime.Value,
	}
	pcall(function()
		towerStore:SetAsync(player.UserId, data)
	end)
end

Players.PlayerRemoving:Connect(saveProgress)

game:BindToClose(function()
	for _, player in Players:GetPlayers() do
		saveProgress(player)
	end
end)

-- Tur döngüsü
while true do
	for i = Settings.Intermission, 1, -1 do
		setBoard("Next tower in " .. i)
		task.wait(1)
	end
	startRound()
	for i = Settings.RoundLength, 1, -1 do
		setBoard("Climb! " .. i .. " seconds left")
		task.wait(1)
	end
	endRound()
end
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Roblox Oyunu: Sonsuz Kule bölümündeki tüm dersler

Kendi başına pratik yap: Roblox playground