Difference between revisions of "BuildRef"

1,518 bytes added ,  17:06, 5 April 2015
m
fixed link
imported>Odessa
(more concise)
imported>Odessa
m (fixed link)
 
(3 intermediate revisions by the same user not shown)
Line 21: Line 21:
if IsModLoaded "SomePopularCompanionMod.esp"
if IsModLoaded "SomePopularCompanionMod.esp"
     set iModIndex to GetModIndex "SomePopularCompanionMod.esp"
     set iModIndex to GetModIndex "SomePopularCompanionMod.esp"
     set rRainySmiles to BuildRef iModIndex 1068677
     set rRainySmiles to BuildRef iModIndex, 1068677
endif
endif
</pre>
</pre>


==Notes==
==Avoiding CTDs==
* Remember that if one uses an invalid decimal form ID then it will likely crash the game. This may be an issue if the form is non existent or different in past or future versions of the referenced module, or if two distinct modules are given the same file name.
If one uses an invalid decimal form ID then it will likely crash the game when you try to use your (mis)built reference. This may be an issue if the form is non existent or different in past or future versions of the referenced module, or if two distinct modules are given the same file name.


You can avoid CTDs by ensuring the return is both a valid form, and of the type you expect it to be, using [[IsFormValid]], and functions like [[IsReference]], [[IsActor]] or [[GetType]]. For example, following on from the code above, where we want to get a companion added by an external mod:
<pre>
if eval !(IsFormValid rRainySmiles)
  ; The Form is NOT valid, do not proceed!
  return
elseif eval !(IsReference rRainySmiles)
  ; The form is NOT a reference, its something else, do not proceed!
  return
elseif eval !(rRainySmiles.IsActor)
  ; The form is a reference, but NOT an actor (maybe its a door or something)!
  return
else
  ; Its all good, we got an actor from the buildref so we can proceed
endif
; "if eval !(condition)" just means "if conditon is false"
</pre>
Or you can use [[GetType]] for any types:
<pre>
if eval !(IsFormValid SomeBuildRefSpell)
    ; The Form is NOT valid, do not proceed!
    return
elseif GetType SomeBuildRefSpell != 20 ; * 20 is the code for 'spell'
    ; I was expecting a spell but got something else, do not proceed!
    return
else
    ; Its safe, I got a spell like I expected
    PlayerREF.CIOS SomeBuildRefSpell
endif
</pre>
Note: You must use multiple lines for the <b>if</b> statements, not <b>&&</b>, because the GECK always evaluates all conditons on a line.
==See Also==
==See Also==
*[[FnGetExternalForm]] - A convenient UDF for safe build reffing.
*[[IsModLoaded]]
*[[IsModLoaded]]
*[[GetModIndex]]
*[[GetModIndex]]
*[[GetLocalRefIndex]]
*[[GetLocalRefIndex]]
*[[Causes of CTDs]]
*[[IsFormValid]], [[IsReference]], [[IsActor]], [[GetType]]
*[[Eval]]
[[Category:Functions_(NVSE)]]
[[Category:Functions_(NVSE)]]
Anonymous user