public static void Postfix(
            MechLabLocationWidget __instance,
            MechComponentRef cRef,
            WeaponDef wDef,
            bool isOriginalLocation,
            bool canBeAdded,
            ref LocationDef ___chassisLocationDef)
        {
            try
            {
                if (cRef == null || wDef == null || ___chassisLocationDef.Hardpoints == null)
                {
                    return;
                }

                var hasOmni = ___chassisLocationDef.Hardpoints.Any(x => x.Omni);
                if (hasOmni)
                {
                    __instance.ShowHighlightFrame(true, (!isOriginalLocation) ? ((!canBeAdded) ? UIColor.GoldHalf : UIColor.Gold) : UIColor.Blue);
                }
            }
            catch (Exception e)
            {
                Control.mod.Logger.LogError(e);
            }
        }
Пример #2
0
        public static void Postfix(WeaponDef __instance)
        {
            try
            {
                var changes = Control.settings.AutoFixWeaponDefSlotsChanges;
                if (changes == null)
                {
                    return;
                }

                if (lookupDictionary == null)
                {
                    lookupDictionary = changes.ToDictionary(x => x.Type, x => x.Change);
                }

                if (!lookupDictionary.TryGetValue(__instance.WeaponSubType, out var change))
                {
                    return;
                }

                var newValue = change.Change(__instance.InventorySize);
                if (!newValue.HasValue)
                {
                    return;
                }

                Traverse.Create(__instance).Property("InventorySize").SetValue(newValue);
            }
            catch (Exception e)
            {
                Control.mod.Logger.LogError(e);
            }
        }
Пример #3
0
        public static Weapon  Load(int modelId)
        {
            WeaponDef def = Item.GetDefinition <WeaponDef> (modelId);

            if (null == def)
            {
                return(null);
            }

            var geoms = Geometry.Load(def.ModelName, def.TextureDictionaryName);

            if (null == geoms)
            {
                return(null);
            }

            if (null == weaponsContainer)
            {
                weaponsContainer = new GameObject("Weapons");
                //	weaponsContainer.SetActive (false);
            }

            GameObject go = new GameObject(def.ModelName);

            go.transform.SetParent(weaponsContainer.transform);

            geoms.AttachFrames(go.transform, MaterialFlags.Default);

            Weapon w = new Weapon();

            w.definition   = def;
            w.m_gameObject = go;

            return(w);
        }
Пример #4
0
        public static void Postfix(WeaponDef __instance)
        {
            try
            {
                var changes = AutoFixerFeature.settings.AutoFixWeaponDefSlotsChanges;
                if (changes == null)
                {
                    return;
                }

                if (AutoFixUtils.IsIgnoredByTags(__instance.ComponentTags, AutoFixerFeature.settings.WeaponDefTagsSkip))
                {
                    return;
                }

                foreach (var change in changes.Where(x => x.Type == __instance.WeaponSubType).Select(x => x.Change))
                {
                    var newValue = change.Change(__instance.InventorySize);
                    if (!newValue.HasValue)
                    {
                        return;
                    }
                    Traverse.Create(__instance).Property("InventorySize").SetValue(newValue);
                }
            }
            catch (Exception e)
            {
                Control.mod.Logger.LogError(e);
            }
        }
Пример #5
0
        public static bool isWeaponCanShootNoAmmo(WeaponDef weaponDef)
        {
            ExtWeaponDef extWeapon = CustomAmmoCategories.getExtWeaponDef(weaponDef.Description.Id);

            if (weaponDef.AmmoCategory == AmmoCategory.NotSet)
            {
                return(true);
            }
            ;
            if (extWeapon.Modes.Count <= 0)
            {
                return(false);
            }
            ;
            foreach (var mode in extWeapon.Modes)
            {
                if (mode.Value.AmmoCategory == null)
                {
                    continue;
                }
                ;
                if (mode.Value.AmmoCategory.BaseCategory == AmmoCategory.NotSet)
                {
                    return(true);
                }
                ;
            }
            return(false);
        }
