Yükseltici
Coddy'nin Roblox Oyunu: Fabrika Tycoon kursunda ders 10 / 18.
Kemerin üzerindeki mor geçit yükselticidir. Cevheri durdurmaz (CanCollide değildir), ancak içinden geçen her cevher iki kat değer kazanır.
Touched aynı cevher için birden fazla kez tetiklenebilir; örneğin cevher durup tekrar hareket etmeye başlarsa. İki kez değerini ikiye katlamak oyuncuların bayılacağı, sahiplerin ise nefret edeceği bir hata olur. Bu yüzden yükseltici, değerini ikiye katladığı her cevheri bir öznitelikle işaretler ve işaretli olanları atlar:
if hit.Name == "Ore" and not hit:GetAttribute("Upgraded") then
hit:SetAttribute("Upgraded", true)
hit:SetAttribute("Value", hit:GetAttribute("Value") * 2)
endYükseltici satın alınana kadar ServerStorage içinde bekler, ancak Touched bağlantısı en başta kurulabilir: bağlantı parçayla birlikte nereye giderse orada kalır ve Touched yalnızca parça dünyaya girdiğinde tetiklenir.
Görev
Ortaitems.Upgrader.Touched öğesini bağla: parça Ore adındaysa ve Upgraded niteliği yoksa, Upgraded değerini true olarak ayarla, Value değerini ikiye katla ve rengini mora çevir (Color3.fromRGB(155, 89, 182)).
Play düğmesine bas, yükselticiyi satın al ve gelirinin ikiye katlanmasını izle, ardından Check düğmesine bas.
Kendin dene
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")
-- Her oyuncuya liderlik tablosunda Cash verilir
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)
-- Fabrikanın üzerindeki tabela
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: bir dropper'ın altına bırakılan, Cash değerinde küçük bir parça
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
-- Bir dropper, kaç kez başlatılırsa başlatılsın yalnızca tek bir döngü çalıştırır
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
-- Konveyör, üzerinde duran her şeyi taşır
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)
-- Toplayıcı, cevheri Cash'e dönüştürür
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)
-- Satın alınan bir öğeyi fabrikaya yerleştir
local function build(item)
item.Parent = tycoon.Built
if item:HasTag("Dropper") then
startDropper(item)
end
end
-- Satın alma: platform ortadan kalkar ve ona ait öğe inşa edilir
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
-- Her platformun üzerinde bir fiyat etiketi görünür
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
-- Sahiplenme: platforma ilk basan oyuncu fabrikanın sahibi olur
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)
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.