diff --git a/src/client/game/ui_scripting/element.hpp b/src/client/game/ui_scripting/element.hpp index ac3855fc..737c3104 100644 --- a/src/client/game/ui_scripting/element.hpp +++ b/src/client/game/ui_scripting/element.hpp @@ -1,5 +1,6 @@ #pragma once #include "game/game.hpp" +#include "value.hpp" namespace ui_scripting { @@ -75,7 +76,7 @@ namespace ui_scripting alignment horzalign = alignment::start; alignment vertalign = alignment::start; - std::unordered_map attributes = {}; + std::unordered_map attributes = {}; std::string font = "default"; std::string material = "white"; std::string border_material = "white"; diff --git a/src/client/game/ui_scripting/event.hpp b/src/client/game/ui_scripting/event.hpp new file mode 100644 index 00000000..ae94311a --- /dev/null +++ b/src/client/game/ui_scripting/event.hpp @@ -0,0 +1,12 @@ +#pragma once +#include "value.hpp" + +namespace ui_scripting +{ + struct event + { + std::string name; + const void* element{}; + arguments arguments; + }; +} diff --git a/src/client/game/ui_scripting/execution.cpp b/src/client/game/ui_scripting/execution.cpp index 28235307..3ef7c8cb 100644 --- a/src/client/game/ui_scripting/execution.cpp +++ b/src/client/game/ui_scripting/execution.cpp @@ -1,4 +1,5 @@ #include +#include "value.hpp" #include "execution.hpp" #include "component/ui_scripting.hpp" diff --git a/src/client/game/ui_scripting/execution.hpp b/src/client/game/ui_scripting/execution.hpp index 4f08416f..e6ffc910 100644 --- a/src/client/game/ui_scripting/execution.hpp +++ b/src/client/game/ui_scripting/execution.hpp @@ -3,7 +3,5 @@ namespace ui_scripting { - using value = std::variant; - using arguments = std::vector; value call(const std::string& name, const arguments& arguments); } diff --git a/src/client/game/ui_scripting/lua/context.cpp b/src/client/game/ui_scripting/lua/context.cpp index 3d95fd0e..39ce10b9 100644 --- a/src/client/game/ui_scripting/lua/context.cpp +++ b/src/client/game/ui_scripting/lua/context.cpp @@ -2,6 +2,7 @@ #include "context.hpp" #include "error.hpp" #include "../../scripting/execution.hpp" +#include "../value.hpp" #include "../execution.hpp" #include "../../../component/ui_scripting.hpp" @@ -504,18 +505,17 @@ namespace ui_scripting::lua for (auto arg : va) { - if (arg.get_type() == sol::type::number) + if (arg.is()) { - event.arguments.push_back(arg.as()); + event.arguments.push_back(arg.as()); } - - if (arg.get_type() == sol::type::string) + else { - event.arguments.push_back(arg.as()); + event.arguments.push_back({}); } } - handler.dispatch(event); + lua::engine::notify(event); }; element_type["hidden"] = sol::property( @@ -529,7 +529,7 @@ namespace ui_scripting::lua } ); - element_type[sol::meta_function::new_index] = [](element& element, const std::string& attribute, const std::string& value) + element_type[sol::meta_function::new_index] = [](element& element, const std::string& attribute, const value& value) { element.attributes[attribute] = value; }; @@ -579,18 +579,17 @@ namespace ui_scripting::lua for (auto arg : va) { - if (arg.get_type() == sol::type::number) + if (arg.is()) { - event.arguments.push_back(arg.as()); + event.arguments.push_back(arg.as()); } - - if (arg.get_type() == sol::type::string) + else { - event.arguments.push_back(arg.as()); + event.arguments.push_back({}); } } - handler.dispatch(event); + lua::engine::notify(event); }; menu_type["addchild"] = [](const sol::this_state s, menu& menu, element& element) @@ -656,7 +655,7 @@ namespace ui_scripting::lua menu.close(); }; - menu_type["getelement"] = [](menu& menu, const sol::this_state s, const std::string& value, const std::string& attribute) + menu_type["getelement"] = [](menu& menu, const sol::this_state s, const value& value, const std::string& attribute) { for (const auto& element : menu.children) { @@ -671,7 +670,7 @@ namespace ui_scripting::lua menu_type["getelements"] = sol::overload ( - [](menu& menu, const sol::this_state s, const std::string& value, const std::string& attribute) + [](menu& menu, const sol::this_state s, const value& value, const std::string& attribute) { auto result = sol::table::create(s.lua_state()); @@ -714,7 +713,7 @@ namespace ui_scripting::lua return sol::lua_value{s, &menus[name]}; }; - game_type["getelement"] = [](const game&, const sol::this_state s, const std::string& value, const std::string& attribute) + game_type["getelement"] = [](const game&, const sol::this_state s, const value& value, const std::string& attribute) { for (const auto& element : elements) { @@ -729,7 +728,7 @@ namespace ui_scripting::lua game_type["getelements"] = sol::overload ( - [](const game&, const sol::this_state s, const std::string& value, const std::string& attribute) + [](const game&, const sol::this_state s, const value& value, const std::string& attribute) { auto result = sol::table::create(s.lua_state()); @@ -954,6 +953,11 @@ namespace ui_scripting::lua ::game::Dvar_SetCommand(hash, "", string_value.data()); }; + game_type["playsound"] = [](const game&, const std::string& sound) + { + ::game::UI_PlayLocalSoundAlias(0, sound.data()); + }; + game_type["getwindowsize"] = [](const game&, const sol::this_state s) { const auto size = ::game::ScrPlace_GetViewPlacement()->realViewportSize; diff --git a/src/client/game/ui_scripting/lua/context.hpp b/src/client/game/ui_scripting/lua/context.hpp index 7a45e4f3..99a196c2 100644 --- a/src/client/game/ui_scripting/lua/context.hpp +++ b/src/client/game/ui_scripting/lua/context.hpp @@ -1,5 +1,8 @@ #pragma once +#include "../event.hpp" +#include "../menu.hpp" + #pragma warning(push) #pragma warning(disable: 4702) @@ -7,8 +10,7 @@ #define SOL_PRINT_ERRORS 0 #include -#include "../menu.hpp" -#include "event.hpp" +#include "engine.hpp" #include "scheduler.hpp" #include "event_handler.hpp" diff --git a/src/client/game/ui_scripting/lua/engine.cpp b/src/client/game/ui_scripting/lua/engine.cpp index 10339924..dd21ba87 100644 --- a/src/client/game/ui_scripting/lua/engine.cpp +++ b/src/client/game/ui_scripting/lua/engine.cpp @@ -9,8 +9,6 @@ namespace ui_scripting::lua::engine { - void notify(const event& e); - namespace { float screen_max[2]; diff --git a/src/client/game/ui_scripting/lua/engine.hpp b/src/client/game/ui_scripting/lua/engine.hpp index f8f6b032..8616d6f5 100644 --- a/src/client/game/ui_scripting/lua/engine.hpp +++ b/src/client/game/ui_scripting/lua/engine.hpp @@ -1,5 +1,7 @@ #pragma once +#include "../event.hpp" + namespace ui_scripting::lua::engine { void start(); @@ -9,5 +11,6 @@ namespace ui_scripting::lua::engine void open_menu(const std::string& name); void ui_event(const std::string&, const std::vector&); + void notify(const event& e); void run_frame(); } diff --git a/src/client/game/ui_scripting/lua/event.hpp b/src/client/game/ui_scripting/lua/event.hpp deleted file mode 100644 index 54f79b3a..00000000 --- a/src/client/game/ui_scripting/lua/event.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "context.hpp" - -namespace ui_scripting::lua -{ - struct event - { - std::string name; - const void* element{}; - std::vector> arguments; - }; -} diff --git a/src/client/game/ui_scripting/lua/event_handler.cpp b/src/client/game/ui_scripting/lua/event_handler.cpp index 727a92dd..e7603c0a 100644 --- a/src/client/game/ui_scripting/lua/event_handler.cpp +++ b/src/client/game/ui_scripting/lua/event_handler.cpp @@ -1,7 +1,6 @@ #include "std_include.hpp" #include "context.hpp" #include "error.hpp" -#include "../../scripting/lua/value_conversion.hpp" #include "event_handler.hpp" @@ -168,20 +167,14 @@ namespace ui_scripting::lua for (const auto& argument : event.arguments) { - const auto index = argument.index(); - - if (index == 0) + if (argument.index() > 0) { - const sol::lua_value value = {this->state_, std::get(argument)}; - arguments.emplace_back(value); + arguments.emplace_back(argument); } - - if (index == 1) + else { - const sol::lua_value value = {this->state_, std::get(argument)}; - arguments.emplace_back(value); + arguments.emplace_back(sol::lua_value{this->state_, sol::lua_nil}); } - } return arguments; diff --git a/src/client/game/ui_scripting/value.hpp b/src/client/game/ui_scripting/value.hpp new file mode 100644 index 00000000..12d88485 --- /dev/null +++ b/src/client/game/ui_scripting/value.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace ui_scripting +{ + using value = std::variant; + using arguments = std::vector; +}