lua: sub folders support, check for .lua file extension, refactor and simplify internals. (#1775)

This commit is contained in:
Quentin
2023-07-22 13:05:43 +02:00
committed by GitHub
parent 093abc72da
commit fa8043be2a
15 changed files with 288 additions and 300 deletions

View File

@ -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>();

View File

@ -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)

View File

@ -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);

View File

@ -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;
});

View File

@ -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;
}

View File

@ -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)