public override void OnTurnOn()
        {
            base.OnTurnOn();

            RuleCalculateAttacksCount calculateAttacksCount = Rulebook.Trigger <RuleCalculateAttacksCount>(new RuleCalculateAttacksCount(this.Owner.Unit)
            {
                ForceIterativeNaturealAttacks = true
            });

            this.m_MainAttacksCount      = calculateAttacksCount.PrimaryHand.MainAttacks;
            this.m_PenalizedAttacksCount = calculateAttacksCount.PrimaryHand.PenalizedAttacks;
            this.m_AttackPenalty         = 0;
        }
Пример #2
0
        public void OnEventDidTrigger(RuleCalculateAttacksCount evt)
        {
            this.valid = false;
            if (!evt.Initiator.Ensure <FullAttackWatcherUnitPart>().is_full_attack)
            {
                return;
            }

            int num_attacks = evt.PrimaryHand.MainAttacks + evt.PrimaryHand.PenalizedAttacks + evt.SecondaryHand.MainAttacks + evt.SecondaryHand.PenalizedAttacks;

            if (num_attacks <= 1 || evt.PrimaryHand.MainAttacks <= 0)
            {
                return;
            }

            evt.PrimaryHand.MainAttacks--;
            this.valid = true;
        }
        /*static IEnumerable<Harmony12.CodeInstruction> Transpiler(IEnumerable<Harmony12.CodeInstruction> instructions)
         * {
         *  var codes = instructions.ToList();
         *  var check_is_unarmed = codes.FindIndex(x => x.opcode == System.Reflection.Emit.OpCodes.Callvirt && x.operand.ToString().Contains("IsUnarmed")); //checking is unarmed on weapon on primary hand
         *
         *  codes[check_is_unarmed] = new Harmony12.CodeInstruction(System.Reflection.Emit.OpCodes.Ldarg_0);
         *  codes.Insert(check_is_unarmed + 1, new Harmony12.CodeInstruction(System.Reflection.Emit.OpCodes.Call, new Func<BlueprintItemWeapon, RuleCalculateAttacksCount, bool>(considerUnarmedAndIgnore).Method));
         *
         *  check_is_unarmed = codes.IndexOf(codes.FindAll(x => x.opcode == System.Reflection.Emit.OpCodes.Callvirt && x.operand.ToString().Contains("IsUnarmed"))[2]);
         *  codes[check_is_unarmed] = new Harmony12.CodeInstruction(System.Reflection.Emit.OpCodes.Ldarg_0);
         *  codes.Insert(check_is_unarmed + 1, new Harmony12.CodeInstruction(System.Reflection.Emit.OpCodes.Call, new Func<BlueprintItemWeapon, RuleCalculateAttacksCount, bool>(considerUnarmedAndIgnoreOffHand).Method));
         *  return codes.AsEnumerable();
         * }*/

        static bool Prefix(RuleCalculateAttacksCount __instance, RulebookEventContext context)
        {
            int                 bab = (int)__instance.Initiator.Stats.BaseAttackBonus;
            int                 num_penalized_attacks = Math.Min(Math.Max(0, bab / 5 - (bab % 5 == 0 ? 1 : 0)), 3);
            HandSlot            primary_hand          = __instance.Initiator.Body.PrimaryHand;
            HandSlot            secondary_hand        = __instance.Initiator.Body.SecondaryHand;
            BlueprintItemWeapon blueprint1            = primary_hand.MaybeWeapon?.Blueprint;
            BlueprintItemWeapon blueprint2            = secondary_hand.MaybeShield != null ? ((bool)__instance.Initiator.Descriptor.State.Features.ShieldBash ? secondary_hand.MaybeShield.WeaponComponent?.Blueprint : null) : secondary_hand.MaybeWeapon?.Blueprint;
            int                 num = primary_hand.MaybeWeapon == null ? 0 : (primary_hand.MaybeWeapon.HoldInTwoHands ? 1 : 0);

            if ((secondary_hand.MaybeWeapon?.HoldInTwoHands).GetValueOrDefault() == false &&
                (blueprint1 != null) &&
                (!considerUnarmedAndIgnore(blueprint1, __instance) || blueprint2 == null || blueprint2.IsUnarmed)
                )
            {
                ++__instance.PrimaryHand.MainAttacks;
                if (!blueprint1.IsNatural || (bool)__instance.Initiator.Descriptor.State.Features.IterativeNaturalAttacks || __instance.ForceIterativeNaturealAttacks || blueprint1.IsUnarmed)
                {
                    __instance.PrimaryHand.PenalizedAttacks += Math.Max(0, num_penalized_attacks);
                }
            }
            if ((secondary_hand.MaybeWeapon?.HoldInTwoHands).GetValueOrDefault() == true ||
                (blueprint2 == null) ||
                considerUnarmedAndIgnoreOffHand(blueprint2, __instance) && (blueprint1 != null) ||
                (primary_hand.MaybeWeapon?.HoldInTwoHands).GetValueOrDefault() == true
                )
            {
                return(false);
            }
            ++__instance.SecondaryHand.MainAttacks;
            if (blueprint1 == null || !considerUnarmedAndIgnore(blueprint1, __instance) &&
                (blueprint1 == null || !blueprint1.IsNatural || !(bool)__instance.Initiator.Descriptor.State.Features.IterativeNaturalAttacks && !__instance.ForceIterativeNaturealAttacks) ||
                (blueprint2.IsUnarmed)
                )
            {
                return(false);
            }
            __instance.SecondaryHand.PenalizedAttacks += Math.Max(0, num_penalized_attacks);
            return(false);
        }
 private static bool considerUnarmedAndIgnoreOffHand(BlueprintItemWeapon weapon, RuleCalculateAttacksCount evt)
 {
     return(Aux.isOffHandUnarmedAndCanBeIgnored(weapon, evt.Initiator.Descriptor));
 }
Пример #5
0
 public void OnEventAboutToTrigger(RuleCalculateAttacksCount evt)
 {
 }