#include "BaseAPI.h" #include "APIHelp.h" #include #include #include #include "LiteLoader/include/llapi/ServerAPI.h" #include "McAPI.h" #include #include ///////////////////// Enum ////////////////////// ClassDefine DamageCauseEnumBuilder = EnumDefineBuilder::build("DamageCause"); //////////////////// Class Definition //////////////////// ClassDefine IntPosBuilder = defineClass("IntPos") .constructor(&IntPos::create) .instanceProperty("x", &IntPos::getX, &IntPos::setX) .instanceProperty("y", &IntPos::getY, &IntPos::setY) .instanceProperty("z", &IntPos::getZ, &IntPos::setZ) .instanceProperty("dim", &IntPos::getDim) .instanceProperty("dimid", &IntPos::getDimId, &IntPos::setDimId) .instanceFunction("toString", &IntPos::toString) .build(); ClassDefine FloatPosBuilder = defineClass("FloatPos") .constructor(&FloatPos::create) .instanceProperty("x", &FloatPos::getX, &FloatPos::setX) .instanceProperty("y", &FloatPos::getY, &FloatPos::setY) .instanceProperty("z", &FloatPos::getZ, &FloatPos::setZ) .instanceProperty("dim", &FloatPos::getDim) .instanceProperty("dimid", &FloatPos::getDimId, &FloatPos::setDimId) .instanceFunction("toString", &FloatPos::toString) .build(); ClassDefine DirectionAngleBuilder = defineClass("DirectionAngle") .constructor(&DirectionAngle::create) .instanceProperty("pitch", &DirectionAngle::getPitch, &DirectionAngle::setPitch) .instanceProperty("yaw", &DirectionAngle::getYaw, &DirectionAngle::setYaw) .instanceFunction("toFacing", &DirectionAngle::toFacing) .instanceFunction("toString", &DirectionAngle::toString) .build(); //////////////////// IntPos //////////////////// IntPos* IntPos::create(const Arguments& args) { if (args.size() < 3) return nullptr; try { IntPos* p = new IntPos(args.thiz()); p->x = args[0].asNumber().toInt32(); p->y = args[1].asNumber().toInt32(); p->z = args[2].asNumber().toInt32(); p->dim = args[3].asNumber().toInt32(); return p; } catch (...) { return nullptr; } } Local IntPos::newPos(int x, int y, int z, int dim) { return EngineScope::currentEngine()->newNativeClass(x, y, z, dim); } Local IntPos::newPos(const BlockPos& b, int dim) { return IntPos::newPos(b.x, b.y, b.z, dim); } Local IntPos::newPos(const IntVec4& v) { return IntPos::newPos(v.x, v.y, v.z, v.dim); } Local IntPos::newPos(const BlockPos* b, int dim) { return IntPos::newPos(b->x, b->y, b->z, dim); } Local IntPos::newPos(const BlockPos* b, BlockSource* bs) { return IntPos::newPos(b->x, b->y, b->z, (int)bs->getDimensionId()); } IntPos* IntPos::extractPos(Local v) { if (EngineScope::currentEngine()->isInstanceOf(v)) return EngineScope::currentEngine()->getNativeInstance(v); else return nullptr; } Local IntPos::getDim() { return String::newString(DimId2Name(dim)); } Local IntPos::toString() { try { return String::newString(fmt::format("{}({}, {}, {})", DimId2Name(dim), x, y, z)); } CATCH("Fail in toString!"); } //////////////////// FloatPos //////////////////// FloatPos* FloatPos::create(const Arguments& args) { if (args.size() < 3) return nullptr; try { FloatPos* p = new FloatPos(args.thiz()); p->x = args[0].asNumber().toFloat(); p->y = args[1].asNumber().toFloat(); p->z = args[2].asNumber().toFloat(); p->dim = args[3].asNumber().toInt32(); return p; } catch (...) { return nullptr; } } Local FloatPos::newPos(double x, double y, double z, int dim) { return EngineScope::currentEngine()->newNativeClass(x, y, z, dim); } Local FloatPos::newPos(const Vec3& v, int dim) { return FloatPos::newPos(v.x, v.y, v.z, dim); } Local FloatPos::newPos(const FloatVec4& v) { return FloatPos::newPos(v.x, v.y, v.z, v.dim); } FloatPos* FloatPos::extractPos(Local v) { if (EngineScope::currentEngine()->isInstanceOf(v)) return EngineScope::currentEngine()->getNativeInstance(v); else return nullptr; } Local FloatPos::getDim() { string name; switch (dim) { case 0: name = tr("base.getDimName.0"); break; case 1: name = tr("base.getDimName.1"); break; case 2: name = tr("base.getDimName.2"); break; default: name = tr("base.getDimName.unknown"); break; } return String::newString(name); } Local FloatPos::toString() { try { return String::newString(fmt::format("{}({}, {}, {})", DimId2Name(dim), x, y, z)); } CATCH("Fail in toString!"); } //////////////////// DirectionAngle //////////////////// DirectionAngle* DirectionAngle::create(const Arguments& args) { if (args.size() < 2) return nullptr; try { DirectionAngle* pa = new DirectionAngle(args.thiz()); pa->pitch = args[0].asNumber().toDouble(); pa->yaw = args[1].asNumber().toDouble(); return pa; } catch (...) { return nullptr; } } Local DirectionAngle::toString() { try { return String::newString(fmt::format("({}, {})", pitch, yaw)); } CATCH("Fail in toString"); } Local DirectionAngle::toFacing() { int facing = -1; switch (Facing::convertYRotationToFacingDirection(yaw)) { case 2: facing = 0; break; case 3: facing = 2; break; case 4: facing = 3; break; case 5: facing = 1; break; } return Number::newNumber(facing); } Local DirectionAngle::newAngle(float pitch, float yaw) { return EngineScope::currentEngine()->newNativeClass(pitch, yaw); } //////////////////// APIs //////////////////// Local McClass::newIntPos(const Arguments& args) { CHECK_ARGS_COUNT(args, 4) CHECK_ARG_TYPE(args[0], ValueKind::kNumber) CHECK_ARG_TYPE(args[1], ValueKind::kNumber) CHECK_ARG_TYPE(args[2], ValueKind::kNumber) CHECK_ARG_TYPE(args[3], ValueKind::kNumber) try { return IntPos::newPos(args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt()); } CATCH("Fail in NewIntPos!") } Local McClass::newFloatPos(const Arguments& args) { CHECK_ARGS_COUNT(args, 4) CHECK_ARG_TYPE(args[0], ValueKind::kNumber) CHECK_ARG_TYPE(args[1], ValueKind::kNumber) CHECK_ARG_TYPE(args[2], ValueKind::kNumber) CHECK_ARG_TYPE(args[3], ValueKind::kNumber) try { return FloatPos::newPos(args[0].asNumber().toFloat(), args[1].asNumber().toFloat(), args[2].asNumber().toFloat(), args[3].toInt()); } CATCH("Fail in NewFloatPos!") } Local McClass::getBDSVersion(const Arguments& args) { try { return String::newString(LL::getBdsVersion()); } CATCH("Fail in GetBDSVersion!") } Local McClass::getServerProtocolVersion(const Arguments& args) { try { return Number::newNumber(LL::getServerProtocolVersion()); } CATCH("Fail in GetServerProtocolVersion!") }