Esempio n. 1
0
 private static void Postfix(ToHit __instance, ref string __result, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot)
 {
     if (attacker.HasMovedThisRound && attacker.JumpedLastRound)
     {
         __result = string.Format("{0}JUMPED {1:+#;-#}; ", __result, CBTMovement.Settings.ToHitSelfJumped);
     }
 }
Esempio n. 2
0
        static void Postfix(ToHit __instance, ref float __result, Mech attacker, ICombatant target, Vector3 targetPosition, MeleeAttackType meleeAttackType)
        {
            Mod.Log.Trace?.Write("TH:GAMM entered");

            if (__instance == null)
            {
                return;
            }

            MeleeAttack selectedAttack = ModState.GetSelectedAttack(attacker);

            if (selectedAttack == null)
            {
                return;
            }

            Mod.Log.Debug?.Write("Adding CBTBE modifiers to ToHit");
            int sumMod = 0;

            foreach (KeyValuePair <string, int> kvp in selectedAttack.AttackModifiers)
            {
                string localText = new Text(Mod.LocalizedText.Labels[kvp.Key]).ToString();
                Mod.Log.Debug?.Write($" - Found attack modifier: {localText} = {kvp.Value}, adding to sum modifier");
                sumMod += kvp.Value;
            }

            __result += (float)sumMod;
        }
Esempio n. 3
0
 private static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot)
 {
     if (attacker.HasMovedThisRound && attacker.JumpedLastRound)
     {
         __result = __result + (float)CBTMovement.Settings.ToHitSelfJumped;
     }
 }
            private static void Postfix(ToHit __instance, ref string __result, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot)
            {
                Pilot pilot = attacker.GetPilot();

                if (pilot.pilotDef.PilotTags.Contains("pilot_reckless"))
                {
                    __result = string.Format("{0}RECKLESS {1:+#;-#}; ", __result, settings.pilot_reckless_ToHitBonus);
                }

                if (pilot.pilotDef.PilotTags.Contains("pilot_cautious"))
                {
                    __result = string.Format("{0}CAUTIOUS {1:+#;-#}; ", __result, settings.pilot_cautious_ToHitBonus);
                }

                if (pilot.pilotDef.PilotTags.Contains("pilot_drunk") && pilot.pilotDef.TimeoutRemaining > 0)
                {
                    __result = string.Format("{0}DRUNK {1:+#;-#}; ", __result, settings.pilot_drunk_ToHitBonus);
                }

                if (pilot.pilotDef.PilotTags.Contains("pilot_lostech") && weapon.componentDef.ComponentTags.Contains("component_type_lostech"))
                {
                    __result = string.Format("{0}LOSTECH TECHNICIAN {1:+#;-#}; ", __result, settings.pilot_lostech_ToHitBonus);
                }

                if (pilot.pilotDef.PilotTags.Contains("pilot_jinxed"))
                {
                    __result = string.Format("{0}JINXED {1:+#;-#}; ", __result, settings.pilot_reckless_ToHitBonus);
                }
            }
Esempio n. 5
0
        static void Postfix(ToHit __instance, ref string __result, AbstractActor attacker, Weapon weapon, ICombatant target,
                            Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot)
        {
            Mod.Log.Trace?.Write("TH:GAMD entered");

            if (attacker.HasMovedThisRound && attacker.JumpedLastRound ||
                (SharedState.CombatHUD?.SelectionHandler?.ActiveState != null &&
                 SharedState.CombatHUD?.SelectionHandler?.ActiveState is SelectionStateJump))
            {
                string localText = new Text(Mod.LocalizedText.Labels[ModText.LT_Label_Attacker_Jumped]).ToString();
                __result = string.Format("{0}{1} {2:+#;-#}; ", __result, localText, Mod.Config.ToHitSelfJumped);
            }

            // Check melee patches
            MeleeAttack selectedAttack = ModState.GetSelectedAttack(attacker);

            if (selectedAttack != null && weapon.Type == WeaponType.Melee)
            {
                foreach (KeyValuePair <string, int> kvp in selectedAttack.AttackModifiers)
                {
                    string localText = new Text(Mod.LocalizedText.Labels[kvp.Key]).ToString();
                    Mod.Log.Info?.Write($" - Found attack modifier for desc: {localText} = {kvp.Value}");

                    __result = string.Format("{0}{1} {2:+#;-#}; ", __result, localText, kvp.Value);
                }
            }
        }
