Menu
CoddyTech

Tiga Peliharaan Aktif

Pelajaran 12 dari 20 dalam kursus Game Roblox: Simulator Hewan Peliharaan di Coddy.

Hewan peliharaan harus berbaris, dan hanya Settings.MaxEquipped (3) yang boleh berada di luar sekaligus. Hewan peliharaan baru keluar hanya jika jumlah yang berada di luar kurang dari batas itu; sisanya menunggu di folder Pets.

Menghitung hewan peliharaan yang berada di luar dilakukan dengan perulangan pada folder:

local count = 0
for _, pet in player.Pets:GetChildren() do
	if pet:GetAttribute("Equipped") then
		count += 1
	end
end

Untuk menempatkan mereka dalam satu baris, beri nomor pada hewan peliharaan yang berada di luar saat kamu menempatkannya, 1, 2, 3, lalu ubah nomor itu menjadi offset ke samping: dengan (slot - 2) * 5, slot 1 berada 5 stud ke kiri dan slot 3 berada 5 stud ke kanan.

challenge icon

Tantangan

Sedang

Atur hingga tiga peliharaan berbaris di belakangmu.

  1. Tulis equippedCount(player), jumlah peliharaan pemain yang dipasangi perlengkapan.
  2. Tetaskan dengan givePet(player, name, equippedCount(player) < Settings.MaxEquipped).
  3. Di Heartbeat, hitung slot 1, 2, 3 untuk peliharaan yang sedang berada di luar, lalu tempatkan masing-masing di root.CFrame * CFrame.new((slot - 2) * 3, -1.5, 4).

Tekan tombol “Main” dan tetaskan empat peliharaan: tiga peliharaan berjalan berjejer di belakangmu. Lalu tekan tombol “Periksa”.

Coba sendiri

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local RunService = game:GetService("RunService")
local Settings = require(game.ReplicatedStorage.Settings)

local remotes = game.ReplicatedStorage.Remotes
local piles = workspace.Piles
local petParts = workspace.PetParts
local pileSpot = {} -- setiap tumpukan -> tempatnya berdiri
local lastHit = {} -- setiap pemain -> waktu terakhir mereka memukul

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

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

-- Pet: StringValue di folder Pets milik pemain yang menyimpan namanya, dengan
-- kelangkaan dan kekuatannya sebagai atribut
local function givePet(player, name, equipped)
	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:SetAttribute("Equipped", equipped)
	pet.Parent = player.Pets
	return pet
end

-- Pelajaran 12: Three Pets Out ditambahkan di sini

-- Setiap pemain mendapat Coins di papan peringkat
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

	-- pet yang mereka miliki
	local pets = Instance.new("Folder")
	pets.Name = "Pets"
	pets.Parent = player
end)

-- Tumpukan koin di suatu tempat: salinan ServerStorage.CoinPile dengan kesehatannya
-- dan nilainya sebagai atribut
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

-- Satu pukulan mengurangi kesehatan tumpukan sebesar 1;
-- saat mencapai 0, tumpukan hancur dan memberikan nilainya
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()
	-- tumpukan baru di tempat yang sama, beberapa detik kemudian
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Satu tumpukan di setiap tempat di Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end

-- Client meminta untuk memukul tumpukan. Jangan pernah percaya pada client: siapa pun bisa mengirim
-- remote ini dengan apa saja, dari mana saja, secepat yang mereka mau.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
	-- tumpukan yang nyata
	if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
		return
	end
	-- dalam jangkauan
	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
	-- tidak terlalu cepat
	local now = time()
	if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
		return
	end
	lastHit[player] = now
	hitPile(player, pile)
end)

-- Pengundian berbobot: Chance setiap pet (dari 100) menentukan bagiannya
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

-- Menetaskan: prompt telur, dibayar dengan koin
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()
	-- langsung keluar dan mengikuti pemiliknya
	givePet(player, name, true)
	print(player.Name .. " hatched a " .. name)
end)

-- Pet yang keluar mengikuti pemiliknya: masing-masing memiliki bagian di dunia yang tetap berada
-- di belakang pemain pada setiap frame
local petModels = {} -- setiap pet -> bagiannya di dunia
RunService.Heartbeat:Connect(function()
	for _, player in Players:GetPlayers() do
		local root = player.Character and player.Character:FindFirstChild("HumanoidRootPart")
		local pets = player:FindFirstChild("Pets")
		for _, pet in pets and pets:GetChildren() or {} do
			local model = petModels[pet]
			if pet:GetAttribute("Equipped") and root then
				if not model then
					model = ServerStorage.PetModels[pet.Value]:Clone()
					model.Parent = petParts
					petModels[pet] = model
				end
				model.CFrame = root.CFrame * CFrame.new(0, -1.5, 4)
			end
		end
	end
end)

Semua pelajaran di Game Roblox: Simulator Hewan Peliharaan

Latihan sendiri: Playground Roblox