Menu
CoddyTech

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 tiefer

Eine Tabelle merkt sich, welches Part zu welchem Haustier gehört, damit ein Haustier sein Part verliert, wenn es weggelegt wird.

challenge icon

Aufgabe

Mittel
  1. Schreibe equippedCount(player). Gib givePet ein drittes Argument, equipped, das als Equipped-Attribut gespeichert wird, und lass beim Schlüpfen equippedCount(player) < Settings.MaxEquipped prüfen.
  2. Rufe RunService ab und verwende local 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 von ServerStorage.PetModels[pet.Value] in petParts), und platziere es bei root.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)
quiz iconTeste dich selbst

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