Menu
CoddyTech

Un animale domestico ti segue

Lezione 11 di 18 del corso Gioco Roblox: Simulatore di animali domestici di Coddy.

Gli animali domestici dovrebbero seguirti. Un nuovo animale domestico viene fatto uscire subito se ce ne sono meno di Settings.MaxEquipped (3), contrassegnati con un attributo Equipped.

Ogni animale domestico che è fuori ha una parte nel mondo, una copia del suo modello da ServerStorage.PetModels, e a ogni frame il server lo posiziona dietro al suo proprietario. RunService.Heartbeat viene attivato una volta per frame e la moltiplicazione dei CFrame posiziona uno rispetto all'altro:

model.CFrame = root.CFrame * CFrame.new(0, -1.5, 4) -- 4 stud dietro, un po' più in basso

Una tabella tiene traccia della parte associata a ciascun animale domestico, così un animale domestico riposto perde la propria parte.

challenge icon

Sfida

Medio
  1. Scrivi equippedCount(player). Aggiungi a givePet un terzo argomento, equipped, memorizzato come attributo Equipped, e fai schiudere con equippedCount(player) < Settings.MaxEquipped.
  2. Recupera RunService e local petParts = workspace.PetParts. A ogni Heartbeat, per ogni giocatore e ogni animale: se è fuori (e il giocatore ha un personaggio), assicurati che abbia una parte (una copia di ServerStorage.PetModels[pet.Value] in petParts) e posizionala in root.CFrame * CFrame.new((slot - 2) * 3, -1.5, 4), contando gli slot 1, 2, 3; se viene riposto, distruggi la sua parte.

Premi Play, fai schiudere un uovo e cammina. Poi Check.

Provalo tu

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 = {} -- ogni mucchio -> il punto in cui si trova
local lastHit = {} -- ogni giocatore -> quando ha colpito l'ultima volta

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

-- Settings.Pets per nome
local petInfo = {}
for _, info in Settings.Pets do
	petInfo[info.Name] = info
end

-- Un animale: uno StringValue nella cartella Pets del giocatore che contiene il suo nome, con
-- la sua rarità e potenza come attributi
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

-- Ogni giocatore riceve Coins nella classifica
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

	-- gli animali che possiedono
	local pets = Instance.new("Folder")
	pets.Name = "Pets"
	pets.Parent = player
end)

-- Un mucchio di monete su un punto: una copia di ServerStorage.CoinPile con la sua salute
-- e il suo valore come attributi
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

-- Un colpo riduce di 1 la salute di un mucchio;
-- a 0 il mucchio si rompe e assegna il suo valore
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()
	-- un nuovo mucchio nello stesso punto, qualche secondo dopo
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Un mucchio in ogni punto di Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end

-- Il client chiede di colpire un mucchio. Non fidarti mai del client: chiunque può attivare
-- questo evento remoto con qualsiasi dato, da ovunque e alla velocità che vuole.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
	-- un mucchio reale
	if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
		return
	end
	-- a portata
	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
	-- non troppo in fretta
	local now = time()
	if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
		return
	end
	lastHit[player] = now
	hitPile(player, pile)
end)

-- Un'estrazione ponderata: il Chance di ogni pet (su 100) è la sua quota dell'intervallo
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

-- Schiusa: il prompt dell'uovo, pagato in monete
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Roblox: Simulatore di animali domestici