public void UseExistingSettings(BossEncounter newData)
 {
     this.SpawnGroupName     = newData.SpawnGroupName;
     this.SpawnGroup         = SpawnGroupManager.GetSpawnGroupByName(this.SpawnGroupName);
     this.Type               = newData.Type;
     this.Position           = newData.Position;
     this.PlayersInEncounter = newData.PlayersInEncounter;
     this.Timer              = newData.Timer;
     this.SpawnAttempts      = newData.SpawnAttempts;
     this.PlayerGPSHashes    = newData.PlayerGPSHashes;
 }
        public bool CreateGpsForPlayers()
        {
            this.SpawnGroup = SpawnGroupManager.GetSpawnGroupByName(this.SpawnGroupName);

            if (this.SpawnGroup == null)
            {
                return(false);
            }

            var playerList = new List <IMyPlayer>();

            MyAPIGateway.Players.GetPlayers(playerList);
            var bossGps = MyAPIGateway.Session.GPS.Create(this.SpawnGroup.BossCustomGPSLabel, "", this.Position, true);



            foreach (var player in playerList)
            {
                if (player.IsBot == true)
                {
                    continue;
                }

                if (this.PlayersInEncounter.Contains(player.IdentityId) == false)
                {
                    continue;
                }

                MyAPIGateway.Session.GPS.AddGps(player.IdentityId, bossGps);
                MyVisualScriptLogicProvider.SetGPSColor(this.SpawnGroup.BossCustomGPSLabel, new Color(255, 0, 255), player.IdentityId);

                if (PlayerGPSHashes.ContainsKey(player.IdentityId) == true)
                {
                    PlayerGPSHashes[player.IdentityId] = bossGps.Hash;
                }
                else
                {
                    PlayerGPSHashes.Add(player.IdentityId, bossGps.Hash);
                }
            }

            return(true);
        }
        public void SetupScript()
        {
            Logger.AddMsg("Loading Settings From Spawner Version: " + ModVersion.ToString());

            //Save File Validation
            SaveName = MyAPIGateway.Session.Name;

            //Some Faction BS - Temporary
            if (1 == 0)
            {
                var factions = MyDefinitionManager.Static.GetDefaultFactions();
                var sb       = new StringBuilder();
                sb.Append("Faction Data: ").AppendLine().AppendLine();

                foreach (var faction in factions)
                {
                    sb.Append(faction.Tag).AppendLine();
                    sb.Append(faction.DefaultRelation).AppendLine();
                    sb.Append(faction.DefaultRelationToPlayers).AppendLine().AppendLine();
                }

                Logger.AddMsg(sb.ToString());
            }

            //Rival AI Stuff
            Logger.AddMsg("Initializing RivalAI Helper");
            RivalAIHelper.SetupRivalAIHelper();

            //Setup Watchers and Handlers
            MyAPIGateway.Multiplayer.RegisterMessageHandler(8877, ChatCommand.MESMessageHandler);
            MyAPIGateway.Utilities.MessageEntered += ChatCommand.MESChatCommand;
            var thisPlayer = MyAPIGateway.Session.LocalHumanPlayer;

            //Disable Vanilla Spawners
            Logger.AddMsg("Checking World Settings.");
            if (MyAPIGateway.Session.SessionSettings.CargoShipsEnabled == true)
            {
                Logger.AddMsg("Disabling Cargo Ships World Setting. Spawner Handles This Functionality.");
                MyAPIGateway.Session.SessionSettings.CargoShipsEnabled = false;
            }

            if (MyAPIGateway.Session.SessionSettings.EnableEncounters == true)
            {
                Logger.AddMsg("Disabling Random Encounters World Setting. Spawner Handles This Functionality.");
                MyAPIGateway.Session.SessionSettings.EnableEncounters = false;
            }

            /*
             * if(MyAPIGateway.Multiplayer.IsServer == false){
             *
             *      if(thisPlayer == null){
             *
             *              Logger.AddMsg("Player Doesn't Exist. Cannot Search For Existing Boss GPS.");
             *              return;
             *
             *      }
             *
             *      Logger.AddMsg("Searching For Existing Boss Encounter GPS.");
             *      var chatMsg = "MESClientGetBossGPS\n" + thisPlayer.IdentityId.ToString() + "\n" + thisPlayer.SteamUserId.ToString() + "\n" + "Msg";
             *      var sendData = MyAPIGateway.Utilities.SerializeToBinary<string>(chatMsg);
             *      var sendMsg = MyAPIGateway.Multiplayer.SendMessageToServer(8877, sendData);
             *
             *      return;
             *
             * }
             */

            //All Block SubtypeIds
            try{
                var allDefs = MyDefinitionManager.Static.GetAllDefinitions();

                foreach (MyDefinitionBase definition in allDefs.Where(x => x is MyCubeBlockDefinition))
                {
                    var blockDef = definition as MyCubeBlockDefinition;
                    SpawnResources.BlockDefinitionIdList.Add(definition.Id.SubtypeName);

                    if (ChatCommand.BlockDefinitionList.Contains(blockDef) == false)
                    {
                        ChatCommand.BlockDefinitionList.Add(blockDef);
                    }
                }
            }catch (Exception exc) {
                Logger.AddMsg("Something Failed While Building List Of CubeBlock SubtypeIds.");
            }


            //Drop Containers Names
            var dropContainerErrorLog = new StringBuilder();

            try{
                dropContainerErrorLog.Append("Getting List of DropContainer Definitions").AppendLine();
                var dropContainerDefs = MyDefinitionManager.Static.GetDropContainerDefinitions();
                dropContainerErrorLog.Append("Beginning Loop Of Definition List").AppendLine();

                foreach (var dropContainer in dropContainerDefs.Keys)
                {
                    dropContainerErrorLog.Append("Checking Drop Container Prefab: ").Append(dropContainerDefs[dropContainer].Id.SubtypeName).AppendLine();

                    foreach (var grid in dropContainerDefs[dropContainer].Prefab.CubeGrids)
                    {
                        dropContainerErrorLog.Append("Checking Drop Container Prefab Name...").AppendLine();
                        if (string.IsNullOrEmpty(grid.DisplayName) == true)
                        {
                            dropContainerErrorLog.Append("Prefab Grid Name Null Or Empty - Skipping").AppendLine();
                            continue;
                        }

                        dropContainerErrorLog.Append("Added Prefab Grid Name To DropContainerNames: ").Append(grid.DisplayName).AppendLine();
                        NPCWatcher.DropContainerNames.Add(grid.DisplayName);
                    }
                }
            }catch (Exception exc) {
                Logger.AddMsg("Something Failed While Building List Of Drop Container (Unknown Signal) Prefab Names. See Below:");
                Logger.AddMsg(dropContainerErrorLog.ToString());
            }

            //Economy Stations

            Logger.AddMsg("The Following Economy Stations Will Not Be Monitored By Spawner Mod:", true);
            try {
                NPCWatcher.EconomyStationNames.Add("Economy_MiningStation_1");
                NPCWatcher.EconomyStationNames.Add("Economy_MiningStation_2");
                NPCWatcher.EconomyStationNames.Add("Economy_MiningStation_3");
                NPCWatcher.EconomyStationNames.Add("Economy_OrbitalStation_1");
                NPCWatcher.EconomyStationNames.Add("Economy_OrbitalStation_2");
                NPCWatcher.EconomyStationNames.Add("Economy_OrbitalStation_3");
                NPCWatcher.EconomyStationNames.Add("Economy_OrbitalStation_4");
                NPCWatcher.EconomyStationNames.Add("Economy_Outpost_1");
                NPCWatcher.EconomyStationNames.Add("Economy_Outpost_2");
                NPCWatcher.EconomyStationNames.Add("Economy_Outpost_3");
                NPCWatcher.EconomyStationNames.Add("Economy_Outpost_4");
                NPCWatcher.EconomyStationNames.Add("Economy_Outpost_5");
                NPCWatcher.EconomyStationNames.Add("Economy_Outpost_6");
                NPCWatcher.EconomyStationNames.Add("Economy_Outpost_7");
                NPCWatcher.EconomyStationNames.Add("Economy_SpaceStation_1");
                NPCWatcher.EconomyStationNames.Add("Economy_SpaceStation_2");
                NPCWatcher.EconomyStationNames.Add("Economy_SpaceStation_3");
                NPCWatcher.EconomyStationNames.Add("Economy_SpaceStation_4");
                NPCWatcher.EconomyStationNames.Add("Economy_SpaceStation_5");

                /*
                 * var ecoStationsDefs = new List<MyStationsListDefinition>(MyDefinitionManager.Static.GetDefinitionsOfType<MyStationsListDefinition>().ToList());
                 *
                 * foreach(var station in ecoStationsDefs) {
                 *
                 *  foreach(var stationPrefabName in station.StationNames) {
                 *
                 *      var stationNameString = stationPrefabName.ToString();
                 *
                 *      if(string.IsNullOrWhiteSpace(stationNameString) == true) {
                 *
                 *          continue;
                 *
                 *      }
                 *
                 *      if(NPCWatcher.EconomyStationNames.Contains(stationNameString) == false) {
                 *
                 *          NPCWatcher.EconomyStationNames.Add(stationNameString);
                 *          Logger.AddMsg("Economy Station: " + stationNameString);
                 *
                 *      }
                 *
                 *  }
                 *
                 * }
                 */
            } catch (Exception exc) {
                Logger.AddMsg("Something Failed While Building List Of Economy Station Prefab Names. See Below:");
                Logger.AddMsg(dropContainerErrorLog.ToString());
            }

            Logger.AddMsg("Registering Mod Message Handlers.");
            Logger.AddMsg("Mod Channel: " + MyAPIGateway.Utilities.GamePaths.ModScopeName);
            MyAPIGateway.Utilities.RegisterMessageHandler(1521905890, ModMessages.ModMessageHandler);
            MyAPIGateway.Utilities.RegisterMessageHandler(1521905890001, ModMessages.ModMessageReceiverBlockReplace);
            MyAPIGateway.Utilities.RegisterMessageHandler(1521905890002, ModMessages.ModMessageReceiverSpawnRequest);
            MyAPIGateway.Utilities.RegisterMessageHandler(1521905890003, ModMessages.ModMessageReceiverRivalAISpawnRequest);
            Logger.AddMsg("Initiating Main Settings.");
            Settings.InitSettings();
            NPCWatcher.InitFactionData();
            SpawnResources.PopulateNpcFactionLists();
            TerritoryManager.TerritoryRefresh();
            SpawnGroupManager.CreateSpawnLists();

            string[] uniqueSpawnedArray = new string[0];
            if (MyAPIGateway.Utilities.GetVariable <string[]>("MES-UniqueGroupsSpawned", out uniqueSpawnedArray) == true)
            {
                SpawnGroupManager.UniqueGroupsSpawned = new List <string>(uniqueSpawnedArray.ToList());
            }
            else
            {
                Logger.AddMsg("Failed To Retrieve Previously Spawned Unique Encounters List or No Unique Encounters Have Spawned Yet.");
            }

            //Setup Existing Boss Encounters
            string storedBossData = "";

            if (MyAPIGateway.Utilities.GetVariable <string>("MES-ActiveBossEncounters", out storedBossData) == true)
            {
                if (storedBossData != "")
                {
                    try{
                        var byteArray  = Convert.FromBase64String(storedBossData);
                        var storedData = MyAPIGateway.Utilities.SerializeFromBinary <BossEncounter[]>(byteArray);
                        NPCWatcher.BossEncounters = new List <BossEncounter>(storedData.ToList());
                        bool listChange = false;

                        if (NPCWatcher.BossEncounters.Count > 0)
                        {
                            for (int i = NPCWatcher.BossEncounters.Count - 1; i >= 0; i--)
                            {
                                var bossEncounter = NPCWatcher.BossEncounters[i];
                                bossEncounter.SpawnGroup = SpawnGroupManager.GetSpawnGroupByName(bossEncounter.SpawnGroupName);

                                if (bossEncounter.SpawnGroup == null)
                                {
                                    bossEncounter.RemoveGpsForPlayers();
                                    listChange = true;
                                    NPCWatcher.BossEncounters.RemoveAt(i);
                                }
                            }
                        }

                        if (listChange == true)
                        {
                            if (NPCWatcher.BossEncounters.Count > 0)
                            {
                                BossEncounter[] encounterArray = NPCWatcher.BossEncounters.ToArray();
                                byteArray      = MyAPIGateway.Utilities.SerializeToBinary <BossEncounter[]>(encounterArray);
                                storedBossData = Convert.ToBase64String(byteArray);
                                MyAPIGateway.Utilities.SetVariable <string>("MES-ActiveBossEncounters", storedBossData);
                            }
                            else
                            {
                                MyAPIGateway.Utilities.SetVariable <string>("MES-ActiveBossEncounters", "");
                            }
                        }
                    }catch (Exception e) {
                        Logger.AddMsg("Something went wrong while getting Boss Encounter Data from Storage.");
                        Logger.AddMsg(e.ToString(), true);
                    }
                }
            }

            //Get Active Mods
            Logger.AddMsg("Getting Active Mods.");
            foreach (var mod in MyAPIGateway.Session.Mods)
            {
                if (mod.PublishedFileId != 0)
                {
                    ActiveMods.Add(mod.PublishedFileId);
                }

                /*if(mod.PublishedFileId == 1135484377 || mod.PublishedFileId == 973528334){
                 *
                 *      string msgA = "Conflicting Mod Detected: " + mod.FriendlyName;
                 *      MyVisualScriptLogicProvider.ShowNotificationToAll(msgA, 15000, "Red");
                 *      Logger.AddMsg(msgA);
                 *      conflictingSettings = true;
                 *
                 * }*/
            }

            if (ActiveMods.Contains(1555044803) == true)
            {
                Logger.AddMsg("NPC Weapon Upgrades Mod Detected. Enabling Weapon Randomization.");
                NPCWeaponUpgradesModDetected = true;
            }

            if (ActiveMods.Contains(1773965697) == true)
            {
                Logger.AddMsg("Wave Spawner (Space) Mod Detected. Enabling Wave Spawning for SpaceCargoShips.");
                SpaceWaveSpawnerModDetected = true;
            }

            bool suppressCargo     = false;
            bool suppressEncounter = false;

            if (ActiveMods.Contains(888457124) == true)
            {
                suppressCargo = true;
            }

            if (ActiveMods.Contains(888457381) == true)
            {
                suppressEncounter = true;
            }

            SuppressGroups.ApplySuppression(suppressCargo, suppressEncounter);

            //Init Timers
            PlayerWatcherTimer = Settings.General.PlayerWatcherTimerTrigger;
            NPCWatcher.NpcDistanceCheckTimer  = Settings.General.NpcDistanceCheckTimerTrigger;
            NPCWatcher.NpcOwnershipCheckTimer = Settings.General.NpcOwnershipCheckTimerTrigger;
            NPCWatcher.NpcCleanupCheckTimer   = Settings.General.NpcCleanupCheckTimerTrigger;
            NPCWatcher.SpawnedVoxelCheckTimer = Settings.General.SpawnedVoxelCheckTimerTrigger;
            SpawnResources.RefreshEntityLists();

            //Setup Watchers and Handlers
            MyAPIGateway.Entities.OnEntityAdd += NPCWatcher.NewEntityDetected;

            //Get Initial Players
            PlayerList.Clear();
            MyAPIGateway.Players.GetPlayers(PlayerList);

            //Get Existing NPCs
            Logger.AddMsg("Check For Existing NPC Grids");
            NPCWatcher.StartupScan();

            //Setup Wave Spawners
            SpaceCargoShipWaveSpawner = new WaveSpawner("SpaceCargoShip");

            //Init Economy Stuff
            Logger.AddMsg("Initializing Economy Resources");
            EconomyHelper.Setup();

            //Get Spawned Voxels From Save
            try{
                string[] tempSpawnedVoxels = new string[0];

                if (MyAPIGateway.Utilities.GetVariable <string[]>("MES-SpawnedVoxels", out tempSpawnedVoxels) == true)
                {
                    foreach (var voxelId in tempSpawnedVoxels)
                    {
                        long tempId = 0;

                        if (long.TryParse(voxelId, out tempId) == false)
                        {
                            continue;
                        }

                        IMyEntity voxelEntity = null;

                        if (MyAPIGateway.Entities.TryGetEntityById(tempId, out voxelEntity) == false)
                        {
                            continue;
                        }

                        if (NPCWatcher.SpawnedVoxels.ContainsKey(voxelId) == false)
                        {
                            NPCWatcher.SpawnedVoxels.Add(voxelId, voxelEntity);
                        }
                    }
                }
            }catch (Exception exc) {
                Logger.AddMsg("Something went wrong while trying to retrieve previously spawned voxels.");
            }
        }