Привет, Хабр! В своём первом посте я расскажу, как мы уже полгода как пишем неофициальный мультиплеер для NFS Most Wanted 2005 года выпуска. Сразу скажу — ссылок не будет, лишь скриншоты, дабы не сочли за банальную рекламу. Если будет интересно — спросите в комментариях. Поехали!

image

Началось все в конце 2016, то есть прошлого, года, а точнее в ноябре. Я общался с разработчиком трейнеров MWInside, который, если честно, не блистал особыми знаниями. Я рассказал, что хотел бы научиться управлять авто, отличными от игрока — соперниками, полицией и обычными машинами трафика. Он ничего на это не ответил, ибо тогда об этом никто не знал. Давайте пропустим до конца декабря, когда я познакомился с Jojez'ом, человеком, вдохновившим меня на все это, и командой ExOpts, которая мне помогла идеями. Итак, у меня на руках были адреса координат, скорости, наклона и поворота игрока. Путем некоторых исследований я вычислил, что они все — поля одной структуры, предположительно ISimable, размером в 176 байт, т.е. прибавление 176 к всем этим адресам давало те же значения у другого автомобиля. Это было открытием, которое, по сути, открыло десятки путей, однако сначала, до конца января, я писал не онлайн, а простенький трейнер на управление вертолетом полиции. Ещё раз пропустим до двадцать третьего января.

Сам, собственно, мультиплеер


Итак, двадцать третье число, утро. Я предлагаю своему другу, YaNet'у, написать мультиплеер. Тот соглашается, берет код из своих старых проектов, и к двадцать четвертому у нас есть минимальные сервер и клиент на C#. Впоследствии его переписали на Си, но это уже другая история. Двадцать четвертого числа мы начали делать работу с игрой. К слову, мы использовали NFSScript — API для создания модов от DennisStanistan'а. Мы заставили клиент просить случайное число у сервера, а затем, после того, как оно приходило, выводили его на экран средствами игры. Это было только начало…

Синхронизация игроков — сущий ад


Вскоре пришло время делать реальный мультиплеер. Работал он довольно просто: клиенты отправляли свои координаты, сервер их отправлял остальным, те на своей стороне присваивали их к машинам. Ничего интересного, а ещё оно было ужасно нестабильно и багано: машины были буквально под приступом, их трясло и подкидывало. В это же время один из администраторов сайта, имя которого я разглашать не буду, чтобы не рекламировать, ArturoPlayerOne, создал закреплённый топик, сообщающий, что проводится открытый тест. Люди, конечно, полезли в чат, но из-за действительно ломающих все багов нормально поиграть никто не смог, хоть и остались заинтересованными. Впоследствии все эти баги, конечно, исправили, но лишь полностью переписав клиент и сервер на Си. Синхронизацию тоже исправили, но это уже другая история…

А это кусок кода :)

	mw_write_memory(MW_ADDR_AI_STR_RACE, "AIActionNone", 13); //Зачем нам боты в онлайне?
	float hud_scale = 0.97265; //Мини-мод, изменяет размер HUD и стартовый экран на более похожие на версию для Xbox 360
	mw_write_memory(MW_ADDR_HUD_WIDTH, &hud_scale, 4); //Это HUD...
	mw_write_memory(MW_ADDR_HUD_HEIGHT, &hud_scale, 4);
	uint8_t opcode = 0xC3; //...а тут экран. Это немного сложнее, чем HUD, но все же.
	mw_write_memory((void*)0x604DA0, &opcode, 1);
	uint8_t widescreen_splash_patch[] = {0x90, 0x90};
	mw_write_memory((void*)0x5A3080, widescreen_splash_patch, 1);
	void* ws_screen_pointer = 0x89F828;
	mw_write_memory((void*)0x8F3C68, &ws_screen_pointer, 4);
	mw_write_memory((void*)0x8F3C88, &ws_screen_pointer, 4);
	mw_write_memory((void*)0x8F3CA4, &ws_screen_pointer, 4);
	uint8_t force_7_ai_patch1[] = {0xB8, 0x06, 0x00, 0x00, 0x00}; //Название говорит само за себя: мы заставляем игру спавнить 7 оппонентов. Этот массив, а именно код в нем, собственно это делает...
	mw_write_memory((void*)0x5DA122, force_7_ai_patch1, 5);
	uint8_t force_7_ai_patch2[] = {0xB8, 0xC5, 0x88, 0x3B, 0x9F, 0x50, 0xE8, 0x22, 0x45, 0xFE, 0xFF, 0x83, 0xC4, 0x04, 0x5E, 0xC2, 0x04, 0x00}; //...а этот исправляет падение игры. Посложнее, не так ли? На самом деле все просто: мы заменили [eax] на хеш строки "character_smart" в одной из инструкций и сделали ещё парочку незначительных изменений. В EAX находился указатель на хеш соперника, которые вручную заданы в игровых файлах, что, собственно, и вызывало падение на четвёртом сопернике, ибо его просто нет, что оставляло в EAX нулевой указатель/мусор. Оба варианта, понятное дело, ничего хорошего не сулят.
	mw_write_memory((void*)0x5FD353, force_7_ai_patch2, 18);

