mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-23 20:42:48 +01:00
524 lines
17 KiB
Lua
524 lines
17 KiB
Lua
local event = require("event")
|
||
local c = require("component")
|
||
local unicode = require("unicode")
|
||
local sides = require("sides")
|
||
local gpu = c.gpu
|
||
local inv = c.inventory_controller
|
||
local chestSide = sides.up
|
||
|
||
--------------------------------------------------------------------------------------------------------
|
||
|
||
local currentMode = 3
|
||
local xSize, ySize = gpu.getResolution()
|
||
|
||
local rarityColors = {
|
||
["Common"] = 0xB0C3D9,
|
||
["Uncommon"] = 0x5E98D9,
|
||
["Rare"] = 0x4B69FF,
|
||
["Mythical"] = 0x8847FF,
|
||
["Legendary"] = 0xD32CE6,
|
||
["Immortal"] = 0xE4AE33,
|
||
["Arcana"] = 0xADE55C,
|
||
["Ancient"] = 0xEB4B4B
|
||
}
|
||
|
||
local colors = {
|
||
["background"] = 0x262626,
|
||
["topbar"] = 0xffffff,
|
||
["topbarText"] = 0x444444,
|
||
["topbarButton"] = ecs.colors.blue,
|
||
["topbarButtonText"] = 0xffffff,
|
||
["inventoryBorder"] = 0xffffff,
|
||
["inventoryBorderSelect"] = ecs.colors.blue,
|
||
["inventoryBorderSelectText"] = 0xffffff,
|
||
["inventoryText"] = 0x262626,
|
||
["inventoryTextDarker"] = 0x666666,
|
||
["sellButtonColor"] = ecs.colors.blue,
|
||
["sellButtonTextColor"] = 0xffffff,
|
||
}
|
||
|
||
local moneySymbol = "€"
|
||
local adminSellMultiplyer = 0.5
|
||
|
||
local widthOfOneItemElement = 12
|
||
local heightOfOneItemElement = widthOfOneItemElement / 2
|
||
|
||
--------------------------------------------------------------------------------------------------------
|
||
|
||
local adminShop = {
|
||
["minecraft:stone"] = {
|
||
["data"] = 0,
|
||
["price"] = 4,
|
||
["rarity"] = "Uncommon",
|
||
},
|
||
["minecraft:diamond"] = {
|
||
["data"] = 0,
|
||
["price"] = 200,
|
||
["rarity"] = "Legendary",
|
||
},
|
||
["minecraft:grass"] = {
|
||
["data"] = 0,
|
||
["price"] = 4,
|
||
["rarity"] = "Uncommon",
|
||
},
|
||
["minecraft:cobblestone"] = {
|
||
["data"] = 0,
|
||
["price"] = 2,
|
||
["rarity"] = "Common",
|
||
},
|
||
["minecraft:dirt"] = {
|
||
["data"] = 0,
|
||
["price"] = 2,
|
||
["rarity"] = "Common",
|
||
},
|
||
["minecraft:iron_ore"] = {
|
||
["data"] = 0,
|
||
["price"] = 20,
|
||
["rarity"] = "Rare",
|
||
},
|
||
["minecraft:gold_ore"] = {
|
||
["data"] = 0,
|
||
["price"] = 40,
|
||
["rarity"] = "Mythical",
|
||
},
|
||
["minecraft:coal_ore"] = {
|
||
["data"] = 0,
|
||
["price"] = 5,
|
||
["rarity"] = "Uncommon",
|
||
},
|
||
["minecraft:wool"] = {
|
||
["data"] = 0,
|
||
["price"] = 10,
|
||
["rarity"] = "Uncommon",
|
||
},
|
||
["minecraft:redstone"] = {
|
||
["data"] = 0,
|
||
["price"] = 10,
|
||
["rarity"] = "Rare",
|
||
},
|
||
["minecraft:log"] = {
|
||
["data"] = 0,
|
||
["price"] = 3,
|
||
["rarity"] = "Common",
|
||
},
|
||
["IC2:itemOreIridium"] = {
|
||
["data"] = 0,
|
||
["price"] = 50000,
|
||
["rarity"] = "Arcana",
|
||
},
|
||
}
|
||
|
||
local massivWithProfile = {
|
||
["name"] = "IT",
|
||
["money"] = 1000000,
|
||
["inventory"] = {
|
||
{
|
||
["id"] = "minecraft:stone",
|
||
["label"] = "Stone",
|
||
["data"] = 0,
|
||
["count"] = 64,
|
||
},
|
||
{
|
||
["id"] = "minecraft:grass",
|
||
["data"] = 0,
|
||
["label"] = "Grass",
|
||
["count"] = 32,
|
||
},
|
||
{
|
||
["id"] = "minecraft:wool",
|
||
["data"] = 0,
|
||
["label"] = "Red wool",
|
||
["count"] = 12,
|
||
},
|
||
{
|
||
["id"] = "minecraft:diamond",
|
||
["data"] = 0,
|
||
["label"] = "Diamond",
|
||
["count"] = 999,
|
||
},
|
||
{
|
||
["id"] = "minecraft:cobblestone",
|
||
["data"] = 0,
|
||
["label"] = "Cobblestone",
|
||
["count"] = 47000,
|
||
},
|
||
{
|
||
["id"] = "minecraft:redstone",
|
||
["data"] = 0,
|
||
["label"] = "Redstone",
|
||
["count"] = 12000,
|
||
},
|
||
{
|
||
["id"] = "minecraft:iron_ore",
|
||
["data"] = 0,
|
||
["label"] = "Iron ore",
|
||
["count"] = 572,
|
||
},
|
||
{
|
||
["id"] = "minecraft:gold_ore",
|
||
["data"] = 0,
|
||
["label"] = "Gold ore",
|
||
["count"] = 246,
|
||
},
|
||
{
|
||
["id"] = "minecraft:coal_ore",
|
||
["data"] = 0,
|
||
["label"] = "Coal ore",
|
||
["count"] = 11,
|
||
},
|
||
{
|
||
["id"] = "IC2:itemOreIridium",
|
||
["data"] = 0,
|
||
["label"] = "Iridium Ore",
|
||
["count"] = 5,
|
||
},
|
||
{
|
||
["id"] = "minecraft:log",
|
||
["data"] = 0,
|
||
["label"] = "Log",
|
||
["count"] = 124782,
|
||
},
|
||
},
|
||
}
|
||
|
||
--Обжекты
|
||
local obj = {}
|
||
local function newObj(class, name, ...)
|
||
obj[class] = obj[class] or {}
|
||
obj[class][name] = {...}
|
||
end
|
||
|
||
--Сконвертировать кол-во предметов в более компактный вариант
|
||
local function prettyItemCount(count)
|
||
if count >= 1000 then
|
||
return tostring(math.floor(count / 1000)) .. "K"
|
||
end
|
||
return tostring(count)
|
||
end
|
||
|
||
--Добавление предмета в инвентарь
|
||
local function addItemToInventory(id, data, label, count)
|
||
--Переменная успеха, означающая, что такой предмет уже есть,
|
||
--и что его количество успешно увеличилось
|
||
local success = false
|
||
--Перебираем весь массив инвентаря и смотрим, есть ли чет такое
|
||
for i = 1, #massivWithProfile.inventory do
|
||
if id == massivWithProfile.inventory[i].id then
|
||
if data == massivWithProfile.inventory[i].data then
|
||
massivWithProfile.inventory[i].count = massivWithProfile.inventory[i].count + count
|
||
success = true
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
--Если такого предмета нет, то создать новый слот в инвентаре
|
||
if not success then
|
||
table.insert(massivWithProfile.inventory, { ["id"] = id, ["data"] = data, ["label"] = label, ["count"] = count } )
|
||
end
|
||
end
|
||
|
||
--Удалить кол-во предмета из инвентаря
|
||
local function removeItemFromInventory(numberOfItemInInventory, count)
|
||
local skokaMozhnaUdalit = massivWithProfile.inventory[numberOfItemInInventory].count
|
||
if count > skokaMozhnaUdalit then count = skokaMozhnaUdalit end
|
||
massivWithProfile.inventory[numberOfItemInInventory].count = massivWithProfile.inventory[numberOfItemInInventory].count - count
|
||
if massivWithProfile.inventory[numberOfItemInInventory].count == 0 then
|
||
table.remove(massivWithProfile.inventory, numberOfItemInInventory)
|
||
end
|
||
end
|
||
|
||
--Просканировать сундук и добавить в него шмот
|
||
local function addToInventoryFromChest()
|
||
local counter = 0
|
||
local inventorySize = inv.getInventorySize(chestSide)
|
||
for i = 1, inventorySize do
|
||
local stack = inv.getStackInSlot(chestSide, i)
|
||
if stack then
|
||
addItemToInventory(stack.name, stack.damage, stack.label, stack.size)
|
||
counter = counter + stack.size
|
||
end
|
||
end
|
||
|
||
return counter
|
||
end
|
||
|
||
--Продать шмотку одменам
|
||
local function sellToAdmins(numberOfItemInInventory, skoka)
|
||
local item = massivWithProfile.inventory[numberOfItemInInventory]
|
||
if adminShop[item.id] then
|
||
local price = math.floor(adminShop[item.id].price * adminSellMultiplyer)
|
||
removeItemFromInventory(numberOfItemInInventory, skoka)
|
||
massivWithProfile.money = massivWithProfile.money + price * skoka
|
||
return (price * skoka)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--Нарисовать конкретный айтем
|
||
local function drawItem(xPos, yPos, back, fore, text1, text2)
|
||
--Рисуем квадратик
|
||
ecs.square(xPos, yPos, widthOfOneItemElement, heightOfOneItemElement, back)
|
||
--Рисуем текст в рамке
|
||
text1 = ecs.stringLimit("end", text1, widthOfOneItemElement - 2)
|
||
text2 = ecs.stringLimit("end", prettyItemCount(text2), widthOfOneItemElement - 2)
|
||
local x
|
||
x = xPos + math.floor(widthOfOneItemElement / 2 - unicode.len(text1) / 2)
|
||
ecs.colorText(x, yPos + 2, fore, text1)
|
||
x = xPos + math.floor(widthOfOneItemElement / 2 - unicode.len(text2) / 2)
|
||
ecs.colorText(x, yPos + 3, fore, text2)
|
||
x = nil
|
||
end
|
||
|
||
--Показ инвентаря
|
||
local function showInventory(x, y, massivOfInventory, page, currentItem)
|
||
obj["SellItems"] = nil
|
||
obj["SellButtons"] = nil
|
||
|
||
local widthOfItemInfoPanel = 26
|
||
local width = math.floor((xSize - widthOfItemInfoPanel - 4) / (widthOfOneItemElement))
|
||
local height = math.floor((ySize - 8) / (heightOfOneItemElement))
|
||
local countOfItems = #massivOfInventory.inventory
|
||
local countOfPages = math.ceil(countOfItems / (width * height))
|
||
local widthOfAllElements = width * widthOfOneItemElement
|
||
local heightOfAllElements = height * heightOfOneItemElement
|
||
currentItem = currentItem or 1
|
||
|
||
--Очищаем фоном
|
||
ecs.square(x, y, widthOfAllElements, heightOfAllElements, colors.background)
|
||
|
||
--Рисуем айтемы
|
||
local textColor, borderColor, itemCounter, xPos, yPos = nil, nil, 1 + page * width * height - width * height, x, y
|
||
for j = 1, height do
|
||
xPos = x
|
||
for i = 1, width do
|
||
--Если такой предмет вообще существует
|
||
if massivOfInventory.inventory[itemCounter] then
|
||
--Делаем цвет рамки
|
||
if itemCounter == currentItem then
|
||
borderColor = colors.inventoryBorderSelect
|
||
textColor = colors.inventoryBorderSelectText
|
||
else
|
||
local cyka = false
|
||
if j % 2 == 0 then
|
||
if i % 2 ~= 0 then
|
||
cyka = true
|
||
end
|
||
else
|
||
if i % 2 == 0 then
|
||
cyka = true
|
||
end
|
||
end
|
||
|
||
if cyka then
|
||
borderColor = colors.inventoryBorder
|
||
else
|
||
borderColor = colors.inventoryBorder - 0x111111
|
||
end
|
||
textColor = colors.inventoryText
|
||
end
|
||
|
||
--Рисуем итем
|
||
drawItem(xPos, yPos, borderColor, textColor, massivOfInventory.inventory[itemCounter].label, massivOfInventory.inventory[itemCounter].count)
|
||
|
||
newObj("SellItems", itemCounter, xPos, yPos, xPos + widthOfOneItemElement - 1, yPos + heightOfOneItemElement - 1)
|
||
else
|
||
break
|
||
end
|
||
|
||
itemCounter = itemCounter + 1
|
||
|
||
xPos = xPos + widthOfOneItemElement
|
||
end
|
||
yPos = yPos + heightOfOneItemElement
|
||
end
|
||
|
||
--Рисуем инфу о кнкретном айтеме
|
||
xPos = x + widthOfAllElements + 2
|
||
yPos = y
|
||
widthOfItemInfoPanel = xSize - xPos - 1
|
||
|
||
--Рамку рисуем
|
||
ecs.square(xPos, yPos, widthOfItemInfoPanel, ySize - 5, colors.inventoryBorder)
|
||
yPos = yPos + 1
|
||
xPos = xPos + 2
|
||
|
||
--Инфа о блоке
|
||
local currentRarity = adminShop[massivOfInventory.inventory[currentItem].id]
|
||
if not currentRarity then currentRarity = "Common" else currentRarity = currentRarity.rarity end
|
||
ecs.colorText(xPos, yPos, colors.inventoryText, massivOfInventory.inventory[currentItem].label); yPos = yPos + 1
|
||
ecs.colorText(xPos, yPos, rarityColors[currentRarity], currentRarity); yPos = yPos + 1
|
||
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, massivOfInventory.inventory[currentItem].id); yPos = yPos + 1
|
||
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "Цвет: " .. massivOfInventory.inventory[currentItem].data); yPos = yPos + 1
|
||
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "Количество: " .. massivOfInventory.inventory[currentItem].count); yPos = yPos + 1
|
||
|
||
--Твой бабос
|
||
yPos = yPos + 1
|
||
ecs.colorText(xPos, yPos, colors.inventoryText, "Твой капитал:"); yPos = yPos + 1
|
||
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, massivOfInventory.money .. moneySymbol); yPos = yPos + 1
|
||
|
||
--Цена админов
|
||
yPos = yPos + 1
|
||
local adminPrice = adminShop[massivOfInventory.inventory[currentItem].id]
|
||
if adminPrice then adminPrice = math.floor(adminPrice.price * adminSellMultiplyer) .. moneySymbol else adminPrice = "Отсутствует" end
|
||
ecs.colorText(xPos, yPos, colors.inventoryText, "Цена у админов:"); yPos = yPos + 1
|
||
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, adminPrice)
|
||
|
||
--Цена на ТП
|
||
yPos = yPos + 2
|
||
ecs.colorText(xPos, yPos, colors.inventoryText, "Цена на Торговой Площадке:"); yPos = yPos + 1
|
||
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "От 130.27"..moneySymbol); yPos = yPos + 1
|
||
|
||
--Кнопы
|
||
xPos = xPos - 2
|
||
yPos = ySize - 3
|
||
local x1, y1, x2, y2, name
|
||
name = "Продать игрокам"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, widthOfItemInfoPanel, 3, name, colors.sellButtonColor, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, widthOfItemInfoPanel); yPos = yPos - 3
|
||
if adminPrice ~= "Отсутствует" then
|
||
name = "Продать админам"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, widthOfItemInfoPanel, 3, name, 0x66b6ff, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, widthOfItemInfoPanel); yPos = yPos - 3
|
||
end
|
||
name = "Пополнить инвентарь"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, widthOfItemInfoPanel, 3, name, 0x99dbff, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, widthOfItemInfoPanel); yPos = yPos - 3
|
||
|
||
--Перелистывалки
|
||
local stro4ka = tostring(page) .. " из " .. tostring(countOfPages)
|
||
local sStro4ka = unicode.len(stro4ka) + 2
|
||
xPos = xPos - sStro4ka - 16
|
||
yPos = ySize - 3
|
||
name = "<"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, 7, 3, name, colors.sellButtonColor, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, 7); xPos = xPos + 7
|
||
ecs.square(xPos, yPos, sStro4ka, 3, colors.inventoryBorder)
|
||
ecs.colorText(xPos + 1, yPos + 1, 0x000000, stro4ka); xPos = xPos + sStro4ka
|
||
name = ">"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, 7, 3, name, colors.sellButtonColor, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, 7)
|
||
|
||
return countOfPages
|
||
end
|
||
|
||
local function sell()
|
||
--Показываем инвентарь
|
||
local xInventory, yInventory, currentPage, currentItem = 3, 5, 1, 1
|
||
local countOfPages = showInventory(xInventory, yInventory, massivWithProfile, currentPage, currentItem)
|
||
|
||
ecs.error("Программа разрабатывается. По сути это будет некий аналог Торговой Площадки Стима с разными доп. фичами.")
|
||
|
||
|
||
while true do
|
||
local e = {event.pull()}
|
||
if e[1] == "touch" then
|
||
for key in pairs(obj["SellItems"])do
|
||
if ecs.clickedAtArea(e[3], e[4], obj["SellItems"][key][1], obj["SellItems"][key][2], obj["SellItems"][key][3], obj["SellItems"][key][4]) then
|
||
currentItem = key
|
||
showInventory(xInventory, yInventory, massivWithProfile, currentPage, currentItem)
|
||
break
|
||
end
|
||
end
|
||
|
||
for key in pairs(obj["SellButtons"])do
|
||
if ecs.clickedAtArea(e[3], e[4], obj["SellButtons"][key][1], obj["SellButtons"][key][2], obj["SellButtons"][key][3], obj["SellButtons"][key][4]) then
|
||
ecs.drawButton(obj["SellButtons"][key][1], obj["SellButtons"][key][2], obj["SellButtons"][key][5], 3, key, ecs.colors.green, 0xffffff)
|
||
os.sleep(0.3)
|
||
|
||
if key == ">" then
|
||
if currentPage < countOfPages then currentPage = currentPage + 1 end
|
||
|
||
elseif key == "<" then
|
||
if currentPage > 1 then currentPage = currentPage - 1 end
|
||
|
||
elseif key == "Пополнить инвентарь" then
|
||
ecs.error("Пихай предметы в сундук и жми ок, епта!")
|
||
local addedCount = addToInventoryFromChest()
|
||
ecs.error("Добавлено "..addedCount.." предметов.")
|
||
|
||
elseif key == "Продать админам" then
|
||
local maxToSell = massivWithProfile.inventory[currentItem].count
|
||
local data = ecs.universalWindow("auto", "auto", 40, 0x444444, true, {"EmptyLine"}, {"CenterText", 0xffffff, "Сколько продаем?"}, {"EmptyLine"}, {"Slider", 0xffffff, 0x33db80, 1, maxToSell, math.floor(maxToSell / 2), "Количество: "}, {"EmptyLine"}, {"Button", 0x33db80, 0xffffff, "Продать"})
|
||
local count = data[1] or nil
|
||
if count then
|
||
local money = sellToAdmins(currentItem, count)
|
||
ecs.universalWindow("auto", "auto", 40, 0x444444, true, {"EmptyLine"}, {"CenterText", 0xffffff, "Успешно продано!"}, {"CenterText", 0xffffff, "Ты заработал "..money..moneySymbol}, {"EmptyLine"}, {"Button", 0x33db80, 0xffffff, "Ok"})
|
||
else
|
||
ecs.error("Ошибка при продаже! Дебажь!")
|
||
end
|
||
end
|
||
|
||
countOfPages = showInventory(xInventory, yInventory, massivWithProfile, currentPage, currentItem)
|
||
|
||
break
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
local function main()
|
||
--Кнопы
|
||
local topButtons = {{"🏠", "Главная"}, {"⟱", "Купить"}, {"⟰", "Продать"}, {"☯", "Лотерея"},{"€", "Мой профиль"}}
|
||
--Расстояние между кнопами
|
||
local spaceBetweenTopButtons = 2
|
||
--Считаем ширину
|
||
local widthOfTopButtons = 0
|
||
for i = 1, #topButtons do
|
||
topButtons[i][3] = unicode.len(topButtons[i][2]) + 2
|
||
widthOfTopButtons = widthOfTopButtons + topButtons[i][3] + spaceBetweenTopButtons
|
||
end
|
||
--Считаем коорду старта кноп
|
||
local xStartOfTopButtons = math.floor(xSize / 2 - widthOfTopButtons / 2)
|
||
|
||
--Рисуем топбар
|
||
ecs.square(1, 1, xSize, 3, colors.topbar)
|
||
|
||
--Рисуем белую подложку
|
||
ecs.square(1, 4, xSize, ySize - 3, colors.background)
|
||
|
||
--Отрисовка одной кнопки
|
||
local function drawButton(i, x)
|
||
local back, fore
|
||
if i == currentMode then
|
||
back = colors.topbarButton
|
||
fore = colors.topbarButtonText
|
||
else
|
||
back = colors.topbar
|
||
fore = colors.topbarText
|
||
end
|
||
|
||
ecs.drawButton(x, 1, topButtons[i][3], 2, topButtons[i][1], back, fore)
|
||
ecs.drawButton(x, 3, topButtons[i][3], 1, topButtons[i][2], back, fore)
|
||
end
|
||
|
||
--Рисуем топ кнопочки
|
||
for i = 1, #topButtons do
|
||
drawButton(i, xStartOfTopButtons)
|
||
xStartOfTopButtons = xStartOfTopButtons + topButtons[i][3] + spaceBetweenTopButtons
|
||
end
|
||
|
||
--Запускаем нужный режим работы проги
|
||
if currentMode == 3 then
|
||
|
||
sell()
|
||
end
|
||
end
|
||
|
||
main()
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|