#include "pch.h" #include "squirrel.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::GetObjectLevel(uint32_t v) { int objAddress = GetSqrObject(v, 2); int Level = DNFTOOL::DNFDeCode(objAddress + 0x1A4C); SQPushInt(v, Level); return 1; } //Test //窗口CALL typedef void(__fastcall* 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; } int squirrel::sq_Test(uint32_t v) { 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 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; } //设置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 //普通 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::mapTime_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 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::mapJson_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 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; } if (Vbuffer.IsInt()) { SQPushInt(v, Vbuffer.GetInt()); return 1; } if (Vbuffer.IsFloat()) { SQPushFloat(v, Vbuffer.GetFloat()); 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 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 = 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_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_GetObjectLevel", GetObjectLevel); //人物或装备属性 查看 修改 开启 #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);//创建窗口 #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 //龙盒 #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() { 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; } } void squirrel::InitGameScript() { uint32_t v = GetSqVm(); //消息框黏贴 #ifdef COPY_MESSAGE * (WORD*)0x011C53B0 = 0x01B0; #endif // COPY_MESSAGE #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 }