177 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			177 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | #pragma once
 | ||
|  | #include "squirrel.h"
 | ||
|  | #include "sqstdaux.h"
 | ||
|  | #include "sqstdblob.h"
 | ||
|  | #include "sqstdio.h"
 | ||
|  | #include "sqstdmath.h"
 | ||
|  | #include "sqstdstring.h"
 | ||
|  | #include "sqstdsystem.h"
 | ||
|  | #include <iostream>
 | ||
|  | #include <map>
 | ||
|  | 
 | ||
|  | typedef void *(*__G_GameWorld)(); | ||
|  | static SQInteger Get_GameWorld(HSQUIRRELVM v) | ||
|  | { | ||
|  |     void *World = ((__G_GameWorld)0x080DA3A7)(); | ||
|  |     sq_pushuserpointer(v, World); | ||
|  |     return 1; | ||
|  | } | ||
|  | typedef int (*__GetSessionByUid)(void *World, int Uid); | ||
|  | static SQInteger GameWorld_GetSessionByUid(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer P; | ||
|  |     sq_getuserpointer(v, 2, &P); | ||
|  |     SQInteger Uid; | ||
|  |     sq_getinteger(v, 3, &Uid); | ||
|  | 
 | ||
|  |     SQInteger Session = ((__GetSessionByUid)0x086C4C24)((void *)P, Uid); | ||
|  |     sq_pushinteger(v, Session); | ||
|  |     return 1; | ||
|  | } | ||
|  | typedef void *(*__GetUserBySession)(void *World, int Session); | ||
|  | static SQInteger GameWorld_GetUserBySession(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer P; | ||
|  |     sq_getuserpointer(v, 2, &P); | ||
|  |     SQInteger Session; | ||
|  |     sq_getinteger(v, 3, &Session); | ||
|  | 
 | ||
|  |     void *User = ((__GetUserBySession)0x086C4B9C)((void *)P, Session); | ||
|  |     sq_pushuserpointer(v, User); | ||
|  |     return 1; | ||
|  | } | ||
|  | typedef void *(*__GetUserByUid)(void *World, int Uid); | ||
|  | static SQInteger GameWorld_GetUserByUid(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer P; | ||
|  |     sq_getuserpointer(v, 2, &P); | ||
|  |     SQInteger Uid; | ||
|  |     sq_getinteger(v, 3, &Uid); | ||
|  | 
 | ||
|  |     void *User = ((__GetUserByUid)0x086C4D40)((void *)P, Uid); | ||
|  |     sq_pushuserpointer(v, User); | ||
|  |     return 1; | ||
|  | } | ||
|  | typedef void *(*__GetUserByName)(void *World, char *Name); | ||
|  | static SQInteger GameWorld_GetUserByName(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer P; | ||
|  |     sq_getuserpointer(v, 2, &P); | ||
|  |     const SQChar *Name; | ||
|  |     sq_getstring(v, 3, &Name); | ||
|  | 
 | ||
|  |     void *User = ((__GetUserByName)0x086C9464)((void *)P, (char *)Name); | ||
|  |     sq_pushuserpointer(v, User); | ||
|  |     return 1; | ||
|  | } | ||
|  | typedef int (*__GetUserCount)(void *World); | ||
|  | static SQInteger GameWorld_GetUserCount(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer P; | ||
|  |     sq_getuserpointer(v, 2, &P); | ||
|  | 
 | ||
|  |     SQInteger Count = ((__GetUserCount)0x086C4550)((void *)P); | ||
|  |     sq_pushinteger(v, Count); | ||
|  |     return 1; | ||
|  | } | ||
|  | typedef void (*__SendAll)(void *World, void *Pack); | ||
|  | static SQInteger GameWorld_SendAll(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer P; | ||
|  |     sq_getuserpointer(v, 2, &P); | ||
|  |     SQUserPointer Pck; | ||
|  |     sq_getuserpointer(v, 3, &Pck); | ||
|  | 
 | ||
|  |     ((__SendAll)0x086C8C14)((void *)P, (void *)Pck); | ||
|  |     return 0; | ||
|  | } | ||
|  | typedef void (*__SendPartyInfoToAll)(void *World, void *CParty, int code); | ||
|  | static SQInteger GameWorld_SendPartyInfoToAll(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer World; | ||
|  |     sq_getuserpointer(v, 2, &World); | ||
|  |     SQUserPointer CParty; | ||
|  |     sq_getuserpointer(v, 3, &CParty); | ||
|  | 
 | ||
|  |     ((__SendPartyInfoToAll)0x086C878A)((void *)World, (void *)CParty, 0); | ||
|  |     return 0; | ||
|  | } | ||
|  | // typedef std::map<int, std::string> (*__GetUserIdList)(&std::vector<unsigned short> a1, int a2);
 | ||
