Menu
CoddyTech

Ulepszacz

Lekcja 10 z 18 w kursie Gra Roblox: Fabryka Tycoon w Coddy.

Fioletowa brama nad taśmą to ulepszacz. Nie zatrzymuje rudy (nie ma włączonego CanCollide), ale każda ruda, która przez nią przechodzi, jest warta dwa razy więcej.

Zdarzenie Touched może uruchomić się więcej niż raz dla tej samej rudy, na przykład jeśli się zatrzyma, a potem znów ruszy, a podwojenie wartości dwa razy byłoby błędem, który gracze uwielbiają, a właściciele nienawidzą. Dlatego ulepszacz oznacza każdą rudę, której wartość podwoił, za pomocą atrybutu i pomija już oznaczone:

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

Ulepszacz czeka w ServerStorage, aż zostanie kupiony, ale zdarzenie Touched można podłączyć już na początku: połączenie pozostaje powiązane z częścią, gdziekolwiek się ona znajduje, a Touched uruchamia się dopiero wtedy, gdy część znajduje się w świecie.

challenge icon

Wyzwanie

Średni

Połącz items.Upgrader.Touched: gdy część nazywa się Ore i nie ma atrybutu Upgraded, ustaw Upgraded na true, podwój jej Value i pokoloruj ją na fioletowo (Color3.fromRGB(155, 89, 182)).

Naciśnij Play, kup ulepszacz i zobacz, jak twoje dochody się podwajają, a następnie naciśnij Check.

Spróbuj swoich sił

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")

-- Każdy gracz otrzymuje Cash w tabeli wyników
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)

-- Tablica nad fabryką
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: mały obiekt o wartości Cash, upuszczany pod dropperem
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

-- Dropper działa w jednej pętli, niezależnie od tego, ile razy zostanie uruchomiony
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

-- Taśmociąg przenosi wszystko, co na nim leży
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)

-- Kolektor zamienia rudę na 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)

-- Umieść kupiony przedmiot w fabryce
local function build(item)
	item.Parent = tycoon.Built
	if item:HasTag("Dropper") then
		startDropper(item)
	end
end

-- Kupowanie: płytka znika, a przypisany do niej przedmiot powstaje
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

-- Nad każdą płytką unosi się etykieta z ceną
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

-- Przejęcie: fabryka należy do pierwszego gracza, który wejdzie na płytkę
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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra Roblox: Fabryka Tycoon