Çöl Kapısı
Coddy'nin Roblox Oyunu: Evcil Hayvan Simülatörü kursunda ders 15 / 18.
Arkada bulunan kırmızı duvar, üzerinde "Unlock" istemi olan Çöl kapısıdır. Settings.GatePrice ödenince kapının açılması gerekir, ancak yalnızca ödemeyi yapan oyuncu için.
Bunun için her iki taraf da gerekir. Sunucu paraları alır ve kilidin açıldığını oyuncu üzerinde bir özellik olarak kaydeder: Desert. Her kural bunu kontrol edebilir. İstemci bu özelliği izler ve kapıyı kendi ekranında açar: Roblox'ta her oyuncunun cihazı kendi karakterini hareket ettirir; bu nedenle bir LocalScript'in katı olmayan hâle getirdiği duvar, diğer herkes için katı kalırken o oyuncunun geçmesine izin verir.
-- istemci
workspace.Gate.CanCollide = false
workspace.Gate.Transparency = 0.7Kapının istemini de aynı şekilde gizlemek, ikinci bir kilit açma seçeneği sunmasını önler.
Görev
ZorPetServeriçindeworkspace.Gate.ProximityPrompt.Triggeredbağlantısını kur: oyuncunun zatenDesertniteliği varsa veyaSettings.GatePricedeğerinden daha az parası varsa işlemi durdur; aksi takdirde ücreti al ve oyuncununDesertniteliğini true olarak ayarla.PetClientiçindeopenGate()işlevini yaz: oyuncunun Desert niteliği ayarlanmışsa kapının CanCollide değerini false, Transparency değerini 0.7 ve isteminin Enabled değerini false yap. İşlevi şimdi ve nitelik değiştiğinde çağır.
Oyna'ya bas, 100 coin kazan ve Çöl'ün kilidini aç. Ardından Kontrol Et'e bas.
Kendin dene
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local RunService = game:GetService("RunService")
local Settings = require(game.ReplicatedStorage.Settings)
local remotes = game.ReplicatedStorage.Remotes
local piles = workspace.Piles
local petParts = workspace.PetParts
local pileSpot = {} -- her yığın -> bulunduğu nokta
local lastHit = {} -- her oyuncu -> en son ne zaman vurduğu
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- ada göre Settings.Pets
local petInfo = {}
for _, info in Settings.Pets do
petInfo[info.Name] = info
end
-- Bir evcil hayvan: oyuncunun Pets klasöründe, adını tutan ve
-- nadirliği ile gücünü öznitelik olarak taşıyan bir StringValue
local function givePet(player, name, equipped)
local info = petInfo[name]
local pet = Instance.new("StringValue")
pet.Name = "Pet"
pet.Value = name
pet:SetAttribute("Rarity", info.Rarity)
pet:SetAttribute("Power", info.Power)
pet:SetAttribute("Equipped", equipped)
pet.Parent = player.Pets
return pet
end
-- bir oyuncunun dışarıda kaç evcil hayvanı olduğu
local function equippedCount(player)
local count = 0
for _, pet in player.Pets:GetChildren() do
if pet:GetAttribute("Equipped") then
count += 1
end
end
return count
end
-- bir oyuncunun evcil hayvanlarının her vuruşa eklediği güç
local function petPower(player)
local power = 0
for _, pet in player.Pets:GetChildren() do
if pet:GetAttribute("Equipped") then
power += pet:GetAttribute("Power")
end
end
return power
end
-- Her oyuncunun liderlik tablosunda Coins değeri olur
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Parent = leaderstats
-- sahip oldukları evcil hayvanlar
local pets = Instance.new("Folder")
pets.Name = "Pets"
pets.Parent = player
end)
-- Bir noktadaki para yığını: sağlığı ve
-- değeri öznitelik olarak tutulan bir ServerStorage.CoinPile kopyası
local function spawnPile(spot)
local pile = ServerStorage.CoinPile:Clone()
pile.Position = spot.Position
pile:SetAttribute("MaxHealth", Settings.PileHealth)
pile:SetAttribute("Health", Settings.PileHealth)
pile:SetAttribute("Value", Settings.PileValue)
pile.HealthGui.Label.Text = pile:GetAttribute("Health") .. "/" .. pile:GetAttribute("MaxHealth")
pileSpot[pile] = spot
pile.Parent = piles
return pile
end
-- Bir vuruş, yığının sağlığından 1 ve oyuncunun evcil hayvanlarının gücü kadar düşürür;
-- 0'a düştüğünde yığın parçalanır ve değeri kadar ödeme yapar
local function hitPile(player, pile)
local health = pile:GetAttribute("Health") - (1 + petPower(player))
if health > 0 then
pile:SetAttribute("Health", health)
pile.HealthGui.Label.Text = health .. "/" .. pile:GetAttribute("MaxHealth")
return
end
player.leaderstats.Coins.Value += pile:GetAttribute("Value")
local spot = pileSpot[pile]
pileSpot[pile] = nil
pile:Destroy()
-- birkaç saniye sonra aynı noktada yeni bir yığın
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Meadow içindeki her noktada bir yığın
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- İstemci bir yığına vurmak ister. İstemciye asla güvenme: herkes
-- bu uzak olayı herhangi bir yerden, herhangi bir şeyle, istediği hızda tetikleyebilir.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
-- gerçek bir yığın
if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
return
end
-- erişim mesafesinde
local character = player.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
if not root or (root.Position - pile.Position).Magnitude > Settings.Reach then
return
end
-- çok hızlı değil
local now = time()
if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
return
end
lastHit[player] = now
hitPile(player, pile)
end)
-- Ağırlıklı bir çekiliş: her evcil hayvanın Chance değeri (100 üzerinden) çizgideki payıdır
local function rollPet()
local roll = math.random() * 100
for _, info in Settings.Pets do
roll -= info.Chance
if roll <= 0 then
return info.Name
end
end
return Settings.Pets[1].Name
end
-- Yumurtadan çıkarma: yumurtanın, bedeli jetonla ödenen etkileşim istemi
workspace.Egg.ProximityPrompt.Triggered:Connect(function(player)
local coins = player.leaderstats.Coins
if coins.Value < Settings.EggPrice then
return
end
coins.Value -= Settings.EggPrice
local name = rollPet()
-- yer varsa hemen dışarı çıkar
local pet = givePet(player, name, equippedCount(player) < Settings.MaxEquipped)
print(player.Name .. " hatched a " .. name)
end)
-- Dışarıdaki evcil hayvanlar sahiplerini takip eder: her birinin oyun dünyasında bir parçası vardır ve bu parça
-- her karede oyuncunun arkasında bir sıra hâlinde
local petModels = {} -- her evcil hayvan -> oyun dünyasındaki parçası
RunService.Heartbeat:Connect(function()
for _, player in Players:GetPlayers() do
local root = player.Character and player.Character:FindFirstChild("HumanoidRootPart")
local pets = player:FindFirstChild("Pets")
local slot = 0
for _, pet in pets and pets:GetChildren() or {} do
local model = petModels[pet]
if pet:GetAttribute("Equipped") and root then
slot += 1
if not model then
model = ServerStorage.PetModels[pet.Value]:Clone()
model.Parent = petParts
petModels[pet] = model
end
model.CFrame = root.CFrame * CFrame.new((slot - 2) * 3, -1.5, 4)
elseif model then
model:Destroy()
petModels[pet] = nil
end
end
end
end)
-- İstemci, bir evcil hayvanı dışarı çıkarmayı veya geri çekmeyi ister. Sunucu şunları kontrol eder: evcil hayvan
-- oyuncuya aittir ve dışarıda en fazla MaxEquipped evcil hayvan vardır.
remotes.Equip.OnServerEvent:Connect(function(player, pet)
if typeof(pet) ~= "Instance" or pet.Parent ~= player.Pets then
return
end
if pet:GetAttribute("Equipped") then
pet:SetAttribute("Equipped", false)
elseif equippedCount(player) < Settings.MaxEquipped then
pet:SetAttribute("Equipped", true)
end
end)
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.