//-----------------------------------------------------------------------
// <copyright file="Ticket.cs" company="HippieCommunist">
// Original script by HippieCommunist.
// Heavily refactored by MulleDK19.
// </copyright>
//-----------------------------------------------------------------------
namespace Ticket
{
using System;
using System.Windows.Forms;
using GTA;
/// <summary>
/// A script that makes police officers issue tickets to the player, when the player only has a wanted level of 1.
/// </summary>
public class Ticket : Script
{
#region Private Fields
/// <summary>
/// The speed of the player.
/// </summary>
private float lastPlayerSpeed;
/// <summary>
/// The player's wanted level.
/// </summary>
private int wantedLevel;
/// <summary>
/// Whether the player is currently surrendering.
/// </summary>
private bool isSurrendering = false;
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="Ticket"/> class.
/// </summary>
public Ticket()
{
this.Tick += new EventHandler(this.Ticket_Tick);
Wait(0);
}
#endregion
#region Properties
/// <summary>
/// Gets the last player speed.
/// </summary>
public float LastPlayerSpeed
{
get { return this.lastPlayerSpeed; }
private set { this.lastPlayerSpeed = value; }
}
/// <summary>
/// Gets the wanted level.
/// </summary>
public int WantedLevel
{
get { return this.wantedLevel; }
private set { this.wantedLevel = value; }
}
/// <summary>
/// Gets a value indicating whether the player is currently surrendering.
/// </summary>
/// <value>
/// <c>true</c> if the player is currently surrendering is surrendering; otherwise, <c>false</c>.
/// </value>
public bool IsSurrendering
{
get { return this.isSurrendering; }
private set { this.isSurrendering = value; }
}
#endregion
#region Private Methods
/// <summary>
/// Gets a random integer within the specified range.
/// </summary>
/// <param name="minimum">The minimum value.</param>
/// <param name="maximum">The maximum value.</param>
/// <returns>A random number between <paramref name="minimum"/> and <paramref name="maximum"/>.</returns>
private int GetRandomInteger(int minimum, int maximum)
{
Random random = new Random();
return random.Next(minimum, maximum + 1);
}
/// <summary>
/// Handles the script's Tick event.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
private void Ticket_Tick(object sender, EventArgs e)
{
Wait(0);
if (Player.WantedLevel == 1)
{
AnimationSet ambientAnimations = new AnimationSet("amb@newspaper_hold");
AnimationSet nikoGestures = new AnimationSet("gestures@niko");
AnimationFlags animationFlags = AnimationFlags.Unknown12 | AnimationFlags.Unknown11 | AnimationFlags.Unknown09;
int ticketAmount = this.GetRandomInteger(5000, 14000);
float playerVelocityX = Player.Character.Velocity.X;
float playerVelocityY = Player.Character.Velocity.Y;
playerVelocityX = playerVelocityX * playerVelocityX;
playerVelocityY = playerVelocityY * playerVelocityY;
if (Player.Character.isSittingInVehicle() && !Player.Character.isDead)
{
Vehicle playerVehicle = Player.Character.CurrentVehicle;
Wait(0);
if (playerVehicle.Exists())
{
this.LastPlayerSpeed = playerVehicle.Speed;
}
}
GTA.Ped[] pedArray = GTA.World.GetPeds(Player.Character.Position.Around(2.0f), 1.7f, 2);
foreach (GTA.Ped ped in pedArray)
{
if (this.IsSurrendering == true ||
playerVelocityX > 0.001F ||
playerVelocityY > 0.001F ||
this.LastPlayerSpeed > 2.0F ||
!ped.Exists() ||
(Player.Money < 1000) ||
GTA.Native.Function.Call<bool>("IS_CHAR_GETTING_UP", ped) ||
ped.isSittingInVehicle() ||
GTA.Native.Function.Call<bool>("IS_GROUP_MEMBER", ped, Player.Group) || (!ped.isAliveAndWell) ||
ped == Player.Character || ped.RelationshipGroup == RelationshipGroup.Player || ped.isRagdoll ||
(((uint)ped.Model.Hash != 0xF5148AB2) &&
((uint)ped.Model.Hash != 0xE9EC3678) &&
((uint)ped.Model.Hash != 0xFAAD5B99) &&
((uint)ped.Model.Hash != 0xE9EC3678) &&
((uint)ped.Model.Hash != 0xC41C88BE) &&
((uint)ped.Model.Hash != 0xC46CBC16)))
{
continue;
}
Group playerGroup;
playerGroup = Player.Group;
Wait(0);
GTA.Native.Function.Call("REQUEST_MODEL", "amb_clipboard");
ped.Task.AimAt(Player.Character.Position, 1500);
Game.DisplayText("LCPD: Freeze!");
GTA.Native.Function.Call("SWITCH_PED_TO_ANIMATED", Player.Character, 1);
Player.Character.Task.ClearAll();
Player.Character.FreezePosition = true;
GTA.Native.Function.Call("SET_CAMERA_CONTROLS_DISABLED_WITH_PLAYER_CONTROLS", 0);
Player.CanControlCharacter = false;
ped.Health += 50;
GTA.Native.Function.Call("CANCEL_OVERRIDE_RESTART");
Player.Character.Task.ClearAll();
Player.Character.FreezePosition = false;
GTA.Native.Function.Call("SET_MAX_WANTED_LEVEL", 0);
if (ped.isSittingInVehicle())
{
Wait(2500);
}
GTA.Object clipboard = World.CreateObject(Model.FromString("amb_clipboard"), Player.Character.Position.Around(9.0f));
Vector3 sx = Player.Character.GetOffsetPosition(new Vector3(0.0f, 0.5f, 0.0f));
GTA.Native.Function.Call("CLEAR_WANTED_LEVEL", Player);
Player.Character.Task.TurnTo(ped);
if (Player.Character.isSittingInVehicle())
{
Wait(1500);
}
GTA.Native.Function.Call("CLEAR_WANTED_LEVEL", Player);
GTA.Native.Function.Call("SET_POLICE_IGNORE_PLAYER", Player, 1);
Player.Character.Task.TurnTo(ped);
Wait(1000);
if (Player.Character.Weapons.CurrentType != 0)
{
Game.DisplayText("LCPD: Suspect is Armed, Confiscating Weapon");
ticketAmount += 3500;
Player.Character.Weapons.Current.Ammo -= Player.Character.Weapons.Current.Ammo;
}
GTA.Native.Function.Call("SET_CURRENT_CHAR_WEAPON", Player.Character, 0, 1);
GTA.Native.Function.Call("SET_CURRENT_CHAR_WEAPON", ped, 0, 1);
GTA.Native.Function.Call("SWITCH_PED_TO_ANIMATED", ped, 1);
ped.Task.ClearAll();
Player.Character.Task.TurnTo(ped);
ped.DuckWhenAimedAtByGroupMember = false;
ped.ChangeRelationship(RelationshipGroup.Player, Relationship.Companion);
playerGroup.AddMember(ped);
Player.Character.Task.TurnTo(ped);
Wait(700);
GTA.Native.Function.Call("SET_CURRENT_CHAR_WEAPON", ped, 0, 1);
GTA.Native.Function.Call("SWITCH_PED_TO_ANIMATED", Player.Character, 0);
GTA.Native.Function.Call("SET_CURRENT_CHAR_WEAPON", ped, 0, 1);
GTA.Native.Function.Call("SET_EVERYONE_IGNORE_PLAYER", Player, 1);
Wait(10);
GTA.Native.Function.Call("SET_CURRENT_CHAR_WEAPON", ped, 0, 1);
GTA.Native.Function.Call("SWITCH_PED_TO_ANIMATED", ped, 1);
int waitTime = Convert.ToInt32(Math.Round((ped.Position.DistanceTo(Player.Character.Position) * 70.0f), 0));
Wait(waitTime);
GTA.Native.Function.Call("SWITCH_PED_TO_ANIMATED", ped, 1);
GTA.Native.Function.Call("CLEAR_WANTED_LEVEL", Player);
Player.Character.Task.TurnTo(ped);
ped.Task.TurnTo(Player.Character);
if (clipboard != null && clipboard.Exists())
{
GTA.Native.Function.Call("ATTACH_OBJECT_TO_PED", clipboard, ped, 1232, -0.025f, 0.085f, -0.021f, 0.0f, 0.0f, -0.5f, 0);
}
Player.Character.Task.PlayAnimation(nikoGestures, "how", 6.4F);
ped.Task.PlayAnimation(ambientAnimations, "walk_hold", 6.4F, animationFlags);
Wait(500);
Player.Character.Task.ClearAll();
ped.Task.TurnTo(Player.Character);
Wait(3500);
ped.SayAmbientSpeech("INTIMIDATE");
playerGroup.RemoveMember(ped);
ped.Task.ClearAll();
if (clipboard != null && clipboard.Exists())
{
clipboard.Delete();
}
Player.CanControlCharacter = true;
GTA.Native.Function.Call("SET_CAMERA_CONTROLS_DISABLED_WITH_PLAYER_CONTROLS", 1);
GTA.Native.Function.Call("SET_POLICE_IGNORE_PLAYER", Player, 0);
GTA.Native.Function.Call("SET_MAX_WANTED_LEVEL", 6);
GTA.Native.Function.Call("SET_EVERYONE_IGNORE_PLAYER", Player, 0);
if (Player.Money > ticketAmount)
{
Player.Money -= ticketAmount;
}
else
{
ticketAmount = Player.Money;
}
ped.Money += ticketAmount;
Player.Money -= ticketAmount;
Game.DisplayText("LCPD: your were fined with: " + ticketAmount + "$");
ped.RelationshipGroup = RelationshipGroup.Cop;
GTA.Native.Function.Call("CANCEL_OVERRIDE_RESTART");
Player.Character.FreezePosition = false;
this.IsSurrendering = false;
if (ped.Exists())
{
GTA.Native.Function.Call("SET_CHAR_AS_MISSION_CHAR", ped, 0);
if (ped.isInGroup)
{
playerGroup.RemoveMember(ped);
}
ped.NoLongerNeeded();
}
}
if (this.IsSurrendering && !GTA.Native.Function.Call<bool>("IS_CHAR_PLAYING_ANIM", Player.Character, "ped", "handsup"))
{
new AnimationSet("ped");
Wait(0);
if ((isKeyPressed(Settings.GetValueKey("Key", Keys.F8)) && !GTA.Native.Function.Call<bool>("PLAYER_HAS_GREYED_OUT_STARS", Player)) && !GTA.Native.Function.Call<bool>("IS_CHAR_PLAYING_ANIM", Player.Character, "ped", "handsup"))
{
Player.Character.Task.PlayAnimation(nikoGestures, "handsup", 15.4F);
}
Wait(600);
if (!GTA.Native.Function.Call<bool>("IS_CHAR_PLAYING_ANIM", Player.Character, "ped", "handsup"))
{
Player.WantedLevel = this.WantedLevel;
this.IsSurrendering = false;
}
}
}
else if ((Player.WantedLevel >= 1) && Player.Character.isAlive && !Player.Character.isRagdoll)
{
if (isKeyPressed(Settings.GetValueKey("Key", Keys.F8)) && !GTA.Native.Function.Call<bool>("IS_PLAYER_BEING_ARRESTED", Player) && !GTA.Native.Function.Call<bool>("PLAYER_HAS_GREYED_OUT_STARS", Player))
{
this.IsSurrendering = true;
this.WantedLevel = Player.WantedLevel;
AnimationSet animz = new AnimationSet("ped");
if (!GTA.Native.Function.Call<bool>("IS_CHAR_PLAYING_ANIM", Player.Character, "ped", "handsup"))
{
Player.Character.Task.PlayAnimation(animz, "handsup", 15.4F);
}
Player.WantedLevel = 1;
Player.Character.Weapons.Current.Ammo = 0;
Player.Character.DropCurrentWeapon();
GTA.Native.Function.Call("SET_CURRENT_CHAR_WEAPON", Player.Character, 0, 1);
Wait(100);
if (GTA.Native.Function.Call<bool>("IS_CHAR_PLAYING_ANIM", Player.Character, "ped", "handsup"))
{
Wait(0);
}
else
{
Wait(0);
Player.WantedLevel = this.WantedLevel;
this.IsSurrendering = false;
}
}
}
}
#endregion
}
}