feat(Core): Add clustering support (#16832)

Co-authored-by: 3kynox <thierry.prost@gmail.com>
Co-authored-by: nox <nox@noxen.net>
Co-authored-by: Ludwig <sudlud@users.noreply.github.com>
This commit is contained in:
Anton Popovichenko
2026-07-27 18:51:04 +02:00
committed by GitHub
parent f23ac046ab
commit 6f0ba8e896
80 changed files with 3675 additions and 297 deletions

2
deps/CMakeLists.txt vendored
View File

@@ -47,3 +47,5 @@ if (BUILD_TOOLS_MAPS)
add_subdirectory(libmpq)
add_subdirectory(fkYAML)
endif()
add_subdirectory(libsidecar)

View File

@@ -85,3 +85,7 @@ recastnavigation (Recast is state of the art navigation mesh construction toolse
fkYAML (A C++ header-only YAML library)
https://github.com/fktn-k/fkYAML
Version: 721edb3e1a817e527fd9e1e18a3bea300822522e
libsidecar (enables interaction with other components when the worldserver is running in cluster mode. It requires building a shared library first and putting it in the corresponding folder.)
https://github.com/walkline/ToCloud9/tree/master/game-server/libsidecar
Version: master

66
deps/libsidecar/CMakeLists.txt vendored Normal file
View File

@@ -0,0 +1,66 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Use stub implementation only when the real libsidecar is disabled.
if (NOT USE_REAL_LIBSIDECAR)
file(GLOB sources stub/*.c stub/*.h)
add_library(libsidecar STATIC ${sources})
set_target_properties(libsidecar
PROPERTIES
LINKER_LANGUAGE
CXX
INTERFACE_INCLUDE_DIRECTORIES
${CMAKE_CURRENT_SOURCE_DIR}/stub)
else()
add_library(libsidecar SHARED IMPORTED GLOBAL)
# Determine the correct library extension based on platform
if(WIN32)
set(LIBSIDECAR_EXTENSION "dll")
set(LIBSIDECAR_IMPORT_LIB "libsidecar.lib")
elseif(APPLE)
set(LIBSIDECAR_EXTENSION "dylib")
else()
set(LIBSIDECAR_EXTENSION "so")
endif()
if(WIN32)
set_target_properties(libsidecar
PROPERTIES
IMPORTED_LOCATION
${CMAKE_CURRENT_SOURCE_DIR}/libsidecar.${LIBSIDECAR_EXTENSION}
IMPORTED_IMPLIB
${CMAKE_CURRENT_SOURCE_DIR}/${LIBSIDECAR_IMPORT_LIB}
INTERFACE_INCLUDE_DIRECTORIES
${CMAKE_CURRENT_SOURCE_DIR}/include)
else()
set_target_properties(libsidecar
PROPERTIES
IMPORTED_LOCATION
${CMAKE_CURRENT_SOURCE_DIR}/libsidecar.${LIBSIDECAR_EXTENSION}
INTERFACE_INCLUDE_DIRECTORIES
${CMAKE_CURRENT_SOURCE_DIR}/include
IMPORTED_NO_SONAME
true)
set_target_properties(libsidecar PROPERTIES
IMPORTED_LOCATION_NOCONFIG
"${CMAKE_INSTALL_RPATH}/libsidecar.${LIBSIDECAR_EXTENSION}"
IMPORTED_SONAME_NOCONFIG
"libsidecar.${LIBSIDECAR_EXTENSION}")
endif()
endif()

View File

@@ -0,0 +1,77 @@
#ifndef __BATTLEGROUND_API__
#define __BATTLEGROUND_API__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum BattlegroundErrorCode {
BattlegroundErrorCodeNoError = 0,
BattlegroundErrorCodeNoHandler = 1,
BattlegroundErrorFailedToCreateBG = 2,
BattlegroundErrorBattlegroundNotFound = 3,
} BattlegroundErrorCode;
typedef struct {
uint8_t battlegroundTypeID;
uint32_t arenaType;
bool isRated;
uint32_t mapID;
uint8_t bracketLvl;
uint64_t *hordePlayersToAdd;
int hordePlayersToAddSize;
uint64_t *alliancePlayersToAdd;
int alliancePlayersToAddSize;
uint64_t *randomBGPlayers;
int randomBGPlayersSize;
} BattlegroundStartRequest;
typedef struct {
int errorCode;
uint64_t instanceID;
uint64_t instanceClientID;
} BattlegroundStartResponse;
typedef BattlegroundStartResponse (*BattlegroundStartHandler) (BattlegroundStartRequest* request);
void SetBattlegroundStartHandler(BattlegroundStartHandler h);
BattlegroundStartResponse CallBattlegroundStartHandler(BattlegroundStartRequest* request);
typedef struct {
uint8_t battlegroundTypeID;
uint64_t instanceID;
uint64_t *hordePlayersToAdd;
int hordePlayersToAddSize;
uint64_t *alliancePlayersToAdd;
int alliancePlayersToAddSize;
uint64_t *randomBGPlayers;
int randomBGPlayersSize;
} BattlegroundAddPlayersRequest;
typedef BattlegroundErrorCode (*BattlegroundAddPlayersHandler) (BattlegroundAddPlayersRequest* request);
void SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h);
BattlegroundErrorCode CallBattlegroundAddPlayersHandler(BattlegroundAddPlayersRequest* request);
typedef enum BattlegroundJoinCheckErrorCode {
BattlegroundJoinCheckErrorCodeOK = 0,
BattlegroundJoinCheckErrorCodeNoHook = 1,
BattlegroundJoinCheckErrorCodeResponseIsFalse = 2,
BattlegroundJoinCheckErrorCodePlayerNotFound = 3,
} BattlegroundJoinCheckErrorCode;
typedef BattlegroundJoinCheckErrorCode (*CanPlayerJoinBattlegroundQueueHandler)(uint64_t playerGuid);
void SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h);
BattlegroundJoinCheckErrorCode CallCanPlayerJoinBattlegroundQueueHandler(uint64_t playerGuid);
typedef BattlegroundJoinCheckErrorCode (*CanPlayerTeleportToBattlegroundHandler)(uint64_t playerGuid);
void SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h);
BattlegroundJoinCheckErrorCode CallCanPlayerTeleportToBattlegroundHandler(uint64_t playerGuid);
#ifdef __cplusplus
}
#endif
#endif

66
deps/libsidecar/include/events-group.h vendored Normal file
View File

@@ -0,0 +1,66 @@
#ifndef __EVENT_GROUP__
#define __EVENT_GROUP__
#include <stdint.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
enum GroupStatus {
GroupHookStatusOK = 0,
GroupHookStatusNoHook = 1
};
typedef struct {
uint32_t guid;
uint64_t leader;
uint8_t lootMethod;
uint64_t looterGuid;
uint8_t lootThreshold;
uint8_t groupType;
uint8_t difficulty;
uint8_t raidDifficulty;
uint64_t masterLooterGuid;
uint64_t *members;
uint8_t membersSize;
} EventObjectGroup;
typedef void (*OnGroupCreatedHook) (EventObjectGroup *group);
void SetOnGroupCreatedHook(OnGroupCreatedHook h);
int CallOnGroupCreatedHook(EventObjectGroup *group);
typedef void (*OnGroupMemberAddedHook) (uint32_t guid, uint64_t newMemberGuid);
void SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h);
int CallOnGroupMemberAddedHook(uint32_t guid, uint64_t newMemberGuid);
typedef void (*OnGroupMemberRemovedHook) (uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid);
void SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h);
int CallOnGroupMemberRemovedHook(uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid);
typedef void (*OnGroupDisbandedHook) (uint32_t guid);
void SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
int CallOnGroupDisbandedHook(uint32_t guid);
typedef void (*OnGroupLootTypeChangedHook) (uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold);
void SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h);
int CallOnGroupLootTypeChangedHook(uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold);
typedef void (*OnGroupDungeonDifficultyChangedHook) (uint32_t guid, uint8_t difficulty);
void SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h);
int CallOnGroupDungeonDifficultyChangedHook(uint32_t guid, uint8_t difficulty);
typedef void (*OnGroupRaidDifficultyChangedHook) (uint32_t guid, uint8_t difficulty);
void SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h);
int CallOnGroupRaidDifficultyChangedHook(uint32_t guid, uint8_t difficulty);
typedef void (*OnGroupConvertedToRaidHook) (uint32_t guid);
void SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
int CallOnGroupConvertedToRaidHook(uint32_t guid);
#ifdef __cplusplus
}
#endif
#endif

31
deps/libsidecar/include/events-guild.h vendored Normal file
View File

@@ -0,0 +1,31 @@
#ifndef __EVENT_GUILD__
#define __EVENT_GUILD__
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
enum GuildHookStatus {
GuildHookStatusOK = 0,
GuildHookStatusNoHook = 1
};
typedef void (*OnGuildMemberAddedHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
void SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h);
int CallOnGuildMemberAddedHook(uint64_t guild_id, uint64_t player_guid);
typedef void (*OnGuildMemberLeftHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
void SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h);
int CallOnGuildMemberLeftHook(uint64_t guild_id, uint64_t player_guid);
typedef void (*OnGuildMemberRemovedHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
void SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h);
int CallOnGuildMemberRemovedHook(uint64_t guild_id, uint64_t player_guid);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,23 @@
#ifndef __EVENT_SERVERS_REGISTRY__
#define __EVENT_SERVERS_REGISTRY__
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
enum ServersRegistryStatus {
ServersRegistryHookStatusOK = 0,
ServersRegistryHookStatusNoHook = 1
};
typedef void (*OnMapsReassignedHook) (uint32_t* /*maps_added*/, int /*maps_added_size*/, uint32_t* /*maps_removed*/, int /*maps_removed_size*/);
void SetOnMapsReassignedHook(OnMapsReassignedHook h);
int CallOnMapsReassignedHook(uint32_t* maps_added, int maps_added_size, uint32_t* maps_removed, int maps_removed_size);
#ifdef __cplusplus
}
#endif
#endif

116
deps/libsidecar/include/libsidecar.h vendored Normal file
View File

@@ -0,0 +1,116 @@
#ifndef __LIBSIDECAR_H__
#define __LIBSIDECAR_H__
#include <stdint.h>
#include <stdbool.h>
/* Export/import decoration for Windows DLL */
#ifdef _WIN32
#ifdef TC9_BUILDING_DLL
#define TC9_API __declspec(dllexport)
#else
#define TC9_API __declspec(dllimport)
#endif
#else
#ifdef TC9_BUILDING_DLL
#define TC9_API __attribute__((visibility("default")))
#else
#define TC9_API
#endif
#endif
/* Include all API headers */
#include "battleground-api.h"
#include "events-group.h"
#include "events-guild.h"
#include "events-servers-registry.h"
#include "monitoring.h"
#include "player-interactions-api.h"
#include "player-items-api.h"
#include "player-money-api.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Main library functions */
TC9_API void TC9InitLib(uint16_t port, uint32_t realmID, uint8_t isCrossRealm, char* availableMaps, uint32_t** assignedMaps, int* assignedMapsSize);
TC9_API void TC9GracefulShutdown();
TC9_API void TC9ProcessGRPCOrHTTPRequests();
TC9_API void TC9ProcessEventsHooks();
/* GUID generation */
TC9_API uint64_t TC9GetNextAvailableCharacterGuid(int realmID);
TC9_API uint64_t TC9GetNextAvailableItemGuid(int realmID);
TC9_API uint64_t TC9GetNextAvailableInstanceGuid(int realmID);
/* Map loading notification */
TC9_API void TC9ReadyToAcceptPlayersFromMaps(uint32_t* maps, int mapsLen);
/* Generic NATS pub/sub. Payloads are opaque bytes, subjects are arbitrary.
* Subscription callbacks run on the thread draining TC9ProcessEventsHooks
* (the world update thread), not on the NATS delivery thread. Both return
* 0 on success, -1 on failure.
*
* Example — a mod broadcasting and consuming its own events:
*
* // Publish (any thread):
* const char msg[] = "{\"zone\":1519,\"boss\":466}";
* TC9NatsPublish("mymod.boss.spawned", msg, sizeof(msg) - 1);
*
* // Subscribe once at startup; the handler runs on the world update
* // thread, so it is safe to touch game state from it:
* void OnBossSpawned(const char* subject, const char* payload, int payloadLen)
* {
* std::string data(payload, payloadLen); // payload is not NUL-terminated
* // ... react to the event ...
* }
* TC9NatsSubscribe("mymod.boss.spawned", &OnBossSpawned);
*/
typedef void (*TC9NatsMessageHandler)(const char* subject, const char* payload, int payloadLen);
TC9_API int TC9NatsPublish(const char* subject, const char* payload, int payloadLen);
TC9_API int TC9NatsSubscribe(const char* subject, TC9NatsMessageHandler handler);
/* Matchmaking notifications */
TC9_API void TC9PlayerLeftBattleground(uint64_t playerGUID, uint32_t realmID, uint32_t instanceID);
TC9_API void TC9BattlegroundStatusChanged(uint32_t instanceID, uint8_t status);
/* Event hooks registration */
TC9_API void TC9SetOnGroupCreatedHook(OnGroupCreatedHook h);
TC9_API void TC9SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h);
TC9_API void TC9SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h);
TC9_API void TC9SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
TC9_API void TC9SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h);
TC9_API void TC9SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h);
TC9_API void TC9SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h);
TC9_API void TC9SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
TC9_API void TC9SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h);
TC9_API void TC9SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h);
TC9_API void TC9SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h);
TC9_API void TC9SetOnMapsReassignedHook(OnMapsReassignedHook h);
/* Handler registration for gRPC requests */
TC9_API void TC9SetBattlegroundStartHandler(BattlegroundStartHandler h);
TC9_API void TC9SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h);
TC9_API void TC9SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h);
TC9_API void TC9SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h);
TC9_API void TC9SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h);
TC9_API void TC9SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h);
TC9_API void TC9SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h);
TC9_API void TC9SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h);
TC9_API void TC9SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h);
TC9_API void TC9SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h);
TC9_API void TC9SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h);
TC9_API void TC9SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h);
#ifdef __cplusplus
}
#endif
#endif /* __LIBSIDECAR_H__ */

