From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samsuik Date: Mon, 2 Sep 2024 22:11:46 +0100 Subject: [PATCH] Allow projectiles to load chunks for collisions diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java index c56bc341ebb1592af9285d5e044951e7ae2ae0b2..070a0ce1c7140499be8222ad39e5ada0f79a0c82 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java @@ -90,6 +90,7 @@ public abstract class AbstractArrow extends Projectile { this.pickup = AbstractArrow.Pickup.DISALLOWED; this.baseDamage = 2.0D; this.soundEvent = this.getDefaultHitGroundSoundEvent(); + this.loadChunks = this.level.sakuraConfig().entity.projectilesLoadChunksForCollisions; // Sakura - allow projectiles to load chunks for collisions } protected AbstractArrow(EntityType type, double x, double y, double z, Level world) { diff --git a/src/main/java/net/minecraft/world/level/BlockGetter.java b/src/main/java/net/minecraft/world/level/BlockGetter.java index d1eefa6ef3e9abfe7af4d8310aa64465fa2d5463..04d45b2ddc3489c4d0764da1575cb9a373d9a490 100644 --- a/src/main/java/net/minecraft/world/level/BlockGetter.java +++ b/src/main/java/net/minecraft/world/level/BlockGetter.java @@ -76,7 +76,14 @@ public interface BlockGetter extends LevelHeightAccessor { // CraftBukkit start - moved block handling into separate method for use by Block#rayTrace default BlockHitResult clip(ClipContext raytrace1, BlockPos blockposition) { // Paper start - Prevent raytrace from loading chunks - BlockState iblockdata = this.getBlockStateIfLoaded(blockposition); + // Sakura start - allow projectiles to load chunks for collisions + final BlockState iblockdata; + if (raytrace1.loadChunks()) { + iblockdata = this.getBlockState(blockposition); + } else { + iblockdata = this.getBlockStateIfLoaded(blockposition); + } + // Sakura end - allow projectiles to load chunks for collisions if (iblockdata == null) { // copied the last function parameter (listed below) Vec3 vec3d = raytrace1.getFrom().subtract(raytrace1.getTo()); diff --git a/src/main/java/net/minecraft/world/level/ClipContext.java b/src/main/java/net/minecraft/world/level/ClipContext.java index ad2c533e9a0f0e2d97620b0e16200d7eeaedeefb..1e351f85dd1d9c4f267b283dd93bb74306fd9311 100644 --- a/src/main/java/net/minecraft/world/level/ClipContext.java +++ b/src/main/java/net/minecraft/world/level/ClipContext.java @@ -20,6 +20,13 @@ public class ClipContext { private final ClipContext.Block block; private final ClipContext.Fluid fluid; private final CollisionContext collisionContext; + // Sakura start - allow projectiles to load chunks for collisions + private final boolean loadChunks; + + public boolean loadChunks() { + return this.loadChunks; + } + // Sakura end - allow projectiles to load chunks for collisions public ClipContext(Vec3 start, Vec3 end, ClipContext.Block shapeType, ClipContext.Fluid fluidHandling, Entity entity) { this.from = start; @@ -27,6 +34,7 @@ public class ClipContext { this.block = shapeType; this.fluid = fluidHandling; this.collisionContext = (entity == null) ? CollisionContext.empty() : CollisionContext.of(entity); // CraftBukkit + this.loadChunks = entity != null && entity.loadChunks; // Sakura - allow projectiles to load chunks for collisions } public Vec3 getTo() {