//A: Found Target (Approach) //B: Lost Target (Still Approach) //C: Lost Target (Go To Despawn) //D: Engage Target //E: Engage In Range //F: Engage Out Range public override void MainBehavior() { if (RAI_SessionCore.IsServer == false) { return; } base.MainBehavior(); //Logger.MsgDebug(Mode.ToString(), DebugTypeEnum.General); if (Mode != BehaviorMode.Retreat && Despawn.DoRetreat == true) { ChangeCoreBehaviorMode(BehaviorMode.Retreat); AutoPilot.ActivateAutoPilot(this.RemoteControl.GetPosition(), NewAutoPilotMode.RotateToWaypoint | NewAutoPilotMode.ThrustForward | NewAutoPilotMode.PlanetaryPathing | AutoPilot.UserCustomMode); } if (Mode == BehaviorMode.Init) { if (Settings.DespawnCoords == Vector3D.Zero) { Settings.DespawnCoords = MESApi.GetDespawnCoords(RemoteControl.SlimBlock.CubeGrid); if (Settings.DespawnCoords == Vector3D.Zero) { Settings.DespawnCoords = AutoPilot.CalculateDespawnCoords(this.RemoteControl.GetPosition()); } } ReturnToDespawn(); } if (BehaviorActionA && Mode != BehaviorMode.EngageTarget) { //Logger.MsgDebug("Hunter BehaviorActionA Triggered", DebugTypeEnum.General); BehaviorActionA = false; if (Settings.LastDamagerEntity != 0) { //Logger.MsgDebug("Damager Entity Id Valid" + Settings.LastDamagerEntity.ToString(), DebugTypeEnum.General); IMyEntity tempEntity = null; if (MyAPIGateway.Entities.TryGetEntityById(Settings.LastDamagerEntity, out tempEntity)) { //Logger.MsgDebug("Damager Entity Valid", DebugTypeEnum.General); var parentEnt = tempEntity.GetTopMostParent(); if (parentEnt != null) { //Logger.MsgDebug("Damager Parent Entity Valid", DebugTypeEnum.General); var gridGroup = MyAPIGateway.GridGroups.GetGroup(RemoteControl.SlimBlock.CubeGrid, GridLinkTypeEnum.Physical); bool isSameGridConstrust = false; foreach (var grid in gridGroup) { if (grid.EntityId == tempEntity.GetTopMostParent().EntityId) { //Logger.MsgDebug("Damager Parent Entity Was Same Grid", DebugTypeEnum.General); isSameGridConstrust = true; break; } } if (!isSameGridConstrust) { //Logger.MsgDebug("Damager Parent Entity Was External", DebugTypeEnum.General); AutoPilot.Targeting.ForceTargetEntityId = parentEnt.EntityId; AutoPilot.Targeting.ForceTargetEntity = parentEnt; AutoPilot.Targeting.ForceRefresh = true; AutoPilot.SetAutoPilotDataMode(AutoPilotDataMode.Secondary); AutoPilot.ActivateAutoPilot(this.RemoteControl.GetPosition(), NewAutoPilotMode.RotateToWaypoint | NewAutoPilotMode.ThrustForward | NewAutoPilotMode.PlanetaryPathing | NewAutoPilotMode.WaypointFromTarget | AutoPilot.UserCustomMode); ChangeCoreBehaviorMode(BehaviorMode.ApproachTarget); Logger.MsgDebug("Hunter Approaching Potential Target From Damage", DebugTypeEnum.BehaviorSpecific); return; } } } } } if (Mode == BehaviorMode.ApproachWaypoint) { var time = MyAPIGateway.Session.GameDateTime - _checkActiveTargetTimer; if (time.TotalSeconds > TimeBetweenNewTargetChecks) { _checkActiveTargetTimer = MyAPIGateway.Session.GameDateTime; if (AutoPilot.Targeting.HasTarget()) { ChangeCoreBehaviorMode(BehaviorMode.ApproachTarget); _lostTargetTimer = MyAPIGateway.Session.GameDateTime; BehaviorTriggerA = true; AutoPilot.SetAutoPilotDataMode(AutoPilotDataMode.Secondary); AutoPilot.ActivateAutoPilot(this.RemoteControl.GetPosition(), NewAutoPilotMode.RotateToWaypoint | NewAutoPilotMode.ThrustForward | NewAutoPilotMode.PlanetaryPathing | NewAutoPilotMode.WaypointFromTarget | AutoPilot.UserCustomMode); Logger.MsgDebug("Hunter Approaching Potential Target", DebugTypeEnum.BehaviorSpecific); } } } if (Mode == BehaviorMode.ApproachTarget) { if (!AutoPilot.Targeting.HasTarget()) { AutoPilot.SetInitialWaypoint(AutoPilot.Targeting.TargetLastKnownCoords); var time = MyAPIGateway.Session.GameDateTime - _lostTargetTimer; if (time.TotalSeconds > LostTargetTimerTrigger) { Logger.MsgDebug("Hunter Returning To Despawn", DebugTypeEnum.BehaviorSpecific); ReturnToDespawn(); return; } return; } _lostTargetTimer = MyAPIGateway.Session.GameDateTime; bool engageTarget = false; var targetDist = Vector3D.Distance(RemoteControl.GetPosition(), AutoPilot.Targeting.TargetLastKnownCoords); //Check Turret if (EngageOnWeaponActivation == true) { if (AutoPilot.Weapons.GetTurretTarget() != 0) { Logger.MsgDebug("Hunter Turrets Detected Target", DebugTypeEnum.BehaviorSpecific); engageTarget = true; } } //Check Visual Range if (!engageTarget && EngageOnCameraDetection && targetDist < CameraDetectionMaxRange) { if (Grid.RaycastGridCheck(AutoPilot.Targeting.TargetLastKnownCoords)) { Logger.MsgDebug("Hunter Raycast Target Success", DebugTypeEnum.BehaviorSpecific); } engageTarget = true; } //Check Collision Data if (!engageTarget && EngageOnTargetLineOfSight && AutoPilot.Targeting.Data.MaxLineOfSight > 0 && AutoPilot.Collision.TargetResult.HasTarget(AutoPilot.Targeting.Data.MaxLineOfSight)) { if (AutoPilot.Targeting.Target.GetParentEntity().EntityId == AutoPilot.Collision.TargetResult.GetCollisionEntity().EntityId) { Logger.MsgDebug("Hunter Has Line of Sight to Target", DebugTypeEnum.BehaviorSpecific); engageTarget = true; } } if (engageTarget) { Logger.MsgDebug("Hunter Engaging Target", DebugTypeEnum.BehaviorSpecific); BehaviorTriggerD = true; ChangeCoreBehaviorMode(BehaviorMode.EngageTarget); } } //Engage if (Mode == BehaviorMode.EngageTarget) { if (AutoPilot.Targeting.HasTarget()) { var targetDist = Vector3D.Distance(RemoteControl.GetPosition(), AutoPilot.Targeting.TargetLastKnownCoords); if (!_inRange) { if (targetDist < (AutoPilot.InGravity() ? AutoPilot.Data.EngageDistancePlanet : AutoPilot.Data.EngageDistanceSpace)) { Logger.MsgDebug("Hunter Within Engage Range", DebugTypeEnum.BehaviorSpecific); _inRange = true; BehaviorTriggerE = true; AutoPilot.ActivateAutoPilot(this.RemoteControl.GetPosition(), NewAutoPilotMode.RotateToWaypoint | NewAutoPilotMode.Strafe | NewAutoPilotMode.WaypointFromTarget | AutoPilot.UserCustomMode); } } else { if (targetDist > (AutoPilot.InGravity() ? AutoPilot.Data.DisengageDistancePlanet : AutoPilot.Data.DisengageDistanceSpace)) { Logger.MsgDebug("Hunter Outside Engage Range", DebugTypeEnum.BehaviorSpecific); _inRange = false; BehaviorTriggerF = true; AutoPilot.ActivateAutoPilot(this.RemoteControl.GetPosition(), NewAutoPilotMode.RotateToWaypoint | NewAutoPilotMode.ThrustForward | NewAutoPilotMode.PlanetaryPathing | NewAutoPilotMode.WaypointFromTarget | AutoPilot.UserCustomMode); } } } else { Logger.MsgDebug("Hunter Lost Target While Engaging", DebugTypeEnum.BehaviorSpecific); BehaviorTriggerB = true; _inRange = false; AutoPilot.ActivateAutoPilot(this.RemoteControl.GetPosition(), NewAutoPilotMode.RotateToWaypoint | NewAutoPilotMode.ThrustForward | NewAutoPilotMode.PlanetaryPathing | NewAutoPilotMode.WaypointFromTarget | AutoPilot.UserCustomMode); ChangeCoreBehaviorMode(BehaviorMode.ApproachTarget); } } //Retreat if (Mode == BehaviorMode.Retreat) { if (Despawn.NearestPlayer?.Controller?.ControlledEntity?.Entity != null) { //Logger.AddMsg("DespawnCoordsCreated", true); AutoPilot.SetInitialWaypoint(VectorHelper.GetDirectionAwayFromTarget(this.RemoteControl.GetPosition(), Despawn.NearestPlayer.GetPosition()) * 1000 + this.RemoteControl.GetPosition()); } } }