2009-03-06 5 views
4

あなたが見た初心者のミスとその治療法は何ですか?マルチプレイヤー/オンラインゲームプログラミングで最も多く見られる初心者ミス?

何度も何度起こっても、クライアントはサーバーに対してどのような方法でもチェックされません。例えば

  • ユーザーがFlashゲームのソースを逆コンパイルまたはネットワークトラフィックに待機し、ハイスコアのデータが起こっても、ゲームをプレイしていないが、偽のハイスコアを送信している場合見ています。
  • ユーザーはトレーナーを使用し、現在のレベルでは表示されないアイテムを取得します。これは "client X got item Y"のようなサーバーに送信され、サーバーはそれを受け入れます。

単純な治療法はもちろん、ゲームクライアントをサーバーのAPIとして扱うことです。その後、ユーザーは好きなだけトレーナーや他のメモリ操作を使うことができますが、サーバーはあなたがそれを行うことはできないと言います。サーバーをデータベースと見なして、その上にゲームルールがあるものを照会することができます。例

  • クライアントのために

    :ゲーム

  • Clientを起動します。サーバー
  • クライアントに接続します。サーバー
  • ユーザーから利用可能金額を照会:
  • を無限にお金をセットトレーナーを可能にします
  • クライアント:server.buyItem( '非常に高価')
  • サーバー:gamestateを確認します(ユーザーは今購入できます)。プレイヤー[0] .money - >ボーナスなしをチェックします。
  • クライアント:server.buyItem( 'これを取得できます')
  • サーバ:gamestateを確認します(ユーザーは今購入できます)。プレーヤー[0]を確認します。 player [0] .items.add( 'これを得ることができます')これはプレーヤー[0] .moneyからのコストを削減します。次に、クライアントsend(player [0]、 'items'、 'this get')に通知します。 send(プレイヤー[0]、 'money'、プレーヤー[0] .money)。

もう1つの方法は、クライアントの動きを記録し、サーバーが再生するハイスコアサーバーに送信することです。もちろん、これはレコードが非常に大きいことにつながります。

+1

これはあなたのブログですか? – shoosh

+0

+1 - 多分あなたの質問の第2部分を答えに移すのですか? –

+0

これが無効な質問である理由について、いくつかのサブテキストがありますか?クローザーとダウンボッター、私を手がかりにしてください... –

答えて

6

間違いなく、クライアントの盲信。私が取り組んでいるゲームでは、すべての "ビジネスロジック"をサーバーサイドに保ち、クライアントマシンには自分がどのようなコマンドを送信するかだけを伝えさせます。たとえば、「プレーヤーBは右に動こうとします」 - しかし、サーバーは移動した右にどれだけ距離を計算しますか。これにはパフォーマンス上のオーバーヘッドがあります(さらに遅れの問題も改善されます)。そのため、クライアント側で重い計算を実行しても、サーバー上にチェックが残っている可能性があります。例えば、クライアントのプレーヤーが更新の間の時間内におそらく可能である以上に動いているかどうかをチェックする。つまり最大プレイヤー速度が200ユニット/秒である場合、150ユニットを移動したことを0.5秒後に更新する場合は、それらを起動する。

もちろん、これは必ずしも誰かがキープレスを送信するボットを作成するのを止めるわけではないので、これを防ぐ他の方法があります。それでも、妥当性検査を全くしていないのは初心者の間違いです(私がショートカットをとったときに私は罪悪感があったことは間違いありません)。

+0

+1 - 私の答えよりも優れています。 =)純粋なサーバー側のプレーヤーの動きの例を処理する1つの方法は、クライアント側の予測コードですが、それは適切に釘付けするのは難しいですが。 –

+0

クライアント側の予測コード、ねえ?聞いたことがあるとは言えません。あなたは説明にリンクしていますか?私は興味をそそられている=) – Smashery

+0

これは補間と呼ばれ、それはほとんどすべての現代のFPSエンジンで使用されています。 (例えばcl_interpを介してソースエンジンで調整可能です。) – strager

1

皆さんは、クライアントを信頼するサーバで間違っている可能性があります。私が考えることができる他の本当の問題はありません。

何が間違っているかを伝えるのではなく、何が正しいかを見てください。

バルブは、多くの作業をnetcodeに入れました。

+0

実際、バルブは「クライアントを信頼する」ための主要な犯人のひとりです。サーバーとオブザーバーに従っているプレイヤーは、そのプレイヤーのクライアントに表示されていれば、別のプレイヤーによって撃たれることがあります。 Valveは彼らのゲームでこれを好むが、普遍的に良い解決策ではない。 – Kylotan

+0

ええ、そうですね。すべてのケースでサーバーには最終的な発言があります。あなたが言うことが真実ならば、それを見ずに人を殺すためのハックを作ることは可能でしょう。 – Pyrolistical

+0

サーバーには最終的な発言がありますが、最終的にクライアントが操作できる遅延の見積もりに基づいて「巻き戻し時間」に依存しています。これは、一貫性を犠牲にして、シューティングゲームに良い感じを与える。 (http://developer.valvesoftware.com/wiki/Lag_Compensation) – Kylotan

6

Valveが(少なくとも1つの点で)取ったアプローチは、クライアントとサーバーが独立してゲームをシミュレートすることでした。次に、サーバーは信頼できるシミュレーションを行い、すべてのクライアントに状態の更新を送信して、間違いやハッキングの試みを修正します。

など。左矢印を押すと、キャラクターはすぐに左に移動します。サーバーが「OK」と言うのを待つことはありません。しかし、あなたが壁を通って自分自身をハッキングしたことが判明した場合、次のサーバーの更新により、壁のすぐ横にサーバーが表示されます。

同様に、クライアントが前方への移動を見た場合、サーバーが正式な応答を返すまで前方への移動を続けると見なされます。

このアプローチは、サーバーが主要な決定を下し(シミュレーションの過程で健全性チェックを実行する)、クライアントがサーバーから単語を取得するまでクライアントが予測を行うため、ラグを処理するため、ハッキングの試行を無効にします。

「クライアントを信頼する」というもう1つの大きな間違いは、ネットワークプロトコルを偽造できないと考えていることです。人々は、バイナリチャンクをサーバーに送信すると、これらのバイナリチャンクがリバースエンジニアリングされることはなく、何が起こるかを知るためにデータを混乱させると想定している傾向があります。これはあらゆる種類の問題を引き起こしました。