シンプルなWoWボットの作成:続き

これは前の記事の続きです。

Warcraftのオンラインゲームワールド用のシンプルなボットの作成



このパートでは、競売人とメールボックスとやり取りするプロセスについて説明します。 前の部分がより一般的だった場合、この部分はすでにWoWの世界とより密接に関係しており、他のオンラインゲームに適用できる可能性はほとんどありません。







その記事では、独立してNPCオークションに参加できるボットを作成しました。 次に、さらにアクションを実装する必要があります。 最初に、オークション取引の仕組みについて少しお話します。 私は個人的にシンボルを取引していますが、使用しているアドオンを使用して、クラフトアイテムの取引を自動化することもできます。 TradeSkill Masterを使用します。これは、以前はクイックオークションと呼ばれていたオークション利益マスターの作者によるアドオンです。 重要なのは、オークションに約400〜500個のアイテムがあることです。 私に加えて、サーバー上には、同じ商品を同じ量で取引する4〜5人の人がいます。 私の仕事は、商品の価格を常に彼らの価格より低く保つことです。 これにより、アドオンを作成できます。オークションを自動的にスキャンします。誰かが私の価格よりも低い価格でアイテムを置いた場合、オークションから私のロットを削除します。 アイテムがメールに送信されます。 したがって、郵便局から受け取り、競合他社よりも低い価格で郵送する必要があります。 価格もアドオンによって割り当てられます。



つまり 実際、ボットの仕事は、競売人に行き、競売ウィンドウを開き、競売を開始し、すべてがキャンセルされたらロットのキャンセルを開始することです。郵便局に行き、すべてを拾い上げてから、オークションに戻ります。 NPCオークションに参加する方法を知っているボットをすでに作成しました。 今、私たちの仕事は取引を開始することです。



貿易



ここにはすでにいくつかのマクロが追加された、きれいなAutoItがあります。

競売人のターゲットを取るマクロが1つ必要です-これは

/  
      
      





たとえば、このマクロをボタン「9」に割り当てます。 次に、彼と取引を開始する必要があります。 ここでも、すべてが簡単です。キーを割り当てるための設定で、「目標を使用するための機能」セクションで「ターゲットと対話する」ボタンを割り当てる必要があります。たとえば、「\」に割り当てます。