Esempio n. 6
0
            public static void Postfix(ToHit __instance, ref string __result, CombatGameState ___combat, AbstractActor attacker, Weapon weapon, ICombatant target)
            {
                try
                {
                    if (DemandingJumps.Settings.ToHitSelfJumpedSpareAI && !___combat.LocalPlayerTeam.IsActive)
                    {
                        return;
                    }
                    Logger.Info("[ToHit_GetAllModifiersDescription_POSTFIX] CombatGameState.LocalPlayerTeam.IsActive: " + ___combat.LocalPlayerTeam.IsActive);



                    bool AttackerJumpedThisRound = attacker.HasMovedThisRound && attacker.JumpedLastRound;
                    Logger.Info("[ToHit_GetAllModifiersDescription_POSTFIX] Fields.JumpPreview: " + Fields.JumpPreview);
                    Logger.Info("[ToHit_GetAllModifiersDescription_POSTFIX] AttackerJumpedThisRound: " + AttackerJumpedThisRound);

                    if (AttackerJumpedThisRound)
                    {
                        int ToHitSelfJumpedModifier = Utilities.GetAttackerJumpedAccuracyModifier(attacker);
                        Logger.Debug("[ToHit_GetAllModifiersDescription_POSTFIX] Add description for ToHitSelfJumped: " + ToHitSelfJumpedModifier);
                        __result = string.Format("{0}JUMPED {1:+#;-#}; ", __result, ToHitSelfJumpedModifier);
                    }
                }
                catch (Exception e)
                {
                    Logger.Error(e);
                }
            }
Esempio n. 7
0
            public static void Postfix(ToHit __instance, ref float __result, CombatGameState ___combat, AbstractActor attacker, Weapon weapon, ICombatant target)
            {
                try
                {
                    if (DemandingJumps.Settings.ToHitSelfJumpedSpareAI && !___combat.LocalPlayerTeam.IsActive)
                    {
                        return;
                    }
                    Logger.Info("[ToHit_GetAllModifiers_POSTFIX] CombatGameState.LocalPlayerTeam.IsActive: " + ___combat.LocalPlayerTeam.IsActive);



                    bool AttackerJumpedThisRound = attacker.HasMovedThisRound && attacker.JumpedLastRound;
                    Logger.Info("[ToHit_GetAllModifiers_POSTFIX] Fields.JumpPreview: " + Fields.JumpPreview);
                    Logger.Info("[ToHit_GetAllModifiers_POSTFIX] AttackerJumpedThisRound: " + AttackerJumpedThisRound);

                    if (Fields.JumpPreview || AttackerJumpedThisRound)
                    {
                        int ToHitSelfJumpedModifier = Utilities.GetAttackerJumpedAccuracyModifier(attacker);
                        Logger.Info("[ToHit_GetAllModifiers_POSTFIX] Unit previews jump or already jumped. Applying ToHit penalty.");
                        __result = __result + (float)ToHitSelfJumpedModifier;
                    }
                }
                catch (Exception e)
                {
                    Logger.Error(e);
                }
            }
Esempio n. 8
0
        List <ListViewItem> IWeaponModifier.ToListViewItems()
        {
            var collection = new List <ListViewItem>();
            var toHit      = new ListViewItem(new [] { "ToHit", ToHit.ToString(CultureInfo.InvariantCulture) });

            collection.Add(toHit);
            return(collection);
        }
 public static bool OverrideHitChanceStepNClamp(ToHit __instance, ref float __result, float baseChance, float totalModifiers)
 {
     try {
         // A pretty intense routine that AI use to evaluate attacks, try catch disabled.
         //Log( "OverrideHitChanceStepNClamp - Base Hit {0}, Modifier {1}", baseChance, totalModifiers );
         __result = ClampHitChance(__instance.GetSteppedValue(baseChance, totalModifiers));
         return(false);
     }                 catch (Exception ex) { return(Error(ex)); }
 }
            private static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker, Weapon weapon, ICombatant target,
                                        Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot)
            {
                Mod.Log.Trace("TH:GAM entered");

                if (attacker.HasMovedThisRound && attacker.JumpedLastRound)
                {
                    __result = __result + (float)Mod.Config.ToHitSelfJumped;
                }
            }
