// 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; } } }