Removing "Placeatme Objects"

From the Oblivion ConstructionSet Wiki
Revision as of 11:00, 24 August 2007 by imported>DragoonWraith (byline)
Jump to navigation Jump to search


REMOVABLE PlaceAtMe OBJECTS by Guidobot


This describes how to remove objects created by the PlaceAtMe command, given that the Disable method is now known to only hide objects in their 3D state. (It does not seem to hide them if they are in your inventory.)


In the first example it is assumed that your placer item is an inventory item put down, for whatever reason, and then later deleted (after one frame).


Example #1: effect in external script (not on PlaceAtMe object)

scn MyScript

ref placerRef

Begin GameMode ; or other

; destruction - after in inventory
if placerRef
  if GetContainer == player
    placerRef.RemoveMe
  endif
  Return
endif
; creation
set placerRef to player.PlaceAtMe MyPlacer 1 50 0

; ... more code here

; destruction - put into player inventory
placerRef.Activate player

End

Note: If you supply a container/actor argument to [b]RemoveMe[/b] it may work but any attached script will be lost. It seems some operations take a frame or two to work, especially those that attach one object to another. (Removing a script from an object could be useful.)


Example #2: effect split between the creator and target object.

scn MyPlacerScript

Begin GameMode

if GetContainer
  RemoveMe
endif

End

To use/destroy the object:

; creation
set placerRef to player.PlaceAtMe MyPlacer 1 50 0
; ...
; destruction
placerRef.Activate player

You can also get more imaginative but you may have some extra timing issues.


Example #3: effect on a scripted item (triggered by Disable)

short stage

Begin GameMode

if GetDisabled
  if stage == 0
    Activate player
    set stage to 1
  else
    RemoveMe
  endif
endif

End

Something like this may be useful for those that already have lots of PlaceAtMe objects since to (create and) destroy these objects:

; creation
set placerRef to player.PlaceAtMe MyPlacer 1 50 0
; ...
; destruction
placerRef.Disable

With all these examples you are well advised to experiment to see what works for you. It's possible that longer scripts may need some extra work, especially if you are using stackable items.


Ok, what I forgot to mention is the message spam you get when you get when the player picks this item up. To avoid this you can use a shadow (disabled persistant actor at player location) to pick up the item instead of the player.


Destroying Summoned Creatures


If you employ PlaceAtMe to create a 'summoned' creature (object) then you'll have to accept that this object cannot be destroyed. If you want it to vanish (on death or after a time-out) you can only use Disable (and Kill) to make it disappear. The dead critter object will eventually be deleted like normal dead actors after ~3 game days.

Normally this isn't a problem. However, if you need to totally destroy the critters (e.g. because you use a pack of them) then the correct way to do this is not use the PlaceAtMe method at all. Instead you have two options:

1) For a single creature (or small number of creatures) use a hidden location and teleport them to the player and back again as needed. (You may also have to manage their health, etc., if they end up in combat.)

2) Otherwise:

a) copy/create the base actor model that you wish to employ and/or a persistant reference copy in a hidden room.

b) set critterRef to MyCritter.CreateFullActorCopy ; takes several frames

c) critterRef.MoveTo player 50 50 0  ; immediate but only logical position

d) critterRef.DeleteFullActorCopy  ; when done