ゲームボットは、ゲームの世界や他のエンティティをどのように認識していますか?


52

この質問はしばらくの間私の頭にありました...主に、WoWなどのあらゆる種類のゲームのボットを見ているからです。私の質問は ボットは、画面に表示されているものをどのように知るのですか?私はWoWをプレイしないので、私の例は間違っているかもしれませんが、たとえばモンスターがいる場合、ボットはどのようにしてそのモンスターが画面上のどこにあるのか、どのようにそれと対話するのかを知るのですか?

これを任意のゲームに適用できますか、それとも各ゲームに固有ですか?質問が明確でない場合は申し訳ありません...そしてボットの作り方を尋ねるのではなく、画面上で物事をどのように検出するのかを私に非常に魅力的に尋ねています!

前もって感謝します :)


14
ほとんどの場合、これらのボットは、画面の内容を理解しようとする代わりに、ゲームのメモリにフックし、ゲーム要素の位置を直接読み取ります。
アレクサンドルデビエン

2
Aceboy1993、あなたはプログラマーですか?質問を編集して、いずれかの方法でお知らせください。それに応じて、回答はおそらく少し異なる方法で行う必要があります。
パンツァークライシス

3
ただ明確にします; あなたはゲームプレイの非組み込みの自動化について話しているのですか?ゴールドファーミングボット、エイムボットなど?それとも、単にAIプレーヤーを意味するのですか?
アンコ

こんにちは、私はプログラマーです。ええ、ゴールド
ファーミング

3
@ Aceboy1993両方をカバーすると、この質問が広すぎます。それらを分割してください。
マスト

回答:


77

ボットが自分自身をゲームに投入できるポイントはたくさんあります。

  • 画面はその中の1つですが、最も有用ではありません。しかし、私はかつて、カラーコーディングを使用したCounter Strike用の非常に初期のエイムボットを見てきました。単色のテクスチャを備えた代替のキャラクターモデルが付属しており(ゲームはこれを可能にするのに十分な改造が容易でした)、それらの色のピクセルを検出しました。ただし、あまり効果的な方法ではありません。当時はすでに非常に不格好でしたが、グラフィックエンジンがますます強力になり、光学認識アルゴリズムを混乱させるためにますます詳細になるため、実行可能性は低下しています。

  • 別のポイントは、メモリを直接読み取ることです[1]。コンピューター上の1つのプログラムに別のプログラムを読み込ませることもできます。したがって、開発者は、ゲームがボットに関連する情報を保存しているメモリアドレスを見つける必要があります。メモリイメージを作成し、さまざまな検索ツールを提供することで、開発者が必要なものを見つけるのを支援するツールがあります。対策はアドレスレイアウトのランダム化を使用することですが、スマートボットはまだ探しているものを自動的に見つけることができる場合があります。

  • ゲームの実行可能ファイル自体を変更することは可能です。これを行うには、ボット開発者がアセンブラーで読み取りおよびプログラミングできる必要がありますが、これは多少の練習では難しくありません。次に、関心のある情報を処理するコードを探し、それを書き換えてボットに渡します。ゲーム開発者の観点から考えられる対策は、難読化ツールを使用してゲームのアセンブラーコードを読みにくくすることですが、これらは通常パフォーマンスに適していないため、多くの難読化ツールが作業を元に戻します。

  • そして、ネットコードがあります。オンラインゲームでは、サーバーはネットワークを介してゲーム内のすべてのオブジェクトのプロパティと位置を送信します。サーバーとクライアント間のネットワークデータストリームを傍受して分析できます。これを行うための一般的なツールはwiresharkです。開発者がネットコードをリバースエンジニアリングすると、Wiresharkが行うようにネットワークトラフィックを傍受し、その情報を使用して意思決定を行うボットを作成できます。開発者の意欲が高まると、ネットワークプロトコルを実装し、グラフィック出力さえも行わずにゲームをプレイする完全なゲームクライアントをゼロから開発することさえできます。このようなボットは、グラフィック出力がなければ通常ははるかにリソースフレンドリーであるため、ゴールドファーマーに非常に人気があります。