36
deps/libsidecar/include/monitoring.h vendored Normal file
View File

@@ -0,0 +1,36 @@
#ifndef __MONITORING__
#define __MONITORING__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum MonitoringErrorCode {
MonitoringErrorCodeNoError = 0,
MonitoringErrorCodeNoHandler = 1,
} MonitoringErrorCode;
// MonitoringDataCollectorResponse request.
typedef struct {
int errorCode;
uint32_t connectedPlayers;
uint32_t diffMean;
uint32_t diffMedian;
uint32_t diff95Percentile;
uint32_t diff99Percentile;
uint32_t diffMaxPercentile;
} MonitoringDataCollectorResponse;
typedef MonitoringDataCollectorResponse (*MonitoringDataCollectorHandler)();
void SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h);
MonitoringDataCollectorResponse CallMonitoringDataCollectorHandler();
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,42 @@
#ifndef __PLAYER_INTERACTIONS_API__
#define __PLAYER_INTERACTIONS_API__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum PlayerInteractionErrorCode {
PlayerInteractionErrorCodeNoError = 0,
PlayerInteractionErrorCodeNoHandler = 1,
PlayerInteractionErrorCodeCodePlayerNotFound = 2,
} PlayerInteractionErrorCode;
// CanPlayerInteractWithNPCAndFlags request.
typedef struct {
int errorCode;
bool canInteract;
} CanPlayerInteractWithNPCAndFlagsResponse;
typedef CanPlayerInteractWithNPCAndFlagsResponse (*CanPlayerInteractWithNPCAndFlagsHandler) (uint64_t /*playerGUID*/, uint64_t /*npcGUID*/, uint32_t /*npcFlags*/);
void SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h);
CanPlayerInteractWithNPCAndFlagsResponse CallCanPlayerInteractWithNPCAndFlagsHandler(uint64_t player_guid, uint64_t npc_guid, uint32_t npc_flags);
// CanPlayerInteractWithGOAndType request.
typedef struct {
int errorCode;
bool canInteract;
} CanPlayerInteractWithGOAndTypeResponse;
typedef CanPlayerInteractWithGOAndTypeResponse (*CanPlayerInteractWithGOAndTypeHandler) (uint64_t /*playerGUID*/, uint64_t /*goGUID*/, uint8_t /*goType*/);
void SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h);
CanPlayerInteractWithGOAndTypeResponse CallCanPlayerInteractWithGOAndTypeHandler(uint64_t player_guid, uint64_t go_guid, uint8_t go_type);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,76 @@
#ifndef __PLAYER_ITEMS_API__
#define __PLAYER_ITEMS_API__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum PlayerItemErrorCode {
PlayerItemErrorCodeNoError = 0,
PlayerItemErrorCodeNoHandler = 1,
PlayerItemErrorCodePlayerNotFound = 2,
PlayerItemErrorNoInventorySpace = 3,
PlayerItemErrorUnknownTemplate = 4,
PlayerItemErrorFailedToCreateItem = 5
} PlayerItemErrorCode;
// GetPlayerItemsByGuids request.
typedef struct {
uint64_t guid;
uint32_t entry;
uint64_t owner;
uint8_t bagSlot;
uint8_t slot;
bool isTradable;
uint32_t count;
uint16_t flags;
uint8_t durability;
int8_t randomPropertyID;
const char* text;
} PlayerItem;
typedef struct {
int errorCode;
PlayerItem* items;
int itemsSize;
} GetPlayerItemsByGuidsResponse;
typedef GetPlayerItemsByGuidsResponse (*GetPlayerItemsByGuidsHandler) (uint64_t /*player_guid*/, uint64_t* /*items_guids*/, int /*items_guids_size*/);
void SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h);
GetPlayerItemsByGuidsResponse CallGetPlayerItemsByGuidsHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size);
// RemoveItemsWithGuidsFromPlayer request.
typedef struct {
int errorCode;
uint64_t* updatedItems;
int updatedItemsSize;
} RemoveItemsWithGuidsFromPlayerResponse;
typedef RemoveItemsWithGuidsFromPlayerResponse (*RemoveItemsWithGuidsFromPlayerHandler) (uint64_t /*player_guid*/, uint64_t* /*items_guids*/, int /*items_guids_size*/, uint64_t /*assign_player_guid*/);
void SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h);
RemoveItemsWithGuidsFromPlayerResponse CallRemoveItemsWithGuidsFromPlayerHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size, uint64_t assign_player_guid);
// AddExistingItemToPlayer request.
typedef struct {
uint64_t playerGuid;
uint64_t itemGuid;
uint32_t itemEntry;
uint32_t itemCount;
uint16_t itemFlags;
uint8_t itemDurability;
int8_t itemRandomPropertyID;
} AddExistingItemToPlayerRequest;
typedef PlayerItemErrorCode (*AddExistingItemToPlayerHandler) (AddExistingItemToPlayerRequest*);
void SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h);
PlayerItemErrorCode CallAddExistingItemToPlayerHandler(AddExistingItemToPlayerRequest*);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,43 @@
#ifndef __PLAYER_MONEY_API__
#define __PLAYER_MONEY_API__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum PlayerMoneyErrorCode {
PlayerMoneyErrorCodeNoError = 0,
PlayerMoneyErrorCodeNoHandler = 1,
PlayerMoneyErrorCodePlayerNotFound = 2,
PlayerMoneyErrorCodeTooMuchMoney = 3,
} PlayerMoneyErrorCode;
// GetMoneyForPlayer request.
typedef struct {
int errorCode;
uint32_t money;
} GetMoneyForPlayerResponse;
typedef GetMoneyForPlayerResponse (*GetMoneyForPlayerHandler) (uint64_t /*player_guid*/);
void SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h);
GetMoneyForPlayerResponse CallGetMoneyForPlayerHandler(uint64_t player_guid);
// ModifyMoneyForPlayer request.
typedef struct {
int errorCode;
uint32_t newMoneyValue;
} ModifyMoneyForPlayerResponse;
typedef ModifyMoneyForPlayerResponse (*ModifyMoneyForPlayerHandler) (uint64_t /*player_guid*/, int32_t /*amount*/);
void SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h);
ModifyMoneyForPlayerResponse CallModifyMoneyForPlayerHandler(uint64_t player_guid, int32_t amount);
#ifdef __cplusplus
}
#endif
#endif

