This commit is contained in:
root
2024-04-30 03:01:48 +08:00
parent 9abf8aa3a4
commit 47be0adc6b
330 changed files with 5549 additions and 39399 deletions

View File

@@ -7,7 +7,20 @@
#include "sqstdstring.h"
#include "sqstdsystem.h"
#include "CConnectPool.h"
#include "l_socket.h"
#include <iostream>
#include <functional>
#include <list>
// 函数返回值类型枚举
enum RETTYPE
{
INT,
FLOAT,
BOOL,
STRING,
POINTER
};
template <typename R, typename A, typename... ARG>
R CallGameT(A call_addr, const ARG... arguments)
@@ -169,6 +182,25 @@ static SQInteger L_ReadAddress(HSQUIRRELVM v)
sq_pushinteger(v, *(int *)Address);
return 1;
}
// 读内存字符串
static SQInteger L_ReadAddressString(HSQUIRRELVM v)
{
// 内存地址 int型
SQUserPointer Address;
// 获取地址
sq_getuserpointer(v, 2, &Address);
if (sq_gettop(v) == 3)
{
SQInteger Length;
sq_getinteger(v, 3, &Length);
sq_pushstring(v, (char *)(Address), Length);
}
else
{
sq_pushstring(v, (char *)(Address), -1);
}
return 1;
}
// 读取字节数组
static SQInteger L_ReadByteArr(HSQUIRRELVM v)
@@ -254,6 +286,24 @@ static SQInteger L_GetNameByIdFromPvf(HSQUIRRELVM v)
}
return 1;
}
// 通过ID从Pvf中查询Data
static SQInteger L_GetDataByIdFromPvf(HSQUIRRELVM v)
{
SQInteger Idx;
sq_getinteger(v, 2, &Idx);
void *Ret = CallGameT<void *>(0x835FA32, CallGameT<void *>(0x80CC19B), (unsigned int)Idx);
if (Ret)
{
sq_pushuserpointer(v, Ret);
}
else
{
sq_pushnull(v);
}
return 1;
}
// 创建数据库连接池
static SQInteger L_CreatCConnectPool(HSQUIRRELVM v)
{
@@ -285,6 +335,42 @@ static SQInteger L_MysqlExecNoRet(HSQUIRRELVM v)
return 0;
}
struct CreateSocketInfo
{
std::string Ip;
std::string Port;
};
static void *SocketThread_function(void *arg)
{
CreateSocketInfo *Info = (CreateSocketInfo *)arg;
l_socket::getInstance().Init(Info->Ip, Info->Port);
delete Info;
// 在这里编写线程的具体操作
pthread_exit(NULL);
}
// 创建Socket连接
static SQInteger L_CreatSocketConnect(HSQUIRRELVM v)
{
const SQChar *Host;
const SQChar *Port;
sq_getstring(v, 2, &Host);
sq_getstring(v, 3, &Port);
CreateSocketInfo *Info = new CreateSocketInfo();
Info->Ip = Host;
Info->Port = Port;
pthread_t SocketThread;
// 创建线程1
if (pthread_create(&SocketThread, NULL, SocketThread_function, Info) != 0)
{
std::cerr << "Error creating thread 1" << std::endl;
}
return 0;
}
static SQInteger register_Game_func(HSQUIRRELVM v, SQFUNCTION f, const char *fname)
{
sq_pushroottable(v);
@@ -294,6 +380,103 @@ static SQInteger register_Game_func(HSQUIRRELVM v, SQFUNCTION f, const char *fna
sq_pop(v, 1); // pops the root table
}
static void Aprintfunc(const SQChar *s, ...)
{
fflush(stdout);
va_list vl;
va_start(vl, s);
scvprintf(stdout, s, vl);
va_end(vl);
printf("\n");
fflush(stdout);
}
// CallFunc
static SQInteger L_CallFunc(HSQUIRRELVM v)
{
SQInteger Count = sq_gettop(v);
// 得到函数地址
SQUserPointer FuncAddress;
sq_getuserpointer(v, 2, &FuncAddress);
SQInteger RetType;
sq_getinteger(v, 3, &RetType);
// 头部信息个数
int HeaderCount = 3;
char *m = (char *)malloc((Count - HeaderCount) * 4);
void *bm = m;
for (int i = 0; i < (Count - HeaderCount); i++)
{
SQObjectType Type = sq_gettype(v, HeaderCount + 1 + i);
switch (Type)
{
case OT_INTEGER:
{
SQInteger Buf;
sq_getinteger(v, HeaderCount + 1 + i, &Buf);
(*(int *)m) = Buf;
m += sizeof(int);
break;
}
case OT_FLOAT:
{
SQFloat Buf;
sq_getfloat(v, HeaderCount + 1 + i, &Buf);
(*(float *)m) = Buf;
m += sizeof(float);
break;
}
case OT_BOOL:
{
SQBool Buf;
sq_getbool(v, HeaderCount + 1 + i, &Buf);
(*(bool *)m) = Buf;
m += sizeof(bool);
break;
}
case OT_STRING:
{
const SQChar *Buf;
sq_getstring(v, HeaderCount + 1 + i, &Buf);
(*(char **)m) = (char *)Buf;
m += sizeof(char *);
break;
}
case OT_USERPOINTER:
{
SQUserPointer Buf;
sq_getuserpointer(v, HeaderCount + 1 + i, &Buf);
(*(void **)m) = Buf;
m += sizeof(void *);
break;
}
}
}
switch (RetType)
{
case POINTER:
{
void *B = CallGameT<void *>(FuncAddress, (va_list)bm);
free(bm);
sq_pushuserpointer(v, B);
return 1;
}
}
return 0;
}
static SQInteger L_S_Ptr(HSQUIRRELVM v)
{
const SQChar *str;
sq_getstring(v, 2, &str);
unsigned long long addr = std::stoull(str, 0, 16);
void *ptr = reinterpret_cast<void *>(addr);
sq_pushuserpointer(v, ptr);
return 1;
}
static void RegisterGame(HSQUIRRELVM v)
{
getConfigPath(szGamePath, sizeof(szGamePath));
@@ -301,6 +484,7 @@ static void RegisterGame(HSQUIRRELVM v)
// int 和指针相互转换
register_World_func(v, L_Ptr2Int, _SC("Sq_Ptr2Int"));
register_World_func(v, L_Int2Ptr, _SC("Sq_Int2Ptr"));
register_World_func(v, L_S_Ptr, _SC("S_Ptr"));
// 获取频道配置
register_World_func(v, Game_GetConfig, _SC("Sq_Game_GetConfig"));
@@ -308,6 +492,8 @@ static void RegisterGame(HSQUIRRELVM v)
register_World_func(v, L_WriteAddress, _SC("Sq_WriteAddress"));
// 读地址int
register_World_func(v, L_ReadAddress, _SC("Sq_ReadAddress"));
// 读地址字符串
register_World_func(v, L_ReadAddressString, _SC("Sq_ReadAddressString"));
// 读取Byte
register_World_func(v, L_ReadByteArr, _SC("Sq_ReadByteArr"));
// 写入Byte
@@ -318,8 +504,14 @@ static void RegisterGame(HSQUIRRELVM v)
register_World_func(v, L_WriteBlobToAddress, _SC("Sq_WriteBlobToAddress"));
// 通过ID从Pvf中查询名称
register_World_func(v, L_GetNameByIdFromPvf, _SC("Sq_GetNameByIdFromPvf"));
// 通过ID从Pvf中查询Data
register_World_func(v, L_GetDataByIdFromPvf, _SC("Sq_GetDataByIdFromPvf"));
// 创建数据库连接池
register_World_func(v, L_CreatCConnectPool, _SC("Sq_CreatCConnectPool"));
// 阻塞线程的数据库操作 无返回值
register_World_func(v, L_MysqlExecNoRet, _SC("Sq_MysqlExecNoRet"));
// 创建Socket连接
register_World_func(v, L_CreatSocketConnect, _SC("Sq_CreatSocketConnect"));
register_World_func(v, L_CallFunc, _SC("Sq_CallFunc"));
}