Пример #6
0
    public int GetAttack()//攻击力等于自身的伤害加武器伤害
    {
        WeaponItem equipItem = Info.Items.GetEquipWeapon();

        if (equipItem == null)
        {
            return(0);
        }
        WeaponDef itemDef  = ResourceManager.GetWeaponDef(equipItem.ID);
        var       att      = GetAttribute();
        int       itemType = (int)itemDef.WeaponType;
        int       power    = itemDef.Power;

        if (itemType >= 0 && itemType < 4)
        {
            return(att.PhysicalPower + power);
        }
        if (itemType >= 4 && itemType < 8)
        {
            return(att.MagicalPower + power);
        }
        if (itemType >= 8)
        {
            return(att.PhysicalPower + att.MagicalPower + power);
        }
        return(0);
    }
Пример #7
0
        public static void Postfix(WeaponDef __instance)
        {
            EffectData[]      effects = __instance.statusEffects;
            List <EffectData> tmpList = new List <EffectData>();

            foreach (EffectData effect in effects)
            {
                if ((effect.Description != null))
                {
                    if ((effect.Description.Id != null) && (effect.Description.Name != null))
                    {
                        tmpList.Add(effect);
                        continue;
                    }
                }
                CustomAmmoCategoriesLog.Log.LogWrite("!Warning! null status effect detected at weapon " + __instance.Description.Id + ".\n");
            }
            if (tmpList.Count != effects.Length)
            {
                CustomAmmoCategoriesLog.Log.LogWrite("!Warning! null status effects detected at weapon " + __instance.Description.Id + ".Removing\n");
                PropertyInfo property = typeof(WeaponDef).GetProperty("statusEffects");
                property.DeclaringType.GetProperty("statusEffects");
                property.GetSetMethod(true).Invoke(__instance, new object[1] {
                    (object)tmpList.ToArray()
                });
            }
        }
Пример #8
0
        public static SalvageDef CreateComponent(SimGameConstants sc, Contract c, MechComponentDef mc)
        {
            SalvageDef salvageDef = new SalvageDef();

            if (mc.ComponentType == ComponentType.Weapon)
            {
                WeaponDef weaponDef = mc as WeaponDef;
                salvageDef.MechComponentDef = weaponDef;

                salvageDef.Description   = new DescriptionDef(weaponDef.Description);
                salvageDef.RewardID      = c.GenerateRewardUID();
                salvageDef.Type          = SalvageDef.SalvageType.COMPONENT;
                salvageDef.ComponentType = weaponDef.ComponentType;
                salvageDef.Damaged       = false;
                salvageDef.Weight        = sc.Salvage.DefaultWeaponWeight;
                salvageDef.Count         = 1;

                return(salvageDef);
            }
            else
            {
                salvageDef.MechComponentDef = mc;

                salvageDef.Description   = new DescriptionDef(mc.Description);
                salvageDef.RewardID      = c.GenerateRewardUID();
                salvageDef.Type          = SalvageDef.SalvageType.COMPONENT;
                salvageDef.ComponentType = mc.ComponentType;
                salvageDef.Damaged       = false;
                salvageDef.Weight        = sc.Salvage.DefaultComponentWeight;
                salvageDef.Count         = 1;

                return(salvageDef);
            }
        }
