![画像](https://habrastorage.org/web/930/eaa/daf/930eaadafaf444f9b03d1088e2138731.png)
すべては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位になったのですか? 特に彼女は邪魔しなかったので、私見。 はい、彼女はひどいですが、ゲームプレイを壊しませんでした。 どのように修正しましたか?
正直に言うと、今日まで完全に修正されているわけではありませんが、私たちがやろうとしたすべてのことを教えてください。
- 重度のチェリャビンスク法 :すべての物理パラメーターをできるだけ頻繁に同期しようとしました。 ハハ、いや! 変更はなく、すべてが不敬にブレーキをかけ始めました。 ゴミ箱に。
- パッケージサイズの縮小 。 クライアントは「同期」問題の解決策としてのみトラフィックを「食べる」ため、アクションは悪くありません。骨にとっては無意味です。 埋め立て地へ。
- そして最後に。 座標と速度の分離 、実際に機能するソリューション。 以前は、すべてを常に同期していましたが、変更されました。速度と回転は常に同期されますが、座標は数秒に1回だけです。 これにより、プレイヤーは滑らかで美しくなりました。
2番目:ミックス全体をむさぼり食う
はい、はい、クライアントがチャネルを獲得すると、そのチャネルはナンバーワンと密接に関連しています。 Googleデータセンターを接続するよりも接続が悪い場合、クライアントは単に動作しなかったか、残りは動作しませんでした。 これは、バージョン0.6で最近修正されました。 判明したように、何らかの未知の方法で、DoS-(およびサーバーに5人のプレイヤーがいる場合、一般にDDoS-)が文字通りサーバーを攻撃するだけでなく、1000回バイトを送信して接続を切断するコードを記述しましたミリ秒で! このバグについて他に何が言えるかはわかりませんが、修正されているため、すべて問題ありません。 そもそも渡します!
ナンバーワン:再発
さらに正確には、シャットダウン。 ゲームからのプレイヤーの退場は、単に提供されませんでした。 空のサーバーで1度訪問した場合、そのIDは1に等しくなりました。 クライアントを再起動すると、IDはすでに2になります。 奇妙ですね。 しかし、3人のプレイヤーが一緒にチェイスし、1人が接続を切断し、彼が再び入った場合はどうでしょうか? 言うまでもなく、3人のプレーヤーが最大でしたか? それは私とすべてのプレイヤーを激怒させました。 その結果、私は自分の力を集めて、プレイヤーのシャットダウンを書いた。 2秒以内にプレーヤーからのパケットがない場合、プレーヤーは切断されます。 偶発的なシャットダウンは除外されます-「ping」は1秒間に2回発生します。 それがすべてだと思います。
![画像](https://habrastorage.org/getpro/habr/post_images/8ff/372/dea/8ff372deae64c49b7cac9921cbe2ad77.png)
別のスクリーンショット
あとがき
彼はそうではないでしょう。 唯一のものはGrimMaple 、私に答えてください! 私も感謝したいと思います:
- nlgzrgnでレースで7人のライバルを獲得する方法。
- SpeedyHeart / speedycat / SpeedyChanで同期を支援します。
- ゲーム機能のアドレスとその使用に関する情報については、ザンビアとデニススタニスタン。
- デザイン、アイデア、ビデオのelaymm4は、MODの「顔」を一言で表しています。
- YaNet(dz3n)の最初のヘルプ。
- 私たちのプロジェクトへの献身に対する多くのプレーヤー。 あなたのためのグラス!
それだけです! さようなら それでも彼らがそれを公開したら、私は喜んで続編をリリースします。なぜならここでは最も重要なことだけを説明したからです。 じゃあね!
PSコメントで多くの質問を受けたので、情報とリンクを投稿します。
このプロジェクトは、MW-Onlineと呼ばれます。
ゲームプレイビデオ: https : //youtu.be/LMGLWHeLuJo
プレイしたい場合、つまりDiscordサーバーのスクリーンショットは記事にあります 。 コミュニケーションは主に英語ですが、ロシアのチャンネルがあります。