Menu
CoddyTech

Ein Ei ausbrüten

Lektion 9 von 20 im Kurs Roblox-Spiel: Haustier-Simulator von Coddy.

Das weiße Ei in der Nähe des Spawnpunkts hat einen ProximityPrompt: Geh darauf zu und Roblox zeigt „Ausbrüten“ mit einer Taste an, die du gedrückt halten musst (E oder eine Berührung auf einem Smartphone). Wenn der Spieler die Taste lange genug gedrückt hält, löst der Prompt auf dem Server Triggered aus und übergibt den Spieler:

workspace.Egg.ProximityPrompt.Triggered:Connect(function(player)
end)

Der Server prüft den Preis, zieht die Münzen ab und gibt ein Haustier. Ein Haustier ist ein StringValue, der seinen Namen enthält, in einem Pets-Ordner im Spieler. Alles, was der Server in einen Spieler einfügt, wird an den Client dieses Spielers repliziert. So weiß die Haustierliste in einer späteren Lektion, was sie anzeigen soll.

challenge icon

Aufgabe

Mittel

Brüte am Ei für 25 Münzen eine Katze aus.

  1. Füge in PlayerAdded dem Spieler einen Ordner namens Pets hinzu.
  2. Schreibe givePet(player, name): einen StringValue Pet mit dem Wert name in Pets; gib ihn zurück.
  3. Bei workspace.Egg.ProximityPrompt.Triggered: Wenn Coins mindestens Settings.EggPrice beträgt, ziehe den Betrag ab, rufe givePet(player, "Cat") auf und gib player.Name .. " hatched a Cat" aus.

Drücke „Spielen“, verdiene 25 Münzen und halte E am Ei gedrückt: Coins sinkt um 25. Drücke dann „Prüfen“.

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 -> wann er zuletzt zugeschlagen hat

print("A Meadow pile gives " .. Settings.PileValue .. " coins")

-- 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
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 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 am selben Platz
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Ein Münzhaufen auf jedem Platz in Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end

-- Der Client fordert einen Treffer auf einen Münzhaufen an. Vertraue dem Client niemals: Jeder kann
-- dieses Remote mit beliebigen Daten, von überall und beliebig schnell 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)

-- Lektion 9: Hatch an Egg kommt hierhin

Alle Lektionen in Roblox-Spiel: Haustier-Simulator

Übe selbstständig: Roblox-Playground