Blizzard / s2client-api

StarCraft II Client - C++ library supported on Windows, Linux and Mac designed for building scripted bots and research using the SC2API.
MIT License
1.66k stars 282 forks source link

In multithreaded and multi-player game, the Restart() in OnGameEnd() fails to work #326

Open monarchBacilluscoli opened 4 years ago

monarchBacilluscoli commented 4 years ago

The Update() will still return false thus breaks the main loop, although it have called AgentControl()->Restart() in OnGameEnd().
In single player game with a computer, it works fine. And maybe that is what caused the problem:

static void CallOnStep(Agent* a) {              // 0. Update()->StepAgents()->RunParallel()->[]step_agent()->CallOnStep() 
    ControlInterface* control = a->Control();
    if (!control->IsInGame()) {
        a->OnGameEnd();                         // 1. Ok, it calls OnGameEnd() and my AgentControl()->Restart() will be called soon!
        control->RequestLeaveGame();            // 2. ...OK...That's it
        return;
    }

    ActionInterface* action = a->Actions();
    control->IssueEvents(action->Commands());
    if (action) {
        action->SendActions();
    }

    ActionFeatureLayerInterface* action_feature_layer = a->ActionsFeatureLayer();
    if (action_feature_layer) {
        action_feature_layer->SendActions();
    }
}                                               // 4. Then it will return to Update() and return false, then the main loop breaks and my program exits
}