UI Hacks (foo_ui_hacks)

Список разделов foobar2000 Плагины

Описание: Все о плагинах, компонентах, расширениях

Сообщение #1 DRON » 28.05.2009, 15:11

Компонент позволяет изменять поведение главного окна плеера и реакцию на некоторые действия пользователя. Настройки компонента можно найти на странице "UI Hacks" в окне конфигурации foobar2000.

Функционально компонент заменяет foo_lock, foo_noss, foo_minimize_on_close, foo_notaskbar, foo_snap, foo_fullscreen и foo_playpause_on_tray_click. Также имеется возможность настройки уведомлений (Balloon tooltip), за что благодарите Mr.Merak.

Увы, официальный сайт более недоступен, и судя по всему, разработка заморожена или вовсе прекращена. С каждой новой версией foobar2000 функционал становится все более несовместимым с плеером, поэтому возможно вам стоит отказаться от его использования в новейших версиях foobar2000.

Последнюю версию можно найти тут:
foo_ui_hacks_2013-02-19.zip
(124.19 КБ) Скачиваний: 9395

Иконки для опции "Use playback status icons":
StateIcons.7z
Иконки для опции "Use playback status icons".
(7.73 КБ) Скачиваний: 2818
Последний раз редактировалось DRON 24.12.2012, 02:48, всего редактировалось 11 раз(а).
DRON M
Автор темы
Аватара
Откуда: Санкт-Петербург
Репутация: 113
С нами: 15 лет 4 месяца


Сообщение #561 macarych » 26.09.2018, 15:18

kgena_ua, привет.
AutoItX3 - я это имел ввиду.
macarych M
Аватара
Репутация: 417
С нами: 14 лет 8 месяцев


Сообщение #563 macarych » 27.09.2018, 17:49

zeremy, thank you so mach .
macarych M
Аватара
Репутация: 417
С нами: 14 лет 8 месяцев

Сообщение #564 Aliado_71 » 09.06.2020, 23:52

Последние версии CUI стали ругаться на плагин UI Hacks, кто знает в чем там несовместимость?
Aliado_71
Аватара
Откуда: Украина
Репутация: 200
С нами: 8 лет 6 месяцев

Сообщение #565 Azaza » 10.06.2020, 00:57

Например, UI Hacks не позволяет CUI менять размер шрифта.
I just installed the new version 1.2 and detected a serious error. It does not allow you to correctly change the font size in "Colors and fonts". I had to reinstall version 1.0. Please can you verify that I am right?
Please remove UI Hacks (foo_ui_hacks).
https://hydrogenaud.io/index.php?topic=28647.7475
Аудиофилия - это болезнь,поражающая головной мозг.Набор профилактически-превентивных мер против аудиофилии крайне скуден - техническое образование, умение мыслить логически и наличие здравого смысла.
Azaza M
Аватара
Репутация: 375
С нами: 7 лет

Сообщение #566 Aliado_71 » 10.06.2020, 01:39

Azaza:Например, UI Hacks не позволяет CUI менять размер шрифта.
Я понял спасибо! В общем ничего серьезного, просто что бы поменять шрифты нужно теперь сначала удалить UI Hacks, ну а после настроек шрифтов можно установить снова. :wink:
Aliado_71
Аватара
Откуда: Украина
Репутация: 200
С нами: 8 лет 6 месяцев

Сообщение #567 LUR » 10.06.2020, 01:44

Azaza:Например, UI Hacks не позволяет CUI менять размер шрифта.
Это вы про последние версии? Прямо реально не дает?
LUR M
Модератор
Аватара
Возраст: 40
Откуда: Минск
Репутация: 344
С нами: 10 лет 10 месяцев

Сообщение #568 Azaza » 10.06.2020, 01:54

Да, про последние. Да, не даёт.
Аудиофилия - это болезнь,поражающая головной мозг.Набор профилактически-превентивных мер против аудиофилии крайне скуден - техническое образование, умение мыслить логически и наличие здравого смысла.
Azaza M
Аватара
Репутация: 375
С нами: 7 лет

Сообщение #569 Aum » 24.09.2020, 17:37

Народ, кто в силах адаптировать плагин под последнюю версию плеера 1.6? Там совсем все поломалось, рамки окна не отключаются, portability - не работает, печаль!
Мудр не тот, кто доказал что-либо, а тот, кто зная истину, не стал спорить.
Aum M
Аватара
Возраст: 39
Откуда: UA
Репутация: 20
С нами: 13 лет 6 месяцев

Сообщение #570 imfam » 24.09.2020, 18:53

Я пользуюсь только отключением рамки. Консоль ругается, но эта функция работает.
Моя сборка: http://d9819506.bget.ru/foobar_my.html
imfam M
Откуда: Германия
Репутация: 28
С нами: 10 лет 4 месяца

Сообщение #571 VEG » 25.09.2020, 16:22

Увы, как пропал DRON внезапно в 2013 году, так и не появлялся с тех пор =(
Исходников нет, без исходников наверное проще аналог с нуля написать, чем адаптировать бинарник.
VEG M В сети
Администратор
Аватара
Возраст: 35
Откуда: Finland
Репутация: 260
С нами: 11 лет 4 месяца

Сообщение #572 Truumann » 19.01.2021, 16:41

Aum:Там совсем все поломалось, рамки окна не отключаются, portability - не работает, печаль!
VEG:Увы, как пропал DRON внезапно в 2013 году, так и не появлялся с тех пор =(

Мда, печально :sad: В новых версиях dll для portability не хочет устанавливаться. Я правильно понимаю, что без этого компонента вот такие пути теперь не работают .\foo\bar\%2000%\%foobar2000%_*.* ? Можно ли как-то по-другому ссылаться на корневой каталог foobar без необходимости указывать полный путь? Может переменная вроде такой существует %root%\foo\bar\%2000%\%foobar2000%_*.* ?
Truumann
Репутация: 2
С нами: 10 лет 1 месяц

Сообщение #573 SergPuh.68 » 21.01.2021, 13:50

Truumann, к сожалению при использовании версии foobar2000 1.6+ от компонента UI Hacks (foo_ui_hacks) придется отказаться.Некоторые функции конечно работают но вот с путями совсем проблема.Кое где работают такие .\foo\bar\%2000%\%foobar2000%_*.* кое где такие %ps_foobar2000_path%\profile\images\
YouTube Music
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 142
С нами: 4 года 8 месяцев

Сообщение #574 SergPuh.68 » 13.04.2021, 14:15

Привет,никогда не задумывался зачем нужна папка assemblies.Почитал на форуме и так и не понял зачем она нужна?Что за библиотеки?Что они дают?
YouTube Music
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 142
С нами: 4 года 8 месяцев

Сообщение #575 kgena_ua » 13.04.2021, 17:51

SergPuh.68, библиотеки такие:
assemblies.rar
(132.28 КБ) Скачиваний: 965

Я, например, изменяю размер окна фубара и т.д.
Почитайте тут:
Код: Выделить всё
//Additional libraries initialisation script by Zin-Uru, 2010
//Version 1.5.2, 15.01.2011
var lib_path = fb.FoobarPath + "assemblies\\";
var autoItX3, dynwrapx;
var libs_exist = utils.FileTest(lib_path + "AutoItX3.dll","e") && utils.FileTest(lib_path + "dynwrapx.dll","e");
var loaded = true;

function init_special_libraries(force) { //Use force=true if not need to patch foobar2000.exe
    var WshShell = new ActiveXObject("WScript.Shell");
    var pressed = -1;

    if(!libs_exist) {
        loaded = false;
        return;
    }
    try {
        autoItX3 = new ActiveXObject("AutoItX3.Control");
        dynwrapx = new ActiveXObject("DynamicWrapperX");
    } catch (e) {
        if(force || !window.GetProperty("Show message", true)) {
            loaded = false;
            return;
        } else {
            pressed = WshShell.Popup("It seems like libraries not found or you use not patched foobar2000.exe. Do you want to patch it now (recommended)? You can also do that manually with patch.cmd from the foobar2000 folder. Now press OK to go or Cancel to skip (be carefull - this message showed only once).",0,"Notice",33);
            if(pressed==1) {
                WshShell.run('"' + fb.FoobarPath + 'patch.cmd" run_foo');
                fb.RunMainMenuCommand("File/Exit");
            } else {
                window.SetProperty("Show message", false);
            }
            loaded = false;
            return;
        }
    }
   
    //Dynwrapx commands registration
    dynwrapx.Register("user32.dll", "ReleaseCapture");
    dynwrapx.Register("user32.dll", "SendMessage", "i=hlul", "r=l");
    dynwrapx.Register("user32.dll", "GetWindowLong", "i=hl", "r=l");
    dynwrapx.Register("user32.dll", "SetWindowLong", "i=hll", "r=l");
    dynwrapx.Register("user32.dll", "SetLayeredWindowAttributes", "i=hlbu", "r=b");
    dynwrapx.Register("user32.dll", "RedrawWindow", "i=huhu", "r=l");
}

//Helper functions
function get_hwnd(interface_name) {
    var hwnd;

    if(!libs_exist || !loaded) return;
    switch (interface_name) {
        case "CUI":
            hwnd = ("0x" + autoItX3.WinGetHandle("[CLASS:{E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}]"))*1;
            break;
        case "FUI":
            hwnd = ("0x" + autoItX3.WinGetHandle("[CLASS:foo_ui_func_window_class]"))*1;
            break;
        case "DUI":
            hwnd = ("0x" + autoItX3.WinGetHandle("[CLASS:{97E27FAA-C0B3-4b8e-A693-ED7881E99FC1}]"))*1;
            break;
        default:
            hwnd = ("0x" + autoItX3.WinGetHandle(interface_name))*1;
            break;
    }
    return hwnd;
}

function get_pss_hwnd(instance) { //CUI only
    if(!libs_exist || !loaded) return;
    return ("0x" + autoItX3.ControlGetHandle("[CLASS:{E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}]", "", "[CLASS:PSSWindowContainer; INSTANCE:" + instance + "]"))*1;
}

function get_class(interface_name) {
    var wclass;

    if(!libs_exist || !loaded) return;
    switch (interface_name) {
        case "CUI":
            wclass = "[CLASS:{E7076D1C-A7BF-4f39-B771-BCBE88F2A2A8}]";
            break;
        case "FUI":
            wclass = "[CLASS:foo_ui_func_window_class]";
            break;
        case "DUI":
            wclass = "[CLASS:{97E27FAA-C0B3-4b8e-A693-ED7881E99FC1}]";
            break;
        default:
            wclass = interface_name;
            break;
    }
    return wclass;
}

function GDI_RGB(b, g, r) {
   return (0xff000000 | (r << 16) | (g << 8) | (b));
}

function LParam(LoWord, HiWord){
    return ((HiWord << 16) | (LoWord & 0xffff));
}

var messages = {
    WM_NULL: 0x00,
    WM_CREATE: 0x01,
    WM_DESTROY: 0x02,
    WM_MOVE: 0x03,
    WM_SIZE: 0x05,
    WM_ACTIVATE: 0x06,
    WM_SETFOCUS: 0x07,
    WM_KILLFOCUS: 0x08,
    WM_ENABLE: 0x0A,
    WM_SETREDRAW: 0x0B,
    WM_SETTEXT: 0x0C,
    WM_GETTEXT: 0x0D,
    WM_GETTEXTLENGTH: 0x0E,
    WM_PAINT: 0x0F,
    WM_CLOSE: 0x10,
    WM_QUERYENDSESSION: 0x11,
    WM_QUIT: 0x12,
    WM_QUERYOPEN: 0x13,
    WM_ERASEBKGND: 0x14,
    WM_SYSCOLORCHANGE: 0x15,
    WM_ENDSESSION: 0x16,
    WM_SYSTEMERROR: 0x17,
    WM_SHOWWINDOW: 0x18,
    WM_CTLCOLOR: 0x19,
    WM_WININICHANGE: 0x1A,
    WM_SETTINGCHANGE: 0x1A,
    WM_DEVMODECHANGE: 0x1B,
    WM_ACTIVATEAPP: 0x1C,
    WM_FONTCHANGE: 0x1D,
    WM_TIMECHANGE: 0x1E,
    WM_CANCELMODE: 0x1F,
    WM_SETCURSOR: 0x20,
    WM_MOUSEACTIVATE: 0x21,
    WM_CHILDACTIVATE: 0x22,
    WM_QUEUESYNC: 0x23,
    WM_GETMINMAXINFO: 0x24,
    WM_PAINTICON: 0x26,
    WM_ICONERASEBKGND: 0x27,
    WM_NEXTDLGCTL: 0x28,
    WM_SPOOLERSTATUS: 0x2A,
    WM_DRAWITEM: 0x2B,
    WM_MEASUREITEM: 0x2C,
    WM_DELETEITEM: 0x2D,
    WM_VKEYTOITEM: 0x2E,
    WM_CHARTOITEM: 0x2F,
    WM_SETFONT: 0x30,
    WM_GETFONT: 0x31,
    WM_SETHOTKEY: 0x32,
    WM_GETHOTKEY: 0x33,
    WM_QUERYDRAGICON: 0x37,
    WM_COMPAREITEM: 0x39,
    WM_COMPACTING: 0x41,
    WM_WINDOWPOSCHANGING: 0x46,
    WM_WINDOWPOSCHANGED: 0x47,
    WM_POWER: 0x48,
    WM_COPYDATA: 0x4A,
    WM_CANCELJOURNAL: 0x4B,
    WM_NOTIFY: 0x4E,
    WM_INPUTLANGCHANGEREQUEST: 0x50,
    WM_INPUTLANGCHANGE: 0x51,
    WM_TCARD: 0x52,
    WM_HELP: 0x53,
    WM_USERCHANGED: 0x54,
    WM_NOTIFYFORMAT: 0x55,
    WM_CONTEXTMENU: 0x7B,
    WM_STYLECHANGING: 0x7C,
    WM_STYLECHANGED: 0x7D,
    WM_DISPLAYCHANGE: 0x7E,
    WM_GETICON: 0x7F,
    WM_SETICON: 0x80,
    WM_NCCREATE: 0x81,
    WM_NCDESTROY: 0x82,
    WM_NCCALCSIZE: 0x83,
    WM_NCHITTEST: 0x84,
    WM_NCPAINT: 0x85,
    WM_NCACTIVATE: 0x86,
    WM_GETDLGCODE: 0x87,
    WM_NCMOUSEMOVE: 0xA0,
    WM_NCLBUTTONDOWN: 0xA1,
    WM_NCLBUTTONUP: 0xA2,
    WM_NCLBUTTONDBLCLK: 0xA3,
    WM_NCRBUTTONDOWN: 0xA4,
    WM_NCRBUTTONUP: 0xA5,
    WM_NCRBUTTONDBLCLK: 0xA6,
    WM_NCMBUTTONDOWN: 0xA7,
    WM_NCMBUTTONUP: 0xA8,
    WM_NCMBUTTONDBLCLK: 0xA9,
    WM_KEYFIRST: 0x100,
    WM_KEYDOWN: 0x100,
    WM_KEYUP: 0x101,
    WM_CHAR: 0x102,
    WM_DEADCHAR: 0x103,
    WM_SYSKEYDOWN: 0x104,
    WM_SYSKEYUP: 0x105,
    WM_SYSCHAR: 0x106,
    WM_SYSDEADCHAR: 0x107,
    WM_KEYLAST: 0x108,
    WM_IME_STARTCOMPOSITION: 0x10D,
    WM_IME_ENDCOMPOSITION: 0x10E,
    WM_IME_COMPOSITION: 0x10F,
    WM_IME_KEYLAST: 0x10F,
    WM_INITDIALOG: 0x110,
    WM_COMMAND: 0x111,
    WM_SYSCOMMAND: 0x112,
    WM_TIMER: 0x113,
    WM_HSCROLL: 0x114,
    WM_VSCROLL: 0x115,
    WM_INITMENU: 0x116,
    WM_INITMENUPOPUP: 0x117,
    WM_MENUSELECT: 0x11F,
    WM_MENUCHAR: 0x120,
    WM_ENTERIDLE: 0x121,
    WM_CTLCOLORMSGBOX: 0x132,
    WM_CTLCOLOREDIT: 0x133,
    WM_CTLCOLORLISTBOX: 0x134,
    WM_CTLCOLORBTN: 0x135,
    WM_CTLCOLORDLG: 0x136,
    WM_CTLCOLORSCROLLBAR: 0x137,
    WM_CTLCOLORSTATIC: 0x138,
    WM_MOUSEFIRST: 0x200,
    WM_MOUSEMOVE: 0x200,
    WM_LBUTTONDOWN: 0x201,
    WM_LBUTTONUP: 0x202,
    WM_LBUTTONDBLCLK: 0x203,
    WM_RBUTTONDOWN: 0x204,
    WM_RBUTTONUP: 0x205,
    WM_RBUTTONDBLCLK: 0x206,
    WM_MBUTTONDOWN: 0x207,
    WM_MBUTTONUP: 0x208,
    WM_MBUTTONDBLCLK: 0x209,
    WM_MOUSEWHEEL: 0x20A,
    WM_MOUSEHWHEEL: 0x20E,
    WM_PARENTNOTIFY: 0x210,
    WM_ENTERMENULOOP: 0x211,
    WM_EXITMENULOOP: 0x212,
    WM_NEXTMENU: 0x213,
    WM_SIZING: 0x214,
    WM_CAPTURECHANGED: 0x215,
    WM_MOVING: 0x216,
    WM_POWERBROADCAST: 0x218,
    WM_DEVICECHANGE: 0x219,
    WM_MDICREATE: 0x220,
    WM_MDIDESTROY: 0x221,
    WM_MDIACTIVATE: 0x222,
    WM_MDIRESTORE: 0x223,
    WM_MDINEXT: 0x224,
    WM_MDIMAXIMIZE: 0x225,
    WM_MDITILE: 0x226,
    WM_MDICASCADE: 0x227,
    WM_MDIICONARRANGE: 0x228,
    WM_MDIGETACTIVE: 0x229,
    WM_MDISETMENU: 0x230,
    WM_ENTERSIZEMOVE: 0x231,
    WM_EXITSIZEMOVE: 0x232,
    WM_DROPFILES: 0x233,
    WM_MDIREFRESHMENU: 0x234,
    WM_IME_SETCONTEXT: 0x281,
    WM_IME_NOTIFY: 0x282,
    WM_IME_CONTROL: 0x283,
    WM_IME_COMPOSITIONFULL: 0x284,
    WM_IME_SELECT: 0x285,
    WM_IME_CHAR: 0x286,
    WM_IME_KEYDOWN: 0x290,
    WM_IME_KEYUP: 0x291,
    WM_MOUSEHOVER: 0x2A1,
    WM_NCMOUSELEAVE: 0x2A2,
    WM_MOUSELEAVE: 0x2A3,
    WM_CUT: 0x300,
    WM_COPY: 0x301,
    WM_PASTE: 0x302,
    WM_CLEAR: 0x303,
    WM_UNDO: 0x304,
    WM_RENDERFORMAT: 0x305,
    WM_RENDERALLFORMATS: 0x306,
    WM_DESTROYCLIPBOARD: 0x307,
    WM_DRAWCLIPBOARD: 0x308,
    WM_PAINTCLIPBOARD: 0x309,
    WM_VSCROLLCLIPBOARD: 0x30A,
    WM_SIZECLIPBOARD: 0x30B,
    WM_ASKCBFORMATNAME: 0x30C,
    WM_CHANGECBCHAIN: 0x30D,
    WM_HSCROLLCLIPBOARD: 0x30E,
    WM_QUERYNEWPALETTE: 0x30F,
    WM_PALETTEISCHANGING: 0x310,
    WM_PALETTECHANGED: 0x311,
    WM_HOTKEY: 0x312,
    WM_PRINT: 0x317,
    WM_PRINTCLIENT: 0x318,
    WM_HANDHELDFIRST: 0x358,
    WM_HANDHELDLAST: 0x35F,
    WM_PENWINFIRST: 0x380,
    WM_PENWINLAST: 0x38F,
    WM_COALESCE_FIRST: 0x390,
    WM_COALESCE_LAST: 0x39F,
    WM_DDE_FIRST: 0x3E0,
    WM_DDE_INITIATE: 0x3E0,
    WM_DDE_TERMINATE: 0x3E1,
    WM_DDE_ADVISE: 0x3E2,
    WM_DDE_UNADVISE: 0x3E3,
    WM_DDE_ACK: 0x3E4,
    WM_DDE_DATA: 0x3E5,
    WM_DDE_REQUEST: 0x3E6,
    WM_DDE_POKE: 0x3E7,
    WM_DDE_EXECUTE: 0x3E8,
    WM_DDE_LAST: 0x3E8,
    WM_USER: 0x400,
    WM_APP: 0x8000
}

function drag_window(interface_name) { //For use in on_mouse_lbtn_down
    if(!libs_exist || !loaded) return;
    dynwrapx.ReleaseCapture();
    dynwrapx.SendMessage(get_hwnd(interface_name), 0xA1, 2, 1);
}

function move_window(interface_name, x, y, w, h) {
    if(!libs_exist || !loaded) return;
    autoItX3.WinMove(get_class(interface_name), "", x, y, w, h);   
}

function get_window_states(interface_name) { //Returned array gives: exists, visible, enabled, active, minimized, maximized
    var result = Array(false, false, false, false, false, false);
    var state;
   
    if(!libs_exist || !loaded) return result;
    state = autoItX3.WinGetState(get_class(interface_name));
    if((state & 1)==1) result[0] = true;
    if((state & 2)==2) result[1] = true;
    if((state & 4)==4) result[2] = true;
    if((state & 8)==8) result[3] = true;
    if((state & 16)==16) result[4] = true;
    if((state & 32)==32) result[5] = true;
    return result;
}

function window_opacity(interface_name, opacity) {
    if(!libs_exist || !loaded) return;
    autoItX3.WinSetTrans(get_class(interface_name), "", Math.round(opacity*2.55));
    if(get_window_states(interface_name)[1]==true) dynwrapx.RedrawWindow(get_hwnd(interface_name), 0, 0, 0x400 | 0x80 | 0x4 | 0x1);
}

function get_window_dimensions(interface_name) { //Returned array gives: x, y, width, height (of the window)
    var title;
   
    if(!libs_exist || !loaded) return Array(0,0,0,0);
    title = get_class(interface_name);
    return Array(autoItX3.WinGetPosX(title),autoItX3.WinGetPosY(title),autoItX3.WinGetPosWidth(title),autoItX3.WinGetPosHeight(title));   
}

function set_window_on_top(interface_name, state) {
    if(!libs_exist || !loaded) return;
    autoItX3.WinSetOnTop(get_class(interface_name),"",state==false ? 0 : 1);
}

function set_transparent_color(interface_name, color, alpha) { //Use only GDI_RGB(r, g, b) to set up color
    var handle;

    if(!libs_exist || !loaded) return;
    handle = get_hwnd(interface_name);
    dynwrapx.SetWindowLong(handle, -20, dynwrapx.GetWindowLong(handle, -20) | 0x00080000);
    dynwrapx.SetLayeredWindowAttributes(handle, color, alpha, 0x00000001 | 0x00000002);
    if(get_window_states(interface_name)[1]==true) dynwrapx.RedrawWindow(handle, 0, 0, 0x400 | 0x80 | 0x4 | 0x1);
}
Внизу:
function drag_window, function move_window ......
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Аватара
Возраст: 59
Откуда: Украина, Днепр
Репутация: 504
С нами: 10 лет 5 месяцев

Сообщение #576 SergPuh.68 » 13.04.2021, 19:19

Другими словами библиотеки будут полезны для использования в написанных скриптах,обычному пользователю можно не заморачиваться :smoke:
Архив не удалось посмотреть,антивирус категорически отказал в скачивании.
YouTube Music
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 142
С нами: 4 года 8 месяцев

Сообщение #577 GLOT » 22.12.2021, 15:53

походу совсем поломался компонент
Не подскажете аналоги? Мне очень нравится регулировка громкости по наведению на панель задач
GLOT
Репутация: 0
С нами: 5 лет 10 месяцев

Сообщение #578 VEG » 22.12.2021, 17:04

GLOT, можете регулировать системную громкость при помощи 7+ Taskbar Tweaker. Поддерживает Windows 7, 8, 8.1 и 10. В Windows 11 работает только если активировать старую панель задачь из десятки. Под новую панель задач из Windows 11 пока что не портировали.
VEG M В сети
Администратор
Аватара
Возраст: 35
Откуда: Finland
Репутация: 260
С нами: 11 лет 4 месяца

Сообщение #579 MrGrey » 05.12.2022, 11:33

За 10 лет аналогов не появилось :cry:
MrGrey M
Аватара
Откуда: Минск
Репутация: 25
С нами: 16 лет 11 месяцев

Пред.

Вернуться в Плагины