Esempio n. 11
0
        private static float CounterNarc(ToHit tohit, AbstractActor attacker, Weapon wep, ICombatant target, Vector3 apos, Vector3 tpos, LineOfFireLevel lof, MeleeAttackType mat, bool calledshot)
        {
            AbstractActor at = target as AbstractActor;

            if (at != null && at.HasIndirectFireImmunity && at.Combat.EffectManager.GetAllEffectsTargetingWithBaseID(at, "StatusEffect-NARC-IncomingAttBonus").Count > 0)
            {
                return(3);
            }
            return(0);
        }
Esempio n. 12
0
 // Token: 0x06000026 RID: 38
 private static void Postfix(ToHit __instance, ref string __result, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot)
 {
     if (UnityGameInstance.BattleTechGame.Simulation != null)
     {
         Mod.Log.Trace("TH:GAMD entered");
         if (attacker.HasMovedThisRound && attacker.JumpedLastRound && attacker.SkillTactics < Mod.Config.TacticsSkillNegateJump)
         {
             __result = string.Format("{0}JUMPED {1:+#;-#}; ", __result, Mod.Config.ToHitSelfJumped);
         }
     }
 }
Esempio n. 13
0
        public static void Postfix(ToHit __instance, AbstractActor attacker, ref float __result)
        {
            Pilot pilot   = attacker.GetPilot();
            int   tactics = pilot.Tactics;
            bool  flag    = tactics >= 8;

            if (flag)
            {
                __result = 0f;
            }
        }
Esempio n. 14
0
            public static bool Prefix(ToHit __instance, ICombatant target, bool isMoraleAttack, ref float __result)
            {
                float num      = 0f;
                var   modifier = target.StatCollection.GetValue <float>("ToHitOffensivePushModifier");

                CombatGameState combat = Traverse.Create(__instance).Field("combat").GetValue <CombatGameState>();

                num     += combat.Constants.ToHit.ToHitOffensivePush;
                __result = (!isMoraleAttack) ? 0f : num + target.StatCollection.GetValue <float>("ToHitOffensivePushModifier");
                Logger.Debug($"Offensive Push modifier should be {combat.Constants.ToHit.ToHitOffensivePush} + {modifier}");
                return(false);
            }
Esempio n. 15
0
            // Token: 0x06000025 RID: 37
            private static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot)
            {
                if (UnityGameInstance.BattleTechGame.Simulation != null && weapon != null)
                {
                    Mod.Log.Trace("TH:GAM entered");
                    bool flag3;
                    if (!attacker.HasMovedThisRound || !attacker.JumpedLastRound || attacker.SkillTactics >= Mod.Config.TacticsSkillNegateJump)
                    {
                        CombatHUD combatHUD = ModState.CombatHUD;
                        bool      flag2;
                        if (combatHUD == null)
                        {
                            flag2 = false;
                        }
                        else
                        {
                            CombatSelectionHandler selectionHandler = combatHUD.SelectionHandler;
                            flag2 = (((selectionHandler != null) ? selectionHandler.ActiveState : null) != null);
                        }
                        if (flag2)
                        {
                            CombatHUD combatHUD2 = ModState.CombatHUD;
                            object    obj;
                            if (combatHUD2 == null)
                            {
                                obj = null;
                            }
                            else
                            {
                                CombatSelectionHandler selectionHandler2 = combatHUD2.SelectionHandler;
                                obj = ((selectionHandler2 != null) ? selectionHandler2.ActiveState : null);
                            }
                            if (obj is SelectionStateJump)
                            {
                                flag3 = (attacker.SkillTactics < Mod.Config.TacticsSkillNegateJump);
                                goto IL_D8;
                            }
                        }
                        flag3 = false;
                    }
                    else
                    {
                        flag3 = true;
                    }
IL_D8:
                    if (flag3)
                    {
                        __result += (float)Mod.Config.ToHitSelfJumped;
                    }
                }
            }
        private static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker, Weapon weapon, ICombatant target,
                                    Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel)
        {
            string cacheKey  = StraightTonnageCalculator.CacheKey(attacker, target);
            bool   keyExists = ModState.CachedComparisonMods.TryGetValue(cacheKey, out int modifier);

            if (!keyExists)
            {
                modifier = StraightTonnageCalculator.Modifier(attacker, target);
                ModState.CachedComparisonMods.Add(cacheKey, modifier);
            }

            __result += modifier;
        }