55
deps/libsidecar/stub/battleground-api.c vendored Normal file
View File

@@ -0,0 +1,55 @@
#include "battleground-api.h"
static BattlegroundStartHandler battlegroundStartHandler;
void SetBattlegroundStartHandler(BattlegroundStartHandler h) {
battlegroundStartHandler = h;
}
BattlegroundStartResponse CallBattlegroundStartHandler(BattlegroundStartRequest* request) {
if (battlegroundStartHandler == 0) {
BattlegroundStartResponse resp;
resp.errorCode = BattlegroundErrorCodeNoHandler;
return resp;
}
return battlegroundStartHandler(request);
}
static BattlegroundAddPlayersHandler battlegroundAddPlayersHandler;
void SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h) {
battlegroundAddPlayersHandler = h;
}
BattlegroundErrorCode CallBattlegroundAddPlayersHandler(BattlegroundAddPlayersRequest* request) {
if (battlegroundAddPlayersHandler == 0) {
return BattlegroundErrorCodeNoHandler;
}
return battlegroundAddPlayersHandler(request);
}
static CanPlayerJoinBattlegroundQueueHandler canPlayerJoinBattlegroundQueueHandler = 0;
void SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h) {
canPlayerJoinBattlegroundQueueHandler = h;
}
BattlegroundJoinCheckErrorCode CallCanPlayerJoinBattlegroundQueueHandler(uint64_t playerGuid) {
if (canPlayerJoinBattlegroundQueueHandler == 0) {
return BattlegroundJoinCheckErrorCodeNoHook;
}
return canPlayerJoinBattlegroundQueueHandler(playerGuid);
}
static CanPlayerTeleportToBattlegroundHandler canPlayerTeleportToBattlegroundHandler = 0;
void SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h) {
canPlayerTeleportToBattlegroundHandler = h;
}
BattlegroundJoinCheckErrorCode CallCanPlayerTeleportToBattlegroundHandler(uint64_t playerGuid) {
if (canPlayerTeleportToBattlegroundHandler == 0) {
return BattlegroundJoinCheckErrorCodeNoHook;
}
return canPlayerTeleportToBattlegroundHandler(playerGuid);
}

