/** Simple finite state machine. First get the public ip address. Once this * is known, register the server and its address with the stk server so that * client can find it. */ void ServerLobbyRoomProtocol::update() { switch (m_state) { case NONE: // Start the protocol to find the public ip address. m_current_protocol = new GetPublicAddress(this); m_current_protocol->requestStart(); m_state = GETTING_PUBLIC_ADDRESS; // The callback from GetPublicAddress will wake this protocol up requestPause(); break; case GETTING_PUBLIC_ADDRESS: { Log::debug("ServerLobbyRoomProtocol", "Public address known."); // Free GetPublicAddress protocol delete m_current_protocol; // Register this server with the STK server. This will block // this thread, but there is no need for the protocol manager // to react to any requests before the server is registered. registerServer(); Log::info("ServerLobbyRoomProtocol", "Server registered."); m_state = ACCEPTING_CLIENTS; } break; case ACCEPTING_CLIENTS: { // Only poll the STK server if this is a WAN server. if(NetworkConfig::get()->isWAN()) checkIncomingConnectionRequests(); if (m_in_race && World::getWorld() && RaceEventManager::getInstance<RaceEventManager>()->isRunning()) { checkRaceFinished(); } break; } case SELECTING_KARTS: break; // Nothing to do, this is event based case DONE: m_state = EXITING; requestTerminate(); break; case EXITING: break; } } // update
void ServerLobbyRoomProtocol::update() { switch (m_state) { case NONE: m_current_protocol_id = m_listener->requestStart(new GetPublicAddress(&m_public_address)); m_state = GETTING_PUBLIC_ADDRESS; break; case GETTING_PUBLIC_ADDRESS: if (m_listener->getProtocolState(m_current_protocol_id) == PROTOCOL_STATE_TERMINATED) { NetworkManager::getInstance()->setPublicAddress(m_public_address); m_current_protocol_id = m_listener->requestStart(new StartServer()); m_state = LAUNCHING_SERVER; Log::debug("ServerLobbyRoomProtocol", "Public address known."); } break; case LAUNCHING_SERVER: if (m_listener->getProtocolState(m_current_protocol_id) == PROTOCOL_STATE_TERMINATED) { m_state = WORKING; Log::info("ServerLobbyRoomProtocol", "Server setup"); } break; case WORKING: { checkIncomingConnectionRequests(); if (m_in_race && World::getWorld() && NetworkWorld::getInstance<NetworkWorld>()->isRunning()) checkRaceFinished(); break; } case DONE: m_state = EXITING; m_listener->requestTerminate(this); break; case EXITING: break; } }
/** Simple finite state machine. First get the public ip address. Once this * is known, register the server and its address with the stk server so that * client can find it. */ void ServerLobbyRoomProtocol::update(float dt) { switch (m_state) { case NONE: // Start the protocol to find the public ip address. m_current_protocol = new GetPublicAddress(this); m_current_protocol->requestStart(); m_state = GETTING_PUBLIC_ADDRESS; // The callback from GetPublicAddress will wake this protocol up requestPause(); break; case GETTING_PUBLIC_ADDRESS: { Log::debug("ServerLobbyRoomProtocol", "Public address known."); // Free GetPublicAddress protocol delete m_current_protocol; // Register this server with the STK server. This will block // this thread, but there is no need for the protocol manager // to react to any requests before the server is registered. registerServer(); Log::info("ServerLobbyRoomProtocol", "Server registered."); m_state = ACCEPTING_CLIENTS; } break; case ACCEPTING_CLIENTS: { // Only poll the STK server if this is a WAN server. if(NetworkConfig::get()->isWAN()) checkIncomingConnectionRequests(); break; } case SELECTING: break; // Nothing to do, this is event based case RACING: if (World::getWorld() && RaceEventManager::getInstance<RaceEventManager>()->isRunning()) { checkRaceFinished(); } break; case RESULT_DISPLAY: if(StkTime::getRealTime() > m_timeout) { // Send a notification to all clients to exit // the race result screen NetworkString *exit_result_screen = getNetworkString(1); exit_result_screen->setSynchronous(true); exit_result_screen->addUInt8(LE_EXIT_RESULT); sendMessageToPeersChangingToken(exit_result_screen, /*reliable*/true); delete exit_result_screen; m_state = ACCEPTING_CLIENTS; RaceResultGUI::getInstance()->backToLobby(); // notify the network world that it is stopped RaceEventManager::getInstance()->stop(); // stop race protocols findAndTerminateProtocol(PROTOCOL_CONTROLLER_EVENTS); findAndTerminateProtocol(PROTOCOL_KART_UPDATE); findAndTerminateProtocol(PROTOCOL_GAME_EVENTS); } break; case DONE: m_state = EXITING; requestTerminate(); break; case EXITING: break; } } // update