Esempio n. 17
0
            public static void Postfix(ToHit __instance, ref string __result, AbstractActor attacker, Weapon weapon, ICombatant target)
            {
                if (attacker.UnitType != UnitType.Mech || target == null || attacker == null)
                {
                    return;
                }

                var mech     = attacker as Mech;
                var mechTags = attacker.GetTags();

                if (mechTags.Contains("BR_MQ_Vulcan") && target.UnitType == UnitType.Vehicle)
                {
                    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.VulcanVehicleBonus);
                }


                //if (mechTags.Contains("BR_MQ_Mongoose") && weapon.Type == WeaponType.Laser)
                //    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.MongooseLaserAccuracy);
                //if (mechTags.Contains("BR_MQ_SRMAccuracy") && weapon.Type == WeaponType.SRM)
                //    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.SRMAccuracyBoost);
                //if (mechTags.Contains("BR_MQ_EnergySpecialization") && weapon.weaponDef.Category == WeaponCategory.Energy)
                //    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.EnergySpecializationBonus);
                //if (mechTags.Contains("BR_MQ_EnergySpecialization") && weapon.weaponDef.Category != WeaponCategory.Energy)
                //    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.EnergySpecializationPenalty);
                //if (mechTags.Contains("BR_MQ_Clint") && weapon.Type == WeaponType.Autocannon)
                //    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.ClintAutocannonBonus);
                //if (Methods.TeamHasTag(attacker, "BR_MQ_MassiveSearchLight"))
                //    __result = string.Format("{0}TEAM QUIRK {1:+#;-#}; ", __result, Core.Settings.MassiveSearchLightTeamBonus);
                //if (mechTags.Contains("BR_MQ_AwesomePPC") && weapon.weaponDef.Type == WeaponType.PPC)
                //    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.AwesomePPCBonus);
                //if (mechTags.Contains("BR_MQ_AwesomePPC") && weapon.weaponDef.Category != WeaponCategory.Energy)
                //    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.AwesomeNonPPCPenalty);
                //if (mechTags.Contains("BR_MQ_AllOrNothing") && (weapon.weaponDef.WeaponSubType == WeaponSubType.AC20 ||
                //    weapon.weaponDef.WeaponSubType == WeaponSubType.UAC20 || weapon.weaponDef.WeaponSubType == WeaponSubType.LB20X))
                //    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.AllOrNothingAccuracy);
                //if (mechTags.Contains("BR_MQ_BallisticComputer") && weapon.weaponDef.Category == WeaponCategory.Ballistic)
                //    __result = string.Format("{0}MECH QUIRK {1:+#;-#}; ", __result, Core.Settings.BallisticComputerBonus);

                //***To-Be-Hit Section Follows***
                //var targetName = target.Description.Name;
                //if (targetName == null)
                //    return;

                //if (targetName == "UrbanMech")
                //    __result = string.Format("{0}TARGET QUIRK {1:+#;-#}; ", __result, Core.Settings.UrbieToBeHitPenalty);
                //if (targetName == "Huron Warrior")
                //    __result = string.Format("{0}TARGET QUIRK {1:+#;-#}; ", __result, Core.Settings.IntimidatingToBeHitPenalty);
                //if (targetName == "Atlas")
                //    __result = string.Format("{0}TARGET QUIRK {1:+#;-#}; ", __result, Core.Settings.IntimidatingToBeHitPenalty);
            }
 public static void SmartIndirectReplaceIndirect(ToHit __instance, ref float __result, AbstractActor attacker, bool isIndirect)
 {
     try {
         if (isIndirect || !ModifierList.AttackWeapon.IndirectFireCapable || !attacker.team.IsLocalPlayer)
         {
             return;
         }
         if (!ShouldSmartIndirect(attacker, ModifierList.Target))
         {
             return;
         }
         __result = __instance.GetIndirectModifier(attacker);
     }                 catch (Exception ex) { Error(ex); }
 }