オークションが開いたら、バッグからオークションに商品を入れるプロセスを開始する必要があります。 私のアドオンでは、ボタンをクリックするだけでこれが望まれますが、他のアドオンでは2回クリックする必要があります-問題ではありませんが、とにかく機能は簡単です:

 Func StartPostingAuc() Send("9") ;     Sleep(300) Send("\") ;   Sleep(2000);           -   MouseClick("left", 1278, 155) ;    " " Sleep(2000) $state = "posting" ;  EndFunc
      
      







実際、投稿機能自体も非常に簡単です。 ボタンをクリックすると、次のウィンドウが表示されます。



下部に進行状況バーがあり、上部にボタンが表示されます。クリックすると、商品がオークションにかけられます。

したがって、私たちのタスクは、プログレスバーがある間にボタンをクリックすることです。プログレスバーが終了するとすぐに、次のステップに進みます-価格が壊れた商品をキャンセルするために

 Func PostingAuc() $borderPixelColor = PixelGetColor(937,527);       -   ,   - While $borderPixelColor = 6249826 and $state = "posting" ;   - -  MouseClick("left", 1026, 210) Sleep(500); $borderPixelColor = PixelGetColor(937,527); Wend if $state = "posting" then ;    -     -  $state = "startcancel" EndIf EndFunc
      
      







キャンセルは、プログレスバーと1つのボタンを備えたまったく同じウィンドウの投稿と変わりません。 したがって、機能はまったく同じで、クリックするだけです。 これが取引プロセス全体です。



メールボックスに移動する



キャンセルされたすべての商品が郵送された後、そこから引き取る必要があります。 これを行うには、メールボックスに移動します。 原則として、メールボックスまで歩くプロセスは、競売人まで歩くプロセスとほとんど変わりません。

また、行き先を示すセマフォを作成します。 また、ナビゲートしやすくするために、座標系の回転を行います。 キャラクターがメールボックスに面している場合、角度は2.31ラジアンです。



唯一の違い:メールボックスの側面に移動すると、壁に突き出た要素が時々衝突するため、セマフォを作成するときに、この瞬間を考慮して、壁に近づくと右に移動しました。 原則として、これはifに別のブランチを追加するだけで行われました。

  elseif(mailPosX < 0.2000 and mailPosY > 0.896) then PlayerMailGoForvard:SetTexture(1,0,0); PlayerMailGoBack:SetTexture(1,0,0); PlayerMailGoLeft:SetTexture(1,0,0); PlayerMailGoRight:SetTexture(0,1,0); PlayerOnMail:SetTexture(1,0,0);
      
      





つまり x <0.2、建物を出るまで、y> 0.896-壁に近づいているので、離れなければなりません。 壁が建物を離れるとすぐに、立ち去る必要はありません。



キャラクターがメールボックスに到着したので、どういうわけかそれを開く必要があります。

ここで競売人が機能しないのは、メールボックスをターゲットに移動できないことです。

したがって、ここで少し準備が必要です。ボットを開始する前に、カメラをできるだけ近くに持って行き、前方と下方を見る必要があります。 以前は、apovはカメラの現在位置を見つけることができ、カメラを制御するためのセマフォを作成することができましたが、進取の気性に富んだ人々がプレイヤーの生活を大幅に簡素化する拡張現実アドオンを書いた後、このAPI関数はアドオンでの使用を禁止されました。 したがって、ボットの開始時にカメラを手動で構成する必要があります。競売人と対話するために、カメラの向きは関係ありません。



だから、私たちはメールボックスに来ました、カメラは下向きです。 次のようなものが表示されます。



私たちのタスクは、メールボックスを右クリックすることです。

ここに問題があります:

1.私たちが来るポイントを正確に保証することはできません。

2.メールボックスが別のプレーヤーによってブロックされている可能性があります



これらの問題は、次のことを意味します。他のボタンの場合のように、メールボックスを開くためにクリックする必要があるポイントをハードコーディングすることはできません。

しかし、メールボックスへのアプローチを考慮に入れると、画面の左3分のどこかにあると考えられます。

したがって、メールボックスが最も頻繁に配置されている場所で最初にクリックする関数を作成し、見つからない場合は、画面の左3分の1をクリックするまでクリックします。

9時間のテストで、この関数はメールボックスを見つけることができなかったのは2回だけでした。それは私のせいでした。メールボックスへのパスが正しく登録されておらず、キャラクターが彼が立っていた棚から落ち、画面にメールボックスがまったくありませんでした。 この問題は、セマフォの条件を規定することで解決しました。この条件の下では、キャラクターが落ちないように少し後退する必要があります。

  elseif (mailposX > 0.203) then PlayerMailGoForvard:SetTexture(1,0,0); PlayerMailGoBack:SetTexture(0,1,0); PlayerMailGoLeft:SetTexture(1,0,0); PlayerMailGoRight:SetTexture(1,0,0); PlayerOnMail:SetTexture(1,0,0);
      
      





メールボックスは開いた状態です(左上には、更新されたセマフォの一部があり、よりコンパクトになっています)。





実際には、赤いボタン「すべてを取得」の外観によって、メールボックスのオープンを決定します。 autoitの機能、私はこれを得ました:

 Func OpenMail() $x1 = 392 ; ,        $y1 = 382 While not (PixelGetColor(237,515) = 6226176) ;      -     MouseClick("right", $x1, $y1); $y1 = $y1 + 20 if $y1 > 620 Then $x1 = $x1 + 10 $y1 = 54 if $x1 > 650 and $y1 > 620 Then $x1 = 194 $y1 = 54 EndIf EndIf Sleep(200) Wend MouseClick("left", 237,515)4    -    Sleep(1000) MouseClick("left", 237,535);     $state = "givingmails";     EndFunc
      
      





この場合、赤いボタンをクリックすると、すべての文字が受信されるまで灰色になります



メールを受け取る



一般に、手紙を受け取ることは非常に簡単です:賢いTradeSkillMasterがメールからすべての手紙を抽出するまで待つだけです。 アドオンがすべてを削除するとすぐに、ボタンが赤色に変わり、競売人に戻ることができます。



ボットが作成されているようです。 しかし、その後、最大の問題が待ち受けていました。すべての手紙を受け取ったことを知ることは、最初に見たほど些細な作業ではありませんでした。 一般に、すべての手紙を受け取ったことを確認するには2つの方法があります。

1.ボタンが再び赤に変わります。 残念なことに、最も簡単なオプション-最もまれです。

2.袋がいっぱいになった-ボタンが赤にならず、ボットが永久に立ち、郵便局の近くで待つことができました。 この問題を解決するために、ボットは起動時に最後のバッグを自動的に開き、その中の最後のセルが空であることを確認します。 バッグの最後のセルの色が変わり、バッグがいっぱいになるとすぐに、オークションに行きましょう

3.トレードス​​キルマスターがバギーで、空の文字がメールから削除されないことがあります。 この場合、メールにこれ以上文字がなくても、ボタンは赤になりません。 この場合、問題は単純に解決されます。最後のメールスロットを取り、それが変化するかどうかを確認します。文字を受信すると、常に上に移動し、スロットが変化します。 すべての文字が受信されると、変更が停止します。 20秒以内に変わらない場合は、商品を展示する時間です。



トータル機能はこれを明らかにしました:

 Func GiveMails() if PixelGetColor(237,515) = 6226176 or $i = 25 or not (PixelGetColor(1665, 868) = 2761500) then ;        $state = "goingtoauc" $i = 0 EndIf if PixelGetColor(52,470) = $prevcolor then ;       ,      $i = $i+1 else $i = 0 EndIf $prevcolor = PixelGetColor(52,470) Sleep(1000) EndFunc
      
      







以上で、手紙を受け取りました。競売人に戻ってきました!




一般に、私はこれで開発を完了しました。なぜなら、ボットは元々望んでいたことをすべて行う方法を知っているからです:競売人に来て、そのアイテムを公開し、壊れた価格のアイテムをキャンセルし、郵便局に来て、物を拾って、オークションに戻ります、公開し、さらに円で囲みます。



結論として、オンラインゲーム用のボットの開発は論理的なゲームのようなものだと言いたいと思います。

彼にすべての手紙を拾わせる方法は? これまたはその機能を回避する方法は? これまたはその機能を実装する最良の方法は何ですか? 私は週末が適切に過ごしたと思う、脳のための良いトレーニング:)



All Articles