void CScriptBlip::SetColor(unsigned int uiColor) { RakNet::BitStream bitStream; bitStream.Write(GetEntity()->GetId()); bitStream.Write(uiColor); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_BLIP_SET_COLOR), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); }
void VehicleExit(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { // Get the player id EntityId playerId = (EntityId) pPacket->guid.systemIndex; // Read the vehicle id EntityId vehicleId; pBitStream->Read(vehicleId); // Read the seat byte byteSeat; pBitStream->Read(byteSeat); // Get the player instance CPlayerEntity * pPlayer = CServer::GetInstance()->GetPlayerManager()->GetAt(playerId); // Is the player instance valid? if (pPlayer) { // Handle this with the player RakNet::BitStream bitStream; bitStream.Write(playerId); bitStream.Write(vehicleId); bitStream.Write(byteSeat); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_EXIT_VEHICLE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); CScriptArguments args; args.push(pPlayer->GetScriptPlayer()); CEvents::GetInstance()->Call("playerExitVehicle", &args, CEventHandler::eEventType::NATIVE_EVENT, 0); } CLogFile::Printf("RPC_EXIT_VEHICLE - Player: %d, Vehicle: %d, Seat: %d", playerId, vehicleId, byteSeat); }
void CScriptBlip::SetVisible(bool bVisible) { RakNet::BitStream bitStream; bitStream.Write(GetEntity()->GetId()); bitStream.Write(bVisible); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_BLIP_SET_VISIBLE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); }
int CreateVehicle(int * VM) { GET_SCRIPT_VM_SAFE; pVM->ResetStackIndex(); int vehicleModel; pVM->Pop(vehicleModel); CVector3 vecPosition; pVM->Pop(vecPosition); float fAngle; pVM->Pop(fAngle); DWORD color1; pVM->Pop(color1); DWORD color2; pVM->Pop(color2); DWORD color3; pVM->Pop(color3); DWORD color4; pVM->Pop(color4); DWORD color5; pVM->Pop(color5, 0xFFFFFFFF); CVehicleEntity * pVehicle = new CVehicleEntity(); pVehicle->SetId(CServer::GetInstance()->GetVehicleManager()->FindFreeSlot()); CServer::GetInstance()->GetVehicleManager()->Add(pVehicle->GetId(), pVehicle); pVehicle->SetModelId(vehicleModel); pVehicle->SetPosition(vecPosition); pVehicle->SetRotation(CVector3(fAngle, 0.0f, 0.0f)); pVehicle->SetColor(1, color1); pVehicle->SetColor(2, color2); pVehicle->SetColor(3, color3); pVehicle->SetColor(4, color4); pVehicle->SetColor(5, color5); RakNet::BitStream bitStream; bitStream.Write(pVehicle->GetId()); bitStream.Write(vehicleModel); bitStream.Write(vecPosition); bitStream.Write(fAngle); bitStream.Write(color1); bitStream.Write(color2); bitStream.Write(color3); bitStream.Write(color4); bitStream.Write(color5); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CREATE_VEHICLE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); CScriptVehicle * pScriptVehicle = new CScriptVehicle(); pScriptVehicle->SetEntity(pVehicle); pVehicle->SetScriptVehicle(pScriptVehicle); pVM->PushInstance("CVehicleEntity", pScriptVehicle); return 1; }
int CreateBlip(int * VM) { GET_SCRIPT_VM_SAFE; pVM->ResetStackIndex(); unsigned int iIcon; pVM->Pop(iIcon); CVector3 vecPosition; pVM->Pop(vecPosition); bool bRange; pVM->Pop(bRange); CBlipEntity * pBlip = new CBlipEntity(); pBlip->SetId(CServer::GetInstance()->GetBlipManager()->FindFreeSlot()); CServer::GetInstance()->GetBlipManager()->Add(pBlip->GetId(), pBlip); pBlip->SetIcon(iIcon); pBlip->SetPosition(vecPosition); pBlip->SetRange(bRange); RakNet::BitStream bitStream; bitStream.Write(pBlip->GetId()); bitStream.Write(iIcon); bitStream.Write(vecPosition); bitStream.Write(bRange); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CREATE_BLIP), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); CScriptBlip * pScriptBlip = new CScriptBlip(); pScriptBlip->SetEntity(pBlip); pBlip->SetScriptBlip(pScriptBlip); pVM->PushInstance("CBlipEntity", pScriptBlip); return 1; }
int SendPlayerMessageToAll(int * VM) { GET_SCRIPT_VM_SAFE; pVM->ResetStackIndex(); CString sMessage; pVM->Pop(sMessage); int iColor; pVM->Pop(iColor); bool bAllowFormatting; pVM->Pop(bAllowFormatting); RakNet::BitStream bitStream; bitStream.Write(RakNet::RakString(sMessage.C_String())); bitStream.Write((DWORD)iColor); bitStream.Write(bAllowFormatting); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_PLAYER_MESSAGE_TO_ALL), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); pVM->Push(true); return 1; }
void CLocalPlayer::DoDeathCheck() { // Have we not yet processed the death and is the local player dead? if(!CLocalPlayer::m_bIsDead && IsDead()) { // Get the kill info EntityId playerId = INVALID_ENTITY_ID; EntityId vehicleId = INVALID_ENTITY_ID; EntityId weaponId = INVALID_ENTITY_ID; GetKillInfo(&playerId, &vehicleId,&weaponId); CLogFile::Printf("HandleDeath(LocalPlayer, %d, %d, %d)", playerId, vehicleId, weaponId); g_pCore->GetChat()->Outputf(false, "HandleDeath(LocalPlayer, %d, %d, %d)", playerId, vehicleId, weaponId); // Send the death notification to the server BitStream bsSend; bsSend.WriteCompressed(playerId); bsSend.WriteCompressed(vehicleId); bsSend.WriteCompressed(weaponId); g_pCore->GetNetworkManager()->Call(GET_RPC_CODEX(RPC_PLAYER_DEATH), &bsSend, HIGH_PRIORITY, RELIABLE_ORDERED, true); // Mark ourselves as dead CLocalPlayer::m_bIsDead = true; // Delete the object CIVScript::DeleteObject(&m_pObj); // Reset vehicle entry/exit flags SetExitFlag(true); ResetVehicleEnterExit(); // Get current day time so we don't have to set the time always.. CGameFunction::GetTime(&m_iRespawnTime[0], &m_iRespawnTime[1]); } }
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 CScriptBlip::SetName(CString sName) { RakNet::BitStream bitStream; bitStream.Write(GetEntity()->GetId()); bitStream.Write(RakNet::RakString(sName.C_String())); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_BLIP_SET_NAME), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); }
void CScriptBlip::SetPosition(float fX, float fY, float fZ) { GetEntity()->SetPosition(CVector3(fX, fY, fZ)); CScriptEntity::SetPosition(fX, fY, fZ); RakNet::BitStream bitStream; bitStream.Write(GetEntity()->GetId()); bitStream.Write(CVector3(fX, fY, fZ)); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_BLIP_SET_POSITION), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); }
void ClientFiles(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { EntityId playerId = (EntityId) pPacket->guid.systemIndex; RakNet::BitStream bitStream; for (auto pResource : CServer::GetInstance()->GetResourceManager()->GetResources()) { bitStream.Write(RakNet::RakString(pResource->GetName().C_String())); } CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_FILE_LIST), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); }
void CNetworkRPC::Register(RakNet::RPC4 * pRPC) { // Are we already registered? if (m_bRegistered) return; // Default rpcs pRPC->RegisterFunction(GET_RPC_CODEX(RPC_INITIAL_DATA), InitialData); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_DOWNLOAD_FINISH), DownloadFinished); // Player rpcs pRPC->RegisterFunction(GET_RPC_CODEX(RPC_PLAYER_CHAT), PlayerChat); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_SYNC_PACKAGE), PlayerSync); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_PLAYER_DEATH), PlayerDeath); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_PLAYER_REQUEST_SPAWN), PlayerRequestSpawn); // Vehicle rpcs pRPC->RegisterFunction(GET_RPC_CODEX(RPC_ENTER_VEHICLE), VehicleEnter); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_EXIT_VEHICLE), VehicleExit); // Checkpoint rpcs pRPC->RegisterFunction(GET_RPC_CODEX(RPC_ENTER_CHECKPOINT), CheckpointEnter); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_EXIT_CHECKPOINT), CheckpointExit); }
void CNetworkRPC::Unregister(RakNet::RPC4 * pRPC) { // Are we not registered? if (!m_bRegistered) return; // Default rpcs pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_INITIAL_DATA)); pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_DOWNLOAD_FINISH)); // Player rpcs pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_PLAYER_CHAT)); pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_SYNC_PACKAGE)); pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_PLAYER_DEATH)); pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_PLAYER_REQUEST_SPAWN)); // Vehicle rpcs pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_ENTER_VEHICLE)); pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_EXIT_VEHICLE)); // Checkpoint rpcs pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_ENTER_CHECKPOINT)); pRPC->UnregisterFunction(GET_RPC_CODEX(RPC_EXIT_CHECKPOINT)); }
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 CNetworkRPC::Register(RakNet::RPC4 * pRPC) { // Are we already registered? if (m_bRegistered) return; // Default rpcs pRPC->RegisterFunction(GET_RPC_CODEX(RPC_INITIAL_DATA), InitialData); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_FILE_LIST), ClientFiles); // Player rpcs pRPC->RegisterFunction(GET_RPC_CODEX(RPC_PLAYER_CHAT), PlayerChat); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_SYNC_PACKAGE), PlayerSync); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_PLAYER_DEATH), PlayerDeath); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_PLAYER_REQUEST_SPAWN), PlayerRequestSpawn); // Vehicle rpcs pRPC->RegisterFunction(GET_RPC_CODEX(RPC_ENTER_VEHICLE), VehicleEnter); pRPC->RegisterFunction(GET_RPC_CODEX(RPC_EXIT_VEHICLE), VehicleExit); }
void CLocalPlayer::HandleSpawn() { // Flag us as alive CLocalPlayer::m_bIsDead = false; // Set our current time CGameFunction::SetTimeOfDay(m_iRespawnTime[0],m_iRespawnTime[1]); // Reset vehicle enter/exit ResetVehicleEnterExit(); // Reset parachute m_bParachuteCheck = false; // Set first spawn m_bFirstSpawn = true; // Force to draw components on slot 8(parachute etc.) int iResult; switch (CIVScript::GetCharDrawableVariation(GetScriptingHandle(), 1)) { case 0: iResult = 1; break; case 1: iResult = 2; break; case 2: iResult = 2; break; case 3: iResult = 1; break; case 4: iResult = 1; break; default: break; } CIVScript::SetDrawPlayerComponent(8, 1); // special 3 CIVScript::SetCharComponentVariation(GetScriptingHandle(), 8, iResult, 0); // Set basic skin in developmet mode #ifdef _DEV SetPedClothes(1, 1); SetPedClothes(2, 1); SetPedClothes(3, 0); #endif //g_pCore->GetMainMenu()->SetVisible(true); // Notify the server g_pCore->GetNetworkManager()->Call(GET_RPC_CODEX(RPC_PLAYER_SPAWN), NULL, HIGH_PRIORITY, RELIABLE, true); }
void CNetworkManager::ConnectionAccepted(RakNet::Packet * pPacket) { // Set the network state SetNetworkState(NETSTATE_CONNECTED); // Construct a new bitstream RakNet::BitStream pBitStream; // Write the network version pBitStream.Write((DWORD)NETWORK_VERSION); // Write the player nickname pBitStream.Write(RakNet::RakString(g_pCore->GetNick().Get())); // Write the player serial pBitStream.Write(RakNet::RakString(SharedUtility::GetSerialHash().Get())); // Send to the server Call(GET_RPC_CODEX(RPC_INITIAL_DATA), &pBitStream, HIGH_PRIORITY, RELIABLE_ORDERED, true); }
int CreateCheckpoint(int * VM) { GET_SCRIPT_VM_SAFE; pVM->ResetStackIndex(); int iType; pVM->Pop(iType); CVector3 vecPosition; pVM->Pop(vecPosition); CVector3 vecNextPosition; pVM->Pop(vecNextPosition); float fRadius; pVM->Pop(fRadius); CCheckpointEntity * pCheckpoint = new CCheckpointEntity(); pCheckpoint->SetId(CServer::GetInstance()->GetCheckpointManager()->FindFreeSlot()); CServer::GetInstance()->GetCheckpointManager()->Add(pCheckpoint->GetId(), pCheckpoint); pCheckpoint->SetType(iType); pCheckpoint->SetPosition(vecPosition); pCheckpoint->SetTargetPosition(vecNextPosition); pCheckpoint->SetRadius(fRadius); RakNet::BitStream bitStream; bitStream.Write(pCheckpoint->GetId()); bitStream.Write(iType); bitStream.Write(vecPosition); bitStream.Write(vecNextPosition); bitStream.Write(fRadius); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CREATE_CHECKPOINT), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); CScriptCheckpoint * pScriptCheckpoint = new CScriptCheckpoint(); pScriptCheckpoint->SetEntity(pCheckpoint); pCheckpoint->SetScriptCheckpoint(pScriptCheckpoint); pVM->PushInstance("CCheckpointEntity", pScriptCheckpoint); return 1; }
void InitialData(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { // Get the playerid EntityId playerId = (EntityId) pPacket->guid.systemIndex; // Read the player version DWORD dwVersion; pBitStream->Read(dwVersion); // Is the network version invalid? if (dwVersion != (DWORD)/*NETWORK_VERSION*/0x0) { // TODO } RakNet::BitStream bitStream; for (auto pResource : CServer::GetInstance()->GetResourceManager()->GetResources()) { bitStream.Write(RakNet::RakString(pResource->GetName().C_String())); } CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_DOWNLOAD_START), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); }
void CInput::ProcessInput(CString strInput) { // Get the command and parameters size_t sSplit = strInput.Find(' ', 0); CString strCommand = strInput.Substring(0, sSplit++); CString strParameters = strInput.Substring(sSplit, (strInput.GetLength() - sSplit)); if(strCommand.IsEmpty()) return; else if(strCommand == "quit" || strCommand == "Quit" || strCommand == "exit") { CLogFile::Print("[Server] Server is going to shutdown NOW ...."); g_bClose = true; return; } else if(strCommand == "help" || strCommand == "?" || strCommand == "--usage") { printf("========== Available console commands: ==========\n"); printf("say <text>\n"); printf("uptime\n"); printf("resources\n"); printf("players\n"); printf("loadresource <name>\n"); printf("reloadresource <name>\n"); printf("unloadresource <name>\n"); printf("setSyncRate <rate>\n"); printf("setMaxFPS <fps>\n"); printf("exit\n"); return; } else if (strCommand == "setSyncRate") { int rate = atoi(strParameters.Get()); CServer::GetInstance()->SetSyncRate(rate); } else if (strCommand == "setMaxFPS") { int fps = atoi(strParameters.Get()); CServer::GetInstance()->SetMaximumFPS(fps); } else if (strCommand == "say") { RakNet::BitStream bitStream; bitStream.Write(RakNet::RakString(strParameters.Get())); bitStream.Write(0); bitStream.Write(true); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_PLAYER_MESSAGE_TO_ALL), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); } else if (strCommand == "uptime") { int sec = time(0) - CServer::GetInstance()->GetUpTime(); int hh, mm, ss; hh = sec / 3600; mm = (sec - (hh * 3600)) / 60; ss = sec - ((hh * 3600) + (mm * 60)); CLogFile::Printf("Server uptime: %d hours, %d minutes, %d seconds", hh, mm, ss); } else if (strCommand == "resources") { for (auto resource : CServer::GetInstance()->GetResourceManager()->GetResources()) { CLogFile::Printf("%s : %s", resource->GetName().C_String(), resource->GetResourceDirectoryPath().C_String()); } } else if (strCommand == "loadresource") { if (strParameters.IsEmpty()) return; if (CServer::GetInstance()->GetResourceManager()->GetResource(strParameters)) return; if (CResource* pResource = CServer::GetInstance()->GetResourceManager()->Load(SharedUtility::GetAbsolutePath(CServer::GetInstance()->GetResourceManager()->GetResourceDirectory()), strParameters)) { if (!CServer::GetInstance()->GetResourceManager()->StartServerResource(pResource)) CLogFile::Printf("Warning: Failed to load resource %s.", strParameters.Get()); else if(pResource->HasClientResourceFilesScripts() && CServer::GetInstance()->GetPlayerManager()->GetCount() > 0) { // Send the name of the loaded resource to the client RakNet::BitStream bitStream; bitStream.Write(RakNet::RakString(strParameters.Get())); CServer::GetInstance()->GetResourceManager()->GetResourceFileList(pResource)->Serialize(&bitStream); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_LOAD_RESOURCE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); } } else CLogFile::Printf("Warning: Failed to load resource %s.", strParameters.Get()); } else if (strCommand == "reloadresource") { if (strParameters.IsEmpty()) return; CResource * pResource = CServer::GetInstance()->GetResourceManager()->GetResource(strParameters); if (pResource == nullptr) pResource = CServer::GetInstance()->GetResourceManager()->Load(SharedUtility::GetAbsolutePath(CServer::GetInstance()->GetResourceManager()->GetResourceDirectory()), strParameters); else { if (pResource->HasClientResourceFilesScripts() && CServer::GetInstance()->GetPlayerManager()->GetCount() > 0) { RakNet::BitStream bitStream; bitStream.Write(RakNet::RakString(strParameters.Get())); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_UNLOAD_RESOURCE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); } CServer::GetInstance()->GetResourceManager()->Reload(pResource); } if (!CServer::GetInstance()->GetResourceManager()->StartServerResource(pResource)) CLogFile::Printf("Warning: Failed to load resource %s.", strParameters.Get()); else if (pResource->HasClientResourceFilesScripts() && CServer::GetInstance()->GetPlayerManager()->GetCount() > 0) { // Send the name of the loaded resource to the client RakNet::BitStream bitStream; bitStream.Write(RakNet::RakString(strParameters.Get())); CServer::GetInstance()->GetResourceManager()->GetResourceFileList(pResource)->Serialize(&bitStream); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_LOAD_RESOURCE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); } } else if (strCommand == "unloadresource") { if (strParameters.IsEmpty()) return; CResource* pResource = CServer::GetInstance()->GetResourceManager()->GetResource(strParameters); if (pResource) { if (pResource->HasClientResourceFilesScripts() && CServer::GetInstance()->GetPlayerManager()->GetCount() > 0) { // Send the name of the unloaded resource to the client RakNet::BitStream bitStream; bitStream.Write(RakNet::RakString(strParameters.Get())); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_UNLOAD_RESOURCE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); } CServer::GetInstance()->GetResourceManager()->Unload(pResource); } else return; } else if (strCommand == "players") { for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i)) { CLogFile::Printf("#%i: %s, %s", i, CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetName().Get(), CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetSerial().Get()); } } } }
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); } } } }
void InitialData(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { // Get the playerid EntityId playerId = (EntityId) pPacket->guid.systemIndex; // Read the player version DWORD dwVersion; pBitStream->Read(dwVersion); // 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 network version invalid? if (dwVersion != (DWORD)/*NETWORK_VERSION*/0x0) { // TODO } // 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)); playerId = pPlayer->GetId(); 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::GLOBAL_EVENT, 0); // Construct a new bitstream RakNet::BitStream bitStream; // Write the player id bitStream.WriteCompressed(playerId); // Write the player colour bitStream.Write(0xFFFFFF/*CServer::GetInstance()->GetPlayerManager()->GetAt(playerId)->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, playerId, false); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_START_GAME), &bitStream, HIGH_PRIORITY, RELIABLE, playerId, false); for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId) { bitStream.Reset(); bitStream.WriteCompressed(i); bitStream.Write(CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetName().Get()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE, playerId, false); } } for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId) { bitStream.Reset(); bitStream.WriteCompressed(playerId); bitStream.Write(strName.Get()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE, 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()*/90); CVector3 vecPosition; pVehicle->GetPosition(vecPosition); bitStream.Write(vecPosition); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CREATE_VEHICLE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); } } bitStream.Reset(); bitStream.WriteCompressed(playerId); bitStream.Write(7); bitStream.Write(3); bitStream.Write(3); bitStream.Write(1); }