Esempio n. 19
0
 public static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker)
 {
     Mod.Log.Trace("TH:GHM entered.");
     if (attacker is Mech mech && mech.StatCollection.ContainsStatistic(ModStats.TurnsOverheated))
     {
         int turnsOverheated = mech.StatCollection.GetValue <int>(ModStats.TurnsOverheated);
         if (turnsOverheated > 0)
         {
             float modifier = HeatHelper.GetHeatToHitModifierForTurn(turnsOverheated);
             __result = modifier;
             Mod.Log.Debug($"Mech {CombatantHelper.LogLabel(mech)} has overheat ToHit modifier:{modifier}");
         }
         else
         {
             __result = 0f;
         }
     }
 }
Esempio n. 20
0
            public static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker, ICombatant target)
            {
                try
                {
                    if (__result == 0 || !WEAPON.IndirectFireCapable || !ShouldSmartIndirect(attacker, target))
                    {
                        return;
                    }



                    __result = attacker.team.IsLocalPlayer ? 0 : __instance.GetIndirectModifier(attacker);
                }
                catch (Exception e)
                {
                    Logger.Error(e);
                }
            }
Esempio n. 21
0
            public static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker)
            {
                Mod.Log.Trace("TH:GHM entered.");
                if (attacker is Mech mech && mech.IsOverheated)
                {
                    float penalty = 0f;
                    foreach (KeyValuePair <int, int> kvp in Mod.Config.Heat.Firing)
                    {
                        if (mech.CurrentHeat >= kvp.Key)
                        {
                            penalty = kvp.Value;
                            //Mod.Log.Debug($"  attackPenalty:{penalty} from heat: {mech.CurrentHeat} >= {kvp.Key}");
                        }
                    }

                    __result = penalty;
                }
            }
Esempio n. 22
0
            public static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker, bool isIndirect)
            {
                try
                {
                    if (isIndirect || !WEAPON.IndirectFireCapable || !attacker.team.IsLocalPlayer || !ShouldSmartIndirect(attacker, TARGET))
                    {
                        return;
                    }



                    __result = __instance.GetIndirectModifier(attacker);
                }
                catch (Exception e)
                {
                    Logger.Error(e);
                }
            }
        public static void Postfix(ToHit __instance, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot, ref string __result)
        {
            string str  = string.Empty;
            bool   flag = lofLevel < LineOfFireLevel.LOFObstructed && (CustomAmmoCategories.getIndirectFireCapable(weapon));
            float  weaponDirectFireModifier = CustomAmmoCategories.getDirectFireModifier(weapon);

            if (flag == false)
            {
                //CustomAmmoCategoriesLog.Log.LogWrite(attacker.DisplayName + " has LOS on " + target.DisplayName + ". Apply DirectFireModifier " + weaponDirectFireModifier + "\n");
                if (!NvMath.FloatIsNearZero(weaponDirectFireModifier))
                {
                    __result = string.Format("{0}WEAPON-DIRECT-FIRE {1:+#;-#}; ", (object)__result, (object)(int)weaponDirectFireModifier);
                }
            }
            CombatGameState combat = (CombatGameState)typeof(ToHit).GetField("combat", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(__instance);

            return;
        }
Esempio n. 24
0
        public static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker)
        {
            Mod.Log.Trace?.Write("TH:GHM entered.");
            if (attacker is Mech mech && mech.IsOverheated)
            {
                float penalty = 0f;
                foreach (KeyValuePair <int, int> kvp in Mod.Config.Heat.Firing)
                {
                    if (mech.CurrentHeat >= kvp.Key)
                    {
                        penalty = kvp.Value;
                    }
                }

                Mod.Log.Trace?.Write($"  AttackPenalty: {penalty:+0;-#} from heat: {mech.CurrentHeat} for actor: {attacker.DistinctId()}");
                __result = penalty;
            }
        }
