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());  

这会将主线程暂停 30 秒(由于传入的超时WaitOne),然后按预期继续。但是,inTrade即使已收到交易请求,它仍然是错误的。由于那时我没有进行交易,因此后续代码将无效。

那么,处理此类交互的正确方法是什么?

我也将它交叉发布到/r/steambot subreddit。我希望这不是问题,特别是因为 Github 上的一些评论提到在此处发布以获得更好的帮助。

4

1 回答 1

2

你的方法根本不正确。Steambot 是基于事件的,因此您的逻辑需要基于响应事件处理程序中的事件,而不是等待事件发生。

所以换句话说,当管理员发出Give Items命令时,你不能简单地调用一个GiveItemsToUser()方法。相反,您需要更多类似的东西QueueItemsToBeGivenToUser()来创建一个项目列表以提供给用户并将其存储在私有变量中。然后当OnTradeInit()被调用时,您可以检查该用户是否有任何物品排队,如果有,则将这些物品添加到交易中。

于 2014-01-16T22:20:42.330 回答