diff --git a/src/client/game/scripting/execution.cpp b/src/client/game/scripting/execution.cpp index 824bb671..aa4dff60 100644 --- a/src/client/game/scripting/execution.cpp +++ b/src/client/game/scripting/execution.cpp @@ -144,7 +144,7 @@ namespace scripting throw std::runtime_error("File '" + filename + "' not found"); }; - const auto functions = scripting::script_function_table[filename]; + const auto& functions = scripting::script_function_table[filename]; if (functions.find(function) == functions.end()) { throw std::runtime_error("Function '" + function + "' in file '" + filename + "' not found"); diff --git a/src/client/game/scripting/execution.hpp b/src/client/game/scripting/execution.hpp index e63019ff..38fcbfd0 100644 --- a/src/client/game/scripting/execution.hpp +++ b/src/client/game/scripting/execution.hpp @@ -3,6 +3,7 @@ #include "entity.hpp" #include "array.hpp" #include "animation.hpp" +#include "function.hpp" #include "script_value.hpp" namespace scripting diff --git a/src/client/game/scripting/function.cpp b/src/client/game/scripting/function.cpp new file mode 100644 index 00000000..0a620dd5 --- /dev/null +++ b/src/client/game/scripting/function.cpp @@ -0,0 +1,17 @@ +#include +#include "array.hpp" +#include "script_value.hpp" +#include "execution.hpp" + +namespace scripting +{ + function_ptr::function_ptr(const std::string& file, const std::string& name) + { + this->pos_ = get_function_pos(file, name); + } + + const char* function_ptr::get_pos() const + { + return this->pos_; + } +} diff --git a/src/client/game/scripting/function.hpp b/src/client/game/scripting/function.hpp new file mode 100644 index 00000000..873381c8 --- /dev/null +++ b/src/client/game/scripting/function.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "game/game.hpp" +#include "script_value.hpp" + +namespace scripting +{ + class function_ptr final + { + public: + function_ptr(const std::string& file, const std::string& name); + + const char* get_pos() const; + private: + const char* pos_; + }; +} diff --git a/src/client/game/scripting/lua/context.cpp b/src/client/game/scripting/lua/context.cpp index b16c4dfd..1d736821 100644 --- a/src/client/game/scripting/lua/context.cpp +++ b/src/client/game/scripting/lua/context.cpp @@ -776,6 +776,14 @@ namespace scripting::lua { scripting::get_dvar_int_overrides.erase(dvar); }; + + auto function_ptr_type = state.new_usertype("functionptr", + sol::constructors()); + + function_ptr_type["getpos"] = [](const function_ptr& ptr) + { + return reinterpret_cast(ptr.get_pos()); + }; } } diff --git a/src/client/game/scripting/lua/value_conversion.cpp b/src/client/game/scripting/lua/value_conversion.cpp index 35049d7c..c3a76b09 100644 --- a/src/client/game/scripting/lua/value_conversion.cpp +++ b/src/client/game/scripting/lua/value_conversion.cpp @@ -272,6 +272,11 @@ namespace scripting::lua return {value.as()}; } + if (value.is()) + { + return {value.as()}; + } + if (value.is()) { return convert_function(value); diff --git a/src/client/game/scripting/script_value.cpp b/src/client/game/scripting/script_value.cpp index be2d993f..502798ae 100644 --- a/src/client/game/scripting/script_value.cpp +++ b/src/client/game/scripting/script_value.cpp @@ -113,6 +113,15 @@ namespace scripting this->value_ = variable; } + script_value::script_value(const function_ptr& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_FUNCTION; + variable.u.codePosValue = value.get_pos(); + + this->value_ = variable; + } + /*************************************************************** * Integer **************************************************************/ diff --git a/src/client/game/scripting/script_value.hpp b/src/client/game/scripting/script_value.hpp index 9bb08b36..5719516e 100644 --- a/src/client/game/scripting/script_value.hpp +++ b/src/client/game/scripting/script_value.hpp @@ -3,6 +3,7 @@ #include "variable_value.hpp" #include "vector.hpp" #include "animation.hpp" +#include "function.hpp" namespace scripting { @@ -31,6 +32,7 @@ namespace scripting script_value(const vector& value); script_value(const animation& value); + script_value(const function_ptr& value); template bool is() const;