lua: sub folders support, check for .lua file extension, refactor and simplify internals. (#1775)
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
#include "event.hpp"
|
||||
|
||||
#include "fiber_pool.hpp"
|
||||
#include "lua/lua_module.hpp"
|
||||
#include "script_mgr.hpp"
|
||||
@ -91,22 +92,22 @@ namespace lua::event
|
||||
// Register a function that will be called each time the corresponding menu_event is triggered.
|
||||
static void register_handler(const menu_event& menu_event, sol::protected_function func, sol::this_state state)
|
||||
{
|
||||
const auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
|
||||
module->m_event_callbacks[menu_event].push_back(func);
|
||||
}
|
||||
|
||||
void bind(sol::state& state)
|
||||
{
|
||||
state.new_enum<menu_event>("menu_event",
|
||||
{
|
||||
{"PlayerLeave", menu_event::PlayerLeave},
|
||||
{"PlayerJoin", menu_event::PlayerJoin},
|
||||
{"PlayerMgrInit", menu_event::PlayerMgrInit},
|
||||
{"PlayerMgrShutdown", menu_event::PlayerMgrShutdown},
|
||||
{"ChatMessageReceived", menu_event::ChatMessageReceived},
|
||||
{"ScriptedGameEventReceived", menu_event::ScriptedGameEventReceived},
|
||||
});
|
||||
{
|
||||
{"PlayerLeave", menu_event::PlayerLeave},
|
||||
{"PlayerJoin", menu_event::PlayerJoin},
|
||||
{"PlayerMgrInit", menu_event::PlayerMgrInit},
|
||||
{"PlayerMgrShutdown", menu_event::PlayerMgrShutdown},
|
||||
{"ChatMessageReceived", menu_event::ChatMessageReceived},
|
||||
{"ScriptedGameEventReceived", menu_event::ScriptedGameEventReceived},
|
||||
});
|
||||
|
||||
|
||||
auto ns = state["event"].get_or_create<sol::table>();
|
||||
|
@ -4,19 +4,16 @@
|
||||
|
||||
namespace lua::gui
|
||||
{
|
||||
static void add_independent_element(lua_State* state, std::shared_ptr<lua::gui::gui_element> element)
|
||||
static void add_independent_element(lua_State* state, std::unique_ptr<lua::gui::gui_element> element)
|
||||
{
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
|
||||
module->m_independent_gui.push_back(std::move(element));
|
||||
}
|
||||
|
||||
static void add_element(lua_State* state, uint32_t hash, std::shared_ptr<lua::gui::gui_element> element)
|
||||
static void add_element(lua_State* state, uint32_t hash, std::unique_ptr<lua::gui::gui_element> element)
|
||||
{
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
|
||||
if (!module->m_gui.contains(hash))
|
||||
module->m_gui[hash] = {};
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
|
||||
module->m_gui[hash].push_back(std::move(element));
|
||||
}
|
||||
@ -56,9 +53,12 @@ namespace lua::gui
|
||||
{
|
||||
if (nav_item.second.hash == existing_tab_hash)
|
||||
{
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
|
||||
|
||||
module->m_tab_to_sub_tabs[nav_item.first].push_back(new_tab.first);
|
||||
|
||||
|
||||
nav_item.second.sub_nav.emplace(new_tab);
|
||||
return;
|
||||
}
|
||||
@ -94,7 +94,7 @@ namespace lua::gui
|
||||
// add top tab
|
||||
nav.emplace(make_tab_nav(name, m_tab_hash, state));
|
||||
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
module->m_owned_tabs.push_back(id());
|
||||
}
|
||||
|
||||
@ -111,7 +111,7 @@ namespace lua::gui
|
||||
const auto sub_tab = make_tab_nav(name, m_tab_hash, state);
|
||||
add_to_existing_tab(nav, parent_tab_hash, sub_tab, state);
|
||||
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
module->m_owned_tabs.push_back(id());
|
||||
}
|
||||
|
||||
@ -122,10 +122,9 @@ namespace lua::gui
|
||||
|
||||
void tab::clear(sol::this_state state)
|
||||
{
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
|
||||
if (module->m_gui.contains(m_tab_hash))
|
||||
module->m_gui[m_tab_hash] = {};
|
||||
module->m_gui[m_tab_hash].clear();
|
||||
|
||||
for (auto sub_tab : module->m_tab_to_sub_tabs[id()])
|
||||
{
|
||||
@ -146,67 +145,76 @@ namespace lua::gui
|
||||
return sub_tab;
|
||||
}
|
||||
|
||||
std::shared_ptr<lua::gui::button> tab::add_button(const std::string& name, sol::protected_function callback, sol::this_state state)
|
||||
lua::gui::button* tab::add_button(const std::string& name, sol::protected_function callback, sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::button>(name, callback);
|
||||
add_element(state, m_tab_hash, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::button>(name, callback);
|
||||
auto el_ptr = element.get();
|
||||
add_element(state, m_tab_hash, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<lua::gui::text> tab::add_text(const std::string& name, sol::this_state state)
|
||||
lua::gui::text* tab::add_text(const std::string& name, sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::text>(name);
|
||||
add_element(state, m_tab_hash, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::text>(name);
|
||||
auto el_ptr = element.get();
|
||||
add_element(state, m_tab_hash, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<lua::gui::checkbox> tab::add_checkbox(const std::string& name, sol::this_state state)
|
||||
lua::gui::checkbox* tab::add_checkbox(const std::string& name, sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::checkbox>(name);
|
||||
add_element(state, m_tab_hash, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::checkbox>(name);
|
||||
auto el_ptr = element.get();
|
||||
add_element(state, m_tab_hash, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<lua::gui::sameline> tab::add_sameline(sol::this_state state)
|
||||
lua::gui::sameline* tab::add_sameline(sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::sameline>();
|
||||
add_element(state, m_tab_hash, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::sameline>();
|
||||
auto el_ptr = element.get();
|
||||
add_element(state, m_tab_hash, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<lua::gui::separator> tab::add_separator(sol::this_state state)
|
||||
lua::gui::separator* tab::add_separator(sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::separator>();
|
||||
add_element(state, m_tab_hash, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::separator>();
|
||||
auto el_ptr = element.get();
|
||||
add_element(state, m_tab_hash, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<lua::gui::input_int> tab::add_input_int(const std::string& name, sol::this_state state)
|
||||
lua::gui::input_int* tab::add_input_int(const std::string& name, sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::input_int>(name);
|
||||
add_element(state, m_tab_hash, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::input_int>(name);
|
||||
auto el_ptr = element.get();
|
||||
add_element(state, m_tab_hash, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<lua::gui::input_float> tab::add_input_float(const std::string& name, sol::this_state state)
|
||||
lua::gui::input_float* tab::add_input_float(const std::string& name, sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::input_float>(name);
|
||||
add_element(state, m_tab_hash, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::input_float>(name);
|
||||
auto el_ptr = element.get();
|
||||
add_element(state, m_tab_hash, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<lua::gui::input_string> tab::add_input_string(const std::string& name, sol::this_state state)
|
||||
lua::gui::input_string* tab::add_input_string(const std::string& name, sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::input_string>(name);
|
||||
add_element(state, m_tab_hash, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::input_string>(name);
|
||||
auto el_ptr = element.get();
|
||||
add_element(state, m_tab_hash, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<lua::gui::raw_imgui_callback> tab::add_imgui(sol::protected_function imgui_rendering, sol::this_state state)
|
||||
lua::gui::raw_imgui_callback* tab::add_imgui(sol::protected_function imgui_rendering, sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::raw_imgui_callback>(imgui_rendering);
|
||||
add_element(state, m_tab_hash, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::raw_imgui_callback>(imgui_rendering);
|
||||
auto el_ptr = element.get();
|
||||
add_element(state, m_tab_hash, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
// Lua API: Table
|
||||
@ -296,11 +304,12 @@ namespace lua::gui
|
||||
// end
|
||||
// end)
|
||||
// ```
|
||||
static std::shared_ptr<lua::gui::raw_imgui_callback> add_imgui(sol::protected_function imgui_rendering, sol::this_state state)
|
||||
static lua::gui::raw_imgui_callback* add_imgui(sol::protected_function imgui_rendering, sol::this_state state)
|
||||
{
|
||||
auto element = std::make_shared<lua::gui::raw_imgui_callback>(imgui_rendering);
|
||||
add_independent_element(state, element);
|
||||
return element;
|
||||
auto element = std::make_unique<lua::gui::raw_imgui_callback>(imgui_rendering);
|
||||
auto el_ptr = element.get();
|
||||
add_independent_element(state, std::move(element));
|
||||
return el_ptr;
|
||||
}
|
||||
|
||||
void bind(sol::state& state)
|
||||
|
@ -59,7 +59,7 @@ namespace lua::gui
|
||||
// Param: name: string: Text written inside the button.
|
||||
// Param: callback: function: function that will be called when the button is clicked.
|
||||
// Add a button to the gui tab.
|
||||
std::shared_ptr<lua::gui::button> add_button(const std::string& name, sol::protected_function callback, sol::this_state state);
|
||||
lua::gui::button* add_button(const std::string& name, sol::protected_function callback, sol::this_state state);
|
||||
|
||||
// Lua API: Function
|
||||
// Class: tab
|
||||
@ -67,7 +67,7 @@ namespace lua::gui
|
||||
// Param: name: string: Text that will be written.
|
||||
// Returns: text: The text object instance.
|
||||
// Add text to the gui tab.
|
||||
std::shared_ptr<lua::gui::text> add_text(const std::string& name, sol::this_state state);
|
||||
lua::gui::text* add_text(const std::string& name, sol::this_state state);
|
||||
|
||||
// Lua API: Function
|
||||
// Class: tab
|
||||
@ -75,21 +75,21 @@ namespace lua::gui
|
||||
// Param: name: string: Text that will be written next to the checkbox.
|
||||
// Returns: checkbox: The checkbox object instance.
|
||||
// Add a checkbox widget to the gui tab.
|
||||
std::shared_ptr<lua::gui::checkbox> add_checkbox(const std::string& name, sol::this_state state);
|
||||
lua::gui::checkbox* add_checkbox(const std::string& name, sol::this_state state);
|
||||
|
||||
// Lua API: Function
|
||||
// Class: tab
|
||||
// Name: add_sameline
|
||||
// Returns: sameline: The sameline object instance.
|
||||
// Add a ImGui::SameLine.
|
||||
std::shared_ptr<lua::gui::sameline> add_sameline(sol::this_state state);
|
||||
lua::gui::sameline* add_sameline(sol::this_state state);
|
||||
|
||||
// Lua API: Function
|
||||
// Class: tab
|
||||
// Name: add_separator
|
||||
// Returns: separator: The separator object instance.
|
||||
// Add a ImGui::Separator.
|
||||
std::shared_ptr<lua::gui::separator> add_separator(sol::this_state state);
|
||||
lua::gui::separator* add_separator(sol::this_state state);
|
||||
|
||||
// Lua API: Function
|
||||
// Class: tab
|
||||
@ -97,7 +97,7 @@ namespace lua::gui
|
||||
// Param: name: string: Text that will be written next to the input field.
|
||||
// Returns: input_int: The input_int object instance.
|
||||
// Add a ImGui::InputInt.
|
||||
std::shared_ptr<lua::gui::input_int> add_input_int(const std::string& name, sol::this_state state);
|
||||
lua::gui::input_int* add_input_int(const std::string& name, sol::this_state state);
|
||||
|
||||
// Lua API: Function
|
||||
// Class: tab
|
||||
@ -105,7 +105,7 @@ namespace lua::gui
|
||||
// Param: name: string: Text that will be written next to the input field.
|
||||
// Returns: input_float: The input_float object instance.
|
||||
// Add a ImGui::InputFloat.
|
||||
std::shared_ptr<lua::gui::input_float> add_input_float(const std::string& name, sol::this_state state);
|
||||
lua::gui::input_float* add_input_float(const std::string& name, sol::this_state state);
|
||||
|
||||
// Lua API: Function
|
||||
// Class: tab
|
||||
@ -113,7 +113,7 @@ namespace lua::gui
|
||||
// Param: name: string: Text that will be written next to the input field.
|
||||
// Returns: input_string: The input_string object instance.
|
||||
// Add a ImGui::InputText.
|
||||
std::shared_ptr<lua::gui::input_string> add_input_string(const std::string& name, sol::this_state state);
|
||||
lua::gui::input_string* add_input_string(const std::string& name, sol::this_state state);
|
||||
|
||||
// Lua API: Function
|
||||
// Class: tab
|
||||
@ -134,7 +134,7 @@ namespace lua::gui
|
||||
// end
|
||||
// end)
|
||||
// ```
|
||||
std::shared_ptr<lua::gui::raw_imgui_callback> add_imgui(sol::protected_function imgui_rendering, sol::this_state state);
|
||||
lua::gui::raw_imgui_callback* add_imgui(sol::protected_function imgui_rendering, sol::this_state state);
|
||||
};
|
||||
|
||||
void bind(sol::state& state);
|
||||
|
@ -107,9 +107,11 @@ namespace lua::memory
|
||||
// Returns: pointer: A pointer to the newly allocated memory.
|
||||
static pointer allocate(int size, sol::this_state state)
|
||||
{
|
||||
void* mem = new uint8_t[](size);
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
void* mem = new uint8_t[](size);
|
||||
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
module->m_allocated_memory.push_back(mem);
|
||||
|
||||
return pointer((uint64_t)mem);
|
||||
}
|
||||
|
||||
@ -120,7 +122,9 @@ namespace lua::memory
|
||||
static void free(pointer ptr, sol::this_state state)
|
||||
{
|
||||
delete[] (void*)ptr.get_address();
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
|
||||
std::erase_if(module->m_allocated_memory, [ptr](void* addr) {
|
||||
return ptr.get_address() == (uint64_t)addr;
|
||||
});
|
||||
|
@ -172,9 +172,10 @@ namespace lua::memory
|
||||
template<typename T>
|
||||
big::lua_patch* patch(T value, sol::this_state state)
|
||||
{
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
auto patch = std::make_shared<big::lua_patch>(::memory::byte_patch::make((T*)m_address, value).get());
|
||||
auto raw = patch.get();
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
|
||||
auto patch = std::make_unique<big::lua_patch>(::memory::byte_patch::make((T*)m_address, value).get());
|
||||
auto raw = patch.get();
|
||||
module->m_registered_patches.push_back(std::move(patch));
|
||||
return raw;
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ namespace lua::script
|
||||
// ```
|
||||
static void register_looped(const std::string& name, sol::protected_function func_, sol::this_state state)
|
||||
{
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
|
||||
std::unique_ptr<big::script> lua_script = std::make_unique<big::script>(
|
||||
[func_, state]() mutable {
|
||||
@ -79,9 +79,7 @@ namespace lua::script
|
||||
},
|
||||
name);
|
||||
|
||||
const auto registered_script = big::g_script_mgr.add_script(std::move(lua_script));
|
||||
|
||||
module->m_registered_scripts.push_back(registered_script);
|
||||
module->m_registered_scripts.push_back(std::move(lua_script));
|
||||
}
|
||||
|
||||
// Lua API: Function
|
||||
@ -114,7 +112,7 @@ namespace lua::script
|
||||
// ```
|
||||
static void run_in_fiber(sol::protected_function func_, sol::this_state state)
|
||||
{
|
||||
auto module = sol::state_view(state)["!this"].get<big::lua_module*>();
|
||||
big::lua_module* module = sol::state_view(state)["!this"];
|
||||
|
||||
static size_t name_i = 0;
|
||||
std::string job_name = module->module_name() + std::to_string(name_i++);
|
||||
@ -138,16 +136,13 @@ namespace lua::script
|
||||
}
|
||||
else
|
||||
{
|
||||
big::g_script_mgr.remove_script(big::script::get_current());
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
job_name);
|
||||
|
||||
const auto registered_script = big::g_script_mgr.add_script(std::move(lua_script));
|
||||
|
||||
module->m_registered_scripts.push_back(registered_script);
|
||||
module->m_registered_scripts.push_back(std::move(lua_script));
|
||||
}
|
||||
|
||||
void bind(sol::state& state)
|
||||
|
Reference in New Issue
Block a user