Seltenheitswürfe
Lektion 10 von 18 im Kurs Roblox-Spiel: Haustiersimulator von Coddy.
Ein Ei sollte nicht immer eine Katze ergeben. Settings.Pets listet jedes Haustier mit einer Chance von 100 (Cat 45, Dog 30, Bunny 15, Fox 8, Dragon 2), einer Seltenheit und einer Stärke auf.
Ein gewichteter Zufallswurf: Wähle eine Zahl von 0 bis 100 und gehe dann die Liste durch, wobei du die Chance jedes Haustiers davon abziehst. Das Haustier, das den Wert auf 0 oder darunter bringt, gewinnt. Ein Haustier mit einer Chance von 45 gewinnt also im Durchschnitt 45 von 100 Durchläufen:
local roll = math.random() * 100
for _, info in Settings.Pets do
roll -= info.Chance
if roll <= 0 then
return info.Name
end
endDas geschlüpfte Haustier hat außerdem seine Rarity und Power als Attribute. Eine Tabelle der Haustiere nach Namen (petInfo["Fox"]) ermöglicht es, sie schnell zu finden.
Aufgabe
Mittel- Erstelle
petInfo, wobeiSettings.Petsnach Name indiziert wird. - Setze in
givePetdie AttributeRarityundPowerdes Haustiers anhand vonpetInfo. - Schreibe
rollPet(), die gewichtete Ziehung, und lass beim AusbrütenrollPet()statt einer Cat ausführen (die Ausgabe zeigt den Namen des ausgebrüteten Haustiers an).
Drücke Play und brüte ein paar Haustiere aus. Dann Check: Die Prüfungen ändern die Chancen, um sicherzustellen, dass deine Ziehung ihnen entspricht.
Probier es selbst
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 = {} -- jeder Haufen -> der Platz, auf dem er steht
local lastHit = {} -- jeder Spieler -> wann er zuletzt zugeschlagen hat
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Ein Haustier: ein StringValue im Pets-Ordner des Spielers, der seinen Namen enthält
local function givePet(player, name)
local pet = Instance.new("StringValue")
pet.Name = "Pet"
pet.Value = name
pet.Parent = player.Pets
return pet
end
-- Jeder Spieler erhält Coins auf der Bestenliste
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
-- die Haustiere, die sie besitzen
local pets = Instance.new("Folder")
pets.Name = "Pets"
pets.Parent = player
end)
-- Ein Münzhaufen auf einem Platz: eine Kopie von ServerStorage.CoinPile mit seiner Gesundheit
-- und seinem Wert als Attribute
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
-- Ein Treffer zieht 1 von der Gesundheit eines Haufens ab;
-- bei 0 zerbricht der Haufen und zahlt seinen Wert aus
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()
-- ein neuer Haufen am selben Platz, ein paar Sekunden später
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Ein Haufen auf jedem Platz in der Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- Der Client fordert an, einen Haufen zu treffen. Vertraue dem Client niemals: Jeder kann
-- dieses Remote mit beliebigen Daten, von überall aus und so schnell sie wollen auslösen.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
-- ein echter Münzhaufen
if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
return
end
-- in Reichweite
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
-- nicht zu schnell
local now = time()
if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
return
end
lastHit[player] = now
hitPile(player, pile)
end)
-- Ausbrüten: die Interaktionsaufforderung des Eis, bezahlt mit Münzen
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)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Roblox-Spiel: Haustiersimulator
3Eier und Haustiere
Ein Ei ausbrüten