public static Vector3 ConecastPedsAndVehicles(Vector2 screenCoords, out Entity hitEntity) { var radius = 1; var numPoints = 5; var angleStep = Math.PI * 0.2; var distStep = 0.05 / numPoints; var resultCoord = new Vector3(); hitEntity = null; for (var i = 0; i < numPoints; i++) { var angle = i * angleStep; var dist = i * distStep; var offsetX = Math.Sin(angle) * dist; var offsetY = Math.Cos(angle) * dist; var coord = screenCoords + new Vector2((float)offsetX, (float)offsetY); Entity entity; var hitcoord = RaycastEverything(coord, out entity, radius); if (i == 0) { resultCoord = hitcoord; } if ((entity != null) && ((ScriptHookExtensions.IsEntityAPed(entity) && entity.Handle != Game.Player.Character.Handle) || (ScriptHookExtensions.IsEntityAVehicle(entity) && !(Game.Player.Character.IsInVehicle() && entity.Handle == Game.Player.Character.CurrentVehicle.Handle)))) { hitEntity = entity; resultCoord = hitcoord; break; } } return(resultCoord); }
public void FindGazeProjection( Vector2 gazePoint, Vector2 joystickDelta, out Vector3 shootCoord, out Vector3 shootCoordSnap, out Vector3 shootMissileCoord, out Ped ped, out Entity missileTarget ) { Entity target = null; var w = (float)(1 - _settings.Responsiveness * 0.9); _filteredGazePoint = new Vector2(_filteredGazePoint.X + (gazePoint.X - _filteredGazePoint.X) * w, _filteredGazePoint.Y + (gazePoint.Y - _filteredGazePoint.Y) * w); var filteredGazePointPlusJoystickDelta = _filteredGazePoint + joystickDelta; var unfilteredGazePointPlusJoystickDelta = gazePoint; Entity unfilteredEntity; Entity filteredEntity; var hitUnfiltered = Geometry.ConecastPedsAndVehicles(unfilteredGazePointPlusJoystickDelta, out unfilteredEntity); shootMissileCoord = hitUnfiltered; shootCoordSnap = hitUnfiltered; var hitFiltered = Geometry.RaycastEverything(filteredGazePointPlusJoystickDelta, out filteredEntity, 0); shootCoord = hitFiltered; if (unfilteredEntity != null && ScriptHookExtensions.IsEntityAPed(unfilteredEntity) && unfilteredEntity.IsAlive) { ped = unfilteredEntity as Ped; } else { //if (_frameSkip == 0) //{ // ped = Geometry.SearchPed(unfilteredGazePointPlusJoystickDelta); //Too slow :( // _lastPed = ped; //} //else { ped = _lastPed; } } if ((ped != null) && (ped.Handle != Game.Player.Character.Handle)) { shootCoordSnap = ped.GetBoneCoord(Bone.SKEL_L_Clavicle); target = ped; if (_settings.SnapAtTargetsEnabled) { shootCoord = shootCoordSnap; } } else { Vehicle vehicle; if (unfilteredEntity != null && ScriptHookExtensions.IsEntityAVehicle(unfilteredEntity) && unfilteredEntity.IsAlive) { vehicle = unfilteredEntity as Vehicle; } else { //if (_frameSkip == 0) //{ // vehicle = Geometry.SearchVehicle(unfilteredGazePointPlusJoystickDelta); // Too slow :( // _lastVehicle = vehicle; //} //else { vehicle = _lastVehicle; } } if (vehicle != null && !((Game.Player.Character.IsInVehicle()) && (vehicle.Handle == Game.Player.Character.CurrentVehicle.Handle))) { shootCoordSnap = vehicle.Position + vehicle.Velocity * 0.06f; shootMissileCoord = shootCoordSnap; target = vehicle; } } ProcessMissileLock(target); missileTarget = _missileTarget; _frameSkip++; if (_frameSkip > _maxSkipFrames) { _frameSkip = 0; } }