From 5ec69a98846f4bf9634906da9bd207d297fbff1c Mon Sep 17 00:00:00 2001 From: Igor Timofeev Date: Wed, 21 Oct 2015 03:19:47 +0300 Subject: [PATCH] Create Shop2.lua --- Beta/Shop2.lua | 931 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 931 insertions(+) create mode 100644 Beta/Shop2.lua diff --git a/Beta/Shop2.lua b/Beta/Shop2.lua new file mode 100644 index 00000000..d47508a7 --- /dev/null +++ b/Beta/Shop2.lua @@ -0,0 +1,931 @@ + +------------------------------------------ Библиотеки ----------------------------------------------------------------- + +local event = require("event") +local component = require("component") +local unicode = require("unicode") +local sides = require("sides") +local chestSide = sides.up +local gpu = component.gpu +local inventoryController + +if not component.isAvailable("inventory_controller") then + ecs.error("Данная программа требует подключенный Адаптер с вставленным в него улучшением \"Контроллер инвентаря\", при этом на сам адаптер сверху необходимо поставить сундук, в который будут поступать предметы для продажи.") + return +else + inventoryController = component.inventory_controller +end + +------------------------------------------ Переменные ----------------------------------------------------------------- + +local colors = { + ["background"] = 0x262626, + ["topbar"] = 0xffffff, + ["topbarText"] = 0x444444, + ["topbarActive"] = ecs.colors.blue, + ["topbarActiveText"] = 0xffffff, + ["inventoryBorder"] = 0xffffff, + ["inventoryBorderSelect"] = ecs.colors.blue, + ["inventoryBorderSelectText"] = 0xffffff, + ["inventoryText"] = 0x262626, + ["inventoryTextDarker"] = 0x666666, + ["sellButtonColor"] = ecs.colors.blue, + ["sellButtonTextColor"] = 0xffffff, + rarity = { + ["Common"] = 0xB0C3D9, + ["Uncommon"] = 0x5E98D9, + ["Rare"] = 0x4B69FF, + ["Mythical"] = 0x8847FF, + ["Legendary"] = 0xD32CE6, + ["Immortal"] = 0xE4AE33, + ["Arcana"] = 0xADE55C, + ["Ancient"] = 0xEB4B4B + } +} + +--Массив админшопа с базовой информацией о блоках +local adminShop = { + ["minecraft:stone"] = { + [0] = { + ["price"] = 4, + ["rarity"] = "Uncommon", + }, + }, + ["minecraft:diamond"] = { + [0] = { + ["price"] = 200, + ["rarity"] = "Legendary", + }, + }, + ["minecraft:grass"] = { + [0] = { + ["price"] = 4, + ["rarity"] = "Uncommon", + }, + }, + ["minecraft:cobblestone"] = { + [0] = { + ["price"] = 2, + ["rarity"] = "Common", + }, + }, + ["minecraft:dirt"] = { + [0] = { + ["price"] = 2, + ["rarity"] = "Common", + }, + }, + ["minecraft:iron_ore"] = { + [0] = { + ["price"] = 20, + ["rarity"] = "Rare", + }, + }, + ["minecraft:gold_ore"] = { + [0] = { + ["price"] = 40, + ["rarity"] = "Mythical", + }, + }, + ["minecraft:coal_ore"] = { + [0] = { + ["price"] = 5, + ["rarity"] = "Uncommon", + }, + }, + ["minecraft:wool"] = { + [0] = { + ["price"] = 10, + ["rarity"] = "Uncommon", + }, + [15] = { + ["price"] = 15, + ["rarity"] = "Uncommon", + }, + [14] = { + ["price"] = 15, + ["rarity"] = "Uncommon", + }, + }, + ["minecraft:redstone"] = { + [0] = { + ["price"] = 10, + ["rarity"] = "Rare", + }, + }, + ["minecraft:log"] = { + [0] = { + ["price"] = 3, + ["rarity"] = "Common", + }, + }, + ["IC2:itemOreIridium"] = { + [0] = { + ["price"] = 50000, + ["rarity"] = "Arcana", + }, + }, +} + +--Массив инвентаря конкретного игрока +local massivWithProfile = { + ["nickname"] = "IT", + ["money"] = 100, + ["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 market = { + ["minecraft:diamond"] = { + [0] = { + { + ["nickname"] = "Daun228", + ["count"] = 228, + ["price"] = 150, + }, + { + ["nickname"] = "Lololoshka", + ["count"] = 15, + ["price"] = 90, + }, + }, + }, + ["minecraft:log"] = { + [0] = { + { + ["nickname"] = "EEOneGuy", + ["count"] = 121304, + ["price"] = 21.8, + }, + }, + }, + ["minecraft:gold_ore"] = { + [0] = { + { + ["nickname"] = "EEOneGuy", + ["count"] = 5, + ["price"] = 5, + }, + { + ["nickname"] = "Pidar", + ["count"] = 10, + ["price"] = 10, + }, + { + ["nickname"] = "Mamoeb", + ["count"] = 15, + ["price"] = 15, + }, + }, + }, + ["minecraft:iron_ore"] = { + [0] = { + { + ["nickname"] = "EEOneGuy", + ["count"] = 2424194, + ["price"] = 1000.12, + }, + }, + }, +} + + +local moneySymbol = "$" +local adminSellMultiplyer = 0.5 +local comissionMultiplyer = 0.04 + +local username = "ECS" +local currentMode = 2 + +local xSize, ySize = gpu.getResolution() + +local widthOfOneItemElement = 12 +local heightOfOneItemElement = widthOfOneItemElement / 2 + + +------------------------------------------ Функции ----------------------------------------------------------------- + +--Обжекты +local obj = {} +local function newObj(class, name, ...) + obj[class] = obj[class] or {} + obj[class][name] = {...} +end + +--Округление до опред. кол-ва знаков после запятой +local function round(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +--Сконвертировать кол-во предметов в более компактный вариант +local function prettyItemCount(count) + if count >= 1000000 then + return tostring(round(count / 1000000, 2)) .. "M" + elseif count >= 1000 then + return tostring(round(count / 1000, 2)) .. "K" + end + return tostring(count) +end + +--Фиксим число до 2-х знаков после запятой +local function fixMoney(money) + return round(money, 2) +end + +--Взымаем комиссию с купли/продажи +local function comission(money) + return fixMoney(money - money * comissionMultiplyer) +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 = inventoryController.getInventorySize(chestSide) + for i = 1, inventorySize do + local stack = inventoryController.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 + if adminShop[item.id][item.data] then + local price = fixMoney(adminShop[item.id][item.data].price * adminSellMultiplyer) + removeItemFromInventory(numberOfItemInInventory, skoka) + massivWithProfile.money = massivWithProfile.money + price * skoka + return (price * skoka) + else + ecs.error("У админов нет даты "..tostring(item.data)..", ищи ошибку, говнокодер ебаный!") + return 0 + end + else + ecs.error("У админов нет ид"..tostring(item.id)..", ищи ошибку, говнокодер ебаный!") + return 0 + end +end + +--Продать шмотку игрокам на ТП +local function sellToPlayers(number, count, priceForOneItem, nameOfSeller) + --Получаем инфо о шмотке + local item = massivWithProfile.inventory[number] + --Удаляем шмотку + removeItemFromInventory(number, count) + --Че будем добавлять на ТП + local govno = { ["nickname"] = nameOfSeller, ["count"] = count, ["price"] = priceForOneItem} + --Добавляем ее на ТП + if market[item.id] then + if market[item.id][item.data] then + table.insert(market[item.id][item.data], govno) + else + market[item.id][item.data] = { govno } + end + else + market[item.id] = { [item.data] = { govno } } + end +end + +--Анализ торговой площадки +--Выдает успех, если предмет найден +--А также самую лучшую цену, количество предмета на торг. площадке и никнейм самого дешевого +local function getInfoAboutItemOnMarket(id, data) + local price, count, success, nickname = nil, 0, false, nil + --Если в маркете есть такой ид + if market[id] then + --И такая дата + if market[id][data] then + --Перебираем все айтемы на маркете + for i = 1, #market[id][data] do + --Если данных таких нет, то создать стартовые + price = price or market[id][data][i].price + nickname = nickname or market[id][data][i].nickname + + --Если цена меньше, чем другие, то новая цена = этой + if market[id][data][i].price < price then + price = market[id][data][i].price + nickname = market[id][data][i].nickname + end + + --Прибавляем кол-во предметов + count = count + market[id][data][i].count + end + success = true + end + end + return success, price, count, nickname +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, page, currentItem) + obj["SellItems"] = nil + obj["SellButtons"] = nil + + currentUser = massivWithProfile.nickname + + local widthOfItemInfoPanel = 26 + local width = math.floor((xSize - widthOfItemInfoPanel - 4) / (widthOfOneItemElement)) + local height = math.floor((ySize - 8) / (heightOfOneItemElement)) + local countOfItems = #massivWithProfile.inventory + local countOfItemsOnOnePage = width * height + local countOfPages = math.ceil(countOfItems / countOfItemsOnOnePage) + local widthOfAllElements = width * widthOfOneItemElement + local heightOfAllElements = height * heightOfOneItemElement + + --Очищаем фоном + 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 massivWithProfile.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, massivWithProfile.inventory[itemCounter].label, massivWithProfile.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 = "Common" + if adminShop[massivWithProfile.inventory[currentItem].id] then + if adminShop[massivWithProfile.inventory[currentItem].id][massivWithProfile.inventory[currentItem].data] then + currentRarity = adminShop[massivWithProfile.inventory[currentItem].id][massivWithProfile.inventory[currentItem].data].rarity + end + end + ecs.colorText(xPos, yPos, colors.inventoryText, massivWithProfile.inventory[currentItem].label); yPos = yPos + 1 + ecs.colorText(xPos, yPos, colors.rarity[currentRarity], currentRarity); yPos = yPos + 2 + ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "ID: " .. massivWithProfile.inventory[currentItem].id); yPos = yPos + 1 + ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "Цвет: " .. massivWithProfile.inventory[currentItem].data); yPos = yPos + 1 + ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "Количество: " .. massivWithProfile.inventory[currentItem].count); yPos = yPos + 1 + + --Твой бабос + yPos = yPos + 1 + ecs.colorText(xPos, yPos, colors.inventoryText, "Ваш капитал:"); yPos = yPos + 1 + ecs.colorText(xPos, yPos, colors.inventoryTextDarker, massivWithProfile.money .. moneySymbol); yPos = yPos + 1 + + --Цена админов + yPos = yPos + 1 + local adminPrice = "Отсутствует" + if adminShop[massivWithProfile.inventory[currentItem].id] then + if adminShop[massivWithProfile.inventory[currentItem].id][massivWithProfile.inventory[currentItem].data] then + adminPrice = fixMoney(adminShop[massivWithProfile.inventory[currentItem].id][massivWithProfile.inventory[currentItem].data].price * adminSellMultiplyer) + end + end + ecs.colorText(xPos, yPos, colors.inventoryText, "Цена у админов:"); yPos = yPos + 1 + ecs.colorText(xPos, yPos, colors.inventoryTextDarker, tostring(adminPrice)..moneySymbol) + + --Цена на ТП + yPos = yPos + 2 + local success, price, count = getInfoAboutItemOnMarket(massivWithProfile.inventory[currentItem].id, massivWithProfile.inventory[currentItem].data) + ecs.colorText(xPos, yPos, colors.inventoryText, "Цена на Торговой Площадке:"); yPos = yPos + 1 + if success then + ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "Продается " .. prettyItemCount(count) .. " штук"); yPos = yPos + 1 + ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "Цена стартует от " .. prettyItemCount(price) .. moneySymbol); yPos = yPos + 1 + else + ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "Отсутствует"); yPos = yPos + 1 + end + + --Кнопы + 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() + + --Если в инвентаре ни хуя нет, то сасируй + if #massivWithProfile.inventory == 0 then + ecs.centerText("xy", 0, "Ваш инвентарь пуст.") + return + end + + --Показываем инвентарь + local xInventory, yInventory, currentPage, currentItem = 3, 5, 1, 1 + local countOfPages + countOfPages = showInventory(xInventory, yInventory, currentPage, currentItem) + + 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, 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] + 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 + + elseif key == "Продать игрокам" then + local maxToSell = massivWithProfile.inventory[currentItem].count + local data = ecs.universalWindow("auto", "auto", 36, 0x444444, true, {"EmptyLine"}, {"CenterText", 0xffffff, "Продать игрокам"}, {"EmptyLine"}, {"Input", 0xffffff, 0x33db80, "Цена за штуку"}, {"EmptyLine"}, {"CenterText", 0xffffff, "Количество:"}, {"Slider", 0xffffff, 0x33db80, 1, maxToSell, math.floor(maxToSell / 2), "", " шт."}, {"EmptyLine"}, {"CenterText", 0xffffff, "При каждой продаже с вас"}, {"CenterText", 0xffffff, "взымается комиссия в 4%"}, {"EmptyLine"}, {"Button", {0x33db80, 0xffffff, "Продать"}}) + local price, count = tonumber(data[1]), data[2] + if price then + sellToPlayers(currentItem, count, price, currentUser) + ecs.universalWindow("auto", "auto", 36, 0x444444, true, {"EmptyLine"}, {"CenterText", 0xffffff, "Ваш предмет выставлен на продажу!"}, {"EmptyLine"}, {"Button", {0x33db80, 0xffffff, "Ok"}}) + else + ecs.error("Ошибка! Неверно указана цена продажи!") + end + end + + countOfPages = showInventory(xInventory, yInventory, currentPage, currentItem) + + break + end + end + + -- for key in pairs(obj["TopButtons"])do + -- if ecs.clickedAtArea(e[3], e[4], obj["TopButtons"][key][1], obj["TopButtons"][key][2], obj["TopButtons"][key][3], obj["TopButtons"][key][4]) then + -- currentMode = key + -- return + -- end + -- end + elseif e[1] == "key_down" then + if e[4] >= 2 and e[4] <= 5 then + --ecs.error("afae") + currentMode = e[4] - 1 + return + end + end + end +end + +local function findBestSeller(id, data) + local bestprice = math.huge + local bestSeller + for i = 1, #market[id][data] do + if market[id][data][i].price < bestprice then + bestprice = market[id][data][i].price + bestSeller = i + end + end + return bestSeller +end + +local function buyBestItems(id, data, count) + local remainingToBuy, currentCost, bestSeller, outOfMoney = count, 0, nil, false + + local log = "" + + --Шмонаем торговую площадку на наличие шмота для шмона + for i = 1, #market[id][data] do + bestSeller = findBestSeller(id, data) + + local CYKA = math.min(market[id][data][bestSeller].count, remainingToBuy) + + currentCost = market[id][data][bestSeller].price * CYKA + + + --Если бабок хватает + if massivWithProfile.money >= currentCost then + --Уменьшаем себе бабки + massivWithProfile.money = massivWithProfile.money - currentCost + --Добавляем шмот в инвентарь себе + addItemToInventory(id, data, "Bought", CYKA) + + log = log .. "Покупаю ".. CYKA .. " штук по цене " .. market[id][data][bestSeller].price .. "за штуку. " + + --Удаляем шмот с ТП + market[id][data][bestSeller].count = market[id][data][bestSeller].count - CYKA + + --А ЕЩЕ НАДО ДОБАВЛЯТЬ БАБКИ ЧЕЛУ + + --Уменьшаем оставшийся шмот для покупки + remainingToBuy = remainingToBuy - CYKA + --А если не хватает + else + local skokaMozhnaKupit = math.floor(massivWithProfile.money / market[id][data][bestSeller].price) + --Уменьшаем себе бабки + massivWithProfile.money = massivWithProfile.money - skokaMozhnaKupit * market[id][data][bestSeller].price + --Добавляем шмот в инвентарь себе + addItemToInventory(id, data, "Bought", skokaMozhnaKupit) + + log = log .. "Покупаю ".. skokaMozhnaKupit .. " штук по цене " .. market[id][data][bestSeller].price .. " за штуку. При этом бабок не хватило! " + + + --Удаляем шмот с ТП + market[id][data][bestSeller].count = market[id][data][bestSeller].count - skokaMozhnaKupit + --Уменьшаем оставшийся шмот для покупки + remainingToBuy = remainingToBuy - skokaMozhnaKupit + + --Бабок не хватило! + outOfMoney = true + break + end + + --Если у продавца кончился шмот, то обнулить его записи на ТП + if market[id][data][bestSeller].count == 0 then table.remove(market[id][data], bestSeller) end + --Разорвать цикл, если все куплено уже + if remainingToBuy <= 0 then break end + end + + --Если все предметы этой даты были проданы, то очистить лист + if #market[id][data] == 0 then + table.remove(market[id], data) + end + + -- if #market[id] == 0 then + -- market[id] = nil + -- end + + if remainingToBuy > 0 then + if outOfMoney then + ecs.error("На покупку указанного количества денег не хватило, куплено " .. count - remainingToBuy .. " шт., при этом на счету осталось " .. massivWithProfile.money .. moneySymbol) + --ecs.error(log) + else + ecs.error("НЕВОЗМОЖНАЯ ОШИБКА! ДЕБАЖЬ ПРОГУ, СУКА! Куплено не все, так как у продавцов нет столько шмота! Куплено вон скока: " .. count - remainingToBuy) + --ecs.error(log) + end + else + ecs.error("Покупка успешно завершена без осложнений!") + end + + +end + +--Окно покупки +local function buy() + --Если ТП в данный момент пуста, и ничего на ней не продается + + --ecs.error("#market = "..#market) + + -- if #market == 0 then + -- gpu.setForeground(0xFFFFFF) + -- ecs.centerText("x", math.floor(ySize / 2), "Торговая Площадка в данный момент пуста.") + -- ecs.centerText("x", math.floor(ySize / 2) + 1, "Вы можете разместить свое объявление о продаже выше.") + -- end + + local countOfItemsOfMarketToShop = math.floor((ySize - 12) / 4) + local itemOfMarketToShow = 1 + local filteredMakretArray = {} + local currentFilter + + local function filter(makretFilter) + filteredMakretArray = {} + + local success, price, count, nickname + for id in pairs(market) do + for data in pairs(market[id]) do + + success, price, count, nickname = getInfoAboutItemOnMarket(id, data) + + if makretFilter then + if string.find(string.lower(id), string.lower(makretFilter)) then + table.insert(filteredMakretArray, {["id"] = id, ["data"] = data, ["count"] = count, ["price"] = price}) + end + else + table.insert(filteredMakretArray, {["id"] = id, ["data"] = data, ["count"] = count, ["price"] = price}) + end + + end + end + + end + + local xName, xCountOrSeller, xPrice = 6, math.floor(xSize * 3/7), math.floor(xSize * 4/6) + + local function infoPanel() + local yPos = 5 + + local width = 40 + local xPos = math.floor(xSize / 2 - width / 2) + ecs.border(xPos, yPos, width, 3, 0x262626, 0xFFFFFF) + gpu.set(xPos + 2, yPos + 1, "Поиск по предметам") + + yPos = yPos + 4 + + local background, foreground = ecs.colors.blue, 0xFFFFFF + ecs.square(4, yPos, xSize - 7, 1, background) + ecs.colorText(xName, yPos, foreground, "ИМЯ") + ecs.colorText(xCountOrSeller, yPos, foreground, "КОЛИЧЕСТВО") + ecs.colorText(xPrice, yPos, foreground, "ЦЕНА") + end + + local function showItemsList() + local xPos, yPos = 4, 11 + + obj["BuyButtons"] = {} + + ecs.square(1, yPos, xSize, countOfItemsOfMarketToShop * 4, 0x262626) + + ecs.srollBar(xSize - 1, yPos, 2, countOfItemsOfMarketToShop * 4, #filteredMakretArray, itemOfMarketToShow, 0xFFFFFF, ecs.colors.blue) + + for i = itemOfMarketToShow, (itemOfMarketToShow + countOfItemsOfMarketToShop - 1) do + if filteredMakretArray[i] then + ecs.square(xPos, yPos, xSize - 7, 3, 0xFFFFFF) + ecs.colorText(xPos + 2, yPos + 1, 0x000000, filteredMakretArray[i].id .. " " .. filteredMakretArray[i].data) + gpu.set(xCountOrSeller, yPos + 1, tostring(filteredMakretArray[i].count) .. " шт.") + gpu.set(xPrice, yPos + 1, "От " .. tostring(filteredMakretArray[i].price) .. moneySymbol .. " за шт.") + + newObj("BuyButtons", i, ecs.drawAdaptiveButton(xSize - 13, yPos, 2, 1, "Купить", 0x66b6ff, 0xFFFFFF)) + + yPos = yPos + 4 + end + end + end + + infoPanel() + filter(currentFilter) + showItemsList() + + while true do + local e = {event.pull()} + + if e[1] == "touch" then + + for key in pairs(obj["BuyButtons"]) do + if ecs.clickedAtArea(e[3], e[4], obj["BuyButtons"][key][1], obj["BuyButtons"][key][2], obj["BuyButtons"][key][3], obj["BuyButtons"][key][4]) then + ecs.drawAdaptiveButton(obj["BuyButtons"][key][1], obj["BuyButtons"][key][2], 2, 1, "Купить", 0xFF4940, 0xFFFFFF) + + -- local id, dataCYKA, count, price = filteredMakretArray[key]. + + local text = "Правила пользовательского соглашения: нажимая кнопку \"Купить\", вы получаете указанное количество предметов по оптимально подобранной цене. Система автоматически найдет наиболее выгодные лоты и перечислит ваши деньги продавцам. Затем указанное количество предметов будет немедленно передано вам в цифровой инвентарь. Автор программы не несет ответственности за утерю наличности из-за любых внешних воздействий на компьютер. Вы сами решаете, доверять подобным сервисам или нет." + + local data = ecs.universalWindow("auto", "auto", 40, 0xDDDDDD, true, {"EmptyLine"}, {"CenterText", 0x262626, "Сколько вы желаете купить?"}, {"EmptyLine"}, {"Slider", 0x262626, 0x880000, 1, math.min(100, filteredMakretArray[key].count), 1, "", " шт."}, {"EmptyLine"}, {"TextField", 6, 0xFFFFFF, 0x262626, 0xBBBBBB, ecs.colors.blue, text}, {"EmptyLine"}, {"Switch", 0x3366CC, 0xffffff, 0x262626, "С условиями выше согласен", true}, {"EmptyLine"}, {"Button", {0x33db80, 0xffffff, "Купить"}}) + + if not data[2] then + ecs.universalWindow("auto", "auto", 40, 0xDDDDDD, true, {"EmptyLine"}, {"CenterText", 0x262626, "Для покупки необходимо принять"}, {"CenterText", 0x262626, "условия пользовательского соглашения."}, {"EmptyLine"}, {"Button", {0x33db80, 0xffffff, "OK"}}) + else + buyBestItems(filteredMakretArray[key].id, filteredMakretArray[key].data, data[1]) + end + + --Рефрешим список айтемов ТП + filter(currentFilter) + itemOfMarketToShow = 1 + showItemsList() + + break + end + end + + elseif e[1] == "scroll" then + if e[5] == 1 then + if itemOfMarketToShow > 1 then itemOfMarketToShow = itemOfMarketToShow - 1; showItemsList() end + else + if itemOfMarketToShow < #filteredMakretArray then itemOfMarketToShow = itemOfMarketToShow + 1; showItemsList() end + end + elseif e[1] == "key_down" then + if e[4] >= 2 and e[4] <= 5 then + currentMode = e[4] - 1 + return + end + end + end +end + + +local function main() + --Рисуем топбар + ecs.drawTopBar(1, 1, xSize, currentMode, colors.topbar, colors.topbarText, {"Главная", "🏠"}, {"Купить", "⟱"}, {"Продать", "⟰"}, {"Лотерея", "☯"}, {"Мой профиль", moneySymbol}) + --Рисуем серый фон + ecs.square(1, 4, xSize, ySize - 3, colors.background) +end + + +------------------------------------------ Программа ----------------------------------------------------------------- + +ecs.prepareToExit() + +while true do + main() + + if currentMode == 1 then + currentMode = 2 + --about() + elseif currentMode == 2 then + buy() + elseif currentMode == 3 then + sell() + elseif currentMode == 4 then + currentMode = 2 + --fortune() + else + currentMode = 2 + --user() + end +end + +------------------------------------------ Выход ----------------------------------------------------------------- + + + + + + + +