Nadirlik Zarları
Coddy'nin Roblox Oyunu: Evcil Hayvan Simülatörü kursunda ders 10 / 18.
Bir yumurta her zaman Kedi vermemelidir. Settings.Pets, her evcil hayvanı 100 üzerinden bir Chance (Kedi 45, Köpek 30, Tavşan 15, Tilki 8, Ejderha 2), bir Nadirlik ve bir Güç ile listeler.
Ağırlıklı rastgele seçim: 0 ile 100 arasında bir sayı seçin, ardından her evcil hayvanın şansını bu sayıdan çıkararak liste boyunca ilerleyin. Sayıyı 0'a veya altına düşüren evcil hayvan kazanır; dolayısıyla şansı 45 olan bir evcil hayvan ortalama 100 çekilişin 45'ini kazanır:
local roll = math.random() * 100
for _, info in Settings.Pets do
roll -= info.Chance
if roll <= 0 then
return info.Name
end
endYumurtadan çıkan evcil hayvan, Rarity ve Power değerlerini de öznitelik olarak taşır. Evcil hayvanları ada göre içeren bir tablo (petInfo["Fox"]) onları hızlıca bulur.
Görev
OrtaSettings.Petslistesini Name'e göre anahtarlanmış şekildepetInfoolarak oluştur.givePetiçinde, evcil hayvanınRarityvePowerözelliklerinipetInfo'dan ayarla.- Ağırlıklı seçim olan
rollPet()'i yaz ve Cat yerinerollPet()ile yumurtadan çıkar (print, ne çıktığını adlandırır).
Play'e bas ve birkaç yumurta çıkar. Ardından Check'e bas: kontroller, seçiminin bu olasılıklara uymasını sağlamak için olasılıkları değiştirir.
Kendin dene
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local remotes = game.ReplicatedStorage.Remotes
local piles = workspace.Piles
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")
-- Bir evcil hayvan: oyuncunun Pets klasöründe adını tutan bir StringValue
local function givePet(player, name)
local pet = Instance.new("StringValue")
pet.Name = "Pet"
pet.Value = name
pet.Parent = player.Pets
return pet
end
-- Her oyuncunun liderlik tablosunda Coins bulunur
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 madeni para yığını: ServerStorage.CoinPile öğesinin, canı
-- ve değeri öznitelik olarak ayarlanmış bir 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 canını 1 azaltır;
-- canı 0 olduğunda yığın parçalanır ve değeri kadar ödeme yapar
local function hitPile(player, pile)
local health = pile:GetAttribute("Health") - 1
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: herhangi biri bu olayı tetikleyebilir
-- bu remote'u herhangi bir veriyle, herhangi bir yerden, istedikleri kadar hızlı tetikleyebilirler.
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ı olmamalı
local now = time()
if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
return
end
lastHit[player] = now
hitPile(player, pile)
end)
-- Yumurtadan çıkarma: yumurtanın etkileşim istemi; bedeli jetonla ödenir
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 = "Cat"
givePet(player, name)
print(player.Name .. " hatched a " .. name)
end)
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Roblox Oyunu: Evcil Hayvan Simülatörü bölümündeki tüm dersler
3Yumurtalar ve Evcil Hayvanlar
Bir Yumurtadan Evcil Hayvan Çıkar