Skip to content

Commit

Permalink
Implemented proper item insertion logic for drawbridge
Browse files Browse the repository at this point in the history
+ a workaround for hopper aggressiveness

Fixes #102
  • Loading branch information
fuj1n committed Jun 6, 2020
1 parent 5e01cf6 commit 2121fd0
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 3 deletions.
Expand Up @@ -17,19 +17,23 @@
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.*;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraft.world.storage.loot.LootContext;
import net.minecraft.world.storage.loot.LootParameters;
import net.minecraftforge.common.ToolType;
import net.minecraftforge.common.util.BlockSnapshot;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.ForgeEventFactory;
import slimeknights.tmechworks.common.config.MechworksConfig;
import net.minecraftforge.items.wrapper.InvWrapper;
import slimeknights.tmechworks.common.MechworksContent;
import slimeknights.tmechworks.common.blocks.DrawbridgeBlock;
import slimeknights.tmechworks.common.blocks.RedstoneMachineBlock;
import slimeknights.tmechworks.common.config.MechworksConfig;
import slimeknights.tmechworks.common.inventory.DrawbridgeContainer;
import slimeknights.tmechworks.common.inventory.FragmentedInventory;
import slimeknights.tmechworks.common.items.MachineUpgradeItem;
Expand Down Expand Up @@ -62,13 +66,19 @@ public class DrawbridgeTileEntity extends RedstoneMachineTileEntity implements I
private int extendedLength;
private float cooldown;

private static boolean isCapAccess;

private long lastWorldTime;

public DrawbridgeTileEntity() {
super(MechworksContent.TileEntities.drawbridge, new TranslationTextComponent(Util.prefix("inventory.drawbridge")), UPGRADES_SIZE + 1);

upgrades = new FragmentedInventory(this, 0, UPGRADES_SIZE).overrideStackLimit(1).setValidItemsPredicate(stack -> stack.getItem() instanceof MachineUpgradeItem);
slots = new FragmentedInventory(this, UPGRADES_SIZE, 1).setValidItemsPredicate(stack -> stack.getItem() instanceof BlockItem && !DrawbridgeBlock.BLACKLIST.contains(Block.getBlockFromItem(stack.getItem()))).overrideStackLimit(64);

itemHandlerCap.invalidate();
itemHandler = new DrawbridgeItemHandler(this);
itemHandlerCap = LazyOptional.of(() -> itemHandler);
}

@Override
Expand Down Expand Up @@ -537,6 +547,17 @@ public void setInventorySlotContents(int slot, @Nonnull ItemStack itemstack) {
computeStats();
}

@Override
public boolean isItemValidForSlot(int slot, @Nonnull ItemStack stack) {
if(!isCapAccess)
return false;

if(!slots.isSlotInInventory(slot - slots.getStartSlot()))
return false;

return super.isItemValidForSlot(slot, stack) && slots.isItemValidForSlot(slot - slots.getStartSlot(), stack);
}

public FakePlayer getFakePlayer(BlockPos pos) {
updateFakePlayer(pos);

Expand Down Expand Up @@ -684,6 +705,59 @@ public BlockPos getPos() {
}
}

private static class DrawbridgeItemHandler extends InvWrapper {
private DrawbridgeTileEntity te;

public DrawbridgeItemHandler(DrawbridgeTileEntity inv) {
super(inv);

te = inv;
}

@Nonnull
@Override
public ItemStack insertItem(int slotAbs, @Nonnull ItemStack stack, boolean simulate) {
int slot = slotAbs - te.slots.getStartSlot();

// Disallow inserting anywhere but in main inventory slots
if(slot < 0 || slot >= te.slots.getSizeInventory())
return stack;

isCapAccess = true;
ItemStack out = super.insertItem(slotAbs, stack, simulate);
isCapAccess = false;
return out;
}

@Nonnull
@Override
public ItemStack extractItem(int slotAbs, int amount, boolean simulate) {
int slot = slotAbs - te.slots.getStartSlot();

// Disallow inserting anywhere but in main inventory slots
if(slot < 0 || slot >= te.slots.getSizeInventory())
return ItemStack.EMPTY;

isCapAccess = true;
ItemStack out = super.extractItem(slotAbs, amount, simulate);
isCapAccess = false;
return out;
}

@Override
public boolean isItemValid(int slot, @Nonnull ItemStack stack) {
isCapAccess = true;
boolean out = super.isItemValid(slot, stack);
isCapAccess = false;
return out;
}

@Override
public int getSlotLimit(int slot) {
return te.slots.getInventoryStackLimit();
}
}

private static class DrawbridgeTools {
public static final ItemStack PICKAXE;
public static final ItemStack AXE;
Expand Down
Expand Up @@ -133,7 +133,7 @@ public void closeInventory(PlayerEntity player) {

@Override
public boolean isItemValidForSlot(int slot, ItemStack itemStack) {
return validItems.test(itemStack) && parent.isItemValidForSlot(getSlot(slot), itemStack);
return isItemValidForValidatingSlot(slot, itemStack);
}

public boolean isSlotInInventory(int i) {
Expand Down

0 comments on commit 2121fd0

Please sign in to comment.