69
deps/libsidecar/stub/battleground-api.h vendored Normal file
View File

@@ -0,0 +1,69 @@
#ifndef __BATTLEGROUND_API__
#define __BATTLEGROUND_API__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
typedef enum BattlegroundErrorCode {
BattlegroundErrorCodeNoError = 0,
BattlegroundErrorCodeNoHandler = 1,
BattlegroundErrorFailedToCreateBG = 2,
BattlegroundErrorBattlegroundNotFound = 3,
} BattlegroundErrorCode;
typedef struct {
uint8_t battlegroundTypeID;
uint32_t arenaType;
bool isRated;
uint32_t mapID;
uint8_t bracketLvl;
uint64_t *hordePlayersToAdd;
int hordePlayersToAddSize;
uint64_t *alliancePlayersToAdd;
int alliancePlayersToAddSize;
uint64_t *randomBGPlayers;
int randomBGPlayersSize;
} BattlegroundStartRequest;
typedef struct {
int errorCode;
uint64_t instanceID;
uint64_t instanceClientID;
} BattlegroundStartResponse;
typedef BattlegroundStartResponse (*BattlegroundStartHandler) (BattlegroundStartRequest* request);
void SetBattlegroundStartHandler(BattlegroundStartHandler h);
BattlegroundStartResponse CallBattlegroundStartHandler(BattlegroundStartRequest* request);
typedef struct {
uint8_t battlegroundTypeID;
uint64_t instanceID;
uint64_t *hordePlayersToAdd;
int hordePlayersToAddSize;
uint64_t *alliancePlayersToAdd;
int alliancePlayersToAddSize;
uint64_t *randomBGPlayers;
int randomBGPlayersSize;
} BattlegroundAddPlayersRequest;
typedef BattlegroundErrorCode (*BattlegroundAddPlayersHandler) (BattlegroundAddPlayersRequest* request);
void SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h);
BattlegroundErrorCode CallBattlegroundAddPlayersHandler(BattlegroundAddPlayersRequest* request);
typedef enum BattlegroundJoinCheckErrorCode {
BattlegroundJoinCheckErrorCodeOK = 0,
BattlegroundJoinCheckErrorCodeNoHook = 1,
BattlegroundJoinCheckErrorCodeResponseIsFalse = 2,
BattlegroundJoinCheckErrorCodePlayerNotFound = 3,
} BattlegroundJoinCheckErrorCode;
typedef BattlegroundJoinCheckErrorCode (*CanPlayerJoinBattlegroundQueueHandler)(uint64_t playerGuid);
void SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h);
BattlegroundJoinCheckErrorCode CallCanPlayerJoinBattlegroundQueueHandler(uint64_t playerGuid);
typedef BattlegroundJoinCheckErrorCode (*CanPlayerTeleportToBattlegroundHandler)(uint64_t playerGuid);
void SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h);
BattlegroundJoinCheckErrorCode CallCanPlayerTeleportToBattlegroundHandler(uint64_t playerGuid);
#endif

117
deps/libsidecar/stub/events-group.c vendored Normal file
View File

@@ -0,0 +1,117 @@
#include "events-group.h"
// OnGroupCreatedHook
OnGroupCreatedHook groupCreatedHook;
void SetOnGroupCreatedHook(OnGroupCreatedHook h) {
groupCreatedHook = h;
}
int CallOnGroupCreatedHook(EventObjectGroup *group) {
if (groupCreatedHook == 0) {
return GroupHookStatusNoHook;
}
groupCreatedHook(group);
return GroupHookStatusOK;
}
// GroupMemberAdded
static OnGroupMemberAddedHook groupMemberAddedHook;
void SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h) {
groupMemberAddedHook = h;
}
int CallOnGroupMemberAddedHook(uint32_t guid, uint64_t newMemberGuid) {
if (groupMemberAddedHook == 0) {
return GroupHookStatusNoHook;
}
groupMemberAddedHook(guid, newMemberGuid);
return GroupHookStatusOK;
}
// GroupMemberRemoved
static OnGroupMemberRemovedHook groupMemberRemovedHook;
void SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h) {
groupMemberRemovedHook = h;
}
int CallOnGroupMemberRemovedHook(uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid) {
if (groupMemberRemovedHook == 0) {
return GroupHookStatusNoHook;
}
groupMemberRemovedHook(guid, removedMemberGuid, newLeaderGuid);
return GroupHookStatusOK;
}
typedef void (*OnGroupDisbandedHook) (uint32_t guid);
void SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
int CallOnGroupDisbandedHook(uint32_t guid);
static OnGroupDisbandedHook groupDisbandedHook;
void SetOnGroupDisbandedHook(OnGroupDisbandedHook h) {
groupDisbandedHook = h;
}
int CallOnGroupDisbandedHook(uint32_t guid) {
if (groupDisbandedHook == 0) {
return GroupHookStatusNoHook;
}
groupDisbandedHook(guid);
return GroupHookStatusOK;
}
static OnGroupLootTypeChangedHook groupLootTypeChanged;
void SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h) {
groupLootTypeChanged = h;
}
int CallOnGroupLootTypeChangedHook(uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold) {
if (groupLootTypeChanged == 0) {
return GroupHookStatusNoHook;
}
groupLootTypeChanged(guid, lootMethod, looter, lootThreshold);
return GroupHookStatusOK;
}
static OnGroupDungeonDifficultyChangedHook groupDungeonDifficultyChanged;
void SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h) {
groupDungeonDifficultyChanged = h;
}
int CallOnGroupDungeonDifficultyChangedHook(uint32_t guid, uint8_t difficulty) {
if (groupDungeonDifficultyChanged == 0) {
return GroupHookStatusNoHook;
}
groupDungeonDifficultyChanged(guid, difficulty);
return GroupHookStatusOK;
}
static OnGroupRaidDifficultyChangedHook groupRaidDifficultyChanged;
void SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h) {
groupRaidDifficultyChanged = h;
}
int CallOnGroupRaidDifficultyChangedHook(uint32_t guid, uint8_t difficulty) {
if (groupRaidDifficultyChanged == 0) {
return GroupHookStatusNoHook;
}
groupRaidDifficultyChanged(guid, difficulty);
return GroupHookStatusOK;
}
typedef void (*OnGroupConvertedToRaidHook) (uint32_t guid);
void SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
int CallOnGroupConvertedToRaidHook(uint32_t guid);
static OnGroupConvertedToRaidHook groupConvertedToRaid;
void SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h) {
groupConvertedToRaid = h;
}
int CallOnGroupConvertedToRaidHook(uint32_t guid) {
if (groupConvertedToRaid == 0) {
return GroupHookStatusNoHook;
}
groupConvertedToRaid(guid);
return GroupHookStatusOK;
}

58
deps/libsidecar/stub/events-group.h vendored Normal file
View File

@@ -0,0 +1,58 @@
#ifndef __EVENT_GROUP__
#define __EVENT_GROUP__
#include <stdint.h>
#include <stdlib.h>
enum GroupStatus {
GroupHookStatusOK = 0,
GroupHookStatusNoHook = 1
};
typedef struct {
uint32_t guid;
uint64_t leader;
uint8_t lootMethod;
uint64_t looterGuid;
uint8_t lootThreshold;
uint8_t groupType;
uint8_t difficulty;
uint8_t raidDifficulty;
uint64_t masterLooterGuid;
uint64_t *members;
uint8_t membersSize;
} EventObjectGroup;
typedef void (*OnGroupCreatedHook) (EventObjectGroup *group);
void SetOnGroupCreatedHook(OnGroupCreatedHook h);
int CallOnGroupCreatedHook(EventObjectGroup *group);
typedef void (*OnGroupMemberAddedHook) (uint32_t guid, uint64_t newMemberGuid);
void SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h);
int CallOnGroupMemberAddedHook(uint32_t guid, uint64_t newMemberGuid);
typedef void (*OnGroupMemberRemovedHook) (uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid);
void SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h);
int CallOnGroupMemberRemovedHook(uint32_t guid, uint64_t removedMemberGuid, uint64_t newLeaderGuid);
typedef void (*OnGroupDisbandedHook) (uint32_t guid);
void SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
int CallOnGroupDisbandedHook(uint32_t guid);
typedef void (*OnGroupLootTypeChangedHook) (uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold);
void SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h);
int CallOnGroupLootTypeChangedHook(uint32_t guid, uint8_t lootMethod, uint64_t looter, uint8_t lootThreshold);
typedef void (*OnGroupDungeonDifficultyChangedHook) (uint32_t guid, uint8_t difficulty);
void SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h);
int CallOnGroupDungeonDifficultyChangedHook(uint32_t guid, uint8_t difficulty);
typedef void (*OnGroupRaidDifficultyChangedHook) (uint32_t guid, uint8_t difficulty);
void SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h);
int CallOnGroupRaidDifficultyChangedHook(uint32_t guid, uint8_t difficulty);
typedef void (*OnGroupConvertedToRaidHook) (uint32_t guid);
void SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
int CallOnGroupConvertedToRaidHook(uint32_t guid);
#endif

43
deps/libsidecar/stub/events-guild.c vendored Normal file
View File

@@ -0,0 +1,43 @@
#include "events-guild.h"
// GuildMemberAddedHook
OnGuildMemberAddedHook guildMemberAddedHook;
void SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h) {
guildMemberAddedHook = h;
}
int CallOnGuildMemberAddedHook(uint64_t guild_id, uint64_t player_guid) {
if (guildMemberAddedHook == 0) {
return GuildHookStatusNoHook;
}
guildMemberAddedHook(guild_id, player_guid);
return GuildHookStatusOK;
}
// GuildMemberLeft
static OnGuildMemberLeftHook guildMemberLeftHook;
void SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h) {
guildMemberLeftHook = h;
}
int CallOnGuildMemberLeftHook(uint64_t guild_id, uint64_t player_guid) {
if (guildMemberLeftHook == 0) {
return GuildHookStatusNoHook;
}
guildMemberLeftHook(guild_id, player_guid);
return GuildHookStatusOK;
}
// GuildMemberRemoved
static OnGuildMemberRemovedHook guildMemberRemovedHook;
void SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h) {
guildMemberRemovedHook = h;
}
int CallOnGuildMemberRemovedHook(uint64_t guild_id, uint64_t player_guid) {
if (guildMemberRemovedHook == 0) {
return GuildHookStatusNoHook;
}
guildMemberRemovedHook(guild_id, player_guid);
return GuildHookStatusOK;
}

23
deps/libsidecar/stub/events-guild.h vendored Normal file
View File

@@ -0,0 +1,23 @@
#ifndef __EVENT_GUILD__
#define __EVENT_GUILD__
#include <stdint.h>
enum GuildHookStatus {
GuildHookStatusOK = 0,
GuildHookStatusNoHook = 1
};
typedef void (*OnGuildMemberAddedHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
void SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h);
int CallOnGuildMemberAddedHook(uint64_t guild_id, uint64_t player_guid);
typedef void (*OnGuildMemberLeftHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
void SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h);
int CallOnGuildMemberLeftHook(uint64_t guild_id, uint64_t player_guid);
typedef void (*OnGuildMemberRemovedHook) (uint64_t /*guild_id*/, uint64_t /*player_guid*/);
void SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h);
int CallOnGuildMemberRemovedHook(uint64_t guild_id, uint64_t player_guid);
#endif

View File

@@ -0,0 +1,15 @@
#include "events-servers-registry.h"
// MapsReassignedHook
OnMapsReassignedHook mapsReassignedHook;
void SetOnMapsReassignedHook(OnMapsReassignedHook h) {
mapsReassignedHook = h;
}
int CallOnMapsReassignedHook(uint32_t* maps_added, int maps_added_size, uint32_t* maps_removed, int maps_removed_size) {
if (mapsReassignedHook == 0) {
return ServersRegistryHookStatusNoHook;
}
mapsReassignedHook(maps_added, maps_added_size, maps_removed, maps_removed_size);
return ServersRegistryHookStatusOK;
}

View File

@@ -0,0 +1,15 @@
#ifndef __EVENT_SERVERS_REGISTRY__
#define __EVENT_SERVERS_REGISTRY__
#include <stdint.h>
enum ServersRegistryStatus {
ServersRegistryHookStatusOK = 0,
ServersRegistryHookStatusNoHook = 1
};
typedef void (*OnMapsReassignedHook) (uint32_t* /*maps_added*/, int /*maps_added_size*/, uint32_t* /*maps_removed*/, int /*maps_removed_size*/);
void SetOnMapsReassignedHook(OnMapsReassignedHook h);
int CallOnMapsReassignedHook(uint32_t* maps_added, int maps_added_size, uint32_t* maps_removed, int maps_removed_size);
#endif

138
deps/libsidecar/stub/libsidecar.c vendored Normal file
View File

