This commit is contained in:
Federico Cecchetto 2021-12-13 03:05:22 +01:00
parent e918bdf28f
commit 0ac5225114
7 changed files with 48 additions and 26 deletions

View File

@ -1,4 +1,6 @@
#pragma once #pragma once
#include "game/scripting/array.hpp"
#include "game/scripting/execution.hpp"
namespace gsc namespace gsc
{ {

View File

@ -2,12 +2,6 @@
#include "loader/component_loader.hpp" #include "loader/component_loader.hpp"
#include "scheduler.hpp" #include "scheduler.hpp"
#include "game/scripting/event.hpp"
#include "game/scripting/execution.hpp"
#include "game/scripting/functions.hpp"
#include "game/scripting/array.hpp"
#include "gsc.hpp" #include "gsc.hpp"
#include "json.hpp" #include "json.hpp"

View File

@ -2,12 +2,6 @@
#include "loader/component_loader.hpp" #include "loader/component_loader.hpp"
#include "scheduler.hpp" #include "scheduler.hpp"
#include "game/scripting/event.hpp"
#include "game/scripting/execution.hpp"
#include "game/scripting/functions.hpp"
#include "game/scripting/array.hpp"
#include "gsc.hpp" #include "gsc.hpp"
#include "json.hpp" #include "json.hpp"

View File

@ -1,14 +1,15 @@
#include <stdinc.hpp> #include <stdinc.hpp>
#include "loader/component_loader.hpp" #include "loader/component_loader.hpp"
#include "scheduler.hpp"
#include "game/scripting/entity.hpp" #include "scheduler.hpp"
#include "game/scripting/execution.hpp" #include "gsc.hpp"
#include "scripting.hpp"
namespace notifies namespace notifies
{ {
namespace namespace
{ {
std::vector<scripting::function> say_callbacks;
utils::hook::detour client_command_hook; utils::hook::detour client_command_hook;
void client_command_stub(int clientNum) void client_command_stub(int clientNum)
@ -17,19 +18,28 @@ namespace notifies
game::SV_Cmd_ArgvBuffer(0, cmd, 1024); game::SV_Cmd_ArgvBuffer(0, cmd, 1024);
auto hidden = false;
if (cmd == "say"s || cmd == "say_team"s) if (cmd == "say"s || cmd == "say_team"s)
{ {
std::string message = game::ConcatArgs(1); std::string message = game::ConcatArgs(1);
message.erase(0, 1); message.erase(0, 1);
const scripting::entity level{*game::levelEntityId}; for (const auto& callback : say_callbacks)
const auto player = scripting::call("getEntByNum", {clientNum}).as<scripting::entity>(); {
const auto entity_id = game::Scr_GetEntityId(clientNum, 0);
const auto result = callback(entity_id, {message, cmd == "say_team"s});
scripting::notify(level, cmd, {player, message}); if (result.is<int>())
scripting::notify(player, cmd, {message}); {
hidden = result.as<int>() == 0;
}
}
} }
return client_command_hook.invoke<void>(clientNum); if (!hidden)
{
client_command_hook.invoke<void>(clientNum);
}
} }
} }
@ -39,6 +49,18 @@ namespace notifies
void post_unpack() override void post_unpack() override
{ {
client_command_hook.create(0x502CB0, client_command_stub); client_command_hook.create(0x502CB0, client_command_stub);
scripting::on_shutdown([]()
{
say_callbacks.clear();
});
gsc::function::add("onplayersay", [](const gsc::function_args& args) -> scripting::script_value
{
const auto function = args[0].as<scripting::function>();
say_callbacks.push_back(function);
return {};
});
} }
}; };
} }

View File

@ -29,6 +29,8 @@ namespace scripting
std::string current_file; std::string current_file;
std::vector<std::function<void()>> shutdown_callbacks;
void vm_notify_stub(const unsigned int notify_list_owner_id, const unsigned int string_value, void vm_notify_stub(const unsigned int notify_list_owner_id, const unsigned int string_value,
game::VariableValue* top) game::VariableValue* top)
{ {
@ -77,6 +79,13 @@ namespace scripting
{ {
userinfo::clear_overrides(); userinfo::clear_overrides();
command::clear_script_commands(); command::clear_script_commands();
for (const auto& callback : shutdown_callbacks)
{
callback();
}
shutdown_callbacks = {};
g_shutdown_game_hook.invoke<void>(free_scripts); g_shutdown_game_hook.invoke<void>(free_scripts);
} }
@ -106,6 +115,11 @@ namespace scripting
} }
} }
void on_shutdown(const std::function<void()>& callback)
{
shutdown_callbacks.push_back(callback);
}
class component final : public component_interface class component final : public component_interface
{ {
public: public:

View File

@ -4,4 +4,6 @@ namespace scripting
{ {
extern std::unordered_map<int, std::unordered_map<std::string, int>> fields_table; extern std::unordered_map<int, std::unordered_map<std::string, int>> fields_table;
extern std::unordered_map<std::string, std::unordered_map<std::string, const char*>> script_function_table; extern std::unordered_map<std::string, std::unordered_map<std::string, const char*>> script_function_table;
void on_shutdown(const std::function<void()>& callback);
} }

View File

@ -2,12 +2,6 @@
#include "loader/component_loader.hpp" #include "loader/component_loader.hpp"
#include "scheduler.hpp" #include "scheduler.hpp"
#include "game/scripting/event.hpp"
#include "game/scripting/execution.hpp"
#include "game/scripting/functions.hpp"
#include "game/scripting/array.hpp"
#include "gsc.hpp" #include "gsc.hpp"
namespace userinfo namespace userinfo