DNF_DLL/test/squirrel.cpp

1091 lines
26 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"
#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
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;
}
//发包
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;
}
//查询 类型容器
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;
}
//时间容器线程
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)
{
Time_STL[pack->Name].Now_Time = N_Time;
}
else
{
break;
}
}
}
//时间容器
int squirrel::Timer_STL(uint32_t v)
{
char* Name;
int MaxTime;
int Type;
int ParameterNum = SQGetTop(v);
if (ParameterNum == 4)
{
//获取容器名字
SQGetStringc(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;
}
//同步 龙盒数据包
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;
}
//获取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", squirrel::sq_Test);
RegisterNutApi(L"L_sq_GetCharacterAttribute", squirrel::GetCharacterAttribute);//获取人物或装备属性
RegisterNutApi(L"L_sq_SetCharacterAttribute", squirrel::SetCharacterAttribute);//设置人物或装备属性
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坐标
RegisterNutApi(L"L_sq_GetFatigue", squirrel::GetFatigue);//获取疲劳值
RegisterNutApi(L"L_sq_GetExp", squirrel::GetExp);//获取经验值
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_SendPack", squirrel::SendPack);//发包
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);//去城镇
RegisterNutApi(L"L_sq_Dofile", squirrel::LDofile);//加密读取
RegisterNutApi(L"L_cout", squirrel::Lcout);//输出公告
RegisterNutApi(L"L_NewWindows", squirrel::NewWindows);//创建窗口
RegisterNutApi(L"L_SetSlot", squirrel::SetSlot);//设置槽坐标
RegisterNutApi(L"L_New_STL", squirrel::New_STL);//新建容器
RegisterNutApi(L"L_Set_STL", squirrel::Set_STL);//设置容器
RegisterNutApi(L"L_Get_STL", squirrel::Get_STL);//获取容器
RegisterNutApi(L"L_Timer_STL", squirrel::Timer_STL);//时间容器
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);//同步龙盒包
}