Beispiel #1
0
// Spawns a player at a particular spawn point
void _Server::SpawnPlayer(_Object *Player, NetworkIDType MapID, uint32_t EventType) {
	if(!ValidatePeer(Player->Peer) || !Player->Peer->CharacterID || !MapID)
	   return;

	// Get map
	_Map *Map = MapManager->GetObject(MapID);

	// Load map
	if(!Map) {
		Map = MapManager->CreateWithID(MapID);
		Map->Clock = Clock;
		Map->Server = this;
		Map->Load(Stats->GetMap(MapID)->File);
	}

	// Get old map
	_Map *OldMap = Player->Map;

	// Place player in new map
	if(Map != OldMap) {
		if(OldMap) {
			OldMap->RemoveObject(Player);
		}

		Player->Map = Map;

		// Find spawn point in map
		uint32_t SpawnPoint = Player->SpawnPoint;
		if(EventType == _Map::EVENT_MAPENTRANCE)
			SpawnPoint = OldMap->NetworkID;

		// Default to mapchange event if entrance not found
		if(!Map->FindEvent(_Event(EventType, SpawnPoint), Player->Position))
			Map->FindEvent(_Event(_Map::EVENT_MAPCHANGE, SpawnPoint), Player->Position);

		// Add player to map
		Map->AddObject(Player);

		// Send new map id
		_Buffer Packet;
		Packet.Write<PacketType>(PacketType::WORLD_CHANGEMAPS);
		Packet.Write<uint32_t>(MapID);
		Packet.Write<double>(Clock);
		Network->SendPacket(Packet, Player->Peer);

		// Set player object list
		Map->SendObjectList(Player->Peer);

		// Set full player data to peer
		SendPlayerInfo(Player->Peer);
	}
	else {
		Map->FindEvent(_Event(EventType, Player->SpawnPoint), Player->Position);
		SendPlayerPosition(Player->Peer);
		SendHUD(Player->Peer);
	}
}
		void Update()
		{
			// Check if we are tagging enemy
			{
				if (m_ConnectedPlayers != NULL)
				{
					float length = (m_ConnectedPlayers->m_position - Graphics::GetPlayerPosition()).GetLength();
					Audio::SetVolume(length, 400.0f, 100.0f);
					if (length < 100.0f)
					{
						eae6320::Graphics::ResetFlag();
						eae6320::Graphics::ResetEnemyFlag();
						eae6320::Networking::TagBitch();
					}
				}
			}

			RakNet::Packet *packet;
			for (packet = m_Peer->Receive(); packet; m_Peer->DeallocatePacket(packet), packet = m_Peer->Receive())
			{
				switch (packet->data[0])
				{
				case ID_ENEMY_SCORE:
				{
					RakNet::BitStream bsIn(packet->data, packet->length, false);
					bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
					int Score;
					bsIn.Read(Score);

					eae6320::Graphics::SetEnemyScore(Score);
					Audio::PlayAudio(7);
				}
					break;
				case ID_ENEMY_FLAG_LOCATION:
				{
					RakNet::BitStream bsIn(packet->data, packet->length, false);
					bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
					bsIn.Read(m_EnemyFlagLocation.x);
					bsIn.Read(m_EnemyFlagLocation.y);
					bsIn.Read(m_EnemyFlagLocation.z);

					eae6320::Graphics::SetEnemyFlagLocation(m_EnemyFlagLocation);
				}
					break;
				case ID_REMOTE_DISCONNECTION_NOTIFICATION:
					UserOutput::Print("Another client has disconnected.\n");
					break;
				case ID_REMOTE_CONNECTION_LOST:
					UserOutput::Print("Another client has lost the connection.\n");
					break;
				case ID_REMOTE_NEW_INCOMING_CONNECTION:
					UserOutput::Print("Another client has connected.\n");
					break;
				case ID_CONNECTION_REQUEST_ACCEPTED:
				{
					printf("Our connection request has been accepted.\n");
					m_ServerAddress = packet->systemAddress;
					// Use a BitStream to write a custom user message
					// Bitstreams are easier to use than sending casted structures, and handle endian swapping automatically
					SendPlayerPosition();
				}
					break;
				case ID_NEW_INCOMING_CONNECTION:
					UserOutput::Print("A connection is incoming.\n");
					m_Clients[m_totalClients] = packet->systemAddress;
					m_totalClients++;
					SendPlayerPosition();
					break;
				case ID_NO_FREE_INCOMING_CONNECTIONS:
					UserOutput::Print("The server is full.\n");
					break;
				case ID_DISCONNECTION_NOTIFICATION:
					if (m_IsServer) {
						UserOutput::Print("A client has disconnected.\n");
					}
					else {
						UserOutput::Print("We have been disconnected.\n");
					}
					break;
				case ID_PLAYER_LOCATION:
				{
					CreatePlayer();
					RakNet::BitStream bsIn(packet->data, packet->length, false);
					bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
					float x, y, z;
					bsIn.Read(x);
					bsIn.Read(y);
					bsIn.Read(z);
					for (int i = 0; i < 10; i++)
					{
						m_ConnectedPlayers[i].m_position.x = x;
						m_ConnectedPlayers[i].m_position.y = y;
						m_ConnectedPlayers[i].m_position.z = z;
					}
				}
				break;
				case ID_TAG_BITCH:
				{
					m_ResetFlag = true;
				}
				break;
				case ID_CONNECTION_LOST:
					if (m_IsServer) {
						UserOutput::Print("A client lost the connection.\n");
					}
					else {
						UserOutput::Print("Connection lost.\n");
					}
					break;
				default:
					char buf[100];
					sprintf_s(buf, "Message with identifier %i has arrived.\n", packet->data[0]);
					UserOutput::Print(buf);
					break;
				}
			}
		}