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()); }
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(), }); }