public static bool IsOccluded(Entity entity, Vector3 target3D) { const float raycastToDist = 200.0f; const float raycastFromDist = 1f; var mView = Util.GetCameraMatrix(); var source3D = ViewMatrixToCameraPosition(mView); Entity ignoreEntity = Game.Player.Character; if (Game.Player.Character.IsInVehicle()) { ignoreEntity = Game.Player.Character.CurrentVehicle; } var dir = (target3D - source3D); dir.Normalize(); var raycastResults = World.Raycast(source3D + dir * raycastFromDist, source3D + dir * raycastToDist, (IntersectOptions)(1 | 16 | 256 | 2 | 4 | 8) // | peds + vehicles , ignoreEntity); if (raycastResults.DitHitEntity) { return(raycastResults.HitEntity.Handle != entity.Handle); } return(true); }
public static Vector3 ConecastPedsAndVehicles(Vector2 screenCoords, out Entity hitEntity) { var numPoints = 5; var angleStep = Math.PI * 0.2; var distStep = 0.05 / 5; 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, i!=0); 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 static Quaternion ToQuaternion(this Vector3 vect) { vect = new Vector3() { X = vect.X.Denormalize() * -1, Y = vect.Y.Denormalize() - 180f, Z = vect.Z.Denormalize() - 180f, }; vect = vect.ToRadians(); float rollOver2 = vect.Z * 0.5f; float sinRollOver2 = (float)Math.Sin((double)rollOver2); float cosRollOver2 = (float)Math.Cos((double)rollOver2); float pitchOver2 = vect.Y * 0.5f; float sinPitchOver2 = (float)Math.Sin((double)pitchOver2); float cosPitchOver2 = (float)Math.Cos((double)pitchOver2); float yawOver2 = vect.X * 0.5f; // pitch float sinYawOver2 = (float)Math.Sin((double)yawOver2); float cosYawOver2 = (float)Math.Cos((double)yawOver2); Quaternion result = new Quaternion() { X = cosYawOver2 * cosPitchOver2 * cosRollOver2 + sinYawOver2 * sinPitchOver2 * sinRollOver2, Y = cosYawOver2 * cosPitchOver2 * sinRollOver2 - sinYawOver2 * sinPitchOver2 * cosRollOver2, Z = cosYawOver2 * sinPitchOver2 * cosRollOver2 + sinYawOver2 * cosPitchOver2 * sinRollOver2, W = sinYawOver2 * cosPitchOver2 * cosRollOver2 - cosYawOver2 * sinPitchOver2 * sinRollOver2 }; return(result); }
internal void Pulse() { if (!HasFinished) { long currentTime = Util.Util.TickCount; float alpha = Util.Util.Unlerp(NetInterpolation.StartTime, currentTime, NetInterpolation.FinishTime); alpha = Util.Util.Clamp(0f, alpha, 1.5f); Vector3 comp = Util.Util.Lerp(new Vector3(), alpha, NetInterpolation.vecError); if (alpha == 1.5f) { NetInterpolation.FinishTime = 0; HasFinished = true; } var newPos = _startPos + comp; _entity.Velocity = _velocity.ToVector() + 3 * (newPos - _entity.Position); _entity.Quaternion = GTA.Math.Quaternion.Slerp(_startRot.ToQuaternion(), _rotation.ToQuaternion(), Math.Min(1.5f, alpha)); } }
private static Vector3 ViewMatrixToCameraPosition(Matrix mView) { mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var n1 = new Vector3(vForward.X, vForward.Y, vForward.Z); var n2 = new Vector3(vRight.X, vRight.Y, vRight.Z); var n3 = new Vector3(vUpward.X, vUpward.Y, vUpward.Z); var d1 = vForward.W; var d2 = vRight.W; var d3 = vUpward.W; var n2n3 = Vector3.Cross(n2, n3); var n3n1 = Vector3.Cross(n3, n1); var n1n2 = Vector3.Cross(n1, n2); var top = (n2n3 * d1) + (n3n1 * d2) + (n1n2 * d3); var denom = Vector3.Dot(n1, n2n3); var epsilon = 0.0000001; if (Math.Abs(denom) < epsilon) { return(new Vector3()); } return(top / -denom); }
public static bool WorldToScreenRel(Vector3 entityPosition, out Vector2 screenCoords) { var mView = Util.GetCameraMatrix(); mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var result = new SharpDX.Vector3(0, 0, 0); result.Z = (vForward.X * entityPosition.X) + (vForward.Y * entityPosition.Y) + (vForward.Z * entityPosition.Z) + vForward.W; result.X = (vRight.X * entityPosition.X) + (vRight.Y * entityPosition.Y) + (vRight.Z * entityPosition.Z) + vRight.W; result.Y = (vUpward.X * entityPosition.X) + (vUpward.Y * entityPosition.Y) + (vUpward.Z * entityPosition.Z) + vUpward.W; if (result.Z < 0.001f) { screenCoords = new Vector2(0, 0); return(false); } float invw = 1.0f / result.Z; result.X *= invw; result.Y *= invw; screenCoords = new Vector2(result.X, -result.Y); return(true); }
public static void ScreenRelToWorld(Vector2 screenCoordsRel, out Vector3 camPoint, out Vector3 farPoint) { var mView = CameraHelper.GetCameraMatrix(); camPoint = ViewMatrixToCameraPosition(mView); farPoint = ScreenRelToWorld(mView, screenCoordsRel); }
public static void SetDealerLocation(GTA.Math.Vector3 Position, float Rotation, PedHash pedHash) { Dealer Dealer = new Dealer(Position.X, Position.Y, Position.Z, Rotation, pedHash.ToString()); DealerDB.AddDealer(Dealer); UIHelper.ShowNotification("Added new dealer location"); }
public Vehicle CreateVehicle(Model model, Vector3 position, Vector3 rotation, int netHash) { if (model == null || !model.IsValid || !model.IsInCdImage) { return(null); } LogManager.DebugLog("CREATING VEHICLE FOR NETHASH " + netHash); model.Request(10000); LogManager.DebugLog("LOAD COMPLETE. AVAILABLE: " + model.IsLoaded); var veh = World.CreateVehicle(model, position, rotation.Z); LogManager.DebugLog("VEHICLE CREATED. NULL? " + (veh == null)); veh.Rotation = rotation; veh.IsInvincible = true; LogManager.DebugLog("PROPERTIES SET"); lock (HandleMap) { if (!HandleMap.Reverse.ContainsKey(veh.Handle)) { HandleMap.Reverse.Add(veh.Handle, netHash); } } LogManager.DebugLog("DISCARDING MODEL"); model.MarkAsNoLongerNeeded(); LogManager.DebugLog("CREATEVEHICLE COMPLETE"); return(veh); }
public Blip CreateBlip(Vector3 pos, int netHandle) { var blip = World.CreateBlip(pos); lock (HandleMap) HandleMap.Add(netHandle, blip.Handle); lock (Blips) Blips.Add(blip.Handle); return(blip); }
public static GTA.Math.Vector3 RotationToDirection(GTA.Math.Vector3 rot) { float retz = rot.Z * 0.0174532924F; // Degree to radian float retx = rot.X * 0.0174532924F; double absx = Math.Abs(Math.Cos(retx)); return(new GTA.Math.Vector3((float)(-Math.Sin(retz) * absx), (float)(Math.Cos(retz) * absx), (float)(Math.Sin(retx)))); }
public static Vector3 LerpVector(Vector3 start, Vector3 end, float speed) { return(new Vector3() { X = start.X + (end.X - start.X) * speed, Y = start.Y + (end.Y - start.Y) * speed, Z = start.Z + (end.Z - start.Z) * speed, }); }
public static Vector3 ToRadians(this Vector3 i) { return(new Vector3() { X = ToRadians(i.X), Y = ToRadians(i.Y), Z = ToRadians(i.Z), }); }
public static Vector3 LinearVectorLerp(Vector3 start, Vector3 end, long currentTime, long duration) { return(new Vector3() { X = LinearFloatLerp(start.X, end.X, currentTime, duration), Y = LinearFloatLerp(start.Y, end.Y, currentTime, duration), Z = LinearFloatLerp(start.Z, end.Z, currentTime, duration), }); }
public bool CheckVisible() { Vector3 cameraPos = World.RenderingCamera.Position; Vector3 sourcePos = new Vector3(cameraPos.X, cameraPos.Y, cameraPos.Z - 0.5f) + World.RenderingCamera.ForwardVector.Normalized; Vector3 targetPos = RoIEntity.Position; var res = World.Raycast(sourcePos, targetPos, IntersectFlags.Everything, null); return(!res.DidHit); }
public static void Spawn() { //Player Ped player = Game.Player.Character; //Model Spawn location GTA.Math.Vector3 spawnlocat = player.Position + (player.ForwardVector * 5); //Model name, in this case it's the random event Bride //string model_namespawn = "ig_bride"; //Bride ped 1633872967 ig_bride //Spawn the model Ped ped = GTA.World.CreatePed(PedHash.Stripper02SFY, spawnlocat); //Ped ped = GTA.World.CreatePed(model_namespawn, spawnlocat); //Set ped properties ped.Armor = 50000; ped.Health = 50000; ped.MaxHealth = 50000; ped.IsEnemy = false; ped.IsPriorityTargetForEnemies = true; ped.RelationshipGroup = (int)Relationship.Companion; ped.CanBeShotInVehicle = true; ped.AlwaysDiesOnLowHealth = false; //Follow Player //Call Native Function int playerG = GTA.Native.Function.Call <int>(GTA.Native.Hash.GET_PED_GROUP_INDEX, Game.Player.Character.Handle); GTA.Native.Function.Call(GTA.Native.Hash.SET_PED_AS_GROUP_MEMBER, ped.Handle, playerG); //Give a Weapon to ped //Rifle ped.Weapons.Give(WeaponHash.AdvancedRifle, 500, false, true); //Colt ped.Weapons.Give(WeaponHash.APPistol, 500, false, true); //Parachute ped.Weapons.Give(WeaponHash.Parachute, 1, true, true); //KnifeHouse ped.Weapons.Give(WeaponHash.Knife, 1, false, true); //Set ped into vehicle if (player.IsInVehicle()) { ped.SetIntoVehicle(Game.Player.Character.CurrentVehicle, VehicleSeat.Any); } UI.Notify("Killers2 Spawn..."); }
public GTADetection(Entity e, DetectionType type, float maxRange) { Type = type; var ppos = World.RenderingCamera.Position; Distance = ppos.DistanceTo(e.Position); Handle = e.Handle; //Bones2D = new Dictionary<string, GTAVector2>(); Bones3D = new Dictionary <string, GTABone>(); //(var gmin, var gmax) = e.Model.Dimensions; Bbox3d = new GTABoundingBox(e); Bbox2d = Bbox3d.To2D(); //System.IO.File.AppendAllText("F:/datasets/GTA_V_anomaly/log.txt", "------------" + Handle.ToString() + "------------\n"); RaycastResult res; Entity hitEntity; GTABone gtaBone; foreach (EntityBone bone in e.Bones) { try { Vector3 bonePosition = bone.Position; float boneDistance = ppos.DistanceTo(bonePosition); // Raycasting seems to be bugged where some people have no collision? Disabled this for now... //if (boneDistance < maxRange) //{ // res = World.Raycast(ppos, bonePosition, (IntersectFlags)287, Game.Player.Character); // hitEntity = res.HitEntity; // int isVisible = 0; // if (hitEntity == null) // { // isVisible = -1; // } // else if (hitEntity.Handle == e.Handle) // { // isVisible = 1; // } // gtaBone = new GTABone(bone, isVisible, res); //} //else //{ // gtaBone = new GTABone(bone, -2, false, null); //} gtaBone = new GTABone(bone); Bones3D.Add(bone.Index.ToString(), gtaBone); } catch { continue; } } }
public static RaycastResult Raycast(Vector3 source, Vector3 target, int options, Entity entity) { var result = Function.Call <int>(Hash._CAST_RAY_POINT_TO_POINT, source.X, source.Y, source.Z, target.X, target.Y, target.Z, options, (entity != null) ? entity.Handle : 0, 7); var obj = (RaycastResult)typeof(RaycastResult).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null).Invoke(new[] { (object)result }); return(obj); }
public static bool IsInFrontOfThePlayer(Vector3 shootCoord) { return(true); //var playerRotation = Game.Player.Character.Rotation; //var shootVector = shootCoord - Game.Player.Character.Position; //var shootRotation = Util.DirectionToRotation(shootVector); //var rotationDiff = shootRotation - playerRotation; //var rotationDiffBound = BoundRotationDeg(rotationDiff.Z); //return ((rotationDiffBound < 90) || (rotationDiffBound > 270)); }
public static bool WorldToScreenRel_Native(Vector3 worldCoords, out Vector2 screenCoords) { var num1 = new OutputArgument(); var num2 = new OutputArgument(); if (!Function.Call <bool>(Hash._WORLD3D_TO_SCREEN2D, worldCoords.X, worldCoords.Y, worldCoords.Z, num1, num2)) { screenCoords = new Vector2(); return(false); } screenCoords = new Vector2((num1.GetResult <float>() - 0.5f) * 2, (num2.GetResult <float>() - 0.5f) * 2); return(true); }
private void HandleBulletPacket(int netHandle, bool shooting, Vector3 aim) { //Util.Util.SafeNotify("Handling Bullet - " + DateTime.Now.Millisecond); var syncPed = NetEntityHandler.GetPlayer(netHandle); syncPed.IsShooting = shooting; syncPed.AimedAtPlayer = false; if (shooting) { syncPed.AimCoords = aim; } }
public static Vector3 RotationToDirection(Vector3 rotation) { var z = DegToRad(rotation.Z); var x = DegToRad(rotation.X); var num = Math.Abs(Math.Cos(x)); return(new Vector3 { X = (float)(-Math.Sin(z) * num), Y = (float)(Math.Cos(z) * num), Z = (float)Math.Sin(x) }); }
public static bool WorldToScreenRel(GTA.Math.Vector3 worldCoords, out GTA.Math.Vector2 screenCoords) { bool success; screenCoords = HashFunctions.Convert3dTo2d(worldCoords, out success); if (!success) { return(false); } screenCoords.X = (screenCoords.X - 0.5f) * 2.0f; screenCoords.Y = (screenCoords.Y - 0.5f) * 2.0f; return(success); }
internal void Interpolate(int netHandle, int gameHandle, Vector3 newPos, CherryMPShared.Vector3 newVelocity, Vector3 newRotation) { if (!Interpolations.ContainsKey(netHandle)) { var interp = new UnoccupiedVehicleInterpolator(gameHandle, netHandle); interp.SetTargetPosition(newPos, newVelocity, newRotation); Interpolations.Set(netHandle, interp); } else { Interpolations[netHandle].SetTargetPosition(newPos, newVelocity, newRotation); } }
public static Vector3 ToEuler(this Quaternion q) { var pitchYawRoll = new Vector3(); double sqw = q.W * q.W; double sqx = q.X * q.X; double sqy = q.Y * q.Y; double sqz = q.Z * q.Z; pitchYawRoll.Y = (float)Math.Atan2(2f * q.X * q.W + 2f * q.Y * q.Z, 1 - 2f * (sqz + sqw)); // Yaw pitchYawRoll.X = (float)Math.Asin(2f * (q.X * q.Z - q.W * q.Y)); // Pitch pitchYawRoll.Z = (float)Math.Atan2(2f * q.X * q.Y + 2f * q.Z * q.W, 1 - 2f * (sqy + sqz)); return(pitchYawRoll); }
public static Vector3 DirectionToRotation(Vector3 direction) { direction.Normalize(); var x = (float)Math.Atan2(direction.Z, Math.Sqrt(direction.Y * direction.Y + direction.X * direction.X)); var y = 0; var z = (float)-Math.Atan2(direction.X, direction.Y); return(new Vector3 { X = Mathf.Rad2Deg * x, Y = Mathf.Rad2Deg * y, Z = Mathf.Rad2Deg * z }); }
public static Vector3 DirectionToRotation(Vector3 direction) { direction.Normalize(); var x = Math.Atan2(direction.Z, Math.Sqrt(direction.Y * direction.Y + direction.X * direction.X)); var y = 0; var z = -Math.Atan2(direction.X, direction.Y); return(new Vector3 { X = (float)RadToDeg(x), Y = (float)RadToDeg(y), Z = (float)RadToDeg(z) }); }
public static Vector3 OffsetRotation(Vector3 rotationDeg, double pitchDeg, double yawDeg) { //var quaturnion = EulerDegToQuaturnion((float)DegToRad(rotationDeg.Z), // (float)DegToRad(rotationDeg.X), // (float) DegToRad(rotationDeg.Y)); //var extraRotation = EulerDegToQuaturnion((float)DegToRad(yawDeg), (float)DegToRad(pitchDeg), 0); //var finalQuaturnion = quaturnion * extraRotation; //finalQuaturnion.Normalize(); var result = rotationDeg; result.X += (float)pitchDeg; result.Z += (float)yawDeg * (float)Math.Cos(DegToRad(rotationDeg.Y)); //UI.ShowSubtitle(Math.Round(rotationDeg.X,0) + " | " + Math.Round(rotationDeg.Y, 0) + " | " + Math.Round(rotationDeg.Z, 0) // + " | " + Math.Round(result.X, 0) + " | " + Math.Round(result.Y, 0) + " | " + Math.Round(result.Z, 0)); return(result); }
public static Vector3 RaycastEverything(out Entity hitEntity, Vector3 target3D, Vector3 source3D, float radius) { hitEntity = null; const float raycastToDist = 200.0f; const float raycastFromDist = 1f; const float defaultDist = 60.0f; Entity ignoreEntity = Game.Player.Character; if (Game.Player.Character.IsInVehicle()) { ignoreEntity = Game.Player.Character.CurrentVehicle; } var dir = (target3D - source3D); dir.Normalize(); RaycastResult raycastResults; if (radius > 0) { raycastResults = World.RaycastCapsule(source3D + dir * raycastFromDist, source3D + dir * raycastToDist, radius, (IntersectOptions)(1 | 16 | 256 | 2 | 4 | 8) // | peds + vehicles , ignoreEntity); } else { raycastResults = World.Raycast(source3D + dir * raycastFromDist, source3D + dir * raycastToDist, (IntersectOptions)(1 | 16 | 256 | 2 | 4 | 8) // | peds + vehicles , ignoreEntity); } if (raycastResults.DitHitAnything) { if (raycastResults.DitHitEntity) { hitEntity = raycastResults.HitEntity; } return(raycastResults.HitCoords); } return(source3D + dir * defaultDist); }
public static void ScreenRelToWorld(Vector2 screenCoordsRel, out Vector3 camPoint, out Vector3 farPoint) { var mView = Util.GetCameraMatrix(); camPoint = ViewMatrixToCameraPosition(mView); farPoint = ScreenRelToWorld(mView, screenCoordsRel); //UI.ShowSubtitle("Cam: " + Math.Round(camPoint.X, 1) + " " + Math.Round(camPoint.Y, 1) + " " + // Math.Round(camPoint.Z, 1) // + "\nResult: " + Math.Round(farPoint.X, 1) + " " + Math.Round(farPoint.Y, 1) + " " + // Math.Round(farPoint.Z, 1)); //+ "\n Cam: " + Math.Round(mView.M11, 1) + " " + Math.Round(mView.M12, 1) + " " + Math.Round(mView.M13, 1) + " " + Math.Round(mView.M14, 1) //+ "\n " + Math.Round(mView.M21, 1) + " " + Math.Round(mView.M22, 1) + " " + Math.Round(mView.M23, 1) + " " + Math.Round(mView.M24, 1) //+ "\n " + Math.Round(mView.M31, 1) + " " + Math.Round(mView.M32, 1) + " " + Math.Round(mView.M33, 1) + " " + Math.Round(mView.M34, 1) //+ "\n " + Math.Round(mView.M41, 1) + " " + Math.Round(mView.M42, 1) + " " + Math.Round(mView.M43, 1) + " " + Math.Round(mView.M44, 1)); }
public static GTABoundingBox2 ComputeBoundingBox(Entity entity) { var m = entity.Model; (Vector3 gmin, Vector3 gmax) = m.Dimensions; var bbox = new SharpDX.BoundingBox(new SharpDX.Vector3(gmin.X, gmin.Y, gmin.Z), new SharpDX.Vector3(gmax.X, gmax.Y, gmax.Z)); var res = new GTABoundingBox2 { Min = new Vector2(float.PositiveInfinity, float.PositiveInfinity), Max = new Vector2(float.NegativeInfinity, float.NegativeInfinity) }; foreach (var corner in bbox.GetCorners()) { var cornerVector = new Vector3(corner.X, corner.Y, corner.Z); cornerVector = entity.GetOffsetPosition(cornerVector); Vector2 position = HashFunctions.Convert3dTo2d(cornerVector); if (position.X == .1f || position.Y == .1f || position.X == .9f || position.Y == .9f) { return(new GTABoundingBox2 { Min = new Vector2(float.PositiveInfinity, float.PositiveInfinity), Max = new Vector2(float.NegativeInfinity, float.NegativeInfinity), Quality = DataQuality.Low }); } res = new GTABoundingBox2 { Min = new Vector2(Math.Min(res.Min.X, position.X), Math.Min(res.Min.Y, position.Y)), Max = new Vector2(Math.Max(res.Max.X, position.X), Math.Max(res.Max.Y, position.Y)), Quality = DataQuality.High }; } if (res.Max.X == res.Min.X || res.Max.Y == res.Min.Y) { res.Quality = DataQuality.Low; } return(res); }
public static void ScreenRelToWorld(Vector2 screenCoordsRel, out Vector3 camPoint, out Vector3 farPoint) { var mView = ScriptHookExtensions.GetCameraMatrix(); camPoint = ViewMatrixToCameraPosition(mView); farPoint = ScreenRelToWorld(mView, screenCoordsRel); }
/// <summary> /// Creates a teleport target instance /// </summary> /// <param name="name">Name</param> /// <param name="x">X coordinate</param> /// <param name="y">Y coordinate</param> /// <param name="z">Z coordinate</param> /// <param name="requiredIPLs">Required IPLs to load</param> /// <param name="removeIPLs">Required IPLs to remove</param> /// <param name="isLoaded">Is loaded</param> public TeleportTarget(MString name, float x, float y, float z, string[] requiredIPLs = null, string[] removeIPLs = null) { _name = name; _coords = new GTA.Math.Vector3(x, y, z); _requiredIPLs = requiredIPLs; _removeIPLs = removeIPLs; }
public static Vector3 DirectionToRotation(Vector3 direction) { direction.Normalize(); var x = (float)Math.Atan2(direction.Z, Math.Sqrt(direction.Y * direction.Y + direction.X * direction.X)); var y = 0; var z = (float)-Math.Atan2(direction.X, direction.Y); return new Vector3 { X = Mathf.Rad2Deg * x, Y = Mathf.Rad2Deg * y, Z = Mathf.Rad2Deg * z }; }
public static RaycastResult Raycast(Vector3 source, Vector3 target, int options, Entity entity) { var result = Function.Call<int>(Hash._CAST_RAY_POINT_TO_POINT, source.X, source.Y, source.Z, target.X, target.Y, target.Z, options, (entity != null) ? entity.Handle : 0, 7); var obj = (RaycastResult) typeof(RaycastResult).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null).Invoke(new[] {(object)result}); return obj; }
public EmergencyVehicle(string model) { EmergencyVehicle.spawnPos = Game.Player.Character.Position + (Game.Player.Character.ForwardVector * DISTANCE_MULTIPLIER); vehicle = World.CreateVehicle(model, EmergencyVehicle.spawnPos); // so it will unspawn like a normal emergency vehicle vehicle.IsPersistent = false; }
public static bool WorldToScreenRel(Vector3 entityPosition, out Vector2 screenCoords) { var mView = ScriptHookExtensions.GetCameraMatrix(); mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var result = new SharpDX.Vector3(0,0,0); result.Z = (vForward.X * entityPosition.X) + (vForward.Y * entityPosition.Y) + (vForward.Z * entityPosition.Z) + vForward.W; result.X = (vRight.X * entityPosition.X) + (vRight.Y * entityPosition.Y) + (vRight.Z * entityPosition.Z) + vRight.W; result.Y = (vUpward.X * entityPosition.X) + (vUpward.Y * entityPosition.Y) + (vUpward.Z * entityPosition.Z) + vUpward.W; if (result.Z < 0.001f) { screenCoords = new Vector2(0, 0); return false; } float invw = 1.0f / result.Z; result.X *= invw; result.Y *= invw; screenCoords = new Vector2(result.X, -result.Y); return true; }
public static Vector3 BoundRotationDeg(Vector3 angleDeg) { return new Vector3(BoundRotationDeg(angleDeg.X), BoundRotationDeg(angleDeg.Y), BoundRotationDeg(angleDeg.Z)); }
public static bool IsInFrontOfThePlayer(Vector3 shootCoord) { //TODO return true; //var playerRotation = Game.Player.Character.Rotation; //var shootVector = shootCoord - Game.Player.Character.Position; //var shootRotation = Util.DirectionToRotation(shootVector); //var rotationDiff = shootRotation - playerRotation; //var rotationDiffBound = BoundRotationDeg(rotationDiff.Z); //return ((rotationDiffBound < 90) || (rotationDiffBound > 270)); }
public static Vector3 RotationToDirection(Vector3 rotation) { var z = Mathf.Deg2Rad * rotation.Z; var x = Mathf.Deg2Rad * rotation.X; var num = Math.Abs(Math.Cos(x)); return new Vector3 { X = (float)(-Math.Sin(z) * num), Y = (float)(Math.Cos(z) * num), Z = (float)Math.Sin(x) }; }
private static Vector3 ViewMatrixToCameraPosition(Matrix mView) { mView.Transpose(); var vForward = mView.Row4; var vRight = mView.Row2; var vUpward = mView.Row3; var n1 = new Vector3(vForward.X, vForward.Y, vForward.Z); var n2 = new Vector3(vRight.X, vRight.Y, vRight.Z); var n3 = new Vector3(vUpward.X, vUpward.Y, vUpward.Z); var d1 = vForward.W; var d2 = vRight.W; var d3 = vUpward.W; var n2n3 = Vector3.Cross(n2, n3); var n3n1 = Vector3.Cross(n3, n1); var n1n2 = Vector3.Cross(n1, n2); var top = (n2n3 * d1) + (n3n1 * d2) + (n1n2 * d3); var denom = Vector3.Dot(n1, n2n3); var epsilon = 0.0000001; if (Math.Abs(denom) < epsilon) return new Vector3(); return top / -denom; }
public static Vector3 RaycastEverything(out Entity hitEntity, Vector3 target3D, Vector3 source3D) { hitEntity = null; const float raycastToDist = 200.0f; const float raycastFromDist = 1f; const float defaultDist = 60.0f; Entity ignoreEntity = Game.Player.Character; if (Game.Player.Character.IsInVehicle()) { ignoreEntity = Game.Player.Character.CurrentVehicle; } var dir = (target3D - source3D); dir.Normalize(); var raycastResults = World.Raycast(source3D + dir*raycastFromDist, source3D + dir*raycastToDist, (IntersectOptions) (1 | 16 | 256 | 2 | 4 | 8) // | peds + vehicles , ignoreEntity); if (raycastResults.DitHitAnything) { if (raycastResults.DitHitEntity) { hitEntity = raycastResults.HitEntity; } return raycastResults.HitCoords; } return source3D + dir*defaultDist; }
public static Vector3 OffsetRotation(Vector3 rotationDeg, double pitchDeg, double yawDeg) { //var quaturnion = EulerDegToQuaturnion((float)DegToRad(rotationDeg.Z), // (float)DegToRad(rotationDeg.X), // (float) DegToRad(rotationDeg.Y)); //var extraRotation = EulerDegToQuaturnion((float)DegToRad(yawDeg), (float)DegToRad(pitchDeg), 0); //var finalQuaturnion = quaturnion * extraRotation; //finalQuaturnion.Normalize(); var result = rotationDeg; result.X += (float)pitchDeg; result.Z += (float)yawDeg;// * (float)Math.Cos(Mathf.Deg2Rad * rotationDeg.Y); //UI.ShowSubtitle(Math.Round(rotationDeg.X,0) + " | " + Math.Round(rotationDeg.Y, 0) + " | " + Math.Round(rotationDeg.Z, 0) // + " | " + Math.Round(result.X, 0) + " | " + Math.Round(result.Y, 0) + " | " + Math.Round(result.Z, 0)); return result; }
public static bool IsOccluded(Entity entity, Vector3 target3D) { const float raycastToDist = 200.0f; const float raycastFromDist = 1f; var mView = ScriptHookExtensions.GetCameraMatrix(); var source3D = ViewMatrixToCameraPosition(mView); Entity ignoreEntity = Game.Player.Character; if (Game.Player.Character.IsInVehicle()) { ignoreEntity = Game.Player.Character.CurrentVehicle; } var dir = (target3D - source3D); dir.Normalize(); var raycastResults = World.Raycast(source3D + dir*raycastFromDist, source3D + dir*raycastToDist, (IntersectOptions) (1 | 16 | 256 | 2 | 4 | 8) // | peds + vehicles , ignoreEntity); if (raycastResults.DitHitEntity) { return raycastResults.HitEntity.Handle != entity.Handle; } return true; }
/// <summary> /// Teleports player to map marker /// </summary> /// <param name="sender">Source menu item</param> public static void MapMarker(MenuItem sender) { int handle = Game.Player.Character.Handle; if (Game.Player.Character.IsInVehicle()) { handle = Game.Player.Character.CurrentVehicle.Handle; } bool markerFound = false; GTA.Math.Vector3 coord = new GTA.Math.Vector3(); int blipIterator = Function.Call<int>(Hash._GET_BLIP_INFO_ID_ITERATOR); for (int i = Function.Call<int>(Hash.GET_FIRST_BLIP_INFO_ID, blipIterator); Function.Call<bool>(Hash.DOES_BLIP_EXIST, i); i = Function.Call<int>(Hash.GET_NEXT_BLIP_INFO_ID, blipIterator)) { if (Function.Call<int>(Hash.GET_BLIP_INFO_ID_TYPE, i) == 4) { coord = Function.Call<GTA.Math.Vector3>(Hash.GET_BLIP_INFO_ID_COORD, i); markerFound = true; break; } } if (markerFound) { // Check ground bool grounded = false; float zz = 0; for (float z = GROUND_CHECK_START; z < GROUND_CHECK_END; z += GROUND_CHECK_STEP) { Function.Call(Hash.SET_ENTITY_COORDS_NO_OFFSET, handle, coord.X, coord.Y, z, 0, 0, 1); Script.Wait(GROUND_CHECK_WAIT); unsafe { if (Function.Call<bool>(Hash.GET_GROUND_Z_FOR_3D_COORD, coord.X, coord.Y, z, &zz)) { Function.Call(Hash.SET_ENTITY_COORDS_NO_OFFSET, handle, coord.X, coord.Y, zz + MAP_MARKER_TELEPORT_EXTRA_Z, 0, 0, 1); grounded = true; break; } } } if (!grounded) { Function.Call(Hash.GIVE_DELAYED_WEAPON_TO_PED, Game.Player.Character.Handle, WeaponStorage.PARACHUTE_HASH, 1, false); Game.Player.Character.Position = new GTA.Math.Vector3(coord.X, coord.Y, PARACHUTE_HEIGHT); } Utils.ShowNotificationAboveMap(GlobalConst.Message.TP_MAP_MARKER); } else { Utils.ShowNotificationAboveMap(GlobalConst.Message.TP_NO_MAP_MARKER_FOUND); } }
public static bool WorldToScreenRel_Native(Vector3 worldCoords, out Vector2 screenCoords) { var num1 = new OutputArgument(); var num2 = new OutputArgument(); if (!Function.Call<bool>(Hash._WORLD3D_TO_SCREEN2D, worldCoords.X, worldCoords.Y, worldCoords.Z, num1, num2)) { screenCoords = new Vector2(); return false; } screenCoords = new Vector2((num1.GetResult<float>() - 0.5f) * 2, (num2.GetResult<float>() - 0.5f) * 2); return true; }