【问题标题】:How can I force the bot to both wait for a specific event and continue to poll for events at the same time?如何强制机器人同时等待特定事件并继续轮询事件?
【发布时间】:2023-04-04 11:43:01
【问题描述】:

我正在使用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 部分,我希望机器人在交易开始之前停止。然后,一旦启动,它就可以按预期继续并添加项目。

我尝试在OnTradeInit 函数中添加一个设置为trueinTrade(初始化为false)变量,然后让机器人进入睡眠状态,直到这是真的。

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

然而,这会阻塞主线程并使其陷入紧密循环。当它醒来时,它会立即检查变量是否为true,如果不是则让它重新进入睡眠状态。 Bot.cs 中的 HandleSteamMessage 函数没有时间处理任何事情 - 即使机器人在睡眠时确实收到了事件。

我尝试使用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 上的一些 cmets 提到在这里发帖以获得更好的帮助。

【问题讨论】:

  • 旁注:C# 中的约定是所有方法都以大写字母开头。以小写开头会让你的代码看起来非常业余。

标签: c# steambot


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2020-07-14
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多