// Token: 0x06000BF1 RID: 3057 RVA: 0x00054608 File Offset: 0x00052808
        public static Dictionary <string, PlayerFactionSelection> GetFactionOptions(LevelManager levelManager, DLCManager dlcManager, PlayerType playerType, bool useOwnedDLCOnly)
        {
            Dictionary <string, PlayerFactionSelection> dictionary = new Dictionary <string, PlayerFactionSelection>(6);

            if (levelManager != null)
            {
                CommanderAttributes[] commanderAttributes = levelManager.CommanderAttributes;
                if (commanderAttributes != null)
                {
                    for (int i = 0; i < commanderAttributes.Length; i++)
                    {
                        CommanderAttributes commanderAttributes2 = commanderAttributes[i];
                        string key = string.IsNullOrEmpty(commanderAttributes2.NameLocID) ? commanderAttributes2.Name : commanderAttributes2.NameLocID;
                        PlayerFactionSelection value = new PlayerFactionSelection((CustomizationFactionSetting)i, DLCPackID.kInvalidID, false);
                        dictionary.Add(key, value);
                    }
                }
            }
            if (dlcManager != null)
            {
                IEnumerable <DLCPackDescriptor> enumerable = useOwnedDLCOnly ? dlcManager.OwnedDLCPacks : dlcManager.AllDLCPacks;
                foreach (DLCPackDescriptor dlcpackDescriptor in enumerable)
                {
                    if (dlcpackDescriptor.DLCPackType == DLCType.Faction)
                    {
                        UnitFactionDLCPack unitFactionDLCPack = (UnitFactionDLCPack)dlcManager.GetDLCPackHeader(dlcpackDescriptor.DLCPackID);
                        if (!(unitFactionDLCPack == null))
                        {
                            if (playerType == PlayerType.AI)
                            {
                                CommanderAttributesData commanderAttributesData = unitFactionDLCPack.CommanderAttrs as CommanderAttributesData;
                                if (commanderAttributesData == null || commanderAttributesData.AIArchetypeAssets.IsNullOrEmpty <AIArchetypeAttributesAsset>())
                                {
                                    continue;
                                }
                            }
                            string dlcpackLocID           = dlcpackDescriptor.DLCPackLocID;
                            PlayerFactionSelection value2 = new PlayerFactionSelection(unitFactionDLCPack.CustomizesFaction, dlcpackDescriptor.DLCPackID, false);
                            dictionary.Add(dlcpackLocID, value2);
                        }
                    }
                }
            }
            PlayerFactionSelection value3 = new PlayerFactionSelection(CustomizationFactionSetting.Coalition, DLCPackID.kInvalidID, true);

            // MOD
            if (playerType == PlayerType.AI)
            {
                dictionary.Remove("SPECTATOR");
                dictionary.Remove("FATHERSHIP");
                dictionary.Remove("NONE");
            }
            // MOD
            dictionary.Add("ID_UI_FE_MP_RANDOM_253", value3);
            return(dictionary);
        }
        // Token: 0x060015BD RID: 5565 RVA: 0x000790FC File Offset: 0x000772FC
        private void ResetEntityManager()
        {
            ShipbreakersMain.sEntityTypes.Clear();
            ShipbreakersMain.sEntityTypes = null;
            ShipbreakersMain.EntitySystem.Teardown();
            HashSet <ScriptableObject> hashSet = new HashSet <ScriptableObject>();

            foreach (DLCAssetBundleBase dlcassetBundleBase in ShipbreakersMain.sDLCManager.GetAllLoadedHeadersOfType(DLCType.Faction))
            {
                UnitFactionDLCPack unitFactionDLCPack = dlcassetBundleBase as UnitFactionDLCPack;
                if (unitFactionDLCPack != null)
                {
                    foreach (UnitFactionDLCPack.ReplacementMapping replacementMapping in unitFactionDLCPack.NewEntities)
                    {
                        if (replacementMapping.NewEntityType is IEntityTypeRegistrationRequired)
                        {
                            hashSet.Add(replacementMapping.NewEntityType);
                        }
                    }
                    CommanderAttributesData commanderAttributesData = unitFactionDLCPack.CommanderAttrs as CommanderAttributesData;
                    if (commanderAttributesData != null)
                    {
                        FactionAttributesData factionAttributesData = commanderAttributesData.FactionAttributes.Data as FactionAttributesData;
                        if (factionAttributesData != null)
                        {
                            ScriptableObject techTree = factionAttributesData.TechTree;
                            if (techTree != null)
                            {
                                hashSet.Add(techTree);
                            }
                        }
                    }
                }
            }
            ShipbreakersMain.InitializeEntityManager(this.m_RegistryAsset, hashSet);

            // MOD: Load unit stat mods using subsystem
            if (MapModManager.GameType != GameMode.SinglePlayer)
            {
                new AttributeLoader().LoadAttributes(ShipbreakersMain.sEntityTypes, "Managed/fathership.json");                 // Default game-wide fathership modifications
            }
            new AttributeLoader().LoadAttributes(ShipbreakersMain.sEntityTypes);
            // MOD
        }
