示例#1
0
    void NetManager::readServerPacket(ENetEvent& event)
    {
        FAWorld::World& world = *FAWorld::World::get();

        size_t position = 0;

        ServerPacketHeader header;
        readFromPacket(event.packet, position, header);

        if(header.tick > mLastServerTickProcessed)
        {
            for(size_t i = 0; i < header.numPlayers; i++)
            {
                uint32_t playerId;
                readFromPacket<uint32_t>(event.packet, position, playerId);

                auto player = world.getPlayer(playerId);
                if(player == NULL)
                {
                    spawnPlayer(playerId);
                    player = world.getPlayer(playerId);
                }

                position = player->readFrom(event.packet, position);
            }
        }
    }
示例#2
0
bool Map::initPlayer (Player* player)
{
	if (!_mapRunning)
		return false;

	if (getPlayer(player->getClientId()) != nullptr)
		return false;

	assert(_entityRemovalAllowed);

	INetwork& network = _serviceProvider->getNetwork();
	const ClientId clientId = player->getClientId();
	info(LOG_SERVER, "init player " + player->toString());
	const int clientMask = ClientIdToClientMask(clientId);
	const MapSettingsMessage mapSettingsMsg(_settings, _startPositions.size());
	network.sendToClient(clientId, mapSettingsMsg);
	GameEvent.sendWaterUpdate(clientMask, *_water);

	const InitDoneMessage msgInit(player->getID(), getPackageCount(), player->getLives(), player->getHitpoints());
	network.sendToClient(clientId, msgInit);

	sendSound(0, SoundTypes::SOUND_PLAYER_SPAWN);

	network.sendToClient(clientId, InitWaitingMapMessage());
	updateVisMask();
	sendMapToClient(clientId);
	if (!_players.empty()) {
		const bool spawned = spawnPlayer(player);
		updateVisMask();
		return spawned;
	}
	info(LOG_SERVER, "delay spawn of player");
	_playersWaitingForSpawn.push_back(player);
	return true;
}
示例#3
0
bool Map::initPlayer (Player* player)
{
	if (!_mapRunning)
		return false;

	if (getPlayer(player->getClientId()) != nullptr)
		return false;

	assert(_entityRemovalAllowed);

	INetwork& network = _serviceProvider->getNetwork();
	const ClientId clientId = player->getClientId();
	info(LOG_SERVER, "init player " + player->toString());
	const MapSettingsMessage mapSettingsMsg(_settings, _startPositions.size());
	network.sendToClient(clientId, mapSettingsMsg);

	const InitDoneMessage msgInit(player->getID(), 0, 0, 0);
	network.sendToClient(clientId, msgInit);

	network.sendToClient(clientId, InitWaitingMapMessage());
	sendMapToClient(clientId);
	if (!_players.empty()) {
		const bool spawned = spawnPlayer(player);
		return spawned;
	}
	_playersWaitingForSpawn.push_back(player);
	return true;
}
void PlayerInterface::spawnPlayer( unsigned short player_index, const iXY &location )
{
    assert( player_index < max_players );

    spawnPlayer( player_lists[ player_index ].getPlayerID(),
                 location
               );
}
示例#5
0
void Map::startMap ()
{
	info(LOG_SERVER, "start the map and spawn pending players");
	for (PlayerListIter i = _playersWaitingForSpawn.begin(); i != _playersWaitingForSpawn.end(); ++i) {
		spawnPlayer(*i);
	}
	_playersWaitingForSpawn.clear();
	updateVisMask();

	INetwork& network = _serviceProvider->getNetwork();
	network.sendToAllClients(StartMapMessage());
}
示例#6
0
文件: Session.cpp 项目: jclg/r-type
void Session::collision_player_mob()
{
  Command       cmd(_game_n);
  Object	*obj;
  Object	*obj2;
  std::list<Object *>::iterator it;
  std::list<Object *>::iterator it2;
  int   j;

  it = _listObj.begin();
  while (it != _listObj.end())
    {
      j = 0;
      obj = *it;
      while (j <= 3)
	{
	  if (_tabPlayer[j] != NULL && obj->getType() != 5 && 
	      obj->getX() < _tabPlayer[j]->getPosx() + 2 && obj->getX() > _tabPlayer[j]->getPosx() - 2 &&
	      obj->getY() < _tabPlayer[j]->getPosy() + 2 && obj->getY() > _tabPlayer[j]->getPosy() - 2)
	    {
	      if (obj->getType() == 26)
		{
		  std::cout << "Collison avec coeur !!!" << std::endl;
		  _tabPlayer[j]->setLife(_tabPlayer[j]->getLife() + 1);
		  cmd.sendLife(_tabPlayer[j], _p);
		  cmd.sendDestroy(obj->getId() , 0, _p);
		  _listObj.erase(it);
		  it = _listObj.begin();
		}
	      else if ((_tabPlayer[j]->getLife() - 1) > 0)
		{
		  std::cout << "ca pas Collison avec coeur !!!" << std::endl;
		  _tabPlayer[j]->setLife(_tabPlayer[j]->getLife() - 1);
		  cmd.sendLife(_tabPlayer[j], _p);
		  if (obj->getType() != 9 && obj->getType() != 21 && obj->getType() != 22 && obj->getType() != 24) // Les murs et les boss ne se detruisent pas
		    {
		      cmd.sendDestroy(obj->getId() , 0, _p); 
		      _listObj.erase(it);
		      it = _listObj.begin();
		    }
		  spawnPlayer(_tabPlayer[j]);
		}
	      else
		_pingTime[j] = 0;
	    }
	  j++;
	}
      it++;
    }
}
void GameManager::respawnAllPlayers()
{
    PlayerState    *player_state;
    unsigned short max_players;
    unsigned short player_index;

    max_players = PlayerInterface::getMaxPlayers();

    for( player_index = 0; player_index < max_players; player_index++ ) {
        player_state = PlayerInterface::getPlayerState( player_index );
        if ( player_state->getStatus() == _player_state_active ) {
            spawnPlayer( player_state->getPlayerID() );
        }
    }
}
示例#8
0
文件: gamescene.cpp 项目: jsfdez/1942
GameScene::GameScene(QObject *parent)
    : QGraphicsScene(0, 0, 600, 800, parent)
    , m_hudObject(new GraphicsHudObject(PLAYER_HEALTH))
{
    addItem(new GraphicsBackgroundItem);
    addItem(m_hudObject);

    connect(m_hudObject, &GraphicsHudObject::gameOver, this,
        &GameScene::showGameOverText);

    auto timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &GameScene::update);
    timer->start(1000 / FPS);

    spawnPlayer();
}
示例#9
0
文件: Session.cpp 项目: jclg/r-type
void  Session::sessionthread()
{
  int session = _session_n;
  Command           cmd(_game_n);

  _pingTime[session] = MAX_PING_TIME;
  _tabPlayer[session] = new Player(session +1);
  std::cout << "New player assign on slot " << session << "... Partie " << _game_n << std::endl;
  spawnPlayer(_tabPlayer[session]);
  cmd.sendConnect(_tabPlayer[session], _p);
  cmd.sendLife(_tabPlayer[session], _p);
  cmd.sendScore(_score, _p);
  //  cmd.sendMove(_tabPlayer[session], _p);
  //  std::cout << "En attente des nouvelles positions du client..." << std::endl;
  while (_pingTime[session] > 0)
    {
      //Pas de recv dans les threads
      //Le recv est gerer dans la boucle principal en dehors des threads

      //Ici c' est la boucle du thread
      //Lis dans le _tabPlayer et autre et envoit les infos avec _cmd.send****(***)
      //A 20 tours de boucles On fait un ping avec _cmd.sendPing()
      //Si la boucle recv principal ne recoit rien, on deco et on kill la thread
      
   if (_pingTime[session] % 100 == 0)
	cmd.sendMove(_tabPlayer[session], _p);

   if (_pingTime[session] == MID_PING_TIME)
	{
	  cmd.sendPing(_tabPlayer[session], _p);
	  std::cout << "Sending ping to client (player " << session + 1 << ")..." << std::endl;
	}
      if (_pingTime[session] == WARN_PING_TIME)
	{
	  cmd.sendPing(_tabPlayer[session], _p);
	  std::cout << "Sending ping to client (player " << session + 1 << ") (WARNING LAST PING BEFORE DISCONNECT)..." << std::endl;
	}
      _pingTime[session] -= 1;
      _th->ASleep(500);
    }
  cmd.sendDestroy(_tabPlayer[session]->getId(), 0,  _p);
  cmd.sendDisconnect(_tabPlayer[session], _p);
  std::cout << "Disconnecting client (player " << session + 1 << ") on slot " << session << "." << std::endl;
  std::cout << "The slot " << session << " is now free." << std::endl;
  _th->AExitThread(handles[session]);
}
void GameManager::respawnAllPlayers()
{
    PlayerState    *player_state;
    PlayerID max_players;
    PlayerID player_index;

    max_players = PlayerInterface::getMaxPlayers();

    for( player_index = 0; player_index < max_players; ++player_index )
    {
        player_state = PlayerInterface::getPlayer( player_index );
        if ( player_state->getStatus() == _player_state_active )
        {
            spawnPlayer( player_index );
        }
    }
}
示例#11
0
    void NetManager::update()
    {
        mTick++;

        ENetEvent event;

        while(enet_host_service(mHost, &event, 0))
        {
            switch(event.type)
            {
                case ENET_EVENT_TYPE_CONNECT:
                {
                    if(mIsServer)
                    {
                        spawnPlayer(event.peer->connectID);
                        mClients.push_back(event.peer);
                    }
                    break;
                }

                case ENET_EVENT_TYPE_RECEIVE:
                {
                    if(mIsServer)
                        readClientPacket(event);
                    else
                        readServerPacket(event);

                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        if(mIsServer && mClients.size() > 0)
            sendServerPacket();
        else if(mServerPeer != NULL)
            sendClientPacket();

        enet_host_flush(mHost);
    }
示例#12
0
void Player_listen(void *self) {
	Player *player = self;
	for(;;) {
		if (pthread_mutex_lock(&player->queue->queue_lock) != 0) {
			syslog(LOG_ERR,"Animationplayer: Can't get the lock on the queue.");
		}
		if (player->queue->current == NULL) {
			syslog(LOG_DEBUG,"Waiting...");
			pthread_cond_wait(&player->queue->queue_not_empty, &player->queue->queue_lock);
		}

		syslog(LOG_DEBUG, "Working.....");
		Command *command = player->queue->current->command;

		if (command->action == play) {
			if (player->run == 1 && player->currentAnimation != NULL && player->currentAnimation->repeat == -1) {
				set_run_state(0);
				void* result;
				if (pthread_join(runner, &result) != 0) {
					syslog(LOG_ERR,"Animationplayer: failed to wait for current player thread.");
				}
			}
			if (player->run == 0) {
				set_run_state(1);
				spawnPlayer((Animation*) command->value);
				popQueue();
			}
		}
		if (command->action == stop || command->action == halt) {
			syslog(LOG_ERR,"Animationplayer: halting current animation %s.", player->currentAnimation->name);
			set_run_state(0);
			void* result;
			if (pthread_join(runner, &result) != 0) {
				syslog(LOG_ERR,"Animationplayer: failed to wait for current player thread.");
			}
			popQueue();
		}

		if (pthread_mutex_unlock(&player->queue->queue_lock) != 0) {
			syslog(LOG_ERR,"Animationplayer: Can't release the lock on the queue.");
		}
	}
}
示例#13
0
void GameState::loadLevel(int num) {
    if(Root().game_state.m_player) Root().game_state.m_player->m_walkSound.pause();
    if(num < 0 || num >= m_levels.size()) {
        Root().menu_state.setGameOver(num > 0);
        Root().states.pop();
        return;
    }

    m_currentLevel = num;
    m_currentLevelName = m_levels[m_currentLevel].first;
    m_helpProgress = 0.f;
    m_currentHelp = "";

    std::string filename = m_currentLevelName + ".dat";
    loadFromFile("levels/" + filename);

    // spawn something
    auto spawn = getMarker(Marker::SPAWN);
    m_player = nullptr;
    auto pos = glm::vec2(0, 0);
    if(spawn) {
        pos = spawn->position();
    } else {
        std::cout << "Warning: level " << filename << " does not contain any spawn marker. Spawning at (0, 0)." << std::endl;
    }

    if(m_currentLevelName == "spawn") {
        spawnEgg(pos);
    } else {
        spawnPlayer(pos);
    }

    m_levelFade = 1.f;
    tween::TweenerParam p2(1000, tween::SINE, tween::EASE_IN_OUT);
    p2.addProperty(&m_levelFade, 0.f);
    m_tweener.addTween(p2);

    if(Root().debug && m_debugDrawEnabled) {
        message(m_currentLevelName);
    }
}
示例#14
0
void Player::killPlayer()
{
    if (fireReady == false)
    {
        delete reloadAnim;
        fireReady = true;
    }
    deleteTank();

    // координата Х в центре экрана
    int x1 = centralX();
    // координата Y в центре экрана
    int y1 = centralY();

    // плашка смерти
    QString image1 = ":/images/images/died.png";
    died = new Caution(image1, "DEAD");
    died->setPos(x1-200,y1-88);
    game->scene->addItem(died);

    QTimer::singleShot(2000, this, SLOT(spawnPlayer()));
}
示例#15
0
void Map::startMap ()
{
	rebuildField();
	for (PlayerListIter i = _playersWaitingForSpawn.begin(); i != _playersWaitingForSpawn.end(); ++i) {
		spawnPlayer(*i);
	}
	_playersWaitingForSpawn.clear();

	INetwork& network = _serviceProvider->getNetwork();
	network.sendToAllClients(StartMapMessage());

	for (int row = 0; row < _height; ++row) {
		for (int col = 0; col < _width; ++col) {
			StateMapConstIter i = _state.find(INDEX(col, row));
			if (i == _state.end())
				continue;
			const char c = i->second;
			if (c != Sokoban::PACKAGEONTARGET)
				continue;

			getPackage(col, row)->setState(CavePackerEntityStates::DELIVERED);
		}
	}
}
示例#16
0
void PlayerSpawner::startGame()
{
	if(NetworkManager::instance()->isServer())
	{
		if(GameState::instance()->team_mode == TEAM && GameState::instance()->game_mode != PINTO)
		{
			uint32_t prev_team = BLUE_TEAM;
			for(std::map<int,bool>::iterator iter = GameState::instance()->playerConnections.begin();
            iter != GameState::instance()->playerConnections.end(); ++iter)
			{
				int i = iter->first;
				if(prev_team == BLUE_TEAM)
				{
					NetworkManager::instance()->player_team_id_map[i] = RED_TEAM;
					prev_team = RED_TEAM;
				}
				else
				{
					NetworkManager::instance()->player_team_id_map[i] = BLUE_TEAM;
					prev_team = BLUE_TEAM;
				}
			}

			std::vector<Ogre::Vector3> spawned_positions_blue;
			std::vector<Ogre::Vector3> spawned_positions_red;
			for(std::map<int,bool>::iterator iter = GameState::instance()->playerConnections.begin();
				iter != GameState::instance()->playerConnections.end(); ++iter)
		    {
		        int i = iter->first;	
				uint32_t version = RAND_RANGE(0, 5);
				float rand_x = RAND_RANGE(0, SPAWN_RAND_RADIUS_MAX) - SPAWN_RAND_RADIUS_MAX;
				float rand_z = RAND_RANGE(0, SPAWN_RAND_RADIUS_MAX) - SPAWN_RAND_RADIUS_MAX;
				Ogre::Vector3 position;
				if(NetworkManager::instance()->player_team_id_map[i] == RED_TEAM)
				{
					position = red_position;
					position.x = position.x + rand_x;
					position.z = position.z + rand_z;
				}
				else
				{
					position = blue_position;
					position.x = position.x + rand_x;
					position.z = position.z + rand_z;
				}

				spawnPlayer(position.x, position.y, position.z, i, NetworkManager::instance()->player_team_id_map[i], version, false);

				NetworkManager::instance()->vital->setPlayerRespawn(position.x, position.y, position.z, i, NetworkManager::instance()->player_team_id_map[i], version, false);
			}
		}
		else
		{
			uint32_t pinto_index = 100;

			if(GameState::instance()->game_mode == PINTO)
			{
				pinto_index = RAND_RANGE(0, GameState::instance()->num_player);
				int loop = 0;
				for(std::map<int,bool>::iterator iter = GameState::instance()->playerConnections.begin();
		            iter != GameState::instance()->playerConnections.end(); ++iter) {
					if (loop == pinto_index) { pinto_index = iter->first; break; }
					loop++;
				}
			}

			std::vector<Ogre::Vector3> spawned_positions;
			for(int i = 0; i < GameState::instance()->num_player; ++i)
			{	
				uint32_t version = RAND_RANGE(0, 5);
				Ogre::Vector3 position;
				do
				{
					position = free_positions[RAND_RANGE(0, free_positions.size())];
				}while(std::find(spawned_positions.begin(), spawned_positions.end(), position) != spawned_positions.end());
				spawned_positions.push_back(position);

				bool is_pinto = false;

				if(i == pinto_index)
				{
					is_pinto = true;
				}

				spawnPlayer(position.x, position.y, position.z, i, NetworkManager::instance()->player_team_id_map[i], version, is_pinto);
				NetworkManager::instance()->vital->setPlayerRespawn(position.x, position.y, position.z, i, NetworkManager::instance()->player_team_id_map[i], version, is_pinto);
			}
		}
	}
}
示例#17
0
    void NetManager::update()
    {
        mTick++;

        ENetEvent event;

        // TODO: remove this block when we handle level switching properly
        auto player = FAWorld::World::get()->getCurrentPlayer();
        if(player->getLevel())
            mLevelIndexTmp = player->getLevel()->getLevelIndex();
        else
            mLevelIndexTmp = -1;

        while(enet_host_service(mHost, &event, 0))
        {
            switch(event.type)
            {
                case ENET_EVENT_TYPE_CONNECT:
                {
                    if(mIsServer)
                    {
                        auto player = spawnPlayer(-1);

                        // send the client its player id
                        auto packet = enet_packet_create(NULL, sizeof(size_t), ENET_PACKET_FLAG_RELIABLE);
                        size_t position = 0;
                        writeToPacket(packet, position, player->getId());
                        enet_peer_send(event.peer, RELIABLE_CHANNEL_ID, packet);

                        sendLevel(0, event.peer);
                        sendLevel(1, event.peer);
                        mClients.push_back(event.peer);
                        mServerPlayerList[event.peer->connectID] = player;
                    }
                    break;
                }

                case ENET_EVENT_TYPE_RECEIVE:
                {
                    if(mIsServer)
                        readClientPacket(event);
                    else
                        readServerPacket(event);

                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        if(mIsServer && mClients.size() > 0)
            sendServerPacket();
        else if(mServerPeer != NULL)
            sendClientPacket();

        enet_host_flush(mHost);
    }
示例#18
0
文件: gamescene.cpp 项目: jsfdez/1942
void GameScene::update()
{
    Q_ASSERT(sender() == findChild<QTimer*>());

    if(m_paused) return;

    GraphicsPlayerObject* player = nullptr;
    QList<AbstractGraphicsPlaneObject*> planes;
    for(auto item : items()) // find planes
    {
        switch(item->type())
        {
        case PlayerType:
            player = qgraphicsitem_cast<GraphicsPlayerObject*>(item);
        case EnemyType:
            planes.append(dynamic_cast<AbstractGraphicsPlaneObject*>(item));
        }
    }
    if(player && !player->isInvencible())
    {
        Q_ASSERT(player == m_player);

        const auto playerRect = player->sceneBoundingRect();
        for(auto plane : planes)
        {
            if(plane != player)
            {
                const auto enemyRect = plane->sceneBoundingRect();
                if (playerRect.intersects(enemyRect))
                    player->impact(std::numeric_limits<qint32>::max());
            }
        }
    }

    for(auto item : items())
    {
        if(item->type() == BulletType || item->type() == EnemyBulletType)
        {
            const auto rect = item->boundingRect().translated(item->pos());
            if(!sceneRect().contains(rect))
                delete item;
            else
            {
                bool impacted = false;
                for(auto it = planes.begin(); it != planes.end() && !impacted;
                    ++it)
                {
                    const auto planeRect = (*it)->sceneBoundingRect();
                    auto plane = qgraphicsitem_cast<
                        AbstractGraphicsPlaneObject*>(*it);
                    const auto status = plane->status();
                    if(status == AbstractGraphicsPlaneObject::Status::Alive
                       && planeRect.contains(rect))
                    {
                        plane->impact(100);
                        impacted = true;
                    }
                }
                if(impacted) delete item;
            }
        }
    }

    if(--m_spawnEnemiesTicks == 0) // Spawn enemies
    {
        if(!(qrand() % 24)) // 1/25
            spawnEnemies(GraphicsEnemyObject::EnemyType::Boss, true);
        else
            spawnEnemies(GraphicsEnemyObject::EnemyType::White, true);
        m_spawnEnemiesTicks = m_spawnEnemiesMaxTicks;
    }
    else if(m_spawnEnemiesTicks == m_spawnEnemiesMaxTicks / 2)
    {
        if(!(qrand() % 24)) // 1/25
            spawnEnemies(GraphicsEnemyObject::EnemyType::Boss, false);
        else
            spawnEnemies(GraphicsEnemyObject::EnemyType::Green, false);
    }

    if(m_respawnTicks && --m_respawnTicks == 0)
        spawnPlayer();

    QGraphicsScene::advance();
}
示例#19
0
void loadStage(char *filename)
{
  FILE* file;
  char  buf[200];
  int   numheight;
  int h,w;
  currentStage.ingame = 1;
  InitEntityList();
  numheight=0;
  file = fopen(filename, "r");
  if(!file)
  {
    fprintf(stderr, "failed to open scene file %s\n", filename);
    exit(1);
  }
  
  while(fscanf(file, "%s", buf) != EOF)
  {
    switch(buf[0]) 
    {
      case 's':
        fscanf(file, "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", &currentStage.tilemap[numheight][0], &currentStage.tilemap[numheight][1], &currentStage.tilemap[numheight][2],&currentStage.tilemap[numheight][3],&currentStage.tilemap[numheight][4],&currentStage.tilemap[numheight][5],&currentStage.tilemap[numheight][6],&currentStage.tilemap[numheight][7],&currentStage.tilemap[numheight][8],&currentStage.tilemap[numheight][9],&currentStage.tilemap[numheight][10],&currentStage.tilemap[numheight][11],&currentStage.tilemap[numheight][12],&currentStage.tilemap[numheight][13],&currentStage.tilemap[numheight][14],&currentStage.tilemap[numheight][15],&currentStage.tilemap[numheight][16],&currentStage.tilemap[numheight][17],&currentStage.tilemap[numheight][18],&currentStage.tilemap[numheight][19]);
        if(numheight < SPACE_H)numheight++;
        break;
      default:
        fgets(buf, sizeof(buf), file);
        break;
    }
  }
  fclose(file);
  spawnPlayer(0,-20,0);
  for(h=0;h < SPACE_H;h++)
  {
    for(w=0;w < SPACE_W;w++)
    {	
      if(currentStage.tilemap[h][w] == 1)
      {	
        if(w > 10)
        {
          spawnEnemy1((w-10) * 4.5f,h* 14.5f, 0);
        }else spawnEnemy1((float)((w-10) * 4),h* 14.5f, 0);
      }
      if(currentStage.tilemap[h][w] == 2)
      {
        if(w > 10)
        {
          spawnEnemy2((w-10) * 4.5f,h* 14.5f, 0);
        }else spawnEnemy2((float)((w-10) * 4),h* 14.5f, 0);
      }
      if(currentStage.tilemap[h][w] == 3)
      {
        if(w > 10)
        {
          spawnEnemy3((w-10) * 4.5f,h* 14.5f, 0);
        }else spawnEnemy3((float)((w-10) * 4),h* 14.5f, 0);
      }
      if(currentStage.tilemap[h][w] == 4)
      {
        if(w > 10)
        {
          spawnBoss1((w-10) * 4.5f,h* 14.5f, 0);
        }else spawnBoss1((float)((w-10) * 4),h* 14.5f, 0);
      }
    }
  }
}
// ******************************************************************
void GameManager::spawnPlayer( PlayerState *player_state )
{
    spawnPlayer( player_state->getPlayerID() );
}