Menu
CoddyTech
flag Ar iconالعربيةdown icon

أداة الترقية

الدرس 10 من 18 في دورة لعبة Roblox: تايكون المصنع على Coddy.

البوابة البنفسجية فوق الحزام هي الترقية. لا توقف الخام (فخاصية CanCollide غير مفعّلة)، لكن قيمة كل خام يمر عبرها تتضاعف.

قد يُطلَق Touched أكثر من مرة للخام نفسه، مثلًا إذا توقف ثم بدأ مجددًا، ومضاعفة القيمة مرتين ستكون خطأً يحبه اللاعبون ويكرهه المالكون. لذلك تضع الترقية سمةً على كل خام ضاعفت قيمته وتتخطى الخامات التي تحمل هذه السمة:

if hit.Name == "Ore" and not hit:GetAttribute("Upgraded") then
	hit:SetAttribute("Upgraded", true)
	hit:SetAttribute("Value", hit:GetAttribute("Value") * 2)
end

تنتظر الترقية في ServerStorage حتى يتم شراؤها، لكن يمكن ربط Touched بها منذ البداية: يظل الاتصال مرتبطًا بالجزء أينما كان، ولا يُطلَق Touched إلا عندما يكون الجزء في العالم.

challenge icon

التحدي

متوسط

اربط items.Upgrader.Touched: عندما يكون اسم الجزء Ore ولا يحتوي على السمة Upgraded، عيّن Upgraded إلى true، وضاعف قيمة Value، واجعله باللون الأرجواني (Color3.fromRGB(155, 89, 182)).

اضغط على تشغيل، واشترِ أداة الترقية وشاهد دخلك يتضاعف، ثم اضغط على تحقّق.

جرّب بنفسك

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local Debris = game:GetService("Debris")
local Settings = require(game.ReplicatedStorage.Settings)

local tycoon = workspace.Tycoon
local items = ServerStorage.TycoonItems
local owner = nil

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)

-- اللافتة الموجودة فوق المصنع
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)
	if dropper:GetAttribute("Running") then
		return
	end
	dropper:SetAttribute("Running", true)
	task.spawn(function()
		while dropper:IsDescendantOf(workspace) do
			dropOre(dropper)
			task.wait(Settings.DropInterval)
		end
		dropper:SetAttribute("Running", nil)
	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
			owner.leaderstats.Cash.Value += value
		end
	end
end)

-- ضع العنصر المشترى في المصنع
local function build(item)
	item.Parent = tycoon.Built
	if item:HasTag("Dropper") then
		startDropper(item)
	end
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 = ServerStorage
	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

-- المطالبة: أول لاعب يطأ المنصة يصبح مالك المصنع
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
		setSign(player.Name .. "'s Factory")
		for _, dropper in CollectionService:GetTagged("Dropper") do
			if dropper:IsDescendantOf(workspace) then
				startDropper(dropper)
			end
		end
	end
end)
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Roblox: تايكون المصنع