@@ -0,0 +1,138 @@
#include "libsidecar.h"
#include <stdio.h>
#include <stdlib.h>
void panicWithTC9Unavailable(const char* message) {
fprintf(stderr, "Tried to call '%s', but using stub for libsidecar. Use -DUSE_REAL_LIBSIDECAR=ON in cmake to use the real one.\n", message);
exit(EXIT_FAILURE);
}
// TC9SetBattlegroundStartHandler sets handler for starting battleground.
//
extern void TC9SetBattlegroundStartHandler(BattlegroundStartHandler h) { panicWithTC9Unavailable("TC9SetBattlegroundStartHandler"); }
// TC9SetBattlegroundAddPlayersHandler sets handler for adding players to battleground.
//
extern void TC9SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h) { panicWithTC9Unavailable("TC9SetBattlegroundAddPlayersHandler"); }
void TC9SetOnGroupCreatedHook(OnGroupCreatedHook h) { panicWithTC9Unavailable("TC9SetOnGroupCreatedHook"); }
// TC9SetOnGroupMemberAddedHook sets hook for member added event.
//
void TC9SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h) { panicWithTC9Unavailable("TC9SetOnGroupMemberAddedHook"); }
// TC9SetOnGroupMemberRemovedHook sets hook for member left/kicked event.
//
void TC9SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h) { panicWithTC9Unavailable("TC9SetOnGroupMemberRemovedHook"); }
// TC9SetOnGroupDisbandedHook sets hook for group disbanded event.
//
void TC9SetOnGroupDisbandedHook(OnGroupDisbandedHook h) { panicWithTC9Unavailable("TC9SetOnGroupDisbandedHook"); }
// TC9SetOnGroupLootTypeChangedHook sets hook for group loot type changed event.
//
void TC9SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h) { panicWithTC9Unavailable("TC9SetOnGroupLootTypeChangedHook"); }
// TC9SetOnGroupDungeonDifficultyChangedHook sets hook for group dungeon difficulty changed event.
//
void TC9SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h) { panicWithTC9Unavailable("TC9SetOnGroupDungeonDifficultyChangedHook"); }
// TC9SetOnGroupRaidDifficultyChangedHook sets hook for group raid difficulty changed event.
//
void TC9SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h) { panicWithTC9Unavailable("TC9SetOnGroupRaidDifficultyChangedHook"); }
// TC9SetOnGroupConvertedToRaidHook sets hook for group converted to raid event.
//
void TC9SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h) { panicWithTC9Unavailable("TC9SetOnGroupConvertedToRaidHook"); }
void TC9SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h) { panicWithTC9Unavailable("TC9SetOnGuildMemberAddedHook"); }
// TC9SetOnGuildMemberRemovedHook sets hook for guild member removed (kicked) event.
void TC9SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h) { panicWithTC9Unavailable("TC9SetOnGuildMemberRemovedHook"); }
// TC9SetOnGuildMemberLeftHook sets hook for guild member left event.
void TC9SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h) { panicWithTC9Unavailable("TC9SetOnGuildMemberLeftHook"); }
// TC9ProcessEventsHooks calls all events hooks.
void TC9ProcessEventsHooks() { panicWithTC9Unavailable("TC9ProcessEventsHooks"); }
// TC9ProcessGRPCOrHTTPRequests calls all grpc or http handlers in queue.
//
void TC9ProcessGRPCOrHTTPRequests() { panicWithTC9Unavailable("TC9ProcessGRPCOrHTTPRequests"); }
// TC9GetNextAvailableCharacterGuid returns next available characters GUID. Thread unsafe.
uint64_t TC9GetNextAvailableCharacterGuid(int realmID) { panicWithTC9Unavailable("TC9GetNextAvailableCharacterGuid"); return 0; }
// TC9GetNextAvailableItemGuid returns next available item GUID. Thread unsafe.
uint64_t TC9GetNextAvailableItemGuid(int realmID) { panicWithTC9Unavailable("TC9GetNextAvailableItemGuid"); return 0; }
// TC9GetNextAvailableInstanceGuid returns next available dungeon/raid instance GUID. Thread unsafe.
uint64_t TC9GetNextAvailableInstanceGuid(int realmID) { panicWithTC9Unavailable("TC9GetNextAvailableInstanceGuid"); return 0; }
// TC9InitLib inits lib by starting services like grpc and healthcheck.
// Adds game server to the servers registry that will make this server visible for game load balancer.
//
void TC9InitLib(uint16_t port, uint32_t realmID, uint8_t isCrossRealm, char* availableMaps, uint32_t** assignedMaps, int* assignedMapsSize) { panicWithTC9Unavailable("TC9InitLib"); }
// TC9GracefulShutdown gracefully stops all running services.
//
void TC9GracefulShutdown() { panicWithTC9Unavailable("TC9GracefulShutdown"); }
// TC9ReadyToAcceptPlayersFromMaps notifies servers registry that this server
// loaded maps related data and ready to accept players from those maps.
//
void TC9ReadyToAcceptPlayersFromMaps(uint32_t* maps, int mapsLen) { panicWithTC9Unavailable("TC9ReadyToAcceptPlayersFromMaps"); }
// TC9SetCanPlayerInteractWithNPCAndFlagsHandler sets handler for can player interact with NPC and with given NPC flags request.
//
void TC9SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h) { panicWithTC9Unavailable("TC9SetCanPlayerInteractWithNPCAndFlagsHandler"); }
// TC9SetCanPlayerInteractWithGOAndTypeHandler sets handler for can player interact with GameObject and with given object type request.
//
void TC9SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h) { panicWithTC9Unavailable("TC9SetCanPlayerInteractWithGOAndTypeHandler"); }
// TC9SetGetPlayerItemsByGuidsHandler sets handler for getting players item by guids request.
void TC9SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h) { panicWithTC9Unavailable("TC9SetGetPlayerItemsByGuidsHandler"); }
// TC9SetRemoveItemsWithGuidsFromPlayerHandler sets handler for removing items by guids from player request.
void TC9SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h) { panicWithTC9Unavailable("TC9SetRemoveItemsWithGuidsFromPlayerHandler"); }
// TC9SetAddExistingItemToPlayerHandler sets handler for adding item to player request.
void TC9SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h) { panicWithTC9Unavailable("TC9SetAddExistingItemToPlayerHandler"); }
// TC9SetGetMoneyForPlayerHandler sets handler for getting money for player request.
//
void TC9SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h) { panicWithTC9Unavailable("TC9SetGetMoneyForPlayerHandler"); }
// TC9SetModifyMoneyForPlayerHandler sets handler for modify money for given player request.
//
void TC9SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h) { panicWithTC9Unavailable("TC9SetModifyMoneyForPlayerHandler"); }
// TC9SetOnMapsReassignedHook sets hook for maps reassigning by servers registry event.
//
void TC9SetOnMapsReassignedHook(OnMapsReassignedHook h) { panicWithTC9Unavailable("TC9SetOnMapsReassignedHook"); }
// TC9SetMonitoringDataCollectorHandler sets handler for getting data to handle monitoring request.
//
void TC9SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h) { panicWithTC9Unavailable("TC9SetMonitoringDataCollectorHandler"); }
// TC9NatsPublish/Subscribe generic NATS pub/sub for in-process extensions
int TC9NatsPublish(const char* subject, const char* payload, int payloadLen) { panicWithTC9Unavailable("TC9NatsPublish"); return -1; }
int TC9NatsSubscribe(const char* subject, TC9NatsMessageHandler handler) { panicWithTC9Unavailable("TC9NatsSubscribe"); return -1; }
// TC9PlayerLeftBattleground notifies matchmaking server that player left battleground
//
void TC9PlayerLeftBattleground(uint64_t playerGUID, uint32_t realmID, uint32_t instanceID) { panicWithTC9Unavailable("TC9PlayerLeftBattleground"); }
// TC9BattlegroundStatusChanged notifies matchmaking server that battleground status changed
//
void TC9BattlegroundStatusChanged(uint32_t instanceID, uint8_t status) { panicWithTC9Unavailable("TC9BattlegroundStatusChanged"); }
// TC9SetCanPlayerJoinBattlegroundQueueHandler sets handler for checking if player can join to battleground queue.
//
void TC9SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h) { panicWithTC9Unavailable("TC9SetCanPlayerJoinBattlegroundQueueHandler"); }
// TC9SetCanPlayerTeleportToBattlegroundHandler sets handler for checking if player can teleport to battleground.
//
void TC9SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h) { panicWithTC9Unavailable("TC9SetCanPlayerTeleportToBattlegroundHandler"); }

84
deps/libsidecar/stub/libsidecar.h vendored Normal file
View File

