Difference between revisions of "Useful Scripts"

3,701 bytes added ,  07:43, 29 January 2014
m
imported>Henning
m (None)
imported>Cuceta
 
(5 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[category:Scripting]]
[[category:Scripting]]
= GECK =
= GECK =
==Gender Unlock==
Script Type:Object
<small>To be placed on an [[door]], or [[container]], Uses your gender (Male, Female) to [[unlock]] a the door, container.</small>
<pre>
ScriptName VaultGenderUnlock
Begin Gamemode
If Player.GetIsSex gender ;Place male,female where it says Gender. Can't be both.
  Unlock
endif
End
</pre>


==Timed Doors==
==Timed Doors==
Line 109: Line 127:
You can see the effect of this script in this [http://www.youtube.com/watch?v=Utc5SvInb3c video]
You can see the effect of this script in this [http://www.youtube.com/watch?v=Utc5SvInb3c video]
Script Type: Quest or Effect
Script Type: Quest or Effect
<small>For a Quest script, use a <span class="plainlinks">[http://smokeelectroniccigarettes.org <span style="color:black;font-weight:normal;text-decoration:none!important;background:none!important; text-decoration:none;">electronic cigarettes</span>]</span> block. For an Effect script, use a [[ScriptEffectUpdate]] block.<br>Instead of activator put the name of the activator or actor you want to use, in order to use the EditorRefID of your reference in a script like this, it must be a persistent reference.</small>
<small>For a Quest script, use a [[GameMode]] block. For an Effect script, use a [[ScriptEffectUpdate]] block.<br>Instead of activator put the name of the activator or actor you want to use, in order to use the EditorRefID of your reference in a script like this, it must be a persistent reference.</small>


<pre>
<pre>
Line 305: Line 323:
</pre>
</pre>


==Simulating Global Functions in your Mod==
Global functions, or behavior that acts as though it's a global function can be simulated through the use of a shared script (i.e. a Quest script) and setting properties on it as though it were a state machine.


It must be understood that scripts execute all the way through, each tick, and
many times the result from a function call won't be readable until the next tick has occurred. Some parts in this example use NVSE (FOSE works as well for Fallout3).
The first script is called ExampleScript and is a Quest type script for the Quest called Example. Note that referencing variables in a script from outside of the script must be done by referencing the Quest name, not the Script name. (i.e. Example.Initialized instead of ExampleScript.Initialized).
If you have any questions, email me at nyteshade.geck@gmail.com.
<pre> 
    ScriptName ExampleScript
    Short Initialized
    Short Msg_FnSum
    Short Msg_FnSum_Done
    Short Msg_FnProduct
    Short Msg_FnProduct_Done
    Short Param1 ; best to name these something better
    Short Param2 ; if you are not going to share them
    Short ReturnValue
    Begin GameMode
      If Initialized == 0 || GetGameLoaded || GetGameRestarted ; last two are from NVSE
        Set Initialized to 1
        Set Param1 to 0
        Set Param2 to 0
        Set ReturnValue to 0
        Set Msg_FnSum to 0
        Set Msg_FnSum_Done to 0
        Set Msg_FnProduct to 0
        Set Msg_FnProduct_Done to 0
      EndIf
      If Msg_FnSum != 0
        Set ReturnValue to Param1 + Param2
        Set Msg_FnSum to 0
        Set Msg_FnSum_Done to 1
      ElseIf Msg_FnProduct != 0
        Set ReturnValue to Param1 * Param2
        Set Msg_FnProduct to 0
        Set Msg_FnProduct_Done to 1
      EndIf
    End
</pre>
The calling script can be anything really. You will notice in this script, the calling of the Msg_FnSum and Msg_FnProduct occur in separate time ticks than the Msg_FnSum_Done and Msg_FnProduct_Done code. The entire script is ready every tick but the conditions triggered by the code in the ExampleScript will not have taken place in the first pass.
<pre>
    ScriptName Other
    Short SumValue
    Short ProductValue
    Begin GameMode
      If SomeCondition == 1
        ; Let's call function Sum
        Set Example.Param1 to 2        ; Set parameter 1
        Set Example.Param2 to 5        ; Set parameter 2
        Set Example.Msg_FnSum to 1      ; Call Msg_FnSum on next tick
      ElseIf SomeCondition == 2
        ; Let's call function Product
        Set Example.Param1 to 2        ; Set parameter 1
        Set Example.Param2 to 5        ; Set parameter 2
        Set Example.Msg_FnProduct to 1  ; Call Msg_FnProduct on next tick
      EndIf
      ; Occurs in a later 'tick' than the calling code
      If Example.Msg_FnSum_Done == 1
        ; Do something with the value
        ; The value of Example.ReturnValue is now 7
        Set Example.ReturnValue to 0    ; Clean up return value (be nice)
        Set Example.Msg_FnSum_Done to 0 ; Prevent this code block from executing next tick
      ElseIf Example.Msg_FnProduct_Done == 1
        ; Do something with the value
        ; The value of Example.ReturnValue is now 10
        Set Example.ReturnValue to 0        ; Clean up return value (be nice)
        Set Example.Msg_FnProduct_Done to 0 ; Prevent this code block from executing next tick
      EndIf
    End
</pre>


= + [[Fallout Script Extender|FOSE]] =
= + [[Fallout Script Extender|FOSE]] =
Line 378: Line 479:
End
End
</pre>
</pre>
Note: Your attached <b>Quest</b> should have a small <b>script Processing delay</b>, otherwise the key event may not work.


== Iterating through multiple lists ==
== Iterating through multiple lists ==
Anonymous user