void PlayerRequestSpawn(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { CLogFile::Printf("%s", __FUNCTION__); // Get the player id EntityId playerId = (EntityId) pPacket->guid.systemIndex; // Get a pointer to the player CPlayerEntity * pPlayer = CServer::GetInstance()->GetPlayerManager()->GetAt(playerId); // Is the player pointer valid? if (pPlayer) { if (CEvents::GetInstance()->IsEventRegistered("playerRequestSpawn")) { CScriptArguments args; args.push(pPlayer->GetScriptPlayer()); CEvents::GetInstance()->Call("playerRequestSpawn", &args, CEventHandler::eEventType::NATIVE_EVENT, 0); } else { RakNet::BitStream bitStream; bitStream.Write(CVector3(DEFAULT_SPAWN_POSITION)); //spawnPos bitStream.Write(0.0f); //fHeading CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_PLAYER_SPAWN), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); } CLogFile::Printf("[spawn] %s has requestred a spawn.", pPlayer->GetName().Get()); } }
void PlayerChat(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { // Get the playerid EntityId playerId = (EntityId) pPacket->guid.systemIndex; // Read if this is a command bool bIsCommand = pBitStream->ReadBit(); // Read the input RakNet::RakString strInput; pBitStream->Read(strInput); // Is the player active? if (CServer::GetInstance()->GetPlayerManager()->DoesExists(playerId)) { // Get a pointer to the player CPlayerEntity * pPlayer = CServer::GetInstance()->GetPlayerManager()->GetAt(playerId); // Is the pointer valid? if (pPlayer) { // Is this not a command? if (!bIsCommand) { CLogFile::Printf("[chat] %s: %s", pPlayer->GetName().Get(), strInput.C_String()); // Send the RPC back to other players RakNet::BitStream bitStream; bitStream.Write(playerId); bitStream.Write(strInput); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_PLAYER_CHAT), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); } else { CLogFile::Printf("[command] %s: %s", pPlayer->GetName().Get(), strInput.C_String()); CScriptArguments args; args.push(strInput); args.push(pPlayer->GetScriptPlayer()); CEvents::GetInstance()->Call("playerCommand", &args, CEventHandler::eEventType::NATIVE_EVENT, nullptr); } } } }
void PlayerDeath(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { CLogFile::Printf("%s", __FUNCTION__); // Get the player id EntityId playerId = (EntityId) pPacket->guid.systemIndex; // Read the killer id EntityId killerId; pBitStream->Read(killerId); // Get a pointer to the player CPlayerEntity * pPlayer = CServer::GetInstance()->GetPlayerManager()->GetAt(playerId); // Is the player pointer valid? if (pPlayer) { // Kill the player //pPlayer->KillForWorld(); // Is the killer a player? if (killerId != INVALID_ENTITY_ID) { // Find the killer CPlayerEntity* pKiller = CServer::GetInstance()->GetPlayerManager()->GetAt(killerId); // Is the killer valid? if (pKiller) CLogFile::Printf("[death] %s has been killed by %s!", pPlayer->GetName().Get(), pKiller->GetName().Get()); else CLogFile::Printf("[death] %s has been killed!", pPlayer->GetName().Get()); } else { CLogFile::Printf("[death] %s has died!", pPlayer->GetName().Get()); } CScriptArguments args; args.push(pPlayer->GetScriptPlayer()); CEvents::GetInstance()->Call("playerDeath", &args, CEventHandler::eEventType::NATIVE_EVENT, 0); } }
void PlayerDeath(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { // Get the player id EntityId playerId = (EntityId) pPacket->guid.systemIndex; // Read the killer id EntityId killerId; pBitStream->ReadCompressed(killerId); // Get a pointer to the player CPlayerEntity * pPlayer = CServer::GetInstance()->GetPlayerManager()->GetAt(playerId); // Is the player pointer valid? if (pPlayer) { // Kill the player //pPlayer->KillForWorld(); // Is the killer a player? if (killerId != INVALID_ENTITY_ID) { // Find the killer CPlayerEntity* pKiller = CServer::GetInstance()->GetPlayerManager()->GetAt(killerId); // Is the killer valid? if (pKiller) CLogFile::Printf("[death] %s has been killed by %d!", pPlayer->GetName().Get(), pKiller->GetId()); else CLogFile::Printf("[death] %s has been killed by NOT_A_PLAYER!", pPlayer->GetName().Get()); } else { CLogFile::Printf("[death] %s has died!", pPlayer->GetName().Get()); } } CLogFile::Printf("%s", __FUNCTION__); }
void PlayerSpawn(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { // Get the player id EntityId playerId = (EntityId) pPacket->guid.systemIndex; // Get a pointer to the player CPlayerEntity * pPlayer = CServer::GetInstance()->GetPlayerManager()->GetAt(playerId); // Is the player pointer valid? if (pPlayer) { // Spawn the player //pPlayer->SpawnForWorld(); // Spawn everyone else connected for this player //CServer::GetInstance()->GetPlayerManager()->HandlePlayerSpawn(playerId); CScriptArguments args; args.push(pPlayer->GetScriptPlayer()); CEvents::GetInstance()->Call("onSpawn", &args, CEventHandler::eEventType::GLOBAL_EVENT, 0); CLogFile::Printf("[spawn] %s has spawned.", pPlayer->GetName().Get()); } CLogFile::Printf("%s", __FUNCTION__); }
void DownloadFinished(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { // Read the player name RakNet::RakString _strName; pBitStream->Read(_strName); CString strName(_strName.C_String()); // Read the player serial RakNet::RakString _strSerial; pBitStream->Read(_strSerial); CString strSerial(_strSerial.C_String()); // Is the nickname already in use? // TODO: check is nick in use // Is the player banned? // TODO: check is banned // Add the player to the manager // TODO: add to player manager CPlayerEntity * pPlayer = new CPlayerEntity(); pPlayer->SetName(strName); // Do we need the id; maybe internal for easier sync but definetly not public to the scripting engine pPlayer->SetId(CServer::GetInstance()->GetPlayerManager()->Add(pPlayer)); EntityId playerId = pPlayer->GetId(); srand(time(NULL)); pPlayer->SetColor(CColor(rand() % 256, rand() % 256, rand() % 256).dwHexColor); //generate random color CLogFile::Printf("[join] %s (%i) has connected to the server. (%s)", strName.Get(), playerId, strSerial.Get()); CScriptArguments args; CScriptPlayer * pScriptPlayer = new CScriptPlayer(); pScriptPlayer->SetEntity(pPlayer); pPlayer->SetScriptPlayer(pScriptPlayer); args.push(pScriptPlayer); CEvents::GetInstance()->Call("playerJoin", &args, CEventHandler::eEventType::NATIVE_EVENT, 0); // Construct a new bitstream RakNet::BitStream bitStream; // Write the player id bitStream.Write(playerId); // Write the player colour bitStream.Write(pPlayer->GetColor()); // Write the server name bitStream.Write(RakNet::RakString("IV:Network DEV Server")); // Write the max player count bitStream.Write(CVAR_GET_INTEGER("maxplayers")); // Write the port bitStream.Write(CVAR_GET_INTEGER("port")); // Send it back to the player CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_INITIAL_DATA), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId) { bitStream.Reset(); bitStream.Write(i); bitStream.Write(CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetName().Get()); bitStream.Write(CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetColor()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); } } for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId) { bitStream.Reset(); bitStream.Write(playerId); bitStream.Write(pPlayer->GetName().Get()); bitStream.Write(pPlayer->GetColor()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, i, false); } } for (EntityId i = 0; i < CServer::GetInstance()->GetVehicleManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetVehicleManager()->DoesExists(i)) { bitStream.Reset(); CVehicleEntity * pVehicle = CServer::GetInstance()->GetVehicleManager()->GetAt(i); bitStream.Write(pVehicle->GetId()); bitStream.Write(pVehicle->GetModelId()); CVector3 vecPosition; pVehicle->GetPosition(vecPosition); bitStream.Write(vecPosition); CVector3 vecRotation; pVehicle->GetRotation(vecRotation); bitStream.Write(vecRotation.fX); bitStream.Write(pVehicle->GetColor(1)); bitStream.Write(pVehicle->GetColor(2)); bitStream.Write(pVehicle->GetColor(3)); bitStream.Write(pVehicle->GetColor(4)); bitStream.Write(pVehicle->GetColor(5)); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CREATE_VEHICLE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); } } for (EntityId i = 0; i < CServer::GetInstance()->GetCheckpointManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetCheckpointManager()->DoesExists(i)) { bitStream.Reset(); CCheckpointEntity * pCheckpoint = CServer::GetInstance()->GetCheckpointManager()->GetAt(i); bitStream.Write(pCheckpoint->GetId()); bitStream.Write(pCheckpoint->GetType()); CVector3 vecPosition; pCheckpoint->GetPosition(vecPosition); bitStream.Write(vecPosition); CVector3 vecTargetPosition; pCheckpoint->GetTargetPosition(vecTargetPosition); bitStream.Write(vecTargetPosition); bitStream.Write(pCheckpoint->GetRadius()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CREATE_CHECKPOINT), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); // Checkpoint visibility if (!pCheckpoint->GetVisible()) { bitStream.Reset(); bitStream.Write(pCheckpoint->GetId()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CHECKPOINT_HIDE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); } } } }