Difference between revisions of "ApplyHavokImpulse - ObjectReference"

From the CreationKit Wiki
Jump to navigation Jump to search
imported>JustinOther
m (→‎Examples: Floatified float params)
imported>DavidJCobb
(→‎Notes: Zero magnitude works!)
 
(4 intermediate revisions by 3 users not shown)
Line 42: Line 42:
; launch the skeever up into the air
; launch the skeever up into the air
Game.GetPlayer().PushActorAway(Skeever, 0.0)
Game.GetPlayer().PushActorAway(Skeever, 0.0)
Skeever.ApplyHavokImpulse(0.0, 0.0, 1.0, 1000)
Skeever.ApplyHavokImpulse(0.0, 0.0, 1.0, 1000.0)
</source>
</source>
== Notes ==
This function correctly moves the graphics and collision geometry, but the object is still considered to be on its old position. This creates a few problems:
* If you use SetPosition or MoveTo on the object, it will blink (return to its original position, then to its new position again).
* If your object's original position is now a few cells away from the player, it will be unloaded by the game even if its graphics and collision box are close to the player. A workaround is to periodically translate your object to "self" through [[TranslateToRef - ObjectReference|TranslateToRef]]. This will not translate the mesh and collision geometry. However, if the translation completes, the position will be updated and you will see the object's mesh blink. To address this, you need to use [[OnTranslationAlmostComplete - ObjectReference|OnTranslationAlmostComplete]] and dynamically adjust the speed so that your object never reach itself.
* [[GetPositionX - ObjectReference|GetPosition]] and [[GetAngleX - ObjectReference|GetAngle]] will return the old position. If you need those informations, a workaround is to have a dummy, invisible, object and use MoveToNode to move it to one of your real object's nodes, then get the position of your dummy object. [http://forums.bethsoft.com/topic/1416758-addhavokballandsocketconstraint-questions/page__view__findpost__p__21667888 (source)]
Aside from that, this function will fail and throw a Papyrus warning if the reference has no 3D or if a zero-length force vector is used. Otherwise, the force vector will be normalized before the force is applied. A zero magnitude is permitted and force will still be applied (i.e. you won't displace the object, but you'll trigger Havok settling and any other side-effects of it being bumped).


== See Also ==
== See Also ==
*[[ObjectReference Script]]
*[[ObjectReference Script]]

Latest revision as of 23:21, 31 July 2016

Member of: ObjectReference Script

Applies a Havok impulse force to this object of the specified direction and magnitude.

Syntax[edit | edit source]

Function ApplyHavokImpulse(float afX, float afY, float afZ, float afMagnitude) native

Parameters[edit | edit source]

  • afX: X component of the force vector.
  • afY: Y component of the force vector.
  • afZ: Z component of the force vector.
  • afMagnitude: The magnitude of the force vector - how hard to hit this object.

Return Value[edit | edit source]

None.

Examples[edit | edit source]

; Apply a physical force along the x axis with a magnitude of 5 to a cheese wheel
CheeseWheel.ApplyHavokImpulse(1.0, 0.0, 0.0, 5.0)


To get a heavy object like a weapon to go flying as if hit with a very large force you must use a magnitude such as 10,000:

;sends testaxe, a heavy object, flying across room
;along the positive y-axis
testAxe.ApplyHavokImpulse(0.0, 1.0, 0.0, 10000.0)


To get an Actor to react to a havok impulse, you may need to apply a "push" first.

; launch the skeever up into the air
Game.GetPlayer().PushActorAway(Skeever, 0.0)
Skeever.ApplyHavokImpulse(0.0, 0.0, 1.0, 1000.0)

Notes[edit | edit source]

This function correctly moves the graphics and collision geometry, but the object is still considered to be on its old position. This creates a few problems:

  • If you use SetPosition or MoveTo on the object, it will blink (return to its original position, then to its new position again).
  • If your object's original position is now a few cells away from the player, it will be unloaded by the game even if its graphics and collision box are close to the player. A workaround is to periodically translate your object to "self" through TranslateToRef. This will not translate the mesh and collision geometry. However, if the translation completes, the position will be updated and you will see the object's mesh blink. To address this, you need to use OnTranslationAlmostComplete and dynamically adjust the speed so that your object never reach itself.
  • GetPosition and GetAngle will return the old position. If you need those informations, a workaround is to have a dummy, invisible, object and use MoveToNode to move it to one of your real object's nodes, then get the position of your dummy object. (source)

Aside from that, this function will fail and throw a Papyrus warning if the reference has no 3D or if a zero-length force vector is used. Otherwise, the force vector will be normalized before the force is applied. A zero magnitude is permitted and force will still be applied (i.e. you won't displace the object, but you'll trigger Havok settling and any other side-effects of it being bumped).

See Also[edit | edit source]