Menu
CoddyTech

Ein Ei ausbrüten

Lektion 9 von 18 im Kurs Roblox-Spiel: Haustiersimulator 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
  1. Wenn ein Spieler beitritt, gib ihm auch einen Folder namens Pets.
  2. Schreibe givePet(player, name): einen StringValue namens Pet, dessen Value der Name ist, in den Pets des Spielers; gib ihn zurück.
  3. Verbinde workspace.Egg.ProximityPrompt.Triggered: Wenn der Spieler weniger Coins als Settings.EggPrice hat, brich ab; andernfalls ziehe den Preis ab, gib ihm eine Cat und gib Player1 hatched a Cat aus (sein Name).

Drücke Play, verdiene 25 Coins und halte E am Ei gedrückt. Dann 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 Stapel -> 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ünzstapel 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 Stapels um 1;
-- bei 0 zerbricht der Stapel 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 Stapel am selben Platz, ein paar Sekunden später
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

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

-- Der Client fordert einen Treffer auf einen Stapel an. Vertraue dem Client niemals: Jeder kann
-- dieses Remote mit beliebigen Daten von überall aus so schnell auslösen, wie er möchte.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
	-- ein echter Stapel
	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)
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