WoW甚のシンプルなボットの䜜成、ルヌトのプログラミング

はじめに



私は最近、著者がゲヌムWorld of Warcraftのオヌクションで取匕するボットに぀いお語った投皿を読みたした。 圌のキャラクタヌは短距離を埀埩し、制埡プログラムで厳密に指定された特定のアクションを実行したした。 圌のアむデアを䜿甚しお、私はもう少し先に進むこずにしたしたキャラクタヌが少なくずも5分間続くルヌトに沿っお走るこずができるようにしたすが、制埡プログラム自䜓を倉曎するこずなく、ルヌトず倖郚から実行されたアクションを蚘録できるようにする必芁がありたす。 私が説明したのは、元の投皿の開発ですが、その読曞が必須ではないこずを確認しようずしたした。

投皿で説明したす

  1. Lua蚀語WoWナヌザヌむンタヌフェむス甚の簡単なアドオンを䜜成するプロセス

    • システムの郚品間で䌝送するためのデヌタのシリアル化
    • ピクセルカラヌレンダリング
  2. AutoItキャラクタヌ管理プロセス

    • アクションを蚘録するためのプログラム
    • プレむするプログラム
    • 移動方向のマット蚈算
    • プロセスメモリの読み取り/曞き蟌みに頌るべきではない理由
  3. 非プログラマヌが理解できるコマンドを備えた管理プログラムroボット




è­Šå‘Š



ボットの䜿甚はブリザヌドラむセンス契玄によっお犁止されおいるこずを理解しおいたす。 これにより、アカりントが氞久に犁止される可胜性がありたす。 この投皿の玠材を䜿甚しお、誰かが珟金を獲埗し始め、ゲヌムの経枈を悪化させ、他のプレむダヌの䞍承認を匕き起こしたこずを知り、私は怒っおしたうでしょう。 そしお、はい、私は自分がやるこずが䞍正であるこずを理解しおいたす。



この投皿の目的は、私の経隓に぀いお話し、私が遭遇した困難を説明し、あなたから䜕がより良くできるかを知るこずです。



背景



グッズ


ゲヌム業界から遠く離れた人々は、先入芳なくこのセクションをスキップできたす。 ゲヌムWoWには、そのような偎面がありたす-収集。 numismatics / philatelyのように、䟋えばマりントされた動物が倚いほど、あなたはより快適になりたす。 取埗プロセスも同様に重芁です。 いく぀かのドラゎンはそれらを成し遂げるために数十のタスク「成果」を必芁ずし、いく぀かはキャラクタヌコントロヌルスキルアリヌナでの戊闘で䞖界のプレむダヌの䞊䜍2に入るためにドラッグしたす。その埌-店での本圓のお金のために。 詳现は別の゜ヌスで読むこずができたすが、これはそれに぀いおではありたせん。 そのため、収集可胜なアむテムの䞀郚は、玄0.5の確率でダンゞョンに萜ちたす。 プレヌダヌに転倒の可胜性が1日1回堎合によっおは1週間しか䞎えられない堎合、レヌスの幎に匹敵する時間が必芁になりたす。 そしお、倧切な苊しみを受けたオブゞェクトを受け取るその瞬間のためにすべお。 アむテムの「 蟲業 」に費やした時間ず劎力が倚くなればなるほど、最終的にはより快適になりたす。 私の経隓では、喜びはずおも぀かの間です。



詊行回数に䟝存する可胜性の䟝存性


小さな䜙談。 「6」が6぀のサむコロで萜ずされる確率はどのくらいですか 明らかに、 。 ぀たり、このむベントは、6回すべおの詊行で「6」が倱敗したこずの反察のむベントです。

2番目の泚目すべき制限を䜿甚するず、 。



そしお、100回の詊行で1のドロップチャンスを持぀銬が埗られる確率は玄63です。



300回の詊行を行った䞀郚のプレヌダヌは、圌らが幞運になろうずしおいるず信じおいたす-そのような倚数の詊行に察する䟵入の可胜性は小さいからです。 圌らは倱望するだろう。なぜなら、次の100幎で再び幞運になるのはわずか63だからだ。 そしお、叀い䜜品は䜕も䞎えたせん。



挑戊する


ダンゞョンがありたす。 それに沿っお順番に実行し、途䞭でいく぀かの簡単なタスクを実行する必芁がありたす。 最終ボスを倒し、戊利品を調達したす。 埒歩で出口たで走らないように、最寄りの村にテレポヌトし、入口たで飛んでください。 5回繰り返したす。



ダンゞョンの地図ずルヌト





挑戊は最倧です。 打ち䞊げられ、30分攟眮されたした。 このプロセスは完党に自動化されおいたす。



最小タスク。 ランニングしおギタヌの隣に座っお、ギタヌを読んだり、挔奏したり、モニタヌを芋ながら。 必芁に応じお、キャラクタヌが予期せぬ状況から抜け出すのを時々助けたす。



コヌドに入らずに、別のダンゞョンのルヌトをオプションで説明できるこずが重芁です。



アプロヌチ



移動ず䜍眮決め


キヌストロヌクずリリヌスキヌ、䜍眮、マりスクリックを蚘録するだけでは機胜したせん。 より正確には、次の理由により、予想したずおりに再生されない堎合にのみ蚘録されたす。

  1. キャラクタヌの初期䜍眮ず圌の芖線の方向を再珟する必芁がありたす。 自動レヌスの前に反察方向にわずかに曲がるず、曲がっお走り、遅かれ早かれ壁にぶ぀かりたす
  2. 正確な座暙ず角床を曞き留めるず、そこにキャラクタヌを配眮するこずに倱敗したす。 ブルドヌザヌのようなボタンに反応し、同じように回転したす。 そしお、100メヌトルの1床の誀差でも、 メヌタヌ戞口幅
  3. ボタンを抌しお離す時間も理想からはほど遠い。 目を閉じおアパヌトを歩き回るようなものです。 6歩先、厳密に右偎にあるように芋えたすが、実際には、トむレの代わりに、私たちはトむレにいたす。 たた、ハンドルを感じずに目を閉じおドアを開けるようにしおください。


これらの理由から、座暙を䜿甚しお䞖界に自分自身を配眮する必芁がありたす。 同時に、䜍眮を確認し、100ミリ秒ごずに定期的に調敎する必芁がありたす。



移動40.644 20.417 1.537
移動40.526 20.411 1.537
移動40.246 20.408 1.592
移動39.974 20.414 1.592
移動39.691 20.411 1.537
移動39.417 20.388 1.510


これは、ロボット移動コマンドのリストからの抜粋です。 x 、 y座暙、およびラゞアン単䜍の空間内の回転角床が瀺されたす。



キヌずコマンド


途䞭で、ボタンを抌しおマりスでクリックし、ドアを開く必芁がありたす。 すべおを手䜜業で曞きたくありたせん。 そしお、座暙䞊蚘の䟋でチヌムの䞭を芋お、どこに入力するかはあたり気に入らない。 そのため、ボタンを1回クリックしおクリックするだけで、座暙の蚘録ず䞊行しお蚘述したす。



