#include "APIHelp.h" #include "BaseAPI.h" #include "McAPI.h" #include "BlockAPI.h" #include "ContainerAPI.h" #include "EntityAPI.h" #include "BlockEntityAPI.h" #include "NbtAPI.h" #include "NativeAPI.h" #include #include "PacketAPI.h" #include //////////////////// Class Definition //////////////////// ClassDefine PacketClassBuilder = defineClass("LLSE_Packet") .constructor(nullptr) .instanceFunction("asPointer", &PacketClass::asPointer) .instanceFunction("getName", &PacketClass::getName) .instanceFunction("getId", &PacketClass::getId) .build(); ClassDefine BinaryStreamClassBuilder = defineClass("BinaryStream") .constructor(&BinaryStreamClass::constructor) .instanceFunction("getData", &BinaryStreamClass::getAndReleaseData) .instanceFunction("reset", &BinaryStreamClass::reset) .instanceFunction("reserve", &BinaryStreamClass::reserve) .instanceFunction("writeBool", &BinaryStreamClass::writeBool) .instanceFunction("writeByte", &BinaryStreamClass::writeByte) .instanceFunction("writeDouble", &BinaryStreamClass::writeDouble) .instanceFunction("writeFloat", &BinaryStreamClass::writeFloat) .instanceFunction("writeSignedBigEndianInt", &BinaryStreamClass::writeSignedBigEndianInt) .instanceFunction("writeSignedInt", &BinaryStreamClass::writeSignedInt) .instanceFunction("writeSignedInt64", &BinaryStreamClass::writeSignedInt64) .instanceFunction("writeSignedShort", &BinaryStreamClass::writeSignedShort) .instanceFunction("writeString", &BinaryStreamClass::writeString) .instanceFunction("writeUnsignedChar", &BinaryStreamClass::writeUnsignedChar) .instanceFunction("writeUnsignedInt", &BinaryStreamClass::writeUnsignedInt) .instanceFunction("writeUnsignedInt64", &BinaryStreamClass::writeUnsignedInt64) .instanceFunction("writeUnsignedShort", &BinaryStreamClass::writeUnsignedShort) .instanceFunction("writeUnsignedVarInt", &BinaryStreamClass::writeUnsignedVarInt) .instanceFunction("writeUnsignedVarInt64", &BinaryStreamClass::writeUnsignedVarInt64) .instanceFunction("writeVarInt", &BinaryStreamClass::writeVarInt) .instanceFunction("writeVarInt64", &BinaryStreamClass::writeVarInt64) .instanceFunction("writeVec3", &BinaryStreamClass::writeVec3) .instanceFunction("createPacket", &BinaryStreamClass::createPacket) .build(); //////////////////// Packet Classes //////////////////// PacketClass::PacketClass(std::shared_ptr p) : ScriptClass(ScriptClass::ConstructFromCpp{}) { set(p); } // generating function Local PacketClass::newPacket(std::shared_ptr pkt) { auto out = new PacketClass(pkt); return out->getScriptObject(); } std::shared_ptr PacketClass::extract(Local v) { if (EngineScope::currentEngine()->isInstanceOf(v)) return EngineScope::currentEngine()->getNativeInstance(v)->get(); else return nullptr; } // member function Local PacketClass::asPointer(const Arguments& args) { try { std::shared_ptr pkt = get(); if (!pkt) return Local(); else return NativePointer::newNativePointer(pkt.get()); } CATCH("Fail in asPointer!") } Local PacketClass::getName() { try { std::shared_ptr pkt = get(); if (!pkt) { return Local(); } return String::newString(pkt->getName()); } CATCH("Fail in getPacketName!"); } Local PacketClass::getId() { try { std::shared_ptr pkt = get(); if (!pkt) { return Local(); } return Number::newNumber((int)pkt->getId()); } CATCH("Fail in getPacketId!"); } //////////////////// BinaryStream Classes //////////////////// BinaryStreamClass::BinaryStreamClass(BinaryStream* p) : ScriptClass(ScriptClass::ConstructFromCpp{}) { set(p); } // generating function Local BinaryStreamClass::newBinaryStream() { auto out = new BinaryStreamClass(new BinaryStream()); return out->getScriptObject(); } // member function Local BinaryStreamClass::getAndReleaseData() { try { BinaryStream* bs = get(); if (!bs) { return Local(); } return String::newString(bs->getAndReleaseData()); } CATCH("Fail in BinaryStream getData!"); } BinaryStreamClass* BinaryStreamClass::constructor(const Arguments& args) { try { return new BinaryStreamClass(args.thiz()); } CATCH_C("Fail in Create BinaryStreamClass!"); } Local BinaryStreamClass::reset() { try { BinaryStream* bs = get(); if (!bs) { return Local(); } bs->reset(); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream reset!"); } Local BinaryStreamClass::reserve(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* bs = get(); if (!bs) { return Local(); } bs->reserve(args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream reserve!"); } Local BinaryStreamClass::writeBool(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kBoolean); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeBool(args[0].asBoolean().value()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeBool!"); } Local BinaryStreamClass::writeByte(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeByte(args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeByte!"); } Local BinaryStreamClass::writeDouble(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeDouble(args[0].asNumber().toDouble()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeDouble!"); } Local BinaryStreamClass::writeFloat(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeFloat(args[0].asNumber().toFloat()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeFloat!"); } Local BinaryStreamClass::writeSignedBigEndianInt(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeSignedBigEndianInt(args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeSignedBigEndianInt!"); } Local BinaryStreamClass::writeSignedInt(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeSignedInt(args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeSignedInt!"); } Local BinaryStreamClass::writeSignedInt64(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeSignedInt64(args[0].asNumber().toInt64()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeSignedInt64!"); } Local BinaryStreamClass::writeSignedShort(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeSignedShort(args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeSignedShort!"); } Local BinaryStreamClass::writeString(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kString); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeString(args[0].asString().toString()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeString!"); } Local BinaryStreamClass::writeUnsignedChar(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeUnsignedChar(args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeUnsignedChar!"); } Local BinaryStreamClass::writeUnsignedInt(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeUnsignedInt((uint32_t)args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeUnsignedInt!"); } Local BinaryStreamClass::writeUnsignedInt64(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeUnsignedInt64((uint64_t)args[0].asNumber().toInt64()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeUnsignedInt64!"); } Local BinaryStreamClass::writeUnsignedShort(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeUnsignedShort((uint16_t)args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeUnsignedShort!"); } Local BinaryStreamClass::writeUnsignedVarInt(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeUnsignedVarInt((uint32_t)args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeUnsignedVarInt!"); } Local BinaryStreamClass::writeUnsignedVarInt64(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeUnsignedVarInt64((uint64_t)args[0].asNumber().toInt64()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeUnsignedVarInt64!"); } Local BinaryStreamClass::writeVarInt(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeVarInt(args[0].asNumber().toInt32()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeVarInt!"); } Local BinaryStreamClass::writeVarInt64(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } pkt->writeVarInt64(args[0].asNumber().toInt64()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeVarInt64!"); } Local BinaryStreamClass::writeVec3(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } if (!IsInstanceOf(args[0])) { LOG_WRONG_ARG_TYPE() return Local(); } FloatPos* posObj = FloatPos::extractPos(args[0]); pkt->writeType(posObj->getVec3()); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeVec3!"); } Local BinaryStreamClass::writeCompoundTag(const Arguments& args){ CHECK_ARGS_COUNT(args, 1); try { BinaryStream* pkt = get(); if (!pkt) { return Local(); } auto nbt = NbtCompoundClass::extract(args[0]); if (!nbt) { LOG_WRONG_ARG_TYPE() return Local(); } pkt->writeCompoundTag(*nbt); return Boolean::newBoolean(true); } CATCH("Fail in BinaryStream writeCompoundTag!"); } Local BinaryStreamClass::createPacket(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); try { BinaryStream* bs = get(); if (!bs) { return Local(); } auto pkt = MinecraftPackets::createPacket(args[0].asNumber().toInt32()); pkt->read(*bs); return PacketClass::newPacket(pkt); } CATCH("Fail in BinaryStream createPacket!"); }