Esempio n. 3
0
        // Token: 0x06000B87 RID: 2951 RVA: 0x0004090C File Offset: 0x0003EB0C
        private void LoadReplay()
        {
            LevelDefinition levelDefinition = this.mLevelManager.FindLevelFromSceneName(this.mSelectedReplay.SceneName, this.mSelectedReplay.GameSessionSettings.GameMode);

            if (levelDefinition != null)
            {
                // MOD: tell the mod what map is being loaded
                try {
                    byte[] replayX      = System.IO.File.ReadAllBytes(mSelectedReplay.FilePath + "x");
                    int    layoutLength = (replayX[0] << 0) + (replayX[1] << 8) + (replayX[2] << 16) + (replayX[3] << 24);
                    int    patchLength  = (replayX[4] << 0) + (replayX[5] << 8) + (replayX[6] << 16) + (replayX[7] << 24);
                    int    reserved0    = (replayX[8] << 0) + (replayX[9] << 8) + (replayX[10] << 16) + (replayX[11] << 24);
                    int    reserved1    = (replayX[12] << 0) + (replayX[13] << 8) + (replayX[14] << 16) + (replayX[15] << 24);
                    MapModManager.MapXml = Encoding.UTF8.GetString(replayX, 16, layoutLength);
                    Subsystem.AttributeLoader.PatchOverrideData = Encoding.UTF8.GetString(replayX, 16 + layoutLength, patchLength);
                } catch {}
                Dictionary <CommanderID, TeamID> teams = new Dictionary <CommanderID, TeamID>();
                foreach (var tuple in mSelectedReplay.SessionPlayers)
                {
                    teams[new CommanderID(tuple.CID)] = new TeamID(tuple.TeamID);
                }
                MapModManager.SetMap(levelDefinition, mSelectedReplay.GameSessionSettings.GameMode, mSelectedReplay.GameSessionSettings.TeamSetting, teams);
                // MOD

                Dictionary <CommanderID, PlayerSelection> dictionary = new Dictionary <CommanderID, PlayerSelection>(this.mSelectedReplay.SessionPlayers.Length);
                List <NetworkPlayerID> list = new List <NetworkPlayerID>(this.mSelectedReplay.SessionPlayers.Length);
                for (int i = 0; i < this.mSelectedReplay.SessionPlayers.Length; i++)
                {
                    ReplayHelpers.ReplayDataTuple replayDataTuple     = this.mSelectedReplay.SessionPlayers[i];
                    CommanderAttributes           commanderAttributes = null;
                    foreach (DLCAssetBundleBase dlcassetBundleBase in this.mDLCManager.GetAllLoadedHeadersOfType(DLCType.Faction))
                    {
                        UnitFactionDLCPack unitFactionDLCPack = dlcassetBundleBase as UnitFactionDLCPack;
                        if (unitFactionDLCPack != null && unitFactionDLCPack.CommanderAttrs != null && unitFactionDLCPack.CommanderAttrs.Name == replayDataTuple.CommanderAttributesName)
                        {
                            commanderAttributes = unitFactionDLCPack.CommanderAttrs;
                            break;
                        }
                    }
                    int j = 0;
                    if (commanderAttributes == null)
                    {
                        for (j = 0; j < this.mLevelManager.CommanderAttributes.Length; j++)
                        {
                            CommanderAttributes commanderAttributes2 = this.mLevelManager.CommanderAttributes[j];
                            if (commanderAttributes2.Name == replayDataTuple.CommanderAttributesName)
                            {
                                commanderAttributes = commanderAttributes2;
                                break;
                            }
                        }
                    }
                    if (commanderAttributes == null)
                    {
                        Log.Error(Log.Channel.Data, "Couldn't resolve commander attributes from saved replay.  The replay that was saved didn't have commander attributes that match the commander attributes in the level ({0})", new object[]
                        {
                            replayDataTuple.CommanderAttributesName
                        });
                    }
                    else
                    {
                        CommanderDescription commanderDescription = new CommanderDescription(replayDataTuple.PlayerName, new CommanderID(replayDataTuple.CID), replayDataTuple.PlayerID, replayDataTuple.SpawnIndex, j, new TeamID(replayDataTuple.TeamID), replayDataTuple.PlayerType, replayDataTuple.UnitColors, replayDataTuple.AIDifficulty, replayDataTuple.UnitSkinPack, replayDataTuple.RandomFaction);
                        dictionary.Add(commanderDescription.CommanderID, new PlayerSelection(commanderAttributes, commanderDescription));
                        if (replayDataTuple.PlayerID != NetworkPlayerID.kInvalidID)
                        {
                            list.Add(replayDataTuple.PlayerID);
                        }
                    }
                }
                DependencyContainer <GameStartSettings, ReplayHelpers.ReplayableGameSessionHeader, SessionBase> dependencies = new DependencyContainer <GameStartSettings, ReplayHelpers.ReplayableGameSessionHeader, SessionBase>(new GameStartSettings(dictionary, this.mSelectedReplay.GameSessionSettings.VictoryConditions, this.mSelectedReplay.GameSessionSettings.TeamSetting, this.mSelectedReplay.GameSessionSettings.GameModeSettings, this.mSelectedReplay.RandomSeed, false, false, AutomatchSizeType.ThreeVSThree), this.mSelectedReplay, new NullSession(list));
                this.mLevelManager.LoadLevelForSave(levelDefinition, this.mSelectedReplay.GameSessionSettings.GameMode, ReplayMode.ReplayingGame, dependencies);
                return;
            }
            Log.Error(Log.Channel.Data, "The level associated with {0} could not be found", new object[]
            {
                this.mSelectedReplay.SceneName
            });
        }