ModernLifePatch/src-source/main/java/com/dairymoose/modernlife/tileentities/ExtractorBlockEntity.java
2024-10-26 09:40:21 +08:00

586 lines
26 KiB
Java

package com.dairymoose.modernlife.tileentities;
import com.dairymoose.modernlife.blocks.ExtractorBlock;
import com.dairymoose.modernlife.core.CustomBlocks;
import com.mojang.datafixers.types.Type;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.NonNullList;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.Container;
import net.minecraft.world.ContainerHelper;
import net.minecraft.world.WorldlyContainer;
import net.minecraft.world.WorldlyContainerHolder;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntitySelector;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.HopperMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.ChestBlock;
import net.minecraft.world.level.block.HopperBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.entity.ChestBlockEntity;
import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.shapes.BooleanOp;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.VanillaInventoryCodeHooks;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/* loaded from: outputsrg.jar:com/dairymoose/modernlife/tileentities/ExtractorBlockEntity.class */
public class ExtractorBlockEntity extends RandomizableContainerBlockEntity implements IHorizontalHopper {
public static final BlockEntityType<ExtractorBlockEntity> EXTRACTOR = BlockEntityType.Builder.of(ExtractorBlockEntity::new, new Block[]{(Block) CustomBlocks.BLOCK_EXTRACTOR.get()}).build((Type) null);
private static final Logger LOGGER = LogManager.getLogger();
private NonNullList<ItemStack> items;
private int cooldownTime;
private long tickedGameTime;
public ExtractorBlockEntity(BlockPos pos, BlockState state) {
super(EXTRACTOR, pos, state);
this.items = NonNullList.withSize(5, ItemStack.EMPTY);
this.cooldownTime = -1;
}
public void load(CompoundTag p_230337_2_) {
super.load(p_230337_2_);
this.items = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY);
if (!tryLoadLootTable(p_230337_2_)) {
ContainerHelper.loadAllItems(p_230337_2_, this.items);
}
this.cooldownTime = p_230337_2_.getInt("TransferCooldown");
}
protected void saveAdditional(CompoundTag p_189515_1_) {
if (!trySaveLootTable(p_189515_1_)) {
ContainerHelper.saveAllItems(p_189515_1_, this.items);
}
p_189515_1_.putInt("TransferCooldown", this.cooldownTime);
}
public int getContainerSize() {
return this.items.size();
}
public ItemStack removeItem(int p_70298_1_, int p_70298_2_) {
unpackLootTable((Player) null);
return ContainerHelper.removeItem(getItems(), p_70298_1_, p_70298_2_);
}
public void setItem(int p_70299_1_, ItemStack p_70299_2_) {
unpackLootTable((Player) null);
getItems().set(p_70299_1_, p_70299_2_);
if (p_70299_2_.getCount() > getMaxStackSize()) {
p_70299_2_.setCount(getMaxStackSize());
}
}
protected Component m_6820_() {
return new TranslatableComponent("container.extractor");
}
public static void tick(Level level, BlockPos pos, BlockState state, ExtractorBlockEntity blockEntity) {
blockEntity.tick();
}
public void tick() {
if (this.level != null && !this.level.isClientSide) {
this.cooldownTime--;
this.tickedGameTime = this.level.getGameTime();
if (!isOnCooldown()) {
setCooldown(0);
tryMoveItems(() -> {
return Boolean.valueOf(suckInItems(this));
});
}
}
}
private boolean tryMoveItems(Supplier<Boolean> p_200109_1_) {
if (this.level != null && !this.level.isClientSide && !isOnCooldown() && ((Boolean) getBlockState().getValue(HopperBlock.ENABLED)).booleanValue()) {
boolean flag = false;
if (!isEmpty()) {
flag = ejectItems();
}
if (!inventoryFull()) {
flag |= p_200109_1_.get().booleanValue();
}
if (flag) {
setCooldown(8);
setChanged();
return true;
}
return false;
}
return false;
}
private boolean inventoryFull() {
Iterator it = this.items.iterator();
while (it.hasNext()) {
ItemStack itemstack = (ItemStack) it.next();
if (itemstack.isEmpty() || itemstack.getCount() != itemstack.getMaxStackSize()) {
return false;
}
}
return true;
}
@Override // com.dairymoose.modernlife.tileentities.IHorizontalHopper
public Level getHopperLevel() {
return this.level;
}
private static Optional<Pair<IItemHandler, Object>> getItemHandler(IHorizontalHopper hopper, Direction hopperFacing) {
double x = hopper.getLevelX() + hopperFacing.getStepX();
double y = hopper.getLevelY() + hopperFacing.getStepY();
double z = hopper.getLevelZ() + hopperFacing.getStepZ();
return VanillaInventoryCodeHooks.getItemHandler(hopper.getHopperLevel(), x, y, z, hopperFacing.getOpposite());
}
private static boolean isFull(IItemHandler itemHandler) {
for (int slot = 0; slot < itemHandler.getSlots(); slot++) {
ItemStack stackInSlot = itemHandler.getStackInSlot(slot);
if (stackInSlot.isEmpty() || stackInSlot.getCount() < itemHandler.getSlotLimit(slot)) {
return false;
}
}
return true;
}
private static boolean isEmpty(IItemHandler itemHandler) {
for (int slot = 0; slot < itemHandler.getSlots(); slot++) {
ItemStack stackInSlot = itemHandler.getStackInSlot(slot);
if (stackInSlot.getCount() > 0) {
return false;
}
}
return true;
}
public static boolean insertHook(ExtractorBlockEntity hopper) {
Direction hopperFacing = hopper.getBlockState().getValue(HopperBlock.FACING).getOpposite();
return ((Boolean) getItemHandler(hopper, hopperFacing).map(destinationResult -> {
IItemHandler itemHandler = (IItemHandler) destinationResult.getKey();
Object destination = destinationResult.getValue();
if (isFull(itemHandler)) {
return false;
}
for (int i = 0; i < hopper.getContainerSize(); i++) {
if (!hopper.getItem(i).isEmpty()) {
ItemStack originalSlotContents = hopper.getItem(i).copy();
ItemStack insertStack = hopper.removeItem(i, 1);
ItemStack remainder = putStackInInventoryAllSlots(hopper, destination, itemHandler, insertStack);
if (remainder.isEmpty()) {
return true;
}
hopper.setItem(i, originalSlotContents);
}
}
return false;
}).orElse(false)).booleanValue();
}
private static ItemStack putStackInInventoryAllSlots(BlockEntity source, Object destination, IItemHandler destInventory, ItemStack stack) {
for (int slot = 0; slot < destInventory.getSlots() && !stack.isEmpty(); slot++) {
stack = insertStack(source, destination, destInventory, stack, slot);
}
return stack;
}
private static ItemStack insertStack(BlockEntity source, Object destination, IItemHandler destInventory, ItemStack stack, int slot) {
ItemStack itemstack = destInventory.getStackInSlot(slot);
if (destInventory.insertItem(slot, stack, true).isEmpty()) {
boolean insertedItem = false;
boolean inventoryWasEmpty = isEmpty(destInventory);
if (itemstack.isEmpty()) {
destInventory.insertItem(slot, stack, false);
stack = ItemStack.EMPTY;
insertedItem = true;
} else if (ItemHandlerHelper.canItemStacksStack(itemstack, stack)) {
int originalSize = stack.getCount();
stack = destInventory.insertItem(slot, stack, false);
insertedItem = originalSize < stack.getCount();
}
if (insertedItem && inventoryWasEmpty && (destination instanceof ExtractorBlockEntity)) {
ExtractorBlockEntity destinationHopper = (ExtractorBlockEntity) destination;
if (!destinationHopper.isOnCustomCooldown()) {
int k = 0;
if ((source instanceof ExtractorBlockEntity) && destinationHopper.getLastUpdateTime() >= ((ExtractorBlockEntity) source).getLastUpdateTime()) {
k = 1;
}
destinationHopper.setCooldown(8 - k);
}
}
}
return stack;
}
private boolean ejectItems() {
if (insertHook(this)) {
return true;
}
Container iinventory = getAttachedContainer();
if (iinventory == null) {
return false;
}
Direction direction = (Direction) getBlockState().getValue(HopperBlock.FACING);
if (isFullContainer(iinventory, direction)) {
return false;
}
for (int i = 0; i < getContainerSize(); i++) {
if (!getItem(i).isEmpty()) {
ItemStack itemstack = getItem(i).copy();
ItemStack itemstack1 = addItem(this, iinventory, removeItem(i, 1), direction);
if (itemstack1.isEmpty()) {
iinventory.setChanged();
return true;
}
setItem(i, itemstack);
}
}
return false;
}
private static IntStream getSlots(Container p_213972_0_, Direction p_213972_1_) {
return p_213972_0_ instanceof WorldlyContainer ? IntStream.of(((WorldlyContainer) p_213972_0_).getSlotsForFace(p_213972_1_)) : IntStream.range(0, p_213972_0_.getContainerSize());
}
private boolean isFullContainer(Container p_174919_1_, Direction p_174919_2_) {
return getSlots(p_174919_1_, p_174919_2_).allMatch(p_213970_1_ -> {
ItemStack itemstack = p_174919_1_.getItem(p_213970_1_);
return itemstack.getCount() >= itemstack.getMaxStackSize();
});
}
private static boolean isEmptyContainer(Container p_174917_0_, Direction p_174917_1_) {
return getSlots(p_174917_0_, p_174917_1_).allMatch(p_213973_1_ -> {
return p_174917_0_.getItem(p_213973_1_).isEmpty();
});
}
@Nullable
public static Boolean extractHook(ExtractorBlockEntity dest) {
return (Boolean) getItemHandler(dest, dest.getBlockState().getValue(ExtractorBlock.FACING)).map(itemHandlerResult -> {
IItemHandler handler = (IItemHandler) itemHandlerResult.getKey();
for (int i = 0; i < handler.getSlots(); i++) {
ItemStack extractItem = handler.extractItem(i, 1, true);
if (!extractItem.isEmpty()) {
for (int j = 0; j < dest.getContainerSize(); j++) {
ItemStack destStack = dest.getItem(j);
if (dest.canPlaceItem(j, extractItem) && (destStack.isEmpty() || (destStack.getCount() < destStack.getMaxStackSize() && destStack.getCount() < dest.getMaxStackSize() && ItemHandlerHelper.canItemStacksStack(extractItem, destStack)))) {
ItemStack extractItem2 = handler.extractItem(i, 1, false);
if (destStack.isEmpty()) {
dest.setItem(j, extractItem2);
} else {
destStack.grow(1);
dest.setItem(j, destStack);
}
dest.setChanged();
return true;
}
}
}
}
return false;
}).orElse(null);
}
public static boolean suckInItems(ExtractorBlockEntity p_145891_0_) {
Boolean ret = extractHook(p_145891_0_);
if (ret != null) {
return ret.booleanValue();
}
Container iinventory = getSourceContainer(p_145891_0_, p_145891_0_.getBlockState());
if (iinventory != null) {
Direction direction = Direction.DOWN;
switch (C01571.$SwitchMap$net$minecraft$core$Direction[p_145891_0_.getBlockState().getValue(HopperBlock.FACING).ordinal()]) {
case 1:
direction = Direction.WEST;
break;
case 2:
direction = Direction.SOUTH;
break;
case 3:
direction = Direction.NORTH;
break;
case 4:
direction = Direction.EAST;
break;
}
Direction finalDirection = direction;
if (isEmptyContainer(iinventory, finalDirection)) {
return false;
}
return getSlots(iinventory, finalDirection).anyMatch(p_213971_3_ -> {
return tryTakeInItemFromSlot(p_145891_0_, iinventory, p_213971_3_, finalDirection);
});
}
for (ItemEntity itementity : getFrontalItems(p_145891_0_, p_145891_0_.getBlockState())) {
if (addItem(p_145891_0_, itementity)) {
return true;
}
}
return false;
}
/* renamed from: com.dairymoose.modernlife.tileentities.ExtractorBlockEntity$1 */
/* loaded from: outputsrg.jar:com/dairymoose/modernlife/tileentities/ExtractorBlockEntity$1.class */
public static /* synthetic */ class C01571 {
static final /* synthetic */ int[] $SwitchMap$net$minecraft$core$Direction = new int[Direction.values().length];
static {
try {
$SwitchMap$net$minecraft$core$Direction[Direction.EAST.ordinal()] = 1;
} catch (NoSuchFieldError e) {
}
try {
$SwitchMap$net$minecraft$core$Direction[Direction.NORTH.ordinal()] = 2;
} catch (NoSuchFieldError e2) {
}
try {
$SwitchMap$net$minecraft$core$Direction[Direction.SOUTH.ordinal()] = 3;
} catch (NoSuchFieldError e3) {
}
try {
$SwitchMap$net$minecraft$core$Direction[Direction.WEST.ordinal()] = 4;
} catch (NoSuchFieldError e4) {
}
}
}
public static boolean tryTakeInItemFromSlot(IHorizontalHopper p_174915_0_, Container p_174915_1_, int p_174915_2_, Direction p_174915_3_) {
ItemStack itemstack = p_174915_1_.getItem(p_174915_2_);
if (!itemstack.isEmpty() && canTakeItemFromContainer(p_174915_1_, itemstack, p_174915_2_, p_174915_3_)) {
ItemStack itemstack1 = itemstack.copy();
ItemStack itemstack2 = addItem(p_174915_1_, p_174915_0_, p_174915_1_.removeItem(p_174915_2_, 1), (Direction) null);
if (itemstack2.isEmpty()) {
p_174915_1_.setChanged();
return true;
}
p_174915_1_.setItem(p_174915_2_, itemstack1);
return false;
}
return false;
}
public static boolean addItem(Container p_200114_0_, ItemEntity p_200114_1_) {
boolean flag = false;
ItemStack itemstack = p_200114_1_.getItem().copy();
ItemStack itemstack1 = addItem((Container) null, p_200114_0_, itemstack, (Direction) null);
if (itemstack1.isEmpty()) {
flag = true;
p_200114_1_.m_146870_();
} else {
p_200114_1_.setItem(itemstack1);
}
return flag;
}
public static ItemStack addItem(@Nullable Container p_59327_, Container p_59328_, ItemStack p_59329_, @Nullable Direction p_59330_) {
if ((p_59328_ instanceof WorldlyContainer) && p_59330_ != null) {
WorldlyContainer worldlycontainer = (WorldlyContainer) p_59328_;
int[] aint = worldlycontainer.getSlotsForFace(p_59330_);
for (int k = 0; k < aint.length && !p_59329_.isEmpty(); k++) {
p_59329_ = tryMoveInItem(p_59327_, p_59328_, p_59329_, aint[k], p_59330_);
}
} else {
int i = p_59328_.getContainerSize();
for (int j = 0; j < i && !p_59329_.isEmpty(); j++) {
p_59329_ = tryMoveInItem(p_59327_, p_59328_, p_59329_, j, p_59330_);
}
}
return p_59329_;
}
private static boolean canPlaceItemInContainer(Container p_174920_0_, ItemStack p_174920_1_, int p_174920_2_, @Nullable Direction p_174920_3_) {
if (p_174920_0_.canPlaceItem(p_174920_2_, p_174920_1_)) {
return !(p_174920_0_ instanceof WorldlyContainer) || ((WorldlyContainer) p_174920_0_).canPlaceItemThroughFace(p_174920_2_, p_174920_1_, p_174920_3_);
}
return false;
}
private static boolean canTakeItemFromContainer(Container p_174921_0_, ItemStack p_174921_1_, int p_174921_2_, Direction p_174921_3_) {
return !(p_174921_0_ instanceof WorldlyContainer) || ((WorldlyContainer) p_174921_0_).canTakeItemThroughFace(p_174921_2_, p_174921_1_, p_174921_3_);
}
private static ItemStack tryMoveInItem(@Nullable Container p_174916_0_, Container p_174916_1_, ItemStack p_174916_2_, int p_174916_3_, @Nullable Direction p_174916_4_) {
ItemStack itemstack = p_174916_1_.getItem(p_174916_3_);
if (canPlaceItemInContainer(p_174916_1_, p_174916_2_, p_174916_3_, p_174916_4_)) {
boolean flag = false;
boolean flag1 = p_174916_1_.isEmpty();
if (itemstack.isEmpty()) {
p_174916_1_.setItem(p_174916_3_, p_174916_2_);
p_174916_2_ = ItemStack.EMPTY;
flag = true;
} else if (canMergeItems(itemstack, p_174916_2_)) {
int i = p_174916_2_.getMaxStackSize() - itemstack.getCount();
int j = Math.min(p_174916_2_.getCount(), i);
p_174916_2_.shrink(j);
itemstack.grow(j);
flag = j > 0;
}
if (flag) {
if (flag1 && (p_174916_1_ instanceof ExtractorBlockEntity)) {
ExtractorBlockEntity ExtractorBlockEntity1 = (ExtractorBlockEntity) p_174916_1_;
if (!ExtractorBlockEntity1.isOnCustomCooldown()) {
int k = 0;
if (p_174916_0_ instanceof ExtractorBlockEntity) {
ExtractorBlockEntity ExtractorBlockEntity = (ExtractorBlockEntity) p_174916_0_;
if (ExtractorBlockEntity1.tickedGameTime >= ExtractorBlockEntity.tickedGameTime) {
k = 1;
}
}
ExtractorBlockEntity1.setCooldown(8 - k);
}
}
p_174916_1_.setChanged();
}
}
return p_174916_2_;
}
@Nullable
private Container getAttachedContainer() {
Direction direction = getBlockState().getValue(HopperBlock.FACING).getOpposite();
return getContainerAt(getHopperLevel(), this.worldPosition.relative(direction));
}
@Nullable
public static Container getSourceContainer(IHorizontalHopper p_145884_0_, BlockState state) {
switch (C01571.$SwitchMap$net$minecraft$core$Direction[state.getValue(HopperBlock.FACING).ordinal()]) {
case 1:
return getContainerAt(p_145884_0_.getHopperLevel(), p_145884_0_.getLevelX() + 1.0d, p_145884_0_.getLevelY(), p_145884_0_.getLevelZ());
case 2:
return getContainerAt(p_145884_0_.getHopperLevel(), p_145884_0_.getLevelX(), p_145884_0_.getLevelY(), p_145884_0_.getLevelZ() - 1.0d);
case 3:
return getContainerAt(p_145884_0_.getHopperLevel(), p_145884_0_.getLevelX(), p_145884_0_.getLevelY(), p_145884_0_.getLevelZ() + 1.0d);
case 4:
return getContainerAt(p_145884_0_.getHopperLevel(), p_145884_0_.getLevelX() - 1.0d, p_145884_0_.getLevelY(), p_145884_0_.getLevelZ());
default:
return getContainerAt(p_145884_0_.getHopperLevel(), p_145884_0_.getLevelX(), p_145884_0_.getLevelY() + 1.0d, p_145884_0_.getLevelZ());
}
}
public static List<ItemEntity> getFrontalItems(IHorizontalHopper p_200115_0_, BlockState state) {
return (List) p_200115_0_.getSuckShape(state).toAabbs().stream().flatMap(p_200110_1_ -> {
return p_200115_0_.getHopperLevel().m_6443_(ItemEntity.class, p_200110_1_.move(p_200115_0_.getLevelX() - 0.5d, p_200115_0_.getLevelY() - 0.5d, p_200115_0_.getLevelZ() - 0.5d), EntitySelector.ENTITY_STILL_ALIVE).stream();
}).collect(Collectors.toList());
}
@Nullable
public static Container getContainerAt(Level p_195484_0_, BlockPos p_195484_1_) {
return getContainerAt(p_195484_0_, p_195484_1_.getX() + 0.5d, p_195484_1_.getY() + 0.5d, p_195484_1_.getZ() + 0.5d);
}
@Nullable
public static Container getContainerAt(Level p_145893_0_, double p_145893_1_, double p_145893_3_, double p_145893_5_) {
WorldlyContainer worldlyContainer = null;
BlockPos blockpos = new BlockPos(p_145893_1_, p_145893_3_, p_145893_5_);
BlockState blockstate = p_145893_0_.getBlockState(blockpos);
WorldlyContainerHolder getBlock = blockstate.getBlock();
if (getBlock instanceof WorldlyContainerHolder) {
worldlyContainer = getBlock.getContainer(blockstate, p_145893_0_, blockpos);
} else if (blockstate.m_155947_()) {
WorldlyContainer blockEntity = p_145893_0_.getBlockEntity(blockpos);
if (blockEntity instanceof Container) {
worldlyContainer = (Container) blockEntity;
if ((worldlyContainer instanceof ChestBlockEntity) && (getBlock instanceof ChestBlock)) {
worldlyContainer = ChestBlock.getContainer((ChestBlock) getBlock, blockstate, p_145893_0_, blockpos, true);
}
}
}
if (worldlyContainer == null) {
List<Entity> list = p_145893_0_.getEntities((Entity) null, new AABB(p_145893_1_ - 0.5d, p_145893_3_ - 0.5d, p_145893_5_ - 0.5d, p_145893_1_ + 0.5d, p_145893_3_ + 0.5d, p_145893_5_ + 0.5d), EntitySelector.CONTAINER_ENTITY_SELECTOR);
if (!list.isEmpty()) {
worldlyContainer = (Container) list.get(p_145893_0_.random.nextInt(list.size()));
}
}
return worldlyContainer;
}
private static boolean canMergeItems(ItemStack p_145894_0_, ItemStack p_145894_1_) {
if (p_145894_0_.getItem() != p_145894_1_.getItem() || p_145894_0_.getDamageValue() != p_145894_1_.getDamageValue() || p_145894_0_.getCount() > p_145894_0_.getMaxStackSize()) {
return false;
}
return ItemStack.tagMatches(p_145894_0_, p_145894_1_);
}
@Override // com.dairymoose.modernlife.tileentities.IHorizontalHopper
public double getLevelX() {
return this.worldPosition.getX() + 0.5d;
}
@Override // com.dairymoose.modernlife.tileentities.IHorizontalHopper
public double getLevelY() {
return this.worldPosition.getY() + 0.5d;
}
@Override // com.dairymoose.modernlife.tileentities.IHorizontalHopper
public double getLevelZ() {
return this.worldPosition.getZ() + 0.5d;
}
public void setCooldown(int p_145896_1_) {
this.cooldownTime = p_145896_1_;
}
private boolean isOnCooldown() {
return this.cooldownTime > 0;
}
public boolean isOnCustomCooldown() {
return this.cooldownTime > 8;
}
protected NonNullList<ItemStack> getItems() {
return this.items;
}
protected void setItems(NonNullList<ItemStack> p_199721_1_) {
this.items = p_199721_1_;
}
public void entityInside(Entity p_200113_1_) {
if (p_200113_1_ instanceof ItemEntity) {
BlockPos blockpos = getBlockPos();
if (Shapes.joinIsNotEmpty(Shapes.create(p_200113_1_.getBoundingBox().move(-blockpos.getX(), -blockpos.getY(), -blockpos.getZ())), getSuckShape(getBlockState()), BooleanOp.AND)) {
tryMoveItems(() -> {
return Boolean.valueOf(addItem(this, (ItemEntity) p_200113_1_));
});
}
}
}
protected AbstractContainerMenu m_6555_(int p_213906_1_, Inventory p_213906_2_) {
return new HopperMenu(p_213906_1_, p_213906_2_, this);
}
protected IItemHandler createUnSidedHandler() {
return new ExtractorItemHandler(this);
}
public long getLastUpdateTime() {
return this.tickedGameTime;
}
}