AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
ToCloud9Sidecar Class Reference

#include "TC9Sidecar.h"

Public Member Functions

bool CheckLibsidecarAbi ()
 
void Init (uint16 port, int realmId)
 
void Deinit ()
 
bool ClusterModeEnabled ()
 
bool IsCrossrealm ()
 
bool IsMapAssigned (uint32 mapId)
 
void SetupHooks ()
 
void SetupGrpcHandlers ()
 
void ProcessHooks ()
 
void ProcessGrpcOrHttpRequests ()
 
void ProcessAsyncTasks ()
 
uint32 GenerateCharacterGuid (uint16 realmId=DEFAULT_NON_CROSSREALM_REALM_ID)
 
uint32 GenerateItemGuid (uint16 realmId=DEFAULT_NON_CROSSREALM_REALM_ID)
 
uint32 GenerateInstanceGuid (uint16 realmId=DEFAULT_NON_CROSSREALM_REALM_ID)
 
void OnPlayerLeftBattleground (uint64 playerGUID, uint32 realmID, uint32 instanceID)
 
void OnBattlegroundStatusChanged (uint32 instanceID, uint8 status)
 
bool NatsPublish (std::string const &subject, std::string const &payload)
 
bool NatsSubscribe (std::string const &subject, void(*handler)(char const *subject, char const *payload, int payloadLen))
 

Static Public Member Functions

static ToCloud9Sidecarinstance ()
 

Private Member Functions

 ToCloud9Sidecar ()
 
 ~ToCloud9Sidecar ()
 

Static Private Member Functions

static void OnMapsReassigned (uint32 *addedMaps, int addedMapsSize, uint32 *removedMaps, int removedMapsSize)
 

Private Attributes

bool _clusterModeEnabled
 
bool _isCrossrealm
 
bool _assignedMapsByID [MAX_MAP_ID]
 
AsyncCallbackProcessor< AsyncTask< bool > > _asyncTasksProcessor
 

Detailed Description

Constructor & Destructor Documentation

◆ ToCloud9Sidecar()

ToCloud9Sidecar::ToCloud9Sidecar ( )
private
43 : _clusterModeEnabled(false), _isCrossrealm(false)
44{
45}
bool _isCrossrealm
Definition TC9Sidecar.h:74
bool _clusterModeEnabled
Definition TC9Sidecar.h:73

◆ ~ToCloud9Sidecar()

ToCloud9Sidecar::~ToCloud9Sidecar ( )
inlineprivate
32{};

Member Function Documentation

◆ CheckLibsidecarAbi()

bool ToCloud9Sidecar::CheckLibsidecarAbi ( )

When Cluster.Enabled, validate libsidecar (real library required; ABI match). Call after config and logging are ready, before DB/network startup.

