NFS用のマルチプレイヤーMWの書き方

こんにちは、Habr! 最初の投稿では、NFS Most Wanted 2005リリース用の非公式マルチプレイヤーを半年前からどのように書いてきたかを説明します。 すぐに言わなければならない-リンクはなく、スクリーンショットだけがあり、平凡な広告とは見なされない。 興味深い場合は、コメントでお尋ねください。 行こう!



画像



すべては2016年の終わり、つまり昨年、または11月に始まりました。 MWInsideトレーナーの開発者と話をしましたが、正直なところ、特別な知識を持っていなかったためです。 ライバル、警察、普通の交通機械など、プレーヤーとは異なる車を運転する方法を学びたいと言いました。 彼は何も答えませんでした。 12月末までスキップします。12月の終わりに、このすべてに影響を与えたJojezと、アイデアを手伝ってくれたExOptsチームに会いました。 だから、私は自分の手でプレイヤーの座標、速度、傾き、回転のアドレスを持っていました。 いくつかの調査により、それらはすべて同じ構造のフィールドであり、おそらくISimableであり、サイズが176バイトであると計算しました。 これらのすべてのアドレスに176を追加すると、別の車にも同じ意味が与えられます。 これは、実際には数十通りの道を開いた発見でしたが、まず、1月末まで、私はオンラインではなく、警察のヘリコプターを制御するための簡単なトレーナーを書きました。 1月23日まで再度スキップします。



サム、実はマルチプレイヤー



だから、23日目、朝。 友達のYaNetにマルチプレイヤーを書くように勧めます。 彼は同意し、彼の古いプロジェクトからコードを取得し、24日までにC#で最小限のサーバーとクライアントを手に入れました。 その後、Cで書き直されましたが、それは別の話です。 24日目に、私たちはこのゲームで作業を始めました。 ところで、NFSScript-DennisStanistanからmodを作成するためのAPIを使用しました。 クライアントにサーバーからの乱数を要求し、到着後、ゲームを使用して画面に表示します。 それはほんの始まりでした...



プレイヤーの同期-True Hell



すぐに本物のマルチプレイヤーを作る時が来ました。 クライアントは座標を送信し、サーバーは他のユーザーに座標を送信し、側のユーザーはそれらをマシンに割り当てました。 おもしろいことは何もありませんでしたが、それはひどく不安定でバグがありました。車は文字通り攻撃を受​​けていて、揺れて投げ出されていました。 同時に、広告を出さないようにArturoPlayerOneという名前を公開しないサイト管理者の1人が、公開テストが実施されていることを知らせる固定トピックを作成しました。 もちろん、人々はチャットに参加しましたが、本当にすべてのバグを壊したために、興味を持ち続けていたとしても誰も普通にプレイできませんでした。 その後、これらすべてのバグはもちろん修正されましたが、Cでクライアントとサーバーを完全に書き換えることによってのみ修正されました。 同期も修正されましたが、それは別の話です...



そして、これはコードの一部です:)



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);
      
      





正直なところ、かなり長いコードです。 15分ほどコメントを書きました。 さあ、先に進みましょう!



どのような問題が発生しましたか



それらの多くはありましたが、現在はいくつかありますが、今日は最も重要な3つについて、そして最後からお話しします。 行こう!



3番目:同期



なぜ3位になったのですか? 特に彼女は邪魔しなかったので、私見。 はい、彼女はひどいですが、ゲームプレイを壊しませんでした。 どのように修正しましたか?

正直に言うと、今日まで完全に修正されているわけではありませんが、私たちがやろうとしたすべてのことを教えてください。





2番目:ミックス全体をむさぼり食う



はい、はい、クライアントがチャネルを獲得すると、そのチャネルはナンバーワンと密接に関連しています。 Googleデータセンターを接続するよりも接続が悪い場合、クライアントは単に動作しなかったか、残りは動作しませんでした。 これは、バージョン0.6で最近修正されました。 判明したように、何らかの未知の方法で、DoS-(およびサーバーに5人のプレイヤーがいる場合、一般にDDoS-)が文字通りサーバーを攻撃するだけでなく、1000回バイトを送信して接続を切断するコードを記述しましたミリ秒で! このバグについて他に何が言えるかはわかりませんが、修正されているため、すべて問題ありません。 そもそも渡します!



ナンバーワン:再発



さらに正確には、シャットダウン。 ゲームからのプレイヤーの退場は、単に提供されませんでした。 空のサーバーで1度訪問した場合、そのIDは1に等しくなりました。 クライアントを再起動すると、IDはすでに2になります。 奇妙ですね。 しかし、3人のプレイヤーが一緒にチェイスし、1人が接続を切断し、彼が再び入った場合はどうでしょうか? 言うまでもなく、3人のプレーヤーが最大でしたか? それは私とすべてのプレイヤーを激怒させました。 その結果、私は自分の力を集めて、プレイヤーのシャットダウンを書いた。 2秒以内にプレーヤーからのパケットがない場合、プレーヤーは切断されます。 偶発的なシャットダウンは除外されます-「ping」は1秒間に2回発生します。 それがすべてだと思います。



画像



別のスクリーンショット



あとがき



彼はそうではないでしょう。 唯一のものはGrimMaple 、私に答えてください! 私も感謝したいと思います:





それだけです! さようなら それでも彼らがそれを公開したら、私は喜んで続編をリリースします。なぜならここでは最も重要なことだけを説明したからです。 じゃあね!

PSコメントで多くの質問を受けたので、情報とリンクを投稿します。

このプロジェクトは、MW-Onlineと呼ばれます。

ゲームプレイビデオ: https : //youtu.be/LMGLWHeLuJo

プレイしたい場合、つまりDiscordサーバーのスクリーンショットは記事にあります 。 コミュニケーションは主に英語ですが、ロシアのチャンネルがあります。



All Articles