Jump to content
Korean Random

Dragon armor

User
  • Content Count

    416
  • Joined

  • Last visited

  • Days Won

    3

Posts posted by Dragon armor


  1. 14 часов назад, Monstrofil сказал:

    Особенности: меняется не от ноля, на разных картах координата пересчитывается в разные значения

    Посмотри на relativePosition.

     

    14 часов назад, Monstrofil сказал:

    YawPitchRoll - 3

    Четыре же.

     

    14 часов назад, Monstrofil сказал:

    FullPos занимает 5 байт

    А это 6.

     

    И на лицо опять экономия байт. Вместо 24 байт без каких-либо механизмов ужимаются в 10. Ну может 14 байт - это много. Очень много. Пихать мёртвую говядину в каждый пакет - не много. А 14 байт много. Ну пусть будет увеличение размера пакета на 14 * 12 (или сколько там корабликов) 168 байт (и то не каждый пакет), даже в MTU 1500 байт укладывается вместе с остальными данными, которых примерно 250 байт.

    • Upvote 1

  2. @Monstrofil 

    А методов и свойств не больше 255 получается? Там механизм другой.

    21.11.2022 в 22:24, Monstrofil сказал:

    # 0x7e - 0x44 == 0x3a == onGetPortsInfo ([unknown: <Blob>])

    А точно так?

     

    21.11.2022 в 22:24, Monstrofil сказал:

    p.p.s. 0x44 и 0xa2 в клиенте всё ещё фигурируют. в asm видно что клиент заполняет entityMethod hander'ом структурку, где хандлеру соответсвуют индексы от 0x44 до 0xa2.

    Тогда только смотреть, как методам назначаются индексы. Там есть функция подсчёта md5 хеша по всем названиям, если её не удалили. Можно туда поставить брекпойнт и все параметры вытащить.


  3. 23 часа назад, Monstrofil сказал:

    тяжелое наследие Dial-up (ADSL?) у этого движка =/

    Да это макросы, это же очевидно. Поищи в исходниках по avatarUpdate и увидишь, что названия ими генерируются, как и параметры, которые они принимают/отправляют.

    23 часа назад, Monstrofil сказал:

    Ранее в сообщении 1a были закодированы либо вызовы методов либо свойства (те самые, с offset 0x44 и 0xa2). Теперь же, на примере последнего, приходит что-то что уже не метод (методов меньше у entiity), но ещё не свойство.

    Как вариант - количество базовых методов изменилось, вот и поменялись начальные идентификаторы у свойств и методов. 0x44 и 0xa2 - не константы, уже писал это. Они генерируются в зависимости от количества свойств/методов у энтити. Можно даже поискать в исходниках, хотя это могло измениться и искать, как именно теперь назначаются индексы, надо в исполняемом файле.

    Например, EntityMethodDescriptions::checkExposedForSubSlots.


  4. @m3ybach Сделать можно, но вряд ли будет легче. Принцип-то тот же.

    2 часа назад, Monstrofil сказал:

    в танках в пакете entity create всегда полностью передается position и direction?

    Позиция передаётся тремя float, а направление пожато до четырёх байт.

    2 часа назад, Monstrofil сказал:

    Похоже что это как-то зависит от <Volatile> в def файле.

    Не, не зависит. От реализации может зависеть, в кораблях тоже решили съэкономить 8 байт, непонятно только, зачем.


  5. @Monstrofil Если сравнивать с танками, то для свойств остаётся один байт, тот, что 0х01. Потому что предпоследний байт - строка нулевой длины. Если смотреть на свойства, то единственное, что подходит - lastGeneratedTransactionNumber. Тогда строки не будет. Но если посмотреть на флаги свойств, то тут только BASE, а если бы были свойства для клиента, то было бы BASE_AND_CLIENT как в танках.

      <Properties>
        <accountDBID_s>
          <Type>	STRING	</Type>
          <Flags>	BASE_AND_CLIENT	</Flags>
          <Persistent>	true	</Persistent>
          <DatabaseLength>	96	</DatabaseLength>
          <Identifier>	true	</Identifier>
        </accountDBID_s>
        <loginPriority>
          <Type>	UINT32	</Type>
          <Flags>	BASE	</Flags>
        </loginPriority>
      </Properties>

    Клиенту здесь передаётся только accountDBID_s.

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

    • Upvote 1

  6. 41 минуту назад, Monstrofil сказал:

    У меня пока даже нет идей что это может быть за строка, видимо опять в исходники BW лезть

    Там, насколько помню, этого нет. Появилось позже и это общее между танками и кораблями, либо похоже. Ни разу эта строка мне не попадалась и что там может быть - не знаю.

    41 минуту назад, Monstrofil сказал:

    У логина там все то же самое, но пустой набор свойств и в конце 0x01

    Тоже покажи этот пакет. Там как минимум одно свойство есть. И в танках нет единицы в конце Login.

    А ты привёл пример энтити Account? Ну покажи def-файл его. 0x0F - это что-то в свойствах. Оно точно входит в это сообщение, судя по указанному размеру в самом сообщении.


  7. 2 часа назад, Monstrofil сказал:

    Вот пример в hex, если так будет понятнее:

    Да, так понятнее.

    2 часа назад, Monstrofil сказал:

    header tickSync entity create ???

    Внезапно, размер пакета.

    2 часа назад, Monstrofil сказал:

    xml id ??

    Ленишься в дизасемблере сидеть. Строка. Её длина равна нулю, поэтому дальше данных нет.

    А дальше начинаются свойства. У тебя def-файл есть же. Прикрепи или скопируй сюда от логина, он должен быть самым коротким. Тогда будет понятно назначение 0x0f.

    2 часа назад, Monstrofil сказал:

    Не нахожу :(

    Сам уже не помню где. Это в определении длины пакета. Либо при создании. Там действительно трудно ориентироваться, пока не знаешь, что именно искать.

     

    2 часа назад, Monstrofil сказал:

    но пока не заморочился настолько что бы достать их id.

    Брекпойнт ставишь и в лог выводишь все параметры. Там есть единая функция создания у них. Порядок вызовов покажет их идентификатор. Либо перед выходом из той функции, что ещё лучше, потому что результат функции будет id (вроде бы, уже мог и забыть).

    2 часа назад, Monstrofil сказал:

    почему иногда три первых байта сообщения (не пакета!) переносятся в конец сообщения?

    Спорный, на мой взгляд, способ уместить данные. Ты разобрался уже, что количество байт, в котором указывается размер сообщения, может быть от 1 до 4? То есть, это размер размера сообщения. Когда размер больше, чем может быть указано в, кхм, размере, создатели BigWorld сделали так, как ты описал. Где-то тоже было в исходниках, но даже примерно найти не могу, куда копать.

    8 минут назад, Dragon armor сказал:

    но даже примерно найти не могу, куда копать

    Посмотри тут InterfaceElement::specialExpandLength.


  8. 31 минуту назад, Monstrofil сказал:

    а где ты накопал эти все константы? 0x44 для методов, 0xA2 для property?

    Из исполняемого файла. Актуальны для определённой версии. И они считаются от количества методов и свойств. Это не константа. На момент того комментария не было мне это известно, поэтому и писал их константами.

     

    1 час назад, Monstrofil сказал:

    Попадается 0x0f у Account и 0x01 у Login.

    Приведи полный пример пакета с флагами и счётчиками без blowfish данных.

     

    1 час назад, Monstrofil сказал:

    если exposed method_id для ClientEntityMethodCall меньше 0xa1, то его номер просто записывается сразу после id сообщения. А если превышает, то в id сообщения записывается 0x1a, потом размер сообщения, а потом смещение которое нужно прибавить к 0x1a.

    В исходниках BigWorld есть этот момент. Там всё есть, что нужно. Точнее, основная база. Корабли были позже, поэтому там были изменения какие-то, утверждать не буду, но не одинаково. Но часть неизменна. Размер сообщения указывается только для тех сообщений, размер которых изменяется. Если константа, то не ставится.

    У тебя парсер def-файлов есть? Ты смотрел в исполняемом файле, как он происходит? В корабликах свои особенности могут быть.

     

    2 часа назад, Monstrofil сказал:

    но там черт ногу сломит

    Есть такое.

     

    Ты из исполняемого файла достал базовые методы? Хз как их правильно назвать, те, что создают энтити и прочие.


  9. 07.11.2022 в 13:03, Monstrofil сказал:

    FLAG_IS_RELIABLE на первой странице это опечатка, или действительно поменяли идентификатор

    Флаги не менялись. Были лишь добавлены новые. Видимо, опечатка (хотя не смотрел).

     

    07.11.2022 в 18:43, Monstrofil сказал:

    upd: целый день с этим провозился и только сейчас заметил что размер blob по какой-то причине дописан в конец payload, сразу после uint8.

    Да. Исходники BigWorld рекомендую посмотреть. Как и по следующему вопросу.

    07.11.2022 в 18:43, Monstrofil сказал:

    Разбирался сегодня с выравниванием под blowfish.

    Потому что шифрование и логика сетевого протокола не менялась кардинально с тех времён.

    3 часа назад, cofe_cofe_cofe1 сказал:

    после выстрела клиент отрисовывает начальную траекторию движения снаряда,

    Добавлю предыдущий ответ. Клиент отрисовать может заранее, чтобы меньше видно было лаг ответа. Поэтому возникают такие темы и видео, где чётко видно трассер, влетающий в борт, но сбивается гусеница. Это не заговор, а предсказание клиента. Иначе без этого всё воспринималось бы как ватность в управлении и отзывчивости игры. А на сервере всё может быть совсем иначе. Клиент на это никак повлиять не может.

    23 часа назад, Monstrofil сказал:

    кроме последнего байта 0x0f

    FF FF FF 0F? Packet number.


  10. 8 минут назад, Monstrofil сказал:

    А в бою что будет, где 28+ энтитей создается?

    Либо сервер явно указывает, какая энтити на данный момент активна (например, через selectEntity), либо сами (внутренние) функции устанавливают энтити активной (множества функций начинающихся с avatarUpdate* и другие). Энтити игрока устанавливается через selectPlayerEntity.


  11. 4 часа назад, Monstrofil сказал:

    1. Получаю пакет entityCreate, в данном случае происходит создание Login entity. Декодирую, получаю entityid и список properties (для этой entity в корабликах они пустые)

    4 часа назад, Monstrofil сказал:

    так как же клиент определяет какой для entity нужно вызвать метод

    Через entityCreate энтити создаётся и используется дальше пока не будет создана новая.


  12. Микроскопическая проблема и полный тупик. У меня не получается. Не понимаю, что надо сделать, чтобы получить вектор направления. Если у меня есть yaw и pitch, как из них сделать вектор направления? Или не так надо? А нужно из матрицы? Или это отдельный параметр? Но turret_yaw используется для получения координат крепления орудия. Что надо сделать, чтобы получить вектор направления? При этом, если отдельно отправлять yaw/pitch в gunAnglesPacked для остальной техники, башня вращается почти правильно (зацикливается на переходе 180 градусов, пока причину бага не искал).

    17.02.2022 в 01:10, StranikS_Scan сказал:

    Вот так нужно, если модель видна:

    startPoint  = BigWorld.entity(BigWorld.player().playerVehicleID).appearance.compoundModel.node(GUN).position

    и вот так, если модель игрока не видна:

    startPoint = BigWorld.player().getOwnVehiclePosition()
    startPoint += BigWorld.player().vehicleTypeDescriptor.hull.turretPositions[0] + BigWorld.player().vehicleTypeDescriptor.turret.gunPosition

    У меня не получится так сделать. Только из модели (либо xml файла) могу получить координаты. Правильно понимаю, что координаты техники - это глобальные координаты. А в xml находятся локальные. Соответственно, чтобы получить локальные (или это уже глобальные будут, если умножить на позицию техники?) координаты орудия и башни, делать надо так.

    turret_pos = vd.chassis.hullPosition + vd.hull.turretPositions[0]
    
    turret_matrix = Math.Matrix()
    turret_matrix.Set_Pos(turret_pos)
    turret_matrix.Rotate_Y(self.turret_yaw)
    turret_matrix.postMultiply(veh.matrix)
    
    gun_matrix = Math.Matrix()
    gun_matrix.Rotate_X(self.gun_pitch)
    gun_matrix.Set_Pos(vd.turrets[0][0].gunPosition)
    gun_matrix.postMultiply(turret_matrix)

    veh.matrix - это предполагается положение техники, пока что единичная матрица. Их не надо в данном шаге вычислений?

    hullPosition и turretPositions можно сложить? Они же не изменяются в локальной системе координат?

    Или надо перейти в локальную систему (точку прицеливания перевести в локальную) и считать углы там?

    Кто-нибудь объясните, что надо сделать.


  13. startPoint += player.vehicleTypeDescriptor.hull.turretPositions[0] + player.vehicleTypeDescriptor.turret.gunPosition

    А так можно? А то матрицы тут перемножаю, чтобы точку получить.

    11 минут назад, StranikS_Scan сказал:

    это типа вот так shotDir*ShotSpeed

    Ясно. А зачем так? У клиента же есть скорость снаряда. Почему просто не передать направление?


  14. @ktulho Так направление выстрела или скорость? Как в одном векторе объединить две разных величины? У меня предположение, что это точка на ландшафте. Проверить не могу, cellapp пока что не может делать рейкаст (или как эта штука называется). И ландшафт при дампе уехал куда-то, поэтому не понятно, заканчивается точка на ландшафте или где-то ещё.

    А начальная точка примерно отсюда начинается.

    image.thumb.png.a56116aef6c6c21abc30124ca85e8d60.png


  15. И так, возвращаюсь к тому, на чём застрял ещё в самом начале. Сервер присылает клиенту через функцию updateGunMarker некие вектора, назначение которых мне не ясно.

    shotPos, shotVec

    Реальный пример значений векторов.

    shotPos x = 43.00 y = 9.18 z = 412.46
    
    shotVec x = -17.71 y = 20.38 z = -350.96

    Из названия как бы всё понятно, но по коду, в котором используется, всё не однозначно.

    shotPos - либо конец орудия, либо начало точки стрельбы, которая где-то в башне находится. Ну пусть. А что второй вектор?

    Из updateGunMarker сразу идёт вызов setShotPosition.

                        dirToTarget = predictedTargetPos - shotPos
                        dirToTarget.normalise()
                        shotDir = Math.Vector3(shotVec)
                        shotDir.normalise()
                        if shotDir.dot(dirToTarget) > 0.0:
                            return

    dot - скалярное умножение векторов, тут что хотят проверить? Что вектор не нулевой?

    Ну ладно, идём в функцию __getGunMarkerPosition. А там уже не ясно мне ничего.

    Начало.

        def __getGunMarkerPosition(self, shotPos, shotVec, dispersionAngles):
            shotDescr = self.__avatar.getVehicleDescriptor().shot
            gravity = Math.Vector3(0.0, -shotDescr.gravity, 0.0)
            maxDist = shotDescr.maxDistance
            testStartPoint = shotPos
            testEndPoint = shotPos + shotVec * 10000.0
            testVehicleID = self.getAttachedVehicleID()
            testEntities = ProjectileMover.getCollidableEntities((testVehicleID,), testStartPoint, testEndPoint)
            collideVehiclesAndStaticScene = ProjectileMover.collideVehiclesAndStaticScene
            collideWithSpaceBB = self.__avatar.arena.collideWithSpaceBB
            prevPos = shotPos
            prevVelocity = shotVec
            dt = 0.0
            maxDistCheckFlag = False

    testEndPoint = shotPos + shotVec * 10000.0 - но вектор не единичный, его не нормализуют.

    prevVelocity = shotVec - так что такое shotVec? Что за скорость?


  16. @StranikS_Scan Тут получается угол между башней и орудием. Мне надо другое.

    image.png.6e918adaa264cb4613dcdc3fcf887581.png

    Вид сверху и сбоку. Точка прицеливания где-то. Для башни не нужна высота точки, нужны только координаты в плоскости XZ (в блендере система координат XYZ, в игре используется XZY).

    image.thumb.png.02c84d20372631ddeeb15391bc94c5b2.png

    Для орудия не нужна координата X.

    image.thumb.png.7c70e78f2c68a13f2a23d6aeceae7c0d.png

    Мне надо два угла, один между башней и точкой прицеливания, второй между орудием и точкой прицеливания. Вчера попробовал 2D сделать. Опять что-то непонятное выходит.

    Сейчас сделал в блендере точку прицеливания. А результат-то более-менее правдоподобен. Только должно быть немного меньше 90 (где-то 87), а получается чуть больше (где-то 93).

    image.png.e5967ad1b17a8b7adbcd97a5f582794b.png


  17. 21 минуту назад, SkepticalFox сказал:

    тебе такое нужно?

    Да. Подумал, что надо в 2d считать. Ведь поворот будет в одной плоскости. Получается, что нужен угол между двумя векторами, но два 2D вектора, у одного нет оси Y, у другого Z что-ли от изначальной точки прицеливания. И всё-равно ерунда получается. Игра любезно сообщает, что при координатах (-600.0, 11.7943, 35.0167999) должен быть результат (0.0630506500602, 0.027105294168) turretYaw и gunPitch. В радианах, так понимаю. У меня получается 1.62909153346.

    Координаты для башни оставил XZ. И ерунда получилась. Либо в координатах какая-то ошибка, хотя у меня в блендере собран танк и координаты совпадают.


  18. Только что, SkepticalFox сказал:

    просто вектора надо собрать правильно

    Вот это мне и надо. Трудности с этим возникли непреодолимые.

    Башня поворачивается в xz, ось Y не надо учитывать? Как итоговый вектор должен выглядеть? Занулить по оси?

    turret_vector.Angle_Between(Math.Vector3(vector3[0], 0, vector3[2]))

    Получается ерунда. И надо для вектора башни тоже какие-то манипуляции делать?


  19. 3 минуты назад, SkepticalFox сказал:

    с вектором поворота gun/turret

    У меня есть какая-то функция по переводу матрицы в вектор поворота. Только это перевод в yaw, pitch, roll, мне же один параметр нужен. Yaw для башни и Pitch для орудия.

    1 минуту назад, SkepticalFox сказал:

    dot product двух нормированных векторов даст cos угла, а чтобы получить угол нужен acos

    Как угол между векторами узнать - легко. Для меня не понятно, как угол для башни и орудия найти. Повернуть надо по одной оси для башни и орудия. Вот эти углы надо найти.


  20. 7 минут назад, SkepticalFox сказал:

    у тебя там похоже матрица, или кватернион, сам смотри)

    У меня сейчас только положение башни и орудия. Матрица будет позже, кватернион не нужен здесь, поворот вокруг одной оси только.

    Как мне угол узнать, на какой нужно повернуть башню и орудие?

    1 минуту назад, SkepticalFox сказал:

    с вектором поворота gun/turret

    Это какой столбец матрицы? Или как его получить, если это не столбец?

×
×
  • Create New...