Beispiel #1
0
void ClientJoin(PCHAR Data, int iBitLength, PlayerID sender)
{
	RakNet::BitStream bsData(Data,iBitLength/8,FALSE);
	CPlayerPool *pPlayerPool = pNetGame->GetPlayerPool();
	CVehiclePool *pVehiclePool = pNetGame->GetVehiclePool();
	CPickupPool *pPickupPool = pNetGame->GetPickupPool();
	CPedPool *pPedPool = pNetGame->GetPedPool();

	CHAR szPlayerName[MAX_PLAYER_NAME];
	BYTE bytePlayerID;
	BYTE byteVersion;
	BYTE byteNickLen;

	bsData.Read(byteVersion);

	if(byteVersion != NETGAME_VERSION) {
		pNetGame->GetNetSends()->ConnectionRejected(sender, REJECT_REASON_BAD_VERSION);
		return;
	}

	bsData.Read(byteNickLen);
	bsData.Read(szPlayerName,byteNickLen);
	szPlayerName[byteNickLen] = '\0';

	FilterInvalidNickChars(szPlayerName);
	byteNickLen = strlen(szPlayerName);

	if(byteNickLen==0 || byteNickLen > 16 || pPlayerPool->IsNickInUse(szPlayerName)) {
		pNetGame->GetNetSends()->ConnectionRejected(sender, REJECT_REASON_BAD_NICKNAME);
		return;
	}

	bytePlayerID = pRak->GetIndexFromPlayerID(sender);
	
	// Add this client to the player pool.
	pPlayerPool->New(bytePlayerID, szPlayerName);

	// Send this client back an 'InitGame' Call
	pNetGame->GetNetSends()->InitGame(sender, pNetGame->m_vecInitPlayerPos, pNetGame->m_vecInitCameraPos, pNetGame->m_vecInitCameraLook, pNetGame->m_WorldBounds, pNetGame->m_iSpawnsAvailable, pNetGame->m_byteFriendlyFire, pNetGame->m_byteShowOnRadar, pNetGame->m_startInterior);

	// Send this client existing players
	pNetGame->GetNetSends()->FirstJoin(sender);

	// Spawn all existing vehicles for player.
	CVehicle *pVehicle;
	BYTE x=0;

	while(x!=MAX_VEHICLES) {
		if(pVehiclePool->GetSlotState(x) == TRUE) {
			pVehicle = pVehiclePool->GetAt(x);
			if(pVehicle->IsActive()) pVehicle->SpawnForPlayer(bytePlayerID);
		}
		x++;
	}

	CPickup *pPickup;
	x=0;

	while(x!=MAX_PICKUPS) {
		if(pPickupPool->GetSlotState(x) == TRUE) {
			pPickup = pPickupPool->GetAt(x);
			if(pPickup->IsActive()) pPickup->SpawnForPlayer(bytePlayerID);
		}
		x++;
	}

	/*CPed *pPed;
	x=0;

	while(x!=MAX_PEDS) {
		if(pPedPool->GetSlotState(x) == TRUE) {
			pPed = pPedPool->GetAt(x);
			if(pPed->IsActive()) pPed->SpawnForPlayer(bytePlayerID);
		}
		x++;
	}*/

	pNetGame->GetGameLogic()->HandleClientJoin(bytePlayerID);
//	lua_getglobal( L, "OnPlayerJoinDataChange" );
//	lua_pushnumber( L, strlen(szPlayerName) );
//	lua_pushstring( L, szPlayerName );
//	lua_pcall( L, 2, 0, 0 );
}