Jump to content
Korean Random

Leaderboard


Popular Content

Showing content with the highest reputation since 08/20/2021 in all areas

  1. 2 points
    Мод по сбору внутриигровой статистики Оглавление Версия 0.0.7 (MVP) Уже реализована MVP версия собирающая информацию о появление трассера, и строящая на её основе различные аналитические графики. Посмотреть можно тут https://wotstat.soprachev.com. Исходники мода в опенсорс. Математический кусок сервера не выкладываю, тк там неправильный способ расчёта пересечения трассера и круга разброса. Правильный вот. Реализую его КТТС и тоже залью Сейчас сервер на c#, бд -- PostgreSQL. Версия 1.0 [В разработке] Сервис который собирает события боя и сохраняет их в базу данных. Любой бой будет начинаться с события загрузки боя, заканчиваться его результатом. Микросервисная архитектура полностью в опенсорс. Описание читать тут. Список событий тут. Исходник мода тут. CI/CD настроен так, что на каждое изменение основной ветки, обновляется состояние на dev.wotstat домене На фронте будет рисовать график событий от времени. Раздел аналитики даст возможность рисовать любые графики с выбором по осям. Экспериментально Записывать по аренам, если в одном бою несколько человек с модом, запишется 1 раз. Перемещение танков раз в 10 метров Полное состояние карты Хочу попробовать пройтись машинным обучением, и обучать нейросеть советовать позиции в зависимости от состояния боя. Думаю это будет крайне полезно большинству игроков. В чем преимущество моего решения перед другими Я позволяю строить аналитику по абсолютно произвольным выборкам в любой момент времени, каждый может натыкать любые фильтры и тут же получить по ним график. Всё бесплатно и я не планирую как либо монетизировать этот проект РЕПОЗИТОРИЙ С ИСХОДНИКАМИ Чтоб не потерялось Пересечение трассера и разброса url url url Связь выстрела и попадания url Механика отрисовки сведения url
  2. 2 points
    1.14 – – XVM (конфиг 20.09.21).zip ---
  3. 2 points
    Программа обновлена: Версия: 2.3.0.1 Изменения: Исправлено создание атласов для World of Warships в консольном режиме.
  4. 2 points
    battleLoadingTips.xc // Rank badge definition. // Шаблон иконки бэйджа. "rankBadgeIcon": { "enabled": true, // true - disable badge icons. // true - убрать отображение иконки нашивки. "removeRankBadgeIcon": false,
  5. 2 points
    Я бы сказал, что УЖЕ забил. И конечно же рад за автора , что у него такой хороший и длиннющий отпуск. НА форуме мода показывающего наблюдателей, автор написал - у меня проблемы со здоровьем , тянуть мод не могу, коды продал, всем спасибо и досвидания. Все всё прекрасно поняли, пожелали автору выздоровления и всего лучшего !!!! Вот как поступают ЛЮДИ с большой буквы !!! В моде глючил конфиг, но мод частично работает в 1.14.0.1
  6. 2 points
  7. 2 points
    Очень жаль, если шкурки умрут. Хорошие и глаза не мозолят во время игры. Очень надеюсь, что передумаете.
  8. 2 points
    Всем привет ребята! Не хочу больше создавать надежды и иллюзии, продолжения разработки/поддержки модов с моей стороны больше не будет. Тема танков для меня уже давно закрыта, поменялись приоритеты и интересы... Как-нибудь найду время и обновлю последний раз архивы, за одно удалю выше упомянутые модели. (Если есть ещё какие не рабочие шкурки, пишите) Огромное спасибо всем за помощь, поддержку и добрые слова! На последок, если есть желающие продолжить творение, милости прошу, после одобрения Владимира, предоставлю все данные по форуму и естественно первое время смогу поддержать и дать совет. всем удачи!
  9. 1 point
    И снова здравствуйте. Без долгих разглагольствований: Загрузчик звуков (BanksLoader) Чисто технически, это автоматический редактор engine_config.xml и audio_mods.xml. Сделано, чтобы пользователям не приходилось самим править их при установке нескольких модов. Мод работает с копией конфига, которую сам же и помещает в res_mods/текущая_версия. Это позволяет обеспечить их бесперебойную работу в любых комбинациях. Создателю звукового мода достаточно включить в архив мой скрипт. Скрипт автоматически на машине пользователя обеспечит совместимость, к примеру, тех же "Громовых Орудий" с ПроТанками, Аннонсером, Гудками, звуком подрыва БК или чем-либо еще. Технические подробности использования при создании модов Настройка Список изменений Скачать Инъектор звуковых событий (SoundEventInjector) Достаточно небольшой по коду, но очень мощный по функционалу скрипт. Позволит авторам звуковых модификаций не править xml-скрипты с описаниями модулей техники и прочей системной информации, а проводить контролируемую инъекцию информации о звуковых событиях в клиент игры. Плюсы: Нет папки scripts/item_defs. Нечему ломаться при любом микрообновлении. Не используется gui/sound_notifications.xml. Вся настройка вынесена в отдельные от клиента игры настроечные файлы. Минусы: Если сломается питон-составляющая мода - рухнут все, кто от него зависят. Клиент игры запускается дольше. Где-то на 5 секунд. Довольно большой объем работы при переводе звукового мода со старого формата (xml-скрипты) на новый (JSON-конфиги для мода). Несмотря на минусы, перекрываемые (и довольно тесно связанные с) плюсами, модификация довольно быстро набирает популярность. Настройка Список изменений Спасибки Скачать Оповещение о количестве фрагов и окончании боя (UT_announcer) Технически, это - полная переработка вот этого модика. Только код переписан практически с нуля и добавлена пара приятных плюшек. Мод умеет в: Оповещение звуком о времени до конца боя: 15 минут (начало), 5 минут, 3 минуты, 2 минуты, 1 минута, 30 секунд, 10 секунд, 5 секунд, конец боя. Оповещение звуком и текстом о пролитой Первой Крови (самый первый, только игрок, игрок или союзник, игрок или противник, все три категории) Оповещение звуком о количестве фрагов (только игрок, игрок и те фраги, которые больше, чем у него, все фраги на поле боя) Оповещение звуком и текстом о полученных медалях за фраги (только игрок, игрок и союзник, противник, все вышеперечисленные) Оповещение звуком и текстом о взводных медалях (Братья по Оружию и Решающий Вклад), а также об отмене первой из них и об отмщении за взводного. Все пункты, кроме последнего, можно настроить или отключить. В том числе, можно оставить только текст или только звук. P.S. Модуль vxBattleFlash обязателен для работы, без него текста в бою не будет. PYmodsCore - просто обязателен. Настройка Список изменений Спасибки Скачать Гудки в Мире Танков (Horns) При нажатии на кнопку (настраивается, по умолчанию - G) раздаётся гудок, как при нажатии на клаксон. Дополнительно к этому, в чат выводится сообщение, читаемое из конфигурационного файла (3 типа сообщений в зависимости от типа цели: Союзник\Противник\Все остальное.). Настройка Список изменений Спасибки Скачать
  10. 1 point
    Данная тема предназначена для тестирования и предложений по расширенному установщику XVM. В отличии от стандартного установщика XVM, здесь добавлено ещё два окна: На данный момент инсталлятор устанавливает только файлы конфигурации, то есть перед использованием данного инсталлятора, необходимо установить XVM. Список настроек: Боевой интерфейс Миникарта Альтернативный режим миникарты Выбор клавиши включения альтернативного режима (CTRL или ALT) Отображение очков прочности Очки прочности Увеличение миникарты при нажатии клавиши CTRL Увеличение по центру экрана Панель игроков Отключение отображения статистки Отображение очков прочности Маркеры над техникой Рейтинг - звезда Лог полученного урона Включение подложки лога Лог нанесенного урона Группировать попадания по игроку Добавлять значения сверху Заголовок лога нанесенного урона "Новый" заголовок "Старый" заголовок Прицел Время полета снаряда (только в стратегическом режиме прицела) Время до полного сведения (только в стратегическом режиме прицела) Параметры камеры Отключение подсказок (переход в осадный режим, альт.режим АРТ-САУ) Отключение затемнения в снайперском режиме Отключение красной вспышки при получении урона Отключение эффекта отдачи от выстрела Отключение индикатора приближения (zoom) Индикатор суммарного очков прочности команд Средний урон на текущей технике Урон для получения медали "Основной калибр" Отображение на панели счета живых вместо мертвых Несколько изображений для "Шестого чувства" (лампочки) Таймер "Шестого чувства" 10 секунд Отключение панели после смерти Отключения зеркалирования иконок танков Ангар Автоматический вход в игру Панель техники (карусель) Автовозврат экипажа Возврат экипажа по умолчанию Счетчики уведомлений "Внешний вид" Замки Боны Свободный опыт Золото Отображение количества игроков на серверах В ангаре На экране логина Отображения пинга до серверов В ангаре На экране логина Кнопка "Купить премиум" Кнопка "Премиум магазин" Реклама премиум техники Виджеты Часы Статистика игрока Цветовые схемы Цветовая слепота Звуки "Шестое чувство" Если вы автор достаточно популярного конфига и хотите распространять его вместе с XVM, пишите. Если у кого-нибудь есть возможность заняться переводом, был бы благодарен. Инструкция по добавлению новых пунктов в окне "Настройка конфигурации": Настройка пунктов осуществляется в файле \installerXVM\src\SettingsInstall\default\default.xc. Описание параметров: "name" - название пункта, обязательный параметр. Здесь может быть указан ключ из файла перевода. Файлы перевода находятся в \installerXVM\src\SettingsInstall\default\l10n\ секция [CheckListBox]. "description" - подробное описание пункта. Здесь может быть указан ключ из файла перевода. Файлы перевода находятся в \installerXVM\src\SettingsInstall\default\l10n\ секция [DescriptionLabel]. "itemType" - задает отображение пункта, как radioButton, checkBox или group. Значение по умолчанию CheckBox. "checked" - определяет выбран пункт (radioButton, checkBox) или нет. Может иметь значения true или false. Значение по умолчанию true. "imageIfSelected" - имя файла изображения, которое будет отображаться, если пункт выбран. Значение по умолчанию "empty.png". "imageIfNotSelected" - имя файла изображения, которое будет отображаться, если пункт не выбран. Значение по умолчанию "empty.png". "soundIfSelected" - имя звукового файла (mp3, ogg), который будет проигран, если пункт выбран. Значение по умолчанию "". "soundIfNotSelected" - Имя звукового файла (mp3, ogg), который будет проигран, если пункт не выбран. Значение по умолчанию "". "valueIfSelected" - секция, значение которой будут вноситься в конфиг, если пункт выбран. Если параметр равен "", то изменения в конфиг не вносятся. Значение по умолчанию "". "valueIfNotSelected" - секция, значение которой будут вноситься в конфиг, если пункт не выбран. Если параметр равен "", то изменения в конфиг не вносятся. Значение по умолчанию "". "configFileName" - имя файла конфигурации, в который будут вносится изменения из секции "value". "value" - значение данного параметра будет внесено в файл конфигурации, указанный в параметре "configFileName". "isAdd" - определяет, буду элементы массива, описанного в секции "value", добавлены (true), или массив будет полностью заменен (false). Значение по умолчанию true. "@files" - в данном параметре в квадратных скобках перечисляются через запятую файлы, которые будут скопированы при установке в каталог с игрой. "children" - секция, в которой настраиваются подпункты данного пункта. Значение по умолчанию "". Структура каталога \installerXVM\src\SettingsInstall\default\: каталог config - содержимое данной папки будет скопировано в каталог с игрой. каталог files - в данной папке находятся файлы, которые указаны в параметрах "@files". каталог images - в данной папке находятся файлы, которые указаны в параметрах "imageIfSelected" и "imageIfNotSelected". каталог l10n - в данной папке находятся файлы перевода. каталог sounds - в данной папке находятся файлы, которые указаны в параметрах "soundIfSelected" и "soundIfNotSelected". Для сборки необходимо использовать Inno Setup 6. Инсталлятор: setup_xvm_v2.exe Исходники: installerXVM.zip
  11. 1 point
    Цветные иконки танков в дереве исследований, результатах боя и в окне взвода. Подсмотрено у Aslain. '1 Вариант.' '7 Вариант.' 'Коричневая САУ' Автор идеи золотых иконок JimKazama
  12. 1 point
    Добрый день товарищи, может кто знает есть ли рабочий мод позволяющий отключать только 3d стили. В игре то есть галочки для отключения неисторичных камуфляжей и покрасок, но вот стили он не отключает, ну или же они являются историчными, но мне они совсем не нужны ибо слишком много в последнее время ВГ вешает ненужных элементов( типа зениток, мотоциклов, снегоходов и т.д) как по мне так это уже перебор и выглядит совсем не исторично.
  13. 1 point
    и в 14 строке нет? "ignoredServers": [ ],
  14. 1 point
    Доброго времени суток! У goofy67 есть такой мод, там все можно отключить в том числе и 3д стили. Загуглите LimpidStickers
  15. 1 point
  16. 1 point
    Раздача игр Void Bastards и Yooka-Laylee в Epic Games Store продлится до 26.08.2021 18:00.
  17. 1 point
    Добрый день и вам. Ну скажем так, была разработана платка где все компоненты совмещены, сделано было 40 таких платок (2 комплекта). Сильно покопал тему перемещения в пространстве, пока сильно не получается допилить из-за отсутствия большого помещения для расчетов триангуляции. Разработал похожий прототип для обновленного датчика ICM-20948, работает не хуже. Перевел передачу протокола между датчиками и точкой доступа на mqtt-sn. С одной стороны вроде толкаю его, с другой плохо толкается, так что не сильно усердствую. Как то так.
  18. 1 point
    Всё таки удалось ВГ поломать этот мод: Попробовал включить плагин AutoAimExtension - ствол прилип на одном месте и раздуплялся только на 3 минуте боя, после всяких дерганий. Отключил его обратно, но в этом микропатче появились ошибки в питон-логе, указывающие на этот мод.
  19. 1 point
    А другого способа нет. Только та информация, что прислал сервер. from Avatar import PlayerAvatar from Vehicle import Vehicle from VehicleEffects import DamageFromShotDecoder from Math import Matrix, Vector3 @BigWorld.new_overrideLib.registerEvent(Vehicle, 'showDamageFromShot', DEBUG_MAIN) def new_showDamageFromShot(self, attackerID, points, effectsIndex, *a, **k): #Это попадание в модель танка .... #Декодирование точки и вектора попадания выглядит так decodedPoints = DamageFromShotDecoder.decodeHitPoints(points, self.appearance.collisions) if decodedPoints: firstHitPoint = decodedPoints[0] compMatrix = Matrix(self.appearance.compoundModel.node(firstHitPoint.componentName)) firstHitDirLocal = firstHitPoint.matrix.applyToAxis(2) firstHitDir = compMatrix.applyVector(firstHitDirLocal) firstHitDir.normalise() firstHitPos = compMatrix.applyPoint(firstHitPoint.matrix.translation) @BigWorld.new_overrideLib.registerEvent(PlayerAvatar, 'explodeProjectile', DEBUG_MAIN) def new_explodeProjectile(self, shotID, effectsIndex, effectMaterialIndex, endPoint, velocityDir, *a, **k): #Попадание снаряда в землю #Декодирование не требуется, т.к. endPoint, velocityDir и есть точка и вектор попадания Все верно, только если игра запущена и мод смог перехватить onBattleResultsReceived. Ниже древний пример, когда-то давно делал мод, что-то может изменилось, но не принципиально. import BigWorld __version__ = 'V1.1 P2.7 W0.9.10 26.10.2015' __author__ = 'StranikS_Scan' # Protected code ----------------------------------------------------------------- # WPG-mode ---------------------------------------------------------------- from os import path import BattleReplay from gui.shared.utils.HangarSpace import g_hangarSpace from gui import SystemMessages from PlayerEvents import g_playerEvents import constants from gui.battle_control.arena_info import getArenaGuiTypeLabel from helpers import isPlayerAccount, getFullClientVersion from ConnectionManager import connectionManager from datetime import datetime from functools import partial def WPG_PrintMessage(msg, INF): if len(msg)>0: if g_hangarSpace is not None and g_hangarSpace.inited: msg = '<textformat><font color="#E2D2A2" size="15"><b>WPG:</b></font><br><br>' + \ ('<font color="#E2D2A2" size="14">%s</font></textformat>' % msg) SystemMessages.pushMessage(msg, INF) else: BigWorld.callback(1.0, partial(WPG_PrintMessage, msg, INF)) class WPG_ResultDump(object): def __init__(self): g_playerEvents.onAccountBecomePlayer += self.__onAccountBecomePlayer g_playerEvents.onAvatarReady += self.__onAvatarReady g_playerEvents.onBattleResultsReceived += self.__onBattleResultsReceived self.Info = {} self.LogPath = './wpg_log' def __onAccountBecomePlayer(self): if not isPlayerAccount(): return else: player = BigWorld.player() if player.databaseID is None: BigWorld.callback(0.1, self.__onAccountBecomePlayer) else: self.Info['PlayerID'] = player.databaseID return def __onAvatarReady(self): def getBattleCount(accountDBID): import urllib2 import json request = 'http://api.worldoftanks.ru/wot/account/info/?application_id=demo&fields=statistics.all&account_id=%s' % accountDBID data = json.loads(urllib2.urlopen(request).read())['data'] player = data.get(str(accountDBID), None) if player != None: return int(player['statistics']['all']['battles']) return -1 if not BattleReplay.isPlaying() or 'PlayerID' in self.Info: player = BigWorld.player() self.Info['PlayerName'] = player.name self.Info['BattleNo'] = getBattleCount(self.Info['PlayerID']) + 1 self.Info['PlayerVehicleID'] = player.playerVehicleID self.Info['VehicleName'] = BigWorld.entities[player.playerVehicleID].typeDescriptor.name.replace(':', '-') arenaName = player.arena.arenaType.geometry i = arenaName.find('/') if i != -1: arenaName = arenaName[i+1:] self.Info['MapName'] = '%s(%s)' % (player.arena.arenaType.name, arenaName) self.Info['BattleType'] = getArenaGuiTypeLabel() self.Info['BattleLevel'] = player.arena.extraData.get('battleLevel') now = datetime.now() self.Info['Date'] = '%02d.%02d.%04d %02d:%02d:%02d' % (now.day, now.month, now.year, now.hour, now.minute, now.second) self.Info['ServerName'] = connectionManager.serverUserName self.Info['RegionCode'] = constants.AUTH_REALM self.Info['ClientVersion'] = getFullClientVersion() return def __onBattleResultsReceived(self, isPlayerVehicle, results): if not BattleReplay.isPlaying(): import json, copy from random import randint from struct import pack from os import path, mkdir if isPlayerVehicle and 'PlayerID' in self.Info: try: self.Info['BattleStatistics'] = BigWorld.player().arena.statistics vehicles = {} for k, v in BigWorld.player().arena.vehicles.iteritems(): vehicle = copy.copy(v) vehicle['vehicleType'] = v['vehicleType'].name if v['vehicleType'] is not None else '' del vehicle['forbidInBattleInvitations'] del vehicle['prebattleID'] del vehicle['isPrebattleCreator'] del vehicle['isAvatarReady'] del vehicle['potapovQuestIDs'] del vehicle['igrType'] del vehicle['events'] vehicles[k] = vehicle self.Info['ArenaVehiclesInfo'] = vehicles modifiedResults = copy.deepcopy(results) allPlayersVehicles = modifiedResults.get('vehicles', None) if allPlayersVehicles is not None: for playerVehicles in allPlayersVehicles.itervalues(): for vehicle in playerVehicles: vehicle['damageEventList'] = None personals = modifiedResults.get('personal', None) if personals is not None: for personal in personals.itervalues(): for field in ('damageEventList', 'xpReplay', 'creditsReplay', 'tmenXPReplay', 'fortResourceReplay', 'goldReplay', 'freeXPReplay'): personal[field] = None details = personal.pop('details', None) if details is not None: modifiedDetails = dict() for key, value in details.iteritems(): modifiedDetails[str(key)] = value personal['details'] = modifiedDetails self.Info['BattleResults'] = modifiedResults dump = [] dump.append('========================================================') dump.append(' WPG - BATTLE RESULT ') dump.append(" DON'T REWRITE OR MODIFIED THIS FILE ") dump.append('========================================================') dump.append('') dump.append('PlayerName: %s' % self.Info['PlayerName']) dump.append('PlayerID: %s' % self.Info['PlayerID']) dump.append('BattleNo: %s' % self.Info['BattleNo']) dump.append('') dump.append('PlayerVehicleID: %s' % self.Info['PlayerVehicleID']) dump.append('VehicleName: %s' % self.Info['VehicleName']) dump.append('MapName: %s' % self.Info['MapName']) dump.append('BattleType: %s' % self.Info['BattleType']) dump.append('BattleLevel: %s' % self.Info['BattleLevel']) dump.append('') dump.append('Date: %s' % self.Info['Date']) dump.append('ServerName: %s' % self.Info['ServerName']) dump.append('RegionCode: %s' % self.Info['RegionCode']) dump.append('') dump.append('ClientVersion: %s' % self.Info['ClientVersion']) dump.append('WPGVersion: %s' % __version__) dump.append('') dump.append('BattleStatistics:') dump.append(json.dumps(self.Info['BattleStatistics'], sort_keys=True).replace(',',',\n')) dump.append('') dump.append('ArenaVehiclesInfo:') dump.append(json.dumps(self.Info['ArenaVehiclesInfo'], indent=2, sort_keys=True)) dump.append('') dump.append('BattleResults:') dump.append(json.dumps(self.Info['BattleResults'], indent=2, sort_keys=True)) dump.append('') dump.append('') dump = '\n'.join(dump) self.LogFile = '%s_%d_%s.wpgr' % (self.Info['PlayerName'], self.Info['BattleNo'], self.Info['Date'].replace('.','').replace(':','').replace(' ','_')) except Exception as E: WPG_PrintMessage('Work was interrupted by the error!\n\n%s' % E, SystemMessages.SM_TYPE.Error) else: try: if not path.exists(self.LogPath): mkdir(self.LogPath) with open(self.LogPath+'/'+self.LogFile,'w') as f: f.write(dump) except Exception as E: WPG_PrintMessage('Was unable to save the wpgr-file!\n\n%s' % E, SystemMessages.SM_TYPE.Error) else: WPG_PrintMessage('Battle result saved in %s' % self.LogFile, SystemMessages.SM_TYPE.GameGreeting) self.Info = {} return __WPG_ResultDump = WPG_ResultDump() WPG_PrintMessage('- Statistics mode loaded successfully;\n'+\ '- Do not leave the battle before its completion;\n'+\ '- Files with results will be saved as \'%s/*.wpgr\'.' % __WPG_ResultDump.LogPath.replace('.',''),\ SystemMessages.SM_TYPE.GameGreeting)
  20. 1 point
    19.08.21 Обновлена сборка модов: * Обновлено для версии игрового клиента v1.14.0.1 * Обновлён мод "Комплексный мод XVM" до версии v8.8.2-dev (0020)
  21. 1 point
    очередное переименование папки,ну и мелкие правки заодно.
  22. 1 point
    @Pelm , открой файл: hitLog.xc Замени: "addToEnd": false, на "addToEnd": true, И в двух строках: <textformat tabstops='[30,39,69,78]' leading='-5'> На: <textformat tabstops='[20,50,59,89,98]' leading='-5'>{{number%2d~.}}<tab>
  23. 1 point
    Ну пока с восьмеркой сначала надо разобраться. Потом уже и до 9 и 10 надеюсь руки дойдут @Slava7572, 9-ка по быстрому (SD) Cz16_TNH_T_vz51.zip
  24. 1 point
    обновлено под новый патч
  25. 1 point
  26. 1 point
    Делал чисто для себя, SD. подарок от wg завтрашний: R185_T_34_L_11_1941.zip чех ТТ восьмерка: Cz18_TNH_105_1000.zip
  27. 1 point
    Проблема с одним из серверов. Ведётся работа по исправлению. Кнопка входа снова доступна. В ближайшее время возможны прерывания доступности сервисов.
  28. 1 point
    Итак, 1.14 (залью, как смогу пропихнуть архивы через интернет на море). КамоСелектор: Исправлены невидимые танки в Ангаре Учебного Полигона при включенных случайных камуфляжах. Исправлен появившийся в 1.14 краш игры. PYmodsCore: Исправлен слетающий уровень прогрессионного стиля при перезагрузке танка в предпросмотре стиля. Добавлен атрибут LOG, чтобы вместо print g_config.ID + ': stuff' можно было писать print g_config.LOG, 'stuff'.
  29. 1 point
    Петиция. Убрать К ЧЕРТЯМ чёртову ЛБЗ на фраг тараном на тяжёлом танке. Я убил N часов своей жизни на это дерьмо. Один раз союзный Гвардеец в сантиметре от моей ВЛД фраг увёл. ЭТО НЕВОЗМОЖНО ВЫПОЛНИТЬ В ТЕКУЩЕЙ МЕТЕ Особенно учитывая балансировщик, который просто отказывается кидать восьмёрки в одноуровневый бой. Меня сейчас на моём Т34 спустя минуту с начала боя ваншотнула сраная FV4005.
  30. 1 point
    Немного про механику игры, исходя из клиентского кода Разброс в механике игры задается сервером как тангенс половинного угла разброса орудия dispersionAngle. Эту цифру сервер обсчитывает с тиком 0,1 сек и шлет клиенту игры. Вычисляет её он как функцию от динамических характеристик танка, путем применения дополнительных коэффициентов к базовому тангенсу разброса орудия, прописанному в файлах ТТХ для дистанции 100 метров. Все эти коэффициенты и формулу можно посмотреть в коде игры, они дублируют расчеты на сервере чтобы сглаживать движение объектов в клиенте игры. Расчеты в клиенте вынесены в отдельную функцию getOwnVehicleShotDispersionAngle. Ниже её код, а вот тут его разбор в числах, правда он мог немного устареть. def getOwnVehicleShotDispersionAngle(self, turretRotationSpeed, withShot=0): descr = self.__getDetailedVehicleDescriptor() aimingStartTime, aimingStartFactor, multFactor, gunShotDispersionFactorsTurretRotation, chassisShotDispersionFactorsMovement, chassisShotDispersionFactorsRotation, aimingTime = self.__aimingInfo vehicleSpeed, vehicleRSpeed = self.getOwnVehicleSpeeds(True) vehicleMovementFactor = vehicleSpeed * chassisShotDispersionFactorsMovement vehicleMovementFactor *= vehicleMovementFactor vehicleRotationFactor = vehicleRSpeed * chassisShotDispersionFactorsRotation vehicleRotationFactor *= vehicleRotationFactor turretRotationFactor = turretRotationSpeed * gunShotDispersionFactorsTurretRotation turretRotationFactor *= turretRotationFactor if withShot == 0: shotFactor = 0.0 elif withShot == 1: shotFactor = descr.gun.shotDispersionFactors['afterShot'] else: shotFactor = descr.gun.shotDispersionFactors['afterShotInBurst'] shotFactor *= shotFactor idealFactor = vehicleMovementFactor + vehicleRotationFactor + turretRotationFactor + shotFactor additiveFactor = self.__getAdditiveShotDispersionFactor(descr) idealFactor *= additiveFactor ** 2 idealFactor = multFactor * math.sqrt(1.0 + idealFactor) currTime = BigWorld.time() aimingFactor = aimingStartFactor * math.exp((aimingStartTime - currTime) / aimingTime) isGunReloading = self.guiSessionProvider.shared.ammo.isGunReloading() if aimingFactor < idealFactor: aimingFactor = idealFactor self.__aimingInfo[0] = currTime self.__aimingInfo[1] = aimingFactor if abs(idealFactor - multFactor) < 0.001: if not self.__isAimingEnded and not isGunReloading: self.soundNotifications.play('sight_convergence') self.__isAimingEnded = True elif idealFactor / multFactor > 1.1: self.__isAimingEnded = False elif aimingFactor / multFactor > 1.1: self.__isAimingEnded = False return [descr.gun.shotDispersionAngle * aimingFactor, descr.gun.shotDispersionAngle * idealFactor] В механике игры снаряды летят по параболе, параметры которой зависят от дистанции от танка игрока до точки прицеливания. Сервер в игре вычисляет дистанции по прямой, либо от опорной точки модели танка, либо от точки вылета снаряда. При этом снаряд на всех моделях вылетает из точки крепления пушки, она же опорная точка орудия (трассер кстати рисуется из другой точки, из конца орудия - элемент модели _GunFire). Первое юзается в механике маскировки и в засвета, второе в баллистике и прицеливании. Опорная точка пушки вычисляется, например так: startPoint = player.getOwnVehiclePosition() startPoint += player.vehicleTypeDescriptor.hull.turretPositions[0] + player.vehicleTypeDescriptor.turret.gunPosition Дистанция прицеливания вычисляется в той точке, в которую указывает маркер игрока, т.е. в точке пересечения луча из маркера, ортогонального плоскости монитора, с поверхностью игрового мира. В клиенте есть код на её вычисление, поэтому самому считать не надо, а можно брать готовое значение из: markerPos = player.gunRotator.markerInfo[0] Отсюда получается, что дистанция от танка игрока до точки прицеливания в механике стрельбы это всегда: markerDist = startPoint.distTo(markerPos) Тогда радиус круга разброса в точке прицеливания для любого танка это: dispersionRadius = player.gunRotator.dispersionAngle * markerDist В клиенте игры это все есть в коде, который отвечает за отрисовку сведения. Для этого используются следующие функции: 1. Внеклассовая функция расчета баллистических параметров в точке прицеливания getCappedShotTargetInfos def getCappedShotTargetInfos(shotPos, shotVec, gravity, shotDescr, vehicleID, minBounds, maxBounds, collisionStrategy): endPos, direction, collData, usedMaxDistance = BigWorld.wg_getCappedShotTargetInfos(BigWorld.player().spaceID, shotPos, shotVec, gravity, shotDescr.maxDistance, vehicleID, minBounds, maxBounds, collisionStrategy) if collData != 0: collData = EntityCollisionData(*collData) else: collData = None return (endPos, direction, collData, usedMaxDistance) Она обсчитывает траекторию нативно, но как именно она считает можно глянуть под спойлером. В списке выходных параметров direction это вектор попадания снаряда с учетом баллистической траектории. 2. Классовая функция расчета баллистических параметров и разброса в точке прицеливания __getGunMarkerPosition, использующая функцию из п.1 def __getGunMarkerPosition(self, shotPos, shotVec, dispersionAngles): shotDescr = self._avatar.getVehicleDescriptor().shot gravity = Math.Vector3(0.0, -shotDescr.gravity, 0.0) testVehicleID = self.getAttachedVehicleID() collisionStrategy = AimingSystems.CollisionStrategy.COLLIDE_DYNAMIC_AND_STATIC minBounds, maxBounds = BigWorld.player().arena.getSpaceBB() endPos, direction, collData, usedMaxDistance = AimingSystems.getCappedShotTargetInfos(shotPos, shotVec, gravity, shotDescr, testVehicleID, minBounds, maxBounds, collisionStrategy) distance = shotDescr.maxDistance if usedMaxDistance else (endPos - shotPos).length markerDiameter = 2.0 * distance * dispersionAngles[0] idealMarkerDiameter = 2.0 * distance * dispersionAngles[1] replayCtrl = BattleReplay.g_replayCtrl if replayCtrl.isPlaying and replayCtrl.isClientReady: markerDiameter, endPos, direction = replayCtrl.getGunMarkerParams(endPos, direction) return (endPos, direction, markerDiameter, idealMarkerDiameter, collData) Как видим, диаметр круга разброса в точке прицеливания это удвоенное текущее значение тангенса половинного угла разброса орудия танка 2*dispersionAngles[0] помноженное на дистанцию distance = .... (endPos - shotPos).length между опорной точкой орудия shotPos и точкой прицеливания endPos. 3. Далее находим, где используется __getGunMarkerPosition. В функции обновления сведения прицела __updateGunMarker, которая вызывается пока игрок в бою с периодичностью 0,1 сек, что составляет тик сервера: def __updateGunMarker(self, forceRelaxTime=None): if self._avatar.getVehicleAttached() is None: return else: shotPos, shotVec = self.getCurShotPosition() markerPos, markerDir, markerSize, idealMarkerSize, collData = self.__getGunMarkerPosition(shotPos, shotVec, self.__dispersionAngles) replayCtrl = BattleReplay.g_replayCtrl if replayCtrl.isRecording and not replayCtrl.isServerAim: replayCtrl.setGunMarkerParams(markerSize, markerPos, markerDir) if not self.__targetLastShotPoint: self.__lastShotPoint = markerPos replayCtrl = BattleReplay.g_replayCtrl if replayCtrl.isPlaying and replayCtrl.isUpdateGunOnTimeWarp: self._avatar.inputHandler.updateGunMarker(markerPos, markerDir, (markerSize, idealMarkerSize), 0.001, collData) else: relaxTime = self.__ROTATION_TICK_LENGTH if forceRelaxTime is None else forceRelaxTime self._avatar.inputHandler.updateGunMarker(markerPos, markerDir, (markerSize, idealMarkerSize), relaxTime, collData) self.__markerInfo = (markerPos, markerDir, markerSize) if self._avatar.inCharge: self._updateMultiGunCollisionData() return А еще в дублирующей её setShotPosition, которая обеспечивает автовозвышение орудия танка и обновление, упомянутого выше публичного буфера player.gunRotator.markerInfo. 4. Теперь нужно лезть в дебри модулей, отвечающих за управление прицелом и отрисовку сведения через флэшку, именно туда ведет вызов _avatar.inputHandler.updateGunMarker из кода выше. Если опустить подробности то, передача данных идет через объект DataProvider, который по сути является прокладкой для передачи данных в код флэшки прицела. Здесь же стоит отметить, что версии провайдера разные для прицела арты и для остальных прицелов танков. Для прицела арты создается он так: def _makeSPGProvider(): dataProvider = GUI.WGSPGGunMarkerDataProvider(aih_constants.SPG_GUN_MARKER_ELEMENTS_COUNT, aih_constants.SPG_GUN_MARKER_ELEMENTS_RATE) dataProvider.positionMatrixProvider = Math.MatrixAnimation() dataProvider.maxTime = 5.0 dataProvider.serverTickLength = constants.SERVER_TICK_LENGTH dataProvider.sizeScaleRate = aih_constants.SPG_GUN_MARKER_SCALE_RATE dataProvider.sizeConstraint = (aih_constants.SPG_GUN_MARKER_MIN_SIZE, aih_constants.SPG_GUN_MARKER_MAX_SIZE) dataProvider.setRelaxTime(constants.SERVER_TICK_LENGTH) return dataProvider А для всех остальных вот так def _makeDefaultProvider(): dataProvider = GUI.WGGunMarkerDataProvider() dataProvider.positionMatrixProvider = Math.MatrixAnimation() dataProvider.setStartSize(_setupGunMarkerSizeLimits(dataProvider)[0]) return dataProvider Что означают доп.константы у прицела арты, думаю не сложно догадаться, их значения кстати вот такие: GUN_MARKER_MIN_SIZE = 32.0 SPG_GUN_MARKER_ELEMENTS_COUNT = 37 SPG_GUN_MARKER_ELEMENTS_RATE = 10 SPG_GUN_MARKER_MIN_SIZE = 50.0 SPG_GUN_MARKER_MAX_SIZE = 100.0 SPG_GUN_MARKER_SCALE_RATE = 10.0 Обращаем внимание на последний параметр, у сведения арты есть дополнительный коэф. масштаба SPG_GUN_MARKER_SCALE_RATE. Передача данных в провайдер прицела арты выглядит вот так: def update(self, markerType, position, direction, size, relaxTime, collData): super(_SPGGunMarkerController, self).update(markerType, position, direction, size, relaxTime, collData) positionMatrix = Math.Matrix() positionMatrix.setTranslate(position) self._updateMatrixProvider(positionMatrix, relaxTime) self._size = size[0] ################################################# self._update() def _update(self): pos3d, vel3d, gravity3d = self._getCurrentShotInfo() replayCtrl = BattleReplay.g_replayCtrl if replayCtrl.isPlaying and replayCtrl.isClientReady: self.__updateRelaxTime() self._updateDispersionData() self._dataProvider.update(pos3d, vel3d, gravity3d, self._size) def _getCurrentShotInfo(self): gunMat = AimingSystems.getPlayerGunMat(self._gunRotator.turretYaw, self._gunRotator.gunPitch) position = gunMat.translation velocity = gunMat.applyVector(Math.Vector3(0, 0, self._shotSpeed)) return (position, velocity, Math.Vector3(0, -self._shotGravity, 0)) ######################### def _updateDispersionData(self): dispersionAngle = self._gunRotator.dispersionAngle ######################### isServerAim = self._gunMarkerType == _MARKER_TYPE.SERVER replayCtrl = BattleReplay.g_replayCtrl if replayCtrl.isPlaying and replayCtrl.isClientReady: d, s = replayCtrl.getSPGGunMarkerParams() if d != -1.0 and s != -1.0: dispersionAngle = d elif replayCtrl.isRecording: if replayCtrl.isServerAim and isServerAim: replayCtrl.setSPGGunMarkerParams(dispersionAngle, 0.0) elif not isServerAim: replayCtrl.setSPGGunMarkerParams(dispersionAngle, 0.0) self._dataProvider.setupConicDispersion(dispersionAngle) В то время как для остальных танков вот так: def update(self, markerType, pos, direction, sizeVector, relaxTime, collData): super(_DefaultGunMarkerController, self).update(markerType, pos, direction, sizeVector, relaxTime, collData) positionMatrix = Math.Matrix() positionMatrix.setTranslate(pos) self._updateMatrixProvider(positionMatrix, relaxTime) size = sizeVector[0] idealSize = sizeVector[1] replayCtrl = BattleReplay.g_replayCtrl if replayCtrl.isPlaying and replayCtrl.isClientReady: s = replayCtrl.getArcadeGunMarkerSize() if s != -1.0: size = s elif replayCtrl.isRecording: if replayCtrl.isServerAim and self._gunMarkerType == _MARKER_TYPE.SERVER: replayCtrl.setArcadeGunMarkerSize(size) elif self._gunMarkerType == _MARKER_TYPE.CLIENT: replayCtrl.setArcadeGunMarkerSize(size) positionMatrixForScale = self.__checkAndRecalculateIfPositionInExtremeProjection(positionMatrix) worldMatrix = _makeWorldMatrix(positionMatrixForScale) currentSize = _calcScale(worldMatrix, size) * self.__screenRatio idealSize = _calcScale(worldMatrix, idealSize) * self.__screenRatio self.__sizeFilter.update(currentSize, idealSize) self.__curSize = self.__sizeFilter.getSize() if self.__replSwitchTime > 0.0: self.__replSwitchTime -= relaxTime self._dataProvider.updateSize(self.__curSize, 0.0) else: self._dataProvider.updateSize(self.__curSize, relaxTime) Рассмотрим сначала второй код. Для аркадного и снайперского прицелов размер сведения в пикселях вычисляется непосредственно в функции update() и затем отдается провайдеру. Для этого берется диаметр мгновенного значения круга разброса в текущей точке прицеливания size = sizeVector[0], высчитывается его масштаб для экрана игрока через функцию _calcScale и этот масштаб умножается на половину ширины экрана в пикселях self.__screenRatio. Последняя величина находится вот так self.__screenRatio = GUI.screenResolution()[0] * 0.5. Чтобы сведение в игре не было очень маленьким или очень большим, а оно будет таковыми, имеется фильтр self.__sizeFilter, который ограничивает минимально и максимально возможное значение круга сведения. Лимиты, которые задаются в него, вычисляются вот так: def _setupGunMarkerSizeLimits(dataProvider, scale=None): if scale is None: settingsCore = dependency.instance(ISettingsCore) scale = settingsCore.interfaceScale.get() limits = (aih_constants.GUN_MARKER_MIN_SIZE * scale, min(GUI.screenResolution())) dataProvider.sizeConstraint = limits return limits Переходим к арт-прицелу. У арты расчеты в пикселях в функции update() не выполняются, вместо этого данные о точке выстрела, векторах начальной скорости и гравитации и текущем диаметре круга разброса в точке прицеливания - pos3d, vel3d, gravity3d и self._size - передаются прямо в провайдер. А также в него передается текущее значение тангенса угла разброса орудия dispersionAngle. Что со всем этим делает провайдер WGSPGGunMarkerDataProvider сказать трудно, т.к. он нативный. Если глянуть список доступных атрибутов и функций у WGSPGGunMarkerDataProvider, то там можно увидеть: *** enableSmoothFiltering *** getPointsInside *** maxTime *** positionMatrixProvider *** relaxTime *** reset *** serverTickLength *** setRelaxTime *** setStartSize *** setupConicDispersion *** setupFlatRadialDispersion *** sizeConstraint *** sizeScaleRate *** update *** updateSize Функция setupFlatRadialDispersion тоже встречается в коде клиента игры. Это код, который отвечает за отрисовку новой игровой фичи - подсветки на игровом поле места, куда стреляет или будет стрелять арта. Код класса можно глянуть тут. В качестве аргумента в функцию передается игровая константа areaRadius.
  31. 1 point
    при каждом showTracer от себя запоминай его в словарь. при каждом showDamageFromShot от себя, бери последнее значение в словаре и присваивай результат выстрела.
  32. 1 point
  33. 1 point
    Мод обновлен изменения на картах. 01_karelia17_munchen19_monastery33_fjord60_asia_miao83_kharkiv
  34. 1 point
    https://worldoftanks.ru/ru/content/guide/ban/nonusefulmods/ - тут посмотри - должен быть 100% Тему можно закрывать.
  35. 1 point
    Больше твинков больше, колбасит же ситуация что люди узнают что есть другие моды без рекламы и баннеров.. Да и вообще ты хто чтобы делать свои умозаключения?
  36. 1 point
    нет это освещения с карты темный фронт для всех карт
  37. 1 point
    Позвал дружков минусики ставить на публику? И что ты тут опять несёшь? Если я падальщик то ты гараздо хуже, ты опустился уже до того что если выкладывается чистый мод который тебе неуместен ты стираешь тему, льёшь на уши людям гадости и банишь человека и всё это ради того чтобы сунуть свои баннеры в моды и зарабатывать копейки. Мало того что нету достоинства, так и чести нету подставляя простых людей под баны своими модами потому как все ссылки в игру прослеживаются. Именно ты угробил на последних банах кучу народа и всё из за денег. А сейчас ты тут пытаешься перевести разговор в другое русло и выставить себя порядочным. Поверь тебе аукнется всё твое скотство. Ты просто дичь.
  38. 1 point
    Пашка, то, что ты исправляешь вг-шные косяки конечно хорошо, но: 1. Неужели это так важно и влияет на игровой процесс, что без этого никак нельзя? Это прелюдия к следующему вопросу, на мой взгляд более важному)) 2. Ты когда будешь своими модами заниматься? Что по траекториям есть огрехи, что по маскмоду... Т.е. - у тебя есть более важные и нужные вещи, а ты х...й маешься))
  39. 1 point
    Тема создана для общения и взаимной поддержки пользователей модпака джова. Мы к данному модпаку никакого отношения не имеем и поддержку по нему не осуществляем. Автор сборки: не известен, формально Джов + авторы модов из сборки. Скачать модпак: страница загрузки В целях безопасности все загружаемые файлы рекомендуется проверять вашим антивирусом. Описание от автора:
  40. 1 point
  41. 1 point
    Потратил несколько вечеров чтобы переписать математику для платформы более простым и понятным языком, после просчета длин отрезков между точками соединения платформы и базы стало слишком сложно стараться описывать расчеты просто да и немного надоело. Если кому интересно будет - выложу эти расчеты, а может и доведу до конца. В итоге у меня есть полное понимание как именно работает платформа. И я перешел к следующему шагу, т.е. подключения её к ардуинке и заливке кода в неё. В качестве тестового кода пробовал этот код - практически слету все завелось. Осталось покопаться в "тонких настройках".
  42. 1 point
    Начал разбирать сваленную в кучу у меня документацию, и понял что я не то, что глубоко изучал, а даже поверхностно не понимаю что там и к чему. А было так вроде много понятно месяц назад. Ну да ладно, пока выкладываю то что есть на ноутбуке. Самым интересным и понятным файлом является екселевский с расчетами и графической моделью. На второй странице "DATA" есть весь пошаговый расчет нужных углов для сервоприводов. Дополнительно выявил несколько проблем у своей "платформы": Так как сервоприводы очень недорогие, имеется некоторая погрешность в каждом. Не корректно отрабатываются положения 0-180 - на глаз где-то 2-200/210 и есть упор физический - двигатель упирается, методом тыка выявил ориентировочно программно 0-165, соответствует визуальным 0-180. В общем каждый придется в ручную калибровать. Каждая пара сервоприводов красный/зеленый, желтый/синий, розовый/белый установлены зеркально соответственно то что у одного максимум 180 градусов, у второго 0, что в совокупности с предыдущей проблемой вообще обещает веселье. При подаче питания на сервоприводы, есть небольшое, порядка 10 градусов, движение. В какую сторону пока не определял, потому как был обрадован. Думал что при подаче напряжения уходят принудительно в 0 :) Кнопки сверху заменил на саморезики, кнопки на рычагах серв вроде сидят довольно уверенно. Нашелся проект который чем-то мне напомнил то что я хочу сделать. Управление из системного python 6-ю сервоприводами на Arduino, то что нужно - простая и понятная реализация, как раз для начала. P.S. Добавил ещё 4 документа. Кинематика параллельных манипуляторов квазиортогональной структуры.pdf Detecting Singularities of Stewart Platforms.pdf StewartPlatformSimulator.xlsm.tar.gz Stewart platform with fixed rotary actuators: a low cost design study.pdf The Mathematics of the Stewart Platform.pdf Строение, кинематика и испытания шестикоординатного манипулятора для модернизации технологических машин.pdf Stewart-Gough Platform Kinematics.pdf Стабилизация положений равновесия нагруженных модификаций платформы Стюарта.pdf Dynamic Modeling and Simulation of Stewart Platform.pdf Анализ и синтез манипуляционных роботов с механизмами параллельной структуры.pdf Использование кватернионов при математическом моделирвоании механизмов с параллельными кинематическими цепями.pdf Применение кватернионов в задачах ориентации твердого тела.pdf
  43. 1 point
    Всем привет .Оживил конфиг .!!!!!!!!!!!!!!!!! Обновлено под патч 1.14.0.2 .Wotstat_bes_1_1.14.0.2 с яндекс диска Размер: 22 МБ Обновлено: 06.09.2021 под патч 1,14,0,2 'Скриншоты' 'обновление'
  44. -1 points
    А теперь слушай меня, недочеловек с двумя членами за одной щекой: это мой сайт и я трачу на него свои собственные деньги, а вот ты лезешь не в своё дело. Запомни раз и навсегда: еще хоть раз услышу от тебя вяк в сторону моих модов, моего сайта, в сторону Стелза - у тебя могут быть большие проблемы. Это не угроза, это предупреждение.
  45. -1 points
    Реально у тебя моск уже атрофировался от передозов... Опять впариваешь хрень типо я сам создал....
  46. -1 points
    Виталь да оно же уделанное и обиженное, не тронь идиота оно и заноет сильней.Ему нужно внимание, а его нет потому как оно полный 0! А был когда то человек даже я верил и заступался, сейчас даже остаток человечного не осталось. У него мания преследования, а чел не понимает что он на.... ,никому не нужен давно.
  47. -1 points
    @xvm.xc "turret": ${"turret.xc":"turret"}, battleLabels.xc ${ "battleLabelsTemplates.xc":"def.turret"}, }, "turret": { "enabled": true, "x": 560, "y":8, "width": 400, "height": 100, "alpha": 100, "screenHAlign": "center", "shadow": { "distance": 2, "angle": 90,"alpha": 90, "blur": 1.5, "strength": 5 }, "textFormat": {"font": "Arial", "size": 15, "color": "0x4CFF00" }, // FFD800 "format": "{{.turret.{{vehiclename}}}}" }, turret.xc Hawg's WOT Discord Mod Tech & Questions
  48. -1 points
    Нет кнопки. Чистил кэш, куки, проветрил комнату, почистил зубы, постирал майку, помолился, ничего не помогает((
  49. -1 points
    Тут так-то тоже по-русски, профэссор
  50. -1 points
    появилась удивительно
×
×
  • Create New...