Esempio n. 25
0
        private static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker)
        {
            if (attacker is Mech)
            {
                Mech mech = (Mech)attacker;

                int turnsOverheated = mech.StatCollection.GetValue <int>("TurnsOverheated");
                if (turnsOverheated > 0)
                {
                    float modifier = CBTHeat.GetHeatToHitModifierForTurn(turnsOverheated);

                    __result = modifier;
                }
                else
                {
                    __result = 0f;
                }
            }
        }
Esempio n. 26
0
        static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker, Weapon weapon, ICombatant target,
                            Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot)
        {
            Mod.Log.Trace?.Write("TH:GAM entered");

            if (__instance == null || weapon == null)
            {
                return;
            }

            if (
                (attacker.HasMovedThisRound && attacker.JumpedLastRound) ||
                (SharedState.CombatHUD?.SelectionHandler?.ActiveState != null &&
                 SharedState.CombatHUD?.SelectionHandler?.ActiveState is SelectionStateJump)
                )
            {
                __result += (float)Mod.Config.ToHitSelfJumped;
            }
        }
 public static bool OverrideHitChanceDiminishing(ToHit __instance, ref float __result, float baseChance, float totalModifiers)
 {
     try {
         // A pretty intense routine that AI use to evaluate attacks
         int mod = Mathf.RoundToInt(totalModifiers);
         if (mod < 0)
         {
             mod         = Math.Min(Settings.DiminishingBonusMax, -mod);
             baseChance *= diminishingBonus  [mod - 1];
         }
         else if (mod > 0)
         {
             mod         = Math.Min(Settings.DiminishingPenaltyMax, mod);
             baseChance *= diminishingPenalty[mod - 1];
         }
         __result = ClampHitChance(baseChance);
         return(false);
     }                 catch (Exception ex) { return(Error(ex)); }
 }
            private static void Postfix(ToHit __instance, ref float __result, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot)
            {
                Pilot pilot = attacker.GetPilot();

                try {
                    Pilot TargetPilot = target.GetPilot();
                    if (TargetPilot.pilotDef.PilotTags.Contains("pilot_reckless"))
                    {
                        __result = __result + (float)settings.pilot_reckless_ToBeHitBonus;
                    }
                    if (TargetPilot.pilotDef.PilotTags.Contains("pilot_cautious"))
                    {
                        __result = __result + (float)settings.pilot_reckless_ToBeHitBonus;
                    }
                    if (TargetPilot.pilotDef.PilotTags.Contains("pilot_jinxed"))
                    {
                        __result = __result + (float)settings.pilot_jinxed_ToBeHitBonus;
                    }
                    if (TargetPilot.pilotDef.PilotTags.Contains("pilot_jinxed"))
                    {
                        __result = __result + (float)settings.pilot_reckless_ToBeHitBonus;
                    }
                }
                catch (Exception) {
                }
                if (pilot.pilotDef.PilotTags.Contains("pilot_reckless"))
                {
                    __result = __result + (float)settings.pilot_reckless_ToHitBonus;
                }
                if (pilot.pilotDef.PilotTags.Contains("pilot_cautious"))
                {
                    __result = __result + (float)settings.pilot_reckless_ToHitBonus;
                }
                if (pilot.pilotDef.PilotTags.Contains("pilot_drunk") && pilot.pilotDef.TimeoutRemaining > 0)
                {
                    __result = __result + (float)settings.pilot_drunk_ToHitBonus;
                }
                if (pilot.pilotDef.PilotTags.Contains("pilot_lostech") && weapon.componentDef.ComponentTags.Contains("component_type_lostech"))
                {
                    __result = __result + (float)settings.pilot_lostech_ToHitBonus;
                }
            }
        public static void Postfix(ToHit __instance, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot, ref float __result)
        {
            bool  flag = lofLevel < LineOfFireLevel.LOFObstructed && (CustomAmmoCategories.getIndirectFireCapable(weapon));
            float num  = __result;

            if (flag == false)
            {
                //float directFireModifier = CustomAmmoCategories.getDirectFireModifier(weapon);
                //CustomAmmoCategoriesLog.Log.LogWrite(attacker.DisplayName+" has LOS on "+target.DisplayName+ ". Apply DirectFireModifier "+directFireModifier+"\n");
                num += CustomAmmoCategories.getDirectFireModifier(weapon);
            }
            CombatGameState combat = (CombatGameState)typeof(ToHit).GetField("combat", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(__instance);

            if ((double)num < 0.0 && !combat.Constants.ResolutionConstants.AllowTotalNegativeModifier)
            {
                num = 0.0f;
            }
            __result = num;
            return;
        }
Esempio n. 30
0
        /*static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
         * {
         *  var targetPropertyGetter = AccessTools.Property(typeof(Weapon), "IndirectFireCapable").GetGetMethod();
         *  var replacementMethod = AccessTools.Method(typeof(ToHit_GetAllModifiers), nameof(IndirectFireCapable));
         *  return Transpilers.MethodReplacer(instructions, targetPropertyGetter, replacementMethod);
         * }
         *
         * private static bool IndirectFireCapable(Weapon weapon)
         * {
         *  //CustomAmmoCategoriesLog.Log.LogWrite("get ToHit_GetAllModifiers IndirectFireCapable\n");
         *  return CustomAmmoCategories.getIndirectFireCapable(weapon);
         * }*/

        public static bool Prefix(ToHit __instance, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, bool isCalledShot, ref float __result)
        {
            bool  flag = lofLevel < LineOfFireLevel.LOFObstructed && (CustomAmmoCategories.getIndirectFireCapable(weapon));
            float num  = __instance.GetRangeModifier(weapon, attackPosition, targetPosition)
                         + __instance.GetCoverModifier(attacker, target, lofLevel)
                         + __instance.GetSelfSpeedModifier(attacker)
                         + __instance.GetSelfSprintedModifier(attacker)
                         + __instance.GetSelfArmMountedModifier(weapon)
                         + __instance.GetStoodUpModifier(attacker)
                         + __instance.GetHeightModifier(attackPosition.y, targetPosition.y)
                         + __instance.GetHeatModifier(attacker)
                         + __instance.GetTargetTerrainModifier(target, targetPosition, false)
                         + __instance.GetSelfTerrainModifier(attackPosition, false)
                         + __instance.GetTargetSpeedModifier(target, weapon)
                         + __instance.GetSelfDamageModifier(attacker, weapon)
                         + __instance.GetTargetSizeModifier(target)
                         + __instance.GetTargetShutdownModifier(target, false)
                         + __instance.GetTargetProneModifier(target, false)
                         + __instance.GetWeaponAccuracyModifier(attacker, weapon)
                         + __instance.GetAttackerAccuracyModifier(attacker)
                         + __instance.GetEnemyEffectModifier(target)
                         + __instance.GetRefireModifier(weapon)
                         + __instance.GetTargetDirectFireModifier(target, flag)
                         + __instance.GetIndirectModifier(attacker, flag)
                         + __instance.GetMoraleAttackModifier(target, isCalledShot);

            if (flag == false)
            {
                float directFireModifier = CustomAmmoCategories.getDirectFireModifier(weapon);
                CustomAmmoCategoriesLog.Log.LogWrite(attacker.DisplayName + " has LOS on " + target.DisplayName + ". Apply DirectFireModifier " + directFireModifier + "\n");
                num += CustomAmmoCategories.getDirectFireModifier(weapon);
            }
            CombatGameState combat = (CombatGameState)typeof(ToHit).GetField("combat", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(__instance);

            if ((double)num < 0.0 && !combat.Constants.ResolutionConstants.AllowTotalNegativeModifier)
            {
                num = 0.0f;
            }
            __result = num;
            return(false);
        }