Menu
CoddyTech

Üç Evcil Hayvanı Dışarı Çıkar

Coddy'nin Roblox Oyunu: Evcil Hayvan Simülatörü kursunda ders 12 / 20.

Evcil hayvanlar sıraya dizilmelidir ve aynı anda yalnızca Settings.MaxEquipped (3) tanesi dışarıda olabilir. Yeni bir evcil hayvan yalnızca dışarıda olanların sayısı bundan azsa çıkar; geri kalanı Pets klasöründe bekler.

Dışarıda olan evcil hayvanları saymak, klasör üzerinde bir döngü çalıştırmayı gerektirir:

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

Onları bir sıraya dizmek için, yerleştirirken dışarıda olan evcil hayvanları 1, 2, 3 diye numaralandır ve bu sayıyı yana doğru bir uzaklığa dönüştür: (slot - 2) * 5 ile 1. yuva 5 stud sola, 3. yuva ise 5 stud sağa gider.

challenge icon

Görev

Orta

Arkanda yan yana en fazla üç evcil hayvanı sıraya diz.

  1. Oyuncunun Equipped olan evcil hayvanlarının sayısını veren equippedCount(player) işlevini yaz.
  2. givePet(player, name, equippedCount(player) < Settings.MaxEquipped) ile yumurtadan evcil hayvan çıkar.
  3. Heartbeat içinde, dışarıdaki evcil hayvanlar arasında slot değerini 1, 2, 3 olarak say ve her birini root.CFrame * CFrame.new((slot - 2) * 3, -1.5, 4) konumuna yerleştir.

“Oyna” düğmesine bas ve dört evcil hayvan çıkar: üç evcil hayvan arkanda yan yana yürür. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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 = {} -- her yığın -> üzerinde durduğu nokta
local lastHit = {} -- her oyuncu -> en son ne zaman vurduğu

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

-- Settings.Pets, ada göre
local petInfo = {}
for _, info in Settings.Pets do
	petInfo[info.Name] = info
end

-- Bir evcil hayvan: oyuncunun Pets klasöründe adını tutan bir StringValue;
-- nadirliği ve gücü de öznitelik olarak saklanır
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

-- Ders 12: Three Pets Out buraya gelecek

-- Her oyuncu, liderlik tablosunda Coins alır
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

	-- sahip oldukları evcil hayvanlar
	local pets = Instance.new("Folder")
	pets.Name = "Pets"
	pets.Parent = player
end)

-- Bir noktadaki jeton yığını: ServerStorage.CoinPile nesnesinin, sağlığı
-- ve değeri öznitelik olarak saklanan bir kopyası
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

-- Bir vuruş, yığının sağlığından 1 düşürür;
-- sağlığı 0 olduğunda yığın parçalanır ve değerini öder
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()
	-- birkaç saniye sonra aynı noktada yeni bir yığın
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Meadow içindeki her noktada bir yığın
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end

-- İstemci bir yığına vurmak ister. İstemciye asla güvenmeyin: herkes
-- bu remote'u herhangi bir yerden, herhangi bir veriyle, istediği kadar hızlı tetikleyebilir.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
	-- gerçek bir yığın
	if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
		return
	end
	-- erişim mesafesinde
	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
	-- çok hızlı değil
	local now = time()
	if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
		return
	end
	lastHit[player] = now
	hitPile(player, pile)
end)

-- Ağırlıklı bir çekiliş: her pet'in Chance değeri (100 üzerinden), çizgideki payını belirler
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

-- Yumurtadan çıkarma: yumurtanın, coin ile ödeme yapılan prompt'u
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()
	-- hemen dışarıda, sahibini takip ediyor
	givePet(player, name, true)
	print(player.Name .. " hatched a " .. name)
end)

-- Dışarıdaki pet'ler sahiplerini takip eder: her birinin dünyada bir parçası vardır ve bu parça
-- her karede oyuncunun arkasında tutulur
local petModels = {} -- her pet -> dünyadaki parçası
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)

Roblox Oyunu: Evcil Hayvan Simülatörü bölümündeki tüm dersler

Kendi başına pratik yap: Roblox playground