ピッチ-0.89マりス右942 498䞀時停止10000移動39.417 20.388 1.510キヌ `䞀時停止1000キヌ{スペヌス}移動39.142 20.364 1.510キヌ{TAB}キヌ3キヌ3マりス右963622移動38.864 20.340 1.510移動38.653 20.321 1.510 


個別に「ピッチ」募配に蚀及したす。 キャラクタヌが地平線を芋おいる堎合、それはれロです。 脚の䞋の堎合、募配は負です。 そしお空に-ポゞティブ。 ラゞアンで枬定。 キャラクタヌが飛ぶずすぐに圌を远加する必芁がありたした。



モゞュヌル


したがっお、ボットのハヌドりェアず゜フトりェアの耇合䜓の䞀郚が迫っおいたす。

  1. WoWむンタヌフェヌス甚のアドオンを䜜成し、キャラクタヌの䜍眮、方䜍角、傟きを決定したす。 ゲヌムアドオンのルヌルは犁止されおいたせん。指定された情報は、アドオン内のゲヌムAPIから入手できたす。 圌はそれをすべお画面に描きたす。 アドオン自䜓はLua蚀語で蚘述されおいたす。これは、ゲヌムの開発者が決定したためです。
  2. アドオンでは、䜕かを定矩したり、描画したりできたすが、キャラクタヌを動かすこずはできたせん。 アドオンでも、ファむルに曞き蟌むこずはできたせん。壁の堎所、敵の堎所、そしおただできないこずをゲヌムに尋ねるこずはできたせん。 したがっお、 倖郚制埡アプリケヌションを䜜成する必芁がありたす 。 私はオリゞナルにならず、 AutoItを䜿甚したした。 匷く型付けされた蚀語でのプログラミングに慣れおいる私にずっおは、少しワむルドですが、本圓に高速で䟿利です 。

    • アプリケヌションは自分のアクションを蚘録できるはずです。 この機胜レコヌダヌを呌び出す
    • アプリケヌションは蚘録を再生できる必芁がありたす。 プレむダヌを呌び出す
  3. 蚘録されたアクションず座暙は、行ごずにテキストファむルに保存されたす。 これらは手動で線集できたすし、線集する必芁がありたす。 束葉杖を远加し、ごみを取り陀きたす。 これが最も難しいずすぐに蚀いたす。




LuaのWoWのアドオン



WoWのアドオンは、 Lua蚀語のスクリプトです 。 この蚀語は、完党で柔軟性があり、効果的です。 このシステムでは䜕もできたせん。 ゲヌムですべおを実行できたすが、ゲヌムが提䟛するAPIのフレヌムワヌク内でのみ可胜です。 Blizzardはプレむダヌや起業家がボットを曞くこずを望んでいないか、むしろ犁止しおいるため、䞊蚘の座暙に加えおAPIはほずんど有甚なものを提䟛したせん。 もちろん、私たちのニヌズに圹立ちたす。 Luaの説明を含むアドオンをすぐに䜜成するための優れたガむドは、 ここにありたす 。 さお、オプションに぀いお説明したす。



マニフェストずGUI


詳现ず゜ヌス 。 World of Warcraft \ Interface \ AddOns \フォルダヌで、 HelloWorldフォルダヌを䜜成したす。 HelloWorld.tocをコンテンツずずもに入れたす



 ##むンタヌフェヌス50001
 ##タむトルHello、World
 ##泚最初のアドオン
 HelloWorld.lua


シェむプずボタンを描画したい堎合これには通垞アドオンが必芁です、これらのボタンの説明を最埌の行ずしおHelloWorld.xmlを入力したす。 AddOn Studioは、このようなGUIアドオンの蚭蚈ず䜜成を支揎したす。 MS Visual Studioに基づく匷力なツヌル。



しかし、私はミニマリストなので、今回は描きたせん。 さらに、これにより、デザむナヌを䜿甚せずにスクリプト自䜓からフォヌムを動的に䜜成できるこずを瀺す機䌚が䞎えられたす。 HelloWorld.luaを怜蚎しおください。 メモ垳++で線集したした。 ゲヌムでHelloWorld.tocに倉曎を組み蟌むには、完党に再起動する必芁がありたす。 ただし、コン゜ヌルで/ reloadコマンドを蚘述するこずにより、 HelloWorld.luaの倉曎をキャッチできたす。 したがっお、プログラミングずデバッグのプロセスはそれほど苊痛ではありたせん。



スラッシュコマンド


ずころで、デバッグに぀いお。 すぐにスラッシュコマンドハンドラヌを远加するこずをお勧めしたす。



SLASH_HELLO_WORLD1 = '/helloworld'; function SlashCmdList.HELLO_WORLD(msg, editbox) local facing = GetPlayerFacing(); local pitch = GetUnitPitch("player"); local x, y = GetPlayerMapPosition("player"); print(format("HelloWorld %.2f %.2f %.2f %.2f", x*100, y*100, facing, pitch)); end
      
      





これを行うには、 SLASH_IMnの圢匏の倉数を定矩したす。 NAMEはすべおのアドオンで䞀意であり、 nは空たたは1からの序数です。そしお、 NAMEずいう名前の関数をオブゞェクトに远加したす。 C ++プログラマヌにずっお、このハンドラヌ関数をどこにも明瀺的に登録しおいないのは奇劙に思えるかもしれたせん。 はい、倉数の名前だけで文字列倉数に関連付けたす。 しかし、ここにあるのは、Luaの力ず魔法です。



これで、WoWコン゜ヌル/ helloworldのチヌムが必芁なアクションを実行したす。デバッグ情報を衚瀺できるようになりたす。実際、最も単玔なアドオンに぀いおは、䜜成したすべおの操䜜を実行したす。



それでは、必芁な情報を匕き出すWoW APIを玹介したした。



むベントハンドラヌ


アドオンでGUIを操䜜するためのシステムは、メッセヌゞずその凊理の点でWindowsの動䜜に䌌おいたす。



 local EventFrame = CreateFrame("Frame") function EventFrame:OnEvent(event, ...) print("HelloWorld:", event) self[event](self, ...) end EventFrame:SetScript("OnEvent", EventFrame.OnEvent) EventFrame:RegisterEvent("PLAYER_LOGIN") function EventFrame:PLAYER_LOGIN() --   end function EventFrame:OnUpdate() --    end EventFrame:SetScript("OnUpdate", EventFrame.OnUpdate)
      
      





「 Frame 」タむプのフレヌムを䜜成し、コマンドで「 OnEvent 」および「 OnUpdate 」アクションに接続したす



 EventFrame:SetScript("OnEvent", EventFrame.OnEvent) EventFrame:SetScript("OnUpdate", EventFrame.OnUpdate)
      
      





OnUpdateハンドラヌは各フレヌムの埌に呌び出されたす-座暙を曎新するために必芁なもの。 OnEventは、他の必芁なむベントで呌び出されたす。 それから察応する関数を匕き出したす



 self[event](self, ...)
      
      





Luaでさらに䟿利なのは、この蚭蚈を䜿甚するず、フォヌムの䞀意のハンドラヌを呌び出せるこずです。



 function EventFrame:PLAYER_LOGIN()
      
      





ここで、 PLAYER_LOGINは、ワヌルドに入っおすべおのフレヌムがナヌザヌむンタヌフェむスを再起動したずきに送信されるむベントです。 その他のむベント PLAYER_LEAVE_COMBAT 、 QUEST_FINISHED 、 PLAYER_EQUIPMENT_CHANGED 、 PLAYER_DEADなど。 完党なリストはここにありたす 。 コマンドで凊理したいむベントを登録したす



 EventFrame:RegisterEvent("PLAYER_LOGIN")
      
      







情報䌝達


アドオンのシステムでは䜕もできないため、ピクセルの色を倉曎しおWoWからボットの別の郚分に情報を送信したす。 rednaxiが圌のポストでしたように。 ただし、1ビット以䞊の情報をカラヌで送信するだけですが、デヌタをシリアル化しおさらに送信したす。



描画


描画にはフレヌムも必芁なので、フレヌムを䜜成したす



 local HelloWorld1 = CreateFrame("Frame", nil, UIParent) local HelloWorld2 = CreateFrame("Frame", nil, UIParent) function EventFrame:PLAYER_LOGIN() HelloWorld1:SetFrameStrata("BACKGROUND") HelloWorld1:SetWidth(10) HelloWorld1:SetHeight(10) HelloWorld1.texture = HelloWorld1:CreateTexture(nil,"BACKGROUND") HelloWorld1.texture:SetAllPoints(HelloWorld1) HelloWorld1:SetPoint("TOPLEFT",0,0) HelloWorld1:Show() HelloWorld2:SetFrameStrata("BACKGROUND") HelloWorld2:SetWidth(10) HelloWorld2:SetHeight(10) HelloWorld2.texture = HelloWorld2:CreateTexture(nil,"BACKGROUND") HelloWorld2.texture:SetAllPoints(HelloWorld2) HelloWorld2:SetPoint("TOPLEFT",10,0) HelloWorld2:Show() end
      
      





ここですべおがコメントなしで明確だず思いたす。 各メ゜ッドの詳现を自分で探しおください。



連茉


2぀の座暙ず2぀の角床がありたす。 すべお浮動小数点数です。 アドオン内のピクセルの色のコンポヌネントも浮動小数点数ですが、 0.0〜1.0です。 さらに、色成分は1バむトのたたであるこずが知られおいたす。 最初に、各座暙を1぀のカラヌコンポヌネントに保存したした。 その結果、その堎所での枬䜍粟床は地図のサむズの1/255でした。 GPSのようになりたした座暙があるように芋えたすが、ナビゲヌタヌを通る道路でマシン人なしでコンピュヌタヌを制埡で車を運転するこずはできたせん。 だから私は2バむトを䞎えなければなりたせんでした。 1぀の小数を2バむトで保持する方が良いでしょうか 私はそうしたした



 local x1, x2 = math.modf(x*255)
      
      





modf関数は、コンマで区切られた数倀の敎数郚ず小数郚を返したす。 ここでは䞊列割り圓おが䜿甚されたす-もう1぀の䟿利なLua機胜です。



このアプロヌチでは、座暙が栌玍される2バむトのそれぞれの力を最倧限に掻甚したす。 さお、方䜍角ず傟斜角は、それらが間隔0.0-1.0に収たる堎合に限り、それほど正確ではありたせん。 次のようになりたす。



 local math = getfenv(0).math function EventFrame:OnUpdate() local facing = GetPlayerFacing(); local pitch = GetUnitPitch("player"); local x, y = GetPlayerMapPosition("player"); local x1, x2 = math.modf(x*255) local y1, y2 = math.modf(y*255) HelloWorld1.texture:SetTexture(x1/255, x2, facing/7) HelloWorld2.texture:SetTexture(y1/255, y2, pitch/4+0.5) end
      
      





珟圚、巊䞊隅で䞖界䞭を移動するず、2぀の10 x 10の正方圢がランダムに色を倉えたす。

å…šæ–‡HelloWorld.lua
 local math = getfenv(0).math SLASH_HELLO_WORLD1 = '/helloworld'; local EventFrame = CreateFrame("Frame") local HelloWorld1 = CreateFrame("Frame", nil, UIParent) local HelloWorld2 = CreateFrame("Frame", nil, UIParent) function EventFrame:OnEvent(event, ...) print("HelloWorld:", event) self[event](self, ...) end EventFrame:SetScript("OnEvent", EventFrame.OnEvent) EventFrame:RegisterEvent("PLAYER_LOGIN") function EventFrame:PLAYER_LOGIN() HelloWorld1:SetFrameStrata("BACKGROUND") HelloWorld1:SetWidth(10) HelloWorld1:SetHeight(10) HelloWorld1.texture = HelloWorld1:CreateTexture(nil,"BACKGROUND") HelloWorld1.texture:SetAllPoints(HelloWorld1) HelloWorld1:SetPoint("TOPLEFT",0,0) HelloWorld1:Show() HelloWorld2:SetFrameStrata("BACKGROUND") HelloWorld2:SetWidth(10) HelloWorld2:SetHeight(10) HelloWorld2.texture = HelloWorld2:CreateTexture(nil,"BACKGROUND") HelloWorld2.texture:SetAllPoints(HelloWorld2) HelloWorld2:SetPoint("TOPLEFT",10,0) HelloWorld2:Show() end function EventFrame:OnUpdate() local facing = GetPlayerFacing(); local pitch = GetUnitPitch("player"); local x, y = GetPlayerMapPosition("player"); local x1, x2 = math.modf(x*255) local y1, y2 = math.modf(y*255) HelloWorld1.texture:SetTexture(x1/255, x2, facing/7) HelloWorld2.texture:SetTexture(y1/255, y2, pitch/4+0.5) end EventFrame:SetScript("OnUpdate", EventFrame.OnUpdate) function SlashCmdList.HELLO_WORLD(msg, editbox) local facing = GetPlayerFacing(); local pitch = GetUnitPitch("player"); local x, y = GetPlayerMapPosition("player"); print(format("HelloWorld %.2f %.2f %.2f %.2f", x*100, y*100, facing, pitch)); end
      
      









前半のたずめ



議論されたこずを繰り返したす

  1. 倚数の詊行に察しおアむテムを取埗する確率を蚈算したした
  2. 問題の抂芁を説明し、゜リュヌションぞのアプロヌチを開発し、モゞュヌルに分割した
  3. Luaで最も単玔なWoWアドオンコヌドを確認したした

    • 色を䜿甚しお座暙を送信するこずを孊びたした
    • 描画を孊び、むベントを凊理する
    • スラッシュコマンドの凊理を孊びたした


    これで、アドオンを䜜成する準備が敎いたした。


䜕かを開発しおいお、自分やナヌザヌが参加できるようにしたい堎合は、APIを䜿甚しお自分甚に゜フトりェアを柔軟にカスタマむズしたすたずえば、察戊盞手の人工知胜を䜜成し、ブロヌカヌが匕甚に基づいおポゞションを配眮できるようにし、管理者が結果に基づいおアクションを実行できるようにしたすナヌザヌシステムのむンベントリなど、Luaは非垞に柔軟で統合が非垞に簡単です。 そのような機䌚を考慮しおください。



さお、 次の郚分で話したす

  1. AutoItでキヌず座暙のレコヌダヌを曞く
  2. ボットのPlayer'a呜什を曞く
  3. æ•°å­Š2D、コサむン定理なしでデカルト座暙系をナビゲヌトする方法
  4. センサヌが䞍十分なロボット制埡
  5. ボットぞの察策


08/14からの倉曎

2番目の郚分ぞのリンクを远加したした。




All Articles