Returns
false if worldserver should exit with code 1.
48{
49 if (!sConfigMgr->GetOption<bool>("Cluster.Enabled", false))
50 return true;
51
52 int libMajor = 0;
53 int libMinor = 0;
54 int libPatch = 0;
55 TC9GetVersion(&libMajor, &libMinor, &libPatch);
56 char const* libVersionStr = TC9GetVersionString();
57
58#if defined(TC9_LIBSIDECAR_IS_STUB)
59 char const* libKind = "stub";
60#else
61 char const* libKind = "shared library";
62#endif
63
64#if defined(TC9_LIBSIDECAR_IS_STUB)
65 // Stub always "matches" its own macros; fail here instead of after the realm
66 // is online when TC9InitLib panics.
67 // SetSynchronous first: this runs before the io_context pool starts, so async
68 // LOG_* would never print on early return. Success path leaves async alone.
69 sLog->SetSynchronous();
70 LOG_INFO("server", "libsidecar ({}) runtime {}.{}.{} ({}) - headers {}.{}.{} ({})",
71 libKind,
72 libMajor, libMinor, libPatch,
73 libVersionStr ? libVersionStr : "?",
74 TC9_VERSION_MAJOR, TC9_VERSION_MINOR, TC9_VERSION_PATCH,
75 TC9_VERSION_STRING);
76 LOG_ERROR("server",
77 "Cluster.Enabled requires the real libsidecar shared library. "
78 "This worldserver was built with the stub (default). "
79 "Rebuild with -DUSE_REAL_LIBSIDECAR=ON and place matching headers + library "
80 "from the same libsidecar release under deps/libsidecar.");
81 return false;
82#else
83 if (TC9CheckAbiCompatible(TC9_VERSION_MAJOR, TC9_VERSION_MINOR) != 0)
84 {
85 sLog->SetSynchronous();
86 LOG_INFO("server", "libsidecar ({}) runtime {}.{}.{} ({}) - headers {}.{}.{} ({})",
87 libKind,
88 libMajor, libMinor, libPatch,
89 libVersionStr ? libVersionStr : "?",
90 TC9_VERSION_MAJOR, TC9_VERSION_MINOR, TC9_VERSION_PATCH,
91 TC9_VERSION_STRING);
92 LOG_ERROR("server",
93 "libsidecar ABI mismatch: worldserver was built for {}.{}.{} (headers {}), "
94 "but loaded library is {}.{}.{} ({}). "
95 "Copy matching headers + library from the same libsidecar build/release.",
96 TC9_VERSION_MAJOR, TC9_VERSION_MINOR, TC9_VERSION_PATCH, TC9_VERSION_STRING,
97 libMajor, libMinor, libPatch,
98 libVersionStr ? libVersionStr : "?");
99 return false;
100 }
101
102 LOG_INFO("server", "libsidecar ({}) runtime {}.{}.{} ({}) - headers {}.{}.{} ({})",
103 libKind,
104 libMajor, libMinor, libPatch,
105 libVersionStr ? libVersionStr : "?",
106 TC9_VERSION_MAJOR, TC9_VERSION_MINOR, TC9_VERSION_PATCH,
107 TC9_VERSION_STRING);
108 return true;
109#endif
110}
#define LOG_INFO(filterType__,...)
Definition Log.h:153
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define sLog
Definition Log.h:127
#define sConfigMgr
Definition Config.h:93

References LOG_ERROR, LOG_INFO, sConfigMgr, and sLog.

◆ ClusterModeEnabled()

bool ToCloud9Sidecar::ClusterModeEnabled ( )
inline
45{ return _clusterModeEnabled; }

References _clusterModeEnabled.

◆ Deinit()

void ToCloud9Sidecar::Deinit ( )
150{
152 TC9GracefulShutdown();
153}

References _clusterModeEnabled.

◆ GenerateCharacterGuid()

uint32 ToCloud9Sidecar::GenerateCharacterGuid ( uint16  realmId = DEFAULT_NON_CROSSREALM_REALM_ID)
217{
218 return uint32(TC9GetNextAvailableCharacterGuid(realmId));
219}
std::uint32_t uint32
Definition Define.h:107

◆ GenerateInstanceGuid()

uint32 ToCloud9Sidecar::GenerateInstanceGuid ( uint16  realmId = DEFAULT_NON_CROSSREALM_REALM_ID)
227{
228 return uint32(TC9GetNextAvailableInstanceGuid(realmId));
229}

◆ GenerateItemGuid()

uint32 ToCloud9Sidecar::GenerateItemGuid ( uint16  realmId = DEFAULT_NON_CROSSREALM_REALM_ID)
222{
223 return uint32(TC9GetNextAvailableItemGuid(realmId));
224}

◆ Init()