|  | // static SQInteger GetUserIdList(HSQUIRRELVM v)
 | ||
|  | // {
 | ||
|  | //     SQInteger a1, a2;
 | ||
|  | //     sq_getinteger(v, 2, &a1);
 | ||
|  | //     sq_getinteger(v, 3, &a2);
 | ||
|  | //     std::vector<unsigned short> Qs;
 | ||
|  | //     std::map<int, std::string> Ret = ((__GetUserIdList)0x086C305E)(&Qs, a2);
 | ||
|  | 
 | ||
|  | //     std::cout << Qs.size() << std::endl;
 | ||
|  | //     std::cout << Ret.size() << std::endl;
 | ||
|  | //     return 0;
 | ||
|  | // }
 | ||
|  | typedef void *(*__WorldMoveArea)(void *World, void *User, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11); | ||
|  | static SQInteger GameWorld_MoveArea(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer P; | ||
|  |     sq_getuserpointer(v, 2, &P); | ||
|  |     SQUserPointer Player; | ||
|  |     sq_getuserpointer(v, 3, &Player); | ||
|  |     SQInteger TownIndex, AreaIndex, Xpos, Ypos; | ||
|  |     sq_getinteger(v, 4, &TownIndex); | ||
|  |     sq_getinteger(v, 5, &AreaIndex); | ||
|  |     sq_getinteger(v, 6, &Xpos); | ||
|  |     sq_getinteger(v, 7, &Ypos); | ||
|  | 
 | ||
|  |     ((__WorldMoveArea)0x86C5A84)((void *)P, (void *)Player, TownIndex, AreaIndex, Xpos, Ypos, 0, 0, 0, 0, 0); | ||
|  |     return 0; | ||
|  | } | ||
|  | typedef void *(*__SendDungeonInOut)(void *World, void *User, int a3, bool a4); | ||
|  | static SQInteger GameWorld_SendDungeonInOut(HSQUIRRELVM v) | ||
|  | { | ||
|  |     SQUserPointer P; | ||
|  |     sq_getuserpointer(v, 2, &P); | ||
|  |     SQUserPointer Player; | ||
|  |     sq_getuserpointer(v, 3, &Player); | ||
|  |     SQInteger Index; | ||
|  |     SQBool Model; | ||
|  |     sq_getinteger(v, 4, &Index); | ||
|  |     sq_getbool(v, 5, &Model); | ||
|  | 
 | ||
|  |     ((__SendDungeonInOut)0x86C8FC8)((void *)P, (void *)Player, Index, Model); | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | static SQInteger register_World_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 RegisterWorld(HSQUIRRELVM v) | ||
|  | { | ||
|  |     // 获取游戏世界
 | ||
|  |     register_World_func(v, Get_GameWorld, _SC("Sq_Get_GameWorld")); | ||
|  |     // 根据UID获取Session
 | ||
|  |     register_World_func(v, GameWorld_GetSessionByUid, _SC("Sq_GameWorld_GetSessionByUid")); | ||
|  |     // 根据Session获取玩家
 | ||
|  |     register_World_func(v, GameWorld_GetUserBySession, _SC("Sq_GameWorld_GetUserBySession")); | ||
|  |     // 根据UID获取玩家
 | ||
|  |     register_World_func(v, GameWorld_GetUserByUid, _SC("Sq_GameWorld_GetUserByUid")); | ||
|  |     // 根据名字获取玩家
 | ||
|  |     register_World_func(v, GameWorld_GetUserByName, _SC("Sq_GameWorld_GetUserByName")); | ||
|  |     // 获取玩家数量
 | ||
|  |     register_World_func(v, GameWorld_GetUserCount, _SC("Sq_GameWorld_GetUserCount")); | ||
|  |     // 给所有玩家发包
 | ||
|  |     register_World_func(v, GameWorld_SendAll, _SC("Sq_GameWorld_SendAll")); | ||
|  |     // 指定玩家移动
 | ||
|  |     register_World_func(v, GameWorld_MoveArea, _SC("Sq_GameWorld_MoveArea")); | ||
|  |     // 给所有玩家发送队伍包
 | ||
|  |     register_World_func(v, GameWorld_SendPartyInfoToAll, _SC("Sq_GameWorld_SendPartyInfoToAll")); | ||
|  |     // 副本开启或关闭消息
 | ||
|  |     register_World_func(v, GameWorld_SendDungeonInOut, _SC("Sq_GameWorld_SendDungeonInOut")); | ||
|  | 
 | ||
|  |     // register_World_func(v, GetUserIdList, _SC("Sq_GetUserIdList"));
 | ||
|  | } |