#pragma once #include "squirrel.h" #include "sqstdaux.h" #include "sqstdblob.h" #include "sqstdio.h" #include "sqstdmath.h" #include "sqstdstring.h" #include "sqstdsystem.h" #include #include #include template R CallUser(A call_addr, const ARG... arguments) { if (!call_addr) { return R(); } const auto control = reinterpret_cast(call_addr); try { return control(arguments...); } catch (...) { } return R(); } typedef int (*__GetUserByThis)(void *CUser); typedef int (*__GetUserArea)(void *CUser, bool a); typedef int (*__SetUserByInt)(void *CUser, int Value); static SQInteger CUser_GetPosX(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger X = int(((__GetUserByThis)0x0813492c)((void *)P)); sq_pushinteger(v, X); return 1; } static SQInteger CUser_GetPosY(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Y = int(((__GetUserByThis)0x0813493c)((void *)P)); sq_pushinteger(v, Y); return 1; } static SQInteger CUser_Direction(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x0813494c)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_GetVill(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Vill = int(((__GetUserByThis)0x08645564)((void *)P)); sq_pushinteger(v, Vill); return 1; } static SQInteger CUser_GetArea(HSQUIRRELVM v) { SQUserPointer P; SQInteger Type = 0; sq_getuserpointer(v, 2, &P); if (sq_gettop(v) == 3) { sq_getinteger(v, 3, &Type); } SQInteger Area = int(((__GetUserArea)0x086813BE)((void *)P, Type)); sq_pushinteger(v, Area); return 1; } static SQInteger CUser_GetState(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger State = int(((__GetUserByThis)0x080DA38C)((void *)P)); sq_pushinteger(v, State); return 1; } static SQInteger CUser_GetCharacCount(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Count = int(((__GetUserByThis)0x082300E8)((void *)P)); sq_pushinteger(v, Count); return 1; } static SQInteger CUser_GetUniqueId(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger UID = int(((__GetUserByThis)0x080DA37C)((void *)P)); sq_pushinteger(v, UID); return 1; } static SQInteger CUser_GetAccId(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger UID = int(((__GetUserByThis)0x080DA36E)((void *)P)); sq_pushinteger(v, UID); return 1; } static SQInteger CUser_GetCharacNo(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger CID = int(((__GetUserByThis)0x080CBC4E)((void *)P)); sq_pushinteger(v, CID); return 1; } static SQInteger CUser_GetCharacJob(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x080FDF20)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_GetCharacName(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x08101028)((void *)P)); sq_pushstring(v, _SC((char *)Ret), -1); return 1; } static SQInteger CUser_GetCharacLevel(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x080DA2B8)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_SetCharacLevel(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Value; sq_getinteger(v, 3, &Value); char *a = new char[4]; CallUser(0x822FC8E, a, P, Value); return 0; } static SQInteger CUser_GetCharacGrowType(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x0815741C)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_GetCharacSecondGrowType(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x0822F23C)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_GetFatigue(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x08657766)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_GetMaxFatigue(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x08657804)((void *)P)); sq_pushinteger(v, Ret); return 1; } typedef int (*__CUser_DisConnSig)(void *CUser, int type, int is, int err); static SQInteger CUser_DisConnSig(HSQUIRRELVM v) { SQUserPointer P; SQInteger Src; SQInteger P2; SQInteger P3; sq_getuserpointer(v, 2, &P); sq_getinteger(v, 3, &Src); sq_getinteger(v, 4, &P2); sq_getinteger(v, 5, &P3); SQInteger Ret = int(((__CUser_DisConnSig)0x086489F4)((void *)P, Src, P2, P3)); sq_pushinteger(v, Ret); return 1; } typedef void *(*__GetUserParty)(void *CUser); static SQInteger CUser_GetParty(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQUserPointer Ret = (((__GetUserParty)0x0865514C)((void *)P)); sq_pushuserpointer(v, Ret); return 1; } static SQInteger CUser_CheckInBossTower(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x082a67e2)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_CheckInBlueMarble(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x080da32a)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_IsGmMode(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x0814589c)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_GetVisibleValues(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x0868BDE4)((void *)P)); sq_pushinteger(v, Ret); return 1; } static SQInteger CUser_GetCurCharacLastPlayTick(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Ret = int(((__GetUserByThis)0x082A66AA)((void *)P)); sq_pushinteger(v, Ret); return 1; } typedef int (*__GiveUserItem)(void *CUser, int a2, int a3, int a4, int *a5, int a6); typedef int (*__UserSendUpdateItemList)(void *CUser, int a2, int a3, int a4); static SQInteger CUser_GiveUserItem(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger ItemId, ItemCount; sq_getinteger(v, 3, &ItemId); sq_getinteger(v, 4, &ItemCount); int *ItemSpace = (int *)malloc(4); int Slot = int(((__GiveUserItem)0x0867B6D4)((void *)P, ItemId, ItemCount, 6, ItemSpace, 0)); if (Slot >= 0) { sq_newarray(v, 0); sq_pushinteger(v, *ItemSpace); sq_arrayappend(v, -2); sq_pushinteger(v, Slot); sq_arrayappend(v, -2); } else sq_pushnull(v); return 1; } // 通知客户端更新道具信息 static SQInteger CUser_SendUpdateItemList(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Type, ItemSpace, Slot; sq_getinteger(v, 3, &Type); sq_getinteger(v, 4, &ItemSpace); sq_getinteger(v, 5, &Slot); CallUser(0x867C65A, P, Type, ItemSpace, Slot); return 0; } // 通知客户端更新背包栏 static SQInteger CUser_SendItemSpace(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger itemSpace; sq_getinteger(v, 3, &itemSpace); // std::cout << *(int *)P << std::endl; CallUser(0x865DB6C, P, itemSpace); return 0; } // 发送邮件 static SQInteger CUser_SendMail(HSQUIRRELVM v) { SQInteger Cid; sq_getinteger(v, 2, &Cid); std::vector> List; List.clear(); int ItemListLen = 0; sq_pushnull(v); // null iterator while (SQ_SUCCEEDED(sq_next(v, 3))) { SQInteger Index, Count; sq_getinteger(v, -1, &Count); sq_getinteger(v, -2, &Index); std::pair pair1 = std::make_pair(Index, Count); List.push_back(pair1); // 这里-1是值,-2是键 sq_pop(v, 2); // 在下一次迭代之前弹出键和值 ItemListLen++; } sq_pop(v, 1); void *addition_slots = malloc(1000); for (int i = 0; i < 10; i++) { CallUser(0x80CB854, addition_slots + (i * 61)); } CallUser(0x8556A14, List, addition_slots, 10); SQInteger Gold; sq_getinteger(v, 4, &Gold); const SQChar *Title; const SQChar *Text; sq_getstring(v, 5, &Title); sq_getstring(v, 6, &Text); int TextLen = strlen(Text); CallUser(0x8556B68, Title, addition_slots, ItemListLen, Gold, Cid, Text, TextLen, 0, 99, 1); return 0; } // 发送邮件 static SQInteger CUser_ChangeGrowType(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Base, Ex; sq_getinteger(v, 3, &Base); sq_getinteger(v, 4, &Ex); CallUser(0x867B048, P, Base, Ex); return 0; } // 发送消息包 static SQInteger CUser_SendNotiPacket(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Type1, Type2, Type3; sq_getinteger(v, 3, &Type1); sq_getinteger(v, 4, &Type2); sq_getinteger(v, 5, &Type3); CallUser(0x867BA5C, P, Type1, Type2, Type3); return 0; } // 获取技能树 static SQInteger CUser_GetSkillW(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); void *S = CallUser(0x822F140, P); sq_pushuserpointer(v, S); return 1; } // 重置技能 static SQInteger CUser_InitSkillW(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger GrowType, IsAwa; sq_getinteger(v, 3, &GrowType); sq_getinteger(v, 4, &IsAwa); CallUser(0x8608120, P, GrowType, IsAwa); return 0; } // 改变GM完成任务模式 static SQInteger CUser_ChangeGmQuestFlag(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Type; sq_getinteger(v, 3, &Type); CallUser(0x822FC8E, P, Type); return 0; } // 任务相关操作 static SQInteger CUser_QuestAction(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); SQInteger Type, QuestId, Reward, Flag; sq_getinteger(v, 3, &Type); sq_getinteger(v, 4, &QuestId); sq_getinteger(v, 5, &Reward); sq_getinteger(v, 6, &Flag); CallUser(0x0866DA8A, P, Type, QuestId, Reward, Flag); return 0; } // 刷新上次任务完成时间 static SQInteger CUser_RefreshLastQuestTime(HSQUIRRELVM v) { SQUserPointer P; sq_getuserpointer(v, 2, &P); *(int *)((void *)P + 0x79644) = 0; return 0; } // 充值点券 static SQInteger CUser_RechargeCoupons(HSQUIRRELVM v) { SQUserPointer User; sq_getuserpointer(v, 2, &User); SQInteger Amount; sq_getinteger(v, 3, &Amount); CallUser(0x80FFCA4, *(uintptr_t *)0x941F734, User, 5, Amount, (void *)0x8C7FA20, (void *)0x8C7FA20, "Gm", (void *)0, (void *)0, (void *)0); CallUser(0x8100790, *(uintptr_t *)0x941F734, User); return 0; } // 充值代币券 static SQInteger CUser_RechargeCouponsPoint(HSQUIRRELVM v) { SQUserPointer User; sq_getuserpointer(v, 2, &User); SQInteger Amount; sq_getinteger(v, 3, &Amount); CallUser(0x80FFFC0, *(uintptr_t *)0x941F734, User, Amount, 4, (void *)0, (void *)0); CallUser(0x8100790, *(uintptr_t *)0x941F734, User); return 0; } // 充值金币 static SQInteger CUser_RechargeMoney(HSQUIRRELVM v) { SQUserPointer User; sq_getuserpointer(v, 2, &User); SQInteger Amount; sq_getinteger(v, 3, &Amount); CallUser(0x84FF29C, User, Amount, 0, 0, 0); return 0; } static SQInteger register_User_func(HSQUIRRELVM v, SQFUNCTION f, const char *fname) { sq_pushroottable(v); sq_pushstring(v, fname, -1); sq_newclosure(v, f, 0); // create a new function sq_newslot(v, -3, SQFalse); sq_pop(v, 1); // pops the root table } static void RegisterUser(HSQUIRRELVM v) { // 获取X坐标 register_User_func(v, CUser_GetPosX, "Sq_CUser_GetPosX"); // 获取Y坐标 register_User_func(v, CUser_GetPosY, "Sq_CUser_GetPosY"); // 获取朝向 register_User_func(v, CUser_Direction, "Sq_CUser_Direction"); // 获取城镇编号 register_User_func(v, CUser_GetVill, "Sq_CUser_GetTownIndex"); // 获取区域编号 register_User_func(v, CUser_GetArea, "Sq_CUser_GetAreaIndex"); // 获取账号状态 register_User_func(v, CUser_GetState, "Sq_CUser_GetState"); // 获取角色数量 register_User_func(v, CUser_GetCharacCount, "Sq_CUser_GetCharacCount"); // 获取UID register_User_func(v, CUser_GetAccId, "Sq_CUser_GetAccId"); // 获取UniqueId register_User_func(v, CUser_GetUniqueId, "Sq_CUser_GetUniqueId"); // 获取CID register_User_func(v, CUser_GetCharacNo, "Sq_CUser_GetCharacNo"); // 获取角色职业 register_User_func(v, CUser_GetCharacJob, "Sq_CUser_GetCharacJob"); // 获取角色名称 register_User_func(v, CUser_GetCharacName, "Sq_CUser_GetCharacName"); // 获取角色等级 register_User_func(v, CUser_GetCharacLevel, "Sq_CUser_GetCharacLevel"); // 设置角色等级 register_User_func(v, CUser_SetCharacLevel, "Sq_CUser_SetCharacLevel"); // 获取角色转职职业 register_User_func(v, CUser_GetCharacGrowType, "Sq_CUser_GetCharacGrowType"); // 获取角色觉醒职业 register_User_func(v, CUser_GetCharacSecondGrowType, "Sq_CUser_GetCharacSecondGrowType"); // 获取已用疲劳值 register_User_func(v, CUser_GetFatigue, "Sq_CUser_GetFatigue"); // 获取最大疲劳值 register_User_func(v, CUser_GetMaxFatigue, "Sq_CUser_GetMaxFatigue"); // 踢人 register_User_func(v, CUser_DisConnSig, "Sq_CUser_DisConnSig"); // 获取当前小队/副本 register_User_func(v, CUser_GetParty, "Sq_CUser_GetParty"); // 获是否在领主塔 register_User_func(v, CUser_CheckInBossTower, "Sq_CUser_CheckInBossTower"); // 获取是否在龙之路 register_User_func(v, CUser_CheckInBlueMarble, "Sq_CUser_CheckInBlueMarble"); // 是否开启GM权限 register_User_func(v, CUser_IsGmMode, "Sq_CUser_IsGmMode"); // 获取可见Values register_User_func(v, CUser_GetVisibleValues, "Sq_CUser_GetVisibleValues"); // 获取账号上次退出游戏的时间 register_User_func(v, CUser_GetCurCharacLastPlayTick, "Sq_CUser_GetCurCharacLastPlayTick"); // 发送道具 register_User_func(v, CUser_GiveUserItem, "Sq_CUser_GiveUserItem"); // 通知客户端更新背包 register_User_func(v, CUser_SendItemSpace, "Sq_CUser_SendItemSpace"); // 通知客户端道具更新 register_User_func(v, CUser_SendUpdateItemList, "Sq_CUser_SendUpdateItemList"); // 发送GM邮件 register_User_func(v, CUser_SendMail, "Sq_CUser_SendMail"); // 更改职业 register_User_func(v, CUser_ChangeGrowType, "Sq_CUser_ChangeGrowType"); // 发送消息包 register_User_func(v, CUser_SendNotiPacket, "Sq_CUser_SendNotiPacket"); // 获取技能树 register_User_func(v, CUser_GetSkillW, "Sq_CUser_GetSkillW"); // 重置技能树 register_User_func(v, CUser_InitSkillW, "Sq_CUser_InitSkillW"); // 改变GM完成任务模式 register_User_func(v, CUser_ChangeGmQuestFlag, "Sq_CUser_ChangeGmQuestFlag"); // 任务相关操作 register_User_func(v, CUser_QuestAction, "Sq_CUser_QuestAction"); // 刷新上次任务完成时间 register_User_func(v, CUser_RefreshLastQuestTime, "Sq_CUser_RefreshLastQuestTime"); // 充值点券 register_User_func(v, CUser_RechargeCoupons, "Sq_CUser_RechargeCoupons"); // 充值代币券 register_User_func(v, CUser_RechargeCouponsPoint, "Sq_CUser_RechargeCouponsPoint"); // 充值金币 register_User_func(v, CUser_RechargeMoney, "Sq_CUser_RechargeMoney"); }