1: WoWに言及しているので、初期の悪名高いWoWGliderボッティングプログラムはダイレクトメモリアクセスを使用したことを指摘する価値があります。Blizzardには、外部プログラムがWoWの内部ゲーム状態にアクセスするのを検出してブロックするように設計された、Wardenというサブプログラムがありました。ボットプログラムはこの保護を回避し、許可なしにメモリを読み取るため、2006年の訴訟MDY v Blizzard、ボットメーカーがユーザーに著作権侵害を促しDMCAに違反することを奨励し、有効にするという理由でBlizzardを支持して決定されました。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ジョシュ

18

ボットはプレイヤーです。他のすべてのプレーヤーと同じようにサーバーからプレーヤー/モンスターの位置を読み取り、それらの値を単純なAIスクリプトと組み合わせて使用​​して、キーボードストロークとマウスクリックをプログラムでシミュレートすることでゲーム内のアクションを実行します。ボットが実際に画面上のモンスターを検出して対話するアルゴリズムを持っている場合、それは数百万の価値があるソフトウェアの非常に印象的な作品になります。それは基本的にロボットのAIです。


2
いくつかのオクルージョンチェックとレイキャストを行って、ボットがモンスターを見たかどうかをチェックし、アニメーション状態を使用してモンスターが何をしているかをチェックする方が簡単です。
ラチェットフリーク

これを行うには、ゲームをリバースエンジニアリングし、レイキャスティングを実装し、モンスターのアニメーション状態も読み取る必要があります。これには、コードの注入と.exeの変更が必要になります。これは、サーバーから受信するネットワークパッケージを読み取り(フィリップが示唆したようにWiresharkを使用)、ネットワークパケットに基づいてキーボード/マウスアクションをシミュレートするAIスクリプトを単純に持つよりも簡単ですか?
dimitris93

2
私は、改造されたクライアントボットではなく、「AI対戦相手」ボットを想定していました。
ラチェットフリーク

3
@ratchetfreakああ今では理にかなっています。質問のWoW参照は、実際には「ボット」が基本的にAIの敵ではなく金の農家であることを暗示しています。
dimitris93

7

フィリップはすでにほとんどのボットがどのように動作するかについて素晴らしい概要を示しましたが、私は彼がカバーしたすべてのタイプのボットで、または私が開発した少しの個人的な経験があるので、もう少し詳細に説明したかったです。

Runescapeには、メモリの内容をRunescapeクライアントからローカルメモリにコピーする大きなプロジェクト(RSBot)があり、クライアントがキャッチするリスクなしにゲーム全体の状態を表示できます。データへのポインタを見つけるためにメモリ内のどこを探すかを決定するには、少しリバースエンジニアリングが必要でしたが、いったんそれを行うと、情報を活用するためのAPIを公開しました。オブジェクトの座標を取得し、カメラ変換マトリックスで座標を変換して画面上の位置を取得することで、世界のどこにいるかを正確に把握できます。ヒットマスクも読み取り可能なため、目的の結果を得るためにマウスを移動する範囲を正確に決定するのは簡単でした。

ボットは、どのタイル座標がどこにあるか、このオブジェクトがどのIDを持っているか、特定のアイテムにどのIDが属しているかなどを開発者に伝える注釈などのデバッグ情報を提供しました。ボットスクリプトを作成する実際のプロセスは、実際には非常に簡単でした。フレームワークは、次のような多くのユーティリティ関数を提供move_to(world_coordinates)またはmouse_move(x,y)幾分信じられる方法(繰り返しミニマップとスクリーンの両方を介して移動する、ランダムスプラインに沿ってマウスを移動する、など)で指定されたアクションを実行することになります

また、Runescapeには、グラフィックの品質を大幅に低下させるオプションがあります。画面を撮影し、いくつかの基本的なコンピュータービジョンの概念を適用して世界のモデルを構築することで、特定の種類のボットを作成するのは実際には非常に簡単でした。この手法を使用して、呪いボットと製錬ボットの両方を作成しましたが、どちらも非常にうまく機能しました。フレームを取得し、できる限り彩度を上げてから、パターンを抽出してクリックゾーンの確率マップを生成します。

呪いボットの場合、ターゲットはより小さな悪魔でした。これはただの巨大な赤いもので、見つけるのは簡単です。製錬ボットの場合、灰色に囲まれた小さなオレンジの台形を探し、それが炉になります。また、銀行の机となる、大きな明るい灰色の「L」字型を見つけようとします。これは、ダウンスケーリングと基本的なヒューリスティックで行われました。また、ミニマップの横にある便利なコンパスで自分自身を方向付けることができるため、カメラをより信頼できる位置に向けてターゲットオブジェクトを見つけることができます。

さまざまなNexonゲームでは、サーバーはクライアントを非常に信頼しています。Maplestoryでこれを悪用したのは、マップを修正してハザードを削除したり、ワープを追加したりすることで、ボットがそれほど洗練される必要がないようにすることです。また、サーバーへのトラフィックとサーバーからのトラフィックを監視して、モンスターをすばやく見つけて殺すために使用できる世界のモデルを構築しました。

MMOを実際にはもうプレイしておらず、単にMMOを自動化していないことに気付いたら、プレイを完全に停止することにしました。私が合法的に自分自身を暴露することを心配していなかったなら、MMOボットを売って殺したかもしれませんが、私は本当に訴えられたくありませんでした。だからこそ、私は最近、実際のプログラミングに時間を費やしています!


その最後の段落のアーメン。1)WoWをプレイする2)WoWをボットする3)WoW用に自分のボットを書き始めることで、プログラミングに気付きました。わずか2年で得たプログラミングの知識は、勉強中に学んだ他のどのプログラムよりも価値がありました(少なくとも、「実用的な」プログラミングに関しては)。
セバスチャングラフ

2

Phillipの答えは素晴らしいですが、Model / View / Controllerパターン、または略してMVC に関する簡単なメモです。

画面は「ビュー」の一部であり、「モデル」からのデータを表示します。これは、必要に応じてゲームの実際の状態です。ボットとキャラクターはすべて、モデル内に(ある意味で)「存在」しています。画面のプラグを抜いた場合を想像してください-ビューがなくなってもゲームは続行します。

ネットワーク化されたゲームでは、実際には多くのモデルがあるため、「モデル」の概念は少し複雑です。サーバーにモデルがあり、次に各クライアントにモデルがあります。モデルは、サーバーから受信したデータによって部分的に更新されます。「モデル」は、サーバーのモデルとクライアントのモデルを包含すると考えることも、独自のクライアントのモデルと考えることもできます。いずれにせよ、ここがボットの住む場所です。したがって、データの入力と状態の省略形として使用できる「認識」は、その時点でのモデルの状態と、そのモデル内の異なるエンティティ/オブジェクト間の相互作用に基づいています。実際には、各ボットには「refreshState」と呼ばれる機能があります。この機能は、フレームまたは何かごとに1回実行され、それによって更新されます。


0

ファイルまたはサーバーから座標を読み取ることができますが、光線衝突検出システムを使用することもできます。ボット(その場合)から彼の外部に向かう光線を使用するのが一般的です。光線が何かと衝突すると、光線がプレーヤー、ボット、動物、または単純な壁であるかどうかなど、何らかの情報をボットに返します。それは、たとえばプレイヤーとボットの場合、そのタイプに関する情報(人間、ボットなど)を完全に含む不可視のカプセルがあるためです。それにより、たとえば彼らがあなたを追っている場合、彼らは壁や他の要素との衝突を避けることができます。

このページの部分衝突検出を見ることができます


ただし、実際のゲームにコードを挿入する必要があります
-dimitris93

はい、もちろん。すべてプログラムされていますが、無料のパスや、ボットのようなケースを追跡する場合などに便利です。3DゲームではAFAIKが最も一般的な方法であり、少なくともmmorpではないものを調査しました...サーバー上のすべての情報はあるが、大きなmmorpであるため、すごいかもしれません。
Megasa3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.