#include "ContainerAPI.h" #include "APIHelp.h" #include "ItemAPI.h" #include "NativeAPI.h" #include #include using namespace std; //////////////////// Class Definition //////////////////// ClassDefine ContainerClassBuilder = defineClass("LLSE_Container") .constructor(nullptr) .instanceFunction("asPointer", &ContainerClass::asPointer) .instanceProperty("size", &ContainerClass::getSize) .instanceProperty("type", &ContainerClass::getType) .instanceFunction("addItem", &ContainerClass::addItem) .instanceFunction("addItemToFirstEmptySlot", &ContainerClass::addItemToFirstEmptySlot) .instanceFunction("hasRoomFor", &ContainerClass::hasRoomFor) .instanceFunction("removeItem", &ContainerClass::removeItem) .instanceFunction("getItem", &ContainerClass::getItem) .instanceFunction("setItem", &ContainerClass::setItem) .instanceFunction("getAllItems", &ContainerClass::getAllItems) .instanceFunction("removeAllItems", &ContainerClass::removeAllItems) .instanceFunction("isEmpty", &ContainerClass::isEmpty) // For Compatibility .instanceFunction("getSlot", &ContainerClass::getItem) .instanceFunction("getAllSlots", &ContainerClass::getAllItems) .build(); //////////////////// Classes //////////////////// ContainerClass::ContainerClass(Container* p) : ScriptClass(ScriptClass::ConstructFromCpp{}), container(p) { } //生成函数 Local ContainerClass::newContainer(Container* p) { auto newp = new ContainerClass(p); return newp->getScriptObject(); } Container* ContainerClass::extract(Local v) { if (EngineScope::currentEngine()->isInstanceOf(v)) return EngineScope::currentEngine()->getNativeInstance(v)->get(); else return nullptr; } //成员函数 Local ContainerClass::getSize() { try { return Number::newNumber(container->getSize()); } CATCH("Fail in getSize!") } Local ContainerClass::getType() { try { return String::newString(container->getTypeName()); } CATCH("Fail in getType!") } Local ContainerClass::asPointer(const Arguments& args) { try { return NativePointer::newNativePointer(container); } CATCH("Fail in asPointer!") } Local ContainerClass::addItem(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); try { ItemStack* item = ItemClass::extract(args[0]); if (!item) { LOG_WRONG_ARG_TYPE(); return Local(); } return Boolean::newBoolean(container->addItem_s(item)); } CATCH("Fail in addItem!"); } Local ContainerClass::addItemToFirstEmptySlot(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); try { ItemStack* item = ItemClass::extract(args[0]); if (!item) { LOG_WRONG_ARG_TYPE(); return Local(); } return Boolean::newBoolean(container->addItemToFirstEmptySlot_s(item)); } CATCH("Fail in addItemToFirstEmptySlot!"); } Local ContainerClass::hasRoomFor(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); try { ItemStack* item = ItemClass::extract(args[0]); if (!item) { LOG_WRONG_ARG_TYPE(); return Local(); } return Boolean::newBoolean(container->hasRoomForItem(*item)); } CATCH("Fail in hasRoomFor!"); } Local ContainerClass::removeItem(const Arguments& args) { CHECK_ARGS_COUNT(args, 2); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); CHECK_ARG_TYPE(args[1], ValueKind::kNumber); try { container->removeItem_s(args[0].toInt(), args[1].toInt()); return Boolean::newBoolean(true); } CATCH("Fail in removeItem!"); } Local ContainerClass::getItem(const Arguments& args) { CHECK_ARGS_COUNT(args, 1); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { ItemStack* item = (ItemStack*)&container->getItem(args[0].toInt()); if (!item) { LOG_ERROR_WITH_SCRIPT_INFO("Fail to get slot from container!"); return Local(); } return ItemClass::newItem(item); } CATCH("Fail in getItem!"); } Local ContainerClass::setItem(const Arguments& args) { CHECK_ARGS_COUNT(args, 2); CHECK_ARG_TYPE(args[0], ValueKind::kNumber); try { ItemStack* item = ItemClass::extract(args[1]); if (!item) { LOG_WRONG_ARG_TYPE(); return Local(); } ItemStack* itemOld = (ItemStack*)&container->getItem(args[0].toInt()); if (!itemOld) return Boolean::newBoolean(false); return Boolean::newBoolean(itemOld->setItem(item)); } CATCH("Fail in getItem!"); } Local ContainerClass::getAllItems(const Arguments& args) { try { auto list = container->getAllSlots(); Local res = Array::newArray(); for (auto& item : list) { res.add(ItemClass::newItem((ItemStack*)item)); } return res; } CATCH("Fail in getAllItems!"); } Local ContainerClass::removeAllItems(const Arguments& args) { try { container->removeAllItems(); return Boolean::newBoolean(true); } CATCH("Fail in removeAllItems!"); } Local ContainerClass::isEmpty(const Arguments& args) { try { return Boolean::newBoolean(container->isEmpty()); } CATCH("Fail in isEmpty!"); }