Перейти к содержимому
num_pi

Авто поддержание заданного типа вещей, заданного количества в мэ системе.

Рекомендуемые сообщения

Описание: Нужна программа для Авто поддержание заданного типа вещей, заданного количества в мэ системе. 

 Проблема заключается в том, что существующие программы, для прекрафта вещей в мэ систему, оказывают большую нагрузку на сервер, minecraft, сильно проседает тпс, из-за этого администрация сервера, требует убрать программу, или же без моего участия сетает в 0, компьютер. 

 

Сборка майна версии 1.7.10

Какие моды есть: OC версии 1.6.2, AE2, openPeripheral, и д.р

 

Требования к ПО:  Версия мода, 1.6.2. Наименьшая нагрузка на сервер minecraft, которая только возможна. Стабильная и быстрая работа программы, когда вещей в базе будет 500 и более. Отсутствие GUI у приложения, нужен только лог, лог должен записываться локально, в файл, и разбиваться на вложенные папки, такого вида: год -> месяц -> текущий день.log(01.log).  В логе  должна содержатся данная информация: какой предмет крафтился, какое его количество, и завершилась ли операция успешно или провалилась. Добавление и удаление вещей из очереди пре-крафта, будет осуществляться мною из собственной веб админ панели, соответственно как вариант хранения списка вещей для пре-крафта, я предлагаю таблицу, локально сохраненную в файл на диске или можете выбрать свой собственный способ и метод для хранения данных, главное условие, нужен будет api для удаления, изменения, и добавления вещей в список вещей пре-крафта, что бы у меня была возможность дописать свой собственный модуль для взаимодействия клиента в minecraft, с админ панелью, используя ваш код.

 

Писать без использования мета таблиц!

 

Писать можете как и с использованием  openos так и без нее, на голых компонентах, со своим собственным загрузчиком для eeprom, естественно второе для меня предпочтительней. 

 

Изменено пользователем num_pi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня несколько замечаний по этому заказу.

 

26 минут назад, num_pi сказал:

Требования к ПО:  ... Наименьшая нагрузка на сервер minecraft, которая только возможна.

Звучит как "идеальная программа". Думаю, экстремальные оптимизации лучше выполнять коллективно. Один программист может либо не знать о нюансах быстродействия в той или иной ситуации, или забыть в момент написания. А тут кроме OC накладываются ещё и нюансы AE.

 

А можно взглянуть на код программы, которую забраковали админы? Может быть, её уже и не написать лучше. Так тоже бывает: ну, будет программа процентов на 10 менее прожорливой, админы её всё равно не разрешат использовать.

 

40 минут назад, num_pi сказал:

Стабильная и быстрая работа программы, когда вещей в базе будет 500 и более.

В этом месте сразу приходит идея: не надо каждый раз перепроверять все 500 вещей в базе, а все крафты выполнять централизованно на основе OC. Тогда OC будет знать о всех крафтах и актуальных остатках предметов. А если игрок вручную работает с МЭ-системой, то пусть по окончании операции нажимает плиту, например. Тогда не потребуется выполнять ежесекундно по 20 запросов и выполнять по 100500 сравнений. Это основа всех оптимизаций: выполнять вычисления только тогда, когда это необходимо.

 

54 минуты назад, num_pi сказал:

Писать без использования мета таблиц!

А что не так с метатаблицами кроме неявного вызова функций?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, num_pi сказал:

Стабильная и быстрая работа программы, когда вещей в базе будет 500 и более.

А админы точно на комп с программой ругаются, а не на АЕ с 500 предметами на прекрафте? Если нет, то можно же вместо одного, поставить 4 компа, напихать в код слипов побольше, соответственно приоритета под каждый комп.

Изменено пользователем Disc2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, eu_tomat сказал:

 

3 часа назад, num_pi сказал:

Писать без использования мета таблиц!

А что не так с метатаблицами кроме неявного вызова функций?

Тоже очень интересно. Может, я всю жизнь неправильно на ЛУА программирую?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Писать без использования мета таблиц! Просто я их не понимаю, а разбираться нет времени :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
14 часа назад, eu_tomat сказал:

У меня несколько замечаний по этому заказу.

 

