Difference between revisions of "OnHit - ObjectReference"
→Examples
imported>Terra Nova2 m (→Italic textNotes: fixed broken header) |
imported>Wbunkey2244 |
||
Line 27: | Line 27: | ||
Debug.Trace("We were hit by " + akAggressor) | Debug.Trace("We were hit by " + akAggressor) | ||
EndEvent | EndEvent | ||
To avoid the hits from enchantments running the code block one must compare the ''akSource'' to the actual reference that hit the actor/object. | |||
For instance, say we have a weapon with 2 enchantments called "Fire/Ice Sword." When hit with this sword the hit registers as 3 separate hits, but you have code such as: | |||
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, \ | |||
bool abBashAttack, bool abHitBlocked) | |||
if(akSource as Weapon) | |||
Variable1 -= 100 | |||
EndEvent | |||
This would actually subtract 300 from Variable1 since the event was called 3 times simultaneously, even though the akSource has been cast as a weapon papyrus counts the hit from the enchantments as "weapons" too so the enchantments are reference as (akSource as Weapon) as well. So the solution is to be more explicit. | |||
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, \ | |||
bool abBashAttack, bool abHitBlocked) | |||
Form RightHandSword = akAggressor.GetEquippedWeapon(0); this gets the sword that the enemy had in their right hand and stores it as an object variable | |||
if((akSource as weapon) == RightHandSword | |||
;do code stuff | |||
EndEvent | |||
This will still call the event 3 times, but the code will only fire once when (akSource as weapon) == RightHandSword | |||
1st hit: Sword: (akSource as weapon) == RightHandSword - fires code | |||
2nd hit: Enchant1: (akSource as weapon) == SomeEnchant1 - nothing happens | |||
3rd hit: Enchant2: (akSource as weapon) == SomeEnchant2 - nothing happens | |||
If you had the exact same script but only want the code to run when the actor/object that has the script with the OnHit Event is hit with a certain enchantment, regardless of the sword then: | |||
Enchantment Property ''TheEnchantment'' Auto | |||
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, \ | |||
bool abBashAttack, bool abHitBlocked) | |||
if((akSource as weapon) == ''TheEnchantment'' | |||
;do code stuff | |||
EndEvent | |||
With this code the Actor/Object with the OnHitEvent script could be hit by 5 different weapons but the onhit event will only fire when the weapon has ''TheEnchantment'' and it will only fire once. | |||
</source> | </source> | ||