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; } }