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

Clor

Пользователи
  • Публикации

    45
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные пользователем Clor


  1. Вот такой класс получился нормально?
    https://github.com/Clor0xD/OpenComputers2IDE.git посмотреть lua ооп потуги можно тут)
    https://github.com/Tencent/LuaHelper отличный плагин на vscode классы (включая множественное наследование), типы, подсказки, аннотации 

    ---@class IRunable
    local IRunable
    
    IRunable = {class = "Interface IRunable"}
    
    function IRunable:run(...) 
        self:noImplIntefaceError("run(...)", IRunable:getClassName())
    end
    
    return IRunable
    ---
    --- Generated by EmmyLua(https://github.com/EmmyLua)
    --- Created by User.
    --- DateTime: 20.04.2022 20:14
    ---
    local Class = require('libEx/Class')
    local sides = require("sides")
    
    ---@class Position:Class
    ---@field public x number
    ---@field public y number
    ---@field public z number
    ---@field public r PositionSide
    local Position = Class:extended({
        class = "Class Position"
    })
    
    ---@class PositionSide
    Position.side = {
        north = 0,
        east = 1,
        south = 2,
        west = 3,
        negZ = 0,
        posX = 1,
        posZ = 2,
        negX = 3
    }
    
    ---@class PositionSidesBySide
    Position.sidesBySide = {
        [Position.side.negZ] = sides.negz,
        [Position.side.posX] = sides.posx,
        [Position.side.posZ] = sides.posz,
        [Position.side.negX] = sides.negx
    }
    
    ---@class PositionSideBySides
    Position.sideBySides = {
        [sides.negy] = Position.side.negZ,
        [sides.posy] = Position.side.negZ,
        [sides.negz] = Position.side.negZ,
        [sides.posx] = Position.side.posX,
        [sides.posz] = Position.side.posZ,
        [sides.negx] = Position.side.negX
    }
    
    ---@class PositionTurn
    Position.turn = {
        left = -1,
        forward = 0,
        right = 1,
        around = 2,
        back = 2
        -- left = 3
    }
    
    ---@param x number
    ---@param y number
    ---@param z number
    ---@param r PositionSide
    ---@return Position
    function Position:new(x, y, z, r)
        local instance = self.super:new()
        if not x then
            return self:extendedInstance(instance):set(0, 0, 0, 0)
        end
        return self:extendedInstance(instance):set(x, y, z, r)
    end
    
    ---@param adjacentPosition Position
    ---@return boolean,Sides @staus globalRotation:Sides_openOs
    function Position:getAdjacentSide(adjacentPosition)
        local this, adjacent, acc, check, result = self:get("yzx", true), adjacentPosition:get("yzx", true), 0, 0, 0
        for i = 1, 3 do
            check = adjacent[i] - this[i]
            if check == 1 then
                result = i * 2 - 1
            elseif check == -1 then
                result = i * 2 - 2
            end
            acc = acc + check
        end
        return acc == 1 or acc == -1, result
    end
    
    ---@ changes self
    ---@param positionORx Position
    ---@param y number
    ---@param z number
    ---@return Position @self
    function Position:add(positionORx, y, z)
        if positionORx.class then
            self.x = self.x + positionORx.x
            self.y = self.y + positionORx.y
            self.z = self.z + positionORx.z
            return self
        end
        self.x = self.x + positionORx
        self.y = self.y + y
        self.z = self.z + z
        return self
    end
    
    ---@ changes self
    ---@param position Position
    ---@return Position @self
    function Position:sub(position)
        self.x = self.x - position.x
        self.y = self.y - position.y
        self.z = self.z - position.z
        return self
    end
    
    ---@ does not change sefl, args
    ---@param position Position
    ---@return number, number, number @x,y,zlua
    function Position:subCortage(position)
        return self.x - position.x, self.y - position.y, self.z - position.z
    end
    
    function Position:coordsEquels(position)
        return self.x == position.x and self.y == position.y and self.z == position.z
    end
    
    function Position:equels(position)
        return self == position or
                   (self.x == position.x and self.y == position.y and self.z == position.z and self.r == position.r)
    end
    
    function Position:get(format, isPack)
        if format == nil then
            if isPack then
                return {self.x, self.y, self.z, self.r}
            end
            return self.x, self.y, self.z, self.r
        end
        if self:assertFormat(format) then
            local result = {}
            for key in format:gmatch '[xyzr]' do
                table.insert(result, self[key])
            end
            if isPack then
                return result
            end
            return table.unpack(result)
        end
    end
    
    function Position:setf(format, ...)
        self:assertFormat(format)
        local args = table.pack(...)
        assert(#format <= #args, self:tostring() .. ":setf(format, ...) argument (...) very short")
        for i = 1, #format do
            self[format:sub(i, i)] = args[i]
        end
    
        return self
    end
    
    function Position:set(x, y, z, r)
        -- self.x, self.y, self.z, self.r = x, y, z, r
        -- return self
        return self:setf("xyzr", x, y, z, r) -- assert params
    end
    
    function Position:clone() -- local returnPos; returnPos = currentPos:clone()
        return self:new(self:get())
    end
    
    function Position:copy(position) -- returnPos:copy(currentPos) 
        return self:set(position:get())
    end
    
    function Position:getCoordinatesUp()
        local x, y, z, r = self:get()
        return x, y + 1, z, r
    end
    
    function Position:getCoordinatesDown()
        local x, y, z, r = self:get()
        return x, y - 1, z, r
    end
    
    function Position:getCoordinatesLocalRotation(turn)
        self:getCoordinatesGlobalRotation((turn + self.r) % 4)
    end
    
    function Position:getCoordinatesGlobalRotation(side)
        local x, y, z, r = self:get()
        if side == self.side.negZ then
            z = z - 1
        elseif side == self.side.posZ then
            z = z + 1
        elseif side == self.side.negX then
            x = x - 1
        elseif side == self.side.posX then
            x = x + 1
        end
        return x, y, z, r
    end
    
    function Position:turnRight()
        self.r = (self.r + 1) % 4
        return self
    end
    
    function Position:turnLeft()
        self.r = (self.r - 1) % 4
        return self
    end
    
    function Position:turnAround()
        self.r = (self.r + 2) % 4
        return self
    end
    
    function Position:stepUp()
        self.y = self.y + 1
        return self
    end
    
    function Position:stepDown()
        self.y = self.y - 1
        return self
    end
    
    function Position:stepForward()
        return self:stepBase(1)
    end
    
    function Position:stepBack()
        return self:stepBase(-1)
    end
    
    function Position:calculateTurn(globalRotation)
        return ((globalRotation - self.r) + 4) % 4
    end
    
    ---@private
    function Position:assertFormat(format, message)
        if not format or type(format) ~= 'string' then
            format = type(format)
            -- if not massage then
            message = ' incorrect argument format type : ' .. format .. ' [xyzr] string only'
            -- end
            error(self:tostring() .. message)
        end
        if #format == 0 then
            -- if not massage then
            message = 'incorrect argument format : empty_string'
            -- end
            error(self:tostring() .. message)
        end
        if not massage then
            message = ' incorrect argument format : ' .. format .. ' [xyzr] only'
        end
        return assert(not format:match '[^xyzr]', self:tostring() .. message)
    end
    
    ---@private
    function Position:stepBase(dir)
        if self.r == self.side.negZ then
            self.z = self.z - dir
        elseif self.r == self.side.posZ then
            self.z = self.z + dir
        elseif self.r == self.side.negX then
            self.x = self.x - dir
        elseif self.r == self.side.posX then
            self.x = self.x + dir
        end
        return self
    end
    
    function Position:toStringDebug()
        return "x: " .. tostring(self.x) .. " y:" .. tostring(self.y) .. " z:" .. tostring(self.z) .. " r:" ..
                   tostring(self.r)
    end
    
    function Position:print()
        print(self:toStringDebug())
        return self
    end
    
    return Position
    --
    -- Created by Clor#D on 17.05.2020.
    -- ©SofaSolt, 2020
    --
    
    ---@class Class
    ---@field public class string
    ---@field public super Class
    ---@field public isInstance boolean
    ---@field public clazz Class @ is not instanse class
    local Class
    
    if Class then
        return Class
    end
    
    Class = {}
    Class.class = "Class Class"
    Class.isInstance = false
    Class.super = Class
    Class.clazz = Class
    
    function Class:tostring()
        return tostring(self) .. " " .. self.class
    end
    
    function Class:extended (child) -- child = {}
        -- наследование статичестой части таблица Class, child.super доступ к статической таблице родителя
        child.super = self    
        setmetatable(child, { __index = self, isInstance = false})
        child.clazz = child
        return child
    end
    
    ---@class Interface
    ---@field public class string
    
    ---@param ... Interface
    function Class:implements(...)
         ---@type Interface[]   
        local interfaceList = table.pack(...)
        for _,interface in ipairs(interfaceList) do       
            interface.super = self.super        
            setmetatable(interface, { __index = self.super, isInstance = false})
    
            self.super = interface
            setmetatable(self, { __index = interface, isInstance = false})
        end
        return self
    end
    
    function Class:extendedInstance(instance)
        -- наследование экземпляра таблица instance
        setmetatable(instance, self)
        self.__index = self    
        return instance
    end
    
    function Class:new()
        local instance = {isInstance = true}
        return self.clazz:extendedInstance(instance)
    end
    
    function Class:noImplError(funcName)
        if not funcName then
            funcName = 'unknownFunc'
        end
        error(self:tostring() .. ':' .. funcName .. ' no implementation')
    end
    
    function Class:noImplIntefaceError(funcName, interfaceName)
        if not funcName then
            funcName = 'unknownIntefaceFunc'
        end
        error(self:tostring() .. ':' .. funcName .. ' no implementation '..interfaceName..":"..funcName)
    end
    
    function Class:assert(param, message)
        if not message then
            message = 'assert unknown param'
        end
        return assert(param, self:tostring() .. message)
    end
    
    function Class:assertNumberSetDefault(number, default, message)-- number = '100'
        if not message then
            message = 'assert unknown param'
        end
        if number == nil then
            if tonumber(default) then
                number = default
            else
                error(self:tostring() .. message .. " is nil")
            end
        end
        return assert(tonumber(number), self:tostring() .. message .. " not number")
    end
    
    function Class:assertNumber(number, message)
        return self:assertNumberSetDefault(number, nil, message)
    end
    
    function Class:assertEnum(param, enum, message)
       for _,element in pairs(enum) do
            if param == element then
                return param
            end
       end
       self:error(message.." param: "..tostring(param).." not listed")
    end
    
    function Class:error(message)
        error(self:tostring()..message)
    end
    
    function Class.nop()
        
    end
    
    function Class:getClassName()
        local _, name = string.gmatch(self.class, "([%a%d].+)%s(.+)")()
        return name
    end
    
    function Class:getClassLevel()
        local type = string.gmatch(self.class, "([%a%d].+)%s(.+)")()
        return type
    end
    
    function Class:assertInstance(message)
        if self.isInstance then
            return true
        end
        self:error(message)
    end
    
    function Class:assertSuperParentClass(param, sampleClass, message)
        ---@type Class
        local temp = param
        while temp.class ~= Class.class do
            if temp.class == sampleClass then
                return param
            end
            temp = temp.super
        end
        self:error(message.." "..param.class.." not extended "..sampleClass)
    end
    
    
    ---@param fieldName string
    ---@param fileldValue any
    function Class:createFieldIfMissing(fieldName, fileldValue)
        if self[fieldName] == nil then
            self[fieldName] = fileldValue
        end
    end
    
    return Class
    
    --[[ Using
    Class = require("/oop/Class")
    
    local Implementation
    
    if Implementation then
        return Implementation
    end
    
    Implementation = Class:extended({})-- "наследования" класса, по сути соеденение статических таблиц в иерархию наследования
    Implementation.class = "Implementation"
    function Implementation:toString()
        return self.class
    end
    
    function Implementation:new(stringParent, stringChildren)
        local instance = self.super:new(stringParent) -- конструктор предка
        self.stringC = stringChildren
        return self:extendedInstance(instance) -- "наследования" экземпляра, по сути соеденение таблиц экземляра в иерархию наследования
    end
    
    return Implementation
    ]]

     


  2. Описание в разработке...

     

    Хочу узнать, есть ли потребность вот в таких программах?

    (есть еще контроллер рудо переработки gt5u, me телепор хотя его уже делали тут вроде.) 

    Данная программа позволяет работать с Assemly Line GT5U из ME как с обычным механизмом, и автоматизирует множество "мучительных" рецептов.

     

    2019-05-26-09-52-05.png
    2019-05-26-09-52-11.png
    2019-05-26-09-52-16.png

    2365.png

     

    https://pastebin.com/PAYBy5Lm

     

     

     

    • Нравится 1

  3. Хорошо, оформлю. В целом там адаптер к ме интерфейсу цепонуть и все. Смысл именно такой, как ты понял. Я думал слово прекрафт говорит за себя. К сожалению user frendly конструктор конфигов я не написал, так что нужен "advanced user"))) потихоньку буду улучшать. Потому шапка темы такая, на программиста.


  4. А причем тут openOS и API компонентов? или ты о

        
    OpenComputers-MC1.7.10-1.7.4.1265-universal.jar

    Дак его хаяли я ставить не стал.

    По поводу ничего особенного, ну это сборка а не куча модов, как было года CC стартовал. Я имею ввиду что там рецепты переделаны GT5U модифицирован итд итп. Я помню ту кучу что собирал для 1,5,2 и 1.6.4 CC. А еще вспомнил как мы не договорились о дизайне сайта и недели две была какая то дичь а не оформление. Весело было)

     

    Стоит ли пробовать OC + fix?


  5. 1.7.10 OpenOS 1.7.2 CPU Lua 5.2 

    OpenComputers-MC1.7.10-1.7.2.1166

    Computronics-1.7.10-1.6.6

    Сейчас я делаю к сборке Copmuter addon так сказать, рецепты там переписываю конфиги настраиваю. По умолчанию OC отключен в сборке, и заброшен пару лет как, но думаю это не на долго.

    https://vk.com/ideal_industrial детали сборки можешь сам посмотреть.


  6. Позволяет обойти разные узкие места в системе автокрафта. Система отслеживает кол-во разных предметов в МЕ и в соответствии с настройками докрафчивает до нужного количества. Ну напримем есть какая то штука которая долго делается но нужна нечасто, разумно заготовить энное количество пока база простаивает.

     

    Я играю в сборку ИИС. И она предлагает много интересных инженерных задач. Это одно из решений. Доведу до ума еще пару вещей и выложу.


  7. Программа находится в разработке. Постараюсь упростить процесс настройки программы.

     

    Данная программа сканирует содержимое вашей МЕ системы  и поддерживает заданное количество указанных в списке предметов. Иными словами предварительно крафтит (preCraft). Это полезно на развитых индустриальных базах, где практически всегда есть медленные рецепты с высокой импульсной нагрузкой, так что если заранее их выполнить можно повысить быстродействие вашего автокрафта.

     

    Основой системы является то, что me_interface предоставляет нам информацию о содержимом МЕ и о списке крафтов, а так же предоставляет объекты управления заказанными из OC крафтами. К сожалению получить информацию от текущих крафтах заказанных не из ОС не возможно. Так же API содержит ряд багов по работе со списком предметов в МЕ, а именно некорректно написан фильтр (подробнее можете сами посмотреть на git AE если конечно понимаете scala).

     

    В связи с вышеперечисленным требуется много ОЗУ >2mb. Из периферийных устройств нужен adapter подключенный к ме интерфейсу и database https://ocdoc.cil.li/item:database_upgrade для формирования списка прекрафтов. Я постарался минимизировать блокирующие вызовы, однако сканирование списка крафтов при начальной инициализации системы занимает много времени.

     

    Установка pasebin get 5hnW78DU preCraft.lua

     

    Настройка

    Первоначально вам необходимо отредактировать код  программы. (позже сделаю утилиту конструктор)

    edit preCraft.lua

    советую провести манипуляции в текстовом редакторе а потом вставить изменения в ОС

    На 32 строчке программы находится 

    local preCrafts = {
        { size = 1000, label = nil, alias = "SoC", craft = nil, progress = nil },
        { size = 1000, label = nil, alias = "ASoC", craft = nil, progress = nil }
    }

    33 и 34 строчки это и есть прекрафты, вам необходимо заполнить поля

    size = сколько штук поддерживать

    поле alias необходимо т.к некоторые моды что используют свою систему предметов например GregTech, Immersive Engineering выдают не человеко читаемые имена блоков. Если вас это устраивает 

    alias = nil

    если нет пропишите имя руками

    alias = "название вашего предмета" 

    теоретически длинна списка не ограничена, однако database t3 содержит 81 предмет и в данный момент дописывание в конец списка не реализовано.

    для увеличения списка просто вставьте между  33 и 34 строчками еще строчек и отредактируйте их

    { size = 1000, label = nil, alias = "SoC", craft = nil, progress = nil },

    обратите внимание что в конце списка строка не содержит запятой

    { size = 1000, label = nil, alias = "ASoC", craft = nil, progress = nil }

    параллельно с составлением списка добавляйте предметы в database первый слот database соответствует первой строке списка и так далее

    local preCrafts = {
        первая строка списка{ size = 1000, label = nil, alias = "SoC", craft = nil, progress = nil },
        вторая строка списка{ size = 1000, label = nil, alias = "ASoC", craft = nil, progress = nil }
    }

    После окончания заполнения списка и database положите database в адаптер и запустите программу с параметрами --int2ext  --pclName=preCraftList.lua

    preCraft.lua --int2ext  --pclName=preCraftList.lua

    программа создаст файл preCraftList.lua после чего database больше не требуется

     

    Запуск программы 

    preCraft.lua --extList --pclName=preCraftList.lua --thrLim=4

    параметр  --thrLim=4 определяет сколько крафтовых процессоров использует программа одновременно, по умолчанию 2 (если этот параметр не указывать)

     

    автозапуск программы можно организовать добавив вашу строку запуска 

    preCraft.lua --extList --pclName=preCraftList.lua --thrLim=4

    в .shrc

     

    https://pastebin.com/5hnW78DU

    2019-05-25-11-11-46.png

     

    p.s написано под разрешение 160*50. работать будет на любом но консоль отобразится некорректно

    • Нравится 7

  8. IDEA  + EmmyLua + Файлы заглушки для компонентов итд.

    https://www.dropbox.com/s/82yd0cebqabpiqi/src.rar?dl=0

    Есть парсер доков в заглушки, но с косяками писал не я, сравните доки которые он умеет и те что дает вам components -l [component] > [filename]

    при необходимости уберите ; поставьте --

    Пишу как если б это было java со всеми плюшками.

    Скрытый текст

    weeweZm.png

     

    • Нравится 1

  9. Для работы необходимо поставить адаптер к батт буфферу, и подключить redstone_io он будет давать сигнал на включение турбин или что там у вас.

    В шапке программы есть настройки цветов и выбор стороны redstone_io. 

    Есть возможность избавится от API computronics и повысить быстродействие сократив количество блокирующих вызовов, сделаю чуть позже.

    Установка 

    pastebin get mRRyyAmQ powerControl.lua

    https://pastebin.com/mRRyyAmQ

    pastebin get M4QEejED powerControl.lua

    https://pastebin.com/M4QEejED новое api .getSensorInformation() + конфиги

     

     

    f61ac1f04418976fee56b8786d56596d.png
     


  10. эх жаль термалку:(, Алекс ты ее убираешь из за простоты ли из за нагрузки? если первое, то можно сделать так

    1 крафт всех машин со сталью

    2 крафт пульвилизатора и смелтера с алмазми

    3 смелтер не делает сталь

    если второе то с жертвами всегда так...

    энерготрубы там хороши(((.

     

    А вообще о сложности модов...

    3 алмаза 7 камня 1 редстоун 2 палки 1 сундук 1 стеклянная панель и программа добычи ресов + стек древесного угля... и МНОГО ресурсов будет ОТВЕЧАЮ)

    так что СС всю хардкорность lim=>0

     

    Надеюсь будет интересно)


  11. Алекс давай донат поставим, оставим 15 модов чтоб на 1 ядерных пк с 2гб шло и будем как все... будет онлайн 100+ но будут дети лет по 10. И будут они у тебя потому что, на их "фикальных" пк больше не идет ничего. Хочешь аудиторию 16+60% и от 18 30% да еще с мозгами не делай глупости.!!!!

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