Drei Haustiere gleichzeitig
Lektion 12 von 20 im Kurs Roblox-Spiel: Haustier-Simulator von Coddy.
Haustiere sollten sich in einer Reihe aufstellen, und gleichzeitig können nur Settings.MaxEquipped (3) draußen sein. Ein neues Haustier kommt nur heraus, solange weniger als diese Anzahl draußen sind; die übrigen warten im Pets-Ordner.
Die Haustiere zu zählen, die draußen sind, ist eine Schleife über den Ordner:
local count = 0
for _, pet in player.Pets:GetChildren() do
if pet:GetAttribute("Equipped") then
count += 1
end
endUm sie in einer Reihe aufzustellen, nummeriere die Haustiere, die draußen sind, beim Platzieren mit 1, 2, 3 und wandle die Nummer in einen seitlichen Versatz um: Mit (slot - 2) * 5 geht Slot 1 5 Studs nach links und Slot 3 5 nach rechts.
Aufgabe
MittelStelle bis zu drei Haustiere in einer Reihe hinter dir auf.
- Schreibe
equippedCount(player), das die Anzahl der Haustiere des Spielers zählt, die ausgerüstet sind. - Lass ein Haustier mit
givePet(player, name, equippedCount(player) < Settings.MaxEquipped)schlüpfen. - Zähle in Heartbeat für die Haustiere, die draußen sind,
slotvon 1 bis 3 hoch und platziere jedes Haustier beiroot.CFrame * CFrame.new((slot - 2) * 3, -1.5, 4).
Drücke auf „Spielen“ und lass vier Haustiere schlüpfen: Drei Haustiere laufen nebeneinander hinter dir. Drücke dann auf „Prüfen“.
Probier es selbst
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 = {} -- jeder Münzhaufen -> der Platz, auf dem er steht
local lastHit = {} -- jeder Spieler -> wann er zuletzt zugeschlagen hat
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Settings.Pets nach Namen
local petInfo = {}
for _, info in Settings.Pets do
petInfo[info.Name] = info
end
-- Ein Haustier: ein StringValue im Pets-Ordner des Spielers, der seinen Namen enthält, mit
-- seiner Seltenheit und Stärke als Attributen
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
-- Lektion 12: Three Pets Out kommt hierhin
-- 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 ihnen gehören
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 Attributen
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 verringert die Gesundheit eines Münzhaufens um 1;
-- bei 0 zerfällt der Münzhaufen 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 Münzhaufen an derselben Stelle, ein paar Sekunden später
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Ein Münzhaufen an jeder Stelle in Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- Der Client fordert einen Schlag gegen einen Münzhaufen an. Vertraue dem Client niemals: Jeder kann
-- dieses Remote mit beliebigen Daten von überall aus so oft auslösen, wie er will.
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)
-- Eine gewichtete Zufallsauswahl: Der Chance-Wert jedes Pets (von 100) ist sein Anteil an der Skala
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
-- Schlüpfen: die Eingabeaufforderung 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 = rollPet()
-- sofort draußen und seinem Besitzer folgend
givePet(player, name, true)
print(player.Name .. " hatched a " .. name)
end)
-- Aktive Pets folgen ihrem Besitzer: Jedes hat ein Objekt in der Welt, das
-- bei jedem Frame hinter dem Spieler gehalten wird
local petModels = {} -- jedes Haustier -> sein Teil in der Spielwelt
RunService.Heartbeat:Connect(function()
for _, player in Players:GetPlayers() do
local root = player.Character and player.Character:FindFirstChild("HumanoidRootPart")
local pets = player:FindFirstChild("Pets")
for _, pet in pets and pets:GetChildren() or {} do
local model = petModels[pet]
if pet:GetAttribute("Equipped") and root then
if not model then
model = ServerStorage.PetModels[pet.Value]:Clone()
model.Parent = petParts
petModels[pet] = model
end
model.CFrame = root.CFrame * CFrame.new(0, -1.5, 4)
end
end
end
end)
Alle Lektionen in Roblox-Spiel: Haustier-Simulator
3Eier und Haustiere
Ein Ei ausbrütenÜbe selbstständig: Roblox-Playground