void load_ply_info_cb(struct db_result *result) { //数据导入后的回调函数 if(result){ player_t ply = result->ud; if(result->result_set){ redisReply *r = (redisReply*)result->result_set; if(r->type != REDIS_REPLY_NIL){ lua_State *L = tls_get(LUASTATE); if(0 != CALL_LUA_FUNC2(L,"CreateLuaPlayer",1, PUSH_LUSRDATA(L,ply), PUSH_TABLE3(L, PUSH_STRING(L,r->element[0]->str), PUSH_STRING(L,r->element[1]->str), PUSH_STRING(L,r->element[2]->str)))) { const char * error = lua_tostring(L, -1); lua_pop(L,1); printf("%s\n",error); }else ply->_luaply = create_luaObj(L,-1); }else{ //没有角色,通知客户端创建角色 shortmsg2gate(CMD_GAME2C_CREATE,ply->_agentsession); } }else{ //数据库访问出错 shortmsg2gate(CMD_GAME2GATE_BUSY,ply->_agentsession); remove_player(ply); } } }
battleservice_t new_battleservice() { lua_State *L = luaL_newstate(); luaL_openlibs(L); if (luaL_dofile(L,"battlemgr.lua")) { const char * error = lua_tostring(L, -1); lua_pop(L,1); printf("%s\n",error); exit(0); } register_battle_cfunction(L); battleservice_t bservice = calloc(1,sizeof(*bservice)); if(0 != CALL_LUA_FUNC(L,"CreateBattleMgr",1)) { const char * error = lua_tostring(L, -1); lua_pop(L,1); printf("%s\n",error); exit(0); } bservice->battlemgr = create_luaObj(L,-1); bservice->msgdisp = new_msgdisp(NULL,NULL,NULL, NULL,battle_processpacket,NULL); bservice->thd = create_thread(THREAD_JOINABLE); thread_start_run(bservice->thd,service_main,(void*)bservice); return bservice; }
int reg_cmd_handler(lua_State *L){ uint16_t cmd = lua_tonumber(L,1); luaObject_t obj = create_luaObj(L,2); if(!handler[cmd]){ printf("reg cmd %d\n",cmd); cmd_handler_t h = calloc(1,sizeof(*h)); h->_type = FN_LUA; h->obj = obj; handler[cmd] = h; lua_pushboolean(L,1); }else{ release_luaObj(obj); lua_pushboolean(L,0); } return 1; }
int luaAoiEnterMap(lua_State *L){ struct battlemap *battlemap = (struct battlemap*)lua_touserdata(L,-1); luaObject_t self = create_luaObj(L,-2); int x = (int)lua_tonumber(L,-3); int y = (int)lua_tonumber(L,-4); struct aoi_object *aoi_obj = calloc(1,sizeof(*aoi_obj)); aoi_obj->ud = self; aoi_obj->in_myscope = in_myscope; aoi_obj->cb_enter = cb_enter; aoi_obj->cb_leave = cb_leave; if(0 == aoi_enter(battlemap->aoi,aoi_obj,x,y)){ PUSH_LUSRDATA(L,aoi_obj); }else { free(aoi_obj); PUSH_NIL(L); } return 1; }