void CClientWeapon::GetDirection ( CVector & vecDirection ) { CVector vecRotation; GetRotationRadians ( vecRotation ); vecDirection = CVector ( 1, 0, 0 ); RotateVector ( vecDirection, vecRotation ); }
void CClientWeapon::SetDirection ( CVector & vecDirection ) { CVector vecRotation; GetRotationRadians ( vecRotation ); vecRotation.fZ = atan2 ( vecDirection.fY, vecDirection.fX ); CVector2D vecTemp ( vecDirection.fX, vecDirection.fY ); float length = vecTemp.Length (); vecTemp = CVector2D ( length, vecDirection.fZ ); vecTemp.Normalize (); vecRotation.fY = atan2 ( vecTemp.fX, vecTemp.fY )/* - ConvertDegreesToRadians ( 90 )*/; SetRotationRadians ( vecRotation ); }
void CClientObject::SetPosition ( const CVector& vecPosition ) { // Move the object if ( m_pObject ) { CVector vecRot; GetRotationRadians ( vecRot ); m_pObject->Teleport ( vecPosition.fX, vecPosition.fY, vecPosition.fZ ); #ifndef MTA_BUILDINGS m_pObject->ProcessCollision (); #endif m_pObject->SetupLighting (); SetRotationRadians ( vecRot ); } if ( m_vecPosition != vecPosition ) { // Store the position in our datastruct m_vecPosition = vecPosition; // Update our streaming position UpdateStreamPosition ( vecPosition ); } }
bool CPlayer::HandleEvent( UINT eventId, void* data, UINT data_sz ) { static const EMovementFlagType movementMap[] = { MOVE_FORWARD_FLAG, MOVE_BACKWARD_FLAG, MOVE_LEFT_FLAG, MOVE_RIGHT_FLAG, }; switch( eventId ) { case EVT_UPDATE: assert( data_sz == sizeof(float) ); assert( data != NULL ); Update( *(float*)data ); break; case EVT_INIT: assert( data_sz == sizeof(CMeshManager*) ); assert( data != NULL ); Setup( *reinterpret_cast<CMeshManager*>(data) ); break; case EVT_GETFACINGVEC: { assert( data_sz == sizeof(GetFacingEventArgType) ); assert( data != NULL ); *(GetFacingEventArgType*)data = GetRotationRadians(); break; } case EVT_SETFACINGVEC: { assert( data_sz == sizeof(SetFacingEventArgType) ); assert( data != NULL ); SetFacingEventArgType* arg = (SetFacingEventArgType*)data; // SetXRotationRadians(arg->x); SetYRotationRadians(arg->y); // SetZRotationRadians(arg->z); break; } case EVT_MOVECMD: { assert( data_sz == sizeof(MovementCommandType) ); assert( data != NULL ); MovementCommandType* args = (MovementCommandType*)data; if(args->clearFlag) m_movementState &= ~movementMap[args->state]; else m_movementState |= movementMap[args->state]; break; } case EVT_GETPOSITIONVEC: assert( data_sz == sizeof(GetPosEventArgType) ); assert( data != NULL ); *(GetPosEventArgType*)data = GetPosition3D(); break; case EVT_CONTROL_LOST_FOCUS: case EVT_CONTROL_GAIN_FOCUS: m_movementState &= ~MOVE_FLAG_MASK; break; case EVT_ATTACH_CAMERA: assert( data_sz == sizeof(CCamera*) ); assert( data != NULL ); reinterpret_cast<CCamera*>(data)->SetLocalPosition(Vector_3(-5.0f, 12.0f, -20.0f)); break; default: assert(false); break; } return true; }
void CClientObject::GetOrientation ( CVector& vecPosition, CVector& vecRotationRadians ) { GetPosition ( vecPosition ); GetRotationRadians ( vecRotationRadians ); }
void CClientObject::GetRotationDegrees ( CVector& vecRotation ) const { GetRotationRadians ( vecRotation ); ConvertRadiansToDegrees ( vecRotation ); }
void CClientWeapon::Fire ( void ) { if ( !m_pWeapon || !m_pObject ) return; switch ( m_Type ) { case WEAPONTYPE_PISTOL: case WEAPONTYPE_PISTOL_SILENCED: case WEAPONTYPE_DESERT_EAGLE: #ifdef SHOTGUN_TEST case WEAPONTYPE_SHOTGUN: case WEAPONTYPE_SAWNOFF_SHOTGUN: case WEAPONTYPE_SPAS12_SHOTGUN: #endif case WEAPONTYPE_MICRO_UZI: case WEAPONTYPE_MP5: case WEAPONTYPE_AK47: case WEAPONTYPE_M4: case WEAPONTYPE_TEC9: case WEAPONTYPE_COUNTRYRIFLE: case WEAPONTYPE_SNIPERRIFLE: case WEAPONTYPE_MINIGUN: { CVector vecOrigin, vecRotation; GetPosition ( vecOrigin ); if ( m_pAttachedToEntity ) { GetRotationRadians ( vecRotation ); } else { GetRotationRadians ( vecRotation ); vecRotation = -vecRotation; } CVector vecTarget; float fDistance = m_pWeaponInfo->GetWeaponRange (); if ( m_targetType == TARGET_TYPE_ENTITY ) { if ( m_pTarget ) { if ( m_pTarget->GetType ( ) == CCLIENTPED || m_pTarget->GetType ( ) == CCLIENTPLAYER ) { CClientPed * pPed = (CClientPed *) (CClientEntity *) m_pTarget; pPed->GetBonePosition( m_targetBone, vecTarget ); } else { if ( m_pTarget->GetType() == CCLIENTVEHICLE ) { if ( m_itargetWheel <= MAX_WHEELS ) { CClientVehicle * pTarget = (CClientVehicle*)(CClientEntity *)m_pTarget; vecTarget = pTarget->GetGameVehicle()->GetWheelPosition ( (eWheels)m_itargetWheel ); } else m_pTarget->GetPosition( vecTarget ); } else m_pTarget->GetPosition( vecTarget ); } if ( m_weaponConfig.bShootIfTargetOutOfRange == false && (vecOrigin - vecTarget).Length() >= fDistance ) { return; } } else { ResetWeaponTarget ( ); } } else if ( m_targetType == TARGET_TYPE_VECTOR ) { vecTarget = m_vecTarget; if ( m_weaponConfig.bShootIfTargetOutOfRange == false && (vecOrigin - vecTarget).Length() >= fDistance ) { return; } } else { CVector vecFireOffset = *m_pWeaponInfo->GetFireOffset (); RotateVector ( vecFireOffset, vecRotation ); #ifndef SHOTGUN_TEST vecOrigin += vecFireOffset; #endif CVector vecDirection ( 1, 0, 0 ); vecDirection *= fDistance; RotateVector ( vecDirection, vecRotation ); vecTarget = vecOrigin + vecDirection; } // Save short sDamage = m_pWeaponInfo->GetDamagePerHit ( ); float fAccuracy = m_pWeaponInfo->GetAccuracy ( ); float fTargetRange = m_pWeaponInfo->GetTargetRange ( ); float fRange = m_pWeaponInfo->GetWeaponRange ( ); // Set new m_pWeaponInfo->SetDamagePerHit ( m_pWeaponStat->GetDamagePerHit ( ) ); m_pWeaponInfo->SetAccuracy ( m_pWeaponStat->GetAccuracy ( ) ); m_pWeaponInfo->SetTargetRange ( m_pWeaponStat->GetTargetRange ( ) ); m_pWeaponInfo->SetWeaponRange ( m_pWeaponStat->GetWeaponRange ( ) ); // Begin our lag compensation CPlayerPed* pOwnerPed = NULL; if ( m_pOwner && !m_pTarget && g_pClientGame->GetPlayerManager()->Exists(m_pOwner) ) // No need for compensation if we're hitting a target directly { pOwnerPed = m_pOwner->GetGamePlayer(); //if ( g_pGame->m_pPreWeaponFireHandler && pOwnerPed ) //g_pGame->m_pPreWeaponFireHandler ( pOwnerPed, false ); } #ifdef SHOTGUN_TEST CVector vecTemp; CVector vecFireOffset = *m_pWeaponInfo->GetFireOffset (); RotateVector ( vecFireOffset, vecRotation ); vecTemp = vecFireOffset; vecTemp += vecOrigin; #ifdef MARKER_DEBUG // Process m_pMarker->SetPosition ( vecOrigin ); #endif CVector vecTemp2; GetRotationDegrees(vecTemp2); vecTemp2.fZ -= 84.6f; SetRotationDegrees(vecTemp2); FireInstantHit ( vecOrigin, vecTarget-vecOrigin, vecTemp ); vecTemp2.fZ += 84.6f; SetRotationDegrees(vecTemp2); #else FireInstantHit ( vecOrigin, vecTarget ); #endif // Restore m_pWeaponInfo->SetDamagePerHit ( sDamage ); m_pWeaponInfo->SetAccuracy ( fAccuracy ); m_pWeaponInfo->SetTargetRange ( fTargetRange ); m_pWeaponInfo->SetWeaponRange ( fRange ); // End our lag compensation //if ( g_pGame->m_pPostWeaponFireHandler && pOwnerPed ) //g_pGame->m_pPostWeaponFireHandler (); m_nAmmoInClip--; m_fireTimer.Reset(); break; } default: break; } }