示例#1
0
        private bool TryParseGearID(GearIDRange gearIDRange, out ItemDataBlock itemData, out int inventorySlot)
        {
            inventorySlot = 0;
            itemData      = null;

            if (gearIDRange == null)
            {
                Log.Warn("Unable to parse GearIDRange due to it being null");
                return(false);
            }

            uint compID = gearIDRange.GetCompID(eGearComponent.BaseItem);

            itemData = compID > 0U
                         ? GameDataBlockBase <ItemDataBlock> .GetBlock(compID)
                         : null;

            if (itemData == null)
            {
                Log.Warn($"Invalid ItemDataBlock for component in offlinear gear [c:{compID}]");
                return(false);
            }

            inventorySlot = (int)itemData.inventorySlot;
            return(true);
        }
        private static IDChangePair DissolveBase <T>(string content, uint offset) where T : GameDataBlockBase <T>
        {
            try
            {
                var setting = GameDataSettingBase;

                var block = JsonConvert.DeserializeObject <T>(content, setting);

                if (GameDataBlockBase <T> .HasBlock(block.persistentID))
                {
                    throw new InvalidDataException($"Data already exist for ID: {block.persistentID} ({typeof(T).Name})");
                }

                var change = new IDChangePair()
                {
                    Previous = block.persistentID,
                    New      = offset
                };

                block.persistentID = change.New;

                GameDataBlockBase <T> .AddBlock((T)block, -1);

                return(change);
            }
            catch (Exception e)
            {
                MelonLogger.Log(e.ToString());
                return(default);
        public static uint Parse(string input)
        {
            if (input == null)
            {
                return(0U);
            }

            if (uint.TryParse(input, out uint dbID))
            {
                if (GameDataBlockBase <T> .GetBlock(dbID) != null)
                {
                    return(dbID);
                }
                else
                {
                    Utilities.Log.Warn("DataBlockIDParser: Failed to get enemy data block with id '" + dbID + "'");
                }
            }

            T namedBlock = GameDataBlockBase <T> .GetBlock(input);

            if (namedBlock != null)
            {
                return(namedBlock.persistentID);
            }

            Utilities.Log.Warn("DataBlockIDParser: Failed to get enemy data block with name '" + input + "'");
            return(0U);
        }
示例#4
0
 public static List <pAvailableEnemyTypes> GetAvailableSpawnData()
 {
     if (enemyTypes == null)
     {
         SetupData(GameDataBlockBase <EnemyPopulationDataBlock> .GetBlock(RundownManager.ActiveExpedition.Expedition.EnemyPopulation));
     }
     return(enemyTypes);
 }
示例#5
0
        public void DoSaveToDisk(string fullPath)
        {
            var oldPath = GameDataBlockBase <T> .m_filePathFull;

            GameDataBlockBase <T> .m_filePathFull = fullPath;
            GameDataBlockBase <T> .DoSaveToDisk(false, false);

            GameDataBlockBase <T> .m_filePathFull = oldPath;
        }
        public static void AssignForceChangeMethod(IDataBlockType blockTypeCache)
        {
            //TODO: Better Support
            switch (blockTypeCache.GetShortName().ToLower())
            {
            case "fogsettings":
                blockTypeCache.RegisterOnChangeEvent(() =>
                {
                    if (Builder.CurrentFloor.IsBuilt)
                    {
                        Logger.Error("Fog Transition Code is not working properly, Skipping this one");
                        return;

                        var instance = EnvironmentStateManager.Current;
                        Logger.Error("Read Replicator");
                        var replicator = instance.m_stateReplicator;
                        Logger.Error("Read State");
                        var state = replicator.State;
                        Logger.Error("Read FogState");
                        var fogState = state.FogState;
                        Logger.Error("Read ID");
                        var id = fogState.FogDataID;
                        Logger.Error($"FogTransition {id}");

                        if (!GameDataBlockBase <FogSettingsDataBlock> .HasBlock(id))
                        {
                            id = RundownManager.ActiveExpedition.Expedition.FogSettings;
                        }

                        if (GameDataBlockBase <FogSettingsDataBlock> .HasBlock(id))
                        {
                            EnvironmentStateManager.SetFogSettingsLocal(id);
                        }
                    }
                });
                break;

            case "lightsettings":
                blockTypeCache.RegisterOnChangeEvent(() =>
                {
                    if (!Builder.CurrentFloor.IsBuilt)
                    {
                        return;
                    }

                    foreach (var zone in Builder.CurrentFloor.allZones)
                    {
                        foreach (var node in zone.m_courseNodes)
                        {
                            LG_BuildZoneLightsJob.ApplyLightSettings(node.m_lightsInNode, zone.m_lightSettings, false);
                        }
                    }
                });
                break;
            }
        }
        private static void OnLevelChanged(int level)
        {
            if (!(0 <= level && level < LevelCount))
            {
                return;
            }

            CurrentLevel = level;
            _EndTime     = Clock.Time + _FogSettings[CurrentLevel].TransitionTime;

            var block = GameDataBlockBase <FogSettingsDataBlock> .GetBlock(_FogSettings[CurrentLevel].FogSetting);

            LocalPlayerAgentSettings.Current.SetTargetFogSettings(block);
        }
示例#8
0
        public void AddBlock(T block)
        {
            var existingBlock = GameDataBlockBase <T> .GetBlock(block.persistentID);

            if (existingBlock != null)
            {
                CopyProperties(block, existingBlock);
                Logger.Warning($"Replaced Block: {existingBlock.persistentID}, {existingBlock.name}");
                return;
            }
            GameDataBlockBase <T> .AddBlock(block, -1);

            Logger.Log($"Added Block: {block.persistentID}, {block.name}");
        }
        public bool IsMatch(EnemyAgent agent)
        {
            var enemyData = GameDataBlockBase <EnemyDataBlock> .GetBlock(agent.EnemyDataID);

            var comparisonMode = NameIgnoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;

            return(Mode switch
            {
                TargetMode.PersistentID => PersistentIDs.Contains(agent.EnemyDataID),
                TargetMode.NameEquals => enemyData?.name?.Equals(NameParam, comparisonMode) ?? false,
                TargetMode.NameContains => enemyData?.name?.Contains(NameParam, comparisonMode) ?? false,
                TargetMode.Everything => true,
                _ => false,
            });
示例#10
0
        /// <summary>
        /// Load and set up all the gear from the offline data
        /// </summary>
        private void LoadOfflineGearDatas()
        {
            var blocks = GameDataBlockBase <PlayerOfflineGearDataBlock> .GetAllBlocks();

            if (blocks == null)
            {
                Log.Warn("Unable to get Player Offline Gear blocks");
                return;
            }
            Log.Verbose($"Loading {blocks.Length} gear");
            foreach (var block in blocks)
            {
                OfflineGear.Load(block);
            }
        }
        public override void Postspawn(EnemyAgent agent)
        {
            var eabBirth = agent.GetComponentInChildren <EAB_Birthing>(true);

            if (eabBirth != null)
            {
                eabBirth.m_groupDataBlock = GameDataBlockBase <EnemyGroupDataBlock> .GetBlock(EnemyGroupToSpawn);

                eabBirth.m_childrenCost           = ChildrenCost.GetAbsValue(eabBirth.m_childrenCost);
                eabBirth.m_childrenPerBirth       = ChildrenPerBirth.GetAbsValue(eabBirth.m_childrenPerBirth);
                eabBirth.m_childrenAllowedSpawn   = ChildrenPerBirth.GetAbsValue(eabBirth.m_childrenAllowedSpawn);
                eabBirth.m_childrenPerBirthMin    = ChildrenPerBirthMin.GetAbsValue(eabBirth.m_childrenPerBirthMin);
                eabBirth.m_childrenMax            = ChildrenMax.GetAbsValue(eabBirth.m_childrenMax);
                eabBirth.m_minDelayUntilNextBirth = MinDelayUntilNextBirth.GetAbsValue(eabBirth.m_minDelayUntilNextBirth);
                eabBirth.m_maxDelayUntilNextBirth = MaxDelayUntilNextBirth.GetAbsValue(eabBirth.m_maxDelayUntilNextBirth);
            }
        }
        /// <summary>
        /// The Code which will Randomize your Weapon Layout
        /// </summary>
        public void RandomizeCurrentWeapons()
        {
            GearIDRange[]   standardWeapons = GearManager.GetAllGearForSlot(InventorySlot.GearStandard);
            GearIDRange[]   specialWeapons  = GearManager.GetAllGearForSlot(InventorySlot.GearSpecial);
            PlayerDataBlock playerDataBlock = GameDataBlockBase <PlayerDataBlock> .GetBlock(1U);

            int standardArrayIndex = _random.Next(0, standardWeapons.Length);
            int specialArrayIndex  = _random.Next(0, specialWeapons.Length);

            var currentAmmoInStandard = PlayerBackpackManager.LocalBackpack.AmmoStorage.StandardAmmo.AmmoInPack;
            var currentAmmoInSpecial  = PlayerBackpackManager.LocalBackpack.AmmoStorage.SpecialAmmo.AmmoInPack;

            PlayerBackpackManager.LocalBackpack.AmmoStorage.SetAmmo(AmmoType.Standard, 0f);
            PlayerBackpackManager.LocalBackpack.AmmoStorage.SetAmmo(AmmoType.Special, 0f);

            PlayerBackpackManager.EquipLocalGear(standardWeapons[standardArrayIndex]);
            LocalInventory.WieldedItem.SetCurrentClip(PlayerBackpackManager.LocalBackpack.AmmoStorage.GetClipBulletsFromPack(LocalInventory.m_wieldedItem.WeaponComp.GetCurrentClip(), LocalInventory.m_wieldedItem.AmmoType));

            PlayerBackpackManager.EquipLocalGear(specialWeapons[specialArrayIndex]);
            LocalInventory.WieldedItem.SetCurrentClip(PlayerBackpackManager.LocalBackpack.AmmoStorage.GetClipBulletsFromPack(LocalInventory.m_wieldedItem.WeaponComp.GetCurrentClip(), LocalInventory.m_wieldedItem.AmmoType));

            PlayerBackpackManager.LocalBackpack.AmmoStorage.m_hasMappedCMPageMapInventory = false;
            PlayerBackpackManager.LocalBackpack.AmmoStorage.m_cmPageMapInventory          = (PUI_Inventory)null;

            //Hardcoded +10 to recompensate the Fact, that the Magazine Ammunition is somehow Bugged
            //PlayerBackpackManager.LocalBackpack.AmmoStorage.StandardAmmo.AddAmmo(currentAmmoInStandard + 10);
            //PlayerBackpackManager.LocalBackpack.AmmoStorage.SpecialAmmo.AddAmmo(currentAmmoInSpecial + 10);

            PlayerManager.GetLocalPlayerAgent().GiveAmmoRel(1f, 1f, 0f);

            PlayerBackpackManager.LocalBackpack.AmmoStorage.UpdateAllAmmoUI();
            PlayerBackpackManager.LocalBackpack.AmmoStorage.NeedsSync = true;

            //PlayerBackpackManager.LocalBackpack.AmmoStorage.PickupAmmo(AmmoType.Standard, 40);
            //PlayerBackpackManager.LocalBackpack.AmmoStorage.SetClipAmmoInSlot(InventorySlot.GearStandard);

            //PlayerBackpackManager.LocalBackpack.AmmoStorage.UpdateAmmoInPack(AmmoType.Special, 20);
            //PlayerBackpackManager.LocalBackpack.AmmoStorage.UpdateBulletsInPack(AmmoType.Special, 15);
            //PlayerBackpackManager.LocalBackpack.AmmoStorage.PickupAmmo(AmmoType.Special, 40);
            //PlayerBackpackManager.LocalBackpack.AmmoStorage.SetClipAmmoInSlot(InventorySlot.GearSpecial);

            PlayerBackpackManager.LocalBackpack.AmmoStorage.FillAllClips();
        }
示例#13
0
        private static void Pre_LoadOfflineGearDatas()
        {
            var allBlocks = GameDataBlockBase <PlayerOfflineGearDataBlock> .GetAllBlocks();

            foreach (var block in allBlocks)
            {
                if (!block.internalEnabled || string.IsNullOrEmpty(block.GearJSON))
                {
                    continue;
                }

                if (block.Type != eOfflineGearType.StandardInventory && block.Type != eOfflineGearType.RundownSpecificInventory)
                {
                    continue;
                }

                var newGearJson = block.GearJSON;
                var isChanged   = false;
                using var doc = JsonDocument.Parse(block.GearJSON);

                if (!doc.RootElement.TryGetProperty("Packet", out var packetProp))
                {
                    continue;
                }

                if (!packetProp.TryGetProperty("Comps", out var compProp))
                {
                    continue;
                }

                foreach (var c in COMP_CHARS)
                {
                    if (!compProp.TryGetProperty(c.ToString(), out var compEProp))
                    {
                        continue;
                    }

                    if (!compEProp.TryGetProperty("v", out var valueProp))
                    {
                        continue;
                    }

                    if (valueProp.ValueKind != JsonValueKind.String)
                    {
                        continue;
                    }

                    var strValue = valueProp.GetString();
                    Logger.Warning($"Found String id: {strValue}");

                    var id = PersistentIDManager.GetId(strValue);
                    if (id != 0)
                    {
                        var regex = new Regex($"(\"v\")\\s*:\\s*(\"{strValue}\")");
                        newGearJson = regex.Replace(newGearJson, $"\"v\":{id}");

                        isChanged = true;
                    }
                }

                if (isChanged)
                {
                    Logger.Warning(block.GearJSON);
                    Logger.Warning(newGearJson);

                    block.GearJSON = newGearJson;
                }
            }
        }