Add extra item capability checks

Many mods does not invalidate their capabilities, so fix it on our end
This commit is contained in:
Snownee 2021-03-18 18:43:25 +08:00
parent e3394a8907
commit d75793d036
13 changed files with 63 additions and 22 deletions

View file

@ -8,6 +8,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.components.crafter.ConnectedInputHandler.ConnectedInput;
import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity.Phase;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Pointing;
@ -234,6 +236,14 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT
return ActionResultType.PASS;
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
InvManipulationBehaviour behaviour = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE);
if (behaviour != null)
behaviour.onNeighborChanged(fromPos);
}
@Override
public float getParticleTargetRadius() {
return .85f;

View file

@ -2,7 +2,6 @@ package com.simibubi.create.content.logistics.block.belts.tunnel;
import java.util.*;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.logistics.packet.TunnelFlapPacket;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.networking.AllPackets;

View file

@ -29,6 +29,7 @@ import net.minecraft.world.IWorld;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.util.LazyOptional;
public abstract class AbstractChuteBlock extends Block implements IWrenchable, ITE<ChuteTileEntity> {
@ -156,9 +157,10 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I
@Override
public void neighborChanged(BlockState p_220069_1_, World world, BlockPos pos, Block p_220069_4_,
BlockPos neighbourPos, boolean p_220069_6_) {
if (pos.down()
.equals(neighbourPos))
if (pos.down().equals(neighbourPos))
withTileEntityDo(world, pos, ChuteTileEntity::blockBelowChanged);
else if (pos.up().equals(neighbourPos))
withTileEntityDo(world, pos, chute -> chute.capAbove = LazyOptional.empty());
}
public abstract BlockState updateChuteState(BlockState state, BlockState above, IBlockReader world, BlockPos pos);

View file

@ -272,6 +272,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
public void blockBelowChanged() {
updateAirFlow = true;
capBelow = LazyOptional.empty();
}
private void spawnParticles(float itemMotion) {

View file

@ -59,6 +59,9 @@ public abstract class AbstractFunnelBlock extends Block implements ITE<FunnelTil
boolean isMoving) {
if (worldIn.isRemote)
return;
InvManipulationBehaviour behaviour = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE);
if (behaviour != null)
behaviour.onNeighborChanged(fromPos);
boolean previouslyPowered = state.get(POWERED);
if (previouslyPowered != worldIn.isBlockPowered(pos))
worldIn.setBlockState(pos, state.cycle(POWERED), 2);

View file

@ -4,7 +4,6 @@ import java.lang.ref.WeakReference;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.components.saw.SawTileEntity;
import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation;
import com.simibubi.create.content.contraptions.relays.belt.BeltHelper;
@ -13,7 +12,6 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.Transporte
import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape;
import com.simibubi.create.content.logistics.packet.FunnelFlapPacket;
import com.simibubi.create.content.logistics.packet.TunnelFlapPacket;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.item.TooltipHelper;
@ -42,7 +40,6 @@ import net.minecraft.util.math.Vec3d;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.network.PacketDistributor;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;

View file

@ -111,7 +111,7 @@ public class AdjustableCrateBlock extends CrateBlock {
public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) {
TileEntity te = worldIn.getTileEntity(pos);
if (te instanceof AdjustableCrateTileEntity) {
AdjustableCrateTileEntity flexcrateTileEntity = (AdjustableCrateTileEntity) te;
AdjustableCrateTileEntity flexcrateTileEntity = ((AdjustableCrateTileEntity) te).getMainCrate();
return ItemHelper.calcRedstoneFromInventory(flexcrateTileEntity.inventory);
}
return 0;

View file

@ -11,6 +11,7 @@ import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.block.Block;
@ -129,6 +130,14 @@ public class ContentObserverBlock extends HorizontalBlock implements ITE<Content
}
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
InvManipulationBehaviour behaviour = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE);
if (behaviour != null)
behaviour.onNeighborChanged(fromPos);
}
public void onFunnelTransfer(World world, BlockPos funnelPos, ItemStack transferred) {
for (Direction direction : Iterate.horizontalDirections) {
BlockPos detectorPos = funnelPos.offset(direction);

View file

@ -62,6 +62,7 @@ public class StockpileSwitchTileEntity extends SmartTileEntity {
public void updateCurrentLevel() {
boolean changed = false;
observedInventory.findNewCapability();
if (!observedInventory.hasInventory()) {
if (currentLevel == -1)
return;

View file

@ -71,4 +71,10 @@ public class SchematicannonBlock extends Block implements ITE<SchematicannonTile
return SchematicannonTileEntity.class;
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
withTileEntityDo(worldIn, pos, te -> te.neighbourCheckCooldown = 0);
}
}

View file

@ -1,5 +1,6 @@
package com.simibubi.create.content.schematics.block;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
@ -9,7 +10,6 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.AllTags.AllBlockTags;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltPart;
import com.simibubi.create.content.contraptions.relays.belt.BeltSlope;
@ -65,10 +65,10 @@ import net.minecraft.world.gen.feature.template.Template;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.wrapper.EmptyHandler;
public class SchematicannonTileEntity extends SmartTileEntity implements INamedContainerProvider, IInstanceRendered {
@ -102,7 +102,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
public BlockPos target;
public BlockPos previousTarget;
public List<IItemHandler> attachedInventories;
public LinkedHashSet<LazyOptional<IItemHandler>> attachedInventories;
public List<LaunchedItem> flyingBlocks;
public MaterialChecklist checklist;
@ -137,14 +137,13 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
public SchematicannonTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
setLazyTickRate(30);
attachedInventories = new LinkedList<>();
attachedInventories = new LinkedHashSet<>();
flyingBlocks = new LinkedList<>();
inventory = new SchematicannonInventory(this);
statusMsg = "idle";
state = State.STOPPED;
printingEntityIndex = -1;
replaceMode = 2;
neighbourCheckCooldown = NEIGHBOUR_CHECKING;
checklist = new MaterialChecklist();
}
@ -164,7 +163,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
LazyOptional<IItemHandler> capability =
tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing.getOpposite());
if (capability.isPresent()) {
attachedInventories.add(capability.orElse(null));
attachedInventories.add(capability);
}
}
}
@ -288,7 +287,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
public void tick() {
super.tick();
if (neighbourCheckCooldown-- <= 0) {
if (state != State.STOPPED && neighbourCheckCooldown-- <= 0) {
neighbourCheckCooldown = NEIGHBOUR_CHECKING;
findInventories();
}
@ -577,9 +576,12 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
if (hasCreativeCrate)
return true;
attachedInventories.removeIf(cap -> !cap.isPresent());
// Find and apply damage
if (usage == ItemUseType.DAMAGE) {
for (IItemHandler iItemHandler : attachedInventories) {
for (LazyOptional<IItemHandler> cap : attachedInventories) {
IItemHandler iItemHandler = cap.orElse(EmptyHandler.INSTANCE);
for (int slot = 0; slot < iItemHandler.getSlots(); slot++) {
ItemStack extractItem = iItemHandler.extractItem(slot, 1, true);
if (!ItemRequirement.validate(required, extractItem))
@ -608,8 +610,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
boolean success = false;
if (usage == ItemUseType.CONSUME) {
int amountFound = 0;
for (IItemHandler iItemHandler : attachedInventories) {
for (LazyOptional<IItemHandler> cap : attachedInventories) {
IItemHandler iItemHandler = cap.orElse(EmptyHandler.INSTANCE);
amountFound += ItemHelper
.extract(iItemHandler, s -> ItemRequirement.validate(required, s), ExtractionCountMode.UPTO,
required.getCount(), true)
@ -625,7 +627,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
if (!simulate && success) {
int amountFound = 0;
for (IItemHandler iItemHandler : attachedInventories) {
for (LazyOptional<IItemHandler> cap : attachedInventories) {
IItemHandler iItemHandler = cap.orElse(EmptyHandler.INSTANCE);
amountFound += ItemHelper
.extract(iItemHandler, s -> ItemRequirement.validate(required, s), ExtractionCountMode.UPTO,
required.getCount(), false)
@ -916,7 +919,11 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC
}
}
checklist.gathered.clear();
for (IItemHandler inventory : attachedInventories) {
findInventories();
for (LazyOptional<IItemHandler> cap : attachedInventories) {
if (!cap.isPresent())
continue;
IItemHandler inventory = cap.orElse(EmptyHandler.INSTANCE);
for (int slot = 0; slot < inventory.getSlots(); slot++) {
ItemStack stackInSlot = inventory.getStackInSlot(slot);
if (inventory.extractItem(slot, 1, true)

View file

@ -5,7 +5,6 @@ import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType;
import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
@ -47,7 +46,7 @@ public abstract class TileEntityBehaviour {
}
public void onNeighborChanged(Direction direction) {
public void onNeighborChanged(BlockPos neighborPos) {
}

View file

@ -138,6 +138,13 @@ public class InvManipulationBehaviour extends TileEntityBehaviour {
findNewNextTick = true;
}
@Override
public void onNeighborChanged(BlockPos neighborPos) {
BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getPos(), tileEntity.getBlockState());
if (targetBlockFace.getConnectedPos().equals(neighborPos))
onHandlerInvalidated(targetCapability);
}
protected void onHandlerInvalidated(LazyOptional<IItemHandler> handler) {
findNewNextTick = true;
targetCapability = LazyOptional.empty();
@ -167,7 +174,7 @@ public class InvManipulationBehaviour extends TileEntityBehaviour {
return amount;
}
protected void findNewCapability() {
public void findNewCapability() {
BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getPos(), tileEntity.getBlockState())
.getOpposite();
BlockPos pos = targetBlockFace.getPos();