Merge pull request #1062 from Snownee/mc1.15/dev

Bug fixes
This commit is contained in:
simibubi 2021-02-19 14:22:37 +01:00 committed by GitHub
commit fd65acd91d
Failed to generate hash of commit
8 changed files with 42 additions and 10 deletions

View file

@ -37,6 +37,7 @@ public class PortableFluidInterfaceTileEntity extends PortableStorageInterfaceTi
LazyOptional<IFluidHandler> oldcap = capability; LazyOptional<IFluidHandler> oldcap = capability;
capability = createEmptyHandler(); capability = createEmptyHandler();
oldcap.invalidate(); oldcap.invalidate();
super.stopTransferring();
} }
private LazyOptional<IFluidHandler> createEmptyHandler() { private LazyOptional<IFluidHandler> createEmptyHandler() {
@ -90,7 +91,7 @@ public class PortableFluidInterfaceTileEntity extends PortableStorageInterfaceTi
@Override @Override
public FluidStack drain(FluidStack resource, FluidAction action) { public FluidStack drain(FluidStack resource, FluidAction action) {
if (!isConnected()) if (!canTransfer())
return FluidStack.EMPTY; return FluidStack.EMPTY;
FluidStack drain = wrapped.drain(resource, action); FluidStack drain = wrapped.drain(resource, action);
if (!drain.isEmpty() && action.execute()) if (!drain.isEmpty() && action.execute())
@ -100,7 +101,7 @@ public class PortableFluidInterfaceTileEntity extends PortableStorageInterfaceTi
@Override @Override
public FluidStack drain(int maxDrain, FluidAction action) { public FluidStack drain(int maxDrain, FluidAction action) {
if (!isConnected()) if (!canTransfer())
return FluidStack.EMPTY; return FluidStack.EMPTY;
FluidStack drain = wrapped.drain(maxDrain, action); FluidStack drain = wrapped.drain(maxDrain, action);
if (!drain.isEmpty() && (action.execute() || drain.getAmount() == 1)) if (!drain.isEmpty() && (action.execute() || drain.getAmount() == 1))

View file

@ -33,6 +33,7 @@ public class PortableItemInterfaceTileEntity extends PortableStorageInterfaceTil
LazyOptional<IItemHandlerModifiable> oldCap = capability; LazyOptional<IItemHandlerModifiable> oldCap = capability;
capability = LazyOptional.of(() -> new InterfaceItemHandler(new ItemStackHandler(0))); capability = LazyOptional.of(() -> new InterfaceItemHandler(new ItemStackHandler(0)));
oldCap.invalidate(); oldCap.invalidate();
super.stopTransferring();
} }
@Override @Override
@ -55,7 +56,7 @@ public class PortableItemInterfaceTileEntity extends PortableStorageInterfaceTil
@Override @Override
public ItemStack extractItem(int slot, int amount, boolean simulate) { public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (!isConnected()) if (!canTransfer())
return ItemStack.EMPTY; return ItemStack.EMPTY;
ItemStack extractItem = super.extractItem(slot, amount, simulate); ItemStack extractItem = super.extractItem(slot, amount, simulate);
if (!simulate && !extractItem.isEmpty()) if (!simulate && !extractItem.isEmpty())
@ -65,7 +66,7 @@ public class PortableItemInterfaceTileEntity extends PortableStorageInterfaceTil
@Override @Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (!isConnected()) if (!canTransfer())
return stack; return stack;
ItemStack insertItem = super.insertItem(slot, stack, simulate); ItemStack insertItem = super.insertItem(slot, stack, simulate);
if (!simulate && !insertItem.equals(stack, false)) if (!simulate && !insertItem.equals(stack, false))

View file

@ -8,6 +8,7 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat;
import net.minecraft.entity.Entity;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
@ -21,6 +22,7 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity
protected float distance; protected float distance;
protected LerpedFloat connectionAnimation; protected LerpedFloat connectionAnimation;
protected boolean powered; protected boolean powered;
protected Entity connectedEntity;
public PortableStorageInterfaceTileEntity(TileEntityType<?> tileEntityTypeIn) { public PortableStorageInterfaceTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn); super(tileEntityTypeIn);
@ -32,11 +34,20 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity
public void startTransferringTo(Contraption contraption, float distance) { public void startTransferringTo(Contraption contraption, float distance) {
this.distance = distance; this.distance = distance;
connectedEntity = contraption.entity;
startConnecting(); startConnecting();
notifyUpdate(); notifyUpdate();
} }
protected abstract void stopTransferring(); protected void stopTransferring() {
connectedEntity = null;
}
public boolean canTransfer() {
if (connectedEntity != null && !connectedEntity.isAlive())
stopTransferring();
return connectedEntity != null && isConnected();
}
protected abstract void invalidateCapability(); protected abstract void invalidateCapability();

View file

@ -59,6 +59,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
protected Contraption contraption; protected Contraption contraption;
protected boolean initialized; protected boolean initialized;
private boolean prevPosInvalid; private boolean prevPosInvalid;
private boolean ticking;
public AbstractContraptionEntity(EntityType<?> entityTypeIn, World worldIn) { public AbstractContraptionEntity(EntityType<?> entityTypeIn, World worldIn) {
super(entityTypeIn, worldIn); super(entityTypeIn, worldIn);
@ -246,6 +247,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
if (!world.isRemote) if (!world.isRemote)
contraption.stalled = false; contraption.stalled = false;
ticking = true;
for (MutablePair<BlockInfo, MovementContext> pair : contraption.getActors()) { for (MutablePair<BlockInfo, MovementContext> pair : contraption.getActors()) {
MovementContext context = pair.right; MovementContext context = pair.right;
BlockInfo blockInfo = pair.left; BlockInfo blockInfo = pair.left;
@ -265,13 +267,25 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
continue; continue;
if (newPosVisited && !context.stall) { if (newPosVisited && !context.stall) {
actor.visitNewPosition(context, gridPosition); actor.visitNewPosition(context, gridPosition);
if (!isAlive())
break;
context.firstMovement = false; context.firstMovement = false;
} }
if (!oldMotion.equals(context.motion)) if (!oldMotion.equals(context.motion)) {
actor.onSpeedChanged(context, oldMotion, context.motion); actor.onSpeedChanged(context, oldMotion, context.motion);
if (!isAlive())
break;
}
actor.tick(context); actor.tick(context);
if (!isAlive())
break;
contraption.stalled |= context.stall; contraption.stalled |= context.stall;
} }
if (!isAlive()) {
contraption.stop(world);
return;
}
ticking = false;
for (Entity entity : getPassengers()) { for (Entity entity : getPassengers()) {
if (!(entity instanceof OrientedContraptionEntity)) if (!(entity instanceof OrientedContraptionEntity))
@ -445,7 +459,8 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
@Override @Override
public void remove(boolean keepData) { public void remove(boolean keepData) {
if (!world.isRemote && !removed && contraption != null) { if (!world.isRemote && !removed && contraption != null) {
contraption.stop(world); if (!ticking)
contraption.stop(world);
} }
super.remove(keepData); super.remove(keepData);
} }

View file

@ -46,6 +46,8 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity {
if (!(world.getBlockState(pos) if (!(world.getBlockState(pos)
.getBlock() instanceof MechanicalPistonBlock)) .getBlock() instanceof MechanicalPistonBlock))
return; return;
if (getMovementSpeed() == 0)
return;
Direction direction = getBlockState().get(BlockStateProperties.FACING); Direction direction = getBlockState().get(BlockStateProperties.FACING);

View file

@ -77,6 +77,8 @@ public class SandPaperItem extends Item {
AxisAlignedBB bb = new AxisAlignedBB(hitVec, hitVec).grow(1f); AxisAlignedBB bb = new AxisAlignedBB(hitVec, hitVec).grow(1f);
ItemEntity pickUp = null; ItemEntity pickUp = null;
for (ItemEntity itemEntity : worldIn.getEntitiesWithinAABB(ItemEntity.class, bb)) { for (ItemEntity itemEntity : worldIn.getEntitiesWithinAABB(ItemEntity.class, bb)) {
if (!itemEntity.isAlive())
continue;
if (itemEntity.getPositionVec() if (itemEntity.getPositionVec()
.distanceTo(playerIn.getPositionVec()) > 3) .distanceTo(playerIn.getPositionVec()) > 3)
continue; continue;

View file

@ -174,7 +174,7 @@ public class ItemHelper {
if (!simulate && hasEnoughItems) if (!simulate && hasEnoughItems)
inv.extractItem(slot, stack.getCount(), false); inv.extractItem(slot, stack.getCount(), false);
if (extracting.getCount() >= maxExtractionCount) { if (extracting.getCount() >= maxExtractionCount || extracting.getCount() >= extracting.getMaxStackSize()) {
if (checkHasEnoughItems) { if (checkHasEnoughItems) {
hasEnoughItems = true; hasEnoughItems = true;
checkHasEnoughItems = false; checkHasEnoughItems = false;
@ -234,7 +234,7 @@ public class ItemHelper {
if (!simulate) if (!simulate)
inv.extractItem(slot, stack.getCount(), false); inv.extractItem(slot, stack.getCount(), false);
if (extracting.getCount() == maxExtractionCount) if (extracting.getCount() >= maxExtractionCount || extracting.getCount() >= extracting.getMaxStackSize())
break; break;
} }

View file

@ -59,7 +59,7 @@ public final class NBTProcessors {
TileEntityType<?> type = tileEntity.getType(); TileEntityType<?> type = tileEntity.getType();
if (survival && survivalProcessors.containsKey(type)) if (survival && survivalProcessors.containsKey(type))
compound = survivalProcessors.get(type).apply(compound); compound = survivalProcessors.get(type).apply(compound);
if (processors.containsKey(type)) if (compound != null && processors.containsKey(type))
return processors.get(type).apply(compound); return processors.get(type).apply(compound);
if (tileEntity.onlyOpsCanSetNbt()) if (tileEntity.onlyOpsCanSetNbt())
return null; return null;