public MyDroneStrafeBehaviour(MyRemoteControl remoteControl, string presetName, bool activate, List <MyEntity> waypoints, List <DroneTarget> targets, int playerPriority, TargetPrioritization prioritizationStyle, float maxPlayerDistance, bool cycleWaypoints)
        {
            m_remoteControl  = remoteControl;
            m_returnPosition = m_remoteControl.PositionComp.GetPosition();

            MySpaceStrafeData strafeData = MySpaceStrafeDataStatic.LoadPreset(presetName);

            m_currentPreset = presetName;
            LoadStrafeData(strafeData);

            m_lastTargetUpdate      = MySandboxGame.TotalGamePlayTimeInMilliseconds;
            m_lastWeaponUpdate      = m_lastTargetUpdate;
            m_waypointReachedTimeMs = m_lastTargetUpdate;
            m_forcedWaypoints       = waypoints != null ? waypoints : new List <MyEntity>();
            m_targetsList           = targets != null ? targets : new List <DroneTarget>();
            PlayerPriority          = playerPriority;
            m_prioritizationStyle   = prioritizationStyle;
            MaxPlayerDistance       = maxPlayerDistance;
            m_cycleWaypoints        = cycleWaypoints;

            NeedUpdate = activate;
        }
        public void Load(MyObjectBuilder_AutomaticBehaviour objectBuilder, MyRemoteControl remoteControl)
        {
            MyObjectBuilder_DroneStrafeBehaviour builder = objectBuilder as MyObjectBuilder_DroneStrafeBehaviour;

            if (builder != null)
            {
                m_remoteControl = remoteControl;

                MySpaceStrafeData strafeData = MySpaceStrafeDataStatic.LoadPreset(builder.CurrentPreset);
                m_currentPreset = builder.CurrentPreset;
                LoadStrafeData(strafeData);

                m_lastTargetUpdate      = MySandboxGame.TotalGamePlayTimeInMilliseconds;
                m_lastWeaponUpdate      = m_lastTargetUpdate;
                m_waypointReachedTimeMs = m_lastTargetUpdate;

                m_forcedWaypoints   = new List <MyEntity>();
                m_loadWaypointList  = builder.WaypointList;
                m_targetsList       = new List <DroneTarget>();
                m_loadTargetList    = builder.TargetList;
                m_currentTarget     = null;
                m_loadCurrentTarget = builder.CurrentTarget;

                m_returnPosition              = builder.ReturnPosition;
                PlayerPriority                = builder.PlayerPriority;
                m_prioritizationStyle         = builder.PrioritizationStyle;
                MaxPlayerDistance             = builder.MaxPlayerDistance;
                m_cycleWaypoints              = builder.CycleWaypoints;
                m_alternativebehaviorSwitched = builder.AlternativebehaviorSwitched;
                CollisionAvoidance            = builder.CollisionAvoidance;
                m_canSkipWaypoint             = builder.CanSkipWaypoint;

                NeedUpdate     = builder.NeedUpdate;
                IsActive       = builder.IsActive;
                m_loadEntities = true;
            }
        }
        //checks if it has usable weapons and use them if necessary or ram player if weapons are unusable
        private void WeaponsUpdate(float distSq)
        {
            bool suicide = m_canBeDisabled;

            m_shooting = false;
            bool hasNonStationaryWeapons = false;

            if (m_weapons != null && m_weapons.Count > 0)
            {
                foreach (var weapon in m_weapons)
                {
                    if (!weapon.Enabled && weapon.IsFunctional)
                    {
                        suicide = false;
                        if (!weapon.IsStationary())
                        {
                            hasNonStationaryWeapons = true;
                        }
                        continue;
                    }

                    MyGunStatusEnum status;
                    if (weapon.CanOperate() && weapon.CanShoot(out status) && status == MyGunStatusEnum.OK)
                    {
                        suicide = false;
                        if (m_useStaticWeaponry && weapon.IsStationary())
                        {
                            if (m_remoteControl.TargettingAimDelta <= 0.05f && distSq < m_staticWeaponryUsageSq && distSq >= 0 && m_canRotateToTarget)
                            {
                                weapon.SetShooting(true);
                                m_shooting = true;
                            }
                            else
                            {
                                weapon.SetShooting(false);
                            }
                        }
                        if (!weapon.IsStationary())
                        {
                            hasNonStationaryWeapons = true;
                        }
                    }
                }
            }
            if (m_tools != null && m_tools.Count > 0)
            {
                foreach (var tool in m_tools)
                {
                    if (tool.IsFunctional)
                    {
                        suicide = false;
                        if (m_useTools)
                        {
                            if (distSq < m_toolsUsageSq && distSq >= 0 && m_canRotateToTarget)
                            {
                                tool.Enabled = true;
                            }
                            else
                            {
                                tool.Enabled = false;
                            }
                        }
                    }
                }
            }
            m_operational = !suicide;
            if (suicide)
            {
                m_rotateToTarget = true;
                m_weapons.Clear();
                m_tools.Clear();
                if (m_remoteControl.HasWaypoints())
                {
                    m_remoteControl.ClearWaypoints();
                }
                NeedUpdate = true;
                m_forcedWaypoints.Clear();
            }
            if (!hasNonStationaryWeapons && !m_alternativebehaviorSwitched)
            {
                m_rotateToTarget = true;
                if (m_alternativeBehavior.Length > 0)
                {
                    MySpaceStrafeData strafeData = MySpaceStrafeDataStatic.LoadPreset(m_alternativeBehavior);
                    LoadStrafeData(strafeData);
                    m_currentPreset = m_alternativeBehavior;
                }
                m_alternativebehaviorSwitched = true;
            }
        }