void CNetGame::ProcessClientJoin(BYTE bytePlayerID) { // Perform all init operations. if(GetGameState() == GAMESTATE_RUNNING) { m_pVehiclePool->InitForPlayer(bytePlayerID); // give them all the existing vehicles m_pPickupPool->InitForPlayer(bytePlayerID); // give them all the existing pickups m_pObjectPool->InitForPlayer(bytePlayerID); // give them all the existing map objects InitGameForPlayer(bytePlayerID); m_pPlayerPool->InitPlayersForPlayer(bytePlayerID); // let them know who's on the server m_pPlayerPool->InitSpawnsForPlayer(bytePlayerID); // spawn any existing players for them m_pMenuPool->ResetPlayer(bytePlayerID); // Mark them as requiring menus // Inform them of their VW as it doesn't actually work if called from OnPlayerConnect // The server is updated but they're not connected fully so don't get it, so resend it BYTE byteVW = m_pPlayerPool->GetPlayerVirtualWorld(bytePlayerID); /*RakNet::BitStream bsData; bsData.Write(bytePlayerID); // player id bsData.Write(byteVW); // VW id m_pRak->RPC(&RPC_ScrSetPlayerVirtualWorld, &bsData, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_PLAYER_ID, true, false, UNASSIGNED_NETWORK_ID, NULL); */ } else if(GetGameState() == GAMESTATE_RESTARTING) { InitGameForPlayer(bytePlayerID); m_pPlayerPool->InitPlayersForPlayer(bytePlayerID); // let them know who's on the server // Tell them that the world is currently restarting. RakNet::BitStream bsParams; PlayerID sender = m_pRak->GetPlayerIDFromIndex(bytePlayerID); m_pRak->RPC(&RPC_GameModeRestart, &bsParams, HIGH_PRIORITY, RELIABLE,0,sender,false,false, UNASSIGNED_NETWORK_ID, NULL); } //GetGameLogic()->HandleClientJoin(bytePlayerID); //GetGameMode()->OnPlayerConnect(bytePlayerID); }
void CNetGame::ReInitWhenRestarting() { Init(); BYTE bytePlayerID=0; while(bytePlayerID != MAX_PLAYERS) { if(m_pPlayerPool->GetSlotState(bytePlayerID)) { m_pVehiclePool->InitForPlayer(bytePlayerID); // give them all the existing vehicles m_pPickupPool->InitForPlayer(bytePlayerID); m_pObjectPool->InitForPlayer(bytePlayerID); InitGameForPlayer(bytePlayerID); m_pFilterScripts->OnPlayerConnect(bytePlayerID); m_pGameMode->OnPlayerConnect(bytePlayerID); } bytePlayerID++; } }
void RPC_ClientJoins(RPCParameters *rpcParams) { PCHAR Data = reinterpret_cast<PCHAR>(rpcParams->input); int iBitLength = rpcParams->numberOfBitsOfData; PlayerID sender = rpcParams->sender; RakNet::BitStream bsData((unsigned char *)Data,(iBitLength/8)+1,false); RakNet::BitStream bsReject; char szNickName[32], pszAuthBullshit[44]; int iVersion; unsigned int uiChallengeResponse; BYTE byteMod, byteNameLen, byteAuthBSLen; PLAYERID playerID = pRakServer->GetIndexFromPlayerID(sender); BYTE byteRejectReason; bsData.Read(iVersion); bsData.Read(byteMod); bsData.Read(byteNameLen); bsData.Read(szNickName, byteNameLen); szNickName[byteNameLen] = 0; bsData.Read(uiChallengeResponse); bsData.Read(byteAuthBSLen); bsData.Read(pszAuthBullshit, byteAuthBSLen); PlayerID MyPlayerID = pRakServer->GetPlayerIDFromIndex(playerID); in_addr in; if(UNASSIGNED_PLAYER_ID == MyPlayerID) { in.s_addr = sender.binaryAddress; Log("Detected possible bot from (%s)", inet_ntoa(in)); pRakServer->Kick(MyPlayerID); return; } if(!pRakServer->IsActivePlayerID(sender) || playerID > MAX_PLAYERS) { byteRejectReason = REJECT_REASON_BAD_PLAYERID; bsReject.Write(byteRejectReason); pRakServer->RPC(&RPC_ConnectionRejected, &bsReject, HIGH_PRIORITY, RELIABLE, 0, sender, FALSE, FALSE, UNASSIGNED_NETWORK_ID, NULL); pRakServer->Kick(sender); return; } if(iVersion != NETGAME_VERSION || _uiRndSrvChallenge != (uiChallengeResponse ^ NETGAME_VERSION)) { byteRejectReason = REJECT_REASON_BAD_VERSION; bsReject.Write(byteRejectReason); pRakServer->RPC(&RPC_ConnectionRejected, &bsReject, HIGH_PRIORITY, RELIABLE, 0, sender, FALSE, FALSE, UNASSIGNED_NETWORK_ID, NULL); pRakServer->Kick(sender); return; } for(int i = 0; i < iScriptsRunning; i++) { if(script.scriptVM[i] != NULL && script.szScriptName[i][0] != 0x00) ScriptEvent_OnPlayerJoin(script.scriptVM[i], playerID, szNickName, rpcParams->sender.ToString(false), rpcParams->sender.port); } addPlayerToPool(rpcParams->sender, playerID, szNickName); InitGameForPlayer(playerID); SendPlayerPoolToPlayer(playerID); SpawnAllVehiclesForPlayer(playerID); }