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
기능에 true
로 설정되는 inTrade
(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());
이 다음 (WaitOne
인해 전달 된 시간 제한) 30 초 메인 쓰레드를 일시 및 계속된다. 그러나 거래 요청이 접수 된 경우에도 inTrade
은 여전히 거짓입니다. 나는 그 시점에서 거래가 아니기 때문에 후속 코드가 유효하지 않을 것입니다.
그렇다면이 유형의 상호 작용을 처리하는 적절한 방법은 무엇입니까?
나는 이것을 /r/steambot subreddit에도 교차 게시했습니다. Github에 대한 의견 중 일부는 더 나은 지원을 위해 여기에 게시 된 것을 언급 한 이래로 문제가되지 않기를 바랍니다.
사이드 노트 : C#의 규칙은 모든 메소드를 대문자로 시작하는 것입니다. 소문자로 시작하면 코드가 매우 아마추어처럼 보입니다. –