Una mascota te sigue
Lección 11 de 18 del curso Juego de Roblox: simulador de mascotas de Coddy.
Las mascotas deberían seguirte. Una mascota nueva aparece de inmediato si hay menos de Settings.MaxEquipped (3) fuera, marcada con un atributo Equipped.
Cada mascota que está fuera obtiene una pieza en el mundo, una copia de su modelo de ServerStorage.PetModels, y en cada fotograma el servidor la coloca detrás de su dueño. RunService.Heartbeat se activa una vez por fotograma, y al multiplicar CFrames se coloca uno en relación con otro:
model.CFrame = root.CFrame * CFrame.new(0, -1.5, 4) -- 4 studs detrás, un poco más abajoUna tabla recuerda qué pieza pertenece a cada mascota, así que una mascota que se guarda pierde su pieza.
Desafío
Intermedio- Escribe
equippedCount(player). Dale agivePetun tercer argumento,equipped, almacenado como el atributoEquipped, y haz que la eclosión useequippedCount(player) < Settings.MaxEquipped. - Obtén
RunServiceylocal petParts = workspace.PetParts. En Heartbeat, para cada jugador y cada mascota: si está fuera (y el jugador tiene un personaje), asegúrate de que tenga una pieza (una copia deServerStorage.PetModels[pet.Value]en petParts) y colócala enroot.CFrame * CFrame.new((slot - 2) * 3, -1.5, 4), contando las posiciones 1, 2, 3; si está guardada, destruye su pieza.
Presiona Play, haz eclosionar un huevo y camina. Después, Check.
Pruébalo tú mismo
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 = {} -- cada pila -> el lugar donde está
local lastHit = {} -- cada jugador -> cuándo golpeó por última vez
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Settings.Pets por nombre
local petInfo = {}
for _, info in Settings.Pets do
petInfo[info.Name] = info
end
-- Una mascota: un StringValue en la carpeta Pets del jugador que contiene su nombre, con
-- su rareza y poder como atributos
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
-- Cada jugador recibe Coins en la tabla de clasificación
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
-- las mascotas que posee
local pets = Instance.new("Folder")
pets.Name = "Pets"
pets.Parent = player
end)
-- Una pila de monedas en un lugar: una copia de ServerStorage.CoinPile con su salud
-- y valor como atributos
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 golpe reduce en 1 la salud de una pila;
-- al llegar a 0, la pila se rompe y entrega su valor
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()
-- una nueva pila en el mismo lugar, unos segundos después
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Una pila en cada punto de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- El cliente solicita golpear una pila. Nunca confíes en el cliente: cualquiera puede activar
-- este evento remoto con cualquier dato, desde cualquier lugar y tan rápido como quiera.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
-- una pila real
if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
return
end
-- al alcance
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
-- no demasiado rápido
local now = time()
if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
return
end
lastHit[player] = now
hitPile(player, pile)
end)
-- Un sorteo ponderado: el Chance de cada mascota (de 100) es su proporción del total
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
-- Eclosión: la solicitud del huevo, que se paga con monedas
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)
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego de Roblox: simulador de mascotas
3Huevos y mascotas
Incuba un huevo