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 bassoUna tabella tiene traccia della parte associata a ciascun animale domestico, così un animale domestico riposto perde la propria parte.
Sfida
Medio- Scrivi
equippedCount(player). Aggiungi agivePetun terzo argomento,equipped, memorizzato come attributoEquipped, e fai schiudere conequippedCount(player) < Settings.MaxEquipped. - Recupera
RunServiceelocal 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 diServerStorage.PetModels[pet.Value]in petParts) e posizionala inroot.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)
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
3Uova e animali domestici
Fai schiudere un uovo