DNF_DLL/test/squirrel.cpp

1971 lines
45 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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<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;
}
//设置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::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;
}
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<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 = 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
}