void ToCloud9Sidecar::Init ( uint16  port,
int  realmId 
)
113{
114 _clusterModeEnabled = sConfigMgr->GetOption<bool>("Cluster.Enabled", false);
115
117 {
118 uint32 *assignedMaps;
119 int assignedMapsSize = 0;
120
121 _isCrossrealm = sConfigMgr->GetOption<bool>("Cluster.IsCrossrealm", false);
122
123 std::string availableMaps = sConfigMgr->GetOption<std::string>("Cluster.AvailableMaps", AVAILABLE_MAPS_ALL_MAPS);
124 TC9InitLib(port, realmId, _isCrossrealm, availableMaps.data(), &assignedMaps, &assignedMapsSize);
125
126 for (int i = 0; i < MAX_MAP_ID; i++)
127 _assignedMapsByID[i] = false;
128
129 for (int i = 0; i < assignedMapsSize; i++)
130 {
131 uint32 mapId = assignedMaps[i];
132 if (mapId >= MAX_MAP_ID)
133 {
134 LOG_ERROR("server", "ToCloud9Sidecar::Init: map id {} out of range [0, {}), ignored",
135 mapId, MAX_MAP_ID);
136 continue;
137 }
138 _assignedMapsByID[mapId] = true;
139 }
140
141 if (assignedMapsSize > 0)
142 free(assignedMaps);
143
144 SetupHooks();
146 }
147}
#define AVAILABLE_MAPS_ALL_MAPS
Definition TC9Sidecar.cpp:33
#define MAX_MAP_ID
Definition TC9Sidecar.h:26
bool _assignedMapsByID[MAX_MAP_ID]
Definition TC9Sidecar.h:76
void SetupGrpcHandlers()
Definition TC9Sidecar.cpp:173
void SetupHooks()
Definition TC9Sidecar.cpp:155

References _assignedMapsByID, _clusterModeEnabled, _isCrossrealm, AVAILABLE_MAPS_ALL_MAPS, LOG_ERROR, MAX_MAP_ID, sConfigMgr, SetupGrpcHandlers(), and SetupHooks().

◆ instance()

ToCloud9Sidecar * ToCloud9Sidecar::instance ( )
static
38{
40 return &instance;
41}
Definition TC9Sidecar.h:29
static ToCloud9Sidecar * instance()
Definition TC9Sidecar.cpp:37

References instance().

Referenced by instance().

◆ IsCrossrealm()

bool ToCloud9Sidecar::IsCrossrealm ( )
inline
46{ return _isCrossrealm; }

References _isCrossrealm.

◆ IsMapAssigned()

bool ToCloud9Sidecar::IsMapAssigned ( uint32  mapId)
209{
210 if (mapId >= MAX_MAP_ID)
211 return false;
212
213 return _assignedMapsByID[mapId];
214}

References _assignedMapsByID, and MAX_MAP_ID.

◆ NatsPublish()

bool ToCloud9Sidecar::NatsPublish ( std::string const &  subject,
std::string const &  payload 
)
242{
244 return false;
245
246 if (payload.size() > size_t(std::numeric_limits<int>::max()))
247 return false;
248
249 return TC9NatsPublish(subject.c_str(), payload.c_str(), int(payload.size())) == 0;
250}

References _clusterModeEnabled.

◆ NatsSubscribe()

bool ToCloud9Sidecar::NatsSubscribe ( std::string const &  subject,
void(*)(char const *subject, char const *payload, int payloadLen)  handler 
)
253{
254 if (!_clusterModeEnabled || !handler)
255 return false;
256
257 return TC9NatsSubscribe(subject.c_str(), handler) == 0;
258}

References _clusterModeEnabled.

◆ OnBattlegroundStatusChanged()

void ToCloud9Sidecar::OnBattlegroundStatusChanged ( uint32  instanceID,
uint8  status 
)
237{
238 TC9BattlegroundStatusChanged(instanceID, status);
239}

◆ OnMapsReassigned()

