void CElementRPCs::SetElementPosition ( NetBitStreamInterface& bitStream ) { // Read out the entity id and the position ElementID ID; CVector vecPosition; unsigned char ucTimeContext; if ( bitStream.Read ( ID ) && bitStream.Read ( vecPosition.fX ) && bitStream.Read ( vecPosition.fY ) && bitStream.Read ( vecPosition.fZ ) && bitStream.Read ( ucTimeContext ) ) { // Grab the entity CClientEntity* pEntity = CElementIDs::GetElement ( ID ); if ( pEntity ) { // Update the sync context to the new one pEntity->SetSyncTimeContext ( ucTimeContext ); // If it's a player, use Teleport if ( pEntity->GetType () == CCLIENTPLAYER ) { unsigned char ucWarp = 1; bitStream.Read ( ucWarp ); CClientPlayer* pPlayer = static_cast < CClientPlayer* > ( pEntity ); if ( ucWarp ) { pPlayer->Teleport ( vecPosition ); pPlayer->ResetInterpolation (); } else { pPlayer->SetPosition ( vecPosition ); } // If local player, reset return position (so we can't warp back if connection fails) if ( pPlayer->IsLocalPlayer () ) { m_pClientGame->GetNetAPI ()->ResetReturnPosition (); } } else if ( pEntity->GetType () == CCLIENTVEHICLE ) { CClientVehicle* pVehicle = static_cast < CClientVehicle* > ( pEntity ); pVehicle->RemoveTargetPosition (); pVehicle->SetPosition ( vecPosition ); } else { // Set its position pEntity->SetPosition ( vecPosition ); } } } }
void CElementRPCs::DetachElements ( NetBitStreamInterface& bitStream ) { ElementID ID; unsigned char ucTimeContext; if ( bitStream.Read ( ID ) && bitStream.Read ( ucTimeContext ) ) { CClientEntity* pEntity = CElementIDs::GetElement ( ID ); if ( pEntity ) { pEntity->SetSyncTimeContext ( ucTimeContext ); pEntity->AttachTo ( NULL ); CVector vecPosition; if ( bitStream.Read ( vecPosition.fX ) && bitStream.Read ( vecPosition.fY ) && bitStream.Read ( vecPosition.fZ ) ) { pEntity->SetPosition ( vecPosition ); } } } }
void CElementRPCs::SetElementInterior ( NetBitStreamInterface& bitStream ) { ElementID ID; unsigned char ucInterior, ucSetPosition; if ( bitStream.Read ( ID ) && bitStream.Read ( ucInterior ) && bitStream.Read ( ucSetPosition ) ) { CClientEntity* pEntity = CElementIDs::GetElement ( ID ); if ( pEntity ) { pEntity->SetInterior ( ucInterior ); if ( ucSetPosition == 1 ) { CVector vecPosition; if ( bitStream.Read ( vecPosition.fX ) && bitStream.Read ( vecPosition.fY ) && bitStream.Read ( vecPosition.fZ ) ) { pEntity->SetPosition ( vecPosition ); } } } } }