LTDV10/packet/kubejs/server_scripts/mbd2/order_deliverer.js
2026-04-14 18:20:56 +08:00

193 lines
9.7 KiB
JavaScript

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")
})