Пример #1
0
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();
	}
}
Пример #2
0
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); */
}