Exemplo n.º 1
0
        private int OnGetEpicWeaponDevastatingCritical(void *pStats, void *pWeapon)
        {
            CNWSCreatureStats stats  = CNWSCreatureStats.FromPointer(pStats);
            CNWSItem          weapon = CNWSItem.FromPointer(pWeapon);
            uint weaponType          = weapon == null ? (uint)BaseItem.Gloves : CNWSItem.FromPointer(pWeapon).m_nBaseItem;

            bool hasApplicableFeat    = false;
            bool applicableFeatExists = epicWeaponDevastatingCriticalMap.TryGetValue(weaponType, out HashSet <ushort>?types);

            if (applicableFeatExists)
            {
                foreach (ushort feat in types !)
                {
                    hasApplicableFeat = stats.HasFeat(feat).ToBool();
                    if (hasApplicableFeat)
                    {
                        break;
                    }
                }
            }

            bool canUseFeat = applicableFeatExists && hasApplicableFeat || getEpicWeaponDevastatingCriticalHook.CallOriginal(pStats, pWeapon).ToBool();

            if (weapon != null && canUseFeat && OnDevastatingCriticalHit != null)
            {
                CNWSCreature         creature    = stats.m_pBaseCreature;
                CNWSCombatRound      combatRound = creature.m_pcCombatRound;
                CNWSCombatAttackData attackData  = combatRound.GetAttack(combatRound.m_nCurrentAttack);

                DevastatingCriticalData devastatingCriticalData = new DevastatingCriticalData
                {
                    Weapon = weapon.ToNwObject <NwItem>() !,
                    Target = creature.m_oidAttackTarget.ToNwObject <NwGameObject>() !,
                    Damage = attackData.GetTotalDamage(1),
                };

                OnDevastatingCriticalHit(devastatingCriticalData);
                if (devastatingCriticalData.Bypass)
                {
                    attackData.m_bKillingBlow = 0;
                    return(0);
                }
            }

            return(canUseFeat.ToInt());
        }
Exemplo n.º 2
0
            private static OnCreatureAttack GetEventData(NwCreature creature, NwGameObject target, CNWSCombatRound combatRound, int attackNumber)
            {
                CNWSCombatAttackData combatAttackData = combatRound.GetAttack(attackNumber);

                return(new OnCreatureAttack
                {
                    CombatAttackData = combatAttackData,
                    Attacker = creature,
                    Target = target,
                    AttackNumber = attackNumber + 1, // 1-based for backwards compatibility
                    WeaponAttackType = (WeaponAttackType)combatAttackData.m_nWeaponAttackType,
                    SneakAttack = (SneakAttack)(combatAttackData.m_bSneakAttack + (combatAttackData.m_bDeathAttack << 1)),
                    KillingBlow = combatAttackData.m_bKillingBlow.ToBool(),
                    AttackType = combatAttackData.m_nAttackType,
                    AttackRoll = combatAttackData.m_nToHitRoll,
                    AttackModifier = combatAttackData.m_nToHitMod,
                    IsRangedAttack = combatAttackData.m_bRangedAttack.ToBool(),
                    IsCoupDeGrace = combatAttackData.m_bCoupDeGrace.ToBool(),
                    IsAttackDeflected = combatAttackData.m_bAttackDeflected.ToBool(),
                    IsCriticalThreat = combatAttackData.m_bCriticalThreat.ToBool(),
                    DamageData = new DamageData <short>(combatAttackData.m_nDamage),
                    TotalDamage = combatAttackData.GetTotalDamage(),
                });
            }