Звучит как "идеальная программа". Думаю, экстремальные оптимизации лучше выполнять коллективно. Один программист может либо не знать о нюансах быстродействия в той или иной ситуации, или забыть в момент написания. А тут кроме OC накладываются ещё и нюансы AE.

 

А можно взглянуть на код программы, которую забраковали админы? Может быть, её уже и не написать лучше. Так тоже бывает: ну, будет программа процентов на 10 менее прожорливой, админы её всё равно не разрешат использовать.

 

В этом месте сразу приходит идея: не надо каждый раз перепроверять все 500 вещей в базе, а все крафты выполнять централизованно на основе OC. Тогда OC будет знать о всех крафтах и актуальных остатках предметов. А если игрок вручную работает с МЭ-системой, то пусть по окончании операции нажимает плиту, например. Тогда не потребуется выполнять ежесекундно по 20 запросов и выполнять по 100500 сравнений. Это основа всех оптимизаций: выполнять вычисления только тогда, когда это необходимо.

 

А что не так с метатаблицами кроме неявного вызова функций?

 

 

Хорошо, вот держи то что я использовал. https://oc.cil.li/topic/1714-ae2-stock-auto-crafting-v13-w-installer/,  https://github.com/KaseiFR/ae2-manager

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@num_pi Во второй проге Gui и проверка предметов тупо в одном цикле.. Оно вообще работает когда там несколько десятков предметов? Кнопки нажимаются?

Изменено пользователем Disc2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 17.12.2021 в 19:01, Disc2 сказал:

@num_pi Во второй проге Gui и проверка предметов тупо в одном цикле.. Оно вообще работает когда там несколько десятков предметов? Кнопки нажимаются?

Очень плохо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну что я могу сказать, реализовал задуманный функционал самостоятельно. Тему можно закрывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
local computer = require("computer")
local component = require("component")
local unicode = require("unicode")

function proxy(cT)
    local address = component.list(cT)()
    if address then
        return component.proxy(address)
    end
end

internet = proxy("internet")
chat_box = proxy("chat_box")
me_interface = proxy("me_interface")

computer.addUser("addyourself_here")

pcall(function ()
    chat_box.setName("PC")
end)


function getITL()
    local handle, data, chunk = internet.request("ссылка на pastebin raw со списком крафта"), "" -- Строки-таблица вида "return {{}, {}, {}, и так далее}"

    while true do
        chunk = handle.read(math.huge)

        if chunk then
            data = data .. chunk
        else
            break
        end
    end
    return data
end

function sleep(timeout)
    local deadline = computer.uptime() + (timeout or math.huge)
    repeat
        computer.pullSignal(deadline - computer.uptime())
    until computer.uptime() >= deadline
end

function execute(data, stdin, sandbox)
    local chunk, err = load(data, stdin, "t", sandbox and
                                setmetatable({},
                                             {__index = _G, __metatable = ""}))
    if not chunk and err then
    else
        local data = table.pack(xpcall(chunk, debug.traceback))
        if data[1] then
            if data.n > 1 then return table.unpack(data, 2, data.n) end
        else
      end
    end

end

