Menu
CoddyTech

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
end

Yumurtadan çı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.

challenge icon

Görev

Orta
  1. Settings.Pets listesini Name'e göre anahtarlanmış şekilde petInfo olarak oluştur.
  2. givePet içinde, evcil hayvanın Rarity ve Power özelliklerini petInfo'dan ayarla.
  3. Ağırlıklı seçim olan rollPet()'i yaz ve Cat yerine rollPet() 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)
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: Evcil Hayvan Simülatörü bölümündeki tüm dersler