2014-01-16 1 views
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 섹션에서 나는 무역이 시작될 때까지 로봇을 멈추고 싶습니다. 그런 다음 일단 시작되면 예상대로 항목을 추가하고 계속 진행할 수 있습니다.

나는 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에 대한 의견 중 일부는 더 나은 지원을 위해 여기에 게시 된 것을 언급 한 이래로 문제가되지 않기를 바랍니다.

+0

사이드 노트 : C#의 규칙은 모든 메소드를 대문자로 시작하는 것입니다. 소문자로 시작하면 코드가 매우 아마추어처럼 보입니다. –

답변

2

귀하의 접근 방식은 근본적으로 올바르지 않습니다. Steambot은 이벤트 기반이므로 이벤트 발생을 기다리지 않고 이벤트 핸들러의 이벤트에 응답하여 논리를 기반으로해야합니다.

즉, 관리자가 Give Items 명령을 발행하면 GiveItemsToUser() 메소드를 호출 할 수 없습니다. 대신 QueueItemsToBeGivenToUser()과 같은 항목이 필요합니다.이 항목은 사용자에게 제공 할 항목 목록을 만들어 개인 변수에 저장합니다. 그런 다음 OnTradeInit()을 호출하면 해당 사용자에게 대기중인 항목이 있는지 확인할 수 있습니다. 그렇게 할 경우 해당 항목을 거래에 추가 할 수 있습니다.