//static public Dictionary<(MechanicsContext, UnitEntityData), bool> spell_target_map = new Dictionary<(MechanicsContext, UnitEntityData), bool>();
        static bool Prefix(RulePrepareDamage __instance, RulebookEventContext context)
        {
            if (!Main.settings.one_sneak_attack_per_target_per_spell)
            {
                return(true);
            }
            AbilityData ability = __instance.ParentRule?.Reason?.Ability;

            if (ability == null || __instance.Target == null)
            {
                return(true);
            }

            var context2 = __instance.ParentRule?.Reason?.Context;

            if (context2 == null)
            {
                return(true);
            }

            var unit_part_affected_by_spell = __instance.Target.Ensure <UnitPartAffectedBySpell>();

            if (!unit_part_affected_by_spell.contexts.Contains(context2))
            {
                unit_part_affected_by_spell.contexts.Add(context2);
                return(true);
            }

            __instance.IsSurpriseSpell = false;
            __instance.ParentRule.AttackRoll?.UseSneakAttack();
            return(true);
        }
Пример #2
0
            public void OnEventAboutToTrigger(RulePrepareDamage evt)
            {
                var context2 = Helpers.GetMechanicsContext()?.SourceAbilityContext;

                if (context2 == null)
                {
                    var source_buff = (evt.Reason?.Item as ItemEntityWeapon)?.Blueprint.GetComponent <NewMechanics.EnchantmentMechanics.WeaponSourceBuff>()?.buff;

                    if (source_buff != null)
                    {
                        context2 = evt.Initiator.Buffs?.GetBuff(source_buff)?.MaybeContext?.SourceAbilityContext;
                    }
                }
                if (context2 == null)
                {
                    return;
                }

                if (context2.SourceAbility.IsSpell)
                {
                    foreach (BaseDamage item in evt.DamageBundle)
                    {
                        (item as EnergyDamage)?.ReplaceEnergy(this.Element);
                    }
                }
            }
        static bool Prefix(RulePrepareDamage __instance, RulebookEventContext context)
        {
            FlankingParameters flankedParameters = new FlankingParameters(typeof(RulePrepareDamage_OnTrigger_Patch), __instance.Initiator, true, null, null);

            UnitCombatState_get_IsFlanked_Patch.PushFlankingParameters(flankedParameters);
            return(true);
        }
Пример #4
0
        static bool Prefix(PreciseStrike __instance, RulePrepareDamage evt)
        {
            if (!evt.Target.isFlankedByAttacker(__instance.Owner.Unit) || evt.DamageBundle.Weapon == null)
            {
                return(false);
            }
            bool flag = (bool)__instance.Owner.State.Features.SoloTactics;

            if (!flag)
            {
                foreach (UnitEntityData unitEntityData in evt.Target.CombatState.EngagedBy)
                {
                    flag = unitEntityData.Descriptor.HasFact(__instance.PreciseStrikeFact) && unitEntityData != __instance.Owner.Unit;
                    if (flag && evt.Target.isFlankedByAttacker(unitEntityData))
                    {
                        break;
                    }
                }
            }
            if (!flag)
            {
                return(false);
            }
            BaseDamage damage = __instance.Damage.CreateDamage();

            evt.DamageBundle.Add(damage);
            return(false);
        }
 public void OnBeforeRulebookEventTrigger(RulePrepareDamage evt)
 {
     if (evt.ParentRule.TryGetCustomData(DuplicateDamageKey, out bool duplicate) && duplicate)
     {
         foreach (var damage in evt.DamageBundle.ToArray())
         {
             evt.Add(damage.Copy());
         }
     }
 }
Пример #6
0
        static bool Prefix(PreciseStrike __instance, RulePrepareDamage evt)
        {
            BlueprintUnitFact preciseStrikeFact = __instance.PreciseStrikeFact;

            Func <UnitEntityData, UnitEntityData, UnitEntityData, bool> hasPreciseStrike =
                (target, owner, flankingPartner) => owner.Descriptor.State.Features.SoloTactics || flankingPartner.Descriptor.HasFact(preciseStrikeFact);

            FlankingParameters flankingParameters = new FlankingParameters(typeof(PreciseStrike_OnEventAboutToTrigger_Patch), __instance.Owner.Unit, hasPreciseStrike);

            UnitCombatState_get_IsFlanked_Patch.PushFlankingParameters(flankingParameters);

            return(true);
        }
Пример #7
0
 public void OnEventDidTrigger(RulePrepareDamage evt)
 {
 }
 static void Postfix(RulePrepareDamage __instance, RulebookEventContext context)
 {
     UnitCombatState_get_IsFlanked_Patch.PopFlankingParametersIfTypeMatches(typeof(RulePrepareDamage_OnTrigger_Patch));
 }