שחרור המפעל
שיעור 20 מתוך 22 בקורס משחק Roblox: איל מפעל של Coddy.
כשהבעלים עוזב, המפעל שלו אמור להיות פנוי לשחקן הבא: לאפס אותו, להחזיר את משטח התביעה לירוק ואת השלט להודעה שלו. זהו השימוש השני ב־resetFactory.
דבר אחד משתבש בתביעה הבאה. המתקן הראשון מעולם לא עזב את סביבת העבודה, ולכן הלולאה הישנה שלו עדיין פועלת, והתביעה מפעילה אותה שוב: שתי לולאות, שתי יחידות עפרה בשנייה. הפתרון הוא סימון על המתקן, מאפיין שמציין שלולאה פועלת:
if dropper:GetAttribute("Running") then
return
end
dropper:SetAttribute("Running", true)אפסו אותו באמצעות SetAttribute("Running", nil) כשהלולאה מסתיימת, כדי שמתקן שיוחזר לעולם מאוחר יותר יוכל לפעול שוב.
אתגר
קשהפנו את המפעל כשהבעלים שלו עוזב.
- בתוך
PlayerRemoving, אחרי השמירה, אם השחקן הואowner:owner = nil,resetFactory(), הגדירו אתtycoon.ClaimPadלירוק מסוג Neon (Color3.fromRGB(46, 204, 113)), והחזירו לשלט את הודעת התביעה. - בתוך
startDropper, בצעו return אם המאפייןRunningשל המתקן מוגדר; אחרת הגדירו אותו, ונקו אותו אחרי הלולאה.
לחצו על "שחק" ותבעו את המפעל: כל מתקן עדיין מפיל עפרה אחת בשנייה. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local DataStoreService = game:GetService("DataStoreService")
local Settings = require(game.ReplicatedStorage.Settings)
local tycoon = workspace.Tycoon
local items = ServerStorage.TycoonItems
local rebirthPad = ServerStorage.RebirthPad
local factoryStore = DataStoreService:GetDataStore("Factory")
local owner = nil
local headline = "Step on the green pad to claim this factory"
local earned = 0
print("Ore is worth " .. Settings.OreValue .. " Cash")
-- כל שחקן מקבל Cash ו-Rebirths בטבלת המובילים
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local cash = Instance.new("IntValue")
cash.Name = "Cash"
cash.Parent = leaderstats
local rebirths = Instance.new("IntValue")
rebirths.Name = "Rebirths"
rebirths.Parent = leaderstats
-- מה שהיה לשחקן הזה בפעם הקודמת
local ok, saved = pcall(function()
return factoryStore:GetAsync(player.UserId)
end)
if ok and saved then
cash.Value = saved.Cash or 0
rebirths.Value = saved.Rebirths or 0
end
end)
-- השלט מעל המפעל
local gui = Instance.new("SurfaceGui")
gui.Parent = tycoon.Sign
local signLabel = Instance.new("TextLabel")
signLabel.Name = "Status"
signLabel.Size = UDim2.fromScale(1, 1)
signLabel.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
signLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
signLabel.TextScaled = true
signLabel.Text = "Step on the green pad to claim this factory"
signLabel.Parent = gui
local function setSign(text)
signLabel.Text = text
end
-- Ore: חלק קטן ששווה Cash, שנופל מתחת למפיל
local function dropOre(dropper)
local ore = Instance.new("Part")
ore.Name = "Ore"
ore.Size = Vector3.new(1, 1, 1)
ore.Color = Color3.fromRGB(150, 150, 160)
ore.Position = dropper.Position - Vector3.new(0, 2.5, 0)
ore:SetAttribute("Value", Settings.OreValue)
if math.random() < Settings.GoldChance then
ore.Color = Color3.fromRGB(255, 200, 40)
ore.Material = Enum.Material.Neon
ore:SetAttribute("Value", Settings.OreValue * 5)
end
ore.Parent = workspace
Debris:AddItem(ore, 20)
end
local function startDropper(dropper)
task.spawn(function()
while dropper:IsDescendantOf(workspace) do
dropOre(dropper)
task.wait(Settings.DropInterval)
end
end)
end
-- המסוע נושא כל מה שמונח עליו
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)
-- האספן הופך עפרה ל-Cash
tycoon.Collector.Touched:Connect(function(hit)
if hit.Name == "Ore" then
local value = hit:GetAttribute("Value")
hit:Destroy()
if owner then
value = math.floor(value * (1 + owner.leaderstats.Rebirths.Value * Settings.RebirthBonus))
owner.leaderstats.Cash.Value += value
earned += value
end
end
end)
-- המשדרג מכפיל את הערך של כל עפרה שעוברת דרכו, פעם אחת
items.Upgrader.Touched:Connect(function(hit)
if hit.Name == "Ore" and not hit:GetAttribute("Upgraded") then
hit:SetAttribute("Upgraded", true)
hit:SetAttribute("Value", hit:GetAttribute("Value") * 2)
hit.Color = Color3.fromRGB(155, 89, 182)
end
end)
-- משטחים שממתינים עד שפריט ייבנה קודם
local waiting = Instance.new("Folder")
waiting.Name = "WaitingPads"
waiting.Parent = ServerStorage
-- משטחים שכבר נקנו, ונשמרים ללידה מחדש הבאה
local bought = Instance.new("Folder")
bought.Name = "BoughtPads"
bought.Parent = ServerStorage
-- חלק חדש עולה למקומו
local function riseIn(part)
local goal = part.Position
local transparency = part.Transparency
part.Position = goal - Vector3.new(0, 8, 0)
part.Transparency = 1
TweenService:Create(part, TweenInfo.new(1), { Position = goal, Transparency = transparency }):Play()
end
local function checkComplete()
if #tycoon.Buttons:GetChildren() == 0 and #waiting:GetChildren() == 0 then
headline = "Factory complete! Step on the purple pad to rebirth"
setSign(headline)
rebirthPad.Parent = tycoon
end
end
-- הצב פריט שנקנה במפעל
local function build(item)
item.Parent = tycoon.Built
if item:IsA("BasePart") then
riseIn(item)
end
for _, part in item:GetDescendants() do
if part:IsA("BasePart") then
riseIn(part)
end
end
if item:HasTag("Dropper") then
-- להתחיל להפיל ברגע שהוא במקומו
task.delay(1, startDropper, item)
end
for _, pad in waiting:GetChildren() do
if pad:GetAttribute("After") == item.Name then
pad.Parent = tycoon.Buttons
end
end
checkComplete()
end
-- קנייה: המשטח נעלם והפריט שלו נבנה
local function buy(pad, player)
if player ~= owner or pad.Parent ~= tycoon.Buttons then
return
end
local cash = player.leaderstats.Cash
local price = pad:GetAttribute("Price")
if cash.Value < price then
return
end
cash.Value -= price
pad.Parent = bought
build(items:FindFirstChild(pad:GetAttribute("Item")))
end
for _, pad in tycoon.Buttons:GetChildren() do
pad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player then
buy(pad, player)
end
end)
end
-- תג מחיר מרחף מעל כל משטח
for _, pad in tycoon.Buttons:GetChildren() do
local tag = Instance.new("BillboardGui")
tag.Name = "PriceTag"
tag.Size = UDim2.fromOffset(160, 40)
tag.StudsOffset = Vector3.new(0, 3, 0)
tag.Parent = pad
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
label.BackgroundTransparency = 0.2
label.TextColor3 = Color3.fromRGB(255, 255, 255)
label.TextScaled = true
label.Text = pad:GetAttribute("Label") .. ": $" .. pad:GetAttribute("Price")
label.Parent = tag
end
-- בהתחלה מוצגים רק המשטחים הראשונים
for _, pad in tycoon.Buttons:GetChildren() do
if pad:GetAttribute("After") then
pad.Parent = waiting
end
end
-- חזרה למפעל ריק: הפריטים חוזרים לאחסון, והמשטחים חוזרים למקומם המקורי
local function resetFactory()
rebirthPad.Parent = ServerStorage
for _, item in tycoon.Built:GetChildren() do
item.Parent = items
end
for _, pad in bought:GetChildren() do
if pad:GetAttribute("After") then
pad.Parent = waiting
else
pad.Parent = tycoon.Buttons
end
end
end
rebirthPad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and player == owner and rebirthPad.Parent == tycoon then
resetFactory()
player.leaderstats.Rebirths.Value += 1
player.leaderstats.Cash.Value = 0
headline = player.Name .. "'s Factory"
setSign(headline)
end
end)
-- שמירה: Cash ו-Rebirths
local function saveFactory(player)
local data = {
Cash = player.leaderstats.Cash.Value,
Rebirths = player.leaderstats.Rebirths.Value,
}
pcall(function()
factoryStore:SetAsync(player.UserId, data)
end)
end
-- ה-Cash וה-Rebirths של השחקן נשמרים כשהוא עוזב
Players.PlayerRemoving:Connect(function(player)
saveFactory(player)
-- שיעור 20: שחרור המפעל יתווסף כאן
end)
game:BindToClose(function()
for _, player in Players:GetPlayers() do
saveFactory(player)
end
end)
-- השלט מציג את ההכנסה של הבעלים כל 5 שניות
task.spawn(function()
while true do
task.wait(5)
if owner then
setSign(headline .. "\n$" .. math.floor(earned / 5) .. " a second")
end
earned = 0
end
end)
-- תפיסת בעלות: השחקן הראשון שדורך על המשטח הופך לבעל המפעל
local claimPad = tycoon.ClaimPad
claimPad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and not owner then
owner = player
claimPad.Color = Color3.fromRGB(120, 120, 120)
claimPad.Material = Enum.Material.SmoothPlastic
headline = player.Name .. "'s Factory"
setSign(headline)
for _, dropper in CollectionService:GetTagged("Dropper") do
if dropper:IsDescendantOf(workspace) then
startDropper(dropper)
end
end
end
end)
כל השיעורים ביחידה משחק Roblox: איל מפעל
4הפכו את זה למשחק
השלמת המפעלתרגלו בעצמכם: Roblox אונליין