void ToCloud9Sidecar::OnMapsReassigned ( uint32 addedMaps,
int  addedMapsSize,
uint32 removedMaps,
int  removedMapsSize 
)
staticprivate
261{
262 std::vector<uint32_t> newMapIDs;
263 newMapIDs.reserve(addedMapsSize > 0 ? addedMapsSize : 0);
264
265 for (int i = 0; i < addedMapsSize; i++)
266 {
267 uint32 mapId = addedMaps[i];
268 if (mapId >= MAX_MAP_ID)
269 {
270 LOG_ERROR("server", "ToCloud9Sidecar::OnMapsReassigned: added map id {} out of range [0, {}), ignored",
271 mapId, MAX_MAP_ID);
272 continue;
273 }
274
275 sToCloud9Sidecar->_assignedMapsByID[mapId] = true;
276 newMapIDs.push_back(mapId);
277
278 if (Map* map = sMapMgr->FindBaseNonInstanceMap(mapId))
279 map->StopPlayersRedirectKickTimer();
280 }
281
282 for (int i = 0; i < removedMapsSize; i++)
283 {
284 uint32 mapId = removedMaps[i];
285 if (mapId >= MAX_MAP_ID)
286 {
287 LOG_ERROR("server", "ToCloud9Sidecar::OnMapsReassigned: removed map id {} out of range [0, {}), ignored",
288 mapId, MAX_MAP_ID);
289 continue;
290 }
291
292 sToCloud9Sidecar->_assignedMapsByID[mapId] = false;
293
294 if (Map* map = sMapMgr->FindBaseNonInstanceMap(mapId))
295 map->StartPlayersRedirectKickTimer();
296 }
297
298 if (!newMapIDs.empty())
299 {
300 auto loadRowsPtr = std::make_shared<InstanceMapLoadRows>();
301
302 AsyncTask<bool> task(
303 [loadRowsPtr, newMapIDs]() -> bool {
304 LOG_INFO("server", "Starting to load data for newly assigned maps...");
305
306 *loadRowsPtr = sInstanceSaveMgr->LoadInstanceSavesAndBindsForMapIDs(newMapIDs);
307 return true;
308 },
309 [loadRowsPtr, newMapIDs](bool) {
310 sInstanceSaveMgr->MergeWithNewInstanceSaves(*loadRowsPtr);
311 TC9ReadyToAcceptPlayersFromMaps((uint32_t*)newMapIDs.data(), newMapIDs.size());
312
313 LOG_INFO("server", "Finished loading data for newly assigned maps.");
314 }
315 );
316
317 task.ExecuteAsync();
318 sToCloud9Sidecar->_asyncTasksProcessor.AddCallback(std::move(task));
319 }
320}
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:233
#define sMapMgr
Definition MapMgr.h:220
#define sToCloud9Sidecar
Definition TC9Sidecar.h:81
Definition AsyncTask.h:29
void ExecuteAsync()
Definition AsyncTask.h:75
Definition Map.h:168

References AsyncTask< T >::ExecuteAsync(), LOG_ERROR, LOG_INFO, MAX_MAP_ID, sInstanceSaveMgr, sMapMgr, and sToCloud9Sidecar.

Referenced by SetupHooks().

◆ OnPlayerLeftBattleground()

void ToCloud9Sidecar::OnPlayerLeftBattleground ( uint64  playerGUID,
uint32  realmID,
uint32  instanceID 
)
232{
233 TC9PlayerLeftBattleground(playerGUID, realmID, instanceID);
234}

◆ ProcessAsyncTasks()

void ToCloud9Sidecar::ProcessAsyncTasks ( )
204{
206}
void ProcessReadyCallbacks()
Definition AsyncCallbackProcessor.h:40
AsyncCallbackProcessor< AsyncTask< bool > > _asyncTasksProcessor
Definition TC9Sidecar.h:78

References _asyncTasksProcessor, and AsyncCallbackProcessor< T >::ProcessReadyCallbacks().

◆ ProcessGrpcOrHttpRequests()

void ToCloud9Sidecar::ProcessGrpcOrHttpRequests ( )
199{
200 TC9ProcessGRPCOrHTTPRequests();
201}

◆ ProcessHooks()

void ToCloud9Sidecar::ProcessHooks ( )
194{
195 TC9ProcessEventsHooks();
196}

◆ SetupGrpcHandlers()

