Skip to content

Commit d636e42

Browse files
committed
fix(events): Encoder + UM Crash
1 parent da7c71b commit d636e42

File tree

13 files changed

+155
-273
lines changed

13 files changed

+155
-273
lines changed

src/encoders/msgpack.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include "msgpack.h"
2+
#include <public/tier0/platform.h>
3+
4+
namespace encoders {
5+
namespace msgpack {
6+
7+
std::string emptyData = "";
8+
bool setEmptyData = false;
9+
10+
std::string SerializeToString(std::vector<std::any> v)
11+
{
12+
if (v.size() <= 0) {
13+
if (!setEmptyData)
14+
{
15+
setEmptyData = true;
16+
17+
std::stringstream ss;
18+
std::vector<::msgpack::object> eventData;
19+
20+
::msgpack::pack(ss, eventData);
21+
emptyData = ss.str();
22+
}
23+
24+
return emptyData;
25+
}
26+
27+
std::stringstream ss;
28+
std::vector<::msgpack::object> data;
29+
30+
for (auto& value : v)
31+
{
32+
if (value.type() == typeid(const char*))
33+
data.push_back(::msgpack::object(std::any_cast<const char*>(value)));
34+
else if (value.type() == typeid(std::string)) {
35+
::msgpack::sbuffer sbuf;
36+
::msgpack::pack(sbuf, std::any_cast<std::string>(value));
37+
38+
data.push_back(::msgpack::unpack(sbuf.data(), sbuf.size()).get());
39+
}
40+
else if (value.type() == typeid(uint64))
41+
data.push_back(::msgpack::object(std::any_cast<uint64>(value)));
42+
else if (value.type() == typeid(uint32))
43+
data.push_back(::msgpack::object(std::any_cast<uint32>(value)));
44+
else if (value.type() == typeid(unsigned long))
45+
data.push_back(::msgpack::object(std::any_cast<unsigned long>(value)));
46+
else if (value.type() == typeid(uint16))
47+
data.push_back(::msgpack::object(std::any_cast<uint16>(value)));
48+
else if (value.type() == typeid(uint8))
49+
data.push_back(::msgpack::object(std::any_cast<uint8>(value)));
50+
else if (value.type() == typeid(int64))
51+
data.push_back(::msgpack::object(std::any_cast<int64>(value)));
52+
else if (value.type() == typeid(int32))
53+
data.push_back(::msgpack::object(std::any_cast<int32>(value)));
54+
else if (value.type() == typeid(long))
55+
data.push_back(::msgpack::object(std::any_cast<long>(value)));
56+
else if (value.type() == typeid(int16))
57+
data.push_back(::msgpack::object(std::any_cast<int16>(value)));
58+
else if (value.type() == typeid(int8))
59+
data.push_back(::msgpack::object(std::any_cast<int8>(value)));
60+
else if (value.type() == typeid(bool))
61+
data.push_back(::msgpack::object(std::any_cast<bool>(value)));
62+
else if (value.type() == typeid(float))
63+
data.push_back(::msgpack::object(std::any_cast<float>(value)));
64+
else if (value.type() == typeid(double))
65+
data.push_back(::msgpack::object(std::any_cast<double>(value)));
66+
}
67+
68+
::msgpack::pack(ss, data);
69+
70+
return ss.str();
71+
}
72+
};
73+
};

src/encoders/msgpack.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef _encoders_msgpack_h
2+
#define _encoders_msgpack_h
3+
4+
#include <string>
5+
#include <any>
6+
#include <vector>
7+
#include <msgpack.hpp>
8+
9+
namespace encoders {
10+
namespace msgpack {
11+
std::string SerializeToString(std::vector<std::any> v);
12+
};
13+
};
14+
15+
#endif

src/entrypoint.cpp

Lines changed: 9 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
#include <tier1/convar.h>
66
#include <interfaces/interfaces.h>
77
#include <metamod_oslink.h>
8-
#include <msgpack.hpp>
98

109
#include <steam/steam_gameserver.h>
1110

1211
#include "addons/addons.h"
12+
#include "encoders/msgpack.h"
1313
#include "addons/clients.h"
1414
#include "configuration/Configuration.h"
1515
#include "commands/CommandsManager.h"
@@ -271,15 +271,8 @@ void Swiftly::OnLevelInit(char const* pMapName, char const* pMapEntities, char c
271271
g_precacher->SetSoundsPrecached(true);
272272
}
273273

