gpt4 book ai didi

c# - 我如何强制机器人既等待特定事件又继续同时轮询事件?

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:48 25 4
gpt4 key购买 nike

我正在使用 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 )设置为 true 的变量在OnTradeInit运行并让机器人进入休眠状态,直到它为真。

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

然而,这会阻塞主线程并将其抛入一个紧密的循环中。当它醒来时,它会立即检查变量是否为 true如果没有让它重新休眠。没有时间 HandleSteamMessageBot.cs 中发挥作用处理任何事情——即使机器人在 sleep 时确实收到了一个事件。

我试过使用 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 上的一些评论提到在此处发帖以获得更好的帮助。

最佳答案

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

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

关于c# - 我如何强制机器人既等待特定事件又继续同时轮询事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21169176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com