ROBLOX — Простой крафт — Simle craft

Автор: | 11 февраля, 2025
Поделиться...

Как же RPG составляющая без крафта? Никак!

Вариантов существует великое множество. У нас же будет самый простой вариант, без каких либо ограничений. Ну разве что одно — должны быть ресурсы в наличии.

Как обычно, на создании окна GUI заострять внимания не буду. Оно будет таким:

Но раз уж у нас второе окно, то придётся делать и кнопки HUD для открытия/закрытия окон. Тоже выпендриваться не буду и сделаю их простыми, тектовыми:

Получив, в итоге, такое строение в StarterGui. Это даёт нам возможность управлять окнами включением/выключением соответствующего Screen.

Вот собственно код HUD:

local HUD = script.Parent

-- убрать всё с экрана кроме HUD
for a, b in pairs(HUD.Parent:GetChildren()) do
	if b ~= HUD then
		b.Enabled = false
	end
end

-- все кнопки тут должны открывать и закрывать другие экраны
for a, b in pairs(HUD:GetChildren()) do
	if b:IsA("GuiButton") then
		local button = HUD.Parent:FindFirstChild(b.Name)
		if button then
			b.Activated:Connect(function()
				button.Enabled = not button.Enabled
			end)
		end
	end
end

Как видим, тут всё просто. Сперва выключаем все Screen кроме HUD, а после просто инвертируем значение Enabled по нажатой кнопке. Соответственно имена кнопок и экранов одинаковые.

Следующим шагом создадим табличку для крафта — что и из чего будет создавать. Для примера набросал такую:

return {
	Plank = {	-- доски
		Result = 1,		-- сколько на выходе
		Timer = 5,		-- время изготовления
		Resource = {	-- затраты ресурсов
			Wood = 1,
		},
		Desc = "Не обструганные доски"
	},
	Heap = {	-- шапка
		Result = 1,
		Timer = 15,
		Resource = {
			Thatch = 10,
			Leaves = 5
		},
		Desc = "Соломенная шляпа"
	},
	["Ingot metall"] = {
		Result = 1,
		Timer = 10,
		Resource = {
			Metall = 10,
			Stone = 10,
			Flint = 1,
		},
		Desc = "Слиток металла"
	},
	Nails = {
		Result = 10,
		Timer = 5,
		Resource = {
			["Ingot metall"] = 1,
			Wood = 10,
		},
		Desc = "Обычные гвозди"
	},
	Table = {
		Result = 1,
		Timer = 15,
		Resource = {
			Nails = 1,
			Plank = 15,
		},
		Desc = "Простой стол"
	}
}

Обращаем внимание, что созданный элемент так же может стать частью нового рецепта крафта. На примере «Ingot metall».

Теперь нам нужен скрипт что будет заполнять левую часть окна по этой таблице и правую по нажатой кнопке слева. Ну и конечно, при наличии ресурсов, создавать предмет.

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local craftTable = require( ReplicatedStorage:WaitForChild("Resource"):WaitForChild("Craft") )

local player = Players.LocalPlayer
local invent = player:WaitForChild("Inventory")

local main = script.Parent
local info = main:WaitForChild("Info")
local recept = main:WaitForChild("Recipient")

local sample = recept:WaitForChild("Sample"):Clone()
local ui = recept:WaitForChild("UIListLayout"):Clone()

local selected = info:WaitForChild("Select")

-- изменение выбранного рецепта
local function SelectChange(value)
	-- отобразить информацию
	local val = selected.Value	-- что именно выбрали для крафта
	
	local element = craftTable[val]
	print(element)
	-- вывод информации о рецепте крафта
	if element then
		info.Title.Text = val 
		local res = ""
		for a, b in pairs(element.Resource) do
			if res ~= "" then	-- добавим перевод строки
				res = res .. "\n"
			end
			res = res .. a  .. " x " .. tostring(b)
		end
		info.Compound.Text = res
		info.Description.Text = element.Desc
	end
	
	local flag = true	-- можно крафтить
	for a, b in pairs(element.Resource) do
		local res = invent:FindFirstChild(a) 
		if res then
			if b > res.Value then
				flag = false	-- не хватает ресурса
			end 
		else	-- нет ресурса
			flag = false
		end
	end
	
	if flag then
		info.btnCraft.Interactable = true
		info.btnCraft.TextColor3 = Color3.new(0, 1, 0)
	else
		info.btnCraft.Interactable = false
		info.btnCraft.TextColor3 = Color3.new(1, 0, 0)
	end
end
selected.Changed:Connect(SelectChange)

-- создание предмета
function Craft()
	local val = selected.Value	-- что именно выбрали для крафта

	local element = craftTable[val]
	
	-- заберём ресурсы
	for a, b in pairs(element.Resource) do
		local res = invent:FindFirstChild(a)
		res.Value = res.Value - b
		-- если кончилось нужно удалить из инвентаря
		if res.Value == 0 then
			res:Destroy()
		end
	end
	
	-- добавим что скрафтили
	local new = invent:FindFirstChild(val)
	if new == nil then	-- ещё нет в инвентаре
		new = Instance.new("NumberValue")	
		new.Name = val
	end
	new.Value = new.Value + element.Result
	new.Parent = invent
	
	-- проверка можно ли ещё раз крафтить
	local flag = true	-- можно крафтить
	for a, b in pairs(element.Resource) do
		local res = invent:FindFirstChild(a) 
		if res then
			if b > res.Value then
				flag = false	-- не хватает ресурса
			end 
		else	-- нет ресурса
			flag = false
		end
	end

	if flag then
		info.btnCraft.Interactable = true
		info.btnCraft.TextColor3 = Color3.new(0, 1, 0)
	else
		info.btnCraft.Interactable = false
		info.btnCraft.TextColor3 = Color3.new(1, 0, 0)
	end
end
info.btnCraft.Activated:Connect(Craft)

recept:ClearAllChildren()
local uis = ui:Clone()
uis.Parent = recept

for nam, var in pairs(craftTable) do
	-- создание элемента списка
	local new = sample:Clone()
	new.Name = nam
	new.Names.Text = var.Desc
	new.Parent = recept
	new.Button.Activated:Connect(function()
		selected.Value = nam
	end)
end

Что будет выглядеть примерно так:

И соответственно после крафта получаем новые предметы в инвентаре:

Что собственно нам и нужно было.

Как обычно (уже) плейс разработки прилагается.


Поделиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *