Информация MoonLoader - разработка

LUCHARE

Известный
Друг
545
699
Кроме основного плагина хочу ещё порекомендовать несколько других, которые использую сам (они не обязательны):
minimap - добавляет интерактивное превью кода
highlight-selected - подсветка всех копий выделенного слова или предложения
atom-beautify и aligner - предназначены для приведения кода к красивому виду
Ещё есть очень полезный плагин - color-picker
bandicam 2017-12-23 15-51-26-811.jpg
 
  • Нравится
Реакции: romacaddy, kmsfax и FYP

AnWu

Известный
Всефорумный модератор
4,777
5,400
добавил информацию по новым функциям версий .024 и .025 на вики и сделал примитивный пример рендера с помощью directx целиком на луа.
заметьте, что с помощью SAMPFUNCS в клео и луа нельзя рисовать пост-эффекты и символы из символьных шрифтов, и вообще всё ограничивается примитивными элементами.
в мунлоадере теперь можно рисовать что угодно поверх изображения игры, используя все возможности DirectX 9:
Посмотреть вложение 9894

не пугайтесь, что кода много, большую часть занимают декларации FFI.
Lua:
local key = require 'vkeys'
local ffi = require 'ffi'
ffi.cdef [[
typedef struct stRECT
{
    int left, top, right, bottom;
} RECT;

typedef struct stID3DXFont
{
    struct ID3DXFont_vtbl* vtbl;
} ID3DXFont;

struct ID3DXFont_vtbl
{
        void* QueryInterface; // STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
    void* AddRef; // STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    uint32_t (__stdcall * Release)(ID3DXFont* font); // STDMETHOD_(ULONG, Release)(THIS) PURE;

    // ID3DXFont
    void* GetDevice; // STDMETHOD(GetDevice)(THIS_ LPDIRECT3DDEVICE9 *ppDevice) PURE;
    void* GetDescA; // STDMETHOD(GetDescA)(THIS_ D3DXFONT_DESCA *pDesc) PURE;
    void* GetDescW; // STDMETHOD(GetDescW)(THIS_ D3DXFONT_DESCW *pDesc) PURE;
    void* GetTextMetricsA; // STDMETHOD_(BOOL, GetTextMetricsA)(THIS_ TEXTMETRICA *pTextMetrics) PURE;
    void* GetTextMetricsW; // STDMETHOD_(BOOL, GetTextMetricsW)(THIS_ TEXTMETRICW *pTextMetrics) PURE;

    void* GetDC; // STDMETHOD_(HDC, GetDC)(THIS) PURE;
    void* GetGlyphData; // STDMETHOD(GetGlyphData)(THIS_ UINT Glyph, LPDIRECT3DTEXTURE9 *ppTexture, RECT *pBlackBox, POINT *pCellInc) PURE;

    void* PreloadCharacters; // STDMETHOD(PreloadCharacters)(THIS_ UINT First, UINT Last) PURE;
    void* PreloadGlyphs; // STDMETHOD(PreloadGlyphs)(THIS_ UINT First, UINT Last) PURE;
    void* PreloadTextA; // STDMETHOD(PreloadTextA)(THIS_ LPCSTR pString, INT Count) PURE;
    void* PreloadTextW; // STDMETHOD(PreloadTextW)(THIS_ LPCWSTR pString, INT Count) PURE;

    int (__stdcall * DrawTextA)(ID3DXFont* font, void* pSprite, const char* pString, int Count, RECT* pRect, uint32_t Format, uint32_t Color); // STDMETHOD_(INT, DrawTextA)(THIS_ LPD3DXSPRITE pSprite, LPCSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE;
    void* DrawTextW; // STDMETHOD_(INT, DrawTextW)(THIS_ LPD3DXSPRITE pSprite, LPCWSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color) PURE;

    void (__stdcall * OnLostDevice)(ID3DXFont* font); // STDMETHOD(OnLostDevice)(THIS) PURE;
    void (__stdcall * OnResetDevice)(ID3DXFont* font); // STDMETHOD(OnResetDevice)(THIS) PURE;
};

uint32_t D3DXCreateFontA(void* pDevice, int Height, uint32_t Width, uint32_t Weight, uint32_t MipLevels, bool Italic, uint32_t CharSet, uint32_t OutputPrecision, uint32_t Quality, uint32_t PitchAndFamily, const char* pFaceName, ID3DXFont** ppFont);
]]

local d3dx9_43 = ffi.load('d3dx9_43.dll')

function d3dxfont_create(name, height, charset)
    charset = charset or 1
    local d3ddev = ffi.cast('void*', getD3DDevicePtr())
    local pfont = ffi.new('ID3DXFont*[1]', {nil})
    if tonumber(d3dx9_43.D3DXCreateFontA(d3ddev, height, 0, 600, 1, false, charset, 0, 4, 0, name, pfont)) < 0 then
        return nil
    end
    return pfont[0]
end

function d3dxfont_draw(font, text, rect, color, format)
    local prect = ffi.new('RECT[1]', {{rect[1], rect[2], rect[3], rect[4]}})
    return font.vtbl.DrawTextA(font, nil, text, -1, prect, format, color)
end

function onD3DDeviceLost()
    if fonts_loaded then
        font_arial.vtbl.OnLostDevice(font_arial)
        font_wingdings.vtbl.OnLostDevice(font_wingdings)
    end
end

function onD3DDeviceReset()
    if fonts_loaded then
        font_arial.vtbl.OnResetDevice(font_arial)
        font_wingdings.vtbl.OnResetDevice(font_wingdings)
    end
end

function onD3DPresent() -- в этом событии и осуществляются все операции рисования с помощью DirectX
    if draw then
        callFunction(0x007037C0, 2, 2, 0x40, 1) -- рисуем пост-эффект "зернистость", он используется при активации очков ночного и теплового видения
        callFunction(0x007030A0, 1, 1, representFloatAsInt(20.0)) -- рисуем эффект размытия изображения, такой используется при быстрой езде в машине
        if fonts_loaded then
            d3dxfont_draw(font_arial, 'Arial test string', {10, 10, 600, 200}, 0xFF88DD44, 0) -- выводим обычный текст в левом верхнем углу
            local sw, sh = getScreenResolution()
            local str = ''
            for i = 33, 255 do str = str .. string.char(i) end
            d3dxfont_draw(font_wingdings, str, {10, 60, sw, sh}, 0xFFDDAA00, 0x10) -- выводим все символы шрифта Wingdings
        end
    end
end

function onExitScript()
    if fonts_loaded then
        font_arial.vtbl.Release(font_arial)
        font_wingdings.vtbl.Release(font_wingdings)
    end
end

function main()
    draw = true
    font_arial = d3dxfont_create('Arial', 64)
    font_wingdings = d3dxfont_create('Wingdings', 72, 2)
    fonts_loaded = true
end
Где можно найти мануалы по рендеру через директИкс?
Или просто скажи как нарисовать линию по коордам экрана
 
  • Нравится
Реакции: Ya Zaregalsya

KateMob

Новичок
1
0
По какой причине moonloader может не скачивать файлы обновления на win10?
 

FYP

Известный
Автор темы
Администратор
1,764
5,923
DonHomka в день релиза .026 задал вопрос и изъявил желание помочь, но т.к. вопрос был в основной теме, а обычным юзерам это будет не интересно, лучше отвечу здесь.
@FYP что по поводу SAMP.Lua, будешь ли заниматься? Может выложишь ТЗ какое-нибудь. Что надо сделать. Мы тут не просто так хуи пинаем. Можем и головой поработать, а не головкой. И добавь RPC входящий что я скидывал в теме.
я не стал отвечать сразу, т.к. мне ещё до этого самому хотелось осветить дальнейшие планы более развернуто.

в общем, первое, о чём надо сказать сразу - мне придётся отложить работу над мунлоадером на неопределённый срок, т.к. накопилось много других дел, которые были запланированы уже давно. версия 026, как бы иронично это не звучало в связи с проблемами после релиза, должна быть самой стабильной из всех. я продолжу выпускать исправления, если обнаружатся какие-то серьёзные баги, но не более.
второе: следующий релиз мунлоадера будет не про новые фичи, он будет полным рефакторингом с последующим переходом в опенсорс.
третье: после релиза 026 я собирался сделать ещё несколько вещей, касающихся муна, но из-за многочисленных проблем обновление сильно затянулось и теперь времени на них нет. поэтому хочу сделать что-то одно из этого, но не могу определиться, что нужнее...

входило в планы:
  • дополнить вики информацией о всех изменениях 026; добавить описание типов; в колонку "опкод", на странице списка функций, выводить опкоды, которые были замены встроенными функциями, с отличающимся оформлением. это я в любом случае сделаю, но помощь была бы очень кстати.
  • улучшить плагин для атома - переписать на javascript (т.к. весь атом переводят на js), заменить atom-space-pen-views на atom-select-list (т.к. он оптимизированный и весь атом тоже переводят на него), рассмотреть возможность использования LSR для автокомплита и других фич, это помогло бы заменить заброшенный автором atom-autocomplete-lua. проблемы: я совсем не знаю js и апи атома, делал плагин для атома почти вслепую, поэтому делать это придётся практически с нуля.
  • рассмотреть смену атома на vs code, т.к. атом стал заметно тормознутее, как бы ни старались его оптимизировать. проблемы похожие: typescript я знаю ещё меньше, для vs code вообще ничего не делал, а главное, что история с атомом может повториться и с vs code.
  • обновить moon imgui. с момента релиза imgui один раз обновлялся и сейчас автор работает над довольно крупным обновлением. хотелось бы обновить moon imgui на него, с улучшением луа биндингов для более удобного использования, и открыть исходный код. проблемы две: обновление ещё не готово, а изменения в биндингах могут привести к несовместимости версий.
  • написать объёмный гайд (не вместо дефолтного), освещающий все подробности разработки под мунлоадер. нацеленный не только на тех, кто уже что-то знает и умеет, но и на новичков. проблемы: гайды у меня получаются так себе и их почти никто не читает.
в ближайшие планы не входило, но очень нужно мунлоадеру:
  • менеджмент зависимостей: это уже стало больной темой, никто не хочет таскать с собой либы, потому что юзеры не умеют их устанавливать, потому что это лишние файлы, потому что... но использовать либы удобно и от них никуда не деться, поэтому с этим надо что-то делать. последней (но не окончательной) идеей на текущий момент является взятие пакетного менеджера LuaRocks за основу, с некоторыми изменениями под свою базу библиотек и автоматический запуск через мунлоадер, посредством перехвата вызова функции script_dependencies и автоматической установкой всех зависимостей. с помощью костылей это можно попробовать реализовать прямо сейчас без введения изменений в сам мунлоадер, могу описать подробнее, если это кому-то интересно.
  • хуки скриптов. концепция такова: Lua-скрипты, исключительно с открытым исходным кодом, с определенным расширением (или в определённой поддиректории) внедряются в окружение каждого загружаемого скрипта и могут подменить любые вызовы, значения, события. при этом сами скрипты не имеют доступа к окружению хуков, если хуки сами этого не позволят. эта функция даст возможность реализовать многое: системы защиты от вредоносных скриптов на основе прав доступа, универсальные системы автообновления, менеджмента зависимостей, инструменты для отладки и т.д.
  • улучшенная документация и документация на английском для привлечения большего количества разработчиков.
мечты:
  • поддержка других игр серии и разных версий, с максимизированной совместимостью скриптов.
  • классный сайт на каком-нибудь хипстерском домене, служащий лицом мунлоадера. ну и вообще, отдельный сайт полезен по многим причинам. когда увидел сайт Grav мне стало очень грустно, грустно потому, что это не сайт мунлоадера. что за grav вообще? оформление этого сайта создано под мун, а не какой-то там grav!
SAMP.Lua:
наконец, о самп.луа. я опишу то, чем он должен быть, а не то, что я собирался с ним сделать. над ним я тоже не смогу работать в ближайшее время.
в первую очередь, в нём должны быть события для всех существующих RPC и пакетов. затем, он должен стать лёгкой заменой сф, только с функциями сампа, ну и конечно же, тем самым перестать использовать сф. поддержка сампа должна быть мультиверсионной без установки каких-то отдельных версий библиотеки для разных версий сампа, всё это очень легко реализуемо в луа, но это нужно учесть сразу, даже если изначально делать поддержку только одной версии.
если кто-то действительно готов этим заняться, я готов помогать и предоставить реализацию необходимых функций, адреса и структуры из сф.

ну и разумеется, я накатал столько текста не ради того, чтобы излить душу, я жду фидбека и бурных обсуждений. особенно от (порядок рандомный) @AppleThe, @DonHomka, @legend2360, @randazzo, @Boris Yeltsin, @LUCHARE, @Garrus, @romacaddy, @imring, @deddosouru.
 

applethecandy

Now it's PHP time
Проверенный
253
330
Ну, пройдусь тут, раз позвал..
Сначала о том, что нужно реализовывать первым делом. Мнение максимально объективное, и касается не только разработчиков (лол) на луа, но и юзеров.
1) Менеджмент версий. Очень много проблем с библиотеками в серьезных скриптах. Временами, я скидываю людям по 5 ссылок на библиотеки, а потом забиваю хуй и просто скидываю всю папку lib, ибо так реально проще. Менеджмент бы сильно помог.
2) ImGui. Это будет очередной способ показать, что луа лучше клео, и поспособствует переходу с второго на первый. Для юзеров, конечно же.
3) Улучшить гайд. Но тут такой нюанс: его рил мало кто читает. Надо как-то его популяризировать, для начала (например, создать сайт).

В плане первого пункта, и вообще WIKI в целом: Она, вроде, доступна для редактирования каждому, так что можно заняться. Вот сейчас, чую, человечик активизируется.
Насчет отдельного сайта: Да, черт возьми! Это сильно поможет с юзерами. Нужно активнее думать в этом направлении.
SAMP.lua. Помогать, я, разумеется, не стану. DonHomka же есть. Сказал "А", говори и "Б".

порядок рандомный
Ой, да ладно тебе :D (шутка)
 

AnWu

Известный
Всефорумный модератор
4,777
5,400
вся суть читерского комьюнити сампа в одной фразе
хах. Сайт. Ну можно начать с этого. Очень заиинтерисовал luarocks. сам столкнулся с этим дерьмом и скидываю юзверам не дефолт либы сразу.
По поводу атома я тоже не шарю. Самп луа готов помогать. дай направление куда копать.
При создании сайта лучше будет если ты опишешь что именно ждешь от него. Вики? Страница обновлений? Гайды от юзверов из списка выше?) От тебя фидбэк тоже нужен и без тебя мы постоим мост из желе.
Ну как я уже написал можно заняться сайтом, но нужна графика)
 

samespoon

Известный
163
20
рассмотреть смену атома на vs code, т.к. атом стал заметно тормознутее, как бы ни старались его оптимизировать. проблемы похожие: typescript я знаю ещё меньше, для vs code вообще ничего не делал, а главное, что история с атомом может повториться и с vs code.
Я конечно новичок в этом всём, но подумай над редактором "Brackets", он тоже достаточно лёгкий, удобный, ещё и на русском.
написать объёмный гайд (не вместо дефолтного), освещающий все подробности разработки под мунлоадер. нацеленный не только на тех, кто уже что-то знает и умеет, но и на новичков. проблемы: гайды у меня получаются так себе и их почти никто не читает.
А это просто необходимо, самому приходится через боли и мучения изучать не только Lua, а вообще программирование, т.к. на Lua не существует гайдов для полных новичков, и это очень печально :с