stoneage8.5/石器时代8.5客户端最新源代码/石器源码/mylua/winlua.cpp

440 lines
10 KiB
C++
Raw Permalink Normal View History

2020-06-23 15:53:23 +08:00
#include "../systeminc/version.h"
2020-06-23 15:27:59 +08:00
#include "../systeminc/system.h"
#include "../wgs/tea.h"
#include "../systeminc/action.h"
#include "../newproto/autil.h"
#include "winlua.h"
#include <locale.h>
#include <io.h>
#ifdef _WIN_LUAJIT_
static const char *progname = "lua";
MY_Lua MYLua;
lua_State* FindWinIntLua( int wintype, char *data )
{
lua_State *lua = NULL;
if (lua == NULL){
char filename[256];
#ifdef _RELUA_
sprintf_s(filename, "%s//win//%d.lua", _LUA_PATCH_, wintype);
#else
#ifdef _SA_VERSION_25
sprintf_s(filename, "%s//win//%d.es", _LUA_PATCH_, wintype);
#endif
#endif
lua = FindLua(filename);
if (lua == NULL)return NULL;
}
lua_getglobal(lua, "WindowInit");
if (!lua_isfunction(lua, -1)){
lua_pop(lua, 1);
return NULL;
}
lua_pushstring(lua, data);
docall(lua, 1, 1);
return lua;
}
ACTION * FreeCreateWinTypeLua( lua_State *lua )
{
if (lua == NULL){
return NULL;
}
lua_getglobal(lua, "CreateWinType");
if (!lua_isfunction(lua, -1)) {
lua_pop(lua, 1);
return NULL;
}
int TM_Ret = lua_pcall(lua, 0, 1, 0);
if (TM_Ret != 0){
2020-06-23 15:53:23 +08:00
printf("入口FreeCreateWinTypeLua 错误内容:%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
2020-06-23 15:27:59 +08:00
lua_pop(lua, 1);
return NULL;
}
if (!lua_isnumber(lua, -1))
return NULL;
int ret = (int)lua_tonumber(lua, -1);
lua_pop(lua, 1);
return (ACTION *)ret;
}
ACTION * FreeServerWinTypeLua( lua_State *lua )
{
if (lua == NULL){
return NULL;
}
lua_getglobal(lua, "ServerWindowType");
int TM_Ret = lua_pcall(lua, 0, 1, 0);
if (TM_Ret != 0){
2020-06-23 15:53:23 +08:00
printf("入口FreeServerWinTypeLua 错误内容:%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
2020-06-23 15:27:59 +08:00
lua_pop(lua, 1);
return NULL;
}
if (!lua_isnumber(lua, -1))
return NULL;
int ret = (int)lua_tonumber(lua, -1);
lua_pop(lua, 1);
return (ACTION *)ret;
}
static const luaL_Reg lualibs[] = {
{"Win", luaopen_Win},
{"lssproto", luaopen_Lssproto},
{"sa", luaopen_Sa},
{"ServerList", luaopen_ServerList},
{"data", luaopen_Data},
{NULL, NULL}
};
LUALIB_API void luaAB_openlibs (lua_State *L) {
const luaL_Reg *lib = lualibs;
for (; lib->func; lib++) {
lua_pushcfunction(L, lib->func);
lua_pushstring(L, lib->name);
lua_call(L, 1, 0);
}
}
int getArrayInt(lua_State *L, int idx) {
int result = 0;
lua_pushnumber(L, idx + 1);
lua_gettable(L, -2);
result = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
return result;
}
static void l_message (const char *pname, const char *msg) {
if (pname) fprintf(stderr, "%s: ", pname);
fprintf(stderr, "%s\n", msg);
fflush(stderr);
}
static int report (lua_State *L, int status) {
if (status && !lua_isnil(L, -1)) {
const char *msg = lua_tostring(L, -1);
if (msg == NULL) msg = "(error object is not a string)";
l_message(progname, msg);
lua_pop(L, 1);
}
return status;
}
static int traceback (lua_State *L) {
if (!lua_isstring(L, 1)) /* 'message' not a string? */
return 1; /* keep it intact */
lua_getfield(L, LUA_GLOBALSINDEX, "debug");
if (!lua_istable(L, -1)) {
lua_pop(L, 1);
return 1;
}
lua_getfield(L, -1, "traceback");
if (!lua_isfunction(L, -1)) {
lua_pop(L, 2);
return 1;
}
lua_pushvalue(L, 1); /* pass error message */
lua_pushinteger(L, 2); /* skip this function and traceback */
lua_call(L, 2, 1); /* call debug.traceback */
return 1;
}
int docall (lua_State *L, int narg, int clear) {
int status;
int base = lua_gettop(L) - narg; /* function index */
lua_pushcfunction(L, traceback); /* push traceback function */
lua_insert(L, base); /* put it under chunk and args */
status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base);
lua_remove(L, base);
if(status != 0){
2020-06-23 15:53:23 +08:00
printf("入口docall 错误内容:%d(%s)\n", status, lua_tostring(L, -1));
2020-06-23 15:27:59 +08:00
int iTop = lua_gettop(L);
lua_pop(L,iTop);
lua_gc(L, LUA_GCCOLLECT, 0);
}
return status;
}
int dofile (lua_State *L, const char *name) {
int status = luaL_loadfile(L, name) || docall(L, 0, 1);
return report(L, status);
}
int decryptLUA(lua_State *L, char *filename){
FILE *f;
char loadfilename[256];
int luamaxlen = 0;
unsigned char *luabuff;
strcpy(loadfilename, filename);
2020-06-23 15:53:23 +08:00
fopen_s(&f,loadfilename,"rb");//打开补丁1
2020-06-23 15:27:59 +08:00
if (f!=NULL){
fseek(f,0,SEEK_END);
luamaxlen = ftell(f);
luabuff = (unsigned char*)malloc(luamaxlen+1);
fseek(f,0,SEEK_SET);
fread(luabuff, 1, luamaxlen, f);
fclose(f);
luabuff[luamaxlen]=0;
}else{
return -100;
}
2020-06-23 15:53:23 +08:00
TEA解密((long*)luabuff,(luamaxlen/4),(long *)_LUA_KEY_);
2020-06-23 15:27:59 +08:00
int status = luaL_dostring(L,(const char *)luabuff);
free(luabuff);
return status;
}
int myluaload (char *filename)
{
MY_Lua *salua = &MYLua;
while(salua->next!=NULL){
if(strcmp(salua->luapath, filename) == 0){
return FALSE;
}
salua = salua->next;
}
salua->luapath = new char[strlen(filename)+1];
memset( salua->luapath, 0 , strlen(filename)+1);
strcpy(salua->luapath, filename);
salua->next = (tagMYLua *)new MY_Lua;
memset( salua->next, 0 , sizeof(MY_Lua) );
if(salua->next == NULL)return EXIT_FAILURE;
salua->lua = lua_open();
if (salua->lua == NULL) {
return FALSE;
}
lua_gc(salua->lua, LUA_GCSTOP, 0);
luaL_openlibs(salua->lua);
luaAB_openlibs(salua->lua);
lua_gc(salua->lua, LUA_GCRESTART, 0);
#ifdef _RELUA_
int re = dofile(salua->lua, filename);
if(re!=0){
2020-06-23 15:53:23 +08:00
printf("文件:%s 错误提示:%s 行数:%d\n",filename,(char *)lua_tostring(salua->lua, -1),re);
2020-06-23 15:27:59 +08:00
lua_gc(salua->lua, LUA_GCCOLLECT, 0);
return TRUE;
}
#else
int re = decryptLUA(salua->lua, filename);
if(re != 0){
if(re==-100) return TRUE;
2020-06-23 15:53:23 +08:00
printf("文件:%s 错误提示:%s 行数:%d\n",filename,(char *)lua_tostring(salua->lua, -1),re);
2020-06-23 15:27:59 +08:00
lua_gc(salua->lua, LUA_GCCOLLECT, 0);
return TRUE;
}
#endif
lua_getglobal(salua->lua, "main");
if (lua_isfunction(salua->lua, -1)) {
docall(salua->lua, 0, 1);
}
return TRUE;
}
int remyluaload (char *filename)
{
MY_Lua *salua = &MYLua;
while(salua->next!=NULL){
if(strlen(salua->luapath) > 0){
if(strlen(filename)>0){
if(strstr(salua->luapath, filename) == 0){
salua = salua->next;
continue;
}
}
lua_gc(salua->lua, LUA_GCSTOP, 0);
luaL_openlibs(salua->lua);
luaAB_openlibs(salua->lua);
lua_gc(salua->lua, LUA_GCRESTART, 0);
dofile(salua->lua, salua->luapath);
lua_getglobal(salua->lua, "data");
if (lua_isfunction(salua->lua, -1)) {
docall(salua->lua, 0, 1);
}
}
salua = salua->next;
}
return EXIT_SUCCESS;
}
int closemyluaload()
{
MY_Lua *salua = &MYLua;
while(salua->next!=NULL){
lua_pop(salua->lua, 1);
lua_close(salua->lua);
salua = salua->next;
}
return EXIT_SUCCESS;
}
void LoadStoneAgeLUA(char *path)
{
char filename[256];
WIN32_FIND_DATA wfd;
HANDLE hFind;
lstrcpy(filename, path);
lstrcat(filename, "/");
2020-06-23 15:53:23 +08:00
lstrcat(filename, "*.*"); // 找所有文件
2020-06-23 15:27:59 +08:00
hFind = FindFirstFile(filename, &wfd);
2020-06-23 15:53:23 +08:00
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
2020-06-23 15:27:59 +08:00
return;
do{
if (wfd.cFileName[0] == '.')
2020-06-23 15:53:23 +08:00
continue; // 过滤这两个目录
2020-06-23 15:27:59 +08:00
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
sprintf_s(filename, "%s//%s", path, wfd.cFileName);
LoadStoneAgeLUA(filename);
}else{
#ifdef _RELUA_
if( strcmptail( wfd.cFileName, ".lua" ) == 0)
#else
#ifdef _SA_VERSION_25
if( strcmptail( wfd.cFileName, "es" ) == 0)
#endif
#endif
{
char filename[256];
memset(filename, 0, 256);
sprintf_s(filename, "%s//%s", path, wfd.cFileName);
myluaload(filename);
}
}
}while (FindNextFile(hFind, &wfd));
2020-06-23 15:53:23 +08:00
FindClose(hFind); // 关闭查找句柄
2020-06-23 15:27:59 +08:00
}
void ReLoadStoneAgeLUA(char *filename)
{
remyluaload(filename);
}
void NewLoadStoneAgeLUA(char *filename)
{
char token[256];
if(strlen(filename)>0){
sprintf_s(token, "%s//%s", _LUA_PATCH_,filename);
myluaload(token);
}else{
LoadStoneAgeLUA(_LUA_PATCH_);
}
}
lua_State *FindLua(char *filename)
{
MY_Lua *salua = &MYLua;
char newfilename[256];
sprintf_s(newfilename, "%s", filename);
while(salua->next != NULL){
if(strcmp(newfilename, salua->luapath) == 0){
return salua->lua;
}
salua = salua->next;
}
return NULL;
}
int FreeGetBattleMap(int floor)
{
lua_State *lua = NULL;
if (lua == NULL){
char filename[256];
#ifdef _RELUA_
sprintf_s(filename, "%s//map//battlemap.lua",_LUA_PATCH_);
#else
#ifdef _SA_VERSION_25
sprintf_s(filename, "%s//map//battlemap.es",_LUA_PATCH_);
#endif
#endif
lua = FindLua(filename);
if (lua == NULL)return NULL;
}
lua_getglobal(lua, "FreeGetBattleMap");
if (!lua_isfunction(lua, -1)) {
2020-06-23 15:53:23 +08:00
printf("FreeGetBattleMap 错误内容 (%s)\n", lua_tostring(lua, -1));
2020-06-23 15:27:59 +08:00
lua_pop(lua, 1);
return NULL;
}
lua_pushnumber(lua, floor);
int TM_Ret = lua_pcall(lua, 1, 1, 0);
if (TM_Ret != 0){
2020-06-23 15:53:23 +08:00
printf("入口FreeGetBattleMap 错误内容:%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
2020-06-23 15:27:59 +08:00
lua_pop(lua, 1);
return NULL;
}
if (!lua_isnumber(lua, -1))
return NULL;
int ret = (int)lua_tonumber(lua, -1);
lua_pop(lua, 1);
return ret;
}
#endif
#ifdef _CHARTITLE_STR_
char* FreeGetTitleStr(int id)
{
lua_State *lua = NULL;
if (lua == NULL){
char filename[256];
#ifdef _RELUA_
sprintf_s(filename, "%s//title.lua",_LUA_PATCH_);
#else
#ifdef _SA_VERSION_25
sprintf_s(filename, "%s//title.es",_LUA_PATCH_);
#endif
#endif
lua = FindLua(filename);
if (lua == NULL)return NULL;
}
lua_getglobal(lua, "GetTitleStr");
if (!lua_isfunction(lua, -1)) {
2020-06-23 15:53:23 +08:00
printf("GetTitleStr 错误内容 (%s)\n", lua_tostring(lua, -1));
2020-06-23 15:27:59 +08:00
lua_pop(lua, 1);
return NULL;
}
lua_pushnumber(lua, id);
int TM_Ret = lua_pcall(lua, 1, 1, 0);
if (TM_Ret != 0){
2020-06-23 15:53:23 +08:00
printf("入口GetTitleStr 错误内容:%d(%s)\n", TM_Ret, lua_tostring(lua, -1));
2020-06-23 15:27:59 +08:00
lua_pop(lua, 1);
return NULL;
}
if (!lua_isstring(lua, -1))
return NULL;
char *ret = (char *)lua_tostring(lua, -1);
lua_pop(lua, 1);
return ret;
}
#endif