Jump to content
Korean Random

StranikS_Scan

Premium Member
  • Content Count

    7,769
  • Joined

  • Last visited

  • Days Won

    236

Everything posted by StranikS_Scan

  1. В патенте ничего такого нет, ты зря это пишешь. Вручную в своем посте пишешь тэги и после сохранения поста вебсайт сделает спойлер. [SPOILER] [/SPOILER] Красные кривые для EU, NA, RU разные наверно. Надо корреляции искать. Например между разбросом и % побед за сессию. Если даже исключить все посторонние факторы, то все равно будет также, т.к. неравномерность в графике - это и есть проявление случайности. Что и было доказано тобой путем симуляции. А вот если бы её не было или в графике прослеживалась бы четкая зависимость, то это как раз указывало бы на предопределенность, т.е. не случайные подкрутки - запрограммированные зависимости.
  2. Хорошую очистку клиента игры вам обеспечит только WMCleaner. Юзайте его консольным способом в своем модпаке. Аргументы командной строки есть в оф. теме. Ссылка в моей подписи.
  3. Нет, это в самой игре. А будет ли это реплей или реальный бой - не имеет значения. Лагать не будет, это очень слабая нагрузка.
  4. Да, знаю. На днях хочу глянуть какие вообще изменения по модулям ввели за эти годы и поправить везде у себя.
  5. А разве в таких случаях appearance не из кэша берется? Там же кэш вроде есть. Или я не про то написал.
  6. Обновление 1.3.1 Список изменений: 1. Восстановлена работа функции глубокого анализа каталогов клиента игры за счет получения информации с сервера обновлений WG 2. Внесены правки в интерфейс.
  7. Да, это вариант. Зная shotPos, velocityVect, gravityVect и HitPoint, по ним вычисляем аналитически реальный вектор снаряда в точке shotPos, после чего сравниваем его с исходным velocityVect. И всё. Больше ничего не требуется. Кода минимум. Ну тогда это всем другое дело. Клиентская часть не важна, она получается обычный и ничего не содержит важного. А код функции расчета дисперсии с сервера с пояснениями по расчетной модели можно и в теме запостить. Я бы исключил пулеметные танки. По крайней мере на первых порах. Это песок там всегда мало кого интересовало что и куда там летит. Ну да, там модифицированная версия распределения Релея с набросом точек в центре, иначе пригорать будет. А в последние два года тем еще правили это место искусственно. Новость на портале ВГ выходило об этих правках.
  8. Да, чуть не забыл, я выше писал, что сервер присылает нам тангенс угла разброса, однако возникает вопрос, как именно на сервере идет генерация разброса. В своё время Med443 показал (тыц, третий спойлер), что в танках сервер оперирует распределением Релея. Именно это распределение при генерации случайного радиуса R и угла его поворота А дает картинку разброса снарядов и их распределение как в игре.
  9. Ну, если человек будет такого уровня, то он просто вскроет обфускацию скрипта и всё. Сам факт, что ты шлешь данные из пайтон-скрипта уже бьёт по защите кувалдой ибо все обфускации байт-кода пайтона обратимы и этим много кто занимается. Конечно было бы хорошо, если проект или его часть была открытой, т.к. закрытые проекты умирают и после них ничего не остается. Но это дело хозяйское. Меня вообще больше интересует только та часть пайтон-кода, которая у тебя будет отвечать за математическую модель. Ибо только она и представляет академический интерес в плане механики игры. И вот именно этот код, должен быть открытый (в смысле где-то увидеть, посмотреть, обсудить, предложить исправления и дополнения). Ибо если речь об изучении механики игры, её проверки и т.д., то делать закрытым ото всех код, отвечающий за математику - бессмысленно. Он должен быть прозрачен. Тогда это будет проверка игры.
  10. Ближе если, то модель та же. Если очень близки, т.е. меньше 100 метров, то баллистика не учитывается и можно с проекциями точек работать. А вот если точка попадания дальше точки прицеливания, тогда нужно сделать так: ... Б) При попадании снаряда в танк или землю получаем hitPoint и декодируем hitDir В) Строим по точкам с малым шагом обратную траекторию из точки hitPoint, используя инвертированное значение hitDir Г) Путем перебора точек траектории находим точку nearestPoint, в которой deviation минимально, а также дистанцию до неё npDistance от точки ShotPos Д) Вычисляем радиус круга исходного разброса орудия в точке endPoint, как dispRadius = dispersionAngle * distance Е) Сравниваем отклонение снаряда deviation c радиусом круга разброса dispRadius Ты должен знать, что трассер - это не траектория снаряда. Трассер это примерная визуализация и рисуется он условно и часто приближенно. Вектор скорости и точку начала трассера - сервер может от балды прислать, а может вообще не прислать. Отчасти это делается еще и для того чтобы отслеживание трассеров игроками не повлияло на геймплей. В таком моде как у тебя его использовать не следует. Это такой вариант из возможных вариантов модели. В действительности эту плоскость можно сориентировать как угодно и сделать даже не плоскостью, а поверхностью. Все зависит от того, что мы хотим получить в итоге и как лучше всего это оценить. Но нужно помнить с чего всё начинается. А в механике игры все начинается с того, что сервер генерирует случайным образом dispersionAngle. А это как мы знаем тангенс угла отклонения начального вектора снаряда в опорной точке орудия. Если брать это за аксиому, то получаем модели ниже. На рисунках выше самой правильной будет последняя модель, т.к. она предполагает, путем построения обратных траекторий, восстановить вектор вылета снаряда и затем определить исходный тангенс угла разброса. Однако в этой модели погрешность напрямую зависит от дальности стрельбы. И по моему опыту врать она будет очень много и часто, если речь идет о стрельбе арты, так как чем длиннее восстанавливаемая баллистическая траектория, тем больше отклонение от реальной траектории. Это вызвано тем, что данные о точке попадания снаряда и восстановленный вектор часто не точны. Сервер их присылает только лишь для того чтобы клиент плюху нарисовал. Следовательно строить длинные траектории на их основе - не выгодно. Что касается самих расчетов, то надо стараться избегать сложных матричных аналитических вычислений, если можно заменить на простую итерационную геометрию. Всего лишь потому что последнюю легко отдебажить в игре и проверить правильность и логику всех действий. А с первой так не выйдет. Однако, если время вычислений очень критично, то надо идти по первому варианту чтоб игра не тормозила.
  11. Модуль отправки данных на гитхаб не заливать и всё. В .gitignore его добавить.
  12. На сервере, как я понимаю, сведения нет вообще. Оно там просто не нужно. С сервера на клиент приходит вот такая инфа shotPos, shotVec, dispersionAngle. А клиент может на её основе построить "серверное сведение" (включается в настройках игры) и делает это он по тем же формулам и кодам, что он строит клиентское сведение. С той лишь разницей, что клиентское сведение строиться на основе dispersionAngle, которое клиент считает сам. Я бы вот так делал: 1. Работал с с данными серверного прицела. Так как только они отвечает тому, что реально происходит на сервере. Можно параллельно и клиентские брать, чтоб сравнивать и видеть расхождение. Чтоб инфа приходила о серверном прицеле в updateGunMarker в PlayerAvatar, нужно в моде принудительно включать получение данных о прицеле с сервера. Делается так BigWorld.player().enableServerAim(True). 2. Отклонение снаряда рассчитывал по следующей модели: А) В последний момент перед выстрелом фиксируем ShotPos, EndPos, direction, dispersionAngle Б) При попадании снаряда в танк или землю получаем hitPoint (можно еще декодировать hitDir, но он ниже не нужен) В) Строим по точкам с малым шагом обратную траекторию из точки EndPos, используя инвертированное значение direction Г) Путем перебора точек траектории находим точку nearestPoint, в которой deviation минимально, а также дистанцию до неё npDistance от точки ShotPos Д) Вычисляем радиус круга исходного разброса орудия в точке nearestPoint, как dispRadius = dispersionAngle * npDistance Е) Сравниваем отклонение снаряда deviation c радиусом круга разброса dispRadius 3. Как это всё реализовать в моде я знаю, все эти этапы я проходил, когда работал над кое-чем, только с другими целями.
  13. Дык убери реквизиты сервера из исходников мода на гитхабе и всё, их будет безопасно публиковать.
  14. Прочитав пост выше, я так и не понял, зачем нужно учитывать выживаемость. Как я писал выше, опять некорректный пример, если у них настолько различаются % выживаемости, то и xTE и % побед у них тоже будет существенно разный. Я же выше приводил вам примеры значений коэф. корреляции урона (xTE), процента побед и % выживаемости.
  15. Добавьте строку import BigWorld в начало модуля и будет ОК. Это древняя штука у них, появилась несколько лет назад после очередной оптимизации нативного пайтона. Научного объяснения этому я не знаю, но думаю это связано с памятью и областями видимости и исполнения кода. То что сам скрипт и обфускация кода тут не причем, это очевидно. Модуль без проблем работает в обычным пайтоне. # -*- coding: utf-8 -*- import BigWorld print('Hello world')
  16. Немного про механику игры, исходя из клиентского кода Разброс в механике игры задается сервером как тангенс половинного угла разброса орудия 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.
  17. У ВГ на апи-сервере в integrity_check сломалась (или убрали) объединялку запросов в одну строку. Починю сегодня.
  18. Может не в тему. Но у меня за последние два года на ноуте с Windows 8.1 игра не запускается с новыми дровами от nVidia, приходится на встроенной в процессор Intel графике запускать, а сейчас я обнаружил, что звуки и музыка в окне логина и в ангаре стала давать хрипы в динамиках. А в бою/реплеи нормально. Продолжаю тупо ничего не делать и наблюдать, может еще чего посыпится. Даже интересно стало.
  19. 53% выживаемости при 43% побед и xTE 20 - ? Такого не бывает. Выживаемость, победы и урон (он же xTE) сильно зависимы друг от друга. Потому в игре высокая выживаемость только у тех у кого остальные показатели тоже высокие. Вот тут пример корреляционных таблиц для Е-50 и Т29, показывающие эти зависимости. Из них следует, что винрет на 70-80% линейно зависим от урона, а выживаемость на 60-70% линейно зависима и от винрейта и от урона.
  20. Исправил модуль victory_chances в NetStatisticsModules. Перезалил zip-архивы на GitHub. Можно качать мод - VictoryChancesGUI
  21. Еще можно покурить вот этот Нашел древнюю тему по арте - http://forum.worldoftanks.ru/index.php?/topic/92927-эксперимент-с-разбросом-снарядов-у-арты-№2-прод/ Вот оттуда я знаю про эллипс. Можно почитать, что там.
  22. https://github.com/StranikS-Scan/StranikS_Scan-mods/tree/master/.experiments/SPGDispersion - это если ты в треньке один стреляешь для сбора статистки попаданий и изучения разброса, то сойдет и такой мод. Если в бою/реплеи нужно отследить чьи-то трассеры/попадания, то используем shooterID в new_showTracer и используем attackerID в new_showDamageFromShot и в new_showDamageFromExplosion У арты вроде все тоже самое, кроме того, что круг разброса - круг когда сверху смотришь. А если по вектору попадания снаряда смотреть при подлете к цели, то эллипс будет.
  23. Можно от балды сделать и многие игроки даже не почувствуют этого )))
×
×
  • Create New...