const $TableClothBlockEntity = Java.loadClass("com.simibubi.create.content.logistics.tableCloth.TableClothBlockEntity") const $PackageEntity = Java.loadClass("com.simibubi.create.content.logistics.box.PackageEntity") let Order = global.Order MBDMachineEvents.onTick("createdelight:order_deliverer", e => { let event = e.event const { machine } = event const { level, customData, pos } = machine /**@type {Internal.ServerLevel} */ let serverLevel = level if (level.dayTime() % 24000 >= 1000 && level.dayTime() % 24000 <= 1000 + 5 * 20) { if (level.dayTime() % 24000 == 1000) { /**@type {Internal.BrassDroneEntity} */ let entity = level.createEntity("create_sa:brass_drone") level.addFreshEntity(entity) entity.setPos(machine.pos.above()) customData.putUUID("droneUUID", entity.uuid) } /**@type {Internal.BrassDroneEntity} */ let entity = serverLevel.getEntity(customData.getUUID("droneUUID")) entity.setMotionY(Math.sin(level.time / 5) * 0.05) if (level.dayTime() % 24000 == 1000 + 5 * 20) { entity.discard() let funcs = ["north", "south", "east", "west"] let count = 8 for (let i = 0; i < 4; i++) { let packages = new ItemStackTransfer() packages.setSize(64) let order = null let start = 1 let end = 1 let lastIndex = 1 for (let index = 1; index <= count; index++) { let position = pos[funcs[i]](index) let obe = level.getBlockEntity(position, "create:table_cloth") if (!obe.isPresent()) { break } /**@type {Internal.TableClothBlockEntity} */ let be = obe.get() let item = be.manuallyAddedItems let find = item.find(item => item.is("createdelight:order")) if (find != null) { if (order != null) { let o = find.nbt.createdelightOrderInfo // console.log(packages.serializeNBT()) let nums = Order.checkAllPackages([o], packages) let customer = Order.customerProperties[o.type] let reward = customer.reward if (reward == null) reward = [`createdelight:orders/${o.type}`, 1] //如果没有写reward那么则为以类型为名的战利品表 let list = Utils.newList() for (let i = 0; i < nums[0] * reward[1] * o.entries.length; i++) { let rewardItems = LootUtils.getLootItems(reward[0], level) rewardItems.forEach(item => { list.add(item) }) } // let reward = Order.getRewardContract(Order.customerProperties[o.type].reward, nums[0] * 5) let money = Order.calculateMoneyReward(o) * nums[0] * customer.reward_money MoneyUtil.convertBaseValueToItems(money).forEach(item => { list.add(item) }) let pList = [] for (let i = 0; i < list.length; i += 9) { pList.push($PackageItem.containing(list.subList(i, Math.min(i + 9, list.length - 1)))) } end = index - 1 for (let j = start; j <= end; j++) { /**@type {Internal.TableClothBlockEntity} */ let be = level.getBlockEntity(pos[funcs[i]](j), "create:table_cloth").get() be.manuallyAddedItems.clear() be.notifyUpdate() } /**@type {Internal.TableClothBlockEntity} */ let startBe = level.getBlockEntity(pos[funcs[i]](start), "create:table_cloth").get() if (pList.length != 0) { for (let index = 0; index < pList.length; index++) { let element = pList[index]; if (startBe.manuallyAddedItems.size() == 4) { $PackageEntity.fromItemStack(level, pos[funcs[i]](start).offset(0.5, 1, 0.5), element) } else { startBe.manuallyAddedItems.push(element) startBe.notifyUpdate() } } } start = index packages = new ItemStackTransfer() packages.setSize(64) } order = find } item.filter(item => item .hasTag("create:packages")) .forEach(item => ItemTransferHelper.insertItemStacked(packages, item, false)) lastIndex = index } if (order != null) { let o = order.nbt.createdelightOrderInfo let nums = Order.checkAllPackages([o], packages) let customer = Order.customerProperties[o.type] let reward = customer.reward if (reward == null) reward = [`createdelight:orders/${o.type}`, 1] //如果没有写reward那么以类型为名的战利品表 let list = Utils.newList() for (let i = 0; i < nums[0] * reward[1] * o.entries.length; i++) { let rewardItems = LootUtils.getLootItems(reward[0], level) rewardItems.forEach(item => { list.add(item) }) } let money = Order.calculateMoneyReward(o) * nums[0] * customer.reward_money MoneyUtil.convertBaseValueToItems(money).forEach(item => { list.add(item) }) let pList = [] for (let i = 0; i < list.length; i += 9) { pList.push($PackageItem.containing(list.subList(i, Math.min(i + 9, list.length - 1)))) } for (let j = start; j <= lastIndex; j++) { /**@type {Internal.TableClothBlockEntity} */ let be2 = level.getBlockEntity(pos[funcs[i]](j), "create:table_cloth").get() be2.manuallyAddedItems.clear() be2.notifyUpdate() } /**@type {Internal.TableClothBlockEntity} */ let startBe = level.getBlockEntity(pos[funcs[i]](start), "create:table_cloth").get() if (pList.length != 0) { for (let index = 0; index < pList.length; index++) { let element = pList[index]; if (startBe.manuallyAddedItems.size() == 4) { $PackageEntity.fromItemStack(level, pos[funcs[i]](start).offset(0.5, 1, 0.5), element) } else { startBe.manuallyAddedItems.push(element) startBe.notifyUpdate() } } } } } // /**@type {ItemStackTransfer} */ // let storage = machine.getTraitByName("order_slot").storage // /**@type {ItemStackTransfer} */ // let packageStorage = machine.getTraitByName("package_slot").storage // /**@type {ItemStackTransfer} */ // let outputStorage = machine.getTraitByName("output_slot").storage // let orders = [] // for (let index = 0; index < storage.getSlots(); index++) { // let item = storage.getStackInSlot(index) // if (item.is("createdelight:order")) // orders.push(item.nbt.createdelightOrderInfo) // else // orders.push(null) // } // let res = Order.checkAllPackages(orders, packageStorage) // for (let index = 0; index < res.length; index++) { // let element = res[index]; // if (element > 0) { // // console.log(`index: ${index}, element: ${element}`) // storage.extractItem(index, 1, false) // let reward = Order.getRewardContract(Order.customerProperties[orders[index].type].reward, element * 5) // ItemTransferHelper.insertItemStacked(outputStorage, reward, false) // } // } } } }) BlockEvents.rightClicked("create:white_table_cloth", e => { const { player, block, item } = e if (player.mainHandItem.is("createdelight:order_deliverer_item")) { block.set("createdelight:order_deliverer") if (!player.isCreative()) { item.count-- } e.cancel() } }) LootJS.modifiers(e => { e.addBlockLootModifier("createdelight:order_deliverer") .addLoot("create:white_table_cloth") .addLoot("createdelight:order_deliverer_item") })