Advertisement
expired6978

Untitled

Oct 24th, 2012
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.56 KB | None | 0 0
  1. #include "PapyrusArgs.h"
  2.  
  3. class SKSEScaleform_GetVMVariable : public GFxFunctionHandler
  4. {
  5.     virtual void    Invoke(Args * args)
  6.     {
  7.         if(!g_loadGameLock.TryEnter())
  8.             return;
  9.  
  10.         ASSERT(args->numArgs >= 1);
  11.         ASSERT(args->args[0].GetType() == GFxValue::kType_Number);
  12.         ASSERT(args->args[1].GetType() == GFxValue::kType_String);
  13.  
  14.         const char * varName = args->args[1].GetString();
  15.         BSFixedString variableName(varName);
  16.  
  17.         UInt32      formId;
  18.         TESForm     * form = NULL;
  19.  
  20.  
  21.         if (args->numArgs >= 1) {
  22.             formId = (UInt32)args->args[0].GetNumber();
  23.             if(formId > 0)
  24.                 form = LookupFormByID(formId);
  25.         }
  26.  
  27.         args->result->SetNull();
  28.  
  29.         if(form) {
  30.             VMClassRegistry     * registry =    (*g_skyrimVM)->GetClassRegistry();
  31.             IObjectHandlePolicy * policy =      registry->GetHandlePolicy();
  32.  
  33.             UInt64 handle = policy->Create(form->formType, form);
  34.             if (handle != policy->GetInvalidHandle())
  35.             {
  36.                 GetScriptVariableFunctor scriptVariable(registry, handle, variableName);
  37.                 registry->VisitScripts(handle, &scriptVariable);
  38.                 VMValue * retValue;
  39.                 if((retValue = scriptVariable.getResult()) != NULL)
  40.                 {
  41.                     switch(retValue->type)
  42.                     {
  43.                     case VMValue::kType_Bool:
  44.                         {
  45.                             bool b;
  46.                             UnpackValue<bool>(&b, retValue);
  47.                             args->result->SetNumber(b);
  48.                         }
  49.                         break;
  50.                     case VMValue::kType_Int:
  51.                         {
  52.                             SInt32 i;
  53.                             UnpackValue<SInt32>(&i, retValue);
  54.                             args->result->SetNumber(i);
  55.                         }
  56.                         break;
  57.                     case VMValue::kType_Float:
  58.                         {
  59.                             float f;
  60.                             UnpackValue<float>(&f, retValue);
  61.                             args->result->SetNumber(f);
  62.                         }
  63.                         break;
  64.                     case VMValue::kType_String:
  65.                         {
  66.                             BSFixedString str;
  67.                             UnpackValue<BSFixedString>(&str, retValue);
  68.                             args->movie->CreateString(args->result, str.data);
  69.                         }
  70.                         break;
  71.                     case VMValue::kType_BoolArray:
  72.                         {
  73.                             VMArray<bool> bArray;
  74.                             UnpackValue<VMArray<bool>>(&bArray, retValue);
  75.                             args->movie->CreateArray(args->result);
  76.  
  77.                             bool tmp;
  78.                             for(int i = 0; i < bArray.Length(); i++) {
  79.                                 GFxValue gfxValue;
  80.                                 bArray.Get(&tmp, i);
  81.                                 gfxValue.SetNumber(tmp);
  82.                                 args->result->PushBack(&gfxValue);
  83.                             }
  84.                         }
  85.                         break;
  86.                     case VMValue::kType_IntArray:
  87.                         {
  88.                             VMArray<SInt32> iArray;
  89.                             UnpackValue<VMArray<SInt32>>(&iArray, retValue);
  90.                             args->movie->CreateArray(args->result);
  91.  
  92.                             SInt32 tmp;
  93.                             for(int i = 0; i < iArray.Length(); i++) {
  94.                                 GFxValue gfxValue;
  95.                                 iArray.Get(&tmp, i);
  96.                                 gfxValue.SetNumber(tmp);
  97.                                 args->result->PushBack(&gfxValue);
  98.                             }
  99.                         }
  100.                         break;
  101.                     case VMValue::kType_FloatArray:
  102.                         {
  103.                             VMArray<float> fArray;
  104.                             UnpackValue<VMArray<float>>(&fArray, retValue);
  105.                             args->movie->CreateArray(args->result);
  106.  
  107.                             float tmp;
  108.                             for(int i = 0; i < fArray.Length(); i++) {
  109.                                 GFxValue gfxValue;
  110.                                 fArray.Get(&tmp, i);
  111.                                 gfxValue.SetNumber(tmp);
  112.                                 args->result->PushBack(&gfxValue);
  113.                             }
  114.                         }
  115.                         break;
  116.                     case VMValue::kType_StringArray:
  117.                         {
  118.                             VMArray<BSFixedString> sArray;
  119.                             UnpackValue<VMArray<BSFixedString>>(&sArray, retValue);
  120.                             args->movie->CreateArray(args->result);
  121.  
  122.                             BSFixedString tmp;
  123.                             for(int i = 0; i < sArray.Length(); i++) {
  124.                                 GFxValue gfxValue;
  125.                                 sArray.Get(&tmp, i);
  126.                                 args->movie->CreateString(&gfxValue, tmp.data);
  127.                                 args->result->PushBack(&gfxValue);
  128.                             }
  129.                         }
  130.                         break;
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.  
  136.         g_loadGameLock.Leave();
  137.     }
  138. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement