Difference between revisions of "PlaceAtMe - ObjectReference"

From the CreationKit Wiki
Jump to navigation Jump to search
imported>Scornett
 
m (Forgot disable part)
 
(20 intermediate revisions by 9 users not shown)
Line 13: Line 13:
== Parameters ==
== Parameters ==
*akFormToPlace: The base form to create references of.
*akFormToPlace: The base form to create references of.
**Note: the akFormToPlace can be things such as MiscObject, Actor, ActorBase...
**Note: the akFormToPlace can be things such as MiscItem, Actor, ActorBase, etcetera, but it ''cannot'' be an ObjectReference
*aiCount: How many references to make at once.
*aiCount: How many references to make at once.
**'''Default:''' 1
**'''Default:''' 1
Line 20: Line 20:
**'''Default:''' False
**'''Default:''' False
*abInitiallyDisabled: True to force the reference to be initially disabled
*abInitiallyDisabled: True to force the reference to be initially disabled
**'''Default''' False
**'''Default:''' False
**'''Caution:''' This is only applied to the last reference created.


== Return Value ==
== Return Value ==
Line 32: Line 33:
<br>
<br>
<source lang="papyrus">
<source lang="papyrus">
; Place a two new boxes at the target marker
; Place two new boxes at the target marker
ObjectReference oneOfTheBoxes = TargetMarker.PlaceAtMe(BoxBase, 2)
ObjectReference oneOfTheBoxes = TargetMarker.PlaceAtMe(BoxBase, 2)
</source>
<br>
<source lang="papyrus">
; Place a horker at player. Use 0x<FormID>.
ObjectReference Horker = Game.GetPlayer().PlaceAtMe(Game.GetForm(0x00023ab1))
</source>
<br>
<source lang="papyrus">
; Place a Rock at player.
Game.GetPlayer().PlaceAtMe(RockProperty)
</source>
</source>


== Notes ==
== Notes ==
If you want to place a leveled actor, you probably want [[PlaceActorAtMe - ObjectReference]].
<ul>
<li>
If you want to place a leveled actor, you probably want [[PlaceActorAtMe - ObjectReference]](use with caution).
</li>
<li>
A common mistake with PlaceAtMe is passing an object of type ObjectReference as its akFormToPlace parameter. Attempting to do so will result in this compilation error:
<pre>type mismatch on parameter 1 (did you forget a cast?)</pre>
This is the same error as you would see if you were to use an [[Actor Script|Actor]] as the first parameter of [[PlaceActorAtMe - ObjectReference|PlaceActorAtMe]], which should be of type [[ActorBase Script|ActorBase]].
 
The first parameter of PlaceAtMe should be of type [[Form Script|Form]]. If you need to get a Form from an ObjectReference, use the [[GetBaseObject - ObjectReference|GetBaseObject]] function.
<source lang="papyrus">
ObjectReference Property MyObjectReference Auto
Form MyBaseObject
 
Event OnInit()
MyBaseObject = MyObjectReference.GetBaseObject()
EndEvent
 
; ...
PlaceAtMe(MyBaseObject)
; ...
</source>
</li>
<li>Objects no longer used should be disabled (through [[DisableNoWait - ObjectReference|DisableNoWait]] or a similar function) and marked for deletion (through [[Delete - ObjectReference|Delete]]) to prevent them from bloating the user's savegame.
</li>
<li>
Objects created through runtime scripting are not hooked up to physics events like [[OnTriggerEnter - ObjectReference|OnTriggerEnter]] until the cell reloads if the object's base form does not already exist in the cell on cell load. [https://forums.nexusmods.com/topic/13458233-physics-events-not-enabled-for-spawned-objects-until-cell-reload/] This can be worked around by calling [[Disable]] and then [[Enable - ObjectReference|Enable]] on the object, which will immediately update the engine. Since non-physics events like [[OnInit]] function correctly, this can easily be rectified by re-enabling the object in [[OnInit]] on the spawned object.
</li>
</ul>
* As with [[MoveTo - ObjectReference|MoveTo]] and [[SetPosition - ObjectReference|SetPosition]], objects created with this method will sometimes appear in odd angles, and it doesn't take in account for uneven terrain. This does not apply the actors. To correct their rotation, use [[SetAngle - ObjectReference| SetAngle]], with a 0 X coordinate, and the Y and Z coordinates being whatever you wish it to be.
*Even if you set the object to be initially disabled, its [[OnLoad - ObjectReference|OnLoad]] event will still fire, and then fire again when you decide to enable it.
* Some forms, like MapMarker, cannot be created at run-time. Attempts to create them will fail silently and return None.


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

Latest revision as of 02:04, 9 December 2023

Member of: ObjectReference Script

Makes X new references of the passed in form, optionally forcing them to persist, and places them at our reference's location, returning the last one it created.

Syntax[edit | edit source]

ObjectReference Function PlaceAtMe(Form akFormToPlace, int aiCount = 1,
   bool abForcePersist = false, bool abInitiallyDisabled = false) native

Parameters[edit | edit source]

  • akFormToPlace: The base form to create references of.
    • Note: the akFormToPlace can be things such as MiscItem, Actor, ActorBase, etcetera, but it cannot be an ObjectReference
  • aiCount: How many references to make at once.
    • Default: 1
    • Caution: Only the last reference created is returned.
  • abForcePersist: True to force the created reference to be persistent.
    • Default: False
  • abInitiallyDisabled: True to force the reference to be initially disabled
    • Default: False
    • Caution: This is only applied to the last reference created.

Return Value[edit | edit source]

The last ObjectReference that was created. Or None if no references could be created for some reason.

Examples[edit | edit source]

; Place a new box at the target marker
ObjectReference newBox = TargetMarker.PlaceAtMe(BoxBase)


; Place two new boxes at the target marker
ObjectReference oneOfTheBoxes = TargetMarker.PlaceAtMe(BoxBase, 2)


; Place a horker at player. Use 0x<FormID>.
ObjectReference Horker = Game.GetPlayer().PlaceAtMe(Game.GetForm(0x00023ab1))


; Place a Rock at player.
Game.GetPlayer().PlaceAtMe(RockProperty)

Notes[edit | edit source]

  • If you want to place a leveled actor, you probably want PlaceActorAtMe - ObjectReference(use with caution).
  • A common mistake with PlaceAtMe is passing an object of type ObjectReference as its akFormToPlace parameter. Attempting to do so will result in this compilation error:
    type mismatch on parameter 1 (did you forget a cast?)

    This is the same error as you would see if you were to use an Actor as the first parameter of PlaceActorAtMe, which should be of type ActorBase.

    The first parameter of PlaceAtMe should be of type Form. If you need to get a Form from an ObjectReference, use the GetBaseObject function.

    ObjectReference Property MyObjectReference Auto
    Form MyBaseObject
    
    Event OnInit()
    	MyBaseObject = MyObjectReference.GetBaseObject()
    EndEvent
    
    ; ...
    	PlaceAtMe(MyBaseObject)
    ; ...
  • Objects no longer used should be disabled (through DisableNoWait or a similar function) and marked for deletion (through Delete) to prevent them from bloating the user's savegame.
  • Objects created through runtime scripting are not hooked up to physics events like OnTriggerEnter until the cell reloads if the object's base form does not already exist in the cell on cell load. [1] This can be worked around by calling Disable and then Enable on the object, which will immediately update the engine. Since non-physics events like OnInit function correctly, this can easily be rectified by re-enabling the object in OnInit on the spawned object.
  • As with MoveTo and SetPosition, objects created with this method will sometimes appear in odd angles, and it doesn't take in account for uneven terrain. This does not apply the actors. To correct their rotation, use SetAngle, with a 0 X coordinate, and the Y and Z coordinates being whatever you wish it to be.
  • Even if you set the object to be initially disabled, its OnLoad event will still fire, and then fire again when you decide to enable it.
  • Some forms, like MapMarker, cannot be created at run-time. Attempts to create them will fail silently and return None.

See Also[edit | edit source]