Пример #9
0
        private static DumperDataEntry FillWeapon(WeaponDef d)
        {
            DumperDataEntry r = FillComp(d, 4, 4);

            r.DataTxt[1] = d.Damage + "/" + d.StructureDamage + "/" + d.Instability + "/" + d.HeatDamage + "*" + d.ShotsWhenFired;
            r.DataTxt[2] = d.MinRange + "/" + d.MediumRange + "/" + d.MaxRange;
            if (d.ComponentTags.Contains("range_extreme"))
            {
                r.DataTxt[2] = "Extreme (" + r.DataTxt[2] + ")";
            }
            else if (d.ComponentTags.Contains("range_very-long"))
            {
                r.DataTxt[2] = "Very Long (" + r.DataTxt[2] + ")";
            }
            else if (d.ComponentTags.Contains("range_long"))
            {
                r.DataTxt[2] = "Long (" + r.DataTxt[2] + ")";
            }
            else if (d.ComponentTags.Contains("range_standard"))
            {
                r.DataTxt[2] = "Standard (" + r.DataTxt[2] + ")";
            }
            else if (d.ComponentTags.Contains("range_close"))
            {
                r.DataTxt[2] = "Close (" + r.DataTxt[2] + ")";
            }
            r.DataTxt[3] = d.AccuracyModifier + "/" + d.CriticalChanceMultiplier + "/" + d.IndirectFireCapable + "/" + d.RefireModifier;
            r.DataTxt[4] = d.AmmoCategoryToAmmoId + "/" + d.StartingAmmoCapacity;
            r.DataCsv   += ";" + d.Damage + ";" + d.StructureDamage + ";" + d.Instability + ";" + d.HeatDamage + ";" + d.ShotsWhenFired;
            r.DataCsv   += ";" + d.MinRange + ";" + d.MediumRange + ";" + d.MaxRange;
            r.DataCsv   += ";" + d.AccuracyModifier + ";" + d.CriticalChanceMultiplier + ";" + d.IndirectFireCapable + ";" + d.RefireModifier;
            r.DataCsv   += ";" + d.AmmoCategoryToAmmoId + ";" + d.StartingAmmoCapacity;
            return(r);
        }
Пример #10
0
        public static void Postfix(WeaponDef __instance)
        {
            try
            {
                if (!Control.settings.AutoFixWeaponDefSlots)
                {
                    return;
                }

                if (!Control.settings.AutoFixWeaponDefSlotsChanges.TryGetValue(__instance.WeaponSubType.ToString(), out var change))
                {
                    return;
                }

                var newValue = change.Change(__instance.InventorySize);
                if (!newValue.HasValue)
                {
                    return;
                }

                Traverse.Create(__instance).Property("InventorySize").SetValue(newValue);
            }
            catch (Exception e)
            {
                Control.mod.Logger.LogError(e);
            }
        }
        public static void Postfix(WeaponDef __instance)
        {
            try
            {
                var def = __instance;

                if (def.ComponentTags.IgnoreAutofix())
                {
                    return;
                }

                var changes = AutoFixerFeature.settings.AutoFixWeaponDefSlotsChanges;
                if (changes == null)
                {
                    return;
                }

                foreach (var change in changes.Where(x => x.Type == def.WeaponSubType))
                {
                    if (change.SlotChange != null)
                    {
                        var newValue = change.SlotChange.Change(def.InventorySize);
                        if (!newValue.HasValue)
                        {
                            return;
                        }
                        Traverse.Create(def).Property("InventorySize").SetValue(newValue.Value);
                    }

                    if (change.TonnageChange != null)
                    {
                        var newValue = change.TonnageChange.Change(def.Tonnage);
                        if (!newValue.HasValue)
                        {
                            return;
                        }
                        Traverse.Create(def).Property("Tonnage").SetValue(newValue.Value);
                    }
                }

                if (AutoFixerFeature.settings.AutoFixWeaponDefSplitting && !def.Is <DynamicSlots.DynamicSlots>())
                {
                    var threshold = AutoFixerFeature.settings.AutoFixWeaponDefSplittingLargerThan;
                    if (def.InventorySize > threshold)
                    {
                        var fixedSize           = AutoFixerFeature.settings.AutoFixWeaponDefSplittingFixedSize;
                        var dynamicSlotTemplate = AutoFixerFeature.settings.AutoFixWeaponDefSplittingDynamicSlotTemplate;
                        var slot = dynamicSlotTemplate.ReflectionCopy();
                        slot.ReservedSlots = def.InventorySize - fixedSize;
                        def.AddComponent(slot);
                        Traverse.Create(def).Property("InventorySize").SetValue(fixedSize);
                    }
                }
            }
            catch (Exception e)
            {
                Control.mod.Logger.LogError(e);
            }
        }
Пример #12
0
 public static Vector3 Get(WeaponDef def)
 {
     return(Get(
                identifier: def.Description.Id,
                tags: def.ComponentTags,
                type: typeof(Weapon),
                prefab: def.PrefabIdentifier));
 }
