//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); }
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); }
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()); } } }
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); }
public void OnEventDidTrigger(RulePrepareDamage evt) { }
static void Postfix(RulePrepareDamage __instance, RulebookEventContext context) { UnitCombatState_get_IsFlanked_Patch.PopFlankingParametersIfTypeMatches(typeof(RulePrepareDamage_OnTrigger_Patch)); }