استحوذ على المصنع
الدرس 6 من 18 في دورة لعبة Roblox: تايكون المصنع على Coddy.
يعود مصنع التايكون إلى شخص ما. اللوحة الخضراء بجانب المدخل تتيح المطالبة به: يصبح أول لاعب يطأها المالك، ويبدأ المصنع بالعمل، ولا يحصل على المال إلا المالك. المالك هو متغير واحد في أعلى البرنامج النصي، وتكون قيمته nil حتى يطالب به أحد:
local owner = nil
claimPad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and not owner then
owner = player
end
end)عند المطالبة بالمصنع، يبدأ كل موزّع فيه بالعمل. تحمل الموزّعات وسمًا، Dropper، لذا يعثر CollectionService:GetTagged("Dropper") عليها كلها أينما كانت. ستنتظر الموزّعات التي تم شراؤها في ServerStorage، لذا لا يبدأ العمل إلا للموجود منها في مساحة العمل.
لاحقًا، يمكن المطالبة بالمصنع مجددًا بعد مغادرة مالكه. ولضمان ألا يشغّل أي موزّع حلقتين أبدًا، تضع startDropper سمةً على الموزّع الجاري تشغيله، ولا تفعل شيئًا إذا كانت السمة مضبوطة.
تُظهر لافتة فوق المصنع لمن تعود ملكيته: واجهة SurfaceGui على tycoon.Sign، كما هو الحال على أي لوحة.
التحدي
متوسطاجعل المصنع قابلاً للمطالبة به:
- احصل على
CollectionService، وأضفlocal owner = nilبالقرب من الأعلى. - ضع لافتة على
tycoon.Sign: SurfaceGui مع TextLabel اسمهStatusيملؤه، بنص أبيض مكبّر على خلفية داكنة، يقرأStep on the green pad to claim this factory، ودالةsetSign(text). - في
startDropper، أوقف التنفيذ فورًا إذا كانت سمةRunningالخاصة بالـ dropper مضبوطة؛ وإلا فاضبطها، ثم امسحها عند انتهاء الحلقة. - احذف السطر الذي يبدأ
tycoon.Dropper. عندما يخطو لاعب علىtycoon.ClaimPadولا يكون هناك مالك: اجعله المالك، واجعل لون اللوحة رماديًا (Color3.fromRGB(120, 120, 120)، SmoothPlastic)، واضبط اللافتة علىPlayer1's Factory(باستخدام Name الخاص به)، وابدأ كل dropper ذي وسم في مساحة العمل. - ادفع للمالك فقط عند المجمّع (إن وُجد).
اضغط Play وطالب بمصنعك، ثم اضغط Check.
جرّب بنفسك
local Players = game:GetService("Players")
local Debris = game:GetService("Debris")
local Settings = require(game.ReplicatedStorage.Settings)
local tycoon = workspace.Tycoon
print("Ore is worth " .. Settings.OreValue .. " Cash")
-- يحصل كل لاعب على Cash في لوحة المتصدرين
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
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
startDropper(tycoon.Dropper)
-- يحمل الحزام الناقل كل ما يستقر عليه
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()
for _, player in Players:GetPlayers() do
player.leaderstats.Cash.Value += value
end
end
end)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.