items = {}
items = execute(getITL(), "items", true)
pcall(function () chat_box.say("Cписок вещей для крафта загружен", 32) end)
sleep(1)
if items ~= nil then
    while true do
        local err, meTbl = pcall(me_interface.getAvailableItems,"none")
        for curINDEX = 1, #items do

            itemName = items[curINDEX]["itemName"]
            itemLabel = items[curINDEX]["itemLabel"]
            itemDamage = items[curINDEX]["itemDamage"]
            autoStockQty = items[curINDEX]["autoStockQty"]
            itemmaxSize = items[curINDEX]["itemmaxSize"]
            nbt_hash = items[curINDEX]["nbt_hash"]

            storedItemQty = 0
            craftAmount = 0
            
                    for i = 1, #meTbl do
                        if type(nbt_hash) == "string" then
                            if meTbl[i]["fingerprint"].id == itemName and meTbl[i]["fingerprint"].dmg == itemDamage and meTbl[i]["fingerprint"].nbt_hash == nbt_hash and meTbl[i].size ~= nil then
                                    storedItemQty = meTbl[i].size
                                    goto CRAFT
                            end
                        elseif type(nbt_hash) ~= "string" then 
                            if meTbl[i]["fingerprint"].id == itemName and meTbl[i]["fingerprint"].dmg == itemDamage and meTbl[i]["fingerprint"].nbt_hash == nil and meTbl[i].size ~= nil then
                                storedItemQty = meTbl[i].size
                                goto CRAFT
                            end
                        end
                    end

            ::CRAFT::

            if storedItemQty < (autoStockQty == 0 and itemmaxSize or autoStockQty) then

                craftAmount = ((autoStockQty == 0 and itemmaxSize or autoStockQty) - storedItemQty)
                if craftAmount <= 0 then
                    craftAmount = 0
                    break
                end
                -- pcall(function () chat_box.say(tostring(itemLabel .." в мэ хранится: "..storedItemQty.." заказываю количеством "..craftAmount), 2) end)
                local err, res = pcall(function () 
                    if type(nbt_hash) == "string" then me_interface.requestCrafting({id=itemName, dmg = itemDamage, nbt_hash = nbt_hash}, 0) 
                    else me_interface.requestCrafting({id=itemName, dmg = itemDamage}, craftAmount) end end)
                    sleep(8)
                if err == false then
                    chat_box.say(tostring(" Recipe404: " ..itemLabel), 5)
                    sleep(0.1)
                end
            end
            
        end
        sleep(300)
        pcall(function () chat_box.say(tostring(" M-F: " ..tostring(math.floor(computer.freeMemory() / 1024))), 32) end)

    end
else
    pcall(function () chat_box.say("TBL EMPTY", 20)end)
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сама прога сыроватая, множно полностью переделать, но мне лень

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хороший подход. Сам заказал и сам же выполнил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не заметил проверки статуса крафта предмета в АЕ: завершён/нет. Для сложных многоуровневых крафтовдлящихся до нескольки минут она актуальна.

В целом - работает и ладно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 08.06.2022 в 14:13, Taoshi сказал:

Не заметил проверки статуса крафта предмета в АЕ: завершён/нет. Для сложных многоуровневых крафтовдлящихся до нескольки минут она актуальна.

В целом - работает и ладно.

Эта программа написана под мод openPeripheral, соответственно и функции для заказа крафта взяты  от туда, причина проста, это - nbt_nash. И узнать об статусе крафта, не представляется возможным, я бы сам хотел бы знать статус крафта, но увы и ах..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спустя сотни лет, теперь могу добавить подсказку всем не равнодушным. Для nbt_hash ипользовать одну функцию заказа из мода OpenPeripheral, а вот для предметов без nbt_hash использовать обычную функцию из интеграции OC. Вот пример кода про что я имею ввиду...

  function obj:requstItemToCraft(itemElement)
    local error, status = pcall(function()
      if type(itemElement["nbt_hash"]) == "string" then
        print("Заказываю: " ..
        itemElement["itemLabel"] .. " общим количеством - " .. tostring(itemElement["craftAmount"]) .. "\n")
        self.me_interface.requestCrafting(
        { id = itemElement["itemName"], dmg = itemElement["itemDamage"], nbt_hash = itemElement["nbt_hash"] },
          itemElement["craftAmount"])
        print("------------- Предмет: " .. itemElement["itemLabel"] .. " имеет nbt_hash, статус крафта НЕ ОТСЛЕЖИВАЕТСЯ! ----------------\n")

        return true
      else
        if self.craftQueue[itemElement["img_md5"]] == nil then
          print("Заказываю: " ..
          itemElement["itemLabel"] .. " общим количеством - " .. tostring(itemElement["craftAmount"]) .. "\n")
          local info = self.me_interface.getCraftables({ name = itemElement["itemName"], damage = itemElement["itemDamage"] })
          if #info > 0 then
            return info[1].request(itemElement["craftAmount"])
          else
            print("------------- При попытке получить рецепт крафта, шаблон куда-то исчез ----------------\n")
            return false
          end
        else
          print("------------- Предмет: " .. itemElement["itemLabel"] .. ", уже стоит на крафте, пропускаю задание на крафт ----------------\n")
        end
      end
    end)
    if not error then
      print(tostring(status))
      return false
    end
    return status
  end

 

Изменено пользователем num_pi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...