2336 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			2336 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "pch.h"
 | ||
| #include "lsquirrel.h"
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| int squirrel::SQloadfile(uint32_t v, const wchar_t* filename, BOOL printerror)
 | ||
| {
 | ||
|             //wchar_t* 转 char*
 | ||
|     char* fname = DNFTOOL::wchar_tTochar((wchar_t*)filename);
 | ||
| 
 | ||
|     FILE* file;
 | ||
|     file = fopen(fname, "rb");
 | ||
|     if (file)
 | ||
|     {
 | ||
|         //求得文件的大小
 | ||
|         fseek(file, 0, SEEK_END);
 | ||
|         int size = ftell(file);
 | ||
|         rewind(file);
 | ||
| 
 | ||
|         //申请一块能装下整个文件的空间 
 | ||
|         char* ar = (char*)malloc(sizeof(char) * size + 256);
 | ||
|         //读文件,每次读一个,共读size次 
 | ||
|         fread(ar, 1, size, file);
 | ||
|         ar[size] = '\0';
 | ||
|         int skey[] = Skey;//定义解密数组
 | ||
| 
 | ||
|         Cutecode(ar, skey);//解密
 | ||
|         fclose(file);//关闭文件
 | ||
| 
 | ||
|         wchar_t* te = DNFTOOL::charTowchar_t(ar);
 | ||
|         return SQ_Compilebuffer(v, te, wcslen(te), (wchar_t*)filename, true);
 | ||
|     }
 | ||
|     return -1;
 | ||
| }
 | ||
| 
 | ||
| int squirrel::SQdofile(uint32_t v, const wchar_t* filename, BOOL retval, BOOL printerror)
 | ||
