diff --git a/build.gradle.kts b/build.gradle.kts
index ab9ef4e8cf..4f69aafe47 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -46,7 +46,7 @@ repositories {
}
dependencies {
- paramMappings("net.fabricmc:yarn:1.18-pre5+build.4:mergedv2")
+ paramMappings("net.fabricmc:yarn:1.18-pre8+build.4:mergedv2")
remapper("net.fabricmc:tiny-remapper:0.7.0:fat")
decompiler("net.minecraftforge:forgeflower:1.5.498.22")
paperclip("io.papermc:paperclip:2.0.1")
diff --git a/gradle.properties b/gradle.properties
index 25a452897d..07543018ce 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,7 +1,7 @@
group=io.papermc.paper
-version=1.18-pre5-R0.1-SNAPSHOT
+version=1.18-pre8-R0.1-SNAPSHOT
-mcVersion=1.18-pre5
+mcVersion=1.18-pre8
org.gradle.caching=true
org.gradle.parallel=true
diff --git a/patches/api/Convert-project-to-Gradle.patch b/patches/api/Convert-project-to-Gradle.patch
index 7e4e1cc23f..6a4b0fc8d9 100644
--- a/patches/api/Convert-project-to-Gradle.patch
+++ b/patches/api/Convert-project-to-Gradle.patch
@@ -112,7 +112,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
-
- org.spigotmc
- spigot-api
-- 1.18-pre5-R0.1-SNAPSHOT
+- 1.18-pre8-R0.1-SNAPSHOT
- jar
-
- Spigot-API
diff --git a/patches/server/Add-configurable-portal-search-radius.patch b/patches/server/Add-configurable-portal-search-radius.patch
index 3a824b89b7..c15aff4382 100644
--- a/patches/server/Add-configurable-portal-search-radius.patch
+++ b/patches/server/Add-configurable-portal-search-radius.patch
@@ -47,10 +47,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+++ b/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
@@ -0,0 +0,0 @@ public class PortalForcer {
- public Optional findPortalAround(BlockPos blockposition, boolean destIsNether, WorldBorder worldborder) {
+ public Optional findPortalAround(BlockPos pos, boolean destIsNether, WorldBorder worldBorder) {
// CraftBukkit start
-- return this.findPortalAround(blockposition, worldborder, destIsNether ? 16 : 128); // Search Radius
-+ return this.findPortalAround(blockposition, worldborder, destIsNether ? level.paperConfig.portalCreateRadius : level.paperConfig.portalSearchRadius); // Search Radius // Paper - search Radius
+- return this.findPortalAround(pos, worldBorder, destIsNether ? 16 : 128); // Search Radius
++ return this.findPortalAround(pos, worldBorder, destIsNether ? level.paperConfig.portalCreateRadius : level.paperConfig.portalSearchRadius); // Search Radius // Paper - search Radius
}
public Optional findPortalAround(BlockPos blockposition, WorldBorder worldborder, int i) {
diff --git a/patches/server/Allow-Saving-of-Oversized-Chunks.patch b/patches/server/Allow-Saving-of-Oversized-Chunks.patch
index 8c3a6f20e9..ef204e5888 100644
--- a/patches/server/Allow-Saving-of-Oversized-Chunks.patch
+++ b/patches/server/Allow-Saving-of-Oversized-Chunks.patch
@@ -55,8 +55,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
public final java.util.concurrent.locks.ReentrantLock fileLock = new java.util.concurrent.locks.ReentrantLock(true); // Paper
+ public final Path regionFile; // Paper
- public RegionFile(Path path, Path path1, boolean dsync) throws IOException {
- this(path, path1, RegionFileVersion.VERSION_DEFLATE, dsync);
+ public RegionFile(Path file, Path directory, boolean dsync) throws IOException {
+ this(file, directory, RegionFileVersion.VERSION_DEFLATE, dsync);
@@ -0,0 +0,0 @@ public class RegionFile implements AutoCloseable {
public RegionFile(Path file, Path directory, RegionFileVersion outputChunkStreamVersion, boolean dsync) throws IOException {
diff --git a/patches/server/Asynchronous-chunk-IO-and-loading.patch b/patches/server/Asynchronous-chunk-IO-and-loading.patch
index 1f6aae1cfb..ad6327676d 100644
--- a/patches/server/Asynchronous-chunk-IO-and-loading.patch
+++ b/patches/server/Asynchronous-chunk-IO-and-loading.patch
@@ -2336,8 +2336,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ //this.flushWorker(); // Paper - nuke IOWorker
+ this.level.asyncChunkTaskManager.flush(); // Paper - flush to preserve behavior compat with pre-async behaviour
} else {
- this.visibleChunkMap.values().stream().filter(ChunkHolder::wasAccessibleSinceLastSave).forEach((playerchunk) -> {
- ChunkAccess ichunkaccess = (ChunkAccess) playerchunk.getChunkToSave().getNow(null); // CraftBukkit - decompile error
+ this.visibleChunkMap.values().forEach(this::saveChunkIfNeeded);
+ }
@@ -0,0 +0,0 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
protected void tick(BooleanSupplier shouldKeepTicking) {
ProfilerFiller gameprofilerfiller = this.level.getProfiler();
@@ -2462,7 +2462,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
private void markPositionReplaceable(ChunkPos pos) {
@@ -0,0 +0,0 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
- return this.tickingGenerated.get();
+ }
}
+ // Paper start - async chunk save for unload
@@ -3287,8 +3287,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
protected final RegionBitmap usedSectors;
+ public final java.util.concurrent.locks.ReentrantLock fileLock = new java.util.concurrent.locks.ReentrantLock(true); // Paper
- public RegionFile(Path path, Path path1, boolean dsync) throws IOException {
- this(path, path1, RegionFileVersion.VERSION_DEFLATE, dsync);
+ public RegionFile(Path file, Path directory, boolean dsync) throws IOException {
+ this(file, directory, RegionFileVersion.VERSION_DEFLATE, dsync);
@@ -0,0 +0,0 @@ public class RegionFile implements AutoCloseable {
return (byteCount + 4096 - 1) / 4096;
}
diff --git a/patches/server/Avoid-hopper-searches-if-there-are-no-items.patch b/patches/server/Avoid-hopper-searches-if-there-are-no-items.patch
index 70f08e5db0..90d7860300 100644
--- a/patches/server/Avoid-hopper-searches-if-there-are-no-items.patch
+++ b/patches/server/Avoid-hopper-searches-if-there-are-no-items.patch
@@ -44,32 +44,32 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
@@ -0,0 +0,0 @@ public class EntitySection {
}
- public void add(T entityAccess) {
+ public void add(T entity) {
+ // Paper start
-+ if (entityAccess instanceof net.minecraft.world.entity.item.ItemEntity) {
++ if (entity instanceof net.minecraft.world.entity.item.ItemEntity) {
+ this.itemCount++;
-+ } else if (entityAccess instanceof net.minecraft.world.Container) {
++ } else if (entity instanceof net.minecraft.world.Container) {
+ this.inventoryEntityCount++;
+ }
+ // Paper end
- this.storage.add(entityAccess);
+ this.storage.add(entity);
}
- public boolean remove(T entityAccess) {
+ public boolean remove(T entity) {
+ // Paper start
-+ if (entityAccess instanceof net.minecraft.world.entity.item.ItemEntity) {
++ if (entity instanceof net.minecraft.world.entity.item.ItemEntity) {
+ this.itemCount--;
-+ } else if (entityAccess instanceof net.minecraft.world.Container) {
++ } else if (entity instanceof net.minecraft.world.Container) {
+ this.inventoryEntityCount--;
+ }
+ // Paper end
- return this.storage.remove(entityAccess);
+ return this.storage.remove(entity);
}
@@ -0,0 +0,0 @@ public class EntitySection {
for(T entityAccess : collection) {
U entityAccess2 = (U)((EntityAccess)type.tryCast(entityAccess));
- if (entityAccess2 != null && entityAccess.getBoundingBox().intersects(aABB)) {
+ if (entityAccess2 != null && entityAccess.getBoundingBox().intersects(box)) {
- action.accept((T)entityAccess2);
+ action.accept(entityAccess2); // Paper - decompile fixes
}
@@ -84,20 +84,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
public void getEntities(AABB box, Consumer action) {
+ // Paper start
-+ this.getEntities(box, action, false);
+ }
+ public void getEntities(AABB box, Consumer action, boolean isContainerSearch) {
+ // Paper end
- this.forEachAccessibleNonEmptySection(box, (entitySection) -> {
-+ if (isContainerSearch && entitySection.inventoryEntityCount <= 0) return; // Paper
- entitySection.getEntities(box, action);
+ this.forEachAccessibleNonEmptySection(box, (section) -> {
++ if (isContainerSearch && section.inventoryEntityCount <= 0) return; // Paper
+ section.getEntities(box, action);
});
}
public void getEntities(EntityTypeTest filter, AABB box, Consumer action) {
- this.forEachAccessibleNonEmptySection(box, (entitySection) -> {
-+ if (filter.getBaseClass() == net.minecraft.world.entity.item.ItemEntity.class && entitySection.itemCount <= 0) return; // Paper
- entitySection.getEntities(filter, box, action);
+ this.forEachAccessibleNonEmptySection(box, (section) -> {
++ if (filter.getBaseClass() == net.minecraft.world.entity.item.ItemEntity.class && section.itemCount <= 0) return; // Paper
+ section.getEntities(filter, box, action);
});
}
diff --git a/src/main/java/net/minecraft/world/level/entity/LevelEntityGetter.java b/src/main/java/net/minecraft/world/level/entity/LevelEntityGetter.java
diff --git a/patches/server/Bound-Treasure-Maps-to-World-Border.patch b/patches/server/Bound-Treasure-Maps-to-World-Border.patch
index a95a7bdcce..430e40b282 100644
--- a/patches/server/Bound-Treasure-Maps-to-World-Border.patch
+++ b/patches/server/Bound-Treasure-Maps-to-World-Border.patch
@@ -41,7 +41,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
int o = j + i * m;
int p = k + i * n;
ChunkPos chunkPos = this.getPotentialFeatureChunk(config, worldSeed, o, p);
-+ if (!levelReader.getWorldBorder().isChunkInBounds(chunkPos.x, chunkPos.z)) { continue; } // Paper
++ if (!world.getWorldBorder().isChunkInBounds(chunkPos.x, chunkPos.z)) { continue; } // Paper
StructureCheckResult structureCheckResult = structureAccessor.checkStructurePresence(chunkPos, this, skipExistingChunks);
if (structureCheckResult != StructureCheckResult.START_NOT_PRESENT) {
if (!skipExistingChunks && structureCheckResult == StructureCheckResult.START_PRESENT) {
diff --git a/patches/server/Custom-replacement-for-eaten-items.patch b/patches/server/Custom-replacement-for-eaten-items.patch
index 8d3c4668b9..1b223f204b 100644
--- a/patches/server/Custom-replacement-for-eaten-items.patch
+++ b/patches/server/Custom-replacement-for-eaten-items.patch
@@ -9,21 +9,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
- this.triggerItemUseEffects(this.useItem, 16);
- // CraftBukkit start - fire PlayerItemConsumeEvent
- ItemStack itemstack;
+ this.triggerItemUseEffects(this.useItem, 16);
+ // CraftBukkit start - fire PlayerItemConsumeEvent
+ ItemStack itemstack;
+ PlayerItemConsumeEvent event = null; // Paper
- if (this instanceof ServerPlayer) {
- org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.useItem);
-- PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem);
+ if (this instanceof ServerPlayer) {
+ org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.useItem);
+- PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem);
+ event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem); // Paper
- level.getCraftServer().getPluginManager().callEvent(event);
+ level.getCraftServer().getPluginManager().callEvent(event);
- if (event.isCancelled()) {
+ if (event.isCancelled()) {
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
- } else {
- itemstack = this.useItem.finishUsingItem(this.level, this);
- }
+ } else {
+ itemstack = this.useItem.finishUsingItem(this.level, this);
+ }
+
+ // Paper start - save the default replacement item and change it if necessary
+ final ItemStack defaultReplacement = itemstack;
@@ -31,18 +31,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ itemstack = CraftItemStack.asNMSCopy(event.getReplacement());
+ }
+ // Paper end
- // CraftBukkit end
+ // CraftBukkit end
- if (itemstack != this.useItem) {
+ if (itemstack != this.useItem) {
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
- }
+ }
- this.stopUsingItem();
+ this.stopUsingItem();
+ // Paper start - if the replacement is anything but the default, update the client inventory
+ if (this instanceof ServerPlayer && !com.google.common.base.Objects.equal(defaultReplacement, itemstack)) {
+ ((ServerPlayer) this).getBukkitEntity().updateInventory();
+ }
+ // Paper end
- }
+ }
- }
+ }
diff --git a/patches/server/Don-t-allow-null-UUID-s-for-chat.patch b/patches/server/Don-t-allow-null-UUID-s-for-chat.patch
index 227b8a9644..9ccd1b869b 100644
--- a/patches/server/Don-t-allow-null-UUID-s-for-chat.patch
+++ b/patches/server/Don-t-allow-null-UUID-s-for-chat.patch
@@ -9,9 +9,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundChatPacket.java
+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundChatPacket.java
@@ -0,0 +0,0 @@ public class ClientboundChatPacket implements Packet {
- public ClientboundChatPacket(Component message, ChatType location, UUID sender) {
+ public ClientboundChatPacket(Component message, ChatType type, UUID sender) {
this.message = message;
- this.type = location;
+ this.type = type;
- this.sender = sender;
+ this.sender = sender != null ? sender : net.minecraft.Util.NIL_UUID;
}
diff --git a/patches/server/Fix-PlayerItemConsumeEvent-cancelling-properly.patch b/patches/server/Fix-PlayerItemConsumeEvent-cancelling-properly.patch
index e7beb44886..097707a6fa 100644
--- a/patches/server/Fix-PlayerItemConsumeEvent-cancelling-properly.patch
+++ b/patches/server/Fix-PlayerItemConsumeEvent-cancelling-properly.patch
@@ -13,10 +13,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
- level.getCraftServer().getPluginManager().callEvent(event);
+ level.getCraftServer().getPluginManager().callEvent(event);
- if (event.isCancelled()) {
+ if (event.isCancelled()) {
+ this.stopUsingItem(); // Paper - event is using an item, clear active item to reset its use
- // Update client
- ((ServerPlayer) this).getBukkitEntity().updateInventory();
- ((ServerPlayer) this).getBukkitEntity().updateScaledHealth();
+ // Update client
+ ((ServerPlayer) this).getBukkitEntity().updateInventory();
+ ((ServerPlayer) this).getBukkitEntity().updateScaledHealth();
diff --git a/patches/server/Fix-World-isChunkGenerated-calls.patch b/patches/server/Fix-World-isChunkGenerated-calls.patch
index 18388b3cfb..8f684191e3 100644
--- a/patches/server/Fix-World-isChunkGenerated-calls.patch
+++ b/patches/server/Fix-World-isChunkGenerated-calls.patch
@@ -164,8 +164,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+ // Paper end
+
- public RegionFile(Path path, Path path1, boolean dsync) throws IOException {
- this(path, path1, RegionFileVersion.VERSION_DEFLATE, dsync);
+ public RegionFile(Path file, Path directory, boolean dsync) throws IOException {
+ this(file, directory, RegionFileVersion.VERSION_DEFLATE, dsync);
}
@@ -0,0 +0,0 @@ public class RegionFile implements AutoCloseable {
return this.getOffset(pos) != 0;
diff --git a/patches/server/Fix-piston-physics-inconsistency-MC-188840.patch b/patches/server/Fix-piston-physics-inconsistency-MC-188840.patch
index 1e8e19e9b0..7a5cb43489 100644
--- a/patches/server/Fix-piston-physics-inconsistency-MC-188840.patch
+++ b/patches/server/Fix-piston-physics-inconsistency-MC-188840.patch
@@ -87,7 +87,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java
@@ -0,0 +0,0 @@ public class PistonMovingBlockEntity extends BlockEntity {
- if (blockEntity.movedState != null && world.getBlockState(pos).is(Blocks.MOVING_PISTON)) {
+ if (world.getBlockState(pos).is(Blocks.MOVING_PISTON)) {
BlockState blockState = Block.updateFromNeighbourShapes(blockEntity.movedState, world, pos);
if (blockState.isAir()) {
- world.setBlock(pos, blockEntity.movedState, 84);
diff --git a/patches/server/Improved-Watchdog-Support.patch b/patches/server/Improved-Watchdog-Support.patch
index ac44397338..31b9501a75 100644
--- a/patches/server/Improved-Watchdog-Support.patch
+++ b/patches/server/Improved-Watchdog-Support.patch
@@ -296,8 +296,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
} catch (Exception var3) {
+ if (var3.getCause() instanceof ThreadDeath) throw var3; // Paper
LOGGER.fatal("Error executing task on {}", this.name(), var3);
+ throw var3;
}
-
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
diff --git a/patches/server/MC-Dev-fixes.patch b/patches/server/MC-Dev-fixes.patch
index 85cb4c6414..37c212c36f 100644
--- a/patches/server/MC-Dev-fixes.patch
+++ b/patches/server/MC-Dev-fixes.patch
@@ -39,6 +39,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
}
}
};
+diff --git a/src/main/java/net/minecraft/core/MappedRegistry.java b/src/main/java/net/minecraft/core/MappedRegistry.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/core/MappedRegistry.java
++++ b/src/main/java/net/minecraft/core/MappedRegistry.java
+@@ -0,0 +0,0 @@ public class MappedRegistry extends WritableRegistry {
+ }
+
+ static record RegistryEntry(ResourceKey key, int id, T value) {
+- RegistryEntry(ResourceKey key, int rawId, T entry) {
+- this.key = key;
+- this.id = rawId;
+- this.value = entry;
+- }
+ }
+ }
diff --git a/src/main/java/net/minecraft/nbt/ListTag.java b/src/main/java/net/minecraft/nbt/ListTag.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/nbt/ListTag.java
@@ -126,15 +141,7 @@ diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundLoginP
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundLoginPacket.java
+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundLoginPacket.java
-@@ -0,0 +0,0 @@ import net.minecraft.world.level.GameType;
- import net.minecraft.world.level.Level;
- import net.minecraft.world.level.dimension.DimensionType;
-
--public record ClientboundLoginPacket(int playerId, boolean hardcore, GameType gameType, GameType previousGameType, Set> levels, RegistryAccess.RegistryHolder registryHolder, DimensionType dimensionType, ResourceKey dimension, long seed, int maxPlayers, int chunkRadius, int simulationDistance, boolean reducedDebugInfo, boolean showDeathScreen, boolean isDebug, boolean isFlat) implements Packet {
-+public record ClientboundLoginPacket(int playerId, boolean hardcore, GameType gameType, GameType previousGameType, Set> levels, RegistryAccess.RegistryHolder registryHolder, DimensionType dimensionType, ResourceKey dimension, long seed, int maxPlayers, int chunkRadius, int simulationDistance, boolean reducedDebugInfo, boolean showDeathScreen, boolean isDebug, boolean isFlat) implements Packet { // Paper - fix missing generic
- public ClientboundLoginPacket(FriendlyByteBuf buf) {
- this(buf.readInt(), buf.readBoolean(), GameType.byId(buf.readByte()), GameType.byNullableId(buf.readByte()), buf.readCollection(Sets::newHashSetWithExpectedSize, (b) -> {
- return ResourceKey.create(Registry.DIMENSION_REGISTRY, b.readResourceLocation());
+@@ -0,0 +0,0 @@ public record ClientboundLoginPacket(int playerId, boolean hardcore, GameType ga
}), buf.readWithCodec(RegistryAccess.RegistryHolder.NETWORK_CODEC), buf.readWithCodec(DimensionType.CODEC).get(), ResourceKey.create(Registry.DIMENSION_REGISTRY, buf.readResourceLocation()), buf.readLong(), buf.readVarInt(), buf.readVarInt(), buf.readVarInt(), buf.readBoolean(), buf.readBoolean(), buf.readBoolean(), buf.readBoolean());
}
@@ -223,8 +230,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
- return (entry1.getValue()); // CraftBukkit
+ return entry1.getValue(); // CraftBukkit // Paper - decompile fix - *shrugs internally* // todo: is this needed anymore?
}));
+ this.byName = Maps.newHashMap(builder.build()); // CraftBukkit
RecipeManager.LOGGER.info("Loaded {} recipes", map1.size());
- }
diff --git a/src/main/java/net/minecraft/world/level/biome/Biome.java b/src/main/java/net/minecraft/world/level/biome/Biome.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/level/biome/Biome.java
diff --git a/patches/server/MC-Utils.patch b/patches/server/MC-Utils.patch
index 1d8ec3303a..c78054cc3c 100644
--- a/patches/server/MC-Utils.patch
+++ b/patches/server/MC-Utils.patch
@@ -5450,18 +5450,15 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/sr
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-@@ -0,0 +0,0 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureMana
- import net.minecraft.world.level.storage.DimensionDataStorage;
- import net.minecraft.world.level.storage.LevelData;
+@@ -0,0 +0,0 @@ import net.minecraft.world.level.storage.LevelData;
import net.minecraft.world.level.storage.LevelStorageSource;
+ import org.apache.logging.log4j.LogManager;
+ import org.apache.logging.log4j.Logger;
+import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; // Paper
+import java.util.function.Function; // Paper
public class ServerChunkCache extends ChunkSource {
-+ public static final org.apache.logging.log4j.Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger(); // Paper
- public static final List CHUNK_STATUSES = ChunkStatus.getStatusList();
- private final DistanceManager distanceManager;
@@ -0,0 +0,0 @@ public class ServerChunkCache extends ChunkSource {
@Nullable
@VisibleForDebug
@@ -6480,8 +6477,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
- protected final ChunkPos chunkPos;
+ protected final ChunkPos chunkPos; public final long coordinateKey; public final int locX; public final int locZ; // Paper - cache coordinate key
private long inhabitedTime;
+ /** @deprecated */
@Nullable
- @Deprecated
@@ -0,0 +0,0 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom
protected final LevelChunkSection[] sections;
diff --git a/patches/server/Mob-Spawner-API-Enhancements.patch b/patches/server/Mob-Spawner-API-Enhancements.patch
index 7fdc3a3819..d6d2c8adc8 100644
--- a/patches/server/Mob-Spawner-API-Enhancements.patch
+++ b/patches/server/Mob-Spawner-API-Enhancements.patch
@@ -43,27 +43,27 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
}
- public CompoundTag save(CompoundTag nbttagcompound) {
-- nbttagcompound.putShort("Delay", (short) this.spawnDelay);
-- nbttagcompound.putShort("MinSpawnDelay", (short) this.minSpawnDelay);
-- nbttagcompound.putShort("MaxSpawnDelay", (short) this.maxSpawnDelay);
+ public CompoundTag save(CompoundTag nbt) {
+- nbt.putShort("Delay", (short) this.spawnDelay);
+- nbt.putShort("MinSpawnDelay", (short) this.minSpawnDelay);
+- nbt.putShort("MaxSpawnDelay", (short) this.maxSpawnDelay);
+ // Paper start
+ if (spawnDelay > Short.MAX_VALUE) {
-+ nbttagcompound.putInt("Paper.Delay", this.spawnDelay);
++ nbt.putInt("Paper.Delay", this.spawnDelay);
+ }
-+ nbttagcompound.putShort("Delay", (short) Math.min(Short.MAX_VALUE, this.spawnDelay));
++ nbt.putShort("Delay", (short) Math.min(Short.MAX_VALUE, this.spawnDelay));
+
+ if (minSpawnDelay > Short.MAX_VALUE || maxSpawnDelay > Short.MAX_VALUE) {
-+ nbttagcompound.putInt("Paper.MinSpawnDelay", this.minSpawnDelay);
-+ nbttagcompound.putInt("Paper.MaxSpawnDelay", this.maxSpawnDelay);
++ nbt.putInt("Paper.MinSpawnDelay", this.minSpawnDelay);
++ nbt.putInt("Paper.MaxSpawnDelay", this.maxSpawnDelay);
+ }
+
-+ nbttagcompound.putShort("MinSpawnDelay", (short) Math.min(Short.MAX_VALUE, this.minSpawnDelay));
-+ nbttagcompound.putShort("MaxSpawnDelay", (short) Math.min(Short.MAX_VALUE, this.maxSpawnDelay));
-+ // Paper end
- nbttagcompound.putShort("SpawnCount", (short) this.spawnCount);
- nbttagcompound.putShort("MaxNearbyEntities", (short) this.maxNearbyEntities);
- nbttagcompound.putShort("RequiredPlayerRange", (short) this.requiredPlayerRange);
++ nbt.putShort("MinSpawnDelay", (short) Math.min(Short.MAX_VALUE, this.minSpawnDelay));
++ nbt.putShort("MaxSpawnDelay", (short) Math.min(Short.MAX_VALUE, this.maxSpawnDelay));
++ // Paper nbt
+ nbt.putShort("SpawnCount", (short) this.spawnCount);
+ nbt.putShort("MaxNearbyEntities", (short) this.maxNearbyEntities);
+ nbt.putShort("RequiredPlayerRange", (short) this.requiredPlayerRange);
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java
diff --git a/patches/server/Optimise-BlockState-s-hashCode-equals.patch b/patches/server/Optimise-BlockState-s-hashCode-equals.patch
index 663ab12b16..74b05a023e 100644
--- a/patches/server/Optimise-BlockState-s-hashCode-equals.patch
+++ b/patches/server/Optimise-BlockState-s-hashCode-equals.patch
@@ -55,19 +55,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/net/minecraft/world/level/block/state/properties/Property.java
+++ b/src/main/java/net/minecraft/world/level/block/state/properties/Property.java
@@ -0,0 +0,0 @@ public abstract class Property> {
- }
+ @Override
public boolean equals(Object object) {
- if (this == object) {
- return true;
- } else if (!(object instanceof Property)) {
- return false;
- } else {
-- Property> iblockstate = (Property) object;
--
-- return this.clazz.equals(iblockstate.clazz) && this.name.equals(iblockstate.name);
+- Property> property = (Property)object;
+- return this.clazz.equals(property.clazz) && this.name.equals(property.name);
- }
+ return this == object; // Paper
}
- public final int hashCode() {
+ @Override
diff --git a/patches/server/Optimize-Collision-to-not-load-chunks.patch b/patches/server/Optimize-Collision-to-not-load-chunks.patch
index 111db03e5c..088c218b37 100644
--- a/patches/server/Optimize-Collision-to-not-load-chunks.patch
+++ b/patches/server/Optimize-Collision-to-not-load-chunks.patch
@@ -109,17 +109,3 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
if (!this.getEntityCollisions(entity, box).isEmpty()) {
return false;
-diff --git a/src/main/java/net/minecraft/world/phys/shapes/Shapes.java b/src/main/java/net/minecraft/world/phys/shapes/Shapes.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/phys/shapes/Shapes.java
-+++ b/src/main/java/net/minecraft/world/phys/shapes/Shapes.java
-@@ -0,0 +0,0 @@ public final class Shapes {
-
- if (s < 3) {
- mutableBlockPos.set(axisCycle, q, r, p);
-- BlockState blockState = world.getBlockState(mutableBlockPos);
-+ BlockState blockState = world.getTypeIfLoaded(mutableBlockPos); // Paper
-+ if (blockState == null) return 0.0D; // Paper
- if ((s != 1 || blockState.hasLargeCollisionShape()) && (s != 2 || blockState.is(Blocks.MOVING_PISTON))) {
- initial = blockState.getCollisionShape(world, mutableBlockPos, context).collide(axis3, box.move((double)(-mutableBlockPos.getX()), (double)(-mutableBlockPos.getY()), (double)(-mutableBlockPos.getZ())), initial);
- if (Math.abs(initial) < 1.0E-7D) {
diff --git a/patches/server/Optimize-MappedRegistry.patch b/patches/server/Optimize-MappedRegistry.patch
index 58e056332a..cc2d65e038 100644
--- a/patches/server/Optimize-MappedRegistry.patch
+++ b/patches/server/Optimize-MappedRegistry.patch
@@ -11,16 +11,18 @@ diff --git a/src/main/java/net/minecraft/core/MappedRegistry.java b/src/main/jav
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/core/MappedRegistry.java
+++ b/src/main/java/net/minecraft/core/MappedRegistry.java
-@@ -0,0 +0,0 @@ public class MappedRegistry extends WritableRegistry {
+@@ -0,0 +0,0 @@ import org.apache.logging.log4j.Logger;
+ public class MappedRegistry extends WritableRegistry {
protected static final Logger LOGGER = LogManager.getLogger();
- private final ObjectList byId = new ObjectArrayList(256);
-- private final Object2IntMap toId = (Object2IntMap) Util.make(new Object2IntOpenCustomHashMap(Util.identityStrategy()), (object2intopencustomhashmap) -> {
-- object2intopencustomhashmap.defaultReturnValue(-1);
+- private final ObjectList byId = new ObjectArrayList<>(256);
+- private final Object2IntMap toId = Util.make(new Object2IntOpenCustomHashMap<>(Util.identityStrategy()), (object2IntOpenCustomHashMap) -> {
+- object2IntOpenCustomHashMap.defaultReturnValue(-1);
- });
- private final BiMap storage = HashBiMap.create();
- private final BiMap, T> keyStorage = HashBiMap.create();
- private final Map lifecycles = Maps.newIdentityHashMap();
++ private final ObjectList byId = new ObjectArrayList(256);
+ private final it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap toId = new it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap(2048);// Paper - use bigger expected size to reduce collisions and direct intent for FastUtil to be identity map
+ private final BiMap storage = HashBiMap.create(2048); // Paper - use bigger expected size to reduce collisions
+ private final BiMap, T> keyStorage = HashBiMap.create(2048); // Paper - use bigger expected size to reduce collisions
diff --git a/patches/server/Optimize-NibbleArray-to-use-pooled-buffers.patch b/patches/server/Optimize-NibbleArray-to-use-pooled-buffers.patch
index 55bfd61ae8..2be574fc3e 100644
--- a/patches/server/Optimize-NibbleArray-to-use-pooled-buffers.patch
+++ b/patches/server/Optimize-NibbleArray-to-use-pooled-buffers.patch
@@ -45,7 +45,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+ // Paper end
+
- public ClientboundLevelChunkWithLightPacket(LevelChunk chunk, LevelLightEngine lightProvider, @Nullable BitSet bitSet, @Nullable BitSet bitSet2, boolean bl) {
+ public ClientboundLevelChunkWithLightPacket(LevelChunk chunk, LevelLightEngine lightProvider, @Nullable BitSet skyBits, @Nullable BitSet blockBits, boolean nonEdge) {
ChunkPos chunkPos = chunk.getPos();
this.x = chunkPos.x;
diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundLightUpdatePacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundLightUpdatePacket.java
diff --git a/patches/server/Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch b/patches/server/Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch
index 9740b36521..7c2c7137b7 100644
--- a/patches/server/Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch
+++ b/patches/server/Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch
@@ -24,8 +24,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
this.openSet.clear();
this.nodeEvaluator.prepare(world, mob);
Node node = this.nodeEvaluator.getStart();
-- Map map = positions.stream().collect(Collectors.toMap((blockPos) -> {
-- return this.nodeEvaluator.getGoal((double)blockPos.getX(), (double)blockPos.getY(), (double)blockPos.getZ());
+- Map map = positions.stream().collect(Collectors.toMap((pos) -> {
+- return this.nodeEvaluator.getGoal((double)pos.getX(), (double)pos.getY(), (double)pos.getZ());
- }, Function.identity()));
+ // Paper start - remove streams - and optimize collection
+ List> map = Lists.newArrayList();
diff --git a/patches/server/PortalCreateEvent-needs-to-know-its-entity.patch b/patches/server/PortalCreateEvent-needs-to-know-its-entity.patch
index 12e5856fcc..cf874ce9c9 100644
--- a/patches/server/PortalCreateEvent-needs-to-know-its-entity.patch
+++ b/patches/server/PortalCreateEvent-needs-to-know-its-entity.patch
@@ -100,9 +100,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ this.onPlace(iblockdata, world, blockposition, iblockdata1, flag);
+ }
+ // Paper end
+ /** @deprecated */
@Deprecated
public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) {
- org.spigotmc.AsyncCatcher.catchOp("block onPlace"); // Spigot
diff --git a/src/main/java/net/minecraft/world/level/portal/PortalShape.java b/src/main/java/net/minecraft/world/level/portal/PortalShape.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/level/portal/PortalShape.java
diff --git a/patches/server/Prevent-consuming-the-wrong-itemstack.patch b/patches/server/Prevent-consuming-the-wrong-itemstack.patch
index 981783a2f9..bdef90371d 100644
--- a/patches/server/Prevent-consuming-the-wrong-itemstack.patch
+++ b/patches/server/Prevent-consuming-the-wrong-itemstack.patch
@@ -25,17 +25,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
this.useItemRemaining = itemstack.getUseDuration();
if (!this.level.isClientSide) {
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
- this.releaseUsingItem();
- } else {
- if (!this.useItem.isEmpty() && this.isUsingItem()) {
+ this.releaseUsingItem();
+ } else {
+ if (!this.useItem.isEmpty() && this.isUsingItem()) {
+ this.startUsingItem(this.getUsedItemHand(), true); // Paper
- this.triggerItemUseEffects(this.useItem, 16);
- // CraftBukkit start - fire PlayerItemConsumeEvent
- ItemStack itemstack;
+ this.triggerItemUseEffects(this.useItem, 16);
+ // CraftBukkit start - fire PlayerItemConsumeEvent
+ ItemStack itemstack;
@@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity {
- }
+ }
- this.stopUsingItem();
+ this.stopUsingItem();
- // Paper start - if the replacement is anything but the default, update the client inventory
- if (this instanceof ServerPlayer && !com.google.common.base.Objects.equal(defaultReplacement, itemstack)) {
+ // Paper start
diff --git a/patches/server/Protect-Bedrock-and-End-Portal-Frames-from-being-des.patch b/patches/server/Protect-Bedrock-and-End-Portal-Frames-from-being-des.patch
index 7b8a957a30..21e1ed04bf 100644
--- a/patches/server/Protect-Bedrock-and-End-Portal-Frames-from-being-des.patch
+++ b/patches/server/Protect-Bedrock-and-End-Portal-Frames-from-being-des.patch
@@ -139,14 +139,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java
+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java
@@ -0,0 +0,0 @@ public abstract class BlockBehaviour {
-
+ /** @deprecated */
@Deprecated
public boolean canBeReplaced(BlockState state, BlockPlaceContext context) {
- return this.material.isReplaceable() && (context.getItemInHand().isEmpty() || !context.getItemInHand().is(this.asItem()));
+ return this.material.isReplaceable() && (context.getItemInHand().isEmpty() || !context.getItemInHand().is(this.asItem())) && (state.isDestroyable() || (context.getPlayer() != null && context.getPlayer().getAbilities().instabuild)); // Paper
}
- @Deprecated
+ /** @deprecated */
@@ -0,0 +0,0 @@ public abstract class BlockBehaviour {
public Block getBlock() {
return (Block) this.owner;
diff --git a/patches/server/Remap-fixes.patch b/patches/server/Remap-fixes.patch
index 648545218f..532e2daf43 100644
--- a/patches/server/Remap-fixes.patch
+++ b/patches/server/Remap-fixes.patch
@@ -82,14 +82,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java
+++ b/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java
@@ -0,0 +0,0 @@ public class RecipeManager extends SimpleJsonResourceReloadListener {
- Map, Object2ObjectLinkedOpenHashMap>> map = Maps.newHashMap(); // CraftBukkit
+ Builder> builder = ImmutableMap.builder();
recipes.forEach((irecipe) -> {
- Map> map1 = (Map) map.computeIfAbsent(irecipe.getType(), (recipes) -> {
+ Map> map1 = (Map) map.computeIfAbsent(irecipe.getType(), (recipes_) -> { // Paper - remap fix
return new Object2ObjectLinkedOpenHashMap<>(); // CraftBukkit
});
- Recipe> irecipe1 = (Recipe) map1.put(irecipe.getId(), irecipe);
+ ResourceLocation minecraftkey = irecipe.getId();
diff --git a/src/test/java/org/bukkit/DyeColorsTest.java b/src/test/java/org/bukkit/DyeColorsTest.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/test/java/org/bukkit/DyeColorsTest.java
diff --git a/patches/server/Setup-Gradle-project.patch b/patches/server/Setup-Gradle-project.patch
index bdb1fffc8d..da94fac057 100644
--- a/patches/server/Setup-Gradle-project.patch
+++ b/patches/server/Setup-Gradle-project.patch
@@ -194,7 +194,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
- org.spigotmc
- spigot
- jar
-- 1.18-pre5-R0.1-SNAPSHOT
+- 1.18-pre8-R0.1-SNAPSHOT
- Spigot
- https://www.spigotmc.org/
-
@@ -552,6 +552,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
-
- SHA-256
-
+- true
-
- compile
- runtime
diff --git a/patches/server/Timings-v2.patch b/patches/server/Timings-v2.patch
index 8a587ed5a9..99597f9da2 100644
--- a/patches/server/Timings-v2.patch
+++ b/patches/server/Timings-v2.patch
@@ -1315,7 +1315,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements WorldGenLevel {
- if (!flag1) {
+ if (!savingDisabled) {
org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); // CraftBukkit
+ try (co.aikar.timings.Timing ignored = timings.worldSave.startTiming()) { // Paper
if (progressListener != null) {
diff --git a/patches/server/add-more-information-to-Entity.toString.patch b/patches/server/add-more-information-to-Entity.toString.patch
index c3e2a472a2..ab3f84fd40 100644
--- a/patches/server/add-more-information-to-Entity.toString.patch
+++ b/patches/server/add-more-information-to-Entity.toString.patch
@@ -10,11 +10,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i
- }
-
public String toString() {
-- return String.format(Locale.ROOT, "%s['%s'/%d, l='%s', x=%.2f, y=%.2f, z=%.2f]", this.getClass().getSimpleName(), this.getName().getString(), this.id, this.level == null ? "~NULL~" : this.level.toString(), this.getX(), this.getY(), this.getZ());
-+ return String.format(Locale.ROOT, "%s['%s'/%d, uuid='%s', l='%s', x=%.2f, y=%.2f, z=%.2f, cpos=%s, tl=%d, v=%b, rR=%s]", new Object[] { this.getClass().getSimpleName(), this.getName().getString(), Integer.valueOf(this.id), this.uuid.toString(), this.level == null ? "~NULL~" : this.level.toString(), Double.valueOf(this.getX()), Double.valueOf(this.getY()), Double.valueOf(this.getZ()), this.chunkPosition(), this.tickCount, this.valid, this.removalReason}); // Paper - add more information
+ String s = this.level == null ? "~NULL~" : this.level.toString();
+
+- return this.removalReason != null ? String.format(Locale.ROOT, "%s['%s'/%d, l='%s', x=%.2f, y=%.2f, z=%.2f, removed=%s]", this.getClass().getSimpleName(), this.getName().getString(), this.id, s, this.getX(), this.getY(), this.getZ(), this.removalReason) : String.format(Locale.ROOT, "%s['%s'/%d, l='%s', x=%.2f, y=%.2f, z=%.2f]", this.getClass().getSimpleName(), this.getName().getString(), this.id, s, this.getX(), this.getY(), this.getZ());
++ return this.removalReason != null ? String.format(Locale.ROOT, "%s['%s'/%d, uuid='%s', l='%s', x=%.2f, y=%.2f, z=%.2f, cpos=%s, tl=%d, v=%b, removed=%s]", this.getClass().getSimpleName(), this.getName().getString(), this.id, this.uuid, s, this.getX(), this.getY(), this.getZ(), this.chunkPosition(), this.tickCount, this.valid, this.removalReason) : String.format(Locale.ROOT, "%s['%s'/%d, uuid='%s', l='%s', x=%.2f, y=%.2f, z=%.2f, cpos=%s, tl=%d, v=%b]", this.getClass().getSimpleName(), this.getName().getString(), this.id, this.uuid, s, this.getX(), this.getY(), this.getZ(), this.chunkPosition(), this.tickCount, this.valid);
}
public boolean isInvulnerableTo(DamageSource damageSource) {
diff --git a/todo.txt b/todo.txt
index fd43ae8e68..63c052e7a1 100644
--- a/todo.txt
+++ b/todo.txt
@@ -6,3 +6,20 @@ Improve Server Thread Pool and Thread Priorities: mojang added a max thread coun
Use Vanilla Minecart Speeds: is this needed?
Handle Oversized Tile Entities: make sure impl is correct
0467-Optimize-WorldBorder-collision-checks-and-air check first hunk that has been removed
+
+Not sure where this needs to go, if anywhere
+diff --git a/src/main/java/net/minecraft/world/phys/shapes/Shapes.java b/src/main/java/net/minecraft/world/phys/shapes/Shapes.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/phys/shapes/Shapes.java
++++ b/src/main/java/net/minecraft/world/phys/shapes/Shapes.java
+@@ -0,0 +0,0 @@ public final class Shapes {
+
+ if (s < 3) {
+ mutableBlockPos.set(axisCycle, q, r, p);
+- BlockState blockState = world.getBlockState(mutableBlockPos);
++ BlockState blockState = world.getTypeIfLoaded(mutableBlockPos); // Paper
++ if (blockState == null) return 0.0D; // Paper
+ if ((s != 1 || blockState.hasLargeCollisionShape()) && (s != 2 || blockState.is(Blocks.MOVING_PISTON))) {
+ initial = blockState.getCollisionShape(world, mutableBlockPos, context).collide(axis3, box.move((double)(-mutableBlockPos.getX()), (double)(-mutableBlockPos.getY()), (double)(-mutableBlockPos.getZ())), initial);
+ if (Math.abs(initial) < 1.0E-7D) {
+
diff --git a/work/BuildData b/work/BuildData
index 8581e449a3..09c3da501e 160000
--- a/work/BuildData
+++ b/work/BuildData
@@ -1 +1 @@
-Subproject commit 8581e449a3490934f8bfa8b36d45842393dc8a20
+Subproject commit 09c3da501e40b5090cbd93cc91c8e5c49ce053b7
diff --git a/work/Bukkit b/work/Bukkit
index ea30a299e9..d25437bce3 160000
--- a/work/Bukkit
+++ b/work/Bukkit
@@ -1 +1 @@
-Subproject commit ea30a299e948f5545b0ad042bd8e11716aeaa7f2
+Subproject commit d25437bce34e0cb0b7c895867183dc949ea41667
diff --git a/work/CraftBukkit b/work/CraftBukkit
index a58fde42cc..5a39a236c1 160000
--- a/work/CraftBukkit
+++ b/work/CraftBukkit
@@ -1 +1 @@
-Subproject commit a58fde42cc9cd946db4c502a91dfe5cdf314fade
+Subproject commit 5a39a236c11b6a5a19f8d26b4c5af1f59f16d447
diff --git a/work/Spigot b/work/Spigot
index c07753b057..7840c2af5f 160000
--- a/work/Spigot
+++ b/work/Spigot
@@ -1 +1 @@
-Subproject commit c07753b057d92ef6c0f9ad8e8446f51bcc37604d
+Subproject commit 7840c2af5f487981d5a2eab4f9e832fdd7cfb298