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ğıdaBir 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.
Görev
Orta-
equippedCount(player)yazın.givePet'e üçüncü birequippedargümanı verin ve bunuEquippedözniteliği olarak kaydedin; yumurtadan çıkarırkenequippedCount(player) < Settings.MaxEquippedkullanın. RunService'i velocal petParts = workspace.PetPartsifadesini 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)
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
3Yumurtalar ve Evcil Hayvanlar
Bir Yumurtadan Evcil Hayvan Çıkar