Created
October 17, 2016 22:49
-
-
Save diamondo25/02cf385903f955ffd0a07d611cfb7551 to your computer and use it in GitHub Desktop.
Vana lua classes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/src/channel_server/lua/lua_scriptable.cpp b/src/channel_server/lua/lua_scriptable.cpp | |
| index bb6cbd6..cfd12cd 100644 | |
| --- a/src/channel_server/lua/lua_scriptable.cpp | |
| +++ b/src/channel_server/lua/lua_scriptable.cpp | |
| @@ -176,6 +176,7 @@ auto lua_scriptable::initialize() -> void { | |
| expose("useItem", &lua_exports::use_item); | |
| // Player | |
| + | |
| expose("deletePlayerVariable", &lua_exports::delete_player_variable); | |
| expose("endMorph", &lua_exports::end_morph); | |
| expose("getAp", &lua_exports::get_ap); | |
| @@ -199,6 +200,7 @@ auto lua_scriptable::initialize() -> void { | |
| expose("getMaxMp", &lua_exports::get_max_mp); | |
| expose("getMp", &lua_exports::get_mp); | |
| expose("getName", &lua_exports::get_name); | |
| + expose("getPlayer", &lua_exports::get_player); | |
| expose("getPlayerVariable", &lua_exports::get_player_variable); | |
| expose("getPosX", &lua_exports::get_pos_x); | |
| expose("getPosY", &lua_exports::get_pos_y); | |
| @@ -336,6 +338,14 @@ auto lua_scriptable::initialize() -> void { | |
| expose("startInstanceSecondOfHourTimer", &lua_exports::start_instance_second_of_hour_timer); | |
| expose("stopAllInstanceTimers", &lua_exports::stop_all_instance_timers); | |
| expose("stopInstanceTimer", &lua_exports::stop_instance_timer); | |
| + | |
| + | |
| + expose_class("vana::player", { | |
| + { "getName", &lua_exports::player_get_name }, | |
| + { "getId", &lua_exports::player_get_id }, | |
| + { "__tostring", &lua_exports::player_lua_tostring }, | |
| + { NULL, NULL }, | |
| + }); | |
| } | |
| auto lua_scriptable::set_environment_variables() -> void { | |
| @@ -388,6 +398,7 @@ auto lua_scriptable::set_environment_variables() -> void { | |
| set<bool>("env_is_test_server", data::version::is_test_server); | |
| set<string>("env_locale", data::version::locale); | |
| set<string>("env_api_version", s_api_version); | |
| + | |
| } | |
| auto lua_scriptable::handle_error(const string &filename, const string &error) -> void { | |
| @@ -1156,6 +1167,40 @@ auto lua_exports::get_name(lua_State *lua_vm) -> lua_return { | |
| return 1; | |
| } | |
| +auto lua_exports::get_player(lua_State *lua_vm) -> lua_return { | |
| + auto &env = get_environment(lua_vm); | |
| + auto currentPlayer = lua_exports::get_player(lua_vm, env); | |
| + auto luaPlayer = (player**)lua_newuserdata(lua_vm, sizeof(player**)); | |
| + *luaPlayer = currentPlayer.get(); | |
| + | |
| + luaL_setmetatable(lua_vm, "vana::player"); | |
| + return 1; | |
| +} | |
| + | |
| +auto lua_exports::player_get_id(lua_State *lua_vm) -> lua_return { | |
| + auto &env = get_environment(lua_vm); | |
| + auto player_ptr = *(player**)luaL_checkudata(lua_vm, 1, "vana::player"); | |
| + | |
| + env.push<game_player_id>(lua_vm, player_ptr->get_id()); | |
| + return 1; | |
| +} | |
| + | |
| +auto lua_exports::player_get_name(lua_State *lua_vm) -> lua_return { | |
| + auto &env = get_environment(lua_vm); | |
| + auto player_ptr = *(player**)luaL_checkudata(lua_vm, 1, "vana::player"); | |
| + | |
| + env.push<string>(lua_vm, player_ptr->get_name()); | |
| + return 1; | |
| +} | |
| + | |
| +auto lua_exports::player_lua_tostring(lua_State *lua_vm) -> lua_return { | |
| + auto &env = get_environment(lua_vm); | |
| + auto player_ptr = *(player**)luaL_checkudata(lua_vm, 1, "vana::player"); | |
| + | |
| + env.push<string>(lua_vm, "vana::player { name: " + player_ptr->get_name() + ", id: " + utilities::str::lexical_cast<string>(player_ptr->get_id()) + " }"); | |
| + return 1; | |
| +} | |
| + | |
| auto lua_exports::get_player_variable(lua_State *lua_vm) -> lua_return { | |
| auto &env = get_environment(lua_vm); | |
| variable_type::type return_type = variable_type::string; | |
| diff --git a/src/channel_server/lua/lua_scriptable.hpp b/src/channel_server/lua/lua_scriptable.hpp | |
| index 2581f05..b8601ed 100644 | |
| --- a/src/channel_server/lua/lua_scriptable.hpp | |
| +++ b/src/channel_server/lua/lua_scriptable.hpp | |
| @@ -176,6 +176,7 @@ namespace vana { | |
| auto get_max_mp(lua_State *lua_vm) -> lua_return; | |
| auto get_mp(lua_State *lua_vm) -> lua_return; | |
| auto get_name(lua_State *lua_vm) -> lua_return; | |
| + auto get_player(lua_State *lua_vm) -> lua_return; | |
| auto get_player_variable(lua_State *lua_vm) -> lua_return; | |
| auto get_pos_x(lua_State *lua_vm) -> lua_return; | |
| auto get_pos_y(lua_State *lua_vm) -> lua_return; | |
| @@ -192,6 +193,9 @@ namespace vana { | |
| auto is_active_skill(lua_State *lua_vm) -> lua_return; | |
| auto is_gm(lua_State *lua_vm) -> lua_return; | |
| auto is_online(lua_State *lua_vm) -> lua_return; | |
| + auto player_get_id(lua_State *lua_vm) -> lua_return; | |
| + auto player_get_name(lua_State *lua_vm) -> lua_return; | |
| + auto player_lua_tostring(lua_State *lua_vm) -> lua_return; | |
| auto revert_player(lua_State *lua_vm) -> lua_return; | |
| auto set_ap(lua_State *lua_vm) -> lua_return; | |
| auto set_dex(lua_State *lua_vm) -> lua_return; | |
| diff --git a/src/common/lua/lua_environment.cpp b/src/common/lua/lua_environment.cpp | |
| index e2877b1..9f0b5e0 100644 | |
| --- a/src/common/lua/lua_environment.cpp | |
| +++ b/src/common/lua/lua_environment.cpp | |
| @@ -137,6 +137,24 @@ auto lua_environment::expose(const string &name, lua::lua_function func) -> void | |
| lua_register(m_lua_vm, name.c_str(), func); | |
| } | |
| +auto lua_environment::expose_class(const string &name, std::initializer_list<luaL_Reg> func) -> void { | |
| + luaL_newmetatable(m_lua_vm, name.c_str()); | |
| + // Make func a C-style array | |
| + | |
| + luaL_Reg* regs = new luaL_Reg[func.size()]; | |
| + int offset = 0; | |
| + std::for_each(func.begin(), func.end(), [&](luaL_Reg reg) { | |
| + regs[offset++] = reg; | |
| + }); | |
| + | |
| + luaL_setfuncs(m_lua_vm, regs, 0); | |
| + | |
| + delete[] regs; | |
| + | |
| + lua_pushvalue(m_lua_vm, -1); | |
| + lua_setfield(m_lua_vm, -2, "__index"); | |
| +} | |
| + | |
| auto lua_environment::require_standard_lib(const string &local_name, lua::lua_function func) -> void { | |
| luaL_requiref(m_lua_vm, local_name.c_str(), func, 1); | |
| } | |
| diff --git a/src/common/lua/lua_environment.hpp b/src/common/lua/lua_environment.hpp | |
| index ac80e6a..7f10358 100644 | |
| --- a/src/common/lua/lua_environment.hpp | |
| +++ b/src/common/lua/lua_environment.hpp | |
| @@ -134,6 +134,7 @@ namespace vana { | |
| virtual auto handle_thread_completion() -> void; | |
| auto print_error(const string &error) const -> void; | |
| auto expose(const string &name, lua::lua_function func) -> void; | |
| + auto expose_class(const string &name, std::initializer_list<luaL_Reg> func) -> void; | |
| auto resume(lua::lua_return pushed_arg_count) -> result; | |
| auto require_standard_lib(const string &local_name, lua::lua_function func) -> void; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment