« 熱… | メイン | ET:UrT近況 »

May 07, 2005

■ W:ETソースコード朗読会 補足3

Reading the Source Code of W:ET Appendix #3

ゴールデンウィークもいよいよ終盤戦、みなさまごきげんいかがでしょうか。私は旅行行ったりフリーマーケット行ったりライブイベント行ったり釣りに行ったりゲームしたりと実に気ままに過ごしました。

今日は雨も降っていますしゲーム(もちろんET)をして一日をつぶそうとしていたのですがルーターの調子がすこぶる悪いので唐突にソースコード朗読会補足です。今回はクライアントサーバー間での情報のやり取りと同期、また若干ですがチートツールについても言及します。

クライアントの情報送信と予測

クライアントとサーバーの情報のやりとりについてすこしばかり。

みなさんETを遊んでいる時は大抵キーボードを使っているかと思います。この場合プレイヤーはキーボードで「前進(forward)」に割り当てたキーを押すと前進しますよね。当たり前なことを申しましたが、実はこの部分にはいくつか段階があります。

まずプレイヤーであるみなさんが「前進」に割り当てたキーを押すと、クライアント(みなさんのETプログラムです)は、「前進」キーを押してるぞ、とサーバーに情報を送ります。言い換えると、前進キーを押しただけではまだ前進していません。あくまで押した情報が送信されているに過ぎないのです。この前進キーを押している情報がサーバーに届き、移動の処理が行われ、計算された速度と位置がクライアントに返って来た時点で初めてクライアント(プレイヤー)は無事移動したことが確認できます。

またちょっとややこしいのですが、クライアントソフトはサーバーに送ったデータを元に、「こんな情報が戻ってくるに違いない」と予測を行います。なぜこんなことをするのでしょうか。理由はサーバークライアント間の通信タイムラグ、そして環境差による処理フレームレート同期を図ることが困難であるからです。もしクライアントがキー情報を送ってから、サーバーが速度と位置情報を返してくるまで何もしないと、ping値にもよりますが約0.5秒程操作と動きにズレが生じます。これは凄まじくプレイヤーにとってストレスになりETを駄作にしかねない問題です。クライアントが予測して結果を即座に画面へ反映してくれるおかげで、ストレスのない操作が可能になっております。

しかしあくまでも「予測」であるため、実際にサーバー上で処理される数値とズレを生じる可能性があります。この原因は回線の問題であったり処理の遅れであったりはたまたアンチラグの補正であったりと様々です。予測値と実際がずれた場合プレイヤーは奇妙な現象に遭遇します。つまりワープしたり、巻き戻ったり、相手が見えないのに攻撃を受けたり、逆に何もない空間を撃ったつもりでも当たっていたりします。

アンチラグ機能は他のプレイヤー移動という非常に予測しにくい情報に対する別角度からの補償です。サーバーはクライアントが見ている時間に遡って攻撃判定を行います。つまり現在のプレイヤーではなく(攻撃側クライアントping相当の)過去のプレイヤーが攻撃されているのです。

みなさん自分の画面ではRailgunの列車を動かしている相手を完全に捕らえているはずなのに列車にばかり当たって倒せないことなかったでしょうか。これこそがマップオブジェクト(障害物)とプレイヤー位置の非同期による問題です。あなた(私)が見ているとき射線は開けているけど、撃った情報がサーバーで処理されるまでの間に列車は動きます。加えて今見ているものも過去のものです。そして当たり判定を行うときアンチラグ機能により相手の位置は私が撃った時間のものに戻ります。しかし列車の位置は戻どころか余計に進みます。ゆえに弾丸はゴツンと鈍く列車に当たってしまいます。

サーバーとクライアントの関係について詳しくはこちらCode3Arenaにてご確認ください。

チートツールについて

上記のようにプレイヤーの具体的な数値はサーバー上で主に扱われています。そしてサーバーはクライアントからはキー情報(とコンフィグ)しか受け付けません。逆に言うとクライアントに送られてきているのはあくまでも計算結果であり、これをクライアントがバイナリ改変やメモリアクセスによって変更してもサーバー上の数値は変わらないのです。つまり攻撃可能な位置にいない相手をいきなり倒す、自分が死なないようなチートはサーバーハックでもしない限り無理です。

しかし考える限り可能なチート行為はあります。既に世に出ているオートエイムやウォールハックの類はまさにそれです。オートエイムはサーバーから送られてきた相手の位置情報を元にプレイヤーの視線方向を調整するものです。ウォールハックはクライアントソフトもしくはドライバソフトに改変をし、特定オブジェクトの描写条件を変更することによって達成しているものと思われます。これらのチート行為はQ3エンジンの特性上未然に防ぐ方法はありません。あくまでもメモリ監視や定期的にスクリーンショットを確認するなどによってのみ除外可能となります。

またとある特定条件下では、プレイヤーに対して攻撃が無効になったり当たりにくくなったりなど特殊な扱いを受ける場合があります。これはもともと通信の不具合など偶発的に起こりうる事態を保障する機能ですが、この状態を故意に作り出したとすればこれは立派なチート行為と考えられます。

チートしてまでゲームするくらいならバスケットボール持ってフリースローでもしていた方が健康にも良いですし楽しいのではないでしょうか。楽しくないゲームをしてストレスを溜める必要もないですしね。ET以外にも世の中には楽しいことなんてうなるほどありますが、私はとことんET負けた時はフリースローして気を紛らわしています:-D。

投稿者 ikanatto : May 7, 2005 02:27 AM

■ コメント