Menu
CoddyTech

Bir Evcil Hayvan Seni Takip Eder

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

Evcil hayvanlar seni takip etmelidir. Dışarıda Settings.MaxEquipped (3) değerinden daha az evcil hayvan varsa, Equipped özniteliğiyle işaretlenmiş yeni bir evcil hayvan hemen ortaya çıkar.

Dışarıda olan her evcil hayvan dünyada bir parça alır; bu parça, ServerStorage.PetModels içindeki modelinin bir kopyasıdır ve sunucu her karede onu sahibinin arkasına yerleştirir. RunService.Heartbeat her karede bir kez tetiklenir ve CFrame’leri çarpmak, birini diğerine göre konumlandırır:

model.CFrame = root.CFrame * CFrame.new(0, -1.5, 4) -- 4 stud arkada, biraz daha aşağıda

Bir tablo, hangi parçanın hangi evcil hayvana ait olduğunu hatırlar; böylece bir evcil hayvan kaldırıldığında parçası da kaybolur.

challenge icon

Görev

Orta
  1. equippedCount(player) yazın. givePet'e üçüncü bir equipped argümanı verin ve bunu Equipped özniteliği olarak kaydedin; yumurtadan çıkarırken equippedCount(player) < Settings.MaxEquipped kullanın.
  2. RunService'i ve local petParts = workspace.PetParts ifadesini alın. Heartbeat'te her oyuncu ve her evcil hayvan için: dışarıdaysa (ve oyuncunun bir karakteri varsa), bir parçası olduğundan emin olun (ServerStorage.PetModels[pet.Value] kopyası petParts içinde) ve parçayı root.CFrame * CFrame.new((slot - 2) * 3, -1.5, 4) konumuna yerleştirin; yuvaları 1, 2, 3 diye sayın. İçeri alındıysa parçasını yok edin.

Play'e basın, yumurtadan evcil hayvan çıkarın ve yürüyün. Ardından Check'e basın.

Kendin dene

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

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ü öznitelik olarak saklanır
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

-- 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 para yığını: ServerStorage.CoinPile nesnesinin bir kopyası;
-- sağlığı ve değeri öznitelik olarak saklanır
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ığını 1 azaltır;
-- sağlık 0 olduğunda yığın parçalanır ve değerini oyuncuya verir
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'daki 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, istediği hızda ve istediği verilerle 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ıdır
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 prompt'u, bedeli coin olarak ödenir
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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