feat: exported the BinaryStream API

This commit is contained in:
子沐呀
2024-10-10 00:59:14 +08:00
Unverified
parent 5b1467c8ef
commit 186d1ca72a
7 changed files with 670 additions and 5 deletions
+85
View File
@@ -0,0 +1,85 @@
#include "Global.h"
using namespace ll::hash_utils;
class LegacyScriptBinaryStreamManager {
private:
int64 mNextBinaryStreamId = 0;
std::unordered_map<uint64, std::shared_ptr<GMLIB_BinaryStream>> mBinaryStream;
public:
uint getNextId() { return mNextBinaryStreamId++; }
void cretateBinaryStream(uint id) { mBinaryStream[id] = std::make_shared<GMLIB_BinaryStream>(); }
void removeBinaryStream(uint64 id) { mBinaryStream.erase(id); }
std::shared_ptr<GMLIB_BinaryStream> getBinaryStream(uint64 id) {
return mBinaryStream.contains(id) ? mBinaryStream.at(id) : nullptr;
}
public:
static LegacyScriptBinaryStreamManager& getInstance() {
static std::unique_ptr<LegacyScriptBinaryStreamManager> instance;
if (!instance) instance = std::make_unique<LegacyScriptBinaryStreamManager>();
return *instance;
}
};
#define EXPORTAPI(funcName, type, fuc) \
RemoteCall::exportAs("GMLIB_BinaryStream_API", funcName, [](uint64 BinaryStreamId, type value) -> void { \
auto binaryStream = LegacyScriptBinaryStreamManager::getInstance().getBinaryStream(BinaryStreamId); \
if (binaryStream != nullptr) fuc; \
})
template <typename T>
struct Info;
template <typename T, typename R, typename A, typename... AS>
struct Info<R (T::*)(A, AS...)> {
using ArgT = A;
};
#define EXPORTAPI2(T) EXPORTAPI(#T, Info<decltype(&GMLIB_BinaryStream::T)>::ArgT, binaryStream->T(value))
void Export_BinaryStream_API() {
RemoteCall::exportAs("GMLIB_BinaryStream_API", "create", []() -> uint64 {
auto id = LegacyScriptBinaryStreamManager::getInstance().getNextId();
LegacyScriptBinaryStreamManager::getInstance().cretateBinaryStream(id);
return id;
});
RemoteCall::exportAs("GMLIB_BinaryStream_API", "reset", [](uint64 BinaryStreamId) -> void {
if (LegacyScriptBinaryStreamManager::getInstance().getBinaryStream(BinaryStreamId) == nullptr)
LegacyScriptBinaryStreamManager::getInstance().cretateBinaryStream(BinaryStreamId);
LegacyScriptBinaryStreamManager::getInstance().getBinaryStream(BinaryStreamId)->reset();
});
RemoteCall::exportAs(
"GMLIB_BinaryStream_API",
"sendTo",
[](uint64 BinaryStreamId, Player* player) -> void {
auto binaryStream = LegacyScriptBinaryStreamManager::getInstance().getBinaryStream(BinaryStreamId);
if (binaryStream != nullptr) binaryStream->sendTo(*player);
}
);
RemoteCall::exportAs("GMLIB_BinaryStream_API", "destroy", [](uint64 BinaryStreamId) -> void {
LegacyScriptBinaryStreamManager::getInstance().removeBinaryStream(BinaryStreamId);
});
EXPORTAPI("writePacketHeader", int, binaryStream->writePacketHeader((MinecraftPacketIds)value));
EXPORTAPI("writeUuid", std::string const&, binaryStream->writeUuid(mce::UUID::fromString(value)));
EXPORTAPI("writeItem", ItemStack*, NetworkItemStackDescriptor(*value).write(*binaryStream));
EXPORTAPI("writeString", std::string const&, binaryStream->writeString(value));
EXPORTAPI("writeCompoundTag", CompoundTag*, binaryStream->writeCompoundTag(*value));
EXPORTAPI2(writeBool);
EXPORTAPI2(writeByte);
EXPORTAPI2(writeDouble);
EXPORTAPI2(writeFloat);
EXPORTAPI2(writeSignedBigEndianInt);
EXPORTAPI2(writeSignedInt);
EXPORTAPI2(writeSignedInt64);
EXPORTAPI2(writeSignedShort);
EXPORTAPI2(writeUnsignedChar);
EXPORTAPI2(writeUnsignedInt);
EXPORTAPI2(writeUnsignedInt64);
EXPORTAPI2(writeUnsignedShort);
EXPORTAPI2(writeUnsignedVarInt);
EXPORTAPI2(writeUnsignedVarInt64);
EXPORTAPI2(writeVarInt);
EXPORTAPI2(writeVarInt64);
}
-1
View File
@@ -1,6 +1,5 @@
#include "Global.h"
#include <regex>
#include <vector>
bool isInteger(const std::string& str) {
std::regex pattern("^[+-]?\\d+$");
+1
View File
@@ -16,6 +16,7 @@ bool LegacyRemoteCallApi::load() {
Export_Compatibility_API();
ExportPAPI();
Export_Event_API();
Export_BinaryStream_API();
logger.info("GMLIB-LegacyRemoteCallApi Loaded!");
logger.info(
"Loaded Version: {} with {}",
+1 -1
View File
@@ -13,7 +13,7 @@ public:
}
void emplaceListener(std::string const& scriptEventId, ll::event::ListenerPtr listenerPtr) {
mEventListeners[doHash(scriptEventId)] = listenerPtr;
mEventListeners[doHash(scriptEventId)] = std::move(listenerPtr);
}
void removeListener(std::string const& scriptEventId) {
+2 -1
View File
@@ -21,4 +21,5 @@ extern void Export_Legacy_GMLib_ModAPI();
extern void Export_Legacy_GMLib_ServerAPI();
extern void Export_Compatibility_API();
extern void ExportPAPI();
extern void Export_Event_API();
extern void Export_Event_API();
extern void Export_BinaryStream_API();