Пример #13
0
        private static DumperDataEntry FillWeapon(WeaponDef d, Dictionary <string, float> ammoShotsPerTonn)
        {
            DumperDataEntry r = FillComp(d, 5, 5);

            r.DataTxt[1] = d.Damage + "/" + d.StructureDamage + "/" + d.Instability + "/" + d.HeatDamage + "*" + d.ShotsWhenFired;
            r.DataTxt[2] = d.MinRange + "/" + d.MediumRange + "/" + d.MaxRange;
            if (d.ComponentTags.Contains("range_extreme"))
            {
                r.DataTxt[2] = "Extreme (" + r.DataTxt[2] + ")";
            }
            else if (d.ComponentTags.Contains("range_very-long"))
            {
                r.DataTxt[2] = "Very Long (" + r.DataTxt[2] + ")";
            }
            else if (d.ComponentTags.Contains("range_long"))
            {
                r.DataTxt[2] = "Long (" + r.DataTxt[2] + ")";
            }
            else if (d.ComponentTags.Contains("range_standard"))
            {
                r.DataTxt[2] = "Standard (" + r.DataTxt[2] + ")";
            }
            else if (d.ComponentTags.Contains("range_close"))
            {
                r.DataTxt[2] = "Close (" + r.DataTxt[2] + ")";
            }
            r.DataTxt[3] = d.AccuracyModifier + "/" + d.CriticalChanceMultiplier + "/" + d.IndirectFireCapable + "/" + d.RefireModifier;
            r.DataTxt[4] = d.AmmoCategoryToAmmoId + "/" + d.StartingAmmoCapacity;
            float efftonn   = d.Tonnage;
            float ammotonns = 0;

            if (!string.IsNullOrEmpty(d.AmmoCategoryToAmmoId) && ammoShotsPerTonn.ContainsKey(d.AmmoCategoryToAmmoId)) // add ammo tonnage
            {
                float shots = 10 * d.ShotsWhenFired - d.StartingAmmoCapacity;
                if (shots > 0)
                {
                    ammotonns += shots / ammoShotsPerTonn[d.AmmoCategoryToAmmoId];
                    efftonn   += ammotonns;
                }
            }
            float efftonndhs = efftonn;

            efftonn    += d.HeatGenerated / 3; // heat w standard heatsinks
            efftonndhs += d.HeatGenerated / 6; // heat w double heatsinks
            float effdmg    = (d.Damage + d.StructureDamage + d.HeatDamage + d.Instability) * d.ShotsWhenFired;
            float accmod    = 0.5f + (-d.AccuracyModifier * 0.05f);
            float rmod      = GetWeaponRangeFactor(d);
            float rating    = Mathf.Round(effdmg * accmod * rmod / efftonn * 100) / 100;
            float ratingdhs = Mathf.Round(effdmg * accmod * rmod / efftonndhs * 100) / 100;

            r.DataTxt[5] = efftonn + "/" + efftonndhs + "/" + rating + "/" + ratingdhs;
            r.DataCsv   += ";" + d.Damage + ";" + d.StructureDamage + ";" + d.Instability + ";" + d.HeatDamage + ";" + d.ShotsWhenFired;
            r.DataCsv   += ";" + d.MinRange + ";" + d.MediumRange + ";" + d.MaxRange;
            r.DataCsv   += ";" + d.AccuracyModifier + ";" + d.CriticalChanceMultiplier + ";" + d.IndirectFireCapable + ";" + d.RefireModifier;
            r.DataCsv   += ";" + d.AmmoCategoryToAmmoId + ";" + d.StartingAmmoCapacity;
            r.DataCsv   += ";" + effdmg + ";" + accmod + ";" + rmod + ";" + ammotonns + ";" + efftonn + ";" + efftonndhs + ";" + rating + ";" + ratingdhs;
            return(r);
        }
