#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* char* fname = DNFTOOL::wchar_tTochar((wchar_t*)filename); 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 + 256); //读文件,每次读一个,共读size次 fread(ar, 1, size, file); ar[size] = '\0'; int skey[] = Skey;//定义解密数组 Cutecode(ar, skey);//解密 fclose(file);//关闭文件 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) { 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 int squirrel::sq_Test(uint32_t v) { //GMNotice((char*)u"我的天"); //WindowsNotice((char*)u"我的天"); //SQPopTop(v); //SQPushInt(v, 1); 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 (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; } //写人物 或 装备属性 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 (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; } } 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; } } return 1; } //发包类型 int squirrel::SendPackType(uint32_t v) { int n1; SQGetInt(v, 2, &n1); _SendpacksType(*_SendClass, 0, n1); SQPushInt(v, 1); return 1; } //发包Byte int squirrel::SendPackByte(uint32_t v) { int n1; SQGetInt(v, 2, &n1); _SendPacksByte(*_SendClass, 0, n1); SQPushInt(v, 1); return 1; } //发包Word int squirrel::SendPackWord(uint32_t v) { int n1; SQGetInt(v, 2, &n1); _SendPacksWord(*_SendClass, 0, n1); SQPushInt(v, 1); return 1; } //发包DWord int squirrel::SendPackDWord(uint32_t v) { int n1; SQGetInt(v, 2, &n1); _SendPacksDWord(*_SendClass, 0, n1); SQPushInt(v, 1); return 1; } //发包wchar_t* (转了char*) int squirrel::SendPackWChar(uint32_t v) { wchar_t* n1; SQGetString(v, 2, &n1); //wchar_t* 转 char* char* fname = DNFTOOL::wchar_tTochar(n1); _SendPacksChar(*_SendClass, 0, fname, strlen(fname)); SQPushInt(v, 1); return 1; } //发包 int squirrel::SendPack(uint32_t v) { _SendPacks(); SQPushInt(v, 1); return 1; } //发物品给玩家 int squirrel::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; } //发装备给玩家 int squirrel::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; } //去副本 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; } //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; } SQPopTop(v); DNFTOOL::WindowsNotice(str, type, color); SQPushBool(v, true); } else { SQPushBool(v, false); } 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; } //普通 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 //时间容器线程 void TimeSTL(LPVOID lpParam) { TimeSTLStruct *pack = (TimeSTLStruct*)lpParam;//得到传递的包 Time_STL[pack->Name].Static_Time = (int)GetTickCount64();//设置时间容器的基准时间 while (true)//线程循环 { int N_Time = (int)GetTickCount64() - Time_STL[pack->Name].Static_Time;//得到现在的时间 if (N_Time < Time_STL[pack->Name].Max_Time)//如果还没到 设定新的now时间 { Time_STL[pack->Name].Now_Time = N_Time; } else//如果到了 设定now同步最大时间 { Time_STL[pack->Name].Now_Time = Time_STL[pack->Name].Max_Time; break; } } } //时间容器 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) != 0)//如果这个标识容器存在 就返回 否则创建 { SQPushBool(v, false); return 1; } TimeSTLStruct pack;//定义结构体 pack.Name = Name;//设置容器标识名称 pack.Max_Time = MaxTime;//设置 标识时间容器最大时间 pack.Now_Time = 0;//设置 标识时间容器当前时间 pack.Static_Time = 0;//设置 基础时间(用于运算) pack.Thand = NULL;//设置句柄为空 Time_STL[Name] = pack;//设置包给标识时间容器 break; } case 1: {//启动时间容器 if (Time_STL[Name].Thand == NULL)//只有句柄为空的时候new线程 { DWORD threadID;//线程ID Time_STL[Name].Now_Time = 0;//设置当前容器时间 Time_STL[Name].Thand = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TimeSTL, &Time_STL[Name], 0, &threadID);//创建一个新线程 开始计算时间 并把线程赋予给容器 } break; } case 2://获取时间容器 SQPushInt(v, Time_STL[Name].Now_Time);//返回当前容器时间 return 1; break; case 3://重置时间容器 SuspendThread(Time_STL[Name].Thand);//挂起线程 Time_STL[Name].Static_Time = 0;//基准时间设置为0 Time_STL[Name].Thand = NULL; ResumeThread(Time_STL[Name].Thand);//启动线程 break; case 4://暂停时间容器 SuspendThread(Time_STL[Name].Thand);//挂起线程 break; case 5://继续时间容器 Time_STL[Name].Static_Time = (int)GetTickCount64() - Time_STL[Name].Now_Time;//当前时间 减去容器时间 ResumeThread(Time_STL[Name].Thand);//启动线程 break; case 6://销毁时间容器 CloseHandle(Time_STL[Name].Thand);//销毁线程 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 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 #if defined JSON_STL //构造Json类型容器 static std::mapJson_STL; //Json容器 int squirrel::Jsoner_STL(uint32_t v) { wchar_t* Name; int Type; int ParameterNum = SQGetTop(v); if (ParameterNum == 3) { //获取容器名字 SQGetString(v, 2, &Name); //获取模式 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 return 1; break; } } SQPushBool(v, true); } else if (ParameterNum == 4) { //获取容器名字 SQGetString(v, 2, &Name); //获取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)); break; } default: break; } if (Dom[key].IsNull()) { Dom.AddMember(rapidjson::StringRef(key), BB, Dom.GetAllocator()); } rapidjson::StringBuffer jsonBuffer; rapidjson::Writer writer(jsonBuffer); Dom.Accept(writer); Json_STL[Name] = jsonBuffer.GetString(); //delete[] key; SQPushBool(v, true); } else { SQPushBool(v, false); } return 1; } #endif //获取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); //人物或装备属性 查看 修改 开启 #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_GivePlayerItem", squirrel::GivePlayerItem);//给用户物品 RegisterNutApi(L"L_sq_GivePlayerEqu", squirrel::GivePlayerEqu);//给用户装备 RegisterNutApi(L"L_sq_GoDungeon", squirrel::GoDungeon);//去副本 RegisterNutApi(L"L_sq_GoTown", squirrel::GoTown);//去城镇 RegisterNutApi(L"L_sq_MoveTown", squirrel::MoveTown);//去城镇 #endif #endif #if defined DOFILE_API_SWITCH RegisterNutApi(L"L_sq_Dofile", squirrel::LDofile);//加密读取 #endif #if defined LCOUT_API_SWITCH RegisterNutApi(L"L_cout", squirrel::Lcout);//输出公告 #endif #if defined NEW_WINDOW_API_SWITCH RegisterNutApi(L"L_NewWindows", squirrel::NewWindows);//创建窗口 #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);//时间容器 #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 }