2

SteamBotアプリケーションを使用しています。

特定のイベントが発生したときに動作するはずのコマンドがあります。この特定のケースでは、私が管理者としてコマンドを発行すると、ボットは取引リクエストを待ってから、ロジックを続行します。私が理解できないのは、取引要求が発生するまで待機させてから続行する方法です。

コマンドを発行し、そのコマンドの動作を処理する関数にいるとします。これは、私がやろうとしていることの非常に簡単な例です。

private void giveItemsToUser()
{
    Bot.GetInventory();

    // Wait here

    var items = Trade.CurrentSchema.GetItemsByCraftingMaterial('hat');
    foreach (var item in items)
    {
        added += Trade.AddAllItemsByDefindex(item.Defindex, amount);
    }

    Trade.SetReady(true);
    Trade.AcceptTrade();
}

セクションでは// Wait here、取引が開始されるまでボットを停止させたいと考えています。次に、開始すると、処理を続行して、期待どおりに項目を追加できます。

関数に設定されているinTrade(に初期化されたfalse)変数を追加し、それが真になるまでボットをスリープ状態にしようとしました。trueOnTradeInit

while (!inTrade)
{
    Console.WriteLine("Not in trade. Sleeping for 10 seconds.");
    Thread.Sleep(10000);
}

ただし、これによりメインスレッドがブロックされ、タイトなループに陥ります。ウェイクアップすると、すぐに変数が有効かどうかを確認し、trueそうでない場合はスリープ状態に戻します。ボットがスリープ中にイベントを受信したとしても、HandleSteamMessage関数が何かを処理する時間はありません。Bot.cs

を使用しようとしましたEventWaitHandleが、決して起動しないようです。

EventWaitHandle waitForInTrade = new EventWaitHandle(false, EventResetMode.AutoReset, "OnTradeRequest");
waitForInTrade.WaitOne(30000);
Console.WriteLine("In trade? " + inTrade.ToString());  

これにより、( で渡されたタイムアウトによりWaitOne) メイン スレッドが 30 秒間一時停止され、その後、期待どおりに続行されます。ただし、inTradeトレード リクエストが受信された場合でも、まだ false です。その時点で私は取引をしていないため、その後のコードは無効になります。

では、この種のやり取りを処理する適切な方法は何でしょうか?

これを/r/steambotサブレディットにも相互投稿しま​​した。特に、Github のコメントの一部で、より良い支援のためにここに投稿することが言及されているため、これが問題ではないことを願っています。

4

1 に答える 1

2

あなたのアプローチは根本的に間違っています。Steambot はイベントベースであるため、イベントが発生するのを待つのではなく、イベント ハンドラーでのイベントへの応答に基づいてロジックを作成する必要があります。

つまり、管理者がGive Itemsコマンドを発行したときに、単純にメソッドを呼び出すことはできませんGiveItemsToUser()。代わりに、QueueItemsToBeGivenToUser()アイテムのリストを作成してユーザーに提供し、それをプライベート変数に格納するようなものが必要になります。次に、OnTradeInit()が呼び出されたときに、そのユーザーがキューにアイテムを持っているかどうかを確認し、持っている場合はそれらのアイテムを取引に追加できます。

于 2014-01-16T22:20:42.330 に答える