Пример #14
0
            public HardpointInfo(MechComponentDef def)
            {
                NumBallistic    = 0;
                NumEnergy       = 0;
                NumMissile      = 0;
                NumSmall        = 0;
                NumMissileTubes = 0;
                NumEnergyLarge  = 0;
                NumJumpJets     = 0;
                if (def.ComponentType == ComponentType.JumpJet)
                {
                    ++NumJumpJets;
                }
                else
                {
                    WeaponDef weaponDef = def as WeaponDef;
                    if (!(weaponDef is null))
                    {
                        switch (weaponDef.Category)
                        {
                        case WeaponCategory.Ballistic:
                            NumBallistic++;
                            break;

                        case WeaponCategory.Energy:
                            NumEnergy++;
                            if (weaponDef.Tonnage >= 3)
                            {
                                ++NumEnergyLarge;
                            }

                            break;

                        case WeaponCategory.Missile:
                            NumMissileTubes += weaponDef.ShotsWhenFired;
                            NumMissile++;
                            break;

                        case WeaponCategory.AntiPersonnel:
                            NumSmall++;
                            break;

                        case WeaponCategory.NotSet:
                            break;

                        case WeaponCategory.AMS:
                            break;

                        case WeaponCategory.Melee:
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    }
                }
            }
Пример #15
0
 public InvWeapDisc(
     Spatial launchNode,
     WeaponDef weaponDef,
     ProjectileDef primaryDef,
     ProjectileDef secondaryDef,
     PhysicsBody ignoreBody)
     : base(launchNode, weaponDef, primaryDef, secondaryDef, ignoreBody)
 {
 }
Пример #16
0
        public void ShowTip(int index)
        {
            WeaponDef def = ResourceManager.GetWeaponDef(weaponItems[currentSelectIndex].ID);

            string content = def.GetWeaponTypeName() + " " + def.GetWeaponLevelName() + "  " + "威力" + " " + def.Power + "  " + "命中" + " " + def.Hit + "  " + "必杀" + " " + def.Crit + "  " +
                             "重量" + " " + def.Weight + "  " + "射程" + " " + def.RangeType.SelectRange.x + "-" + def.RangeType.SelectRange.y + "\n" + def.CommonProperty.Description;

            Debug.Log(content);
            //ItemTipControl.Show(Input.mousePosition, content);
        }
Пример #17
0
 public InvWeapShotgun(
     Spatial launchNode,
     WeaponDef weaponDef,
     ProjectileDef primaryDef,
     ProjectileDef secondaryDef,
     PhysicsBody ignoreBody)
     : base(launchNode, weaponDef, primaryDef, secondaryDef, ignoreBody)
 {
     _roundsLoaded = weaponDef.magazineSize;
 }
Пример #18
0
 private ListElementControllerCompare(ListElementController_BASE_NotListView item)
 {
     salvageDef   = item.salvageDef;
     componentDef = item.componentDef;
     ammoBoxDef   = item.ammoBoxDef;
     weaponDef    = item.weaponDef;
     mechDef      = item.mechDef;
     chassisDef   = item.chassisDef;
     shopDefItem  = item.shopDefItem;
 }
Пример #19
0
        public static Weapon Load(int modelId)
        {
            WeaponDef def = Item.GetDefinition <WeaponDef> (modelId);

            if (null == def)
            {
                return(null);
            }

            WeaponData weaponData = WeaponData.LoadedWeaponsData.FirstOrDefault(wd => wd.modelId1 == def.Id);

            if (null == weaponData)
            {
                return(null);
            }

            var geoms = Geometry.Load(def.ModelName, def.TextureDictionaryName);

            if (null == geoms)
            {
                return(null);
            }

            if (null == s_weaponsContainer)
            {
                s_weaponsContainer = new GameObject("Weapons");
                //	weaponsContainer.SetActive (false);
            }

            GameObject go = new GameObject(def.ModelName);

            go.transform.SetParent(s_weaponsContainer.transform);

            geoms.AttachFrames(go.transform, MaterialFlags.Default);

            Weapon weapon = AddWeaponComponent(go, weaponData);

            weapon.definition = def;
            weapon.data       = weaponData;
            // cache gun aiming offset
            if (weapon.data.gunData != null)
            {
                weapon.gunAimingOffset = weapon.data.gunData.aimingOffset;
            }

            // load hud texture
            try {
                weapon.HudTexture = TextureDictionary.Load(def.TextureDictionaryName).GetDiffuse(def.TextureDictionaryName + "icon").Texture;
            } catch {
                Debug.LogErrorFormat("Failed to load hud icon for weapon: model {0}, txd {1}", def.ModelName, def.TextureDictionaryName);
            }

            return(weapon);
        }
Пример #20
0
        private static float GetWeaponRangeFactor(WeaponDef d)
        {
            float one = 375; // l laser, 1
            float s   = 90f; // s laser, 0.75
            float r   = (d.MediumRange - d.MinRange) + (d.MaxRange - d.MediumRange) / 2;
            // rating = del * range + b;
            float del = (1 - 0.75f) / (one - s);
            float b   = 1 - (del * one);

            return(del * r + b);
        }
Пример #21
0
 public void OnEnable()
 {
     wea = target as WeaponDef;
     if (wea.DedicatedCharacter == null)
     {
         wea.DedicatedCharacter = new System.Collections.Generic.List <int>();
     }
     dedicatedCharacterCount = wea.DedicatedCharacter.Count;
     dedicatedJobCount       = wea.DedicatedJob.Count;
     careerEffectCount       = wea.CareerEffect.Count;
 }
        internal WeaponDefFirepowerStatistics(MechDef mechDef, WeaponDef weaponDef, float damage, float instability, float accuracy)
        {
            this.weaponDef = weaponDef;
            this.mechDef   = mechDef;

            ShotWhenFired   = GetShotsWhenFired(weaponDef.ShotsWhenFired);
            Damage          = GetDamagePerShot(damage) * ShotWhenFired;
            HeatDamage      = GetHeatDamage(weaponDef.HeatDamage) * ShotWhenFired;
            StructureDamage = GetStructureDamage(weaponDef.StructureDamage) * ShotWhenFired;
            Instability     = GetInstability(instability) * ShotWhenFired;
            Accuracy        = GetAccuracyModifier(accuracy);
        }
Пример #23
0
        /// <summary>
        /// 初始化控件中武器的信息显示
        /// </summary>
        /// <param name="index"></param>
        /// <param name="Weapon"></param>
        public void InitButton(int index, WeaponItem Weapon)
        {
            WeaponDef def = Weapon.GetDefinition();

            Elements[index].Show(index, def.Icon, def.CommonProperty.Name, def.IsInifiniteUsage() ? " -- " : Weapon.Usage + "/" + def.UseNumber, true);
            Elements[index].RegisterClickEvent(() =>
            {
                AddWeaponToWarehouseAction(Weapon);
                WeaponItems.RemoveAt(index);
                Hide();
            });
        }
Пример #24
0
        public static void TryFixProp(string id, WeaponDef def, string propName, Func <WeaponDef, bool> checker, object value)
        {
            PropertyInfo prop = typeof(WeaponDef).GetProperty(propName);

            if (prop != null && checker.Invoke(def))
            {
                prop.SetValue(def, value, null);
                Info(id + " " + propName + " corrected.");
            }
            else
            {
                Info(id + " " + propName + " seems to be already fixed.");
            }
        }
Пример #25
0
        public static WeaponDef CreateWeapon()
        {
            int count = ScriptableObjectUtility.GetFoldFileCount(DIRECTORY_PATH);

            WeaponDef wea = ScriptableObjectUtility.CreateAsset <WeaponDef>(
                count.ToString(),
                DIRECTORY_PATH,
                true
                );

            wea.CommonProperty.ID   = count;
            wea.CommonProperty.Name = "青铜剑";
            return(wea);
        }
Пример #26
0
        public static bool isWeaponCanUseAmmo(WeaponDef weaponDef, AmmunitionDef ammoDef)
        {
            ExtAmmunitionDef   extAmmo      = CustomAmmoCategories.findExtAmmo(ammoDef.Description.Id);
            CustomAmmoCategory ammoCategory = extAmmo.AmmoCategory;

            if (ammoCategory.BaseCategory == AmmoCategory.NotSet)
            {
                ammoCategory = CustomAmmoCategories.find(ammoDef.Category.ToString());
            }
            ;
            if (ammoCategory.BaseCategory == AmmoCategory.NotSet)
            {
                return(false);
            }
            ;
            ExtWeaponDef extWeapon = CustomAmmoCategories.getExtWeaponDef(weaponDef.Description.Id);

            if (extWeapon.AmmoCategory.BaseCategory != AmmoCategory.NotSet)
            {
                if (extWeapon.AmmoCategory.Index == ammoCategory.Index)
                {
                    return(true);
                }
                ;
            }
            else
            if (weaponDef.AmmoCategory != AmmoCategory.NotSet)
            {
                CustomAmmoCategory weaponAmmoCategory = CustomAmmoCategories.find(weaponDef.AmmoCategory.ToString());
                if ((weaponAmmoCategory.BaseCategory != AmmoCategory.NotSet) && (weaponAmmoCategory.Index == ammoCategory.Index))
                {
                    return(true);
                }
            }
            foreach (var mode in extWeapon.Modes)
            {
                if (mode.Value.AmmoCategory == null)
                {
                    continue;
                }
                ;
                if ((mode.Value.AmmoCategory.BaseCategory != AmmoCategory.NotSet) && (mode.Value.AmmoCategory.Index == ammoCategory.Index))
                {
                    return(true);
                }
                ;
            }
            return(false);
        }
Пример #27
0
        public static WeaponDef UpgradeWeapons(Contract contract, MechComponentDef def)
        {
            var   rand = new Random();
            var   sc   = UnityGameInstance.BattleTechGame.Simulation.Constants;
            var   num  = rand.NextDouble();
            float num1 = ((float)contract.Override.finalDifficulty + Core.Settings.EliteRareWeaponChance) / Core.Settings.WeaponChanceDivisor;
            float num2 = ((float)contract.Override.finalDifficulty + Core.Settings.VeryRareWeaponChance) / Core.Settings.WeaponChanceDivisor;
            float num3 = ((float)contract.Override.finalDifficulty + Core.Settings.RareWeaponChance) / Core.Settings.WeaponChanceDivisor;

            float[] array = null;
            Logger.LogDebug("Rarity Roll For Weapon: " + num.ToString());
            Logger.LogDebug("   " + num1 + " Needed for Elite" + num2 + " Needed for Very Rare; " + num3 + " Needed for Rare");

            if (num < num1)
            {
                Logger.LogDebug("Very Rare Upgrade.");
                array = Core.Settings.EliteRareWeaponLevel;
            }
            else if (num < num2)
            {
                Logger.LogDebug("Very Rare Upgrade.");
                array = Core.Settings.VeryRareWeaponLevel;
            }
            else if (num < num3)
            {
                Logger.LogDebug("Rare Upgrade.");
                array = Core.Settings.RareWeaponLevel;
            }
            WeaponDef weaponDef = def as WeaponDef;

            if (weaponDef.WeaponSubType == WeaponSubType.NotSet || weaponDef.ComponentTags.Contains("BLACKLISTED"))
            {
                return(weaponDef);
            }

            if (array != null)
            {
                List <WeaponDef_MDD> weaponsByTypeAndRarityAndOwnership = MetadataDatabase.Instance.GetWeaponsByTypeAndRarityAndOwnership(weaponDef.WeaponSubType, array);
                if (weaponsByTypeAndRarityAndOwnership != null && weaponsByTypeAndRarityAndOwnership.Count > 0)
                {
                    weaponsByTypeAndRarityAndOwnership.Shuffle <WeaponDef_MDD>();
                    WeaponDef_MDD weaponDef_MDD = weaponsByTypeAndRarityAndOwnership[0];
                    var           DataManager   = (DataManager)Traverse.Create(contract).Field("dataManager").GetValue();
                    weaponDef = DataManager.WeaponDefs.Get(weaponDef_MDD.WeaponDefID);
                }
            }
            return(weaponDef);
        }
Пример #28
0
 private static float SyncDamage(this WeaponDef weapon, DamageKeywordDef damageType, Func <float, float> handler)
 {
     lock ( weapon ) {
         if (weapon == null)
         {
             throw new ArgumentNullException(nameof(weapon));
         }
         if (damageType == null)
         {
             throw new ArgumentNullException(nameof(damageType));
         }
         var list = weapon.DamagePayload.DamageKeywords;
         var pair = list.FirstOrDefault(e => e.DamageKeywordDef == damageType);
         var orig = pair?.Value ?? 0;
         if (handler == null)
         {
             return(orig);
         }
         var value = handler(orig);
         if (value == orig)
         {
             return(orig);
         }
         object[] logArg = new object[] { weapon.name, damageType.name, orig, value };
         if (value > 0)
         {
             if (pair == null)
             {
                 ZyMod.ApiLog(TraceEventType.Start, "Adding {1} {3} to {0}", logArg);
                 list.Add(pair = new DamageKeywordPair {
                     DamageKeywordDef = damageType, Value = value
                 });
             }
             else
             {
                 ZyMod.ApiLog(TraceEventType.Start, "Update {0} {1} {2} to {3}", logArg);
                 pair.Value = value;
             }
         }
         else if (pair != null)
         {
             ZyMod.ApiLog(TraceEventType.Start, "Removing {1} {2} from {0}", logArg);
             list.Remove(pair);
         }
         return(orig);
     }
 }
Пример #29
0
        public static void Postfix(WeaponDef __instance)
        {
            try
            {
                var def = __instance;

                var changes = AutoFixerFeature.settings.AutoFixWeaponDefSlotsChanges;
                if (changes == null)
                {
                    return;
                }

                if (def.ComponentTags.IgnoreAutofix())
                {
                    return;
                }

                foreach (var change in changes.Where(x => x.Type == def.WeaponSubType))
                {
                    if (change.SlotChange != null)
                    {
                        var newValue = change.SlotChange.Change(def.InventorySize);
                        if (!newValue.HasValue)
                        {
                            return;
                        }
                        Traverse.Create(def).Property("InventorySize").SetValue(newValue);
                    }

                    if (change.TonnageChange != null)
                    {
                        var newValue = change.TonnageChange.Change(def.Tonnage);
                        if (!newValue.HasValue)
                        {
                            return;
                        }
                        Traverse.Create(def).Property("Tonnage").SetValue(newValue);
                    }
                }
            }
            catch (Exception e)
            {
                Control.mod.Logger.LogError(e);
            }
        }
Пример #30
0
        private static DumperDataEntry FillVehicle(VehicleDef v)
        {
            DumperDataEntry d = new DumperDataEntry();

            d.DataTxt    = new string[3];
            d.Sort       = $"{v.Chassis.Tonnage,3}_{TryLoc(v.Description.Name)}";
            d.DataTxt[0] = v.Chassis.Tonnage + "t " + v.Description.Name;
            d.DataTxt[1] = v.Chassis.MovementCapDef.MaxWalkDistance + "";
            Dictionary <string, int> eq = new Dictionary <string, int>();

            foreach (VehicleComponentRef c in v.Inventory)
            {
                if (c.ComponentDefType == ComponentType.Weapon)
                {
                    WeaponDef wep = c.Def as WeaponDef;
                    if (wep != null && wep.WeaponCategoryValue.IsMelee || wep.WeaponSubType == WeaponSubType.AIImaginary || wep.WeaponEffectID.Contains("WeaponEffect-Artillery"))
                    {
                        continue;
                    }
                }
                string key = c.Def.Description.Id;
                if (eq.ContainsKey(key))
                {
                    eq[key]++;
                }
                else
                {
                    eq.Add(key, 1);
                }
            }
            string txteq = "";

            foreach (string key in eq.Keys.OrderBy((k) => k))
            {
                if (!string.IsNullOrEmpty(txteq))
                {
                    txteq += ",";
                }
                txteq += key + ":" + eq[key];
            }
            d.DataTxt[2] = txteq;
            d.DataCsv    = v.Chassis.Tonnage + ";" + TryLoc(v.Description.Name) + ";" + v.Chassis.MovementCapDef.MaxWalkDistance + ";" + v.Description.Id + ";" + v.Chassis.Description.Id + ";" + txteq;
            return(d);
        }