Skip to content

Instantly share code, notes, and snippets.

@diamondo25
Created October 17, 2016 22:49
Show Gist options
  • Select an option

  • Save diamondo25/02cf385903f955ffd0a07d611cfb7551 to your computer and use it in GitHub Desktop.

Select an option

Save diamondo25/02cf385903f955ffd0a07d611cfb7551 to your computer and use it in GitHub Desktop.
Vana lua classes
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