|
|
@ -3,10 +3,12 @@ using System.Linq;
|
|
|
|
using Rage;
|
|
|
|
using Rage;
|
|
|
|
using LSPD_First_Response.Mod.API;
|
|
|
|
using LSPD_First_Response.Mod.API;
|
|
|
|
using LSPD_First_Response.Mod.Callouts;
|
|
|
|
using LSPD_First_Response.Mod.Callouts;
|
|
|
|
|
|
|
|
using CalloutInterfaceAPI;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Code_Blue_Calls.Callouts
|
|
|
|
namespace Code_Blue_Calls.Callouts
|
|
|
|
{
|
|
|
|
{
|
|
|
|
[CalloutInfo("Domestic Violence", CalloutProbability.High)]
|
|
|
|
[CalloutInfo("Domestic Violence", CalloutProbability.High)]
|
|
|
|
|
|
|
|
[CalloutInterface("Domestic Violence", CalloutProbability.Medium, "Code 3", "LSPD")]
|
|
|
|
public class DomesticViolence : Callout
|
|
|
|
public class DomesticViolence : Callout
|
|
|
|
{
|
|
|
|
{
|
|
|
|
private Ped victim, suspect;
|
|
|
|
private Ped victim, suspect;
|
|
|
@ -14,47 +16,52 @@ namespace Code_Blue_Calls.Callouts
|
|
|
|
private Blip blip_victim;
|
|
|
|
private Blip blip_victim;
|
|
|
|
private Vector3 location_suspect;
|
|
|
|
private Vector3 location_suspect;
|
|
|
|
private Vector3 location_victim;
|
|
|
|
private Vector3 location_victim;
|
|
|
|
private bool Victimfleeing;
|
|
|
|
private bool victimFleeing;
|
|
|
|
private bool SuspectKillingPlayer;
|
|
|
|
private bool suspectKillingPlayer;
|
|
|
|
private bool ShotAtVictim;
|
|
|
|
private bool shotAtVictim;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public override bool OnBeforeCalloutDisplayed()
|
|
|
|
public override bool OnBeforeCalloutDisplayed()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
// Set the locations for the suspect and victim
|
|
|
|
location_suspect = new Vector3(-111.19f, -8.28f, 70.52f);
|
|
|
|
location_suspect = new Vector3(-111.19f, -8.28f, 70.52f);
|
|
|
|
location_victim = new Vector3(-111.19f, -11f, 70.52f);
|
|
|
|
location_victim = new Vector3(-111.19f, -11f, 70.52f);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Show the callout area blip before accepting the callout
|
|
|
|
ShowCalloutAreaBlipBeforeAccepting(location_suspect, 30f);
|
|
|
|
ShowCalloutAreaBlipBeforeAccepting(location_suspect, 30f);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Set the callout message and position
|
|
|
|
CalloutMessage = "Domestic Violence";
|
|
|
|
CalloutMessage = "Domestic Violence";
|
|
|
|
CalloutPosition = location_suspect;
|
|
|
|
CalloutPosition = location_suspect;
|
|
|
|
Functions.PlayScannerAudioUsingPosition("WE_HAVE CRIME_RESISTING_ARREST_02 IN_OR_ON_POSITION", location_suspect);
|
|
|
|
|
|
|
|
|
|
|
|
// Play scanner audio to announce the callout
|
|
|
|
|
|
|
|
LSPD_First_Response.Mod.API.Functions.PlayScannerAudioUsingPosition("WE_HAVE CRIME_RESISTING_ARREST_02 IN_OR_ON_POSITION", location_suspect);
|
|
|
|
|
|
|
|
|
|
|
|
return base.OnBeforeCalloutDisplayed();
|
|
|
|
return base.OnBeforeCalloutDisplayed();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override bool OnCalloutAccepted()
|
|
|
|
public override bool OnCalloutAccepted()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
// Create relationship groups for the suspect and victim
|
|
|
|
new RelationshipGroup("Attacker");
|
|
|
|
new RelationshipGroup("Attacker");
|
|
|
|
new RelationshipGroup("Victims");
|
|
|
|
new RelationshipGroup("Victims");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Create the suspect and set properties
|
|
|
|
suspect = new Ped(location_suspect);
|
|
|
|
suspect = new Ped(location_suspect);
|
|
|
|
suspect.IsPersistent = true;
|
|
|
|
suspect.IsPersistent = true;
|
|
|
|
suspect.BlockPermanentEvents = true;
|
|
|
|
suspect.BlockPermanentEvents = true;
|
|
|
|
suspect.RelationshipGroup = "Attacker";
|
|
|
|
suspect.RelationshipGroup = "Attacker";
|
|
|
|
suspect.Inventory.GiveNewWeapon("WEAPON_NAVYREVOLVER", 1, true);
|
|
|
|
suspect.Inventory.GiveNewWeapon("WEAPON_NAVYREVOLVER", 1, true);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Create the victim and set properties
|
|
|
|
|
|
|
|
|
|
|
|
victim = new Ped(location_victim);
|
|
|
|
victim = new Ped(location_victim);
|
|
|
|
victim.IsPersistent = true;
|
|
|
|
victim.IsPersistent = true;
|
|
|
|
victim.BlockPermanentEvents = true;
|
|
|
|
victim.BlockPermanentEvents = true;
|
|
|
|
victim.RelationshipGroup = "Victims";
|
|
|
|
victim.RelationshipGroup = "Victims";
|
|
|
|
|
|
|
|
|
|
|
|
//Game.LocalPlayer.Character.RelationshipGroup = "Victims";
|
|
|
|
// Set the relationship between the suspect and victim to hate
|
|
|
|
|
|
|
|
Game.SetRelationshipBetweenRelationshipGroups("Attacker", "Victims", Relationship.Hate);
|
|
|
|
suspect.Tasks.StandStill(-1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Game.SetRelationshipBetweenRelationshipGroups("Attacker", "Victim", Relationship.Hate);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Attach blips to the suspect and victim
|
|
|
|
blip_suspect = suspect.AttachBlip();
|
|
|
|
blip_suspect = suspect.AttachBlip();
|
|
|
|
blip_suspect.Color = System.Drawing.Color.Red;
|
|
|
|
blip_suspect.Color = System.Drawing.Color.Red;
|
|
|
|
blip_suspect.IsRouteEnabled = true;
|
|
|
|
blip_suspect.IsRouteEnabled = true;
|
|
|
@ -70,27 +77,29 @@ namespace Code_Blue_Calls.Callouts
|
|
|
|
{
|
|
|
|
{
|
|
|
|
base.Process();
|
|
|
|
base.Process();
|
|
|
|
|
|
|
|
|
|
|
|
if (Game.LocalPlayer.Character.DistanceTo(suspect) < 40f && !ShotAtVictim && !SuspectKillingPlayer && !victim.IsDead)
|
|
|
|
// If the player is near the suspect and hasn't shot at the victim yet, make the suspect fight the victim
|
|
|
|
|
|
|
|
if (Game.LocalPlayer.Character.DistanceTo(suspect) < 40f && !shotAtVictim && !suspectKillingPlayer && !victim.IsDead)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
suspect.Tasks.FightAgainst(victim);
|
|
|
|
suspect.Tasks.FightAgainst(victim);
|
|
|
|
ShotAtVictim = true;
|
|
|
|
shotAtVictim = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Game.LocalPlayer.Character.DistanceTo(suspect) < 15f && !SuspectKillingPlayer)
|
|
|
|
// If the player is near the suspect and hasn't been attacked by the suspect yet, make the suspect attack the player
|
|
|
|
|
|
|
|
if (Game.LocalPlayer.Character.DistanceTo(suspect) < 15f && !suspectKillingPlayer)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//Give the suspect a weapon and make him attack the player
|
|
|
|
|
|
|
|
suspect.Tasks.Clear();
|
|
|
|
suspect.Tasks.Clear();
|
|
|
|
suspect.Inventory.EquippedWeapon.Ammo = 6;
|
|
|
|
suspect.Inventory.EquippedWeapon.Ammo = 6;
|
|
|
|
SuspectKillingPlayer = true;
|
|
|
|
suspectKillingPlayer = true;
|
|
|
|
suspect.Tasks.FightAgainst(Game.LocalPlayer.Character);
|
|
|
|
suspect.Tasks.FightAgainst(Game.LocalPlayer.Character);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// End the callout if the suspect is dead or cuffed
|
|
|
|
if (suspect.IsDead || suspect.IsCuffed)
|
|
|
|
if (suspect.IsDead || suspect.IsCuffed)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
End();
|
|
|
|
End();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If the suspect is still alive and the victim is null, create a new victim and make them fight the suspect
|
|
|
|
if (suspect.Exists() && victim == null)
|
|
|
|
if (suspect.Exists() && victim == null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
victim = new Ped(location_victim);
|
|
|
|
victim = new Ped(location_victim);
|
|
|
@ -98,17 +107,94 @@ namespace Code_Blue_Calls.Callouts
|
|
|
|
Game.DisplaySubtitle("Investigate the domestic violence report and neutralize the threat.", 5000);
|
|
|
|
Game.DisplaySubtitle("Investigate the domestic violence report and neutralize the threat.", 5000);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If the victim is dead, display a message to neutralize the suspect and end the callout
|
|
|
|
if (victim != null && victim.IsDead)
|
|
|
|
if (victim != null && victim.IsDead)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Game.DisplaySubtitle("The victim is dead. Neutralize the suspect.", 5000);
|
|
|
|
Game.DisplaySubtitle("The victim is dead. Neutralize the suspect.", 5000);
|
|
|
|
|
|
|
|
End();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Randomly determine the outcome of the callout
|
|
|
|
|
|
|
|
Random random = new Random();
|
|
|
|
|
|
|
|
int outcome = random.Next(1, 101);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (outcome <= 20)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// AG kills VI
|
|
|
|
|
|
|
|
if (!victim.IsDead)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
suspect.Tasks.FightAgainst(victim);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (outcome <= 30)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// AG kills VI and PL
|
|
|
|
|
|
|
|
if (!victim.IsDead)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
suspect.Tasks.FightAgainst(victim);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Game.LocalPlayer.Character.IsDead)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
suspect.Tasks.FightAgainst(Game.LocalPlayer.Character);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (outcome <= 35)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// AG kills VI and commits suicide
|
|
|
|
|
|
|
|
if (!victim.IsDead)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
suspect.Tasks.FightAgainst(victim);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!suspect.IsDead)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
suspect.Kill();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (outcome <= 50)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// AG kills PL
|
|
|
|
|
|
|
|
if (!Game.LocalPlayer.Character.IsDead)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
suspect.Tasks.FightAgainst(Game.LocalPlayer.Character);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (outcome <= 60)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// AG takes VI hostage
|
|
|
|
|
|
|
|
if (!victim.IsDead)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
suspect.Tasks.AimWeaponAt(victim, 999999);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (outcome <= 80)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// AG flees
|
|
|
|
|
|
|
|
if (!suspect.IsDead)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
suspect.Tasks.ReactAndFlee(Game.LocalPlayer.Character);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// AG is drunk and noncompliant, eventually flees on foot
|
|
|
|
|
|
|
|
if (!suspect.IsDead)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
suspect.Tasks.Wander();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void End()
|
|
|
|
public override void End()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
base.End();
|
|
|
|
base.End();
|
|
|
|
if (blip_suspect.Exists()) blip_suspect.Delete();
|
|
|
|
|
|
|
|
if (blip_victim.Exists()) blip_victim.Delete();
|
|
|
|
// Delete the suspect and victim blips if they exist
|
|
|
|
|
|
|
|
if (blip_suspect.Exists())
|
|
|
|
|
|
|
|
blip_suspect.Delete();
|
|
|
|
|
|
|
|
if (blip_victim.Exists())
|
|
|
|
|
|
|
|
blip_victim.Delete();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Dismiss the suspect if they exist
|
|
|
|
if (suspect.Exists())
|
|
|
|
if (suspect.Exists())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
suspect.Dismiss();
|
|
|
|
suspect.Dismiss();
|
|
|
|