-
Публикации
81 -
Зарегистрирован
-
Посещение
О Purgamentum-exit
-
Звание
Форумный механик
Посетители профиля
Блок посетителей профиля отключен и не будет отображаться другим пользователям
-
Purgamentum-exit подписался на Золотая лихорадка и 3d модели из Танков Онлайн
-
В игре используются модели 3ds и a3d, png и bitmap для текстур. Вы можете получить адреса расположения этих моделей в процессе игры, скачать их или модифицировать "на лету". По поводу 3ds могу сказать, что модели соответствуют спецификации (довольно кривой для блочных данных, к слову). Вы должны понимать, что 3ds модели содержат помимо графических элементов и функциональные объекты, такие как точка удара для орудия, точка испускания лазерного луча, точка крепления корпуса к башне. Вероятно, поэтому Вы считаете их кривыми. Для примера вот модель из игры: ссылка. Поиграйтесь с отображаемыми объектами. Вам нужно будет вручную или при помощи скриптов пройтись по моделям и удалить из них все "лишние" элементы перед конвертацией в другие форматы. В случае и данной моделью, достаточно оставить всего четыре элемента, остальные служебные: Вот пример конвертации 3ds и изображения "на лету" прямо в браузере (удалена большая часть объектов, создан объект "шар" с наложенной текстурой):
-
[АПРГЕЙД ИНТЕРФЕЙСА] Убираем влево или вправо мешающие сообщения (лог битвы)
Purgamentum-exit ответил KissesKisses в теме Проблемы и решения
Туда же, куда и раньше. Можно в приложение, отредактировав main.js. Можно в браузере через расширение "User Java Script and CSS" (см. выше), или userscript's. Можно ввести в консоли (если на один раз): document.head.appendChild(document.createElement('style'))?.sheet?.addRule('[data-style*="BattleMessagesComponentStyle-container"]', 'align-items: flex-start !important; padding-left: 1.1em;'); -
[АПРГЕЙД ИНТЕРФЕЙСА] Убираем влево или вправо мешающие сообщения (лог битвы)
Purgamentum-exit ответил KissesKisses в теме Проблемы и решения
Используйте селектор с поиском по атрибуту: [data-style*="BattleMessagesComponentStyle-container"] { align-items: flex-start !important; padding-left: 1.1em; } -
Есть решение. Electron поддерживает динамическое изменение userData. Вы можете иметь неограниченное количество хранилищ учетных данных. Нет, разработчики не предусмотрели специального ключа для манипуляций с userData. Возможно, Вы имели ввиду ключ "--user-data-dir", но он не будет работать с используемой версией Electron. Существует метод electron::app.setPath, который позволяет переопределить каталог пользовательских данных. Далее я буду использовать ключ --profile, но Вы можете использовать любой. Порядок действий по шагам. 1. Установить 7-zip (open-source, официальный сайт). 2. Установить плагин "Asar" для 7-zip. Можно взять, например, отсюда. 3. Установить плагин: создать каталог "Formats" в месте установки 7-zip и скопировать в созданный каталог библиотеку той же версии, что и программа (x86 для 32-битных систем, x64 для 64-битных). 4. Переименовать файл "%LOCALAPPDATA%\Programs\Tanki Online\resources\app.asar" в "app.asar.bak" 5. Распаковать переименованный файл в каталог "app.asar": ПКМ по файлу, 7-zip, "Распаковать в app.asar\". Или можно запустить 7-zip, открыть переименованный файл и распаковать. 6. Удостоверьтесь, что все сделано правильно: main.js должен находится по пути "%LOCALAPPDATA%\Programs\Tanki Online\resources\app.asar\main.js". 7. Откройте "%LOCALAPPDATA%\Programs\Tanki Online\resources\app.asar\main.js" в любом текстовом редакторе. 8. Найдите строчки и вставьте код: /** Оригинальный код танков онлайн: **/ const argv = parseArgs( process.argv.slice(1), { default: { logLevel: 'info', loadURL: config['loadURL'], }, boolean: ['openDevTools'] } ); /** Код для вставки **/ if('profile' in argv) { app.setPath('userData', path.join(app.getPath('userData'), '_Profile_' + argv['profile'])); } /** Код для вставки **/ /** Далее - оригинальный код танков онлайн: **/ const Sentry = require('@sentry/electron'); /// ... 9. Сохраните файл. Никаких действий с кодом больше предпринимать не требуется. Не требуется также что-то куда-то запаковывать. Клиент будет работать корректно. 10. Создайте ярлыки. Используйте аргумент "--profile" "<название профиля>", где название профиля может быть любой строкой. Например: "%LOCALAPPDATA%\Programs\Tanki Online\resources\app.asar\Tanki Online.exe" --profile "SecondUser"
-
[АПРГЕЙД ИНТЕРФЕЙСА] Убираем влево или вправо мешающие сообщения (лог битвы)
Purgamentum-exit ответил KissesKisses в теме Проблемы и решения
Немного информации по поводу имен классов. Генерируемые имена классов именуются хешем от содержимого. То есть даже небольшое изменение стилей ведет к полному изменению генерируемого класса. Так что тем, кто пишет "темы" и userscript'ы для проекта, особенно рассчитывать на них не стоит. Алгоритм генерации: /** * Алгоритм получения имени генерируемого класса */ const __hash_a = function (t) { for (var e, n = 0 | t.length, o = 0 | n, i = 0; n >= 4; ++i, n -= 4) { e = 1540483477 * (65535 & (e = 255 & t.charCodeAt(i) | (255 & t.charCodeAt(++i)) << 8 | (255 & t.charCodeAt(++i)) << 16 | (255 & t.charCodeAt(++i)) << 24)) + ((1540483477 * (e >>> 16) & 65535) << 16); o = 1540483477 * (65535 & o) + ((1540483477 * (o >>> 16) & 65535) << 16) ^ (e = 1540483477 * (65535 & (e ^= e >>> 24)) + ((1540483477 * (e >>> 16) & 65535) << 16)); } switch (n) { case 3: o ^= (255 & t.charCodeAt(i + 2)) << 16; case 2: o ^= (255 & t.charCodeAt(i + 1)) << 8; case 1: o = 1540483477 * (65535 & (o ^= 255 & t.charCodeAt(i))) + ((1540483477 * (o >>> 16) & 65535) << 16); } return o = 1540483477 * (65535 & (o ^= o >>> 13)) + ((1540483477 * (o >>> 16) & 65535) << 16), (o ^= o >>> 15) >>> 0; }; const __hash_b = function(t) { return String.fromCharCode(t + (t > 25 ? 39 : 97)); }; const __hash_c = function (r) { var e = "", n = void 0; for (n = r; n > 52; n = Math.floor(n / 52)) { e = __hash_b(n % 52) + e; } return __hash_b(n % 52) + e; }; const __hash = function(e) { return __hash_c(__hash_a(e)); }; function __hash_componentId_prefix(t) { return t.replace(/[[\].#*$><+~=|^:(),"'`-]+/g, "-").replace(/(^-|-$)/g, "") } function __hash_componentId(i, s, n) { let p = ("string" != typeof n ? "sc" : __hash_componentId_prefix(n)); return p = p + '-' + __hash(p + i.toString()), s ? s + '-' + p : p; } (() => { console.log('[@] Тестирование выведенного алгоритма'); const hash_battle_stattable_entry_gun = function(v, e) { return __hash(v + [ "background: url('" + e +"');", 'background-position: center;', 'background-repeat: no-repeat;', 'background-size: contain;', 'width: 1em;', 'height: 1em;', 'margin-right: 0.25em;' ].join("\n") + "\n"); }; const consoleComponent = __hash_componentId(2); console.assert(consoleComponent == 'sc-bwzfXH'); console.assert(hash_battle_stattable_entry_gun(consoleComponent, '/play/static/images/resistances/firebird_resistance.168ef5d8.svg') == 'dXMOUQ'); console.assert(hash_battle_stattable_entry_gun(consoleComponent, '/play/static/images/resistances/scorpio_resistance.aefa178e.svg') == 'iCjKi'); console.log('[@] Тестирование завершено'); })(); За генерацию отвечают kotlinx.css.CSSBuilder и styled.StyledDOMBuilder и неидентифицируемый webpacked-скрипт с экспортируемой функцией default. Первый параметр в приведенном коде - componentId, получается перебором значений. В приведенном примере я получаю названия класса для отображения в таблице статистике для пушек огнемет и скорпион. Повторюсь, из-за наличия хешей в именах файлов с изображениями при изменении этих изображений название класса также будет изменено. Взять и изменить загруженные стили также можно отсюда: (() => { /** * Пример получения имени класса для кнопки "Играть" */ let loadedRulesCSS = Array.from(globalThis.document.querySelector('style[data-styled-components]').sheet.cssRules) .filter((e) => (e.selectorText)) // Фильтр: наличие селектора .filter((e) => (e.style)); // Фильтр: наличие стилей let loadedImagesInCSS = loadedRulesCSS .filter((e) => ('background-image' in e.style)) // Фильтр: наличие фонового изображения .filter((e) => (e.style['background-image'])); // Фильтр: наличие фонового изображения // Для примера: поиск конкретного изменяемого изображения и отвечающего за него класса: console.log(loadedImagesInCSS .filter((e) => (e.style['background-image'].includes('.webp'))) .map((e) => ({selectorText: e.selectorText, image: e.style['background-image']})) .filter((e) => e.image.includes('/play/static/images/menu/videoplay.')) ); /* Результат: [{ selectorText: ".hIGTCJ", image: 'url("/play/static/images/menu/videoplay.28a9af84.webp")' }] */ })() -
[АПРГЕЙД ИНТЕРФЕЙСА] Убираем влево или вправо мешающие сообщения (лог битвы)
Purgamentum-exit ответил KissesKisses в теме Проблемы и решения
Нет. Не банят. Более того, такие действия никто не отслеживает. Чтобы отследить такие действия нужно сравнить результирующие стили для каждого элемента с эталонными, а это - очень много проблем. Ведь в каждом браузере, все по разному. При этом выявленное расхождение может означать, по факту, что угодно. Так что такой ерундой никто не занимается. Но модераторы форума, не разобравшись, могут наказать конкретно меня, за "распространение". Поэтому и перестраховался. -
[АПРГЕЙД ИНТЕРФЕЙСА] Убираем влево или вправо мешающие сообщения (лог битвы)
Purgamentum-exit ответил KissesKisses в теме Проблемы и решения
Можно. Самый простой вариант - это запустить клиент с параметром "--openDevTools", в открывшемся окне перейти на вкладку "Console" или "Консоль", ввести туда это: window.document.head.appendChild(window.document.createElement('style')).innerHTML = '[data-style="BattleMessagesComponentStyle-container"] { align-items: flex-start !important; padding-left: 1.1em; }'; Потом окно можно закрыть. Из плюсов - это никак не модифицирует клиент игры и полностью аналогично различным расширениям Chrome, из минусов - нужно делать каждый раз при запуске. Вообще, описанные действия никак не противоречат правилам игры. Согласно им, запрещено только "использование ботов, стороннего ПО, программных ошибок Игры", а данные действия к ним не относятся. Также, они полностью аналогичны различным userscript'ам. Но на всякий случай скажу, что описанные действия я не предпринимал. Далее идут только умозрительные ситуации, которые на практике я, разумеется не применял. И даже не пытался. И вообще, написал все это не я. -
4032
-
на рассмотрении Лог операций, покупок
Purgamentum-exit ответил Purgamentum-exit в теме Лог операций, покупок Идеи и предложения
Предлагаю добавить в интерфейс логи действий пользователя, в котором отразить операции с танкоинами, премиум-аккаунтом и долгосрочным пополнением танкоинов (через миссию). В данный момент невозможно определить, когда и на какой срок пользователь пополнял те или иные ресурсы, когда и как он их тратил. Например, при покупке спецпредложения с долгосрочным пополнением танкоинов (реализованном через отдельную миссию), пользователь может отслеживать оставшиеся дни только при входе в игру, до получения танкоинов. Также это снимет нагрузку на техподдержку, сняв вопросы вида: "почему у меня так мало танкоинов, было же больше?", "зачелся ли платеж?", "а покупал ли я это спецпредложение?", "применилась ли скидка?", ит.д. Предлагаю отображать следующие виды операций: операции через платежные системы: пополнение танкоинов через платежные системы, покупка премиум-аккаунта через платежные системы, покупка предложения с долгосрочным пополнением танкоинов через платежные системы, иные операции пополнения танкоинов: открытие старых контейнеров, открытие недельного контейнера, получение в челлендже, получение за участие в событиях ("Танкофонд", "Вызов принят", ит.д.) все виды трат танкоинов: покупки предложений в магазине, смена ника, покупка устройств, покупка абонемента для создания клана Предлагаю оформить в виде трех таблиц: операции через платежные системы: дата и время операции платежная система сумма и валюта покупки (например, "10 RUB") вид и количество получаемого ресурса (например, "100 TNK") иные операции пополнения танкоинов: дата и время операции описание операции (например, "Участие в Танкофонде") вид и количество получаемого ресурса (например, "100 TNK") все виды трат танкоинов: дата и время операции описание операции (например, "Покупка в магазине: 100 CRY", "Покупка устройства: Иммунитет от оглушения") вид и количество потраченного ресурса (например, "100 TNK") В связи с распространением двухфакторной аутентификации данные сведения больше не представляют собой ключевую информацию, позволяющую однозначно идентифицировать владельца аккаунта. Кроме того, уникальные сведения (например, последние 4 цифры владельца карты, номер телефона, номер чека или квитанции, ит.д.) не разглашаются.
Перейти к содержимому














































































