This commit is contained in:
alice
2026-07-27 03:57:20 +02:00
parent 933192724a
commit befebc4b6e
17 changed files with 88 additions and 99 deletions
+19 -22
View File
@@ -6,7 +6,6 @@
#include "game/scripting/event.hpp" #include "game/scripting/event.hpp"
#include "game/scripting/execution.hpp" #include "game/scripting/execution.hpp"
#include "game/scripting/functions.hpp"
#include "game/scripting/array.hpp" #include "game/scripting/array.hpp"
#include "game/scripting/function.hpp" #include "game/scripting/function.hpp"
@@ -16,19 +15,6 @@ namespace gsc
{ {
namespace namespace
{ {
function_args get_arguments()
{
std::vector<scripting::script_value> args;
for (auto i = 0; i < game::scr_VmPub->outparamcount; i++)
{
const auto value = game::scr_VmPub->top[-i];
args.push_back(value);
}
return args;
}
void return_value(const scripting::script_value& value) void return_value(const scripting::script_value& value)
{ {
if (game::scr_VmPub->outparamcount) if (game::scr_VmPub->outparamcount)
@@ -108,8 +94,8 @@ namespace gsc
return scr_set_object_field_hook.invoke<void>(classnum, entnum, offset); return scr_set_object_field_hook.invoke<void>(classnum, entnum, offset);
} }
const auto args = get_arguments(); function_args args;
try try
{ {
field->setter(entnum, args[0]); field->setter(entnum, args[0]);
@@ -141,7 +127,8 @@ namespace gsc
{ {
try try
{ {
const auto result = function.operator()(get_arguments()); function_args args;
const auto result = function.operator()(args);
const auto type = result.get_raw().type; const auto type = result.get_raw().type;
if (type) if (type)
@@ -159,7 +146,8 @@ namespace gsc
{ {
try try
{ {
const auto result = method.operator()(ent, get_arguments()); function_args args;
const auto result = method.operator()(ent, args);
const auto type = result.get_raw().type; const auto type = result.get_raw().type;
if (type) if (type)
@@ -188,22 +176,31 @@ namespace gsc
} }
} }
function_args::function_args(std::vector<scripting::script_value> values) function_args::function_args()
{
for (auto i = 0u; i < game::scr_VmPub->outparamcount; i++)
{
const auto value = game::scr_VmPub->top[-i];
this->values_.emplace_back(value);
}
}
function_args::function_args(const std::vector<scripting::script_value>& values)
: values_(values) : values_(values)
{ {
} }
unsigned int function_args::size() const std::uint32_t function_args::size() const
{ {
return this->values_.size(); return this->values_.size();
} }
std::vector<scripting::script_value> function_args::get_raw() const const std::vector<scripting::script_value>& function_args::get_raw() const
{ {
return this->values_; return this->values_;
} }
scripting::value_wrap function_args::get(const int index) const scripting::value_wrap function_args::get(const std::uint32_t index) const
{ {
if (index >= this->values_.size()) if (index >= this->values_.size())
{ {
+6 -5
View File
@@ -26,13 +26,14 @@ namespace gsc
class function_args class function_args
{ {
public: public:
function_args(std::vector<scripting::script_value>); function_args();
function_args(const std::vector<scripting::script_value>&);
unsigned int size() const; std::uint32_t size() const;
std::vector<scripting::script_value> get_raw() const; const std::vector<scripting::script_value>& get_raw() const;
scripting::value_wrap get(const int index) const; scripting::value_wrap get(const std::uint32_t index) const;
scripting::value_wrap operator[](const int index) const scripting::value_wrap operator[](const std::uint32_t index) const
{ {
return this->get(index); return this->get(index);
} }
+4 -2
View File
@@ -102,7 +102,8 @@ namespace io
}); });
}); });
gsc::function::add("jsonprint", [](const gsc::function_args& args) -> scripting::script_value gsc::function::add("jsonprint", [](const gsc::function_args& args)
-> scripting::script_value
{ {
std::string buffer; std::string buffer;
@@ -189,7 +190,8 @@ namespace io
return scripting::script_value{}; return scripting::script_value{};
}); });
gsc::function::add("httpget", [](const gsc::function_args& args) -> scripting::script_value gsc::function::add("httpget", [](const gsc::function_args& args)
-> scripting::script_value
{ {
const auto url = args[0].as<std::string>(); const auto url = args[0].as<std::string>();
const auto object = scripting::entity(scripting::make_object()); const auto object = scripting::entity(scripting::make_object());
+2 -1
View File
@@ -20,7 +20,8 @@ namespace json
auto string_indexed = -1; auto string_indexed = -1;
const auto keys = array.get_keys(); const auto keys = array.get_keys();
for (auto i = 0; i < keys.size(); i++)
for (auto i = 0u; i < keys.size(); i++)
{ {
const auto is_int = keys[i].is<int>(); const auto is_int = keys[i].is<int>();
const auto is_string = keys[i].is<std::string>(); const auto is_string = keys[i].is<std::string>();
-1
View File
@@ -7,7 +7,6 @@
#include "game/scripting/event.hpp" #include "game/scripting/event.hpp"
#include "game/scripting/execution.hpp" #include "game/scripting/execution.hpp"
#include "game/scripting/functions.hpp"
#include "gsc.hpp" #include "gsc.hpp"
+1 -1
View File
@@ -3,4 +3,4 @@
namespace scripting namespace scripting
{ {
void on_shutdown(const std::function<void()>& callback); void on_shutdown(const std::function<void()>& callback);
} }
+19 -15
View File
@@ -7,23 +7,23 @@
namespace userinfo namespace userinfo
{ {
using userinfo_map = std::unordered_map<std::string, std::string>; using userinfo_map = std::unordered_map<std::string, std::string>;
std::unordered_map<int, userinfo_map> userinfo_overrides; std::array<userinfo_map, 18> userinfo_overrides;
namespace namespace
{ {
utils::hook::detour sv_getuserinfo_hook; utils::hook::detour sv_getuserinfo_hook;
userinfo_map userinfo_to_map(std::string userinfo) userinfo_map userinfo_to_map(const char* userinfo)
{ {
userinfo_map map{}; userinfo_map map{};
if (userinfo[0] == '\\') if (userinfo[0] == '\\')
{ {
userinfo = userinfo.substr(1); ++userinfo;
} }
const auto args = utils::string::split(userinfo, '\\'); const auto args = utils::string::split(userinfo, '\\');
for (size_t i = 0; !args.empty() && i < (args.size() - 1); i += 2) for (auto i = 0u; !args.empty() && i < (args.size() - 1); i += 2)
{ {
map[args[i]] = args[i + 1]; map[args[i]] = args[i + 1];
} }
@@ -49,12 +49,8 @@ namespace userinfo
void sv_getuserinfo_stub(int index, char* buffer, int bufferSize) void sv_getuserinfo_stub(int index, char* buffer, int bufferSize)
{ {
sv_getuserinfo_hook.invoke<void>(index, buffer, bufferSize); sv_getuserinfo_hook.invoke<void>(index, buffer, bufferSize);
auto map = userinfo_to_map(buffer);
if (userinfo_overrides.find(index) == userinfo_overrides.end()) auto map = userinfo_to_map(buffer);
{
userinfo_overrides[index] = {};
}
for (const auto& values : userinfo_overrides[index]) for (const auto& values : userinfo_overrides[index])
{ {
@@ -80,7 +76,10 @@ namespace userinfo
void clear_overrides() void clear_overrides()
{ {
userinfo_overrides.clear(); for (auto& entry : userinfo_overrides)
{
entry.clear();
}
} }
class component final : public component_interface class component final : public component_interface
@@ -93,7 +92,8 @@ namespace userinfo
plugin->get_interface()->callbacks()->on_player_connect(clear_client_overrides); plugin->get_interface()->callbacks()->on_player_connect(clear_client_overrides);
plugin->get_interface()->callbacks()->on_player_disconnect(clear_client_overrides); plugin->get_interface()->callbacks()->on_player_disconnect(clear_client_overrides);
gsc::method::add("setname", [](const game::scr_entref_t ent, const gsc::function_args& args) -> scripting::script_value gsc::method::add("setname", [](const game::scr_entref_t ent, const gsc::function_args& args)
-> scripting::script_value
{ {
if (ent.classnum != 0) if (ent.classnum != 0)
{ {
@@ -113,7 +113,8 @@ namespace userinfo
return {}; return {};
}); });
gsc::method::add("resetname", [](const game::scr_entref_t ent, const gsc::function_args&) -> scripting::script_value gsc::method::add("resetname", [](const game::scr_entref_t ent, const gsc::function_args&)
-> scripting::script_value
{ {
if (ent.classnum != 0) if (ent.classnum != 0)
{ {
@@ -131,7 +132,8 @@ namespace userinfo
return {}; return {};
}); });
gsc::method::add("setclantag", [](const game::scr_entref_t ent, const gsc::function_args& args) -> scripting::script_value gsc::method::add("setclantag", [](const game::scr_entref_t ent, const gsc::function_args& args)
-> scripting::script_value
{ {
if (ent.classnum != 0) if (ent.classnum != 0)
{ {
@@ -153,7 +155,8 @@ namespace userinfo
return {}; return {};
}); });
gsc::method::add("resetclantag", [](const game::scr_entref_t ent, const gsc::function_args&) -> scripting::script_value gsc::method::add("resetclantag", [](const game::scr_entref_t ent, const gsc::function_args&)
-> scripting::script_value
{ {
if (ent.classnum != 0) if (ent.classnum != 0)
{ {
@@ -173,7 +176,8 @@ namespace userinfo
return {}; return {};
}); });
gsc::method::add("removeclantag", [](const game::scr_entref_t ent, const gsc::function_args&) -> scripting::script_value gsc::method::add("removeclantag", [](const game::scr_entref_t ent, const gsc::function_args&)
-> scripting::script_value
{ {
if (ent.classnum != 0) if (ent.classnum != 0)
{ {
+1 -2
View File
@@ -2,6 +2,5 @@
namespace userinfo namespace userinfo
{ {
void clear_client_overrides(int client);
void clear_overrides(); void clear_overrides();
} }
+21 -20
View File
@@ -15,30 +15,30 @@ namespace scripting
} }
const auto value = game::scr_VarGlob->childVariableValue[this->id_ + 0xC800 * (this->parent_id_ & 1)]; const auto value = game::scr_VarGlob->childVariableValue[this->id_ + 0xC800 * (this->parent_id_ & 1)];
game::VariableValue variable; game::VariableValue variable{};
variable.u = value.u.u; variable.u = value.u.u;
variable.type = (game::scriptType_e)value.type; variable.type = (game::scriptType_e)value.type;
this->value_ = variable; this->value_ = variable;
} }
void array_value::operator=(const script_value& _value) void array_value::operator=(const script_value& value)
{ {
if (!this->id_) if (!this->id_)
{ {
return; return;
} }
const auto value = _value.get_raw(); const auto& value_raw = value.get_raw();
const auto variable = &game::scr_VarGlob->childVariableValue[this->id_ + 0xC800 * (this->parent_id_ & 1)]; const auto variable = &game::scr_VarGlob->childVariableValue[this->id_ + 0xC800 * (this->parent_id_ & 1)];
game::AddRefToValue(value.type, value.u); game::AddRefToValue(value_raw.type, value_raw.u);
game::RemoveRefToValue(variable->type, variable->u.u); game::RemoveRefToValue(variable->type, variable->u.u);
variable->type = value.type; variable->type = value_raw.type;
variable->u.u = value.u; variable->u.u = value_raw.u;
this->value_ = value; this->value_ = value_raw;
} }
array::array(const unsigned int id) array::array(const unsigned int id)
@@ -170,7 +170,7 @@ namespace scripting
return game::Scr_GetSelf(this->id_); return game::Scr_GetSelf(this->id_);
} }
unsigned int array::push(script_value value) const unsigned int array::push(const script_value& value) const
{ {
this->set(this->size(), value); this->set(this->size(), value);
return this->size(); return this->size();
@@ -225,7 +225,7 @@ namespace scripting
} }
const auto value = game::scr_VarGlob->childVariableValue[variable_id + 0xC800 * (this->id_ & 1)]; const auto value = game::scr_VarGlob->childVariableValue[variable_id + 0xC800 * (this->id_ & 1)];
game::VariableValue variable; game::VariableValue variable{};
variable.u = value.u.u; variable.u = value.u.u;
variable.type = (game::scriptType_e)value.type; variable.type = (game::scriptType_e)value.type;
@@ -242,7 +242,7 @@ namespace scripting
} }
const auto value = game::scr_VarGlob->childVariableValue[variable_id + 0xC800 * (this->id_ & 1)]; const auto value = game::scr_VarGlob->childVariableValue[variable_id + 0xC800 * (this->id_ & 1)];
game::VariableValue variable; game::VariableValue variable{};
variable.u = value.u.u; variable.u = value.u.u;
variable.type = (game::scriptType_e)value.type; variable.type = (game::scriptType_e)value.type;
@@ -261,9 +261,9 @@ namespace scripting
} }
} }
void array::set(const std::string& key, const script_value& value_) const void array::set(const std::string& key, const script_value& value) const
{ {
const auto value = value_.get_raw(); const auto& value_raw = value.get_raw();
const auto variable_id = this->get_value_id(key); const auto variable_id = this->get_value_id(key);
if (!variable_id) if (!variable_id)
@@ -273,16 +273,16 @@ namespace scripting
const auto variable = &game::scr_VarGlob->childVariableValue[variable_id + 0xC800 * (this->id_ & 1)]; const auto variable = &game::scr_VarGlob->childVariableValue[variable_id + 0xC800 * (this->id_ & 1)];
game::AddRefToValue(value.type, value.u); game::AddRefToValue(value_raw.type, value_raw.u);
game::RemoveRefToValue(variable->type, variable->u.u); game::RemoveRefToValue(variable->type, variable->u.u);
variable->type = value.type; variable->type = value_raw.type;
variable->u.u = value.u; variable->u.u = value_raw.u;
} }
void array::set(const unsigned int index, const script_value& value_) const void array::set(const unsigned int index, const script_value& value) const
{ {
const auto value = value_.get_raw(); const auto& value_raw = value.get_raw();
const auto variable_id = this->get_value_id(index); const auto variable_id = this->get_value_id(index);
if (!variable_id) if (!variable_id)
@@ -292,11 +292,11 @@ namespace scripting
const auto variable = &game::scr_VarGlob->childVariableValue[variable_id + 0xC800 * (this->id_ & 1)]; const auto variable = &game::scr_VarGlob->childVariableValue[variable_id + 0xC800 * (this->id_ & 1)];
game::AddRefToValue(value.type, value.u); game::AddRefToValue(value_raw.type, value_raw.u);
game::RemoveRefToValue(variable->type, variable->u.u); game::RemoveRefToValue(variable->type, variable->u.u);
variable->type = value.type; variable->type = value_raw.type;
variable->u.u = value.u; variable->u.u = value_raw.u;
} }
unsigned int array::get_entity_id() const unsigned int array::get_entity_id() const
@@ -320,6 +320,7 @@ namespace scripting
unsigned int array::get_value_id(const unsigned int index) const unsigned int array::get_value_id(const unsigned int index) const
{ {
const auto variable_id = game::FindVariable(this->id_, (index - 0x800000) & 0xFFFFFF); const auto variable_id = game::FindVariable(this->id_, (index - 0x800000) & 0xFFFFFF);
if (!variable_id) if (!variable_id)
{ {
return game::GetNewArrayVariable(this->id_, index); return game::GetNewArrayVariable(this->id_, index);
+3 -3
View File
@@ -34,7 +34,7 @@ namespace scripting
std::vector<script_value> get_keys() const; std::vector<script_value> get_keys() const;
unsigned int size() const; unsigned int size() const;
unsigned int push(script_value) const; unsigned int push(const script_value&) const;
void erase(const unsigned int) const; void erase(const unsigned int) const;
void erase(const std::string&) const; void erase(const std::string&) const;
script_value pop() const; script_value pop() const;
@@ -69,12 +69,12 @@ namespace scripting
{ {
if (key.is<I>()) if (key.is<I>())
{ {
return { this->id_, this->get_value_id(key.as<I>()) }; return {this->id_, this->get_value_id(key.as<I>())};
} }
if (key.is<S>()) if (key.is<S>())
{ {
return { this->id_, this->get_value_id(key.as<S>()) }; return {this->id_, this->get_value_id(key.as<S>())};
} }
} }
+2 -3
View File
@@ -11,10 +11,9 @@ namespace scripting
script_value function::get_raw() const script_value function::get_raw() const
{ {
game::VariableValue value; game::VariableValue value{};
value.type = game::SCRIPT_FUNCTION; value.type = game::SCRIPT_FUNCTION;
value.u.codePosValue = this->pos_; value.u.codePosValue = this->pos_;
return value; return value;
} }
@@ -23,7 +22,7 @@ namespace scripting
return this->pos_; return this->pos_;
} }
script_value function::call(const entity& self, std::vector<script_value> arguments) const script_value function::call(const entity& self, const std::vector<script_value>& arguments) const
{ {
return exec_ent_thread(self, this->pos_, arguments); return exec_ent_thread(self, this->pos_, arguments);
} }
+5 -3
View File
@@ -12,14 +12,14 @@ namespace scripting
script_value get_raw() const; script_value get_raw() const;
const char* get_pos() const; const char* get_pos() const;
script_value call(const entity& self, std::vector<script_value> arguments) const; script_value call(const entity& self, const std::vector<script_value>& arguments) const;
script_value operator()(const entity& self, std::vector<script_value> arguments) const script_value operator()(const entity& self, const std::vector<script_value>& arguments) const
{ {
return this->call(self, arguments); return this->call(self, arguments);
} }
script_value operator()(std::vector<script_value> arguments) const script_value operator()(const std::vector<script_value>& arguments) const
{ {
return this->call(*game::levelEntityId, arguments); return this->call(*game::levelEntityId, arguments);
} }
@@ -28,7 +28,9 @@ namespace scripting
{ {
return this->call(*game::levelEntityId, {}); return this->call(*game::levelEntityId, {});
} }
private: private:
const char* pos_; const char* pos_;
}; };
} }
-9
View File
@@ -1,9 +0,0 @@
#include <stdinc.hpp>
#include "functions.hpp"
#include <utils/string.hpp>
namespace scripting
{
}
-7
View File
@@ -1,7 +0,0 @@
#pragma once
#include "game/game.hpp"
namespace scripting
{
using script_function = void(*)(game::scr_entref_t);
}
+1 -1
View File
@@ -321,7 +321,7 @@ namespace scripting
return this->value_.get(); return this->value_.get();
} }
value_wrap::value_wrap(const scripting::script_value& value, int argument_index) value_wrap::value_wrap(const scripting::script_value& value, const std::uint32_t argument_index)
: value_(value) : value_(value)
, argument_index_(argument_index) , argument_index_(argument_index)
{ {
+3 -3
View File
@@ -164,7 +164,7 @@ namespace scripting
class value_wrap class value_wrap
{ {
public: public:
value_wrap(const scripting::script_value& value, int argument_index); value_wrap(const scripting::script_value& value, const std::uint32_t);
template <typename T> template <typename T>
T as() const T as() const
@@ -179,7 +179,7 @@ namespace scripting
} }
} }
template <typename T, typename I = int> template <typename T>
T* as_ptr() T* as_ptr()
{ {
try try
@@ -203,7 +203,7 @@ namespace scripting
return this->value_.get_raw(); return this->value_.get_raw();
} }
int argument_index_{}; std::uint32_t argument_index_{};
scripting::script_value value_; scripting::script_value value_;
}; };
} }
+1 -1
View File
@@ -26,6 +26,6 @@ namespace scripting
void set_z(float value); void set_z(float value);
private: private:
game::vec3_t value_{ 0 }; game::vec3_t value_{};
}; };
} }