Advertisement
expired6978

Untitled

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