Storage importer now can receive items directly, fix item filter saving
This commit is contained in:
parent
69fdba7ea2
commit
4dee77edbe
@ -66,6 +66,7 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
|
|||||||
|
|
||||||
val filter = ItemFilter(MAX_FILTERS) { _, _, _ ->
|
val filter = ItemFilter(MAX_FILTERS) { _, _, _ ->
|
||||||
component?.scan()
|
component?.scan()
|
||||||
|
setChangedLight()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setLevel(p_155231_: Level) {
|
override fun setLevel(p_155231_: Level) {
|
||||||
@ -122,7 +123,7 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
|
|||||||
override fun load(nbt: CompoundTag) {
|
override fun load(nbt: CompoundTag) {
|
||||||
super.load(nbt)
|
super.load(nbt)
|
||||||
|
|
||||||
nbt.ifHas("filter", ListTag::class.java, filter::deserializeNBT)
|
nbt.ifHas("filter", CompoundTag::class.java, filter::deserializeNBT)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun checkSurroundings() {
|
fun checkSurroundings() {
|
||||||
|
@ -10,6 +10,7 @@ import net.minecraft.server.level.ServerLevel
|
|||||||
import net.minecraft.world.entity.player.Inventory
|
import net.minecraft.world.entity.player.Inventory
|
||||||
import net.minecraft.world.entity.player.Player
|
import net.minecraft.world.entity.player.Player
|
||||||
import net.minecraft.world.inventory.AbstractContainerMenu
|
import net.minecraft.world.inventory.AbstractContainerMenu
|
||||||
|
import net.minecraft.world.item.ItemStack
|
||||||
import net.minecraft.world.level.Level
|
import net.minecraft.world.level.Level
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||||
import net.minecraft.world.level.block.state.BlockState
|
import net.minecraft.world.level.block.state.BlockState
|
||||||
@ -100,12 +101,14 @@ abstract class AbstractStorageImportExport<T>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StorageImporterBlockEntity(blockPos: BlockPos, blockState: BlockState) : AbstractStorageImportExport<IItemHandler>(MBlockEntities.STORAGE_IMPORTER, blockPos, blockState) {
|
class StorageImporterBlockEntity(blockPos: BlockPos, blockState: BlockState)
|
||||||
|
: AbstractStorageImportExport<IItemHandler>(MBlockEntities.STORAGE_IMPORTER, blockPos, blockState),
|
||||||
|
IItemHandler {
|
||||||
override val defaultDisplayName: Component
|
override val defaultDisplayName: Component
|
||||||
get() = MACHINE_NAME
|
get() = MACHINE_NAME
|
||||||
|
|
||||||
val filter = ItemFilter(MAX_FILTERS) { _, _, _ ->
|
val filter = ItemFilter(MAX_FILTERS) { _, _, _ ->
|
||||||
|
setChangedLight()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createMenu(containerID: Int, inventory: Inventory, ply: Player): AbstractContainerMenu {
|
override fun createMenu(containerID: Int, inventory: Inventory, ply: Player): AbstractContainerMenu {
|
||||||
@ -129,7 +132,69 @@ class StorageImporterBlockEntity(blockPos: BlockPos, blockState: BlockState) : A
|
|||||||
override fun load(nbt: CompoundTag) {
|
override fun load(nbt: CompoundTag) {
|
||||||
super.load(nbt)
|
super.load(nbt)
|
||||||
|
|
||||||
nbt.ifHas("filter", ListTag::class.java, filter::deserializeNBT)
|
nbt.ifHas("filter", CompoundTag::class.java, filter::deserializeNBT)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var valid = true
|
||||||
|
private var resolverItemHandler = LazyOptional.of<IItemHandler> { this }
|
||||||
|
|
||||||
|
override fun invalidateCaps() {
|
||||||
|
super.invalidateCaps()
|
||||||
|
resolverItemHandler.invalidate()
|
||||||
|
valid = false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun reviveCaps() {
|
||||||
|
super.reviveCaps()
|
||||||
|
resolverItemHandler = LazyOptional.of { this }
|
||||||
|
valid = true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T> getCapability(cap: Capability<T>, side: Direction?): LazyOptional<T> {
|
||||||
|
if (valid && cap === CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && side == blockState.getValue(RotatableMatteryBlock.FACING_FULL)) {
|
||||||
|
return resolverItemHandler.cast()
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.getCapability(cap, side)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getSlots(): Int {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getStackInSlot(slot: Int): ItemStack {
|
||||||
|
return ItemStack.EMPTY
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun insertItem(slot: Int, stack: ItemStack, simulate: Boolean): ItemStack {
|
||||||
|
if (!filter.match(stack))
|
||||||
|
return stack
|
||||||
|
|
||||||
|
val view = cell.storageGraph?.getVirtualComponent(ITEM_STORAGE) ?: return stack
|
||||||
|
val maxMove = energy.extractStepInner(ITEM_STORAGE.energyPerOperation, stack.count, true)
|
||||||
|
|
||||||
|
if (maxMove == 0)
|
||||||
|
return stack
|
||||||
|
|
||||||
|
val leftover = view.insertStack(ItemStackWrapper(stack).also { it.count = maxMove.toImpreciseFraction() }, simulate)
|
||||||
|
|
||||||
|
if (simulate)
|
||||||
|
return leftover.stack
|
||||||
|
|
||||||
|
energy.extractStepInner(ITEM_STORAGE.energyPerOperation, maxMove - leftover.count.toInt(), false)
|
||||||
|
return leftover.stack
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun extractItem(slot: Int, amount: Int, simulate: Boolean): ItemStack {
|
||||||
|
return ItemStack.EMPTY
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getSlotLimit(slot: Int): Int {
|
||||||
|
return Int.MAX_VALUE
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isItemValid(slot: Int, stack: ItemStack): Boolean {
|
||||||
|
return filter.match(stack)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun tick() {
|
fun tick() {
|
||||||
@ -140,7 +205,7 @@ class StorageImporterBlockEntity(blockPos: BlockPos, blockState: BlockState) : A
|
|||||||
|
|
||||||
if (nextTick <= 0 && target.isPresent && enoughEnergy) {
|
if (nextTick <= 0 && target.isPresent && enoughEnergy) {
|
||||||
val graph = cell.storageGraph ?: return
|
val graph = cell.storageGraph ?: return
|
||||||
val items = graph.getVirtualComponent(OverdriveThatMatters.INSTANCE.ITEM_STORAGE())
|
val items = graph.getVirtualComponent(ITEM_STORAGE)
|
||||||
|
|
||||||
val resolved = target.orThrow()
|
val resolved = target.orThrow()
|
||||||
|
|
||||||
@ -217,6 +282,8 @@ class StorageExporterBlockEntity(blockPos: BlockPos, blockState: BlockState) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
lastSlot = 0
|
lastSlot = 0
|
||||||
|
|
||||||
|
setChangedLight()
|
||||||
}.also { it.isWhitelist = true }
|
}.also { it.isWhitelist = true }
|
||||||
|
|
||||||
private var lastSlot = 0
|
private var lastSlot = 0
|
||||||
@ -241,7 +308,7 @@ class StorageExporterBlockEntity(blockPos: BlockPos, blockState: BlockState) :
|
|||||||
override fun load(nbt: CompoundTag) {
|
override fun load(nbt: CompoundTag) {
|
||||||
super.load(nbt)
|
super.load(nbt)
|
||||||
|
|
||||||
nbt.ifHas("filter", ListTag::class.java, filter::deserializeNBT)
|
nbt.ifHas("filter", CompoundTag::class.java, filter::deserializeNBT)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun tick() {
|
fun tick() {
|
||||||
@ -263,6 +330,10 @@ class StorageExporterBlockEntity(blockPos: BlockPos, blockState: BlockState) :
|
|||||||
var hit = false
|
var hit = false
|
||||||
|
|
||||||
for (stack in exportStacks) {
|
for (stack in exportStacks) {
|
||||||
|
if (!resolved.isItemValid(lastSlot, stack.second.item)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
val exportAmountA = items.extractStack(stack.first, stack.second.count.toInt().coerceAtMost(MAX_MOVE_PER_OPERATION).toImpreciseFraction(), true).count.toInt()
|
val exportAmountA = items.extractStack(stack.first, stack.second.count.toInt().coerceAtMost(MAX_MOVE_PER_OPERATION).toImpreciseFraction(), true).count.toInt()
|
||||||
|
|
||||||
if (exportAmountA == 0) {
|
if (exportAmountA == 0) {
|
||||||
|
@ -9,7 +9,9 @@ import net.minecraftforge.common.util.INBTSerializable
|
|||||||
import net.minecraftforge.network.NetworkEvent
|
import net.minecraftforge.network.NetworkEvent
|
||||||
import org.apache.logging.log4j.LogManager
|
import org.apache.logging.log4j.LogManager
|
||||||
import ru.dbotthepony.mc.otm.client.minecraft
|
import ru.dbotthepony.mc.otm.client.minecraft
|
||||||
|
import ru.dbotthepony.mc.otm.ifHas
|
||||||
import ru.dbotthepony.mc.otm.menu.MatteryMenu
|
import ru.dbotthepony.mc.otm.menu.MatteryMenu
|
||||||
|
import ru.dbotthepony.mc.otm.set
|
||||||
import java.util.LinkedList
|
import java.util.LinkedList
|
||||||
import java.util.function.Supplier
|
import java.util.function.Supplier
|
||||||
|
|
||||||
@ -78,7 +80,7 @@ data class ItemFilterNetworkSlot(val slotID: Int, val networkID: Int, val filter
|
|||||||
class ItemFilter(
|
class ItemFilter(
|
||||||
val size: Int,
|
val size: Int,
|
||||||
private val modified: (slot: Int?, oldValue: ItemStack?, newValue: ItemStack?) -> Unit
|
private val modified: (slot: Int?, oldValue: ItemStack?, newValue: ItemStack?) -> Unit
|
||||||
) : INBTSerializable<ListTag> {
|
) : INBTSerializable<CompoundTag> {
|
||||||
private val filter = Array<ItemStack>(size) { ItemStack.EMPTY }
|
private val filter = Array<ItemStack>(size) { ItemStack.EMPTY }
|
||||||
private val linkedFilter = LinkedList<ItemStack>()
|
private val linkedFilter = LinkedList<ItemStack>()
|
||||||
|
|
||||||
@ -139,25 +141,33 @@ class ItemFilter(
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun serializeNBT(): ListTag {
|
override fun serializeNBT(): CompoundTag {
|
||||||
return ListTag().also {
|
return CompoundTag().also {
|
||||||
|
it["items"] = ListTag().also {
|
||||||
for (value in filter) {
|
for (value in filter) {
|
||||||
it.add(value.serializeNBT())
|
it.add(value.serializeNBT())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
it["is_whitelist"] = isWhitelist
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun deserializeNBT(nbt: ListTag?) {
|
override fun deserializeNBT(nbt: CompoundTag?) {
|
||||||
for (i in filter.indices)
|
for (i in filter.indices)
|
||||||
filter[i] = ItemStack.EMPTY
|
filter[i] = ItemStack.EMPTY
|
||||||
|
|
||||||
if (nbt == null)
|
if (nbt == null)
|
||||||
return
|
return
|
||||||
|
|
||||||
for ((i, value) in nbt.withIndex()) {
|
nbt.ifHas("items", ListTag::class.java) {
|
||||||
|
for ((i, value) in it.withIndex()) {
|
||||||
if (value is CompoundTag) {
|
if (value is CompoundTag) {
|
||||||
filter[i] = ItemStack.of(value)
|
filter[i] = ItemStack.of(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isWhitelist = nbt.getBoolean("is_whitelist")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user