Ein Haustier folgt dir
Lektion 11 von 18 im Kurs Roblox-Spiel: Haustiersimulator von Coddy.
Haustiere sollten dir folgen. Ein neues Haustier erscheint sofort, wenn weniger als Settings.MaxEquipped (3) draußen sind, gekennzeichnet durch ein Equipped-Attribut.
Jedes Haustier, das draußen ist, erhält ein Part in der Welt, eine Kopie seines Modells aus ServerStorage.PetModels, und in jedem Frame setzt der Server es hinter seinen Besitzer. RunService.Heartbeat wird einmal pro Frame ausgelöst, und durch das Multiplizieren von CFrames wird eines relativ zu einem anderen platziert:
model.CFrame = root.CFrame * CFrame.new(0, -1.5, 4) -- 4 Studs dahinter, etwas tieferEine Tabelle merkt sich, welches Part zu welchem Haustier gehört, damit ein Haustier sein Part verliert, wenn es weggelegt wird.
Aufgabe
Mittel- Schreibe
equippedCount(player). GibgivePetein drittes Argument,equipped, das alsEquipped-Attribut gespeichert wird, und lass beim SchlüpfenequippedCount(player) < Settings.MaxEquippedprüfen. - Rufe
RunServiceab und verwendelocal petParts = workspace.PetParts. Bei Heartbeat soll für jeden Spieler und jedes Haustier Folgendes gelten: Wenn es draußen ist (und der Spieler einen Charakter hat), stelle sicher, dass es ein Teil hat (eine Kopie vonServerStorage.PetModels[pet.Value]in petParts), und platziere es beiroot.CFrame * CFrame.new((slot - 2) * 3, -1.5, 4), wobei die Plätze 1, 2, 3 gezählt werden; wenn es weggelegt wird, zerstöre sein Teil.
Drücke Play, lass ein Haustier schlüpfen und geh herum. Klicke dann auf Check.
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 Münzhaufen -> der Platz, auf dem er steht
local lastHit = {} -- jeder Spieler -> Zeitpunkt seines letzten Schlags
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, das seinen Namen enthält, mit
-- seiner Seltenheit und Stärke als Attributen
local function givePet(player, name)
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.Parent = player.Pets
return pet
end
-- Jeder Spieler bekommt Coins in 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 Schlag 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 paar Sekunden später ein neuer Münzhaufen auf demselben Platz
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Ein Haufen an jeder Stelle in Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- Der Client möchte einen Haufen treffen. Vertraue dem Client niemals: Jeder kann
-- dieses Remote-Event mit beliebigen Daten von überall aus beliebig oft auslösen.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
-- ein echter Haufen
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 Ziehung: Der Chance-Wert jedes Pets (von 100) bestimmt seinen Anteil an der Gesamtwahrscheinlichkeit
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: der Prompt des Eis, bezahlt mit Coins
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()
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