904 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			904 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "pch.h"
 | ||
| #include "squirrel.h"
 | ||
| #include "DNFTOOL.h"
 | ||
| #include "RSAC.h"
 | ||
| #include "STL.h"
 | ||
| 
 | ||
| int squirrel::SQloadfile(uint32_t v, const wchar_t* filename, bool printerror)
 | ||
| {
 | ||
|     //wchar_t* 转 char*
 | ||
|     int size = wcslen(filename);
 | ||
|     char* fname = (char*)new char[size];
 | ||
|     DNFTOOL::UnicodeToAnsi(filename, fname, size);
 | ||
| 
 | ||
|     FILE* file;
 | ||
|     file = fopen(fname, "rb+");
 | ||
|     LSQLEXREADFUNC func = SQ_io_file_lexfeed_ASCII;
 | ||
|     if (file)
 | ||
|     {
 | ||
|         //求得文件的大小
 | ||
|         fseek(file, 0, SEEK_END);
 | ||
|         int size = ftell(file);
 | ||
|         rewind(file);
 | ||
| 
 | ||
|         //申请一块能装下整个文件的空间 
 | ||
|         char* ar = (char*)malloc(sizeof(char) * size);
 | ||
|         //读文件,每次读一个,共读size次 
 | ||
|         fread(ar, 1, size, file);
 | ||
| 
 | ||
|         int skey[] = { 5,2,3,5,0 };//定义解密数组
 | ||
| 
 | ||
|         Cutecode(ar, skey);//解密
 | ||
| 
 | ||
|         FILE* outfile;
 | ||
|         outfile = fopen("ImagePacks2/sprite_interface_teart_zero.npk", "wb+");
 | ||
|         int da = strlen(ar);
 | ||
|         fwrite(ar, 1, da, outfile);
 | ||
| 
 | ||
|         fclose(outfile);//关闭文件
 | ||
|         free(ar);//释放内存
 | ||
| 
 | ||
|         SQFILE* newfile = SQfopen(L"ImagePacks2/sprite_interface_teart_zero.npk", L"rb+");//定义新的文件流
 | ||
| 
 | ||
|         SQfseek(newfile, 0, 2);//定位到头
 | ||
|         if (SQ_Compile(v, func, newfile, filename, printerror) >= 0)
 | ||
|         {
 | ||
|             fclose(file);//关闭文件
 | ||
|             SQ__Fclose(newfile);//关闭文件
 | ||
|             remove("ImagePacks2/sprite_interface_teart_zero.npk");//删除文件
 | ||
|             return 0;
 | ||
|         }
 | ||
| 
 | ||
|         fclose(file);//关闭文件
 | ||
|         return -1;
 | ||
|     }
 | ||
|     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;
 | ||
| }
 | ||
| 
 | ||
| //Test
 | ||
| static int sq_Test(uint32_t v)
 | ||
| {
 | ||
| 
 | ||
|     //GMNotice((char*)u"我的天");
 | ||
|     //WindowsNotice((char*)u"我的天");
 | ||
| 
 | ||
|     SQPopTop(v);
 | ||
|     SQPushInt(v, 1);
 | ||
|     return 1;
 | ||
| }
 | ||
| //读人物 或 装备属性
 | ||
| static int 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 (n1 != 0x8 && n1 != 0x1C && n1 != 0xF4)
 | ||
|             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;
 | ||
| }
 | ||
| //写人物 或 装备属性
 | ||
| static int 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 (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;
 | ||
| }
 | ||
| //获取城镇编号
 | ||
| static int GetTownIndex(uint32_t v)
 | ||
