using System; using System.Linq; using Rage; using LSPD_First_Response.Mod.API; using LSPD_First_Response.Mod.Callouts; using CalloutInterfaceAPI; using System.Collections.Generic; using DialogueSystem; using CalloutInterface; using LSPD_First_Response.Engine; namespace Code_Blue_Calls.Callouts { [CalloutInterface("Domestic Violence", CalloutProbability.Medium, "Code 3", "LSPD")] public class DomesticViolence : Callout { private Ped victim, suspect; private Blip blip_suspect, blip_victim; private Vector3 location_suspect, location_victim; private Vector3 GetClosestHouse(List houses) { Vector3 playerPosition = Game.LocalPlayer.Character.Position; Vector3 closestHouse = Vector3.Zero; float closestDistance = float.MaxValue; foreach (Vector3 house in houses) { float distance = Vector3.Distance(playerPosition, house); if (distance < closestDistance) { closestHouse = house; closestDistance = distance; } } return closestHouse; } // I don't know what im doing private class House { public Vector3 Position; public List Victims { get; set; } public List Suspects { get; set; } public string Name; } public override bool OnBeforeCalloutDisplayed() { // This is stupid and will get replaced with a list containing a list with the suspect and the victim and its gonna be per house List location_suspect = new List { new Vector3() }; //This is a list of all the houses/interiors //This is used for getting the closest house to the player so its not random and he/she doesn't have to go to the other side of the map List houses = new List { new Vector3(1276.979f, -1725.641f, 54.65f), //Lester's place new Vector3(249.1075f, -1720.578f, 29.16469f), //Generic house new Vector3(-775.9423f, 291.741f, 85.38015f), //West eclips towers new Vector3(-131.3567f, -32.02588f, 57.84212f), //Janitors house new Vector3(-66.24619f, -574.7697f, 36.95814f), //4 integrity way (players apt.) new Vector3(-13.93472f, -1455.081f, 30.4537f), //Franklin new Vector3(-616.9177f, 22.83247f, 41.47743f), //Strangeways new Vector3(-178.65f, 507.2562f, 136.0046f), //Wild oats new Vector3(-553.8226f, 666.5585f, 144.6216f), //Normandy new Vector3(1122.733f, 2647.359f, 37.99636f), //Vespuci aka sandy motel }; List houses1 = new List { new House { Name = "Lesterhouse", Victims = new List { new Vector3(1273.748f, -1709.831f, 54.77149f) }, Suspects = new List { new Vector3(1274.567f, -1713.383f, 54.77149f) }, Position = new Vector3(1276.979f, -1725.641f, 54.65f) }, new House { Name = "Generic House", Victims = new List { new Vector3(264.6913f, -997.2188f, -99.00867f) }, Suspects = new List { new Vector3(261.1124f, -998.8026f, -99.00865f) }, Position = new Vector3(249.1075f, -1720.578f, 29.16469f) }, new House { Name = "Frankiln house old", Victims = new List { new Vector3(-11.18673f, -1429.365f, 31.10147f) }, Suspects = new List { new Vector3(-10.82392f, -1438.442f, 31.10153f) }, Position = new Vector3(-13.93472f, -1455.081f, 30.4537f) }, new House { Name = "Med rich apt.", } }; // Choose the closest house to the player. This isn't really optimal as if the player isn't patrolling and doing radar or some other thing wich involves being in one place // Then the player will get the same house again and again Vector3 SpawnPoint = GetClosestHouse(houses); // Not needed as My code isn't goofy and doesn't set the callout position to the other side of the map //AddMaximumDistanceCheck(600f, SpawnPoint); //Player must be 600m or closer ShowCalloutAreaBlipBeforeAccepting(SpawnPoint, 30f); CalloutMessage = "Domestic Violence"; CalloutPosition = SpawnPoint; LSPD_First_Response.Mod.API.Functions.PlayScannerAudioUsingPosition("WE_HAVE CRIME_RESISTING_ARREST_02 IN_OR_ON_POSITION", SpawnPoint); return base.OnBeforeCalloutDisplayed(); } public override bool OnCalloutAccepted() { new RelationshipGroup("Attacker"); new RelationshipGroup("Victims"); suspect = new Ped(location_suspect); suspect.IsPersistent = true; suspect.BlockPermanentEvents = true; suspect.RelationshipGroup = "Attacker"; suspect.Inventory.GiveNewWeapon("WEAPON_NAVYREVOLVER", 1, true); victim = new Ped(location_victim); victim.IsPersistent = true; victim.BlockPermanentEvents = true; victim.RelationshipGroup = "Victims"; //Game.LocalPlayer.Character.RelationshipGroup = "Victims"; suspect.Tasks.StandStill(-1); Game.SetRelationshipBetweenRelationshipGroups("Attacker", "Victim", Relationship.Hate); blip_suspect = suspect.AttachBlip(); blip_suspect.Color = System.Drawing.Color.Red; blip_suspect.IsRouteEnabled = true; blip_victim = victim.AttachBlip(); blip_victim.Color = System.Drawing.Color.Green; blip_victim.IsRouteEnabled = false; return base.OnCalloutAccepted(); } public override void Process() { base.Process(); if (Game.LocalPlayer.Character.DistanceTo(suspect) < 40f && !ShotAtVictim && !SuspectKillingPlayer && !victim.IsDead) { suspect.Tasks.FightAgainst(victim); ShotAtVictim = true; } if (Game.LocalPlayer.Character.DistanceTo(suspect) < 15f && !SuspectKillingPlayer) { //Give the suspect a weapon and make him attack the player suspect.Tasks.Clear(); suspect.Inventory.EquippedWeapon.Ammo = 6; SuspectKillingPlayer = true; suspect.Tasks.FightAgainst(Game.LocalPlayer.Character); } if (suspect.IsDead || suspect.IsCuffed) { End(); } if (suspect.Exists() && victim == null) { victim = new Ped(location_victim); victim.Tasks.FightAgainst(suspect); Game.DisplaySubtitle("Investigate the domestic violence report and neutralize the threat.", 5000); } if (victim != null && victim.IsDead) { Game.DisplaySubtitle("The victim is dead. Neutralize the suspect.", 5000); } } public override void End() { base.End(); if (blip_suspect.Exists()) blip_suspect.Delete(); if (blip_victim.Exists()) blip_victim.Delete(); if (suspect.Exists()) { suspect.Dismiss(); } } } }