mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2026-04-04 23:22:47 +02:00
Create Shop2.lua
This commit is contained in:
931
Beta/Shop2.lua
Normal file
931
Beta/Shop2.lua
Normal file
@@ -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
|
||||
|
||||
------------------------------------------ Выход -----------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user