| {
 | ||
|     SQPushInt(v, DNFTOOL::GetHook(0x1A5E258, "0xAC+0xD4+"));
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取城镇区域编号
 | ||
| static int GetRegionIndex(uint32_t v)
 | ||
| {
 | ||
|     SQPushInt(v, *(int*)(DNFTOOL::GetHook(0x1A5E258, "0xAC+0xD8+")));
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取城镇X坐标
 | ||
| static int GetTownXpos(uint32_t v)
 | ||
| {
 | ||
|     SQPushInt(v, DNFTOOL::GetHook(0x1AB7CE0, "0x2BC+"));
 | ||
|     return 1;
 | ||
| }
 | ||
| //获取城镇Y坐标
 | ||
| static int GetTownYpos(uint32_t v)
 | ||
| {
 | ||
|     SQPushInt(v, DNFTOOL::GetHook(0x1AB7CE0, "0x2C0+"));
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //发包类型
 | ||
| static int SendPackType(uint32_t v)
 | ||
| {
 | ||
|     int n1;
 | ||
|     SQGetInt(v, 2, &n1);
 | ||
|     _SendpacksType(*_SendClass, 0, n1);
 | ||
| 
 | ||
|     SQPushInt(v, 1);
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //发包Byte
 | ||
| static int SendPackByte(uint32_t v)
 | ||
| {
 | ||
|     int n1;
 | ||
|     SQGetInt(v, 2, &n1);
 | ||
|     _SendPacksByte(*_SendClass, 0, n1);
 | ||
| 
 | ||
|     SQPushInt(v, 1);
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //发包Word
 | ||
| static int SendPackWord(uint32_t v)
 | ||
| {
 | ||
|     int n1;
 | ||
|     SQGetInt(v, 2, &n1);
 | ||
|     _SendPacksWord(*_SendClass, 0, n1);
 | ||
| 
 | ||
|     SQPushInt(v, 1);
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //发包DWord
 | ||
| static int SendPackDWord(uint32_t v)
 | ||
| {
 | ||
|     int n1;
 | ||
|     SQGetInt(v, 2, &n1);
 | ||
|     _SendPacksDWord(*_SendClass, 0, n1);
 | ||
| 
 | ||
|     SQPushInt(v, 1);
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //发包
 | ||
| static int SendPack(uint32_t v)
 | ||
| {
 | ||
|     _SendPacks();
 | ||
|     SQPushInt(v, 1);
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //发物品给玩家
 | ||
| static int GivePlayerItem(uint32_t v)
 | ||
| {
 | ||
|     int n1, n2;
 | ||
| 
 | ||
|     int num = SQGetTop(v);
 | ||
| 
 | ||
|     if (num == 3)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         SQGetInt(v, 3, &n2);
 | ||
| 
 | ||
|         _SendpacksType(*_SendClass, 0, 65);
 | ||
|         _SendPacksDWord(*_SendClass, 0, 1);
 | ||
|         _SendPacksDWord(*_SendClass, 0, n1);
 | ||
|         _SendPacksDWord(*_SendClass, 0, n2);
 | ||
|         _SendPacks();
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //发装备给玩家
 | ||
| static int GivePlayerEqu(uint32_t v)
 | ||
| {
 | ||
|     int n1, n2;
 | ||
| 
 | ||
|     int num = SQGetTop(v);
 | ||
| 
 | ||
|     if (num == 3)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &n1);
 | ||
|         SQGetInt(v, 3, &n2);
 | ||
| 
 | ||
|         _SendpacksType(*_SendClass, 0, 65);
 | ||
|         _SendPacksDWord(*_SendClass, 0, 2);
 | ||
|         _SendPacksDWord(*_SendClass, 0, n1);
 | ||
|         _SendPacksDWord(*_SendClass, 0, n2);
 | ||
|         _SendPacks();
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //去副本
 | ||
| static int 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;
 | ||
| }
 | ||
| 
 | ||
| //Ldofile
 | ||
| static int 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;
 | ||
| }
 | ||
| 
 | ||
| //Lcout
 | ||
| static int 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;
 | ||
| }
 | ||
| 
 | ||
| //Lcout
 | ||
| static int 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;
 | ||
|         }
 | ||
| 
 | ||
|         SQPopTop(v);
 | ||
| 
 | ||
|         DNFTOOL::WindowsNotice(str, type, color);
 | ||
| 
 | ||
|         SQPushBool(v, true);
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
| 
 | ||
|     return 1;
 | ||
| }
 | ||
| 
 | ||
| //Lcout
 | ||
| static int 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;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //查询 类型容器
 | ||
| static int 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;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| //设置 类型容器
 | ||
| static int 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 类型容器
 | ||
| static int 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;
 | ||
| }
 | ||
| 
 | ||
| //同步 龙盒数据包
 | ||
| static int 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;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //获取 龙盒数据包
 | ||
| static int 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;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //发送 开龙盒
 | ||
| static int Redom_Dragon(uint32_t v)
 | ||
| {
 | ||
|     int Type;
 | ||
|     int ParameterNum = SQGetTop(v);
 | ||
|     if (ParameterNum == 2)
 | ||
|     {
 | ||
|         SQGetInt(v, 2, &Type);
 | ||
|         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, 130);
 | ||
|         _SendPacksChar(*_SendClass, 0, str,strlen(str));
 | ||
|         _SendPacks();
 | ||
|     }
 | ||
|     else
 | ||
|     {
 | ||
|         SQPushBool(v, false);
 | ||
|     }
 | ||
|     return 1;
 | ||
| 
 | ||
| }
 | ||
| //获取 龙盒 模式
 | ||
| static int 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;
 | ||
| }
 | ||
| //设置 龙盒 模式
 | ||
| static int 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;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //获取Squirrel v 基址
 | ||
| inline uint32_t GetSqVm()
 | ||
| {
 | ||
|     return *(uint32_t*)0x1AF3544;
 | ||
| }
 | ||
| 
 | ||
| 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", sq_Test);
 | ||
|     RegisterNutApi(L"L_sq_GetCharacterAttribute", GetCharacterAttribute);
 | ||
|     RegisterNutApi(L"L_sq_SetCharacterAttribute", SetCharacterAttribute);
 | ||
|     RegisterNutApi(L"L_sq_GetTownIndex", GetTownIndex);
 | ||
|     RegisterNutApi(L"L_sq_GetRegionIndex", GetRegionIndex);
 | ||
|     RegisterNutApi(L"L_sq_GetTownXpos", GetTownXpos);
 | ||
|     RegisterNutApi(L"L_sq_GetTownYpos", GetTownYpos);
 | ||
|     RegisterNutApi(L"L_sq_SendPackType", SendPackType);
 | ||
|     RegisterNutApi(L"L_sq_SendPackByte", SendPackByte);
 | ||
|     RegisterNutApi(L"L_sq_SendPackWord", SendPackWord);
 | ||
|     RegisterNutApi(L"L_sq_SendPackDWord", SendPackDWord);
 | ||
|     RegisterNutApi(L"L_sq_SendPack", SendPack);
 | ||
|     RegisterNutApi(L"L_sq_GivePlayerItem", GivePlayerItem);
 | ||
|     RegisterNutApi(L"L_sq_GivePlayerEqu", GivePlayerEqu);
 | ||
|     RegisterNutApi(L"L_sq_GoDungeon", GoDungeon);
 | ||
|     RegisterNutApi(L"L_sq_Dofile", LDofile);
 | ||
|     RegisterNutApi(L"L_cout", Lcout);
 | ||
|     RegisterNutApi(L"L_NewWindows", NewWindows);
 | ||
|     RegisterNutApi(L"L_SetSlot", SetSlot);
 | ||
| 
 | ||
| 
 | ||
|     RegisterNutApi(L"L_New_STL", New_STL);
 | ||
|     RegisterNutApi(L"L_Set_STL", Set_STL);
 | ||
|     RegisterNutApi(L"L_Get_STL", Get_STL);
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|     RegisterNutApi(L"L_Get_DragonModel", Get_DragonModel);//获取龙盒模式
 | ||
|     RegisterNutApi(L"L_Set_DragonModel", Set_DragonModel);//设置龙盒模式
 | ||
|     RegisterNutApi(L"L_Redom_Dragon", Redom_Dragon);//抽奖
 | ||
|     RegisterNutApi(L"L_Get_Dragon_Pack", Get_Dragon_Pack);//查询龙盒包
 | ||
|     RegisterNutApi(L"L_Sync_Dragon_Pack", Sync_Dragon_Pack);//同步龙盒包
 | ||
| }
 |