Safely increment variable from multiple scripts

From the CreationKit Wiki
Revision as of 15:01, 31 October 2011 by imported>JBurgess
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

The Problem

Say the player needs to kill X of some creature. One common way to do this is put an OnDeath script on all the creatures, increment a quest variable, then do something when the count gets to the right number.

This can cause problems because it isn’t thread safe – meaning if two enemies die at exactly the same moment, one may end up bashing the other, preventing the player from getting credit for one of the kills.

The Solution

Instead of incrementing the variable from the other scripts, it's better to use a function on the quest script (where applicable) which increments the variable and does whatever it needs to when the count gets to the right number. This is thread-safe (because it is a function call). So, for example, instead of doing this:

 ; WRONG WAY
 Event OnDeath(Actor akKiller)
       ; increment dead count
       myQuestScript = GetOwningQuest() as MS06Script
       myQuestScript.DeadCultists = myQuestScript.DeadCultists + 1
       if myQuestScript.DeadCultists >= myQuestScript.TotalCultists
             GetOwningQuest().SetStage(100)
       endif
 endEvent

I changed it to this on the actor script:

 ; RIGHT WAY
 Event OnDeath(Actor akKiller)
       ; increment dead count
       myQuestScript = GetOwningQuest() as MS06Script
       myQuestScript.IncrementDeadCultists()
 endEvent

And then put this on MS06Script:

 function IncrementDeadCultists()
       DeadCultists = DeadCultists + 1
       if DeadCultists >= TotalCultists
             setStage(100)
       endif
 endFunction