@@ -0,0 +1,84 @@
#ifndef __LIBSIDECAR_H__
#define __LIBSIDECAR_H__
#include <stdint.h>
#include <stdbool.h>
/* Include all API headers */
#include "battleground-api.h"
#include "events-group.h"
#include "events-guild.h"
#include "events-servers-registry.h"
#include "monitoring.h"
#include "player-interactions-api.h"
#include "player-items-api.h"
#include "player-money-api.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Main library functions */
void TC9InitLib(uint16_t port, uint32_t realmID, uint8_t isCrossRealm, char* availableMaps, uint32_t** assignedMaps, int* assignedMapsSize);
void TC9GracefulShutdown();
void TC9ProcessGRPCOrHTTPRequests();
void TC9ProcessEventsHooks();
/* GUID generation */
uint64_t TC9GetNextAvailableCharacterGuid(int realmID);
uint64_t TC9GetNextAvailableItemGuid(int realmID);
uint64_t TC9GetNextAvailableInstanceGuid(int realmID);
/* Map loading notification */
void TC9ReadyToAcceptPlayersFromMaps(uint32_t* maps, int mapsLen);
/* Generic NATS pub/sub for in-process extensions. Subscribe callbacks run
* on the thread that calls TC9ProcessEventsHooks. Call after TC9InitLib.
* Both return 0 on success, -1 on error. */
typedef void (*TC9NatsMessageHandler)(const char* subject, const char* payload, int payloadLen);
int TC9NatsPublish(const char* subject, const char* payload, int payloadLen);
int TC9NatsSubscribe(const char* subject, TC9NatsMessageHandler handler);
/* Matchmaking notifications */
void TC9PlayerLeftBattleground(uint64_t playerGUID, uint32_t realmID, uint32_t instanceID);
void TC9BattlegroundStatusChanged(uint32_t instanceID, uint8_t status);
/* Event hooks registration */
void TC9SetOnGroupCreatedHook(OnGroupCreatedHook h);
void TC9SetOnGroupMemberAddedHook(OnGroupMemberAddedHook h);
void TC9SetOnGroupMemberRemovedHook(OnGroupMemberRemovedHook h);
void TC9SetOnGroupDisbandedHook(OnGroupDisbandedHook h);
void TC9SetOnGroupLootTypeChangedHook(OnGroupLootTypeChangedHook h);
void TC9SetOnGroupDungeonDifficultyChangedHook(OnGroupDungeonDifficultyChangedHook h);
void TC9SetOnGroupRaidDifficultyChangedHook(OnGroupRaidDifficultyChangedHook h);
void TC9SetOnGroupConvertedToRaidHook(OnGroupConvertedToRaidHook h);
void TC9SetOnGuildMemberAddedHook(OnGuildMemberAddedHook h);
void TC9SetOnGuildMemberRemovedHook(OnGuildMemberRemovedHook h);
void TC9SetOnGuildMemberLeftHook(OnGuildMemberLeftHook h);
void TC9SetOnMapsReassignedHook(OnMapsReassignedHook h);
/* Handler registration for gRPC requests */
void TC9SetBattlegroundStartHandler(BattlegroundStartHandler h);
void TC9SetBattlegroundAddPlayersHandler(BattlegroundAddPlayersHandler h);
void TC9SetCanPlayerJoinBattlegroundQueueHandler(CanPlayerJoinBattlegroundQueueHandler h);
void TC9SetCanPlayerTeleportToBattlegroundHandler(CanPlayerTeleportToBattlegroundHandler h);
void TC9SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h);
void TC9SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h);
void TC9SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h);
void TC9SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h);
void TC9SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h);
void TC9SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h);
void TC9SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h);
void TC9SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h);
#ifdef __cplusplus
}
#endif
#endif /* __LIBSIDECAR_H__ */

16
deps/libsidecar/stub/monitoring.c vendored Normal file
View File

@@ -0,0 +1,16 @@
#include "monitoring.h"
static MonitoringDataCollectorHandler monitoringDataCollectorHandler;
void SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h) {
monitoringDataCollectorHandler = h;
}
MonitoringDataCollectorResponse CallMonitoringDataCollectorHandler() {
if (monitoringDataCollectorHandler == 0) {
MonitoringDataCollectorResponse resp;
resp.errorCode = MonitoringErrorCodeNoHandler;
return resp;
}
return monitoringDataCollectorHandler();
}

28
deps/libsidecar/stub/monitoring.h vendored Normal file
View File

@@ -0,0 +1,28 @@
#ifndef __MONITORING__
#define __MONITORING__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
typedef enum MonitoringErrorCode {
MonitoringErrorCodeNoError = 0,
MonitoringErrorCodeNoHandler = 1,
} MonitoringErrorCode;
// MonitoringDataCollectorResponse request.
typedef struct {
int errorCode;
uint32_t connectedPlayers;
uint32_t diffMean;
uint32_t diffMedian;
uint32_t diff95Percentile;
uint32_t diff99Percentile;
uint32_t diffMaxPercentile;
} MonitoringDataCollectorResponse;
typedef MonitoringDataCollectorResponse (*MonitoringDataCollectorHandler)();
void SetMonitoringDataCollectorHandler(MonitoringDataCollectorHandler h);
MonitoringDataCollectorResponse CallMonitoringDataCollectorHandler();
#endif

View File

@@ -0,0 +1,31 @@
#include "player-interactions-api.h"
static CanPlayerInteractWithNPCAndFlagsHandler canPlayerInteractWithNPCAndFlagsHandler;
void SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h) {
canPlayerInteractWithNPCAndFlagsHandler = h;
}
CanPlayerInteractWithNPCAndFlagsResponse CallCanPlayerInteractWithNPCAndFlagsHandler(uint64_t player_guid, uint64_t npc_guid, uint32_t npc_flags) {
if (canPlayerInteractWithNPCAndFlagsHandler == 0) {
CanPlayerInteractWithNPCAndFlagsResponse resp;
resp.errorCode = PlayerInteractionErrorCodeNoHandler;
return resp;
}
return canPlayerInteractWithNPCAndFlagsHandler(player_guid, npc_guid, npc_flags);
}
static CanPlayerInteractWithGOAndTypeHandler canPlayerInteractWithGOAndTypeHandler;
void SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h) {
canPlayerInteractWithGOAndTypeHandler = h;
}
CanPlayerInteractWithGOAndTypeResponse CallCanPlayerInteractWithGOAndTypeHandler(uint64_t player_guid, uint64_t go_guid, uint8_t go_type) {
if (canPlayerInteractWithGOAndTypeHandler == 0) {
CanPlayerInteractWithGOAndTypeResponse resp;
resp.errorCode = PlayerInteractionErrorCodeNoHandler;
return resp;
}
return canPlayerInteractWithGOAndTypeHandler(player_guid, go_guid, go_type);
}

View File

@@ -0,0 +1,34 @@
#ifndef __PLAYER_INTERACTIONS_API__
#define __PLAYER_INTERACTIONS_API__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
typedef enum PlayerInteractionErrorCode {
PlayerInteractionErrorCodeNoError = 0,
PlayerInteractionErrorCodeNoHandler = 1,
PlayerInteractionErrorCodeCodePlayerNotFound = 2,
} PlayerInteractionErrorCode;
// CanPlayerInteractWithNPCAndFlags request.
typedef struct {
int errorCode;
bool canInteract;
} CanPlayerInteractWithNPCAndFlagsResponse;
typedef CanPlayerInteractWithNPCAndFlagsResponse (*CanPlayerInteractWithNPCAndFlagsHandler) (uint64_t /*playerGUID*/, uint64_t /*npcGUID*/, uint32_t /*npcFlags*/);
void SetCanPlayerInteractWithNPCAndFlagsHandler(CanPlayerInteractWithNPCAndFlagsHandler h);
CanPlayerInteractWithNPCAndFlagsResponse CallCanPlayerInteractWithNPCAndFlagsHandler(uint64_t player_guid, uint64_t npc_guid, uint32_t npc_flags);
// CanPlayerInteractWithGOAndType request.
typedef struct {
int errorCode;
bool canInteract;
} CanPlayerInteractWithGOAndTypeResponse;
typedef CanPlayerInteractWithGOAndTypeResponse (*CanPlayerInteractWithGOAndTypeHandler) (uint64_t /*playerGUID*/, uint64_t /*goGUID*/, uint8_t /*goType*/);
void SetCanPlayerInteractWithGOAndTypeHandler(CanPlayerInteractWithGOAndTypeHandler h);
CanPlayerInteractWithGOAndTypeResponse CallCanPlayerInteractWithGOAndTypeHandler(uint64_t player_guid, uint64_t go_guid, uint8_t go_type);
#endif

