I'm having some issues regarding tasks in my callout.
Whenever I set the task to do anything, it is always interrupted when I come to close and the Ped/Suspect starts running away in panic.
In this case I'm trying to make the suspect flee the player, and if he gets too close, start shooting at him instead. But, when the player gets close, the ped starts running away.
I have set the Suspects "BlockPermanentEvents" to true, but it doesn't fix my issue.
My current code looks like this:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LSPD_First_Response;
using LSPD_First_Response.Engine.Scripting.Entities;
using LSPD_First_Response.Mod.API;
using LSPD_First_Response.Mod.Callouts;
using Rage;
namespace Shroom.Callouts
{
[CalloutInfo("Panic Button", CalloutProbability.Always)]
public class PanicButton : Callout
{
private Ped attacker;
private Blip attackerBlip;
private Vector3 calloutSpawn;
private LHandle pursuit;
enum AttackerStatus
{
None, Attacking, Running
}
private AttackerStatus attackerStatus;
public override bool OnBeforeCalloutDisplayed()
{
calloutSpawn = World.GetNextPositionOnStreet(Game.LocalPlayer.Character.Position.Around(250f));
ShowCalloutAreaBlipBeforeAccepting(calloutSpawn, 30f);
AddMinimumDistanceCheck(20f, calloutSpawn);
CalloutMessage = "Panic Button";
CalloutPosition = calloutSpawn;
Functions.PlayScannerAudioUsingPosition("UNITS_RESPOND_CODE_99_01", CalloutPosition);
return base.OnBeforeCalloutDisplayed();
}
public override bool OnCalloutAccepted()
{
attacker = new Ped(calloutSpawn, 0f);
attackerBlip = new Blip(attacker);
attackerBlip.IsFriendly = false;
attacker.IsPersistent = true;
attacker.KeepTasks = true;
attacker.BlockPermanentEvents = true;
attacker.CanAttackFriendlies = true;
pursuit = Functions.CreatePursuit();
Functions.AddPedToPursuit(pursuit, attacker);
Functions.SetPursuitCopsCanJoin(pursuit, true);
Functions.SetPursuitIsActiveForPlayer(pursuit, true);
attacker.Inventory.GiveNewWeapon(WeaponHash.Pistol, 100, true);
return base.OnCalloutAccepted();
}
public override void Process()
{
base.Process();
if (attacker.Exists())
{
if (Functions.IsPedArrested(attacker) || Functions.IsPedInPrison(attacker))
{
End();
}
}
if (!Functions.IsPursuitStillRunning(pursuit))
{
End();
}
if (attackerStatus == AttackerStatus.None)
{
attackerStatus = AttackerStatus.Running;
attacker.Tasks.Flee(Game.LocalPlayer.Character, int.MaxValue, int.MaxValue);
}
else if(attackerStatus == AttackerStatus.Running && Game.LocalPlayer.Character.Position.DistanceTo(attacker.Position) < 20f)
{
Vector3 firingPosition = new Vector3(Game.LocalPlayer.Character.Position.X, Game.LocalPlayer.Character.Position.Y - 10f, Game.LocalPlayer.Character.Position.Z);
attackerStatus = AttackerStatus.Attacking;
attacker.Tasks.FireWeaponAt(firingPosition, int.MaxValue, FiringPattern.SingleShot);
}
}
public override void End()
{
base.End();
if (attacker.Exists())
{
attacker.Dismiss();
if (attackerBlip.Exists())
attackerBlip.Delete();
}
}
}
}