114 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.8 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>
 | |
| 
 | |
| template <typename R, typename A, typename... ARG>
 | |
| R CallInven(A call_addr, const ARG... arguments)
 | |
| {
 | |
|     if (!call_addr)
 | |
|     {
 | |
|         return R();
 | |
|     }
 | |
|     const auto control = reinterpret_cast<R (*)(ARG...)>(call_addr);
 | |
|     try
 | |
|     {
 | |
|         return control(arguments...);
 | |
|     }
 | |
|     catch (...)
 | |
|     {
 | |
|     }
 | |
|     return R();
 | |
| }
 | |
| 
 | |
| // 获取背包
 | |
| static SQInteger Inven_GetInven(HSQUIRRELVM v)
 | |
| {
 | |
|     SQUserPointer P;
 | |
|     sq_getuserpointer(v, 2, &P);
 | |
|     void *InvenP = CallInven<void *>(0x80DA28E, P);
 | |
|     sq_pushuserpointer(v, InvenP);
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| // 获取背包中的项目
 | |
| static SQInteger Inven_GetItem(HSQUIRRELVM v)
 | |
| {
 | |
|     SQUserPointer P;
 | |
|     sq_getuserpointer(v, 2, &P);
 | |
|     SQInteger Type, Slot;
 | |
|     sq_getinteger(v, 3, &Type);
 | |
|     sq_getinteger(v, 4, &Slot);
 | |
| 
 | |
|     void *ItemP = CallInven<void *>(0x84FC1DE, P, Type, Slot);
 | |
|     sq_pushuserpointer(v, ItemP);
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| // 删除背包中的项目
 | |
| static SQInteger Inven_RemoveItem(HSQUIRRELVM v)
 | |
| {
 | |
|     SQUserPointer P;
 | |
|     sq_getuserpointer(v, 2, &P);
 | |
| 
 | |
|     CallInven<void *>(0x080CB7D8, P);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| // 删除背包中的指定数量的项目
 | |
| static SQInteger Inven_RemoveItemFormCount(HSQUIRRELVM v)
 | |
| {
 | |
|     SQUserPointer P;
 | |
|     sq_getuserpointer(v, 2, &P);
 | |
|     SQInteger Type, Slot, Count, Ps, Log;
 | |
|     sq_getinteger(v, 3, &Type);
 | |
|     sq_getinteger(v, 4, &Slot);
 | |
|     sq_getinteger(v, 5, &Count);
 | |
|     sq_getinteger(v, 6, &Ps);
 | |
|     sq_getinteger(v, 7, &Log);
 | |
| 
 | |
|     SQInteger Ret = CallInven<int>(0x850400C, P, Type, Slot, Count, Ps, Log);
 | |
|     sq_pushinteger(v, Ret);
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| // 根据Id获取背包中的物品槽位
 | |
| static SQInteger Inven_GetItemById(HSQUIRRELVM v)
 | |
| {
 | |
|     SQUserPointer P;
 | |
|     sq_getuserpointer(v, 2, &P);
 | |
|     SQInteger Idx;
 | |
|     sq_getinteger(v, 3, &Idx);
 | |
| 
 | |
|     SQInteger Slot = CallInven<int>(0x08505172, P, Idx);
 | |
|     sq_pushinteger(v, Slot);
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| static SQInteger register_Inven_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 RegisterInven(HSQUIRRELVM v)
 | |
| {
 | |
|     // 获取背包
 | |
|     register_Inven_func(v, Inven_GetInven, "Sq_Inven_GetInven");
 | |
|     // 获取背包中的道具
 | |
|     register_Inven_func(v, Inven_GetItem, "Sq_Inven_GetItem");
 | |
|     // 删除背包中的项目
 | |
|     register_Inven_func(v, Inven_RemoveItem, "Sq_Inven_RemoveItem");
 | |
|     // 根据Id获取背包中的物品槽位
 | |
|     register_Inven_func(v, Inven_RemoveItemFormCount, "Sq_Inven_RemoveItemFormCount");
 | |
|     // 根据Id获取背包中的物品槽位
 | |
|     register_Inven_func(v, Inven_GetItemById, "Sq_Inven_GetItemById");
 | |
| } |