[1.16] Fix possible crash when using rendering regionCache (#7207)
This commit is contained in:
parent
91dda36b08
commit
b1247df4dc
2 changed files with 15 additions and 6 deletions
|
@ -23,10 +23,12 @@ import java.io.IOException;
|
|||
import java.util.BitSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
@ -97,16 +99,16 @@ public class MinecraftForgeClient
|
|||
}
|
||||
}
|
||||
|
||||
private static final LoadingCache<Pair<World, BlockPos>, ChunkRenderCache> regionCache = CacheBuilder.newBuilder()
|
||||
private static final LoadingCache<Pair<World, BlockPos>, Optional<ChunkRenderCache>> regionCache = CacheBuilder.newBuilder()
|
||||
.maximumSize(500)
|
||||
.concurrencyLevel(5)
|
||||
.expireAfterAccess(1, TimeUnit.SECONDS)
|
||||
.build(new CacheLoader<Pair<World, BlockPos>, ChunkRenderCache>()
|
||||
.build(new CacheLoader<Pair<World, BlockPos>, Optional<ChunkRenderCache>>()
|
||||
{
|
||||
@Override
|
||||
public ChunkRenderCache load(Pair<World, BlockPos> key)
|
||||
public Optional<ChunkRenderCache> load(Pair<World, BlockPos> key)
|
||||
{
|
||||
return ChunkRenderCache.generateCache(key.getLeft(), key.getRight().add(-1, -1, -1), key.getRight().add(16, 16, 16), 1);
|
||||
return Optional.ofNullable(ChunkRenderCache.generateCache(key.getLeft(), key.getRight().add(-1, -1, -1), key.getRight().add(16, 16, 16), 1));
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -115,10 +117,16 @@ public class MinecraftForgeClient
|
|||
if (cache == null)
|
||||
regionCache.invalidate(Pair.of(world, position));
|
||||
else
|
||||
regionCache.put(Pair.of(world, position), cache);
|
||||
regionCache.put(Pair.of(world, position), Optional.of(cache));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static ChunkRenderCache getRegionRenderCache(World world, BlockPos pos)
|
||||
{
|
||||
return getRegionRenderCacheOptional(world, pos).orElse(null);
|
||||
}
|
||||
|
||||
public static Optional<ChunkRenderCache> getRegionRenderCacheOptional(World world, BlockPos pos)
|
||||
{
|
||||
int x = pos.getX() & ~0xF;
|
||||
int y = pos.getY() & ~0xF;
|
||||
|
|
|
@ -66,7 +66,8 @@ public class TileEntityRendererAnimation<T extends TileEntity> extends TileEntit
|
|||
}
|
||||
if(blockRenderer == null) blockRenderer = Minecraft.getInstance().getBlockRendererDispatcher();
|
||||
BlockPos pos = te.getPos();
|
||||
IBlockDisplayReader world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
|
||||
IBlockDisplayReader world = MinecraftForgeClient.getRegionRenderCacheOptional(te.getWorld(), pos)
|
||||
.map(IBlockDisplayReader.class::cast).orElseGet(() -> te.getWorld());
|
||||
BlockState state = world.getBlockState(pos);
|
||||
IBakedModel model = blockRenderer.getBlockModelShapes().getModel(state);
|
||||
IModelData data = model.getModelData(world, pos, state, ModelDataManager.getModelData(te.getWorld(), pos));
|
||||
|
|
Loading…
Reference in a new issue