Довольно длинный код, если честно. Я писал комментарии минут пятнадцать. Ладно, пойдем дальше!

Какие проблемы мы испытали


Их было очень много, некоторые есть и сейчас, но сегодня мы поговорим о тройке самых важных, при том с конца. Поехали!

Номер три: синхронизация


Почему аж на третьем месте, спросите вы? Потому что особо она и не мешалась, ИМХО. Да, она была ужасной, но не ломала геймплей. Как же мы ее исправили-то?
Если честно, то полностью не исправили и по сей день, но давайте я вам расскажу обо всем, что мы пытались сделать.

  • Суровый челябинский метод: мы пытались синхронизировать все физические параметры и как можно чаще. Ha-ha, nope! Никаких изменений, только все начало безбожно тормозить. В помойку.
  • Уменьшение размера пакетов. Действие неплохое, ибо клиент «ест» меньше трафика, только в качестве решения проблемы синхронизации бессмысленное до костей. На свалку.
  • И, наконец,.разделение координат и скоростей, реально рабочее решение. Ранее мы синхронизировали все и всегда, но теперь это изменилось: скорость и поворот синхронизируются всегда, а вот координаты всего раз в несколько секунд. Это сделало игроков плавными и красивыми.

Номер два: пожирание всего соединения


Да-да, когда-то? наш клиент забивал канал, что тесно связано с номером один. На соединениях хуже соединения датацентров Google клиент просто не работал, либо не давал работать остальному. Исправлено это было только недавно, в версии 0.6. Как оказалось, каким-то неведомым образом я написал код, который мало того, что буквально производил DoS- (а если на сервере игроков так пять, то вообще DDoS-) атаку на сервер, так ещё и убивал соединение, отправляя байт так тысячу раз в миллисекунду! Не знаю, что ещё можно сказать по поводу этого бага, но он был исправлен, так что все о'кей. Переходим к первому месту!

Номер один: перезаходы


Даже, точнее сказать, отключения. Выход игроков из игры просто не был предусмотрен. Если человек заходил один раз на пустой сервер, его ID был равен одному. Если он перезапустит клиент, то его ID уже будет равен двум. Странно, не так ли? А что, если три игрока вместе гоняются, у одного падает соединение, и он заходит ещё раз? Надо ли говорить, что три игрока были максимумом? Это ужасно бесило меня и всех игроков. В итоге я собрался с силами и таки написал отключение игроков. Если от игрока нет пакетов в течении двух секунд — он отключается. Случайное? отключение исключается — два раза в секунду все равно приходит «пинг». Думаю, что это все.

image

Ещё один скриншот

Послесловие


Его не будет. Единственное — GrimMaple, отзовись! Ещё хочу сказать спасибо:

  • nlgzrgn за способ получения семи соперников в гонке;
  • SpeedyHeart/speedycat/SpeedyChan за помощь с синхронизацией;
  • Xanvier и DennisStanistan за адреса функций игры и за инфу по их использованию;
  • elaymm4 за дизайн, идеи, видео, одним словом за «лицо» мода;
  • YaNet (dz3n) за помощь в первое время;
  • Многочисленным игрокам за преданность нашему проекту. Бокал за вас!

На этом все! Всем пока. Если все же опубликуют — буду рад и выпущу продолжение, ибо тут я описал лишь самое важное. До встречи!
P.S. Меня очень много просили в комментариях, так что я выкладываю информацию и ссылки:
Проект называется MW-Online.
Видео геймплея: https://youtu.be/LMGLWHeLuJo.
Скриншоты есть в статье, если хотите поиграть, то есть Discord-сервер. Общение в основном на английском, но есть русский канал.
Поделиться с друзьями
-->

Комментарии (73)


  1. Dageron
    02.08.2017 17:41

    И как в итоге все выглядит, что на данный момент удалось достичь? Двигаются ли машины плавно во всех случаях? Что происходит при столкновениях? Функция спидбрейкера отключена? (не представляю даже как она бы выглядела в онлайне)

    Хм, пожалуй про столкновения наиболее интересная даже часть. Помнится, во многих старых гоночках из-за сложности обработки столкновений использовались «призрачные соперники».


    1. osdeverr
      02.08.2017 17:48

      Да, двигаются всегда плавно, однако это как раз испортило столкновения. Машины будто бы «на рельсах» и очень часто их невозможно сдвинуть с места, потому что на самом деле машины стоят немного «не там», где должны, из-за чего по сути «жертва» видит, как в метре от нее проносится и останавливается на невидимом для нее препятствии (на ней самой) соперник. Спидбрейкер отключен, да.


      1. vkushni
        02.08.2017 19:40

        для разных машин нужны разные апдейт-рейты в зависимости от расстояния до других машин, посчитать расстояние не сложно.


        1. perfect_genius
          02.08.2017 20:22

          Т.е. чем ближе одна машина к другой, тем больше-чаще пакеты?


          1. vkushni
            11.08.2017 17:08

            да, именно а еще есть смысл брать во внимание куда направлена камера (тот же принцип что используется для прорисовки графики). Конечно если есть возможность получать такие данные с клиента.


            1. perfect_genius
              11.08.2017 18:23

              Так вот почему в гонках нет свободного обзора мышью =)


      1. interprise
        02.08.2017 20:00

        не помню, в этой игре можно отключить столкновения или нет?


        1. GrimMaple
          02.08.2017 21:23

          Чисто физически можно, потому что там есть определенное состояние автомобиля, когда он может проезжать сквозь траффик / соперников, но не стены.

          В мультиплеере со столкновениями вообще никто не играл никогда.


          1. interprise
            02.08.2017 21:24

            я про это и говорю, легче убрать вообще столкновения и не мучатся


            1. osdeverr
              02.08.2017 21:28

              Нереалистично. Я потому и ненавидел официальный онлайн — легальные какие-то гонки, нет трафика, нет столкновений, ничего!


              1. interprise
                02.08.2017 21:31

                это фактически вынужденная мера. физику тяжело передавать по сети. Небольшой затуп, большая рассинхронизация и из-за того что человек видит не то что на самом деле — делает не то что нужно, это ужасно бесит когда не ты виноват в косяке


                1. osdeverr
                  02.08.2017 21:35

                  Знаю. В одном из видео, кстати, это и случилось — посреди гонки мой соперник немного рассинхронизировался и на моей стороне просто развернул меня на 90 градусов вправо, из-за чего я подлетел на кочке и врезался в будку платной дороги (tollbooth), из-за чего перевернулся и проиграл гонку.


  1. LynXzp
    02.08.2017 20:23
    +2

    И, наконец, разделение [синхронизации] координат и скоростей, реально рабочее решение.
    Принцип Гейзенберга в действии.


  1. BeLove
    02.08.2017 20:42
    +3

    Добавили бы видео, как это работает, было бы круто


    1. osdeverr
      02.08.2017 21:26

      За рекламу же сочтут. Я потому даже имя не разглашал.


      1. quantum
        03.08.2017 08:35
        +7

        Куча шлака сыпет ссылками с первого предложения, а годнота боится сказать название из-за того, что «За рекламу же сочтут»


        1. e_Hector
          03.08.2017 11:49

          Даннинг-Крюгер, сэр


  1. GrimMaple
    02.08.2017 21:19

    Передавайте привет SpeedyHeart, что ли. Вдруг порадуется :)

    Работал он довольно просто: клиенты отправляли свои координаты, сервер их отправлял остальным, те на своей стороне присваивали их к машинам.

    Надеюсь на лучшее, но все же спрошу: это так и оставили, или все-таки переписали? И планируете ли переписывать, если вдруг?


    1. osdeverr
      02.08.2017 21:31

      Переписали. Кстати, я именно вас звал в конце статьи, просто имя забыл. В Discord мне напишите: osdever#4170, охота пообщаться.


  1. devlev
    02.08.2017 21:54

    Я в 2005 году играл в доту. Тогда интернет был 64Кбит/с. И я помню что игра тормозила только когда все герои оказывались в одном экране. В остальных случаях все работало нормально, без тормозов на фпс 40. Хотелось бы услышать хотябы в общих чертах как сделан так сервер что он тянет так мало клиентов? Кстати в доте насколько мне было известно в качестве сервака выступала одна из клиентских машин.


    1. osdeverr
      02.08.2017 22:19

      Он и пятьдесят потянет, и сто, это ограничение самой игры.


    1. interprise
      02.08.2017 22:41

      там передаются действия всех игроков. не положение героев, а просто все действия. Поэтому скорее всего дело не в том что вы видели много игроков, а в том что они делали много действий


    1. TheShock
      03.08.2017 01:07
      +4

      Хотелось бы услышать хотябы в общих чертах как сделан так сервер что он тянет так мало клиентов?

      Доты или НФС: МВ?

      Если я не ошибаюсь, то в 2005-м дота была как карта ВК3 и там, по сути, все работало ровно так же как обычный стратежный мультиплеер, потому что аддон только использовал встроенные возможности для модификации (которые, конечно, для того времени были просто шикарными). Само собой, как и оригинальный Варик, в качестве сервера использовалась одна из клиентских машин. К счастью, стратегии не так чувствительны к пингу и, впринципе, обновление раз в 100 мс для них не так заметно в силу особенностей (анимации имеют существенную задержку, игрок может отдать приказ, а юниты сами знают куда бежать, алгоритмы же более-менее детерминированные).

      Сложнее с шутерами — там используется еще больше трюков и из-за этого в Контре можно увидеть такой баг: я выбегаю, бросаю гранату, она летит к противнику и меня убивают. Включаю наблюдение и вижу, что граната не вылетала и меня убили до того, как я ее кинул. Ну или ты забежал за укрытие и тебя внезапно убили. Бесит, конечно, но жить можно.

      Хуже всего — мультиплеер для гонок, где 100 км/час — это 28 метров в секунду. То есть за 100 мс (вполне неплохой пинг для непрофессиональной игры) машина проезжает 2.8 метра. Если грубо, то для игрока А игрок Б едет сзади, а игроку Б кажется, что они с игроком А на одном уровне. И для игрока А считается допустимым повернуть повернуть направо (там ведь нету машины соперника), а клиент игрока Б понятия не имеет как обработать эту ситуацию. Авторам статьи уважение и почет, что они взялись за такую стремную задачу.

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

      Если бы были проблемы с каналом, то это проявлялось бы иначе — противники бы «телепортировались» в неожиданные места, обновлялись бы дерганно — пробежал, остановился, пробежал быстрее, внезапно скастовав сразу три заклинания и т.п.

      А если бы у вас не хватало ширины канала, (скажем, игра расчитана на минимум 128 кбит/с, а у вас всего 64 кбит/с), то вы бы просто не смогли играть со временем (с увеличением количества юнитов — увеличивается и нагрузка на канал). Хотя, если я не ошибаюсь, в доте всегда приблизительно одинаковое количество юнитов, а следовательно и стабильная нагрузка на канал в силу гейм-дизайна.


      1. Ivan22
        03.08.2017 09:50
        +1

        Если грубо, то для игрока А игрок Б едет сзади, а игроку Б кажется, что они с игроком А на одном уровне. И для игрока А считается допустимым повернуть повернуть направо (там ведь нету машины соперника), а клиент игрока Б понятия не имеет как обработать эту ситуацию.

        Теория относительности как она есть.


      1. bohdan4ik
        03.08.2017 11:29

        … Сложнее с шутерами — там используется еще больше трюков и из-за этого в Контре можно увидеть такой баг...

        В дотке, которая была картой WC3, были другие грустные ситуации — юзаешь скилл или расходник, а он не юзается из-за того, что потерялся пакет или пинг высокий. То же самое с добиванием крипов: тыцнул "атака" вовремя, лаг/задержка — крипа убил не ты.


        Всё же, это не классическая стратегия, где ± 100 мс на обработку "начни апгрейд здания", по большому счёту, ничего не решают. Это скорее экшн от третьего лица, чем стратегия.


      1. slovak
        03.08.2017 14:23

        То есть за 100 мс (вполне неплохой пинг для непрофессиональной игры) машина проезжает 2.8 метра. Если грубо, то для игрока А игрок Б едет сзади, а игроку Б кажется, что они с игроком А на одном уровне.

        Во время гонки противник не пролетает мимо на скорости 100 м/с.
        Ситуация как раз сложней в шутерах, где нет инерционности той же машины.
        На 100 м/с вперед вполне себе можно делать предсказание и корректировать по приходу реальных пакетов. И это будет работать на гоночных скоростях.


        1. TheShock
          03.08.2017 19:19

          Вот смотрите, две гипотетических ситуации.

          1. У игрока А пинг 1 мс, у игрока Б пинг 200 мс. Начинается игра, оба посылают на сервер «еду вперед». Через 100 мс (200 / 2) на сервере и игрока будут значения: игрок А начал ехать в момент 1мс и проехал 1 метр, игрок Б только начал ехать. Для игрока Б значение будет следующее: игрок А начал ехать, игрок Б начал ехать 100 мс.

          2. Больше доверия клиенту, не только команду, но и время от начала гонки, когда игрок стартовал. Начинается игра. Игрок Б и игрок А стартует, но видят старт другого игрока только через 100 мс.

          Теперь представляем другое. Игрок А и Б едут по соседним полосам на большой скорости. Навстречу игроку Б летит грузовик. В последний момент игрок Б нажимает кнопку вправо и обходит грузовик, но на сервер и к игроку А эта информация приходит слишком поздно, по их экстраполяции столкновение с грузовиком уже произошло, запущена анимация взрыва и отняты последние хит поинты у машины. Теперь мы или пост-фактум сообщаем игроку Б: «извини, парень, мы передумали, ты не успел». Или на сервере и у игрока А говорим: «не, стоп, столкновения не было, игрок Б таки не взорвался, грузовик верни на место, анимацию взрыва останови, игрок Б на самом деле объехал грузовик справа».

          Дальше, два игрока едут рядом. Игрок Б видит грузовик на крайней левой полосе и в последний момент нажимает кнопку «влево», толкая игрока А прям в грузовик. Для игрока Б все произошло как раз вовремя, запускается анимация тарана игрока А. Пока игроку А дошла информация о маневре игрока Б он уже проехал грузовик и может ударится только ему вбок. Нам необходимо инвалидировать или информацию игрока А или информацию игрока Б, а инвалидация — это не просто изменить координаты, а сложные изменения логики в физике

          Конечно, команды с привязкой ко времени хотя и дают больше возможности читерам и усложняют написание сервер — для игры значительно лучше, но тоже имеют множество проблем и как раз за счет скоростей и возможностей резкой смены скорости (хорошие тормоза, контролированный или неконтролированный удар)

          В шутерах, конечно, нету инерционности, но зато там значительно меньшие скорости и, обычно, значительно меньше важность у физики.


          1. osdeverr
            03.08.2017 19:26

            По поводу гонок, кстати: у нас нет «комнат», игроки могут начать не одновременно, а ещё просто катающиеся в свободном режиме игроки тоже видны в гонке, как от их стороны видны и гоняющиеся. Они просто в гонке на последнем месте, вот и все. И да, в МВ машины не бьются.


      1. edge790
        03.08.2017 16:10

        Со стратегиями — да. Более менее норм.


        В шутерах и прочих Экшн играх используется интерполяция — сервер говорит, то что было n-миллисекунд назад, хотя слушает в реалтайме. Это сделано для того, чтобы он знал все действия на шаг вперед и клиенты могли "сгладить" движения.
        В итоге в Counter-Strike 1.6 был даже фича баг, из-за которой игроки, которые выстрелили в промежуток меньший чем те же n-миллисекунд, убивали друг друга и раунд заканчивался ничьёй.
        В CS:GO — это пофиксили, поэтому порой случается так, что ты слышишь выстрел, уже радуешься победе, а игра показывает что ты умер, а противник жив.
        С гонками и симуляторами космических кораблей поступают совсем иначе — используют обратный метод к интерполяции — экстраполяцию: ты говоришь что другая машина находится в координатах xyz и движется со скоростью uV (u — вектор направления движения, V — скорость). Отсылая эти данные на клиент мы можем на стороне клиента смоделировать плавное движение других машин.
        Из-за этого в таких гонках можно увидеть как машина противника уезжает в стену, ты ликуешь, а потом оказывается что был рассинхрон и он на самом деле всё ещё впереди тебя. Второй случай — когда они врезаются в объекты и, сначала кажется будто они прошли через них или объехали, а потом "возвращаются" на место столкновения.
        З.ы. мне кажется что нечто подобное с экстраполяцией использовали и в WoW — когда происходит рассинхрон — если герой на момент рассинхрона шёл вперед, то он продолжает идти вперед.


      1. springimport
        03.08.2017 21:58

        100 мс может быть между континетами, обычно он до 50 мс.


        1. TheShock
          03.08.2017 23:06

          У меня в КС: Го стабильный пинг 100 мс.


          1. edge790
            04.08.2017 16:44

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


        1. edge790
          04.08.2017 16:42

          между континентами он больше. Переехал из одного города в другой. Расстояние 350км. В первом пинг был в районе 35мс, в текущем 15мс.


          1. springimport
            04.08.2017 17:06

            Не больше. Сев Ам. и Москва, пинг примерно 110.


            1. IgeNiaI
              04.08.2017 17:50

              Северная Америка и центральная Европа — 130
              Кому как повезёт…


              1. springimport
                04.08.2017 18:08

                Verizon?


                1. IgeNiaI
                  04.08.2017 18:17

                  Rogers. Из Миссиссаги до Франкфурта (WoT сервер RU3). До Москвы около 150


  1. Simplevolk
    02.08.2017 22:40

    А где можно поиграть в мультиплеерную версию игры?


    1. osdeverr
      02.08.2017 22:46

      Как только сервера будут работать — я вам напишу в ЛС. 14 августа, скорее всего, заработают.


      1. ilyaplot
        03.08.2017 10:07
        +1

        Буду рад, если тоже получу сообщение :)


      1. Andrei59rus
        03.08.2017 11:49
        +1

        Тоже хочу очень по играть, за ранее спасибо!


      1. Superilya
        03.08.2017 11:49
        +1

        и мне пжлст)


      1. dencraft23
        03.08.2017 11:49
        +1

        А реализацию всей физики на сервере, а управления с передачей на сервер не пробовали?
        Это конечно увеличит отклит на управление, но все остальные проблемы должны решиться.


      1. BlackMighty
        03.08.2017 11:49
        +1

        Так и не нашёл комментария с тем, как найти ваш проект, а хотелось бы следить за его развитием)


      1. Shpall
        03.08.2017 11:49

        Ранее тоже писал мультиплеер по гонкам на Unity. Очень интересно посмотреть вашу версию. Если не затруднит — скиньте тоже, пожалуйста!


      1. osdeverr
        03.08.2017 11:57

        Хорошо, сейчас скину. НЛО, знайте: меня попросили :P


      1. osdeverr
        03.08.2017 12:01
        +2

        Проект называется MW-Online.
        Видео геймплея: https://youtu.be/LMGLWHeLuJo.
        Скриншоты есть в статье, если хотите поиграть, то есть Discord-сервер: https://discord.gg/383Q6q5. Общение в основном на английском, но есть русский канал.


      1. psFitz
        03.08.2017 12:32

        +


      1. IvUyr
        03.08.2017 18:51

        Был бы очень рад тоже получить приглашение!


        1. osdeverr
          03.08.2017 18:52

          Открытый бета-тест идёт уже месяца 3-4.


  1. jeks0n
    03.08.2017 10:02
    +7

    Добавьте уже ссылки, не дело каждому заинтересованному в комментариях просить. Ради этого, первый раз за два года на сайте за логинился.


    1. osdeverr
      03.08.2017 18:53

      Добавил в статью.


  1. Evengard
    03.08.2017 10:38
    +4

    А где история о реверсе нужных оффсетов? В общем, мало технически-реверсных аспектов, больше организационные, ну и немного архитектурных.


    1. osdeverr
      03.08.2017 18:58

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


  1. VioletGiraffe
    03.08.2017 11:05

    А как выполнялось, собственно, программирование игры? Клиент является отдельным приложением, которое копошится в памяти у процесса NFS?


    1. osdeverr
      03.08.2017 11:58

      Именно.


  1. domix32
    03.08.2017 11:29

    А не пробовали трюк из третьей Quake с передачей только изменившихся состояний?


    1. IgeNiaI
      03.08.2017 20:48

      Куда лучше работает трюк из современных шутеров с передачей только действий игроков и лишь изредка сихронизацией координат.


      1. domix32
        03.08.2017 21:25

        Не могу ничего толком сказать про современные мультиплеерные шутеры. Q3, UT3 последние игранные из этого разряда


      1. osdeverr
        03.08.2017 22:21

        Мы так и делаем, FYI.


        1. IgeNiaI
          03.08.2017 22:31

          Судя по вашему описанию, вы передаёте не действия игрока, а скорость и угол движения авто. Впрочем, в случае гонок так даже лучше.


          1. osdeverr
            06.08.2017 12:13

            Особой разницы нет.


  1. b1rdex
    03.08.2017 11:38
    +1

    В чем отличия от https://sohabr.net/habr/post/321166/?


    1. LoadRunner
      03.08.2017 13:12
      +1

      В том, что поправили баги и готовы показать продукт общественности?


  1. hypercycle
    03.08.2017 11:51
    +2

    В то время, как для игры 2005, в которой УЖЕ есть мультиплеер делают ещё один самопальный мультиплеер, никто не хочет заняться восстановлением сетевой кода для NFS World, для которого уже сделали основу сервера.

    P.S. Osdever меня заминусует однозначно)


    1. osdeverr
      03.08.2017 11:52

      О, Влад, привет :3

      Коммент одобрил. Ворлд же уже, вроде бы, вполне рабочий, не?


      1. hypercycle
        03.08.2017 15:04

        Если бы… Гонки всё так же с диким рассинхроном, замедлениями и ускорениями 1 на 1 + свободная езда, которая иногда и пяти минут не держится и вырубается (к тому же её кода у меня нет, а сервак с ней отберут, хех).

        По поводу МВ-Онлайн, вам бы как-то найти параметры ботов, отвечающие за машину и её тюнинг, после брать эти же параметры с машины игрока и посредством передачи сервера присваивать их ботам (возможно чушь несу). Уже будет достойная основа :)


        1. osdeverr
          03.08.2017 16:10

          Berkay над этим работает.


  1. boris768
    03.08.2017 11:52

    А возможна ли интерполяция для такого типа игр? На сколько знаю, в FPS играх для мультиплеера она активно применяется, даже про Quake не так давно была статья об этом.


    1. osdeverr
      03.08.2017 11:54

      Машины будут телепортироваться на небольшие расстояния, а не двигаться, а ещё колеса крутиться не будут.


  1. imhoil
    03.08.2017 11:52

    Оптимистично всё. Но как только будет нормальный онлайн — наверняка будут проблемы. Появятся читеры, которые будут бесить обычных пользователей. Будут форумы, где эти читы буду продаваться/раздаваться. Задумайтесь сразу про то, что никогда и ни в чем нельзя доверять «клиенту», всё должно обязательно обсчитываться на сервере.


    1. osdeverr
      03.08.2017 11:55

      С радостью, да нет копии мира на сервере: игроки будут в стены влетать, ибо для сервера их просто нет.


      1. imhoil
        03.08.2017 16:08

        Даю подсказку, она есть в клиенте :) Другой вопрос, сколько будет нужно времени и сил на ее вытаскивание, конвертирование и прикручивание к серверу.