void ToCloud9Sidecar::SetupGrpcHandlers ( )
174{
175 TC9SetGetPlayerItemsByGuidsHandler(&ToCloud9GrpcHandler::GetPlayerItemsByGuids);
176 TC9SetRemoveItemsWithGuidsFromPlayerHandler(&ToCloud9GrpcHandler::RemoveItemsWithGuidsFromPlayer);
177 TC9SetAddExistingItemToPlayerHandler(&ToCloud9GrpcHandler::AddExistingItemToPlayer);
178
179 TC9SetGetMoneyForPlayerHandler(&ToCloud9GrpcHandler::GetMoneyForPlayer);
180 TC9SetModifyMoneyForPlayerHandler(&ToCloud9GrpcHandler::ModifyMoneyForPlayer);
181
182 TC9SetCanPlayerInteractWithGOAndTypeHandler(&ToCloud9GrpcHandler::CanPlayerInteractWithGOAndType);
183 TC9SetCanPlayerInteractWithNPCAndFlagsHandler(&ToCloud9GrpcHandler::CanPlayerInteractWithNPCAndFlags);
184
185 TC9SetBattlegroundStartHandler(&ToCloud9GrpcHandler::StartBattleground);
186 TC9SetBattlegroundAddPlayersHandler(&ToCloud9GrpcHandler::AddPlayersToBattleground);
187 TC9SetCanPlayerJoinBattlegroundQueueHandler(&ToCloud9GrpcHandler::CanPlayerJoinBattlegroundQueue);
188 TC9SetCanPlayerTeleportToBattlegroundHandler(&ToCloud9GrpcHandler::CanPlayerTeleportToBattleground);
189
190 TC9SetMonitoringDataCollectorHandler(&HandleMonitoringRequest);
191}
MonitoringDataCollectorResponse HandleMonitoringRequest()
Definition TC9Sidecar.cpp:322
static CanPlayerInteractWithNPCAndFlagsResponse CanPlayerInteractWithNPCAndFlags(uint64 player, uint64 npc, uint32 unitFlags)
Definition TC9GrpcHandler.cpp:261
static ModifyMoneyForPlayerResponse ModifyMoneyForPlayer(uint64 player, int32 value)
Definition TC9GrpcHandler.cpp:221
static CanPlayerInteractWithGOAndTypeResponse CanPlayerInteractWithGOAndType(uint64 player, uint64 go, uint8 goType)
Definition TC9GrpcHandler.cpp:245
static BattlegroundJoinCheckErrorCode CanPlayerJoinBattlegroundQueue(uint64 player)
Definition TC9GrpcHandler.cpp:342
static PlayerItemErrorCode AddExistingItemToPlayer(AddExistingItemToPlayerRequest *)
Definition TC9GrpcHandler.cpp:164
static GetMoneyForPlayerResponse GetMoneyForPlayer(uint64 player)
Definition TC9GrpcHandler.cpp:205
static BattlegroundErrorCode AddPlayersToBattleground(BattlegroundAddPlayersRequest *request)
Definition TC9GrpcHandler.cpp:309
static BattlegroundJoinCheckErrorCode CanPlayerTeleportToBattleground(uint64 player)
Definition TC9GrpcHandler.cpp:364
static RemoveItemsWithGuidsFromPlayerResponse RemoveItemsWithGuidsFromPlayer(uint64 player, uint64 *items, int itemsLen, uint64 assignToPlayer)
Definition TC9GrpcHandler.cpp:92
static GetPlayerItemsByGuidsResponse GetPlayerItemsByGuids(uint64 player, uint64 *items, int items_len)
Definition TC9GrpcHandler.cpp:25
static BattlegroundStartResponse StartBattleground(BattlegroundStartRequest *request)
Definition TC9GrpcHandler.cpp:277

References ToCloud9GrpcHandler::AddExistingItemToPlayer(), ToCloud9GrpcHandler::AddPlayersToBattleground(), ToCloud9GrpcHandler::CanPlayerInteractWithGOAndType(), ToCloud9GrpcHandler::CanPlayerInteractWithNPCAndFlags(), ToCloud9GrpcHandler::CanPlayerJoinBattlegroundQueue(), ToCloud9GrpcHandler::CanPlayerTeleportToBattleground(), ToCloud9GrpcHandler::GetMoneyForPlayer(), ToCloud9GrpcHandler::GetPlayerItemsByGuids(), HandleMonitoringRequest(), ToCloud9GrpcHandler::ModifyMoneyForPlayer(), ToCloud9GrpcHandler::RemoveItemsWithGuidsFromPlayer(), and ToCloud9GrpcHandler::StartBattleground().

Referenced by Init().

◆ SetupHooks()