274-
std::stringstream ss;
275-
std::vector<msgpack::object> eventData;
276-
277-
eventData.push_back(msgpack::object(pMapName));
278-
279-
msgpack::pack(ss, eventData);
280-
281274
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
282-
g_pluginManager->ExecuteEvent("core", "OnMapLoad", ss.str(), event);
275+
g_pluginManager->ExecuteEvent("core", "OnMapLoad", encoders::msgpack::SerializeToString({ pMapName }), event);
283276
delete event;
284277

285278
currentMap = pMapName;
@@ -291,15 +284,8 @@ void Swiftly::OnLevelShutdown()
291284
g_translations->LoadTranslations();
292285
g_Config->LoadPluginConfigurations();
293286

294-
std::stringstream ss;
295-
std::vector<msgpack::object> eventData;
296-
297-
eventData.push_back(msgpack::object(currentMap.c_str()));
298-
299-
msgpack::pack(ss, eventData);
300-
301287
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
302-
g_pluginManager->ExecuteEvent("core", "OnMapUnload", ss.str(), event);
288+
g_pluginManager->ExecuteEvent("core", "OnMapUnload", encoders::msgpack::SerializeToString({ currentMap }), event);
303289
delete event;
304290
}
305291

@@ -378,15 +364,7 @@ void Swiftly::Hook_GameFrame(bool simulating, bool bFirstTick, bool bLastTick)
378364
////////////////////////////////////////////////////////////
379365
if (gameFrameCache.bFirstTick != bFirstTick || gameFrameCache.bLastTick != bLastTick || gameFrameCache.simulating != simulating || gameFrameEvent == nullptr)
380366
{
381-
std::stringstream ss;
382-
std::vector<msgpack::object> eventData;
383-
384-
eventData.push_back(msgpack::object(simulating));
385-
eventData.push_back(msgpack::object(bFirstTick));
386-
eventData.push_back(msgpack::object(bLastTick));
387-
388-
msgpack::pack(ss, eventData);
389-
gameFramePack = ss.str();
367+
gameFramePack = encoders::msgpack::SerializeToString({ simulating, bFirstTick, bLastTick });
390368

391369
gameFrameCache.bFirstTick = bFirstTick;
392370
gameFrameCache.bLastTick = bLastTick;
@@ -435,15 +413,8 @@ void Swiftly::Hook_GameFrame(bool simulating, bool bFirstTick, bool bLastTick)
435413

436414
void Swiftly::Hook_ClientDisconnect(CPlayerSlot slot, ENetworkDisconnectionReason reason, const char* pszName, uint64 xuid, const char* pszNetworkID)
437415
{
438-
std::stringstream ss;
439-
std::vector<msgpack::object> eventData;
440-
441-
eventData.push_back(msgpack::object(slot.Get()));
442-
443-
msgpack::pack(ss, eventData);
444-
445416
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
446-
g_pluginManager->ExecuteEvent("core", "OnClientDisconnect", ss.str(), event);
417+
g_pluginManager->ExecuteEvent("core", "OnClientDisconnect", encoders::msgpack::SerializeToString({ slot.Get() }), event);
447418

448419
Player* player = g_playerManager->GetPlayer(slot);
449420
if (player)
@@ -470,15 +441,8 @@ bool Swiftly::Hook_ClientConnect(CPlayerSlot slot, const char* pszName, uint64 x
470441

471442
player->SetConnected(true);
472443

473-
std::stringstream ss;
474-
std::vector<msgpack::object> eventData;
475-
476-
eventData.push_back(msgpack::object(slot.Get()));
477-
478-
msgpack::pack(ss, eventData);
479-
480444
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
481-
g_pluginManager->ExecuteEvent("core", "OnClientConnect", ss.str(), event);
445+
g_pluginManager->ExecuteEvent("core", "OnClientConnect", encoders::msgpack::SerializeToString({ slot.Get() }), event);
482446

483447
bool response = true;
484448
try
@@ -617,15 +581,8 @@ void Swiftly::NextFrame(std::function<void()> fn)
617581

618582
void CEntityListener::OnEntitySpawned(CEntityInstance* pEntity)
619583
{
620-
std::stringstream ss;
621-
std::vector<msgpack::object> eventData;
622-
623-
eventData.push_back(msgpack::object(string_format("%p", (void*)pEntity).c_str()));
624-
625-
msgpack::pack(ss, eventData);
626-
627584
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
628-
g_pluginManager->ExecuteEvent("core", "OnEntitySpawned", ss.str(), event);
585+
g_pluginManager->ExecuteEvent("core", "OnEntitySpawned", encoders::msgpack::SerializeToString({ string_format("%p", (void*)pEntity) }), event);
629586
delete event;
630587
}
631588

@@ -635,29 +592,15 @@ void CEntityListener::OnEntityParentChanged(CEntityInstance* pEntity, CEntityIns
635592

636593
void CEntityListener::OnEntityCreated(CEntityInstance* pEntity)
637594
{
638-
std::stringstream ss;
639-
std::vector<msgpack::object> eventData;
640-
641-
eventData.push_back(msgpack::object(string_format("%p", (void*)pEntity).c_str()));
642-
643-
msgpack::pack(ss, eventData);
644-
645595
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
646-
g_pluginManager->ExecuteEvent("core", "OnEntityCreated", ss.str(), event);
596+
g_pluginManager->ExecuteEvent("core", "OnEntityCreated", encoders::msgpack::SerializeToString({ string_format("%p", (void*)pEntity) }), event);
647597
delete event;
648598
}
649599

650600
void CEntityListener::OnEntityDeleted(CEntityInstance* pEntity)
651601
{
652-
std::stringstream ss;
653-
std::vector<msgpack::object> eventData;
654-
655-
eventData.push_back(msgpack::object(string_format("%p", (void*)pEntity).c_str()));
656-
657-
msgpack::pack(ss, eventData);
658-
659602
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
660-
g_pluginManager->ExecuteEvent("core", "OnEntityDeleted", ss.str(), event);
603+
g_pluginManager->ExecuteEvent("core", "OnEntityDeleted", encoders::msgpack::SerializeToString({ string_format("%p", (void*)pEntity) }), event);
661604
delete event;
662605
}
663606

src/gameevents/gameevents.cpp

Lines changed: 11 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,16 @@
66
#include "../player/PlayerManager.h"
77

88
#include <vector>
9-
#include <msgpack.hpp>
10-
#include <sstream>
119
#include <map>
1210
#include <stack>
1311

14-
SH_DECL_HOOK2(IGameEventManager2, FireEvent, SH_NOATTRIB, 0, bool, IGameEvent *, bool);
12+
SH_DECL_HOOK2(IGameEventManager2, FireEvent, SH_NOATTRIB, 0, bool, IGameEvent*, bool);
1513
FuncHook<decltype(Hook_CGameEventManager_Init)> TCGameEventManager_Init(Hook_CGameEventManager_Init, "CGameEventManager_Init");
1614

17-
EventManager *eventManager = nullptr;
15+
EventManager* eventManager = nullptr;
1816
std::stack<IGameEvent*> dupEvents;
1917

20-
void Hook_CGameEventManager_Init(IGameEventManager2 *pGameEventManager)
18+
void Hook_CGameEventManager_Init(IGameEventManager2* pGameEventManager)
2119
{
2220
g_gameEventManager = pGameEventManager;
2321
TCGameEventManager_Init(pGameEventManager);
@@ -66,12 +64,9 @@ void EventManager::Shutdown()
6664
g_gameEventManager->RemoveListener(this);
6765
}
6866

69-
void EventManager::FireGameEvent(IGameEvent *pEvent) {}
67+
void EventManager::FireGameEvent(IGameEvent* pEvent) {}
7068

71-
std::string emptyEventData = "";
72-
bool setEmptyEventdata = false;
73-
74-
bool EventManager::OnFireEvent(IGameEvent *pEvent, bool bDontBroadcast)
69+
bool EventManager::OnFireEvent(IGameEvent* pEvent, bool bDontBroadcast)
7570
{
7671
if (!pEvent)
7772
{
@@ -84,24 +79,13 @@ bool EventManager::OnFireEvent(IGameEvent *pEvent, bool bDontBroadcast)
8479
{
8580
std::string prettyEventName = gameEventsRegister.at(eventName);
8681

87-
if (!setEmptyEventdata)
88-
{
89-
setEmptyEventdata = true;
90-
91-
std::stringstream ss;
92-
std::vector<msgpack::object> eventData;
93-
94-
msgpack::pack(ss, eventData);
95-
emptyEventData = ss.str();
96-
}
97-
98-
PluginEvent *event = new PluginEvent("core", pEvent, nullptr);
99-
EventResult result = g_pluginManager->ExecuteEvent("core", prettyEventName, emptyEventData, event);
82+
PluginEvent* event = new PluginEvent("core", pEvent, nullptr);
83+
EventResult result = g_pluginManager->ExecuteEvent("core", prettyEventName, encoders::msgpack::SerializeToString({}), event);
10084
delete event;
10185
if (prettyEventName == "OnPlayerSpawn")
10286
{
10387
auto slot = pEvent->GetPlayerSlot("userid");
104-
Player *player = g_playerManager->GetPlayer(slot);
88+
Player* player = g_playerManager->GetPlayer(slot);
10589
if (player)
10690
player->SetFirstSpawn(false);
10791
}
@@ -117,7 +101,7 @@ bool EventManager::OnFireEvent(IGameEvent *pEvent, bool bDontBroadcast)
117101
RETURN_META_VALUE(MRES_IGNORED, true);
118102
}
119103

120-
bool EventManager::OnPostFireEvent(IGameEvent *pEvent, bool bDontBroadcast)
104+
bool EventManager::OnPostFireEvent(IGameEvent* pEvent, bool bDontBroadcast)
121105
{
122106
if (!pEvent)
123107
{
@@ -132,19 +116,8 @@ bool EventManager::OnPostFireEvent(IGameEvent *pEvent, bool bDontBroadcast)
132116
{
133117
std::string prettyEventName = gameEventsRegister.at(eventName);
134118

135-
if (!setEmptyEventdata)
136-
{
137-
setEmptyEventdata = true;
138-
139-
std::stringstream ss;
140-
std::vector<msgpack::object> eventData;
141-
142-
msgpack::pack(ss, eventData);
143-
emptyEventData = ss.str();
144-
}
145-
146-
PluginEvent *event = new PluginEvent("core", realGameEvent, nullptr);
147-
EventResult result = g_pluginManager->ExecuteEvent("core", string_format("OnPost%s", prettyEventName.substr(2).c_str()), emptyEventData, event);
119+
PluginEvent* event = new PluginEvent("core", realGameEvent, nullptr);
120+
EventResult result = g_pluginManager->ExecuteEvent("core", string_format("OnPost%s", prettyEventName.substr(2).c_str()), encoders::msgpack::SerializeToString({}), event);
148121
delete event;
149122

150123
if (result != EventResult::Continue) {

src/plugins/PluginManager.cpp

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include "../menus/MenuManager.h"
55

66
#include <vector>
7-
#include <msgpack.hpp>
87

98
bool AllPluginsStarted = false;
109

@@ -107,13 +106,8 @@ void PluginManager::StartPlugins()
107106
if (!StartPlugin(plugin->GetName()))
108107
StopPlugin(plugin->GetName());
109108

110-
std::stringstream ss;
111-
std::vector<msgpack::object> eventData;
112-
113-
msgpack::pack(ss, eventData);
114-
115109
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
116-
this->ExecuteEvent("core", "OnAllPluginsLoaded", ss.str(), event);
110+
this->ExecuteEvent("core", "OnAllPluginsLoaded", encoders::msgpack::SerializeToString({}), event);
117111
delete event;
118112
AllPluginsStarted = true;
119113
}
@@ -141,13 +135,8 @@ bool PluginManager::StartPlugin(std::string plugin_name)
141135

142136
if (AllPluginsStarted)
143137
{
144-
std::stringstream ss;
145-
std::vector<msgpack::object> eventData;
146-
147-
msgpack::pack(ss, eventData);
148-
149138
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
150-
plugin->TriggerEvent("core", "OnAllPluginsLoaded", ss.str(), event);
139+
plugin->TriggerEvent("core", "OnAllPluginsLoaded", encoders::msgpack::SerializeToString({}), event);
151140
delete event;
152141
}
153142

src/plugins/core/scripting.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "../../resourcemonitor/ResourceMonitor.h"
66
#include "../../sdk/entity/CCSWeaponBase.h"
77
#include "../../crashreporter/CallStack.h"
8+
#include "../../encoders/msgpack.h"
89

910
#include "cstrike15_usermessages.pb.h"
1011
#include <google/protobuf/message.h>
@@ -726,6 +727,6 @@ std::string scripting_GetOS();
726727
GCCSGameRules scripting_GetCCSGameRules();
727728
std::string scripting_GetPluginPath(std::string plugin_name);
728729
void scripting_StateUpdate(std::string ptr, std::string classname, std::string field, bool isStruct);
729-
PluginUserMessage *scripting_GetUserMessage(std::string uuid);
730+
PluginUserMessage scripting_GetUserMessage(std::string uuid);
730731

731732
#endif

0 commit comments

Comments
 (0)