Skip to content
This repository was archived by the owner on Oct 8, 2025. It is now read-only.

Commit 17560fc

Browse files
committed
handle native event priority properly
1 parent 425f5fd commit 17560fc

File tree

18 files changed

+213
-174
lines changed

18 files changed

+213
-174
lines changed

src/Impl/Actors/Events.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,21 @@
1111
#include "../../Utils/Singleton.hpp"
1212
#include "sdk.hpp"
1313

14-
struct ActorEvents : public ActorEventHandler, public Singleton<ActorEvents>
14+
template <EventPriorityType PRIORITY>
15+
struct ActorEvents : public ActorEventHandler, public Singleton<ActorEvents<PRIORITY>>
1516
{
1617
void onPlayerGiveDamageActor(IPlayer& player, IActor& actor, float amount, unsigned weapon, BodyPart part) override
1718
{
18-
ComponentManager::Get()->CallEvent("onPlayerGiveDamageActor", EventReturnHandler::None, &player, &actor, amount, int(weapon), int(part));
19+
ComponentManager::Get()->CallEvent<PRIORITY>("onPlayerGiveDamageActor", EventReturnHandler::None, &player, &actor, amount, int(weapon), int(part));
1920
}
2021

2122
void onActorStreamIn(IActor& actor, IPlayer& forPlayer) override
2223
{
23-
ComponentManager::Get()->CallEvent("onActorStreamIn", EventReturnHandler::None, &actor, &forPlayer);
24+
ComponentManager::Get()->CallEvent<PRIORITY>("onActorStreamIn", EventReturnHandler::None, &actor, &forPlayer);
2425
}
2526

2627
void onActorStreamOut(IActor& actor, IPlayer& forPlayer) override
2728
{
28-
ComponentManager::Get()->CallEvent("onActorStreamOut", EventReturnHandler::None, &actor, &forPlayer);
29+
ComponentManager::Get()->CallEvent<PRIORITY>("onActorStreamOut", EventReturnHandler::None, &actor, &forPlayer);
2930
}
3031
};

src/Impl/Checkpoints/Events.hpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,27 @@
1111
#include "../../Utils/Singleton.hpp"
1212
#include "sdk.hpp"
1313

14-
struct CheckpointEvents : public PlayerCheckpointEventHandler, public Singleton<CheckpointEvents>
14+
template <EventPriorityType PRIORITY>
15+
struct CheckpointEvents : public PlayerCheckpointEventHandler, public Singleton<CheckpointEvents<PRIORITY>>
1516
{
1617
void onPlayerEnterCheckpoint(IPlayer& player) override
1718
{
18-
ComponentManager::Get()->CallEvent("onPlayerEnterCheckpoint", EventReturnHandler::None, &player);
19+
ComponentManager::Get()->CallEvent<PRIORITY>("onPlayerEnterCheckpoint", EventReturnHandler::None, &player);
1920
}
2021

2122
void onPlayerLeaveCheckpoint(IPlayer& player) override
2223
{
23-
ComponentManager::Get()->CallEvent("onPlayerLeaveCheckpoint", EventReturnHandler::None, &player);
24+
ComponentManager::Get()->CallEvent<PRIORITY>("onPlayerLeaveCheckpoint", EventReturnHandler::None, &player);
2425
}
2526

2627
void onPlayerEnterRaceCheckpoint(IPlayer& player) override
2728
{
28-
ComponentManager::Get()->CallEvent("onPlayerEnterRaceCheckpoint", EventReturnHandler::None, &player);
29+
ComponentManager::Get()->CallEvent<PRIORITY>("onPlayerEnterRaceCheckpoint", EventReturnHandler::None, &player);
2930
}
3031

3132
void onPlayerLeaveRaceCheckpoint(IPlayer& player) override
3233
{
3334

34-
ComponentManager::Get()->CallEvent("onPlayerLeaveRaceCheckpoint", EventReturnHandler::None, &player);
35+
ComponentManager::Get()->CallEvent<PRIORITY>("onPlayerLeaveRaceCheckpoint", EventReturnHandler::None, &player);
3536
}
3637
};

src/Impl/Classes/Events.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
#include "../../Utils/Singleton.hpp"
1212
#include "sdk.hpp"
1313

14-
struct ClassEvents : public ClassEventHandler, public Singleton<ClassEvents>
14+
template <EventPriorityType PRIORITY>
15+
struct ClassEvents : public ClassEventHandler, public Singleton<ClassEvents<PRIORITY>>
1516
{
1617
bool onPlayerRequestClass(IPlayer& player, unsigned int classId) override
1718
{
18-
return ComponentManager::Get()->CallEvent("onPlayerRequestClass", EventReturnHandler::StopAtFalse, &player, int(classId));
19+
return ComponentManager::Get()->CallEvent<PRIORITY>("onPlayerRequestClass", EventReturnHandler::StopAtFalse, &player, int(classId));
1920
}
2021
};

src/Impl/ComponentManager.cpp

Lines changed: 80 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,44 @@
2222
#include "CustomModels/Events.hpp"
2323
#include "ComponentManager.hpp"
2424

25-
#define ADD_EVENT_HANDLER(component, event_instance) \
26-
if (component) \
27-
{ \
28-
component->getEventDispatcher().addEventHandler(event_instance); \
25+
#define ADD_EVENT_HANDLER(component, event_instance) \
26+
if (component) \
27+
{ \
28+
component->getEventDispatcher().addEventHandler(event_instance<EventPriorityType_Highest>::Get(), EventPriority_Highest); \
29+
component->getEventDispatcher().addEventHandler(event_instance<EventPriorityType_FairlyHigh>::Get(), EventPriority_FairlyHigh); \
30+
component->getEventDispatcher().addEventHandler(event_instance<EventPriorityType_Default>::Get(), EventPriority_Default); \
31+
component->getEventDispatcher().addEventHandler(event_instance<EventPriorityType_FairlyLow>::Get(), EventPriority_FairlyLow); \
32+
component->getEventDispatcher().addEventHandler(event_instance<EventPriorityType_Lowest>::Get(), EventPriority_Lowest); \
2933
}
3034

31-
#define ADD_PLAYER_EVENT_HANDLER(component, event_name, event_instance) \
32-
if (component) \
33-
{ \
34-
component->getPlayer##event_name##Dispatcher().addEventHandler(event_instance); \
35+
#define ADD_PLAYER_EVENT_HANDLER(component, event_name, event_instance) \
36+
if (component) \
37+
{ \
38+
component->getPlayer##event_name##Dispatcher().addEventHandler(event_instance<EventPriorityType_Highest>::Get(), EventPriority_Highest); \
39+
component->getPlayer##event_name##Dispatcher().addEventHandler(event_instance<EventPriorityType_FairlyHigh>::Get(), EventPriority_FairlyHigh); \
40+
component->getPlayer##event_name##Dispatcher().addEventHandler(event_instance<EventPriorityType_Default>::Get(), EventPriority_Default); \
41+
component->getPlayer##event_name##Dispatcher().addEventHandler(event_instance<EventPriorityType_FairlyLow>::Get(), EventPriority_FairlyLow); \
42+
component->getPlayer##event_name##Dispatcher().addEventHandler(event_instance<EventPriorityType_Lowest>::Get(), EventPriority_Lowest); \
3543
}
3644

37-
#define REMOVE_EVENT_HANDLER(component, event_instance) \
38-
if (component) \
39-
{ \
40-
component->getEventDispatcher().removeEventHandler(event_instance); \
45+
#define REMOVE_EVENT_HANDLER(component, event_instance) \
46+
if (component) \
47+
{ \
48+
component->getEventDispatcher().removeEventHandler(event_instance<EventPriorityType_Highest>::Get()); \
49+
component->getEventDispatcher().removeEventHandler(event_instance<EventPriorityType_FairlyHigh>::Get()); \
50+
component->getEventDispatcher().removeEventHandler(event_instance<EventPriorityType_Default>::Get()); \
51+
component->getEventDispatcher().removeEventHandler(event_instance<EventPriorityType_FairlyLow>::Get()); \
52+
component->getEventDispatcher().removeEventHandler(event_instance<EventPriorityType_Lowest>::Get()); \
4153
}
4254

43-
#define REMOVE_PLAYER_EVENT_HANDLER(component, event_name, event_instance) \
44-
if (component) \
45-
{ \
46-
component->getPlayer##event_name##Dispatcher().removeEventHandler(event_instance); \
55+
#define REMOVE_PLAYER_EVENT_HANDLER(component, event_name, event_instance) \
56+
if (component) \
57+
{ \
58+
component->getPlayer##event_name##Dispatcher().removeEventHandler(event_instance<EventPriorityType_Highest>::Get()); \
59+
component->getPlayer##event_name##Dispatcher().removeEventHandler(event_instance<EventPriorityType_FairlyHigh>::Get()); \
60+
component->getPlayer##event_name##Dispatcher().removeEventHandler(event_instance<EventPriorityType_Default>::Get()); \
61+
component->getPlayer##event_name##Dispatcher().removeEventHandler(event_instance<EventPriorityType_FairlyLow>::Get()); \
62+
component->getPlayer##event_name##Dispatcher().removeEventHandler(event_instance<EventPriorityType_Lowest>::Get()); \
4763
}
4864

4965
#define RETRIEVE_RELEVANT_EVENT_MAP(container, priority) \
@@ -93,58 +109,58 @@ void ComponentManager::Init(ICore* c, IComponentList* clist)
93109

94110
void ComponentManager::InitializeEvents()
95111
{
96-
ADD_EVENT_HANDLER(core, CoreEvents::Get());
97-
ADD_EVENT_HANDLER(actors, ActorEvents::Get());
98-
ADD_EVENT_HANDLER(checkpoints, CheckpointEvents::Get());
99-
ADD_EVENT_HANDLER(classes, ClassEvents::Get());
100-
ADD_EVENT_HANDLER(dialogs, DialogEvents::Get());
101-
ADD_EVENT_HANDLER(menus, MenuEvents::Get());
102-
ADD_EVENT_HANDLER(textdraws, TextDrawEvents::Get());
103-
ADD_EVENT_HANDLER(pickups, PickupEvents::Get());
104-
ADD_EVENT_HANDLER(vehicles, VehicleEvents::Get());
105-
ADD_EVENT_HANDLER(objects, ObjectEvents::Get());
106-
ADD_EVENT_HANDLER(console, ConsoleEvents::Get());
107-
ADD_EVENT_HANDLER(gangzones, GangZoneEvents::Get());
108-
ADD_EVENT_HANDLER(models, CustomModelsEvents::Get());
109-
110-
ADD_PLAYER_EVENT_HANDLER(players, Spawn, PlayerEvents::Get());
111-
ADD_PLAYER_EVENT_HANDLER(players, Connect, PlayerEvents::Get());
112-
ADD_PLAYER_EVENT_HANDLER(players, Stream, PlayerEvents::Get());
113-
ADD_PLAYER_EVENT_HANDLER(players, Text, PlayerEvents::Get());
114-
ADD_PLAYER_EVENT_HANDLER(players, Shot, PlayerEvents::Get());
115-
ADD_PLAYER_EVENT_HANDLER(players, Change, PlayerEvents::Get());
116-
ADD_PLAYER_EVENT_HANDLER(players, Damage, PlayerEvents::Get());
117-
ADD_PLAYER_EVENT_HANDLER(players, Click, PlayerEvents::Get());
118-
ADD_PLAYER_EVENT_HANDLER(players, Check, PlayerEvents::Get());
119-
ADD_PLAYER_EVENT_HANDLER(players, Update, PlayerEvents::Get());
112+
ADD_EVENT_HANDLER(core, CoreEvents);
113+
ADD_EVENT_HANDLER(actors, ActorEvents);
114+
ADD_EVENT_HANDLER(checkpoints, CheckpointEvents);
115+
ADD_EVENT_HANDLER(classes, ClassEvents);
116+
ADD_EVENT_HANDLER(dialogs, DialogEvents);
117+
ADD_EVENT_HANDLER(menus, MenuEvents);
118+
ADD_EVENT_HANDLER(textdraws, TextDrawEvents);
119+
ADD_EVENT_HANDLER(pickups, PickupEvents);
120+
ADD_EVENT_HANDLER(vehicles, VehicleEvents);
121+
ADD_EVENT_HANDLER(objects, ObjectEvents);
122+
ADD_EVENT_HANDLER(console, ConsoleEvents);
123+
ADD_EVENT_HANDLER(gangzones, GangZoneEvents);
124+
ADD_EVENT_HANDLER(models, CustomModelsEvents);
125+
126+
ADD_PLAYER_EVENT_HANDLER(players, Spawn, PlayerEvents);
127+
ADD_PLAYER_EVENT_HANDLER(players, Connect, PlayerEvents);
128+
ADD_PLAYER_EVENT_HANDLER(players, Stream, PlayerEvents);
129+
ADD_PLAYER_EVENT_HANDLER(players, Text, PlayerEvents);
130+
ADD_PLAYER_EVENT_HANDLER(players, Shot, PlayerEvents);
131+
ADD_PLAYER_EVENT_HANDLER(players, Change, PlayerEvents);
132+
ADD_PLAYER_EVENT_HANDLER(players, Damage, PlayerEvents);
133+
ADD_PLAYER_EVENT_HANDLER(players, Click, PlayerEvents);
134+
ADD_PLAYER_EVENT_HANDLER(players, Check, PlayerEvents);
135+
ADD_PLAYER_EVENT_HANDLER(players, Update, PlayerEvents);
120136
}
121137

122138
void ComponentManager::FreeEvents()
123139
{
124-
REMOVE_EVENT_HANDLER(core, CoreEvents::Get());
125-
REMOVE_EVENT_HANDLER(actors, ActorEvents::Get());
126-
REMOVE_EVENT_HANDLER(checkpoints, CheckpointEvents::Get());
127-
REMOVE_EVENT_HANDLER(classes, ClassEvents::Get());
128-
REMOVE_EVENT_HANDLER(dialogs, DialogEvents::Get());
129-
REMOVE_EVENT_HANDLER(menus, MenuEvents::Get());
130-
REMOVE_EVENT_HANDLER(textdraws, TextDrawEvents::Get());
131-
REMOVE_EVENT_HANDLER(pickups, PickupEvents::Get());
132-
REMOVE_EVENT_HANDLER(vehicles, VehicleEvents::Get());
133-
REMOVE_EVENT_HANDLER(objects, ObjectEvents::Get());
134-
REMOVE_EVENT_HANDLER(console, ConsoleEvents::Get());
135-
REMOVE_EVENT_HANDLER(gangzones, GangZoneEvents::Get());
136-
REMOVE_EVENT_HANDLER(models, CustomModelsEvents::Get());
137-
138-
REMOVE_PLAYER_EVENT_HANDLER(players, Spawn, PlayerEvents::Get());
139-
REMOVE_PLAYER_EVENT_HANDLER(players, Connect, PlayerEvents::Get());
140-
REMOVE_PLAYER_EVENT_HANDLER(players, Stream, PlayerEvents::Get());
141-
REMOVE_PLAYER_EVENT_HANDLER(players, Text, PlayerEvents::Get());
142-
REMOVE_PLAYER_EVENT_HANDLER(players, Shot, PlayerEvents::Get());
143-
REMOVE_PLAYER_EVENT_HANDLER(players, Change, PlayerEvents::Get());
144-
REMOVE_PLAYER_EVENT_HANDLER(players, Damage, PlayerEvents::Get());
145-
REMOVE_PLAYER_EVENT_HANDLER(players, Click, PlayerEvents::Get());
146-
REMOVE_PLAYER_EVENT_HANDLER(players, Check, PlayerEvents::Get());
147-
REMOVE_PLAYER_EVENT_HANDLER(players, Update, PlayerEvents::Get());
140+
REMOVE_EVENT_HANDLER(core, CoreEvents);
141+
REMOVE_EVENT_HANDLER(actors, ActorEvents);
142+
REMOVE_EVENT_HANDLER(checkpoints, CheckpointEvents);
143+
REMOVE_EVENT_HANDLER(classes, ClassEvents);
144+
REMOVE_EVENT_HANDLER(dialogs, DialogEvents);
145+
REMOVE_EVENT_HANDLER(menus, MenuEvents);
146+
REMOVE_EVENT_HANDLER(textdraws, TextDrawEvents);
147+
REMOVE_EVENT_HANDLER(pickups, PickupEvents);
148+
REMOVE_EVENT_HANDLER(vehicles, VehicleEvents);
149+
REMOVE_EVENT_HANDLER(objects, ObjectEvents);
150+
REMOVE_EVENT_HANDLER(console, ConsoleEvents);
151+
REMOVE_EVENT_HANDLER(gangzones, GangZoneEvents);
152+
REMOVE_EVENT_HANDLER(models, CustomModelsEvents);
153+
154+
REMOVE_PLAYER_EVENT_HANDLER(players, Spawn, PlayerEvents);
155+
REMOVE_PLAYER_EVENT_HANDLER(players, Connect, PlayerEvents);
156+
REMOVE_PLAYER_EVENT_HANDLER(players, Stream, PlayerEvents);
157+
REMOVE_PLAYER_EVENT_HANDLER(players, Text, PlayerEvents);
158+
REMOVE_PLAYER_EVENT_HANDLER(players, Shot, PlayerEvents);
159+
REMOVE_PLAYER_EVENT_HANDLER(players, Change, PlayerEvents);
160+
REMOVE_PLAYER_EVENT_HANDLER(players, Damage, PlayerEvents);
161+
REMOVE_PLAYER_EVENT_HANDLER(players, Click, PlayerEvents);
162+
REMOVE_PLAYER_EVENT_HANDLER(players, Check, PlayerEvents);
163+
REMOVE_PLAYER_EVENT_HANDLER(players, Update, PlayerEvents);
148164
}
149165

150166
bool ComponentManager::AddEventHandler(const Impl::String& name, EventPriorityType priority, EventCallback_Common callback)

src/Impl/ComponentManager.hpp

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -88,40 +88,44 @@ class ComponentManager : public Singleton<ComponentManager>
8888
}
8989

9090
// Call event
91-
template <typename... Args>
91+
template <EventPriorityType PRIORITY, typename... Args>
9292
bool CallEvent(const Impl::String& name, EventReturnHandler returnHandler, Args... args)
9393
{
94-
auto highest_ = highestPriorityEvents.find(name);
95-
auto high_ = fairlyHighPriorityEvents.find(name);
96-
auto default_ = defaultPriorityEvents.find(name);
97-
auto low_ = fairlyLowPriorityEvents.find(name);
98-
auto lowest_ = lowestPriorityEvents.find(name);
99-
100-
bool result;
101-
102-
if (highest_ != highestPriorityEvents.end())
94+
FlatHashMap<Impl::String, FlatHashSet<EventCallback_Common>>* container = nullptr;
95+
if constexpr (PRIORITY == EventPriorityType_Highest)
10396
{
104-
result = CallEventOfPriority(highest_, returnHandler, args...);
97+
container = &highestPriorityEvents;
10598
}
106-
107-
if (high_ != fairlyHighPriorityEvents.end())
99+
else if constexpr (PRIORITY == EventPriorityType_FairlyHigh)
108100
{
109-
result = CallEventOfPriority(high_, returnHandler, args...);
101+
container = &fairlyHighPriorityEvents;
110102
}
111-
112-
if (default_ != defaultPriorityEvents.end())
103+
else if constexpr (PRIORITY == EventPriorityType_Default)
113104
{
114-
result = CallEventOfPriority(default_, returnHandler, args...);
105+
container = &defaultPriorityEvents;
115106
}
116-
117-
if (low_ != fairlyLowPriorityEvents.end())
107+
else if constexpr (PRIORITY == EventPriorityType_FairlyHigh)
108+
{
109+
container = &fairlyLowPriorityEvents;
110+
}
111+
else if constexpr (PRIORITY == EventPriorityType_Lowest)
118112
{
119-
result = CallEventOfPriority(low_, returnHandler, args...);
113+
container = &lowestPriorityEvents;
120114
}
121115

122-
if (lowest_ != lowestPriorityEvents.end())
116+
bool result;
117+
118+
if (container)
123119
{
124-
result = CallEventOfPriority(lowest_, returnHandler, args...);
120+
auto callbacks = container->find(name);
121+
if (callbacks != container->end())
122+
{
123+
auto ret = CallEventOfPriority(callbacks, returnHandler, args...);
124+
if (!ret)
125+
{
126+
result = false;
127+
}
128+
}
125129
}
126130

127131
return result;
@@ -213,13 +217,13 @@ inline PlayerDataType* GetPlayerData(IPlayer* player)
213217
#define POOL_ENTITY_RET(pool, entity_type, entity, output, failret) \
214218
if (!ComponentManager::Get()->pool) \
215219
return failret; \
216-
auto pool = ComponentManager::Get() -> pool; \
220+
auto pool = ComponentManager::Get()->pool; \
217221
ENTITY_CAST_RET(entity_type, entity, output, failret)
218222

219223
#define POOL_ENTITY(pool, entity_type, entity, output) \
220224
if (!ComponentManager::Get()->pool) \
221225
return; \
222-
auto pool = ComponentManager::Get() -> pool; \
226+
auto pool = ComponentManager::Get()->pool; \
223227
ENTITY_CAST(entity_type, entity, output)
224228

225229
#define PLAYER_POOL_ENTITY_RET(player, pool_type, entity_type, entity, entity_output, failret) \

src/Impl/Console/Events.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@
1111
#include "../../Utils/Singleton.hpp"
1212
#include "sdk.hpp"
1313

14-
struct ConsoleEvents : public ConsoleEventHandler, public Singleton<ConsoleEvents>
14+
template <EventPriorityType PRIORITY>
15+
struct ConsoleEvents : public ConsoleEventHandler, public Singleton<ConsoleEvents<PRIORITY>>
1516
{
1617
bool onConsoleText(StringView command, StringView parameters, const ConsoleCommandSenderData& sender) override
1718
{
18-
return ComponentManager::Get()->CallEvent("onConsoleText", EventReturnHandler::StopAtTrue, CREATE_CAPI_STRING_VIEW(command), CREATE_CAPI_STRING_VIEW(parameters));
19+
return ComponentManager::Get()->CallEvent<PRIORITY>("onConsoleText", EventReturnHandler::StopAtTrue, CREATE_CAPI_STRING_VIEW(command), CREATE_CAPI_STRING_VIEW(parameters));
1920
}
2021

2122
void onRconLoginAttempt(IPlayer& player, StringView password, bool success) override
@@ -25,6 +26,6 @@ struct ConsoleEvents : public ConsoleEventHandler, public Singleton<ConsoleEvent
2526
PeerAddress::ToString(data.networkID.address, addressString);
2627
StringView addressStringView = StringView(addressString.data(), addressString.length());
2728

28-
ComponentManager::Get()->CallEvent("onRconLoginAttempt", EventReturnHandler::StopAtTrue, CREATE_CAPI_STRING_VIEW(addressStringView), CREATE_CAPI_STRING_VIEW(password), success);
29+
ComponentManager::Get()->CallEvent<PRIORITY>("onRconLoginAttempt", EventReturnHandler::StopAtTrue, CREATE_CAPI_STRING_VIEW(addressStringView), CREATE_CAPI_STRING_VIEW(password), success);
2930
}
3031
};

src/Impl/Core/Events.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
#include "../../Utils/Singleton.hpp"
1212
#include "sdk.hpp"
1313

14-
struct CoreEvents : public CoreEventHandler, public Singleton<CoreEvents>
14+
template <EventPriorityType PRIORITY>
15+
struct CoreEvents : public CoreEventHandler, public Singleton<CoreEvents<PRIORITY>>
1516
{
1617
void onTick(Microseconds elapsed, TimePoint now) override
1718
{
18-
ComponentManager::Get()->CallEvent("onTick", EventReturnHandler::None, int(elapsed.count()));
19+
ComponentManager::Get()->CallEvent<PRIORITY>("onTick", EventReturnHandler::None, int(elapsed.count()));
1920
}
2021
};

0 commit comments

Comments
 (0)