| {
 | ||
|     if (SQloadfile(v, filename, printerror) >= 0)
 | ||
|     {
 | ||
|         SQPush(v, -2);
 | ||
|         if ((int)SQ_Call(v, 1, retval, 1) >= 0)
 | ||
|         {
 | ||
|             SQ_Remove(v, -(retval != 0) - 1);
 | ||
|             return 1;
 | ||
|         }
 | ||
|         SQPop(v, 1);
 | ||
|     }
 | ||
|     return -1;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| int squirrel::SQdofileBuffer(uint32_t v, const wchar_t* filename, const wchar_t* str)
 | ||
| {
 | ||
|     if (SQ_Compilebuffer(v, str, wcslen(str), L"interactive console", true) >= 0)
 | ||
|     {
 | ||
|         SQPushRootTable(v);
 | ||
|         SQ_Call(v, 1, 1, 1);
 | ||
|         SQPop(v, 1);
 | ||
|     }
 | ||
|     return -1;
 | ||
| }
 | ||
| 
 | ||
| //获取对象地址
 | ||
| int squirrel::GetObjectAddress(uint32_t v)
 | ||
| {
 | ||
|     int objAddress = GetSqrObject(v, 2);
 | ||
|     SQPushInt(v, objAddress);
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取对象名称
 | ||
| int squirrel::GetObjectName(uint32_t v)
 | ||
| {
 | ||
|     int objAddress = GetSqrObject(v, 2);
 | ||
|     int objNameAddress = *(int*)(objAddress + 0x258);
 | ||
|     char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)objNameAddress);
 | ||
|     wchar_t* name = DNFTOOL::charTowchar_t(str);
 | ||
|     free (str);
 | ||
|     SQPushString(v, name, -1);
 | ||
|     delete[]name;
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //获取对象属性
 | ||
| int squirrel::GetObjectInfo(uint32_t v)
 | ||
| {
 | ||
|     int objAddress;
 | ||
|     SQGetInt(v, 2, &objAddress);
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 4)
 | ||
|     {
 | ||
|         int InfoAddress;
 | ||
|         SQGetInt(v, 3, &InfoAddress);
 | ||
|         int Value = (objAddress + InfoAddress);
 | ||
| 
 | ||
|         BOOL Type;
 | ||
|         SQGetBool(v, 4, &Type);
 | ||
|         if (Type == TRUE)
 | ||
|         {
 | ||
|             SQPushInt(v, *(int*)Value);
 | ||
|         }
 | ||
|         else if (Type == FALSE)
 | ||
|         {
 | ||
|             SQPushFloat(v, *(FLOAT*)Value);
 | ||
|         }
 | ||
|     }
 | ||
|     else if (ParameterNum == 5)
 | ||
|     {
 | ||
|         int EquAddress;
 | ||
|         SQGetInt(v, 3, &EquAddress);
 | ||
|         int InfoAddress;
 | ||
|         SQGetInt(v, 4, &InfoAddress);
 | ||
|         int Value = (objAddress + EquAddress);
 | ||
|         Value = *(int*)Value;
 | ||
| 
 | ||
|         Value = Value + InfoAddress;
 | ||
|         BOOL Type;
 | ||
|         SQGetBool(v, 5, &Type);
 | ||
|         if (Type == TRUE)
 | ||
|         {
 | ||
|             SQPushInt(v, *(int*)Value);
 | ||
|         }
 | ||
|         else if (Type == FALSE)
 | ||
|         {
 | ||
|             SQPushFloat(v, *(FLOAT*)Value);
 | ||
|         }
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQ_Throwerror(v, L"Incorrect function argument");
 | ||
|         return 0;
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //解密获取对象属性
 | ||
| int squirrel::GetObjectDeInfo(uint32_t v)
 | ||
| {
 | ||
|     int objAddress;
 | ||
|     SQGetInt(v, 2, &objAddress);
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 4)
 | ||
|     {
 | ||
|         int InfoAddress;
 | ||
|         SQGetInt(v, 3, &InfoAddress);
 | ||
|         int Value = (objAddress + InfoAddress);
 | ||
| 
 | ||
|         BOOL Type;
 | ||
|         SQGetBool(v, 4, &Type);
 | ||
|         if (Type == TRUE)
 | ||
|         {
 | ||
|             SQPushInt(v, DNFTOOL::DNFDeCode(Value));
 | ||
|         }
 | ||
|         else if (Type == FALSE)
 | ||
|         {
 | ||
|             SQPushFloat(v, (FLOAT)DNFTOOL::DNFDeCode(Value));
 | ||
|         }
 | ||
|     }
 | ||
|     else if (ParameterNum == 5)
 | ||
|     {
 | ||
|         int EquAddress;
 | ||
|         SQGetInt(v, 3, &EquAddress);
 | ||
|         int InfoAddress;
 | ||
|         SQGetInt(v, 4, &InfoAddress);
 | ||
|         int Value = (objAddress + EquAddress);
 | ||
|         Value = *(int*)Value;
 | ||
| 
 | ||
|         Value = Value + InfoAddress;
 | ||
|         BOOL Type;
 | ||
|         SQGetBool(v, 5, &Type);
 | ||
|         if (Type == TRUE)
 | ||
|         {
 | ||
|             SQPushInt(v, DNFTOOL::DNFDeCode(Value));
 | ||
|         }
 | ||
|         else if (Type == FALSE)
 | ||
|         {
 | ||
|             SQPushFloat(v, (FLOAT)DNFTOOL::DNFDeCode(Value));
 | ||
|         }
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQ_Throwerror(v, L"Incorrect function argument");
 | ||
|         return 0;
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //设置对象属性
 | ||
| int squirrel::SetObjectInfo(uint32_t v)
 | ||
| {
 | ||
|     int objAddress;
 | ||
|     SQGetInt(v, 2, &objAddress);
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 5)
 | ||
|     {
 | ||
|         int InfoAddress;
 | ||
|         SQGetInt(v, 3, &InfoAddress);
 | ||
|         int Value = (objAddress + InfoAddress);
 | ||
| 
 | ||
|         BOOL Type;
 | ||
|         SQGetBool(v, 4, &Type);
 | ||
|         if (Type == TRUE)
 | ||
|         {
 | ||
|             int W_Value;
 | ||
|             SQGetInt(v, 5, &W_Value);
 | ||
|             *(int*)Value = W_Value;
 | ||
|         }
 | ||
|         else if (Type == FALSE)
 | ||
|         {
 | ||
|             FLOAT W_Value;
 | ||
|             SQGetFloat(v, 5, &W_Value);
 | ||
|             *(FLOAT*)Value = W_Value;
 | ||
|         }
 | ||
|     }
 | ||
|     else if (ParameterNum == 6)
 | ||
|     {
 | ||
|         int EquAddress;
 | ||
|         SQGetInt(v, 3, &EquAddress);
 | ||
|         int InfoAddress;
 | ||
|         SQGetInt(v, 4, &InfoAddress);
 | ||
|         int Value = (objAddress + EquAddress);
 | ||
|         Value = *(int*)Value;
 | ||
| 
 | ||
|         Value = Value + InfoAddress;
 | ||
|         BOOL Type;
 | ||
|         SQGetBool(v, 5, &Type);
 | ||
|         if (Type == TRUE)
 | ||
|         {
 | ||
|             int W_Value;
 | ||
|             SQGetInt(v, 6, &W_Value);
 | ||
|             *(int*)Value = W_Value;
 | ||
|         }
 | ||
|         else if (Type == FALSE)
 | ||
|         {
 | ||
|             FLOAT W_Value;
 | ||
|             SQGetFloat(v, 6, &W_Value);
 | ||
|             *(FLOAT*)Value = W_Value;
 | ||
|         }
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQ_Throwerror(v, L"Incorrect function argument");
 | ||
|         return 0;
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //加密设置对象属性
 | ||
| int squirrel::SetObjectDeInfo(uint32_t v)
 | ||
| {
 | ||
|     int objAddress;
 | ||
|     SQGetInt(v, 2, &objAddress);
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 4)
 | ||
|     {
 | ||
|         int InfoAddress;
 | ||
|         SQGetInt(v, 3, &InfoAddress);
 | ||
|         int Value = (objAddress + InfoAddress);
 | ||
| 
 | ||
|         BOOL Type;
 | ||
|         SQGetBool(v, 4, &Type);
 | ||
|         if (Type == TRUE)
 | ||
|         {
 | ||
|             int W_Value;
 | ||
|             SQGetInt(v, 5, &W_Value);
 | ||
|             DNFTOOL::DNFEnCode(Value, W_Value);
 | ||
|         }
 | ||
|         else if (Type == FALSE)
 | ||
|         {
 | ||
|             FLOAT W_Value;
 | ||
|             SQGetFloat(v, 5, &W_Value);
 | ||
|             DNFTOOL::DNFEnCode(Value, (int)W_Value);
 | ||
|         }
 | ||
|     }
 | ||
|     else if (ParameterNum == 5)
 | ||
|     {
 | ||
|         int EquAddress;
 | ||
|         SQGetInt(v, 3, &EquAddress);
 | ||
|         int InfoAddress;
 | ||
|         SQGetInt(v, 4, &InfoAddress);
 | ||
|         int Value = (objAddress + EquAddress);
 | ||
|         Value = *(int*)Value;
 | ||
| 
 | ||
|         Value = Value + InfoAddress;
 | ||
|         BOOL Type;
 | ||
|         SQGetBool(v, 5, &Type);
 | ||
|         if (Type == TRUE)
 | ||
|         {
 | ||
|             int W_Value;
 | ||
|             SQGetInt(v, 6, &W_Value);
 | ||
|             DNFTOOL::DNFEnCode(Value, W_Value);
 | ||
|         }
 | ||
|         else if (Type == FALSE)
 | ||
|         {
 | ||
|             FLOAT W_Value;
 | ||
|             SQGetFloat(v, 6, &W_Value);
 | ||
|             DNFTOOL::DNFEnCode(Value, (int)W_Value);
 | ||
|         }
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQ_Throwerror(v, L"Incorrect function argument");
 | ||
|         return 0;
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //获取对象等级
 | ||
| int squirrel::GetObjectLevel(uint32_t v)
 | ||
| {
 | ||
|     int objAddress = GetSqrObject(v, 2);
 | ||
|     int Level = DNFTOOL::DNFDeCode(objAddress + 0x1A4C);
 | ||
|     SQPushInt(v, Level);
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //Test
 | ||
| 
 | ||
| 
 | ||
| //窗口CALL
 | ||
| typedef void(* NNoticeTCall)(DWORD thisc, DWORD Seat, DWORD a1, wchar_t* a2, DWORD a3, DWORD a4, DWORD a5);
 | ||
| static NNoticeTCall _ANoticeTcall = (NNoticeTCall)0xE6E070;
 | ||
| 
 | ||
| typedef int(_cdecl _sub7AAB60)(int a1);
 | ||
| static _sub7AAB60* getitemimg = (_sub7AAB60*)0x7aab60;
 | ||
| 
 | ||
| int squirrel::sq_GetImg(uint32_t v)
 | ||
| {
 | ||
|     int a1;
 | ||
|     SQGetInt(v, 2, &a1);
 | ||
| 
 | ||
|     int img = getitemimg(a1);
 | ||
|     SQPushInt(v, img);
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| typedef int(_cdecl _sub7AA800)(int a1, int a2, int a3, int a4, int a5, int a6, char a7);
 | ||
| static _sub7AA800* drawimg = (_sub7AA800*)0x7aa800;
 | ||
| 
 | ||
| //绘制Item
 | ||
| int squirrel::sq_DrawItem(uint32_t v)
 | ||
| {
 | ||
|     int a1, a2, a3, a4, a5, a6, a7;
 | ||
|     SQGetInt(v, 2, &a1);
 | ||
|     SQGetInt(v, 3, &a2);
 | ||
|     SQGetInt(v, 4, &a3);
 | ||
|     SQGetInt(v, 5, &a4);
 | ||
|     SQGetInt(v, 6, &a5);
 | ||
|     SQGetInt(v, 7, &a6);
 | ||
|     SQGetInt(v, 8, &a7);
 | ||
| 
 | ||
|     int img = getitemimg(a3);
 | ||
|     drawimg(a1, a2, img, a4, a5, a6, a7);
 | ||
| 
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| //换装参数Call
 | ||
| typedef int _E49DB0();
 | ||
| static _E49DB0* FuncE49DB0 = (_E49DB0*)0xE49DB0;
 | ||
| int squirrel::sq_Switching(uint32_t v)
 | ||
| {
 | ||
|     DWORD V2 = FuncE49DB0();
 | ||
|     SQPushInt(v, V2);
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //typedef int sub_1206600(int a1,int a2, int a3, int a4 ,int a5,...);
 | ||
| //static sub_1206600* Func1206600 = (sub_1206600*)0x1206600;
 | ||
| int squirrel::sq_Test(uint32_t v)
 | ||
| {
 | ||
|     //Func1206600(*(int*)0x1B45B94, 0x253, 0x1FD, 0xffffffff, *(int*)(0x19e868 + 0x1c));
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| int squirrel::sq_OpenConsole(uint32_t v)
 | ||
| {
 | ||
|     wchar_t* OutPutBuffer;
 | ||
|     SQGetString(v, 2, &OutPutBuffer);
 | ||
|     char* OutPutText = DNFTOOL::SquirrelU2W(OutPutBuffer);
 | ||
| 
 | ||
|     AllocConsole();
 | ||
|     SetConsoleTitleA(OutPutText);
 | ||
|     //SetConsoleOutputCP(65001);
 | ||
|     freopen(("CONOUT$"), ("w"), stdout);
 | ||
|     freopen(("CONOUT$"), ("w"), stderr);
 | ||
|     freopen(("CONIN$"), ("r"), stdin);
 | ||
| 
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| int squirrel::sq_MoveMap(uint32_t v)
 | ||
| {
 | ||
|     int dct;
 | ||
|     SQGetInt(v, 2, &dct);
 | ||
|     DWORD Address1 = 0x1A5FB18;
 | ||
|     DWORD Address2 = 0x7CE9E0;
 | ||
|     _asm
 | ||
|     {
 | ||
|         mov ecx, [Address1]
 | ||
|         mov ecx, [ecx]
 | ||
|         mov ecx, [ecx + 0x20a050]
 | ||
|         mov ecx, [ecx + 0x4c]
 | ||
|         push  0x1
 | ||
|         push  0x1
 | ||
|         push  0x0
 | ||
|         push  0x0
 | ||
|         push  0x0
 | ||
|         push  0x0
 | ||
|         push  0x0
 | ||
|         push  dct
 | ||
|         call Address2
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| //输出
 | ||
| int squirrel::Sout(uint32_t v)
 | ||
| {
 | ||
|     int Top = SQGetTop(v);
 | ||
|     if (Top <= 0)
 | ||
|     {
 | ||
|         SQ_Throwerror(v, L"Incorrect function argument");
 | ||
|         return 0;
 | ||
|     }
 | ||
| 
 | ||
|     wchar_t* OutPutBuffer;
 | ||
|     SQGetString(v, 2, &OutPutBuffer);
 | ||
|     char* OutPutText = DNFTOOL::SquirrelU2W(OutPutBuffer);
 | ||
| 
 | ||
|     std::vector<std::string> Data;
 | ||
|     DNFTOOL::Split(OutPutText, Data, "%L");
 | ||
|     delete []OutPutText;
 | ||
| 
 | ||
|     if (Top != Data.size() + 1)
 | ||
|     {
 | ||
|         SQ_Throwerror(v, L"Incorrect function argument");
 | ||
|         return 0;
 | ||
|     }
 | ||
| 
 | ||
|     size_t Fnum = Data.size();
 | ||
|     if (Fnum > 1)Fnum -= 1;
 | ||
|     std::string Text = "";
 | ||
|     for (size_t i = 0; i < Fnum; i++)
 | ||
|     {
 | ||
|         std::string Parameter;
 | ||
|         //获取值的类型
 | ||
|         int ValueType = SQ_GetType(v, 3 + i);
 | ||
|         //判断值类型
 | ||
|         switch (ValueType)
 | ||
|         {
 | ||
|         case OT_INTEGER://int类型
 | ||
|         {
 | ||
|             int Value;
 | ||
|             SQGetInt(v, 3 + i, &Value);
 | ||
|             Parameter = std::to_string(Value);
 | ||
|             break;
 | ||
|         }
 | ||
|         case OT_FLOAT://float类型
 | ||
|         {
 | ||
|             FLOAT Value;
 | ||
|             SQGetFloat(v, 3 + i, &Value);
 | ||
|             std::ostringstream oss;
 | ||
|             oss << Value;
 | ||
|             std::string str(oss.str());
 | ||
|             Parameter = str;
 | ||
|             break;
 | ||
|         }
 | ||
|         case OT_BOOL://bool类型
 | ||
|         {
 | ||
|             BOOL Value;
 | ||
|             SQGetBool(v, 3 + i, &Value);
 | ||
|             switch (Value)
 | ||
|             {
 | ||
|             case true:
 | ||
|                 Parameter = "true";
 | ||
|                 break;
 | ||
|             case false:
 | ||
|                 Parameter = "false";
 | ||
|                 break;
 | ||
|             }
 | ||
|             //Parameter = std::to_string(Value);
 | ||
|             break;
 | ||
|         }
 | ||
|         case OT_STRING://string类型
 | ||
|         {
 | ||
|             wchar_t* Value;
 | ||
|             SQGetString(v, 3 + i, &Value);
 | ||
|             char* str = DNFTOOL::SquirrelU2W(Value);
 | ||
|             Parameter = str;
 | ||
|             delete []str;
 | ||
|             break;
 | ||
|         }
 | ||
|         default:
 | ||
|             Parameter = " ";
 | ||
|             break;
 | ||
|         }
 | ||
|         Text += Data[i];
 | ||
|         Text += Parameter;
 | ||
|     }
 | ||
|     std::cout << Text << std::endl;
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| //读人物 或 装备属性
 | ||
| int squirrel::GetCharacterAttribute(uint32_t v)
 | ||
| {
 | ||
|     int n1, n2;
 | ||
|     int num = SQGetTop(v);
 | ||
| 
 | ||
|     int CharAddr = *(int*)(0x1AB7CDC);
 | ||
|     if (num == 3)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         SQGetInt(v, 3, &n2);
 | ||
|         int TValue = *(int*)(CharAddr+DNFTOOL::GetEquAddr(n2));
 | ||
|         int SValue = (TValue + n1);
 | ||
|         if(SValue < 0x400000)
 | ||
|             SQPushInt(v, 0);
 | ||
|         else if (n1 != 0x8 && n1 != 0x1C && n1 != 0xF4 && n1 != 0x854)
 | ||
|             SQPushInt(v, (DNFTOOL::DNFDeCode(SValue)));
 | ||
|         else
 | ||
|             SQPushInt(v, (*(int*)(SValue)));
 | ||
|     }
 | ||
|     else if (num == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         int Value = (CharAddr + n1);
 | ||
| 
 | ||
|         SQPushInt(v, (DNFTOOL::DNFDeCode(Value)));
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushString(v, L"parameter error", -1);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //写人物 或 装备属性
 | ||
| int squirrel::SetCharacterAttribute(uint32_t v)
 | ||
| {
 | ||
|     int n1, n2, n3;
 | ||
| 
 | ||
|     int num = SQGetTop(v);
 | ||
| 
 | ||
|     int CharAddr = *(int*)(0x1AB7CDC);
 | ||
|     if (num == 4)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         SQGetInt(v, 3, &n2);
 | ||
|         SQGetInt(v, 4, &n3);
 | ||
| 
 | ||
|         int TValue = *(int*)(CharAddr + DNFTOOL::GetEquAddr(n2));
 | ||
|         int SValue = (TValue + n1);
 | ||
|         if (SValue < 0x400000)
 | ||
|             SQPushBool(v, false);
 | ||
|         else if (n1 != 0x8 && n1 != 0x1C && n1 != 0xF4)
 | ||
|             DNFTOOL::DNFEnCode(SValue, n3);
 | ||
|         else
 | ||
|             *(int*)SValue = n3;
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else if (num == 3)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         SQGetInt(v, 3, &n2);
 | ||
| 
 | ||
|         int Value = (CharAddr + n1);
 | ||
|         DNFTOOL::DNFEnCode(Value, n2);
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取城镇编号
 | ||
| int squirrel::GetTownIndex(uint32_t v)
 | ||
| {
 | ||
|     SQPushInt(v, DNFTOOL::GetHook(0x1A5E258, "0xAC+0xD4+"));
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取城镇区域编号
 | ||
| int squirrel::GetRegionIndex(uint32_t v)
 | ||
| {
 | ||
|     SQPushInt(v, *(int*)(DNFTOOL::GetHook(0x1A5E258, "0xAC+0xD8+")));
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取城镇X坐标
 | ||
| int squirrel::GetTownXpos(uint32_t v)
 | ||
| {
 | ||
|     SQPushInt(v, DNFTOOL::GetHook(0x1AB7CE0, "0x2BC+"));
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取城镇Y坐标
 | ||
| int squirrel::GetTownYpos(uint32_t v)
 | ||
| {
 | ||
|     SQPushInt(v, DNFTOOL::GetHook(0x1AB7CE0, "0x2C0+"));
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取疲劳值
 | ||
| int squirrel::GetFatigue(uint32_t v)
 | ||
| {
 | ||
|     int Type;
 | ||
| 
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &Type);
 | ||
| 
 | ||
|         switch (Type)
 | ||
|         {
 | ||
|         case 0:
 | ||
|             SQPushInt(v, DNFTOOL::DNFDeCode(0x1AB7E1C));
 | ||
|             break;
 | ||
|         case 1:
 | ||
|             SQPushInt(v, DNFTOOL::DNFDeCode(0x1AB7E10));
 | ||
|             break;
 | ||
|         default:
 | ||
|             SQPushBool(v,false);
 | ||
|             break;
 | ||
|         }
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushString(v, L"parameter error", -1);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取经验值
 | ||
| int squirrel::GetExp(uint32_t v)
 | ||
| {
 | ||
|     int Type;
 | ||
| 
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &Type);
 | ||
| 
 | ||
|         switch (Type)
 | ||
|         {
 | ||
|         case 0:
 | ||
|             SQPushInt(v, DNFTOOL::DNFDeCode(DNFTOOL::GetHook(0x1AB7CDC, "0x3C4C+",1)));
 | ||
|             break;
 | ||
|         case 1:
 | ||
|             SQPushInt(v, DNFTOOL::DNFDeCode(DNFTOOL::GetHook(0x1AB7CDC, "0x3C40+",1)));
 | ||
|             break;
 | ||
|         default:
 | ||
|             SQPushBool(v, false);
 | ||
|             break;
 | ||
|         }
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushString(v, L"parameter error", -1);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| //发包类型
 | ||
| int squirrel::SendPackType(uint32_t v)
 | ||
| {
 | ||
|     int n1;
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         _SendpacksType(*_SendClass, 0, n1);
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushString(v, L"parameter error", -1);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //发包Byte
 | ||
| int squirrel::SendPackByte(uint32_t v)
 | ||
| {
 | ||
|     int n1;
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         _SendPacksByte(*_SendClass, 0, n1);
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushString(v, L"parameter error", -1);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //发包Word
 | ||
| int squirrel::SendPackWord(uint32_t v)
 | ||
| {
 | ||
|     int n1;
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         _SendPacksWord(*_SendClass, 0, n1);
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushString(v, L"parameter error", -1);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //发包DWord
 | ||
| int squirrel::SendPackDWord(uint32_t v)
 | ||
| {
 | ||
|     int n1;
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         _SendPacksDWord(*_SendClass, 0, n1);
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushString(v, L"parameter error", -1);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //发包wchar_t*  (转了char*)
 | ||
| int squirrel::SendPackWChar(uint32_t v)
 | ||
| {
 | ||
|     wchar_t* n1;
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 2)
 | ||
|     {
 | ||
|         SQGetString(v, 2, &n1);
 | ||
|         //wchar_t* 转 char*
 | ||
|         char* fname = DNFTOOL::wchar_tTochar(n1);
 | ||
|         _SendPacksChar(*_SendClass, 0, fname, strlen(fname));
 | ||
|         delete []fname;
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushString(v, L"parameter error", -1);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //发包
 | ||
| int squirrel::SendPack(uint32_t v)
 | ||
| {
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 1)
 | ||
|     {
 | ||
|         _SendPacks();
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushString(v, L"parameter error", -1);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //去副本
 | ||
| int squirrel::GoDungeon(uint32_t v)
 | ||
| {
 | ||
|     int n1 = 0;
 | ||
|     int n2 = 0;
 | ||
|     int n3 = 0;
 | ||
|     int n4 = 0;
 | ||
| 
 | ||
|     int num = SQGetTop(v);
 | ||
| 
 | ||
|     if (num == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|     }
 | ||
|     else if (num == 5)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         SQGetInt(v, 3, &n2);
 | ||
|         SQGetInt(v, 4, &n3);
 | ||
|         SQGetInt(v, 5, &n4);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|         return 1;
 | ||
|     }
 | ||
| 
 | ||
|     _SendpacksType(*_SendClass, 0, 15);
 | ||
|     _SendPacks();
 | ||
| 
 | ||
|     _SendpacksType(*_SendClass, 0, 16);
 | ||
|     _SendPacksWord(*_SendClass, 0, n1);
 | ||
|     _SendPacksByte(*_SendClass, 0, n2);
 | ||
|     _SendPacksByte(*_SendClass, 0, n3);
 | ||
|     _SendPacksByte(*_SendClass, 0, n4);
 | ||
|     _SendPacks();
 | ||
| 
 | ||
|     SQPushBool(v, true);
 | ||
|     return 1;
 | ||
| }
 | ||
| //回城
 | ||
| int squirrel::GoTown(uint32_t v)
 | ||
| {
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 1)
 | ||
|     {
 | ||
|         _SendpacksType(*_SendClass, 0, 0x2D);
 | ||
|         _SendPacks();
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //移动城镇
 | ||
| int squirrel::MoveTown(uint32_t v)
 | ||
| {
 | ||
|     int TownIndex;
 | ||
|     int ReIndex;
 | ||
|     int XPos;
 | ||
|     int YPos;
 | ||
|     int num = SQGetTop(v);
 | ||
|     if (num == 5)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &TownIndex);
 | ||
|         SQGetInt(v, 3, &ReIndex);
 | ||
|         SQGetInt(v, 4, &XPos);
 | ||
|         SQGetInt(v, 5, &YPos);
 | ||
| 
 | ||
|         _SendpacksType(*_SendClass, 0, 38);
 | ||
|         _SendPacksByte(*_SendClass, 0, TownIndex);
 | ||
|         _SendPacksByte(*_SendClass, 0, ReIndex);
 | ||
|         _SendPacksWord(*_SendClass, 0, XPos);
 | ||
|         _SendPacksWord(*_SendClass, 0, YPos);
 | ||
|         _SendPacksByte(*_SendClass, 0, 5);
 | ||
|         _SendPacksWord(*_SendClass, 0, 0);
 | ||
|         _SendPacksWord(*_SendClass, 0, 0);
 | ||
|         _SendPacks();
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //Ldofile
 | ||
| int squirrel::LDofile(uint32_t v)
 | ||
| {
 | ||
|     wchar_t* n1;
 | ||
| 
 | ||
|     int num = SQGetTop(v);
 | ||
| 
 | ||
|     if (num == 2)
 | ||
|     {
 | ||
|         SQGetString(v, 2, &n1);
 | ||
|         SQPopTop(v);
 | ||
|         /*
 | ||
|         size_t len = wcslen(n1) + 1;
 | ||
|         size_t converted = 0;
 | ||
|         char* CStr;
 | ||
|         CStr = (char*)malloc(len * sizeof(char));
 | ||
|         wcstombs_s(&converted, CStr, len, n1, _TRUNCATE);
 | ||
|         */
 | ||
| 
 | ||
|         squirrel::SQdofile(v, n1, false, false);
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //内存操作
 | ||
| #if defined ADDRESS_API_SWITCH
 | ||
| //读内存
 | ||
| int squirrel::LReadAddress(uint32_t v)
 | ||
| {
 | ||
|     //内存地址 int型
 | ||
|     int Address;
 | ||
| 
 | ||
|     //获取参数个数
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     //1个参数时
 | ||
|     if (ParameterNum == 2)
 | ||
|     {
 | ||
|         //获取值的类型
 | ||
|         int ParameterType = SQ_GetType(v, 2);
 | ||
| 
 | ||
|         switch (ParameterType)
 | ||
|         {
 | ||
|         case OT_INTEGER://int类型
 | ||
|         {
 | ||
|             //获取地址
 | ||
|             SQGetInt(v, 2, &Address);
 | ||
|             int Value = *(int*)Address;
 | ||
|             SQPushInt(v, Value);
 | ||
|             return 1;
 | ||
|         }
 | ||
|         break;
 | ||
|         case OT_STRING://String类型
 | ||
|         {
 | ||
| 
 | ||
|         }
 | ||
|         break;
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     if (ParameterNum == 3)
 | ||
|     {
 | ||
|         //地址
 | ||
|         int Address;
 | ||
|         //偏移
 | ||
|         wchar_t* offset;
 | ||
| 
 | ||
|         SQGetInt(v, 2, &Address);
 | ||
|         SQGetString(v,3,&offset);
 | ||
| 
 | ||
|         int Value = DNFTOOL::GetHook(Address, DNFTOOL::wchar_tTochar(offset));
 | ||
|         SQPushInt(v, Value);
 | ||
|         return 1;
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|         return 1;
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| //写内存
 | ||
| int squirrel::LWriteAddress(uint32_t v)
 | ||
| {
 | ||
|     //内存地址 int型
 | ||
|     int Address;
 | ||
| 
 | ||
|     //获取参数个数
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     //1个参数时
 | ||
|     if (ParameterNum == 3)
 | ||
|     {
 | ||
|         //获取值的类型
 | ||
|         int ParameterType = SQ_GetType(v, 2);
 | ||
|         
 | ||
|         switch (ParameterType)
 | ||
|         {
 | ||
|         case OT_INTEGER://int类型
 | ||
|         {
 | ||
|             //获取地址
 | ||
|             SQGetInt(v, 2, &Address);
 | ||
|             //获取修改的值
 | ||
|             int WriteValue;
 | ||
|             SQGetInt(v, 3, &WriteValue);
 | ||
| 
 | ||
|             *(int*)Address = WriteValue;
 | ||
|             SQPushBool(v, true);
 | ||
|             return 1;
 | ||
|         }
 | ||
|         break;
 | ||
|         case OT_STRING://String类型
 | ||
|         {
 | ||
|         }
 | ||
|         break;
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     if (ParameterNum == 4)
 | ||
|     {
 | ||
|         //地址
 | ||
|         int Address;
 | ||
|         //偏移
 | ||
|         wchar_t* offset;
 | ||
|         //修改值
 | ||
|         int WriteValue;
 | ||
| 
 | ||
|         SQGetInt(v, 2, &Address);
 | ||
|         SQGetString(v, 3, &offset);
 | ||
|         SQGetInt(v, 4, &WriteValue);
 | ||
| 
 | ||
|         int SelectAddress = DNFTOOL::GetHook(Address, DNFTOOL::wchar_tTochar(offset),1);
 | ||
|         *(int*)SelectAddress = WriteValue;
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|         return 1;
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| //Lcout
 | ||
| int squirrel::Lcout(uint32_t v)
 | ||
| {
 | ||
|     char* str = NULL;
 | ||
|     int type = NULL;
 | ||
|     int color = NULL;
 | ||
|     int num = SQGetTop(v);
 | ||
| 
 | ||
|     if (num == 2 || num == 3 || num == 4)
 | ||
|     {
 | ||
|         switch (num)
 | ||
|         {
 | ||
|         case 2:
 | ||
|             SQGetStringc(v, 2, &str);
 | ||
|             break;
 | ||
|         case 3:
 | ||
|             SQGetStringc(v, 2, &str);
 | ||
|             SQGetInt(v, 3, &type);
 | ||
|             break;
 | ||
|         case 4:
 | ||
|             SQGetStringc(v, 2, &str);
 | ||
|             SQGetInt(v, 3, &type);
 | ||
|             SQGetInt(v, 4, &color);
 | ||
|             break;
 | ||
|         }
 | ||
| 
 | ||
|         SQPopTop(v);
 | ||
| 
 | ||
|         DNFTOOL::GMNotice(str, type, color);
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| //新建窗口
 | ||
| int squirrel::NewWindows(uint32_t v)
 | ||
| {
 | ||
|     char* str = NULL;
 | ||
|     int type = NULL;
 | ||
|     int color = NULL;
 | ||
|     int num = SQGetTop(v);
 | ||
| 
 | ||
|     if (num == 2 || num == 3 || num == 4)
 | ||
|     {
 | ||
|         switch (num)
 | ||
|         {
 | ||
|         case 2:
 | ||
|             SQGetStringc(v, 2, &str);
 | ||
|             break;
 | ||
|         case 3:
 | ||
|             SQGetStringc(v, 2, &str);
 | ||
|             SQGetInt(v, 3, &type);
 | ||
|             break;
 | ||
|         case 4:
 | ||
|             SQGetStringc(v, 2, &str);
 | ||
|             SQGetInt(v, 3, &type);
 | ||
|             SQGetInt(v, 4, &color);
 | ||
|             break;
 | ||
|         }
 | ||
|         
 | ||
|         DNFTOOL::WindowsNotice(str, type, color);
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| int squirrel::sq_Cmd(uint32_t v)
 | ||
| {
 | ||
|     wchar_t* OutPutBuffer;
 | ||
|     SQGetString(v, 2, &OutPutBuffer);
 | ||
|     char* OutPutText = DNFTOOL::SquirrelU2W(OutPutBuffer);
 | ||
| 
 | ||
|     system(OutPutText);
 | ||
|     //WinExec(OutPutText, SW_NORMAL);
 | ||
|     delete[]OutPutText;
 | ||
|     return 1;
 | ||
| }
 | ||
| //设置UI槽坐标
 | ||
| int squirrel::SetSlot(uint32_t v)
 | ||
| {
 | ||
|     int Type = NULL;
 | ||
|     int Index = NULL;
 | ||
|     int Xpos = NULL;
 | ||
|     int Ypos = NULL;
 | ||
| 
 | ||
| 
 | ||
|     int OneAddr = NULL;
 | ||
|     int* xpos = NULL;
 | ||
|     int* ypos = NULL;
 | ||
| 
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
| 
 | ||
|     if (ParameterNum == 5)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &Type);
 | ||
|         SQGetInt(v, 3, &Index);
 | ||
|         SQGetInt(v, 4, &Xpos);
 | ||
|         SQGetInt(v, 5, &Ypos);
 | ||
| 
 | ||
|         SQPopTop(v);
 | ||
| 
 | ||
|         switch (Type)
 | ||
|         {
 | ||
|         case 0://拓展技能栏
 | ||
|             OneAddr = *(int*)0x1ADE0CC;
 | ||
|             OneAddr = *(int*)(OneAddr + (0x60 + (4 * Index)));
 | ||
|             xpos = (int*)(OneAddr + (0x14));
 | ||
|             ypos = (int*)(OneAddr + (0x18));
 | ||
|             *xpos = Xpos;
 | ||
|             *ypos = Ypos;
 | ||
|             break;
 | ||
|         case 1://基础技能栏
 | ||
|             OneAddr = *(int*)0x1ADE0CC;
 | ||
|             OneAddr = *(int*)(OneAddr + (0x30 + (4 * Index)));
 | ||
|             xpos = (int*)(OneAddr + (0x14));
 | ||
|             ypos = (int*)(OneAddr + (0x18));
 | ||
|             *xpos = Xpos;
 | ||
|             *ypos = Ypos;
 | ||
|             break;
 | ||
|         case 2://切换技能栏
 | ||
|             OneAddr = *(int*)0x1ADE0CC;
 | ||
|             OneAddr = *(int*)(OneAddr + (0x124 + (4 * Index)));
 | ||
|             xpos = (int*)(OneAddr + (0x14));
 | ||
|             ypos = (int*)(OneAddr + (0x18));
 | ||
|             *xpos = Xpos;
 | ||
|             *ypos = Ypos;
 | ||
|             break;
 | ||
|         case 3://快捷物品栏
 | ||
|             OneAddr = *(int*)0x1ADE0CC;
 | ||
|             OneAddr = *(int*)(OneAddr + (0x18 + (4 * Index)));
 | ||
|             xpos = (int*)(OneAddr + (0x14));
 | ||
|             ypos = (int*)(OneAddr + (0x18));
 | ||
|             *xpos = Xpos;
 | ||
|             *ypos = Ypos;
 | ||
|             break;
 | ||
|         case 4://特性技能展开栏
 | ||
|             OneAddr = *(int*)0x1ADE0CC;
 | ||
|             OneAddr = *(int*)(OneAddr + 0xC);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x4);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x0);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x34);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x4);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x28);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x4);
 | ||
| 
 | ||
|             xpos = (int*)(OneAddr + (0x394));
 | ||
|             ypos = (int*)(OneAddr + (0x398));
 | ||
|             *xpos = Xpos;
 | ||
|             *ypos = Ypos;
 | ||
|             break;
 | ||
|         case 5://特性技能技能栏
 | ||
|             OneAddr = *(int*)(0x16E95AC + 0x400000);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x68);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x0);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x8);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x64);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x0);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x1C);
 | ||
|             OneAddr = *(int*)(OneAddr + 0x0);
 | ||
| 
 | ||
|             xpos = (int*)(OneAddr + (0x1794));
 | ||
|             ypos = (int*)(OneAddr + (0x1798));
 | ||
|             *xpos = Xpos;
 | ||
|             *ypos = Ypos;
 | ||
|             break;
 | ||
|         case 6://菜单栏
 | ||
|             OneAddr = *(int*)0x1ADE0CC;
 | ||
|             OneAddr = *(int*)(OneAddr + (0x84 + (4 * Index)));
 | ||
|             xpos = (int*)(OneAddr + (0x14));
 | ||
|             ypos = (int*)(OneAddr + (0x18));
 | ||
|             *xpos = Xpos;
 | ||
|             *ypos = Ypos;
 | ||
|             break;
 | ||
|         }
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //设置项目名称颜色
 | ||
| #if defined ITEMRARITY
 | ||
| std::map< int, int>ItemColorMap;
 | ||
| int squirrel::RegisterItemColor_STL(uint32_t v)
 | ||
| {
 | ||
|     int ItemID, Clolr;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 3)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &ItemID);
 | ||
|         SQGetInt(v, 3, &Clolr);
 | ||
|         ItemColorMap[ItemID] = Clolr;
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| //设置文字HOOK
 | ||
| #ifdef CODEDRAW
 | ||
| struct CodeDrawObj
 | ||
| {
 | ||
|     int Color;
 | ||
|     std::string str;
 | ||
| };
 | ||
| std::map< std::string , CodeDrawObj>CodeDrawMap;
 | ||
| int squirrel::RegisterCodeDraw_STL(uint32_t v)
 | ||
| {
 | ||
|     int Clolr;
 | ||
|     wchar_t* Key;
 | ||
|     wchar_t* OutPutBuffer;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 4)
 | ||
|     {
 | ||
|         SQGetString(v, 2, &Key);
 | ||
|         SQGetInt(v, 3, &Clolr);
 | ||
|         SQGetString(v, 4, &OutPutBuffer);
 | ||
| 
 | ||
|         char* OutPutKey = DNFTOOL::SquirrelU2W(Key);
 | ||
|         std::string BufferKey = OutPutKey;
 | ||
|         delete[]OutPutKey;
 | ||
| 
 | ||
|         char* OutPutText = DNFTOOL::SquirrelU2W(OutPutBuffer);
 | ||
|         std::string str = OutPutText;
 | ||
|         delete[]OutPutText;
 | ||
| 
 | ||
|         CodeDrawObj buffobj;
 | ||
|         buffobj.Color = Clolr;
 | ||
|         buffobj.str = str;
 | ||
|         CodeDrawMap[BufferKey] = buffobj;
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| #endif 
 | ||
| 
 | ||
| 
 | ||
| //普通 STL
 | ||
| #if defined NORMAL_STL
 | ||
| //查询 类型容器
 | ||
| int squirrel::Get_STL(uint32_t v)
 | ||
| {
 | ||
|     char* Name;
 | ||
|     int Type;
 | ||
|     int Idx;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
| 
 | ||
|     if (ParameterNum == 4)
 | ||
|     {
 | ||
|         //获取容器名字
 | ||
|         SQGetStringc(v, 2, &Name);
 | ||
|         //获取容器类型
 | ||
|         SQGetInt(v, 3, &Type);
 | ||
|         //获取查询号位
 | ||
|         SQGetInt(v, 4, &Idx);
 | ||
|         if (STL::Check_STL(Name, Type) == 0)
 | ||
|         {
 | ||
|             SQPushBool(v, false);
 | ||
|             return 1;
 | ||
|         }
 | ||
|         switch (Type)
 | ||
|         {
 | ||
|         case 0:
 | ||
|             SQPushInt(v, Int_STL[Name]);
 | ||
|             break;
 | ||
|         case 1:
 | ||
|             SQPushFloat(v, Float_STL[Name]);
 | ||
|             break;
 | ||
|         case 2:
 | ||
|             SQPushStringc(v, String_STL[Name].c_str(), strlen(String_STL[Name].c_str()));
 | ||
|             break;
 | ||
|         case 3:
 | ||
|             SQPushBool(v, Bool_STL[Name]);
 | ||
|             break;
 | ||
|         case 4:
 | ||
|             SQPushInt(v, STL::GetIntArr_STL(Name, Idx));
 | ||
|             break;
 | ||
|         case 5:
 | ||
|             SQPushFloat(v, STL::GetFloatArr_STL(Name, Idx));
 | ||
|             break;
 | ||
|         case 6:
 | ||
|             SQPushStringc(v, STL::GetStringArr_STL(Name, Idx).c_str(), strlen(STL::GetStringArr_STL(Name, Idx).c_str()));
 | ||
|             break;
 | ||
|         case 7:
 | ||
|             SQPushBool(v, STL::GetBoolArr_STL(Name, Idx));
 | ||
|             break;
 | ||
|         default:
 | ||
|             return 0;
 | ||
|             break;
 | ||
|         }
 | ||
|         return 1;
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         return 0;
 | ||
|     }
 | ||
| }
 | ||
| //设置 类型容器
 | ||
| int squirrel::Set_STL(uint32_t v)
 | ||
| {
 | ||
|     char* Name;
 | ||
|     int Type;
 | ||
|     int Idx;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
| 
 | ||
|     int IntValue;
 | ||
|     FLOAT FloatValue;
 | ||
|     char* StrValue;
 | ||
|     BOOL BoolValue;
 | ||
|     if (ParameterNum == 5)
 | ||
|     {
 | ||
|         //获取容器名字
 | ||
|         SQGetStringc(v, 2, &Name);
 | ||
|         //获取容器类型
 | ||
|         SQGetInt(v, 3, &Type);
 | ||
|         //获取修改号位
 | ||
|         SQGetInt(v, 4, &Idx);
 | ||
| 
 | ||
|         //获取修改值
 | ||
|         switch (Type)
 | ||
|         {
 | ||
|         case 0:
 | ||
|             SQGetInt(v, 5, &IntValue);
 | ||
|             Int_STL[Name] = IntValue;
 | ||
|             break;
 | ||
|         case 1:
 | ||
|             SQGetFloat(v, 5, &FloatValue);
 | ||
|             Float_STL[Name] = FloatValue;
 | ||
|             break;
 | ||
|         case 2:
 | ||
|             SQGetStringc(v, 5, &StrValue);
 | ||
|             String_STL[Name] = StrValue;
 | ||
|             break;
 | ||
|         case 3:
 | ||
|             SQGetBool(v, 5, &BoolValue);
 | ||
|             Bool_STL[Name] = BoolValue;
 | ||
|             break;
 | ||
|         case 4:
 | ||
|             SQGetInt(v, 5, &IntValue);
 | ||
|             STL::SetIntArr_STL(Name,Idx, IntValue);
 | ||
|             break;
 | ||
|         case 5:
 | ||
|             SQGetFloat(v, 5, &FloatValue);
 | ||
|             STL::SetFloatArr_STL(Name, Idx, FloatValue);
 | ||
|             break;
 | ||
|         case 6:
 | ||
|             SQGetStringc(v, 5, &StrValue);
 | ||
|             STL::SetStringArr_STL(Name, Idx, StrValue);
 | ||
|             break;
 | ||
|         case 7:
 | ||
|             SQGetBool(v, 5, &BoolValue);
 | ||
|             STL::SetBoolArr_STL(Name, Idx, BoolValue);
 | ||
|             break;
 | ||
|         default:
 | ||
|             SQPushBool(v, false);
 | ||
|             return 1;
 | ||
|             break;
 | ||
|         }
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //new 类型容器
 | ||
| int squirrel::New_STL(uint32_t v)
 | ||
| {
 | ||
|     char* Name;
 | ||
|     int Type;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 3)
 | ||
|     {
 | ||
|         //获取容器名字
 | ||
|         SQGetStringc(v, 2, &Name);
 | ||
|         //获取容器类型
 | ||
|         SQGetInt(v, 3, &Type);
 | ||
|         if (STL::Check_STL(Name, Type) != 0)
 | ||
|         {
 | ||
|             SQPushBool(v, false);
 | ||
|             return 1;
 | ||
|         }
 | ||
|         switch (Type)
 | ||
|         {
 | ||
|         case 0:
 | ||
|                 Int_STL[Name] = 0;//单Int容器
 | ||
|             break;
 | ||
|         case 1:
 | ||
|                 Float_STL[Name] = 0.0;//单Float容器
 | ||
|             break;
 | ||
|         case 2:
 | ||
|                 String_STL[Name] = "zero";//单String容器
 | ||
|             break;
 | ||
|         case 3:
 | ||
|                 Bool_STL[Name] = false;//单Bool容器
 | ||
|             break;
 | ||
|         case 4:
 | ||
|                 STL::BuildIntArr_STL(Name);//Int数组容器
 | ||
|             break;
 | ||
|         case 5:
 | ||
|                 STL::BuildFloatArr_STL(Name);//Float数组容器
 | ||
|             break;
 | ||
|         case 6:
 | ||
|                 STL::BuildStringArr_STL(Name);//String数组容器
 | ||
|             break;
 | ||
|         case 7:
 | ||
|                 STL::BuildBoolArr_STL(Name);//Bool数组容器
 | ||
|             break;
 | ||
|         default:
 | ||
|             SQPushBool(v, false);
 | ||
|             return 1;
 | ||
|             break;
 | ||
|         }
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| //时间 STL
 | ||
| #if defined TIME_STL
 | ||
| extern  std::map<wchar_t*, TimeSTLStruct>Time_STL;
 | ||
| //时间容器
 | ||
| int squirrel::Timer_STL(uint32_t v)
 | ||
| {
 | ||
|     wchar_t* Name;
 | ||
|     int MaxTime;
 | ||
|     int Type;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 4)
 | ||
|     {
 | ||
|         //获取容器名字
 | ||
|         SQGetString(v, 2, &Name);
 | ||
|         //获取最大值
 | ||
|         SQGetInt(v, 3, &MaxTime);
 | ||
|         //获取容器类型
 | ||
|         SQGetInt(v, 4, &Type);
 | ||
| 
 | ||
|         switch (Type)
 | ||
|         {
 | ||
|         case 0: //设置时间容器
 | ||
|         {
 | ||
|             if (Time_STL.count(Name) == 1)//如果这个标识容器存在 就返回 否则创建
 | ||
|             {
 | ||
|                 SQPushBool(v, false);
 | ||
|                 return 1;
 | ||
|             }
 | ||
|             TimeSTLStruct pack;//定义结构体
 | ||
|             pack.Name = Name;//设置容器标识名称
 | ||
|             pack.Max_Time = MaxTime;//设置 标识时间容器最大时间
 | ||
|             pack.Now_Time = 0;//设置 标识时间容器当前时间
 | ||
|             pack.Static_Time = 0;//设置 基础时间(用于运算)
 | ||
|             Time_STL[Name] = pack;//设置包给标识时间容器
 | ||
|         }
 | ||
|         break;
 | ||
|         case 1: //启动时间容器
 | ||
|         {
 | ||
|             if (Time_STL[Name].Static_Time != 0)break;//只有基础时间为0的时候记录当前时间标准
 | ||
|             Time_STL[Name].Static_Time =  clock();
 | ||
|            
 | ||
|         }
 | ||
|         break;
 | ||
|         case 2://获取时间容器
 | ||
|         {
 | ||
|             int Time = clock() - Time_STL[Name].Static_Time + Time_STL[Name].Now_Time;
 | ||
|             if(Time_STL[Name].Static_Time + Time_STL[Name].Now_Time == 0)SQPushBool(v, false);//没启动返回0
 | ||
|             else if (Time <= Time_STL[Name].Max_Time)SQPushInt(v, Time);//返回当前容器时间
 | ||
|             else SQPushInt(v, (int)Time_STL[Name].Max_Time);
 | ||
|             return 1;
 | ||
|         }
 | ||
|         break;
 | ||
|         case 3://重置时间容器
 | ||
|         {
 | ||
|             Time_STL[Name].Static_Time = 0;
 | ||
|         }
 | ||
|         break;
 | ||
|         case 4://暂停时间容器
 | ||
|         {
 | ||
|             Time_STL[Name].Now_Time += clock() - Time_STL[Name].Static_Time;
 | ||
|             Time_STL[Name].Static_Time = 0;
 | ||
|         }
 | ||
|         break;
 | ||
|         case 5://继续时间容器
 | ||
|         {
 | ||
|             if (Time_STL[Name].Static_Time != 0)break;//只有基础时间为0的时候记录当前时间标准
 | ||
|             Time_STL[Name].Static_Time =  clock();
 | ||
|         }
 | ||
|         break;
 | ||
|         case 6://销毁时间容器
 | ||
|         {
 | ||
|             Time_STL.erase(Name);//销毁容器
 | ||
|         }
 | ||
|         break;
 | ||
|         default:
 | ||
|         {
 | ||
|             SQPushBool(v, false);
 | ||
|             return 1;
 | ||
|         }
 | ||
|         break;
 | ||
|         }
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| //龙盒
 | ||
| #if defined DRAGONBOX_SWITCH
 | ||
| //同步 龙盒数据包
 | ||
| int squirrel::Sync_Dragon_Pack(uint32_t v)
 | ||
| {
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 1)
 | ||
|     {
 | ||
|         STL::SyncDargonBox_STL();
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取 龙盒数据包
 | ||
| int squirrel::Get_Dragon_Pack(uint32_t v)
 | ||
| {
 | ||
|     int Type;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &Type);
 | ||
| 
 | ||
|         int Pack_Value;
 | ||
|         //单抽模式
 | ||
|         Pack_Value = STL::SelectDargonBox_STL(Type);
 | ||
|         SQPushInt(v, Pack_Value);
 | ||
| 
 | ||
|         return 1;
 | ||
|     }
 | ||
|     if (ParameterNum == 3)
 | ||
|     {
 | ||
|         int Index;
 | ||
|         SQGetInt(v, 2, &Type);
 | ||
|         SQGetInt(v, 3, &Index);
 | ||
| 
 | ||
|         int Pack_Value;
 | ||
|         Pack_Value = STL::SelectDargonBox_STL(Type, Index);
 | ||
| 
 | ||
|         SQPushInt(v, Pack_Value);
 | ||
|         return 1;
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| //发送 开龙盒
 | ||
| int squirrel::Redom_Dragon(uint32_t v)
 | ||
| {
 | ||
|     int Type;
 | ||
|     int Port;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 3)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &Type);
 | ||
|         SQGetInt(v, 3, &Port);
 | ||
|         rapidjson::StringBuffer buffer;
 | ||
|         rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
 | ||
| 
 | ||
|         writer.StartObject();
 | ||
|         writer.Key("op");
 | ||
|         writer.Int(Type);
 | ||
|         writer.EndObject();
 | ||
| 
 | ||
|         char* str = (char*)buffer.GetString();
 | ||
| 
 | ||
|         _SendpacksType(*_SendClass, 0, Port);
 | ||
|         _SendPacksChar(*_SendClass, 0, str, strlen(str));
 | ||
|         _SendPacks();
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| 
 | ||
| }
 | ||
| //获取 龙盒 模式
 | ||
| int squirrel::Get_DragonModel(uint32_t v)
 | ||
| {
 | ||
|     int Type;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &Type);
 | ||
|         int Model = STL::SelectDargonModel_STL(Type);//龙盒模式
 | ||
|         SQPushInt(v, Model);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| //设置 龙盒 模式
 | ||
| int squirrel::Set_DragonModel(uint32_t v)
 | ||
| {
 | ||
|     int Model;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &Model);
 | ||
|         STL::DrawDargonModel_STL(Model);//龙盒模式
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| //Json STL
 | ||
| #if defined JSON_STL
 | ||
| //构造Json类型容器
 | ||
| std::map<std::string, std::string>Json_STL;
 | ||
| //Json容器
 | ||
| int squirrel::Jsoner_STL(uint32_t v)
 | ||
| {
 | ||
|     wchar_t* WName;
 | ||
|     int Type;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 3)
 | ||
|     {
 | ||
|         //获取容器名字
 | ||
|         SQGetString(v, 2, &WName);
 | ||
|         char* CName = DNFTOOL::wchar_tTochar(WName);
 | ||
|         std::string Name = CName;
 | ||
|         delete []CName;
 | ||
|         //获取值的类型
 | ||
|         int ValueType = SQ_GetType(v, 3);
 | ||
| 
 | ||
|         switch (ValueType)
 | ||
|         {
 | ||
|         case OT_INTEGER://int类型
 | ||
|         {
 | ||
|             //获取模式
 | ||
|             SQGetInt(v, 3, &Type);
 | ||
| 
 | ||
|             switch (Type)
 | ||
|             {
 | ||
|             case 0://构造
 | ||
|             {
 | ||
|                 if (Json_STL.count(Name) == 0)//如果这个hash不存在 就创建
 | ||
|                 {
 | ||
|                     //构造对应 hash 的 Json容器
 | ||
|                     std::string str = "";
 | ||
|                     Json_STL[Name] = str;
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     SQPushBool(v, false);
 | ||
|                     return 1;
 | ||
|                 }
 | ||
|                 break;
 | ||
|             }
 | ||
|             case 1://读取整体
 | ||
|             {
 | ||
|                 wchar_t* buffer = DNFTOOL::charTowchar_t((char*)Json_STL[Name].c_str());
 | ||
|                 SQPushString(v, buffer, wcslen(buffer));//传给nut
 | ||
|                 delete []buffer;
 | ||
|                 return 1;
 | ||
|                 break;
 | ||
|             }
 | ||
|             case 2://销毁
 | ||
|                 Json_STL.erase(Name);//销毁容器
 | ||
|                 break;
 | ||
|             }
 | ||
|         }
 | ||
|         break;
 | ||
|         case OT_STRING://String类型
 | ||
|         {
 | ||
|             
 | ||
|             if (Json_STL.count(Name) == 0)//如果这个hash不存在 就返回
 | ||
|             {
 | ||
|                 SQPushBool(v,false);
 | ||
|                 return 1;
 | ||
|             }
 | ||
|             
 | ||
|             wchar_t* GKey;
 | ||
|             //获取访问需求
 | ||
|             SQGetString(v, 3, &GKey);
 | ||
|             char* key = DNFTOOL::SquirrelU2W(GKey);
 | ||
|             //char* key = DNFTOOL::wchar_tTochar(GKey);
 | ||
|             rapidjson::Document Dom;
 | ||
|             Dom.Parse(Json_STL[Name].c_str());//加载 字符串
 | ||
| 
 | ||
|             std::vector<std::string> Data;
 | ||
|             DNFTOOL::Split(key, Data);
 | ||
|             delete []key;
 | ||
|             rapidjson::Value Vbuffer;
 | ||
|             for (unsigned int i = 0; i < Data.size(); i++)
 | ||
|             {
 | ||
|                 if (i == 0)
 | ||
|                 {
 | ||
|                     Vbuffer = Dom[Data[i].c_str()];
 | ||
|                 }
 | ||
|                 else if (DNFTOOL::isNum(Data[i].c_str()) != 0)
 | ||
|                 {
 | ||
|                     if(Vbuffer.Empty() == 0 && Vbuffer.Size() > atoi(Data[i].c_str()))Vbuffer = Vbuffer[atoi(Data[i].c_str())];
 | ||
|                     else
 | ||
|                     {
 | ||
|                         SQPushBool(v, false);
 | ||
|                         return 1;
 | ||
|                     }
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     if (Vbuffer.Empty() == 0)Vbuffer = Vbuffer[Data[i].c_str()];
 | ||
|                 }
 | ||
| 
 | ||
|             }
 | ||
| 
 | ||
|             if (Vbuffer.IsBool())
 | ||
|             {
 | ||
|                 SQPushBool(v, Vbuffer.GetBool());
 | ||
|                 return 1;
 | ||
|             }
 | ||
|             else if (Vbuffer.Empty() == false || (Vbuffer.IsInt() && Vbuffer.GetInt()==0))
 | ||
|             {
 | ||
|                 if (Vbuffer.IsString())
 | ||
|                 {
 | ||
|                     wchar_t* buffer = DNFTOOL::charTowchar_t((char*)Vbuffer.GetString());
 | ||
|                     SQPushString(v, buffer, wcslen(buffer));
 | ||
|                     delete []buffer;
 | ||
|                     return 1;
 | ||
|                 }
 | ||
|                 else if (Vbuffer.IsInt())
 | ||
|                 {
 | ||
|                     SQPushInt(v, Vbuffer.GetInt());
 | ||
|                     return 1;
 | ||
|                 }
 | ||
|                 else if (Vbuffer.IsFloat())
 | ||
|                 {
 | ||
|                     SQPushFloat(v, Vbuffer.GetFloat());
 | ||
|                     return 1;
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     
 | ||
|                     rapidjson::StringBuffer jsonBuffer;
 | ||
|                     rapidjson::Writer<rapidjson::StringBuffer> writer(jsonBuffer);
 | ||
|                     Vbuffer.Accept(writer);
 | ||
|                     const char* json = jsonBuffer.GetString();
 | ||
|                     wchar_t* buffer = DNFTOOL::charTowchar_t((char*)json);
 | ||
|                     SQPushString(v, buffer, wcslen(buffer));
 | ||
|                     delete[]buffer;
 | ||
|                     return 1;
 | ||
|                 }
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 SQPushBool(v, false);
 | ||
|                 return 1;
 | ||
|             }
 | ||
|         }
 | ||
|             break;
 | ||
|         }
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else if (ParameterNum == 4)
 | ||
|     {
 | ||
|         //获取容器名字
 | ||
|         SQGetString(v, 2, &WName);
 | ||
|         char* CName = DNFTOOL::wchar_tTochar(WName);
 | ||
|         std::string Name = CName;
 | ||
|         delete []CName;
 | ||
|         //获取Key 的名字
 | ||
|         wchar_t* keybuffer;
 | ||
|         SQGetString(v, 3, &keybuffer);
 | ||
|         //转化为可用Key
 | ||
|         char* key = DNFTOOL::wchar_tTochar(keybuffer);
 | ||
|               
 | ||
|         //构造json dom
 | ||
|         rapidjson::Document Dom;
 | ||
|         Dom.Parse(Json_STL[Name].c_str());//加载 字符串
 | ||
|         if(Json_STL[Name].length() == 0 )Dom.SetObject();//如果未初始化就初始化一次
 | ||
| 
 | ||
|         rapidjson::Value BB;
 | ||
| 
 | ||
|         //获取值的类型
 | ||
|         int ValueType = SQ_GetType(v, 4);
 | ||
|         //判断值类型
 | ||
|         switch (ValueType)
 | ||
|         {
 | ||
|         case OT_INTEGER://int类型
 | ||
|         {
 | ||
|             int Value;
 | ||
|             SQGetInt(v, 4, &Value);
 | ||
|             BB.SetInt(Value);    
 | ||
|             break;
 | ||
|         }
 | ||
|         case OT_FLOAT://float类型
 | ||
|         {
 | ||
|             FLOAT Value;
 | ||
|             SQGetFloat(v, 4, &Value);
 | ||
|             BB.SetFloat(Value);
 | ||
|             break;
 | ||
|         }
 | ||
|         case OT_BOOL://bool类型
 | ||
|         {
 | ||
|             BOOL Value;
 | ||
|             SQGetBool(v, 4, &Value);
 | ||
|             BB.SetBool(Value);
 | ||
|             break;
 | ||
|         }
 | ||
|         case OT_STRING://string类型
 | ||
|         {
 | ||
|             wchar_t* Value;
 | ||
|             SQGetString(v, 4, &Value);
 | ||
|             char* str = DNFTOOL::wchar_tTochar(Value);
 | ||
|             BB.SetString(rapidjson::StringRef(str));
 | ||
|             delete []str;
 | ||
|             break;
 | ||
|         }
 | ||
|         default:
 | ||
|             break;
 | ||
|         }
 | ||
| 
 | ||
|         if (Dom[key].IsNull())//如果键值为空就新增
 | ||
|         {
 | ||
|             Dom.AddMember(rapidjson::StringRef(key), BB, Dom.GetAllocator());
 | ||
|         }
 | ||
|         else//否则就修改
 | ||
|         {
 | ||
|             Dom[key] = BB;
 | ||
|         }
 | ||
| 
 | ||
|         rapidjson::StringBuffer jsonBuffer;
 | ||
|         rapidjson::Writer<rapidjson::StringBuffer> writer(jsonBuffer);
 | ||
|         Dom.Accept(writer);
 | ||
|         Json_STL[Name] = jsonBuffer.GetString();
 | ||
|         SQPushBool(v, true);
 | ||
| 
 | ||
|         delete []key;
 | ||
|     }
 | ||
|     else if (ParameterNum == 5)
 | ||
|     {
 | ||
|         //获取容器名字
 | ||
|         SQGetString(v, 2, &WName);
 | ||
|         char* CName = DNFTOOL::wchar_tTochar(WName);
 | ||
|         std::string Name = CName;
 | ||
| 
 | ||
|         //获取Str 的内容
 | ||
|         wchar_t* str;
 | ||
|         SQGetString(v, 3, &str);
 | ||
|         //转化为可用内容
 | ||
|         char* Jso = DNFTOOL::wchar_tTochar(str);
 | ||
| 
 | ||
|         //获取类型
 | ||
|         int Type;
 | ||
|         SQGetInt(v, 4, &Type);
 | ||
|         switch (Type)
 | ||
|         {
 | ||
|         case 0:
 | ||
|             Json_STL[Name] = Jso;
 | ||
|             break;
 | ||
|         case 1:
 | ||
|             if(Json_STL[Name].empty())Json_STL[Name] = Jso;
 | ||
|             break;
 | ||
|         default:
 | ||
|             break;
 | ||
|         }
 | ||
|         delete []CName;
 | ||
|         delete []Jso;
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     
 | ||
|     return 1;
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| //字符 STL
 | ||
| #if defined CODE_STL
 | ||
| extern  std::vector< DrawCodestruct>DrawCodeT1_STL;
 | ||
| extern  std::vector< DrawCodestruct>DrawCodeT2_STL;
 | ||
| extern  std::vector< DrawCodestruct>DrawCodeT3_STL;
 | ||
| int squirrel::Coder_STL(uint32_t v)
 | ||
| {
 | ||
|     wchar_t* Str;
 | ||
|     int XPos;
 | ||
|     int YPos;
 | ||
|     int Color;
 | ||
|     int Type;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     
 | ||
|     if (ParameterNum == 6)
 | ||
|     {
 | ||
|         //获取字符串内容
 | ||
|         SQGetString(v, 2, &Str);
 | ||
|         //获取X坐标
 | ||
|         SQGetInt(v, 3, &XPos);
 | ||
|         //获取X坐标
 | ||
|         SQGetInt(v, 4, &YPos);
 | ||
|         //获取颜色
 | ||
|         SQGetInt(v, 5, &Color);
 | ||
|         //获取类型
 | ||
|         SQGetInt(v, 6, &Type);
 | ||
|         
 | ||
|         //松鼠 Wchar_t  转换为  Unicode
 | ||
|         char* OutPutText = DNFTOOL::SquirrelU2W(Str);
 | ||
|         std::string str = OutPutText;
 | ||
|         //wchar_t * str = DNFTOOL::char2wchar(OutPutText);
 | ||
|         delete []OutPutText;
 | ||
|         //delete Str;
 | ||
| 
 | ||
|         DrawCodestruct Buffer;
 | ||
|         Buffer.str = str;
 | ||
|         Buffer.Xpos = XPos;
 | ||
|         Buffer.Ypos = YPos;
 | ||
|         Buffer.Color = Color;
 | ||
| 
 | ||
|         switch (Type)
 | ||
|         {
 | ||
|         case 0:
 | ||
|         {
 | ||
|             DrawCodeT1_STL.push_back(Buffer);
 | ||
|         }
 | ||
|         break;
 | ||
|         case 1:
 | ||
|         {
 | ||
|             DrawCodeT2_STL.push_back(Buffer);
 | ||
|         }
 | ||
|         break;
 | ||
|         case 2:
 | ||
|         {
 | ||
|             DrawCodeT3_STL.push_back(Buffer);
 | ||
|         }
 | ||
|         break;
 | ||
|         }
 | ||
|         
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     
 | ||
|     return 1;
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| //绘制字符
 | ||
| #ifdef DRAW_CODE
 | ||
| typedef DWORD(_fastcall _FontInit)(DWORD thisc, DWORD Seat);
 | ||
| static _FontInit* sub_11BE9A0 = (_FontInit*)0x11BE9A0;
 | ||
| static _FontInit* sub_11BE980 = (_FontInit*)0x11BE980;
 | ||
| typedef DWORD(_fastcall _BFontInit)(DWORD thisc, DWORD Seat);
 | ||
| static _BFontInit* sub_1206570 = (_BFontInit*)0x1206570;
 | ||
| typedef DWORD(_fastcall _FontC)(DWORD thisc, DWORD Seat, DWORD Font);
 | ||
| static _FontC* sub_1206550 = (_FontC*)0x1206550;
 | ||
| static DrawCode NewDrawCodeF = (DrawCode)0x01206BD0;
 | ||
| 
 | ||
| int squirrel::sq_DrawCode(uint32_t v)
 | ||
| {
 | ||
|     wchar_t* Str;
 | ||
|     int XPos;
 | ||
|     int YPos;
 | ||
|     int Color;
 | ||
|     int Type;
 | ||
|     int Stroke;
 | ||
| 
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
| 
 | ||
|     if (ParameterNum == 4)
 | ||
|     {
 | ||
|         Color = (int)0xfffffffff;
 | ||
|         Type = 1;
 | ||
|         Stroke = 0;
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else if (ParameterNum == 5)
 | ||
|     {
 | ||
|         //获取颜色
 | ||
|         SQGetInt(v, 5, &Color);
 | ||
|         Type = 1;
 | ||
|         Stroke = 0;
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else if (ParameterNum == 6)
 | ||
|     {
 | ||
|         //获取颜色
 | ||
|         SQGetInt(v, 5, &Color);
 | ||
|         //获取类型
 | ||
|         SQGetInt(v, 6, &Type);
 | ||
|         Stroke = 0;
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else if (ParameterNum == 7)
 | ||
|     {
 | ||
|         //获取颜色
 | ||
|         SQGetInt(v, 5, &Color);
 | ||
|         //获取类型
 | ||
|         SQGetInt(v, 6, &Type);
 | ||
|         //获取描边
 | ||
|         SQGetInt(v, 7, &Stroke);
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|         return 1;
 | ||
|     }
 | ||
| 
 | ||
|     //获取字符串内容
 | ||
|     SQGetString(v, 2, &Str);
 | ||
|     //获取X坐标
 | ||
|     SQGetInt(v, 3, &XPos);
 | ||
|     //获取X坐标
 | ||
|     SQGetInt(v, 4, &YPos);
 | ||
|     //松鼠 Wchar_t  转换为  Unicode
 | ||
|     char* OutPutText = DNFTOOL::SquirrelU2W(Str);
 | ||
|     //转为正确的Unicode字符
 | ||
|     wchar_t* str = DNFTOOL::char2wchar(OutPutText);
 | ||
| 
 | ||
|     //申请笔
 | ||
|     unsigned char* font = new unsigned char[1000];
 | ||
|     //初始化笔
 | ||
|     sub_11BE9A0((DWORD)font, 0);
 | ||
|     sub_11BE980((DWORD)font, 0);
 | ||
|     //是否描边
 | ||
|     font[1] = Stroke;
 | ||
| 
 | ||
|     int FontObj;
 | ||
| 
 | ||
|     switch (Type)
 | ||
|     {
 | ||
|     case 1:
 | ||
|         FontObj = *(int*)0x1B468CC;
 | ||
|         break;
 | ||
|     case 2:
 | ||
|         FontObj = *(int*)0x1B468DC;
 | ||
|         break;
 | ||
|     case 3:
 | ||
|         FontObj = *(int*)0x1B468D4;
 | ||
|         break;
 | ||
|     default:
 | ||
|         FontObj = *(int*)0x1B468CC;
 | ||
|         break;
 | ||
|     }
 | ||
| 
 | ||
|     //字体
 | ||
|     *(int*)((int)font + 8) = FontObj;
 | ||
| 
 | ||
|     //得到绘制句柄
 | ||
|     DWORD base = *(int*)0x1B45B94;
 | ||
|     //设置笔
 | ||
|     sub_1206550(base, 0, (DWORD)font);
 | ||
|     //绘制字体
 | ||
|     NewDrawCodeF(base, 0, XPos, YPos, Color, (int)str);
 | ||
|     //取消笔
 | ||
|     sub_1206570(base, 0);
 | ||
| 
 | ||
| 
 | ||
|     delete[]OutPutText;
 | ||
|     delete[]str;
 | ||
|     delete[]font;
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| #endif 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| typedef int(_Sq_Err)(uint32_t v);
 | ||
| static _Sq_Err* Sq_Err = (_Sq_Err*)0x13542F0;
 | ||
| 
 | ||
| //获取Squirrel v 基址
 | ||
| inline uint32_t GetSqVm()
 | ||
| {
 | ||
|     return *(uint32_t*)0x1AF3544;
 | ||
| }
 | ||
| //注册 Nut API
 | ||
| void squirrel::RegisterNutApi(const wchar_t* funcName, void* funcAddr, uint32_t v = NULL)
 | ||
| {
 | ||
|     if (v == NULL)
 | ||
|         v = GetSqVm();
 | ||
|     SQPushRootTable(v);
 | ||
|     SQPushString(v, funcName, -1);
 | ||
|     RealSqNewClosure(v, funcAddr, 0);
 | ||
|     SQNewSlot(v, -3, false);
 | ||
|     SQPopTop(v);
 | ||
| }
 | ||
| 
 | ||
| void squirrel::R_Register_Nut()
 | ||
| {
 | ||
|     RegisterNutApi(L"L_sq_Test", squirrel::sq_Test);
 | ||
|     RegisterNutApi(L"L_sq_OpenConsole", squirrel::sq_OpenConsole);
 | ||
|     RegisterNutApi(L"L_sq_MoveMap", squirrel::sq_MoveMap);
 | ||
|     RegisterNutApi(L"L_Sq_Err", Sq_Err);
 | ||
| 
 | ||
|     RegisterNutApi(L"L_Sq_GetImg", sq_GetImg);
 | ||
|     RegisterNutApi(L"L_Sq_DrawItem", sq_DrawItem);
 | ||
| 
 | ||
|     RegisterNutApi(L"L_Sq_GetObjectAddress", GetObjectAddress);
 | ||
|     RegisterNutApi(L"L_Sq_GetObjectName", GetObjectName);
 | ||
|     RegisterNutApi(L"L_Sq_GetObjectInfo", GetObjectInfo);
 | ||
|     RegisterNutApi(L"L_Sq_GetObjectDeInfo", GetObjectDeInfo);
 | ||
|     RegisterNutApi(L"L_Sq_SetObjectInfo", SetObjectInfo);
 | ||
|     RegisterNutApi(L"L_Sq_SetObjectDeInfo", SetObjectDeInfo);
 | ||
|     RegisterNutApi(L"L_Sq_GetObjectLevel", GetObjectLevel);
 | ||
| 
 | ||
| 
 | ||
|     RegisterNutApi(L"L_sq_Switching", squirrel::sq_Switching);//换装参数获取
 | ||
| 
 | ||
|     //人物或装备属性 查看 修改 开启
 | ||
| #if defined CHRATRBT_SWITCH
 | ||
|     RegisterNutApi(L"L_sq_GetCharacterAttribute", squirrel::GetCharacterAttribute);//获取人物或装备属性
 | ||
|     RegisterNutApi(L"L_sq_SetCharacterAttribute", squirrel::SetCharacterAttribute);//设置人物或装备属性
 | ||
| #endif
 | ||
| 
 | ||
| #if defined TOWN_SWITCH
 | ||
|     RegisterNutApi(L"L_sq_GetTownIndex", squirrel::GetTownIndex);//获取城镇编号
 | ||
|     RegisterNutApi(L"L_sq_GetRegionIndex", squirrel::GetRegionIndex);//获取区域编号
 | ||
|     RegisterNutApi(L"L_sq_GetTownXpos", squirrel::GetTownXpos);//获取城镇X坐标
 | ||
|     RegisterNutApi(L"L_sq_GetTownYpos", squirrel::GetTownYpos);//获取城镇Y坐标
 | ||
| #endif
 | ||
| 
 | ||
| #if defined CHRINFO_SWITCH
 | ||
|     RegisterNutApi(L"L_sq_GetFatigue", squirrel::GetFatigue);//获取疲劳值
 | ||
|     RegisterNutApi(L"L_sq_GetExp", squirrel::GetExp);//获取经验值
 | ||
| #endif
 | ||
| 
 | ||
| #if defined SEND_PACK_SWITCH
 | ||
|     RegisterNutApi(L"L_sq_SendPackType", squirrel::SendPackType);//发包类型
 | ||
|     RegisterNutApi(L"L_sq_SendPackByte", squirrel::SendPackByte);//包数据Byte
 | ||
|     RegisterNutApi(L"L_sq_SendPackWord", squirrel::SendPackWord);//包数据Word
 | ||
|     RegisterNutApi(L"L_sq_SendPackDWord", squirrel::SendPackDWord);//包数据DWord
 | ||
|     RegisterNutApi(L"L_sq_SendPackWChar", squirrel::SendPackWChar);//包数据DWord
 | ||
|     RegisterNutApi(L"L_sq_SendPack", squirrel::SendPack);//发包
 | ||
| #if defined SEND_API_SWITCH
 | ||
|     RegisterNutApi(L"L_sq_GoDungeon", squirrel::GoDungeon);//去副本
 | ||
|     RegisterNutApi(L"L_sq_GoTown", squirrel::GoTown);//去城镇
 | ||
|     RegisterNutApi(L"L_sq_MoveTown", squirrel::MoveTown);//去城镇
 | ||
| #endif
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| #ifdef DRAW_CODE
 | ||
|     RegisterNutApi(L"L_sq_DrawCode", squirrel::sq_DrawCode);//绘制字符
 | ||
| #endif
 | ||
| 
 | ||
| #if defined DOFILE_API_SWITCH
 | ||
|     RegisterNutApi(L"L_sq_Dofile", squirrel::LDofile);//加密读取
 | ||
| #endif
 | ||
| 
 | ||
| #if defined ADDRESS_API_SWITCH
 | ||
|     RegisterNutApi(L"L_sq_RA", squirrel::LReadAddress);//读内存
 | ||
|     RegisterNutApi(L"L_sq_WA", squirrel::LWriteAddress);//写内存
 | ||
| #endif
 | ||
| 
 | ||
| #if defined LCOUT_API_SWITCH
 | ||
|     RegisterNutApi(L"L_cout", squirrel::Lcout);//输出公告
 | ||
|     RegisterNutApi(L"Sout", squirrel::Sout);//输出
 | ||
| #endif
 | ||
| 
 | ||
| #if defined NEW_WINDOW_API_SWITCH
 | ||
|     RegisterNutApi(L"L_NewWindows", squirrel::NewWindows);//创建窗口
 | ||
|     RegisterNutApi(L"L_Cmd", squirrel::sq_Cmd);//创建窗口
 | ||
| #endif
 | ||
| 
 | ||
| #if defined SET_SLOT_API_SWITCH
 | ||
|     RegisterNutApi(L"L_SetSlot", squirrel::SetSlot);//设置槽坐标
 | ||
| #endif
 | ||
| 
 | ||
|     //普通 STL
 | ||
| #if defined NORMAL_STL
 | ||
|     RegisterNutApi(L"L_New_STL", squirrel::New_STL);//新建容器
 | ||
|     RegisterNutApi(L"L_Set_STL", squirrel::Set_STL);//设置容器
 | ||
|     RegisterNutApi(L"L_Get_STL", squirrel::Get_STL);//获取容器
 | ||
| #endif
 | ||
| 
 | ||
|     //时间 STL
 | ||
| #if defined TIME_STL
 | ||
|     RegisterNutApi(L"L_Timer_STL", squirrel::Timer_STL);//时间容器
 | ||
| #endif
 | ||
| 
 | ||
|     //Json STL
 | ||
| #if defined JSON_STL
 | ||
|     RegisterNutApi(L"L_Json_STL", squirrel::Jsoner_STL);//Json容器
 | ||
| #endif
 | ||
| 
 | ||
|     //字符 STL
 | ||
| #if defined CODE_STL
 | ||
|     RegisterNutApi(L"L_Code_STL", squirrel::Coder_STL);//字符容器
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| #ifdef ITEMRARITY
 | ||
|     RegisterNutApi(L"L_RegisterItemColor_STL", squirrel::RegisterItemColor_STL);//注册Item颜色
 | ||
| #endif
 | ||
| 
 | ||
| 
 | ||
| #ifdef CODEDRAW
 | ||
|     RegisterNutApi(L"L_RegisterCodeDraw_STL", squirrel::RegisterCodeDraw_STL);//注册文字绘制HOOK
 | ||
| #endif
 | ||
| 
 | ||
|     //龙盒
 | ||
| #if defined DRAGONBOX_SWITCH
 | ||
|     //RegisterNutApi(L"L_Get_DragonModel", squirrel::Get_DragonModel);//获取龙盒模式
 | ||
|     //RegisterNutApi(L"L_Set_DragonModel", squirrel::Set_DragonModel);//设置龙盒模式
 | ||
|     //RegisterNutApi(L"L_Redom_Dragon", squirrel::Redom_Dragon);//抽奖
 | ||
|     //RegisterNutApi(L"L_Get_Dragon_Pack", squirrel::Get_Dragon_Pack);//查询龙盒包
 | ||
|     //RegisterNutApi(L"L_Sync_Dragon_Pack", squirrel::Sync_Dragon_Pack);//同步龙盒包
 | ||
| #endif
 | ||
| }
 | ||
| 
 | ||
| //线程循环调用Sqr回调函数
 | ||
| void squirrel::SqrCallBackFunc()
 | ||
| {
 | ||
| #ifndef DOFILE_HOOK
 | ||
| #ifndef SELL
 | ||
|     static int SqrCallBackFuncTimer = clock();
 | ||
|     int NowTime = clock();
 | ||
|     if ((NowTime - SqrCallBackFuncTimer) >= 2000)
 | ||
|     {
 | ||
|         uint32_t v = GetSqVm();
 | ||
|         DWORD Time = clock();
 | ||
|         DWORD VmTop = SQGetTop(v);
 | ||
|         //std::cout << "stack: " << VmTop << std::endl;
 | ||
|         SQPushRootTable(v);
 | ||
|         SQPushString(v, L"Lenheart", -1);
 | ||
|         SQ_Get(v, -2);
 | ||
|         SQPushRootTable(v);
 | ||
|         SQPushInt(v, VmTop);
 | ||
|         SQ_Call(v, 2, 0, 1);
 | ||
|         SQPop(v, 2);
 | ||
| 
 | ||
|         SqrCallBackFuncTimer = NowTime;
 | ||
|     }
 | ||
| #endif // !DOFILE_HOOK
 | ||
| #endif // !DOFILE_HOOK
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void squirrel::InitGameScript()
 | ||
| {
 | ||
|     uint32_t v = GetSqVm();
 | ||
|     //消息框黏贴
 | ||
| #ifdef COPY_MESSAGE
 | ||
|     * (WORD*)0x011C53B0 = 0x01B0;
 | ||
| #endif // COPY_MESSAGE
 | ||
| 
 | ||
|     //重复HOOK
 | ||
| #ifdef RsHook
 | ||
|     auto Registerfunc = reinterpret_cast<register_pack_handler_t>(0x7186D0);
 | ||
|     Registerfunc(130, sock::Pack_Control, 0);
 | ||
| #endif // RsHook
 | ||
| 
 | ||
| 
 | ||
| #ifdef SELL
 | ||
|     SQPushRootTable(v);
 | ||
|     SQPushString(v, L"L_sq_Dofile", -1);
 | ||
|     SQ_Get(v, -2);
 | ||
|     SQPushRootTable(v);
 | ||
|     SQPushString(v, L"licbylist.dll", -1);
 | ||
|     SQ_Call(v, 2, 0, 1);
 | ||
|     SQPop(v, 2);
 | ||
| #else
 | ||
|     SQPushRootTable(v);
 | ||
|     SQPushString(v, L"dofile", -1);
 | ||
|     SQ_Get(v, -2);
 | ||
|     SQPushRootTable(v);
 | ||
|     SQPushString(v, L"sqr/DofileList.nut", -1);
 | ||
|     SQ_Call(v, 2, 0, 1);
 | ||
|     SQPop(v, 2);
 | ||
| #endif 
 | ||
| 
 | ||
| }
 |