void ToCloud9Sidecar::SetupHooks ( )
156{
157 TC9SetOnMapsReassignedHook(&ToCloud9Sidecar::OnMapsReassigned);
158
159 TC9SetOnGuildMemberLeftHook(&ToCloud9GuildHooks::OnGuildMemberLeft);
160 TC9SetOnGuildMemberAddedHook(&ToCloud9GuildHooks::OnGuildMemberAdded);
161 TC9SetOnGuildMemberRemovedHook(&ToCloud9GuildHooks::OnGuildMemberRemoved);
162
163 TC9SetOnGroupCreatedHook(&ToCloud9GroupHooks::OnGroupCreated);
164 TC9SetOnGroupDisbandedHook(&ToCloud9GroupHooks::OnGroupDisbanded);
165 TC9SetOnGroupMemberAddedHook(&ToCloud9GroupHooks::OnGroupMemberAdded);
166 TC9SetOnGroupMemberRemovedHook(&ToCloud9GroupHooks::OnGroupMemberRemoved);
167 TC9SetOnGroupLootTypeChangedHook(&ToCloud9GroupHooks::OnGroupLootTypeChanged);
168 TC9SetOnGroupConvertedToRaidHook(&ToCloud9GroupHooks::OnGroupConvertedToRaid);
169 TC9SetOnGroupRaidDifficultyChangedHook(&ToCloud9GroupHooks::OnGroupRaidDifficultyChanged);
170 TC9SetOnGroupDungeonDifficultyChangedHook(&ToCloud9GroupHooks::OnGroupDungeonDifficultyChanged);
171}
static void OnGroupRaidDifficultyChanged(uint32 group, uint8 difficulty)
Definition TC9GroupHooks.cpp:101
static void OnGroupMemberRemoved(uint32 group, uint64 member, uint64 newLeader)
Definition TC9GroupHooks.cpp:72
static void OnGroupConvertedToRaid(uint32 group)
Definition TC9GroupHooks.cpp:93
static void OnGroupCreated(EventObjectGroup *group)
Definition TC9GroupHooks.cpp:24
static void OnGroupDungeonDifficultyChanged(uint32 group, uint8 difficulty)
Definition TC9GroupHooks.cpp:109
static void OnGroupMemberAdded(uint32 group, uint64 member)
Definition TC9GroupHooks.cpp:64
static void OnGroupLootTypeChanged(uint32 group, uint8 lootType, uint64 looter, uint8 lootThreshold)
Definition TC9GroupHooks.cpp:80
static void OnGroupDisbanded(uint32 group)
Definition TC9GroupHooks.cpp:56
static void OnGuildMemberRemoved(uint64 guild, uint64 character)
Definition TC9GuildHooks.cpp:31
static void OnGuildMemberLeft(uint64 guild, uint64 character)
Definition TC9GuildHooks.cpp:40
static void OnGuildMemberAdded(uint64 guild, uint64 character)
Definition TC9GuildHooks.cpp:22
static void OnMapsReassigned(uint32 *addedMaps, int addedMapsSize, uint32 *removedMaps, int removedMapsSize)
Definition TC9Sidecar.cpp:260

References ToCloud9GroupHooks::OnGroupConvertedToRaid(), ToCloud9GroupHooks::OnGroupCreated(), ToCloud9GroupHooks::OnGroupDisbanded(), ToCloud9GroupHooks::OnGroupDungeonDifficultyChanged(), ToCloud9GroupHooks::OnGroupLootTypeChanged(), ToCloud9GroupHooks::OnGroupMemberAdded(), ToCloud9GroupHooks::OnGroupMemberRemoved(), ToCloud9GroupHooks::OnGroupRaidDifficultyChanged(), ToCloud9GuildHooks::OnGuildMemberAdded(), ToCloud9GuildHooks::OnGuildMemberLeft(), ToCloud9GuildHooks::OnGuildMemberRemoved(), and OnMapsReassigned().

Referenced by Init().

Member Data Documentation

◆ _assignedMapsByID

bool ToCloud9Sidecar::_assignedMapsByID[MAX_MAP_ID]
private

Referenced by Init(), and IsMapAssigned().

◆ _asyncTasksProcessor

AsyncCallbackProcessor<AsyncTask<bool> > ToCloud9Sidecar::_asyncTasksProcessor
private

Referenced by ProcessAsyncTasks().

◆ _clusterModeEnabled

bool ToCloud9Sidecar::_clusterModeEnabled
private

◆ _isCrossrealm

bool ToCloud9Sidecar::_isCrossrealm
private

Referenced by Init(), and IsCrossrealm().


The documentation for this class was generated from the following files: