diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index f18679690..c15dfa3f9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -138,12 +138,13 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (!level.isClientSide) canPickUpItems = canDirectlyInsert(); + boolean clientSide = level != null && level.isClientSide && !isVirtual(); float itemMotion = getItemMotion(); if (itemMotion != 0 && level != null && level.isClientSide) spawnParticles(itemMotion); tickAirStreams(itemMotion); - if (item.isEmpty()) { + if (item.isEmpty() && !clientSide) { if (itemMotion < 0) handleInputFromAbove(); if (itemMotion > 0) @@ -152,13 +153,13 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor } float nextOffset = itemPosition.value + itemMotion; - + if (itemMotion < 0) { if (nextOffset < .5f) { if (!handleDownwardOutput(true)) nextOffset = .5f; else if (nextOffset < 0) { - handleDownwardOutput(level.isClientSide && !isVirtual()); + handleDownwardOutput(clientSide); nextOffset = itemPosition.value; } } @@ -167,7 +168,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (!handleUpwardOutput(true)) nextOffset = .5f; else if (nextOffset > 1) { - handleUpwardOutput(level.isClientSide && !isVirtual()); + handleUpwardOutput(clientSide); nextOffset = itemPosition.value; } } @@ -341,7 +342,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (mode == ExtractionCountMode.UPTO || !ItemHelper.extract(inv, canAccept, mode, count, true) .isEmpty()) { ItemStack extracted = ItemHelper.extract(inv, canAccept, mode, count, false); - setItem(extracted, startLocation); + if (!extracted.isEmpty()) + setItem(extracted, startLocation); } } @@ -496,8 +498,8 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor public void setItem(ItemStack stack, float insertionPos) { item = stack; itemPosition.lastValue = itemPosition.value = insertionPos; - setChanged(); - sendData(); + if (!level.isClientSide) + notifyUpdate(); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index d903b52a1..bad04216f 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -13,6 +13,7 @@ public class CClient extends ConfigBase { public ConfigBool explainRenderErrors = b(false, "explainRenderErrors", "Log a stack-trace when rendering issues happen within a moving contraption."); public ConfigFloat fanParticleDensity = f(.5f, 0, 1, "fanParticleDensity"); + public ConfigFloat filterItemRenderDistance = f(10f, 1, "filterItemRenderDistance", "[in Blocks]", "Maximum Distance to the player at which items in Blocks' filter slots will be displayed"); public ConfigBool rainbowDebug = b(true, "enableRainbowDebug", "Show colourful debug information while the F3-Menu is open."); public ConfigBool experimentalRendering = diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java index c4f234d4f..dcc242b5a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java @@ -37,7 +37,7 @@ public abstract class SyncedTileEntity extends TileEntity { } public void sendData() { - if (level != null) + if (level != null && !level.isClientSide) level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 2 | 4 | 16); } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java index 907d0d856..24b2a0a90 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.CreateClient; import com.simibubi.create.content.logistics.item.filter.FilterItem; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; @@ -14,11 +15,13 @@ import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sid import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; @@ -86,12 +89,19 @@ public class FilteringRenderer { .highlightFace(result.getDirection()); } - public static void renderOnTileEntity(SmartTileEntity tileEntityIn, float partialTicks, MatrixStack ms, + public static void renderOnTileEntity(SmartTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { - if (tileEntityIn == null || tileEntityIn.isRemoved()) + if (te == null || te.isRemoved()) return; - FilteringBehaviour behaviour = tileEntityIn.getBehaviour(FilteringBehaviour.TYPE); + + Entity cameraEntity = Minecraft.getInstance().cameraEntity; + float max = AllConfigs.CLIENT.filterItemRenderDistance.getF(); + if (!te.isVirtual() && cameraEntity != null && cameraEntity.position() + .distanceToSqr(VecHelper.getCenterOf(te.getBlockPos())) > (max * max)) + return; + + FilteringBehaviour behaviour = te.getBehaviour(FilteringBehaviour.TYPE); if (behaviour == null) return; if (!behaviour.isActive()) @@ -101,7 +111,7 @@ public class FilteringRenderer { return; ValueBoxTransform slotPositioning = behaviour.slotPositioning; - BlockState blockState = tileEntityIn.getBlockState(); + BlockState blockState = te.getBlockState(); if (slotPositioning instanceof ValueBoxTransform.Sided) { ValueBoxTransform.Sided sided = (ValueBoxTransform.Sided) slotPositioning; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java index 1c51f5861..23962d3c4 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.datafixers.util.Pair; import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; @@ -11,10 +12,12 @@ import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -63,6 +66,13 @@ public class LinkRenderer { if (te == null || te.isRemoved()) return; + + Entity cameraEntity = Minecraft.getInstance().cameraEntity; + float max = AllConfigs.CLIENT.filterItemRenderDistance.getF(); + if (!te.isVirtual() && cameraEntity != null && cameraEntity.position() + .distanceToSqr(VecHelper.getCenterOf(te.getBlockPos())) > (max * max)) + return; + LinkBehaviour behaviour = te.getBehaviour(LinkBehaviour.TYPE); if (behaviour == null) return;