Menu
CoddyTech

בקעו ביצה

שיעור 9 מתוך 18 בקורס משחק Roblox: סימולטור חיות מחמד של Coddy.

לביצה הלבנה ליד נקודת ההופעה יש ProximityPrompt: התקרב אליה ו-Roblox יציג "Hatch" עם מקש שצריך להחזיק (E, או הקשה בטלפון). כשהשחקן מחזיק אותו מספיק זמן, ההנחיה מפעילה את Triggered בשרת, עם השחקן:

workspace.Egg.ProximityPrompt.Triggered:Connect(function(player)
end)

השרת בודק את המחיר, לוקח את המטבעות ונותן חיית מחמד. חיית מחמד היא StringValue שמכיל את שמה, בתוך תיקיית Pets שבשחקן. כל מה שהשרת מכניס לשחקן משוכפל ללקוח של אותו שחקן, וכך רשימת חיות המחמד בשיעור מאוחר יותר יודעת מה להציג.

challenge icon

אתגר

בינוני
  1. כששחקן מצטרף, תן לו גם Folder בשם Pets.
  2. כתוב את givePet(player, name): צור StringValue בשם Pet, הגדר את Value לשם, ושמור אותו בתיקיית Pets של השחקן; החזר אותו.
  3. חבר את workspace.Egg.ProximityPrompt.Triggered: אם יש לשחקן פחות מטבעות מאשר Settings.EggPrice, עצור; אחרת גבֶה את המחיר, תן לו Cat, והדפס Player1 hatched a Cat (ה-Name שלו).

לחץ על הפעלה, הרוויח 25 מטבעות והחזק את E ליד הביצה. לאחר מכן לחץ על בדיקה.

נסו בעצמכם

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 = {} -- כל ערימה -> המקום שבו היא נמצאת
local lastHit = {} -- כל שחקן -> מתי היכה בפעם האחרונה

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

-- כל שחקן מקבל Coins בטבלת המובילים
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
end)

-- ערימת מטבעות במקום מסוים: עותק של ServerStorage.CoinPile עם כמות החיים שלה
-- והערך שלה כמאפיינים
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

-- מכה מפחיתה 1 מכמות החיים של ערימה;
-- כשהכמות מגיעה ל־0, הערימה נשברת ומעניקה את הערך שלה
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()
	-- ערימה חדשה באותו מקום, כעבור כמה שניות
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- ערימה בכל מקום באזור Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end

-- הלקוח מבקש להכות בערימה. לעולם אין לסמוך על הלקוח: כל אחד יכול להפעיל
-- את האירוע המרוחק הזה עם כל דבר, מכל מקום, ובתדירות גבוהה ככל שירצה.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
	-- ערימה אמיתית
	if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
		return
	end
	-- בטווח פגיעה
	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
	-- לא מהר מדי
	local now = time()
	if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
		return
	end
	lastHit[player] = now
	hitPile(player, pile)
end)
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משחק Roblox: סימולטור חיות מחמד