void Server::run() { if (!host) return; LOG_INFO(logger) << "Running server"; time = getCurrentTime(); while (!closeRequested) { updateNet(); kickUnfriendly(); world->tick(); chunkManager->tick(); gameServer->tick(); chunkServer->tick(); Time remTime = time + seconds(1) / TICK_SPEED - getCurrentTime(); if (remTime < 0) LOG_WARNING(logger) << "CAN'T KEEP UP! (" << -remTime << " micro seconds behind)" ; sync(TICK_SPEED); tick++; } LOG_INFO(logger) << "Shutting down server"; host->duplicatePeers = 0; for (int i = 0; i < MAX_CLIENTS; ++i) { if (clientInfos[i].status != INVALID && clientInfos[i].status != DISCONNECTING) { enet_peer_disconnect(clientInfos[i].peer, (enet_uint32) SERVER_SHUTDOWN); clientInfos[i].status = DISCONNECTING; } } Time endTime = getCurrentTime() + seconds(1); while (numClients > 0 && getCurrentTime() < endTime) { updateNetShutdown(); } }
void idleGame( void ) { list *l; list *p; int i; int dt; int t; #ifdef SOUND // Audio_Idle(); soundIdle(); #endif if(updateTime() == 0) return; switch(game2->mode) { case GAME_NETWORK_RECORD: #ifdef NETWORK updateNet(); #endif /* fall through */ case GAME_SINGLE: case GAME_SINGLE_RECORD: /* check for fast finish */ if(game->settings->fast_finish == 1) { int factor = 4; for(i = 0; i < game->players; i++) { if(game->player[i].ai->active != 1 && game->player[i].data->exp_radius < EXP_RADIUS_MAX) factor = 1; } dt = game2->time.dt * factor; } else dt = game2->time.dt; while(dt > 0) { if(dt > PHYSICS_RATE) t = PHYSICS_RATE; else t = dt; /* run AI */ for(i = 0; i < game->players; i++) if(game->player[i].ai != NULL) if(game->player[i].ai->active == 1 && game->player[i].data->speed > 0) { if(game->settings->ai_level < 2) doComputer(i, 0); else doComputer2(i, 0); } /* process any outstanding events (turns, etc) */ for(p = &(game2->events); p->next != NULL; p = p->next) { if(processEvent((GameEvent*) p->data)) return; } /* free events */ p = game2->events.next; while(p != NULL) { l = p; p = p->next; free(l); } game2->events.next = NULL; l = doMovement(1, t); /* this can generate new events */ if(l != NULL) { for(p = l; p->next != NULL; p = p->next) { if(processEvent((GameEvent*) p->data)); } } /* free list */ p = l; while(p != NULL) { l = p; p = p->next; free(l); } dt -= PHYSICS_RATE; } break; case GAME_PLAY_NETWORK: #ifdef NETWORK updateNet(); /* broadCast any outstanding events (turns, etc) */ for(p = &(game2->events); p->next != NULL; p = p->next) { sendNetEvent((GameEvent*) p->data); } #endif /* fall through to GAME_PLAY */ case GAME_PLAY: getEvents(); l = doMovement(0, game2->time.dt); /* this won't generate new events */ if(l != NULL) { fprintf(stderr, "something is seriously wrong - ignoring events\n"); } break; } doCameraMovement(); recognizerMovement(); SystemPostRedisplay(); /* fprintf(stderr, "game time: %.3f\n", game2->time.current / 1000.0); */ }