Events, minor apis, stubs for future pr (#9)

* StructureGrowEvent, expose internal dimension id

* Update StructureGrowEvent.cs

* PlayerLoginEvent, ability to change xuids, get xuids, stub for experimental player connection api

* add docs, fix up to use cmake

---------

Co-authored-by: sylvessa <225480449+sylvessa@users.noreply.github.com>
This commit is contained in:
DrPerkyLegit 2026-04-02 18:22:07 -04:00 committed by GitHub
parent 9f013dbb7f
commit ebc1d4c640
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 612 additions and 31 deletions

View file

@ -17,8 +17,9 @@ namespace FourKitBridge
{
typedef void(__stdcall *fn_initialize)();
typedef int(__stdcall *fn_fire_player_prelogin)(const char* nameUtf8, int nameByteLen, const char* ipUtf8, int ipByteLen, int port);
typedef void(__stdcall *fn_fire_player_join)(int entityId, const char *nameUtf8, int nameByteLen, const char *uuidUtf8, int uuidByteLen);
typedef int(__stdcall* fn_fire_player_prelogin)(const char* nameUtf8, int nameByteLen, const char* ipUtf8, int ipByteLen, int port);
typedef int(__stdcall *fn_fire_player_login)(const char* nameUtf8, int nameByteLen, const char* ipUtf8, int ipByteLen, int port, int type, unsigned long long* offlineXUID, unsigned long long* onlineXUID);
typedef void(__stdcall *fn_fire_player_join)(int entityId, const char *nameUtf8, int nameByteLen, const char *uuidUtf8, int uuidByteLen, unsigned long long offlineXUID, unsigned long long onlineXUID);
typedef void(__stdcall *fn_fire_player_quit)(int entityId);
typedef int(__stdcall *fn_fire_player_kick)(int entityId, int disconnectReason,
const char *reasonUtf8, int reasonByteLen,
@ -31,6 +32,7 @@ typedef int(__stdcall *fn_fire_player_move)(int entityId,
typedef void(__stdcall *fn_set_native_callbacks)(void *damage, void *setHealth, void *teleport, void *setGameMode, void *broadcastMessage, void *setFallDistance, void *getPlayerSnapshot, void *sendMessage, void *setWalkSpeed, void *teleportEntity);
typedef void(__stdcall *fn_set_world_callbacks)(void *getTileId, void *getTileData, void *setTile, void *setTileData, void *breakBlock, void *getHighestBlockY, void *getWorldInfo, void *setWorldTime, void *setWeather, void *createExplosion, void *strikeLightning, void *setSpawnLocation, void *dropItem);
typedef void(__stdcall *fn_update_entity_id)(int oldEntityId, int newEntityId);
typedef int(__stdcall *fn_fire_structure_grow)(int dimId, int x, int y, int z, int species, int wasBonemeal, int entityId);
typedef int(__stdcall *fn_fire_player_chat)(int entityId, const char *msgUtf8, int msgByteLen, char *outBuf, int outBufSize, int *outLen);
typedef int(__stdcall *fn_fire_block_place)(int entityId, int dimId,
int placedX, int placedY, int placedZ,
@ -102,6 +104,7 @@ static std::unordered_map<int, OpenContainerInfo> s_openContainerInfo;
static fn_initialize s_managedInit = nullptr;
static fn_fire_player_prelogin s_managedFirePreLogin = nullptr;
static fn_fire_player_login s_managedFireLogin = nullptr;
static fn_fire_player_join s_managedFireJoin = nullptr;
static fn_update_entity_id s_managedUpdateEntityId = nullptr;
static fn_fire_player_quit s_managedFireQuit = nullptr;
@ -110,6 +113,7 @@ static fn_shutdown s_managedShutdown = nullptr;
static fn_fire_player_move s_managedFireMove = nullptr;
static fn_set_native_callbacks s_managedSetCallbacks = nullptr;
static fn_set_world_callbacks s_managedSetWorldCallbacks = nullptr;
static fn_fire_structure_grow s_managedFireStructureGrow = nullptr;
static fn_fire_player_chat s_managedFireChat = nullptr;
static fn_fire_block_place s_managedFireBlockPlace = nullptr;
static fn_fire_block_break s_managedFireBlockBreak = nullptr;
@ -167,7 +171,8 @@ void Initialize()
struct { const wchar_t *name; void **target; } entries[] = {
{L"Initialize", (void **)&s_managedInit},
{L"FirePlayerPreLogin", (void **)&s_managedFirePreLogin},
{L"FirePlayerPreLogin", (void**)&s_managedFirePreLogin},
{L"FirePlayerLogin", (void **)&s_managedFireLogin},
{L"FirePlayerJoin", (void **)&s_managedFireJoin},
{L"FirePlayerQuit", (void **)&s_managedFireQuit},
{L"FirePlayerKick", (void **)&s_managedFireKick},
@ -176,7 +181,8 @@ void Initialize()
{L"SetNativeCallbacks", (void **)&s_managedSetCallbacks},
{L"SetWorldCallbacks", (void **)&s_managedSetWorldCallbacks},
{L"UpdatePlayerEntityId", (void **)&s_managedUpdateEntityId},
{L"FirePlayerChat", (void **)&s_managedFireChat},
{L"FirePlayerChat", (void**)&s_managedFireChat},
{L"FireStructureGrow", (void **)&s_managedFireStructureGrow},
{L"FireBlockPlace", (void **)&s_managedFireBlockPlace},
{L"FireBlockBreak", (void **)&s_managedFireBlockBreak},
{L"FireEntityDamage", (void **)&s_managedFireEntityDamage},
@ -308,7 +314,8 @@ void Shutdown()
LogInfo("fourkit", "FourKit shut down.");
}
bool FirePlayerPreLogin(const std::wstring& name, const std::string& ip, int port) {
bool FirePlayerPreLogin(const std::wstring& name, const std::string& ip, int port)
{
if (!s_initialized || !s_managedFirePreLogin)
{
return true;
@ -325,7 +332,26 @@ bool FirePlayerPreLogin(const std::wstring& name, const std::string& ip, int por
return canceled != 0;
}
void FirePlayerJoin(int entityId, const std::wstring &name, const std::wstring &uuid)
bool FirePlayerLogin(const std::wstring& name, const std::string& ip, int port, int type, unsigned long long* onlineXUID, unsigned long long* offlineXUID)
{
if (!s_initialized || !s_managedFireLogin)
{
return true;
}
std::string nameUtf8 = ServerRuntime::StringUtils::WideToUtf8(name);
int canceled = s_managedFireLogin(
nameUtf8.empty() ? "" : nameUtf8.data(), (int)nameUtf8.size(),
ip.empty() ? "" : ip.data(), (int)ip.size(),
port, type, offlineXUID, onlineXUID);
LogDebugf("fourkit", "Fired PlayerLogin: %s", nameUtf8.data());
return canceled != 0;
}
void FirePlayerJoin(int entityId, const std::wstring &name, const std::wstring &uuid, unsigned long long onlineXUID, unsigned long long offlineXUID)
{
if (!s_initialized || !s_managedFireJoin)
{
@ -336,7 +362,8 @@ void FirePlayerJoin(int entityId, const std::wstring &name, const std::wstring &
std::string uuidUtf8 = ServerRuntime::StringUtils::WideToUtf8(uuid);
s_managedFireJoin(entityId,
nameUtf8.empty() ? "" : nameUtf8.data(), (int)nameUtf8.size(),
uuidUtf8.empty() ? "" : uuidUtf8.data(), (int)uuidUtf8.size());
uuidUtf8.empty() ? "" : uuidUtf8.data(), (int)uuidUtf8.size(),
offlineXUID, onlineXUID);
LogDebugf("fourkit", "Fired PlayerJoin: entityId=%d", entityId);
}
@ -421,6 +448,23 @@ bool FirePlayerMove(int entityId,
return cancelled != 0;
}
bool FireStructureGrow(int dimId, int x, int y, int z, int treeType, bool wasBonemeal, int entityId)
{
if (!s_initialized || !s_managedFireStructureGrow)
{
return false;
}
int cancelled = s_managedFireStructureGrow(dimId, x, y, z, treeType, wasBonemeal ? 1 : 0, entityId);
if (cancelled != 0)
{
return true;
}
return false;
}
bool FirePlayerChat(int entityId,
const std::wstring &message,
std::wstring &outFormatted)