bool CVehiclePuresyncPacket::Read ( NetBitStreamInterface& BitStream ) { // Got a player to read? if ( m_pSourceElement ) { CPlayer * pSourcePlayer = static_cast < CPlayer * > ( m_pSourceElement ); // Player is in a vehicle? CVehicle* pVehicle = pSourcePlayer->GetOccupiedVehicle (); if ( pVehicle ) { // Read out the time context unsigned char ucTimeContext = 0; if ( !BitStream.Read ( ucTimeContext ) ) return false; // Only read this packet if it matches the current time context that // player is in. if ( !pSourcePlayer->CanUpdateSync ( ucTimeContext ) ) { return false; } // Read out the keysync data CControllerState ControllerState; if ( !ReadFullKeysync ( ControllerState, BitStream ) ) return false; // Read out its position SPositionSync position ( false ); if ( !BitStream.Read ( &position ) ) return false; pSourcePlayer->SetPosition ( position.data.vecPosition ); // Jax: don't allow any outdated packets through unsigned char ucSeat; if ( !BitStream.Read ( ucSeat ) ) return false; if ( ucSeat != pSourcePlayer->GetOccupiedVehicleSeat () ) { // Mis-matching seats can happen when we warp into a different one, // which will screw up the whole packet return false; } // Read out the vehicle matrix only if he's the driver unsigned int uiSeat = pSourcePlayer->GetOccupiedVehicleSeat (); if ( uiSeat == 0 ) { // Read out the vehicle rotation in degrees SRotationDegreesSync rotation; if( !BitStream.Read ( &rotation ) ) return false; // Set it pVehicle->SetPosition ( position.data.vecPosition ); pVehicle->SetRotationDegrees ( rotation.data.vecRotation ); // Move speed vector SVelocitySync velocity; if ( !BitStream.Read ( &velocity ) ) return false; pVehicle->SetVelocity ( velocity.data.vecVelocity ); pSourcePlayer->SetVelocity ( velocity.data.vecVelocity ); // Turn speed vector SVelocitySync turnSpeed; if ( !BitStream.Read ( &turnSpeed ) ) return false; pVehicle->SetTurnSpeed ( turnSpeed.data.vecVelocity ); // Health SVehicleHealthSync health; if ( !BitStream.Read ( &health ) ) return false; float fPreviousHealth = pVehicle->GetHealth (); float fHealth = health.data.fValue; // Less than last time? if ( fHealth < fPreviousHealth ) { // Grab the delta health float fDeltaHealth = fPreviousHealth - fHealth; if ( fDeltaHealth > 0.0f ) { // Call the onVehicleDamage event CLuaArguments Arguments; Arguments.PushNumber ( fDeltaHealth ); pVehicle->CallEvent ( "onVehicleDamage", Arguments ); } } pVehicle->SetHealth ( fHealth ); // Trailer chain CVehicle* pTowedByVehicle = pVehicle; CVehicle* pTrailer = NULL; ElementID TrailerID; bool bHasTrailer; if ( !BitStream.ReadBit ( bHasTrailer ) ) return false; while ( bHasTrailer ) { BitStream.ReadCompressed ( TrailerID ); CElement* pElement = CElementIDs::GetElement ( TrailerID ); if ( pElement ) pTrailer = static_cast < CVehicle* > ( pElement ); // Read out the trailer position and rotation SPositionSync trailerPosition ( false ); if ( !BitStream.Read ( &trailerPosition ) ) return false; SRotationDegreesSync trailerRotation; if ( !BitStream.Read ( &trailerRotation ) ) return false; // If we found the trailer if ( pTrailer ) { // Set its position and rotation pTrailer->SetPosition ( trailerPosition.data.vecPosition ); pTrailer->SetRotationDegrees ( trailerRotation.data.vecRotation ); // Is this a new trailer, attached? CVehicle* pCurrentTrailer = pTowedByVehicle->GetTowedVehicle (); if ( pCurrentTrailer != pTrailer ) { // If theres a trailer already attached if ( pCurrentTrailer ) { pTowedByVehicle->SetTowedVehicle ( NULL ); pCurrentTrailer->SetTowedByVehicle ( NULL ); // Tell everyone to detach them CVehicleTrailerPacket AttachPacket ( pTowedByVehicle, pCurrentTrailer, false ); g_pGame->GetPlayerManager ()->BroadcastOnlyJoined ( AttachPacket ); // Execute the attach trailer script function CLuaArguments Arguments; Arguments.PushElement ( pTowedByVehicle ); pCurrentTrailer->CallEvent ( "onTrailerDetach", Arguments ); } // If something else is towing this trailer CVehicle* pCurrentVehicle = pTrailer->GetTowedByVehicle (); if ( pCurrentVehicle ) { pCurrentVehicle->SetTowedVehicle ( NULL ); pTrailer->SetTowedByVehicle ( NULL ); // Tell everyone to detach them CVehicleTrailerPacket AttachPacket ( pCurrentVehicle, pTrailer, false ); g_pGame->GetPlayerManager ()->BroadcastOnlyJoined ( AttachPacket ); // Execute the attach trailer script function CLuaArguments Arguments; Arguments.PushElement ( pCurrentVehicle ); pTrailer->CallEvent ( "onTrailerDetach", Arguments ); } pTowedByVehicle->SetTowedVehicle ( pTrailer ); pTrailer->SetTowedByVehicle ( pTowedByVehicle ); // Execute the attach trailer script function CLuaArguments Arguments; Arguments.PushElement ( pTowedByVehicle ); bool bContinue = pTrailer->CallEvent ( "onTrailerAttach", Arguments ); // Attach or detach trailers depending on the event outcome CVehicleTrailerPacket TrailerPacket ( pTowedByVehicle, pTrailer, bContinue ); g_pGame->GetPlayerManager ()->BroadcastOnlyJoined ( TrailerPacket ); } } else break; pTowedByVehicle = pTrailer; if ( BitStream.ReadBit ( bHasTrailer ) == false ) return false; } // If there was a trailer before CVehicle* pCurrentTrailer = pTowedByVehicle->GetTowedVehicle (); if ( pCurrentTrailer ) { pTowedByVehicle->SetTowedVehicle ( NULL ); pCurrentTrailer->SetTowedByVehicle ( NULL ); // Tell everyone else to detach them CVehicleTrailerPacket AttachPacket ( pTowedByVehicle, pCurrentTrailer, false ); g_pGame->GetPlayerManager ()->BroadcastOnlyJoined ( AttachPacket ); // Execute the detach trailer script function CLuaArguments Arguments; Arguments.PushElement ( pTowedByVehicle ); pCurrentTrailer->CallEvent ( "onTrailerDetach", Arguments ); } } // Player health SPlayerHealthSync health; if ( !BitStream.Read ( &health ) ) return false; float fHealth = health.data.fValue; float fOldHealth = pSourcePlayer->GetHealth (); float fHealthLoss = fOldHealth - fHealth; // Less than last packet's frame? if ( fHealth < fOldHealth && fHealthLoss > 0 ) { // Call the onPlayerDamage event CLuaArguments Arguments; Arguments.PushNil (); Arguments.PushNumber ( false ); Arguments.PushNumber ( false ); Arguments.PushNumber ( fHealthLoss ); pSourcePlayer->CallEvent ( "onPlayerDamage", Arguments ); } pSourcePlayer->SetHealth ( fHealth ); // Armor SPlayerArmorSync armor; if ( !BitStream.Read ( &armor ) ) return false; float fArmor = armor.data.fValue; float fOldArmor = pSourcePlayer->GetArmor (); float fArmorLoss = fOldArmor - fArmor; // Less than last packet's frame? if ( fArmor < fOldArmor && fArmorLoss > 0 ) { // Call the onPlayerDamage event CLuaArguments Arguments; Arguments.PushNil (); Arguments.PushNumber ( false ); Arguments.PushNumber ( false ); Arguments.PushNumber ( fArmorLoss ); pSourcePlayer->CallEvent ( "onPlayerDamage", Arguments ); } pSourcePlayer->SetArmor ( fArmor ); // Flags SVehiclePuresyncFlags flags; if ( !BitStream.Read ( &flags ) ) return false; pSourcePlayer->SetWearingGoggles ( flags.data.bIsWearingGoggles ); pSourcePlayer->SetDoingGangDriveby ( flags.data.bIsDoingGangDriveby ); // Weapon sync if ( flags.data.bHasAWeapon ) { SWeaponSlotSync slot; if ( !BitStream.Read ( &slot ) ) return false; pSourcePlayer->SetWeaponSlot ( slot.data.uiSlot ); if ( flags.data.bIsDoingGangDriveby && CWeaponNames::DoesSlotHaveAmmo ( slot.data.uiSlot ) ) { // Read the ammo states SWeaponAmmoSync ammo ( pSourcePlayer->GetWeaponType (), false, true ); if ( !BitStream.Read ( &ammo ) ) return false; pSourcePlayer->SetWeaponAmmoInClip ( ammo.data.usAmmoInClip ); // Read aim data SWeaponAimSync aim ( pSourcePlayer->GetWeaponRange (), true ); if ( !BitStream.Read ( &aim ) ) return false; pSourcePlayer->SetAimDirection ( aim.data.fArm ); pSourcePlayer->SetSniperSourceVector ( aim.data.vecOrigin ); pSourcePlayer->SetTargettingVector ( aim.data.vecTarget ); // Read the driveby direction SDrivebyDirectionSync driveby; if ( !BitStream.Read ( &driveby ) ) return false; pSourcePlayer->SetDriveByDirection ( driveby.data.ucDirection ); } } else pSourcePlayer->SetWeaponSlot ( 0 ); // Vehicle specific data if he's the driver if ( uiSeat == 0 ) { ReadVehicleSpecific ( pVehicle, BitStream ); // Set vehicle specific stuff if he's the driver pVehicle->SetSirenActive ( flags.data.bIsSirenOrAlarmActive ); pVehicle->SetSmokeTrailEnabled ( flags.data.bIsSmokeTrailEnabled ); pVehicle->SetLandingGearDown ( flags.data.bIsLandingGearDown ); pVehicle->SetOnGround ( flags.data.bIsOnGround ); pVehicle->SetInWater ( flags.data.bIsInWater ); pVehicle->SetDerailed ( flags.data.bIsDerailed ); pVehicle->SetHeliSearchLightVisible ( flags.data.bIsHeliSearchLightVisible ); } // Read the vehicle_look_left and vehicle_look_right control states // if it's an aircraft. if ( flags.data.bIsAircraft ) { ControllerState.LeftShoulder2 = BitStream.ReadBit () * 255; ControllerState.RightShoulder2 = BitStream.ReadBit () * 255; } pSourcePlayer->GetPad ()->NewControllerState ( ControllerState ); // Success return true; } } return false; }
void CMapManager::SendMapInformation ( CPlayer& Player ) { // Start an entity list packet CEntityAddPacket EntityPacket; // Add the dummys to the packet list < CDummy* > ::const_iterator iterDummys = m_pGroups->IterBegin (); for ( ; iterDummys != m_pGroups->IterEnd () ; iterDummys++ ) { CDummy* pDummy = *iterDummys; if ( pDummy != m_pRootElement ) { EntityPacket.Add ( pDummy ); } } // Add the objects to the packet CObjectListType::const_iterator iterObjects = m_pObjectManager->IterBegin (); for ( ; iterObjects != m_pObjectManager->IterEnd (); iterObjects++ ) { EntityPacket.Add ( *iterObjects ); } // Add the pickups to the packet list < CPickup* > ::const_iterator iterPickups = m_pPickupManager->IterBegin (); for ( ; iterPickups != m_pPickupManager->IterEnd (); iterPickups++ ) { EntityPacket.Add ( *iterPickups ); } // Add the vehicles to the packet list < CVehicle* > ::const_iterator iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { EntityPacket.Add ( *iterVehicles ); } // Add the teams to the packet list < CTeam* > ::const_iterator iterTeams = m_pTeamManager->IterBegin (); for ( ; iterTeams != m_pTeamManager->IterEnd (); iterTeams++ ) { EntityPacket.Add ( *iterTeams ); } // Add the peds to the packet list < CPed* > ::const_iterator iterPeds = m_pPedManager->IterBegin (); for ( ; iterPeds != m_pPedManager->IterEnd (); iterPeds++ ) { EntityPacket.Add ( *iterPeds ); } // Add the colshapes to the packet vector < CColShape* > ::const_iterator iterColShapes = m_pColManager->IterBegin (); for ( ; iterColShapes != m_pColManager->IterEnd (); iterColShapes++ ) { CColShape * pColShape = *iterColShapes; if ( !pColShape->IsPartnered () ) { EntityPacket.Add ( *iterColShapes ); } } // Add the water polys to the packet CWaterManager* pWaterManager = g_pGame->GetWaterManager (); list < CWater* > ::const_iterator iterWater = pWaterManager->IterBegin (); for ( ; iterWater != pWaterManager->IterEnd (); iterWater++ ) { CWater* pWater = *iterWater; EntityPacket.Add ( pWater ); } // Send it Player.Send ( EntityPacket ); // Send per-player entities SendPerPlayerEntities ( Player ); // Send the trailer attachments CVehicle* pVehicle; CVehicle* pTowedVehicle; iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { pVehicle = *iterVehicles; pTowedVehicle = pVehicle->GetTowedVehicle ( ); if ( pTowedVehicle ) { CVehicleTrailerPacket AttachPacket ( pVehicle, pTowedVehicle, true ); Player.Send ( AttachPacket ); } } }
int cheat_panic ( void ) { traceLastFunc( "cheat_panic()" ); static int pstate_map = 0, // m0d's map pstate_d3dtext_hud = 0, // hud bar pstate_actor_hp_nSP = 0, // "Extra actor invincibility" patch (invulnerable single player enemies) pstate_actor_hp_SP = 0, // "Extra actor invincibility2" patch (no problems in SP) pstate_vehicle_hp = 0, // vehicle hp patch pstate_generic_menu = 0, // m0d's menu pstate_infnos = 0, // infinite NOS pstate_ini[INI_PATCHES_MAX], pstate_dummy_aligner; // this should all be a structure, static = DOING IT WRONG int i; // sa-mp related static int pstate_chat = 0, // chat pstate_deathlist = 0; // deathlist if ( KEY_PRESSED(set.key_panic) ) { // toggle panic cheat_state->_generic.cheat_panic_enabled ^= 1; if ( cheat_state->_generic.cheat_panic_enabled ) { struct actor_info *actor_info = actor_info_get( ACTOR_SELF, ACTOR_ALIVE ); if ( actor_info ) { actor_info->flags &= ~ACTOR_FLAGS_INVULNERABLE; actor_info->weapon_slot = 0; } // remove infinite NOS pstate_infnos = cheat_state->vehicle.infNOS_toggle_on; cheat_state->vehicle.infNOS_toggle_on = false; patcher_remove( &patch_vehicle_inf_NOS ); if ( pPedSelf->GetVehicle() ) { CVehicle *pVehicleSelf = pPedSelf->GetVehicle(); CVehicle *pVehicleTemp = NULL; for ( pVehicleTemp = pVehicleSelf; pVehicleTemp != NULL; pVehicleTemp = pVehicleTemp->GetTowedVehicle() ) { pVehicleTemp->SetGravity( &CVector(0.0, 0.0, -1.0) ); pVehicleTemp->SetCanBeDamaged( true ); if ( !set.trailer_support ) break; } // remove inf NOS if ( pstate_infnos ) { pVehicleSelf->RemoveVehicleUpgrade( 1010 ); //pVehicleSelf->AddVehicleUpgrade( 1010 ); } // reset overrideLights, pstate not needed, will be reactivated on demand if ( set.enable_car_lights_at_day_time ) pVehicleSelf->SetOverrideLights( 0 ); } // hud bar, this should probably become a cheat_state pstate_d3dtext_hud = set.d3dtext_hud; set.d3dtext_hud = 0; // m0d's map pstate_map = cheat_state->_generic.map; cheat_state->_generic.map = 0; // m0d's menu pstate_generic_menu = cheat_state->_generic.menu; cheat_state->_generic.menu = 0; // remove "Extra actor invincibility" patch pstate_actor_hp_nSP = patch_actor_hp_extraInv.installed; patcher_remove( &patch_actor_hp_extraInv ); pstate_actor_hp_SP = patch_actor_hp.installed; patcher_remove( &patch_actor_hp ); // remove vehicle hp patch pstate_vehicle_hp = patch_vehicle_hp.installed; patcher_remove( &patch_vehicle_hp ); // just call with null vehicle info to disable cheat_handle_vehicle_fly( NULL, 0.0f ); for ( i = 0; i < INI_PATCHES_MAX; i++ ) { // added to not remove volatile patches if ( !set.patch[i].has_volatile ) { pstate_ini[i] = set.patch[i].installed; patcher_remove( &set.patch[i] ); } } // turn off kill & chat if ( g_DeathList != NULL ) { pstate_deathlist = g_DeathList->iEnabled; g_DeathList->iEnabled = 1; } if ( g_Chat != NULL ) { pstate_chat = g_Chat->iChatWindowMode; g_Chat->iChatWindowMode = 2; } } else { // restore infinite NOS if ( pstate_infnos ) { cheat_state->vehicle.infNOS_toggle_on = true; patcher_install( &patch_vehicle_inf_NOS ); } // vehicle stuff CPed *pPedSelf = pPools->GetPedFromRef( CPOOLS_PED_SELF_REF ); if ( pPedSelf->GetVehicle() ) { CVehicle *pVehicleSelf = pPedSelf->GetVehicle(); // restore inf NOS if ( pstate_infnos ) { pVehicleSelf->AddVehicleUpgrade( 1010 ); } } // restore "Extra actor invincibility" patch if ( pstate_actor_hp_nSP ) patcher_install( &patch_actor_hp_extraInv ); if ( pstate_actor_hp_SP ) patcher_install( &patch_actor_hp ); // restore vehicle hp patch if ( pstate_vehicle_hp ) patcher_install( &patch_vehicle_hp ); // restore some cheat_states set.d3dtext_hud = pstate_d3dtext_hud; cheat_state->_generic.map = pstate_map; cheat_state->_generic.menu = pstate_generic_menu; // restore patches for ( i = 0; i < INI_PATCHES_MAX; i++ ) { if ( pstate_ini[i] ) patcher_install( &set.patch[i] ); } // restore kill & chat if ( g_DeathList != NULL ) { g_DeathList->iEnabled = pstate_deathlist; } if ( g_Chat != NULL ) { g_Chat->iChatWindowMode = pstate_chat; } // clear cheat state text cheat_state_text( NULL ); } } return cheat_state->_generic.cheat_panic_enabled; }
void CMapManager::SendMapInformation ( CPlayer& Player ) { CTimeUsMarker < 20 > marker; marker.Set ( "Start" ); // Start an entity list packet CEntityAddPacket EntityPacket; // Add the dummys to the packet list < CDummy* > ::const_iterator iterDummys = m_pGroups->IterBegin (); for ( ; iterDummys != m_pGroups->IterEnd () ; iterDummys++ ) { CDummy* pDummy = *iterDummys; if ( pDummy != m_pRootElement ) { EntityPacket.Add ( pDummy ); } } marker.Set ( "Dummys" ); // Add the objects to the packet CObjectListType::const_iterator iterObjects = m_pObjectManager->IterBegin (); for ( ; iterObjects != m_pObjectManager->IterEnd (); iterObjects++ ) { EntityPacket.Add ( *iterObjects ); } marker.Set ( "Objects" ); // Add the pickups to the packet list < CPickup* > ::const_iterator iterPickups = m_pPickupManager->IterBegin (); for ( ; iterPickups != m_pPickupManager->IterEnd (); iterPickups++ ) { EntityPacket.Add ( *iterPickups ); } marker.Set ( "Pickups" ); // Add the vehicles to the packet list < CVehicle* > ::const_iterator iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { EntityPacket.Add ( *iterVehicles ); } marker.Set ( "Vehicles" ); // Add the teams to the packet list < CTeam* > ::const_iterator iterTeams = m_pTeamManager->IterBegin (); for ( ; iterTeams != m_pTeamManager->IterEnd (); iterTeams++ ) { EntityPacket.Add ( *iterTeams ); } marker.Set ( "Teams" ); // Add the peds to the packet list < CPed* > ::const_iterator iterPeds = m_pPedManager->IterBegin (); for ( ; iterPeds != m_pPedManager->IterEnd (); iterPeds++ ) { EntityPacket.Add ( *iterPeds ); } marker.Set ( "Peds" ); // Add the colshapes to the packet vector < CColShape* > ::const_iterator iterColShapes = m_pColManager->IterBegin (); for ( ; iterColShapes != m_pColManager->IterEnd (); iterColShapes++ ) { CColShape * pColShape = *iterColShapes; if ( !pColShape->IsPartnered () ) { EntityPacket.Add ( *iterColShapes ); } } marker.Set ( "ColShapes" ); // Add the water polys to the packet CWaterManager* pWaterManager = g_pGame->GetWaterManager (); list < CWater* > ::const_iterator iterWater = pWaterManager->IterBegin (); for ( ; iterWater != pWaterManager->IterEnd (); iterWater++ ) { CWater* pWater = *iterWater; EntityPacket.Add ( pWater ); } marker.Set ( "Water" ); // Send it Player.Send ( EntityPacket ); marker.Set ( "SendEntityPacket" ); // Send per-player entities SendPerPlayerEntities ( Player ); marker.Set ( "SendPerPlayerEntities" ); // Send the trailer attachments CVehicle* pVehicle; CVehicle* pTowedVehicle; iterVehicles = m_pVehicleManager->IterBegin (); for ( ; iterVehicles != m_pVehicleManager->IterEnd (); iterVehicles++ ) { pVehicle = *iterVehicles; pTowedVehicle = pVehicle->GetTowedVehicle ( ); if ( pTowedVehicle ) { CVehicleTrailerPacket AttachPacket ( pVehicle, pTowedVehicle, true ); Player.Send ( AttachPacket ); } } marker.Set ( "SendAttachPackets" ); // Add debug info if wanted if ( CPerfStatDebugInfo::GetSingleton ()->IsActive ( "SendMapInformation" ) ) CPerfStatDebugInfo::GetSingleton ()->AddLine ( "SendMapInformation", marker.GetString () ); }