public static void Main() { GameFiber.StartNew(delegate { Game.RawFrameRender += DrawVehicleInfo; LowPriority(); Game.LogTrivial("Traffic Policer Speed Checker started."); try { while (true) { GameFiber.Yield(); if (CurrentSpeedCheckerState == SpeedCheckerStates.Speedgun) { if (Game.LocalPlayer.Character.Inventory.EquippedWeapon == null || Game.LocalPlayer.Character.Inventory.EquippedWeapon.Asset != speedgunWeapon || (Game.LocalPlayer.Character.CurrentVehicle.Exists() && Game.LocalPlayer.Character.CurrentVehicle.Speed >= 3f)) { CurrentSpeedCheckerState = SpeedCheckerStates.Off; continue; } Game.DisableControlAction(0, GameControl.Attack, true); Game.DisableControlAction(0, GameControl.Attack2, true); Game.DisableControlAction(0, GameControl.MeleeAttack1, true); Game.DisableControlAction(0, GameControl.MeleeAttack2, true); Game.DisableControlAction(0, GameControl.VehicleAttack, true); //Game.DisableControlAction(0, GameControl.VehicleAttack2, true); if (NativeFunction.Natives.IS_DISABLED_CONTROL_JUST_PRESSED <bool>(0, 24)) { Vehicle veh = null; try { unsafe { uint entityHandle; NativeFunction.Natives.x2975C866E6713290(Game.LocalPlayer, new IntPtr(&entityHandle)); // Stores the entity the player is aiming at in the uint provided in the second parameter. Entity ent = World.GetEntityByHandle <Rage.Entity>(entityHandle); if (ent is Ped) { veh = ((Ped)ent).CurrentVehicle; } else if (ent is Vehicle) { veh = (Vehicle)ent; } } } catch (Exception e) { } if (veh.Exists()) { TargetModel = veh.Model.Name; TargetModel = char.ToUpper(TargetModel[0]) + TargetModel.Substring(1).ToLower(); if (SpeedUnit == "MPH") { TargetSpeed = (int)Math.Round(MathHelper.ConvertMetersPerSecondToMilesPerHour(veh.Speed)); } else { TargetSpeed = MathHelper.ConvertMetersPerSecondToKilometersPerHourRounded(veh.Speed); } if (TargetSpeed >= SpeedToColourAt) { SpeedColour = Color.Red; if (PlayFlagBlip) { if (!VehiclesBlipPlayedFor.Contains(veh)) { VehiclesBlipPlayedFor.Add(veh); FlagBlipPlayer.Play(); Game.DisplayNotification("~s~車種: ~b~" + TargetModel + "~n~~s~速度: " + (SpeedColour == Color.Red ? "~r~" : "") + TargetSpeed + " " + SpeedUnit); } } } else { SpeedColour = Color.White; } } } } if (Game.LocalPlayer.Character.IsInAnyVehicle(false) && (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownRightNowComputerCheck(ToggleSpeedCheckerModifierKey) || ToggleSpeedCheckerModifierKey == Keys.None)) { if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(ToggleSpeedCheckerKey)) { if (CurrentSpeedCheckerState != SpeedCheckerStates.Off && CurrentSpeedCheckerState != SpeedCheckerStates.Speedgun) { GameFiber.Wait(200); if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownRightNowComputerCheck(ToggleSpeedCheckerKey)) { CurrentSpeedCheckerState = SpeedCheckerStates.Off; NativeFunction.Natives.DELETE_CHECKPOINT(CheckPoint); ResetAverageSpeedCheck(); Game.HideHelp(); } else { Game.DisplaySubtitle("~h~Hold Speed Checker toggle to disable.", 3000); if (CurrentSpeedCheckerState == SpeedCheckerStates.Average) { ResetAverageSpeedCheck(); CurrentSpeedCheckerState = SpeedCheckerStates.FixedPoint; DisplayMaxSpeedMessage(); } else if (CurrentSpeedCheckerState == SpeedCheckerStates.FixedPoint) { NativeFunction.Natives.DELETE_CHECKPOINT(CheckPoint); CurrentSpeedCheckerState = SpeedCheckerStates.Average; DisplayAverageSpeedCheckInstructions(); } } } else if (Game.LocalPlayer.Character.IsInAnyVehicle(false)) { if (CurrentSpeedCheckerState == SpeedCheckerStates.Speedgun) { Game.DisplaySubtitle("Please unequip your speedgun first."); } else { if (Game.LocalPlayer.Character.CurrentVehicle.Speed > 6f) { CurrentSpeedCheckerState = SpeedCheckerStates.Average; DisplayAverageSpeedCheckInstructions(); } else { CurrentSpeedCheckerState = SpeedCheckerStates.FixedPoint; DisplayMaxSpeedMessage(); } } } CheckPointPosition = Game.LocalPlayer.Character.GetOffsetPosition(new Vector3(0f, 8f, -1f)); //xOffset = 0; //yOffset = 0; //zOffset = 0; } } if (CurrentSpeedCheckerState != SpeedCheckerStates.Off && CurrentSpeedCheckerState != SpeedCheckerStates.Speedgun) { if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(SecondaryDisableKey) || !Game.LocalPlayer.Character.IsInAnyVehicle(false)) { CurrentSpeedCheckerState = SpeedCheckerStates.Off; NativeFunction.Natives.DELETE_CHECKPOINT(CheckPoint); CheckPointPosition = Game.LocalPlayer.Character.GetOffsetPosition(new Vector3(0f, 8f, -1f)); ResetAverageSpeedCheck(); Game.HideHelp(); } //xOffset = 0; //yOffset = 0; //zOffset = 0; } if (CurrentSpeedCheckerState == SpeedCheckerStates.FixedPoint && Game.LocalPlayer.Character.IsInAnyVehicle(false)) { CheckPointPosition = Game.LocalPlayer.Character.GetOffsetPosition(new Vector3((float)xOffset + 0.5f, (float)(yOffset + 8), (float)(-1 + zOffset))); if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(PositionResetKey)) { xOffset = 0; yOffset = 0; zOffset = 0; } if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(PositionForwardKey)) { yOffset++; } if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(PositionBackwardKey)) { yOffset--; } if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(PositionRightKey)) { xOffset++; } if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(PositionLeftKey)) { xOffset--; } if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(PositionUpKey)) { zOffset++; } if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(PositionDownKey)) { zOffset--; } NativeFunction.Natives.DELETE_CHECKPOINT(CheckPoint); CheckPoint = NativeFunction.Natives.CREATE_CHECKPOINT <int>(46, CheckPointPosition.X, CheckPointPosition.Y, CheckPointPosition.Z, CheckPointPosition.X, CheckPointPosition.Y, CheckPointPosition.Z, 3.5f, 255, 0, 0, 255, 0); NativeFunction.Natives.SET_CHECKPOINT_CYLINDER_HEIGHT(CheckPoint, 2f, 2f, 2f); } if ((CurrentSpeedCheckerState == SpeedCheckerStates.FixedPoint && Game.LocalPlayer.Character.IsInAnyVehicle(false)) || CurrentSpeedCheckerState == SpeedCheckerStates.Speedgun) { if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(MaxSpeedUpKey)) { SpeedToColourAt += 5; DisplayMaxSpeedMessage(); } if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(MaxSpeedDownKey)) { SpeedToColourAt -= 5; if (SpeedToColourAt < 0) { SpeedToColourAt = 0; } DisplayMaxSpeedMessage(); } } else if (CurrentSpeedCheckerState == SpeedCheckerStates.Average && Game.LocalPlayer.Character.IsInAnyVehicle(false)) { if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(StartStopAverageSpeedCheckKey)) { if (MeasuringAverageSpeed) { StopAverageSpeedCheck(); } else if (!MeasuringAverageSpeed && AverageSpeedCheckSecondsPassed == 0f) { StartAverageSpeedCheck(); } else { Game.DisplayHelp("Reset the average speed check first using ~b~" + TrafficPolicerHandler.kc.ConvertToString(ResetAverageSpeedCheckKey)); } } if (Albo1125.Common.CommonLibrary.ExtensionMethods.IsKeyDownComputerCheck(ResetAverageSpeedCheckKey)) { if (!MeasuringAverageSpeed) { ResetAverageSpeedCheck(); } else { Game.DisplayHelp("Stop current average speed check first using ~b~" + TrafficPolicerHandler.kc.ConvertToString(StartStopAverageSpeedCheckKey)); } } } } } catch (Exception e) { NativeFunction.Natives.DELETE_CHECKPOINT(CheckPoint); throw; } }); }
private static void LowPriority() { GameFiber.StartNew(delegate { while (true) { GameFiber.Wait(100); foreach (Ped flaggeddriver in FlaggedDrivers.ToArray()) { if (flaggeddriver.Exists()) { if (flaggeddriver.DistanceTo(Game.LocalPlayer.Character) > 300f) { flaggeddriver.IsPersistent = false; //flaggeddriver.Dismiss(); FlaggedDrivers.Remove(flaggeddriver); } else if (Functions.IsPlayerPerformingPullover()) { if (Functions.GetPulloverSuspect(Functions.GetCurrentPullover()) == flaggeddriver) { FlaggedDrivers.Remove(flaggeddriver); } } else if (Functions.GetActivePursuit() != null) { if (Functions.GetPursuitPeds(Functions.GetActivePursuit()).Contains(flaggeddriver)) { FlaggedDrivers.Remove(flaggeddriver); } } } else { FlaggedDrivers.Remove(flaggeddriver); } } if (CurrentSpeedCheckerState != SpeedCheckerStates.Speedgun && Game.LocalPlayer.Character.Inventory.EquippedWeapon != null && Game.LocalPlayer.Character.Inventory.EquippedWeapon.Asset == speedgunWeapon && !Game.LocalPlayer.Character.CurrentVehicle.Exists()) { CurrentSpeedCheckerState = SpeedCheckerStates.Speedgun; DisplayMaxSpeedMessage(); } if (CurrentSpeedCheckerState == SpeedCheckerStates.FixedPoint && Game.LocalPlayer.Character.IsInAnyVehicle(false)) { Entity[] WorldVehicles = World.GetEntities(CheckPointPosition, 7, GetEntitiesFlags.ConsiderAllVehicles | GetEntitiesFlags.ExcludePlayerVehicle); foreach (Vehicle veh in WorldVehicles) { if (veh.Exists() && veh != Game.LocalPlayer.Character.CurrentVehicle && veh.DistanceTo(CheckPointPosition) <= 6.5f) { bool ShowVehicleNotification = false; TargetModel = veh.Model.Name; TargetModel = char.ToUpper(TargetModel[0]) + TargetModel.Substring(1).ToLower(); if (SpeedUnit == "MPH") { TargetSpeed = (int)Math.Round(MathHelper.ConvertMetersPerSecondToMilesPerHour(veh.Speed)); } else { TargetSpeed = MathHelper.ConvertMetersPerSecondToKilometersPerHourRounded(veh.Speed); } if (TargetSpeed >= SpeedToColourAt) { SpeedColour = Color.Red; if (PlayFlagBlip) { if (!VehiclesBlipPlayedFor.Contains(veh)) { VehiclesBlipPlayedFor.Add(veh); FlagBlipPlayer.Play(); ShowVehicleNotification = true; } } } else { SpeedColour = Color.White; } //TargetSpeedLimit = GetSpeedLimit(veh.Position, SpeedUnit); TargetFlag = ""; TargetLicencePlate = veh.LicensePlate; FlagsTextColour = Color.White; if ((TrafficPolicerHandler.rnd.Next(101) <= FlagChance || VehiclesFlagged.Contains(veh)) && !veh.HasSiren && !VehiclesNotFlagged.Contains(veh)) { if (!VehiclesFlagged.Contains(veh)) { VehiclesFlagged.Add(veh); } if (!VehicleDetails.IsVehicleInDetailsDatabase(veh)) { VehicleDetails.AddVehicleToDetailsDatabase(veh, 25); } if (veh.IsStolen || VehicleDetails.GetInsuranceStatusForVehicle(veh) != EVehicleDetailsStatus.Valid) { if (veh.IsStolen) { TargetFlag = "Stolen"; FlagsTextColour = Color.Red; } else if (VehicleDetails.GetInsuranceStatusForVehicle(veh) != EVehicleDetailsStatus.Valid) { TargetFlag = "Uninsured"; FlagsTextColour = Color.Red; } } else { if (veh.HasDriver && veh.Driver.Exists()) { if (Functions.GetPersonaForPed(veh.Driver).Wanted) { TargetFlag = "Owner Wanted"; FlagsTextColour = Color.Red; } else if (Functions.GetPersonaForPed(veh.Driver).ELicenseState == LSPD_First_Response.Engine.Scripting.Entities.ELicenseState.Suspended) { TargetFlag = "Licence Suspended"; FlagsTextColour = Color.Red; } else if (Functions.GetPersonaForPed(veh.Driver).ELicenseState == LSPD_First_Response.Engine.Scripting.Entities.ELicenseState.Expired) { TargetFlag = "Licence Expired"; FlagsTextColour = Color.Orange; } else if (Functions.GetPersonaForPed(veh.Driver).Birthday.Month == DateTime.Now.Month && Functions.GetPersonaForPed(veh.Driver).Birthday.Day == DateTime.Now.Day) { TargetFlag = "Owner's Birthday"; FlagsTextColour = Color.Green; } if (TargetFlag != "") { if (!FlaggedDrivers.Contains(veh.Driver)) { if (!veh.Driver.IsPersistent) { FlaggedDrivers.Add(veh.Driver); veh.Driver.IsPersistent = true; } } } } } if (PlayFlagBlip) { if (TargetFlag != "") { if (!VehiclesBlipPlayedFor.Contains(veh)) { VehiclesBlipPlayedFor.Add(veh); FlagBlipPlayer.Play(); ShowVehicleNotification = true; } } } } if (TargetFlag == "") { VehiclesNotFlagged.Add(veh); } if (ShowVehicleNotification) { Game.DisplayNotification("ナンバー: ~b~" + TargetLicencePlate + "~n~~s~車種: ~b~" + TargetModel + "~n~~s~速度: " + (SpeedColour == Color.Red ? "~r~" : "") + TargetSpeed + " " + SpeedUnit + "~n~~s~Flags: ~r~" + TargetFlag); } } } } else if (CurrentSpeedCheckerState == SpeedCheckerStates.Average && Game.LocalPlayer.Character.IsInAnyVehicle(false)) { if (SpeedUnit == "MPH") { AverageSpeedCheckCurrentSpeed = (int)Math.Round(MathHelper.ConvertMetersPerSecondToMilesPerHour(Game.LocalPlayer.Character.CurrentVehicle.Speed)); } else { AverageSpeedCheckCurrentSpeed = MathHelper.ConvertMetersPerSecondToKilometersPerHourRounded(Game.LocalPlayer.Character.CurrentVehicle.Speed); } if (MeasuringAverageSpeed) { AverageSpeedCheckDistance += Vector3.Distance(LastAverageSpeedCheckReferencePoint, Game.LocalPlayer.Character.CurrentVehicle.Position); LastAverageSpeedCheckReferencePoint = Game.LocalPlayer.Character.CurrentVehicle.Position; AverageSpeedCheckSecondsPassed = ((float)AverageSpeedCheckStopwatch.ElapsedMilliseconds) / 1000; } } } }); }