44
deps/libsidecar/stub/player-items-api.c vendored Normal file
View File

@@ -0,0 +1,44 @@
#include "player-items-api.h"
static GetPlayerItemsByGuidsHandler getPlayerItemsByGuidsHandler;
void SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h) {
getPlayerItemsByGuidsHandler = h;
}
GetPlayerItemsByGuidsResponse CallGetPlayerItemsByGuidsHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size) {
if (getPlayerItemsByGuidsHandler == 0) {
GetPlayerItemsByGuidsResponse resp;
resp.errorCode = PlayerItemErrorCodeNoHandler;
return resp;
}
return getPlayerItemsByGuidsHandler(player_guid, items_guids, items_guids_size);
}
static RemoveItemsWithGuidsFromPlayerHandler removeItemsWithGuidsFromPlayerHandler;
void SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h) {
removeItemsWithGuidsFromPlayerHandler = h;
}
RemoveItemsWithGuidsFromPlayerResponse CallRemoveItemsWithGuidsFromPlayerHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size, uint64_t assign_player_guid) {
if (removeItemsWithGuidsFromPlayerHandler == 0) {
RemoveItemsWithGuidsFromPlayerResponse resp;
resp.errorCode = PlayerItemErrorCodeNoHandler;
return resp;
}
return removeItemsWithGuidsFromPlayerHandler(player_guid, items_guids, items_guids_size, assign_player_guid);
}
static AddExistingItemToPlayerHandler addExistingItemToPlayerHandler;
void SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h) {
addExistingItemToPlayerHandler = h;
}
PlayerItemErrorCode CallAddExistingItemToPlayerHandler(AddExistingItemToPlayerRequest *r) {
if (addExistingItemToPlayerHandler == 0) {
return PlayerItemErrorCodeNoHandler;
}
return addExistingItemToPlayerHandler(r);
}

68
deps/libsidecar/stub/player-items-api.h vendored Normal file
View File

@@ -0,0 +1,68 @@
#ifndef __PLAYER_ITEMS_API__
#define __PLAYER_ITEMS_API__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
typedef enum PlayerItemErrorCode {
PlayerItemErrorCodeNoError = 0,
PlayerItemErrorCodeNoHandler = 1,
PlayerItemErrorCodePlayerNotFound = 2,
PlayerItemErrorNoInventorySpace = 3,
PlayerItemErrorUnknownTemplate = 4,
PlayerItemErrorFailedToCreateItem = 5
} PlayerItemErrorCode;
// GetPlayerItemsByGuids request.
typedef struct {
uint64_t guid;
uint32_t entry;
uint64_t owner;
uint8_t bagSlot;
uint8_t slot;
bool isTradable;
uint32_t count;
uint16_t flags;
uint8_t durability;
int8_t randomPropertyID;
const char* text;
} PlayerItem;
typedef struct {
int errorCode;
PlayerItem* items;
int itemsSize;
} GetPlayerItemsByGuidsResponse;
typedef GetPlayerItemsByGuidsResponse (*GetPlayerItemsByGuidsHandler) (uint64_t /*player_guid*/, uint64_t* /*items_guids*/, int /*items_guids_size*/);
void SetGetPlayerItemsByGuidsHandler(GetPlayerItemsByGuidsHandler h);
GetPlayerItemsByGuidsResponse CallGetPlayerItemsByGuidsHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size);
// RemoveItemsWithGuidsFromPlayer request.
typedef struct {
int errorCode;
uint64_t* updatedItems;
int updatedItemsSize;
} RemoveItemsWithGuidsFromPlayerResponse;
typedef RemoveItemsWithGuidsFromPlayerResponse (*RemoveItemsWithGuidsFromPlayerHandler) (uint64_t /*player_guid*/, uint64_t* /*items_guids*/, int /*items_guids_size*/, uint64_t /*assign_player_guid*/);
void SetRemoveItemsWithGuidsFromPlayerHandler(RemoveItemsWithGuidsFromPlayerHandler h);
RemoveItemsWithGuidsFromPlayerResponse CallRemoveItemsWithGuidsFromPlayerHandler(uint64_t player_guid, uint64_t* items_guids, int items_guids_size, uint64_t assign_player_guid);
// AddExistingItemToPlayer request.
typedef struct {
uint64_t playerGuid;
uint64_t itemGuid;
uint32_t itemEntry;
uint32_t itemCount;
uint16_t itemFlags;
uint8_t itemDurability;
int8_t itemRandomPropertyID;
} AddExistingItemToPlayerRequest;
typedef PlayerItemErrorCode (*AddExistingItemToPlayerHandler) (AddExistingItemToPlayerRequest*);
void SetAddExistingItemToPlayerHandler(AddExistingItemToPlayerHandler h);
PlayerItemErrorCode CallAddExistingItemToPlayerHandler(AddExistingItemToPlayerRequest*);
#endif

31
deps/libsidecar/stub/player-money-api.c vendored Normal file
View File

@@ -0,0 +1,31 @@
#include "player-money-api.h"
static GetMoneyForPlayerHandler getMoneyForPlayerHandler;
void SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h) {
getMoneyForPlayerHandler = h;
}
GetMoneyForPlayerResponse CallGetMoneyForPlayerHandler(uint64_t player_guid) {
if (getMoneyForPlayerHandler == 0) {
GetMoneyForPlayerResponse resp;
resp.errorCode = PlayerMoneyErrorCodeNoHandler;
return resp;
}
return getMoneyForPlayerHandler(player_guid);
}
static ModifyMoneyForPlayerHandler modifyMoneyForPlayerHandler;
void SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h) {
modifyMoneyForPlayerHandler = h;
}
ModifyMoneyForPlayerResponse CallModifyMoneyForPlayerHandler(uint64_t player_guid, int32_t amount) {
if (modifyMoneyForPlayerHandler == 0) {
ModifyMoneyForPlayerResponse resp;
resp.errorCode = PlayerMoneyErrorCodeNoHandler;
return resp;
}
return modifyMoneyForPlayerHandler(player_guid, amount);
}

35
deps/libsidecar/stub/player-money-api.h vendored Normal file
View File

@@ -0,0 +1,35 @@
#ifndef __PLAYER_MONEY_API__
#define __PLAYER_MONEY_API__
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
typedef enum PlayerMoneyErrorCode {
PlayerMoneyErrorCodeNoError = 0,
PlayerMoneyErrorCodeNoHandler = 1,
PlayerMoneyErrorCodePlayerNotFound = 2,
PlayerMoneyErrorCodeTooMuchMoney = 3,
} PlayerMoneyErrorCode;
// GetMoneyForPlayer request.
typedef struct {
int errorCode;
uint32_t money;
} GetMoneyForPlayerResponse;
typedef GetMoneyForPlayerResponse (*GetMoneyForPlayerHandler) (uint64_t /*player_guid*/);
void SetGetMoneyForPlayerHandler(GetMoneyForPlayerHandler h);
GetMoneyForPlayerResponse CallGetMoneyForPlayerHandler(uint64_t player_guid);
// ModifyMoneyForPlayer request.
typedef struct {
int errorCode;
uint32_t newMoneyValue;
} ModifyMoneyForPlayerResponse;
typedef ModifyMoneyForPlayerResponse (*ModifyMoneyForPlayerHandler) (uint64_t /*player_guid*/, int32_t /*amount*/);
void SetModifyMoneyForPlayerHandler(ModifyMoneyForPlayerHandler h);
ModifyMoneyForPlayerResponse CallModifyMoneyForPlayerHandler(uint64_t player_guid, int32_t amount);
#endif