diff --git a/build-data/paper.at b/build-data/paper.at
index dba668950c..cf8a486b80 100644
--- a/build-data/paper.at
+++ b/build-data/paper.at
@@ -36,6 +36,10 @@ public net.minecraft.network.protocol.game.ServerboundInteractPacket$ActionType
# Configurable RCON IP address
public net.minecraft.server.dedicated.Settings getStringRaw(Ljava/lang/String;)Ljava/lang/String;
+# Mob Spawner API Enhancements
+public net.minecraft.world.level.BaseSpawner isNearPlayer(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Z
+public net.minecraft.world.level.BaseSpawner delay(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V
+
# LootTable API
public org.bukkit.craftbukkit.block.CraftBlockEntityState getTileEntity()Lnet/minecraft/world/level/block/entity/BlockEntity;
public org.bukkit.craftbukkit.block.CraftLootable setLootTable(Lorg/bukkit/loot/LootTable;J)V
diff --git a/patches/unapplied/api/Add-BlockSoundGroup-interface.patch b/patches/api/Add-BlockSoundGroup-interface.patch
similarity index 95%
rename from patches/unapplied/api/Add-BlockSoundGroup-interface.patch
rename to patches/api/Add-BlockSoundGroup-interface.patch
index 8387646011..20b223020c 100644
--- a/patches/unapplied/api/Add-BlockSoundGroup-interface.patch
+++ b/patches/api/Add-BlockSoundGroup-interface.patch
@@ -68,9 +68,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/org/bukkit/block/Block.java
+++ b/src/main/java/org/bukkit/block/Block.java
@@ -0,0 +0,0 @@ public interface Block extends Metadatable {
+ * @return true
if the block data can be placed here
*/
- @NotNull
- VoxelShape getCollisionShape();
+ boolean canPlace(@NotNull BlockData data);
+
+ // Paper start
+ /**
diff --git a/patches/unapplied/api/Add-Heightmap-API.patch b/patches/api/Add-Heightmap-API.patch
similarity index 100%
rename from patches/unapplied/api/Add-Heightmap-API.patch
rename to patches/api/Add-Heightmap-API.patch
diff --git a/patches/unapplied/api/Amend-PlayerInteractAtEntityEvent-javadoc-for-ArmorS.patch b/patches/api/Amend-PlayerInteractAtEntityEvent-javadoc-for-ArmorS.patch
similarity index 100%
rename from patches/unapplied/api/Amend-PlayerInteractAtEntityEvent-javadoc-for-ArmorS.patch
rename to patches/api/Amend-PlayerInteractAtEntityEvent-javadoc-for-ArmorS.patch
diff --git a/patches/unapplied/api/Fix-Spigot-annotation-mistakes.patch b/patches/api/Fix-Spigot-annotation-mistakes.patch
similarity index 100%
rename from patches/unapplied/api/Fix-Spigot-annotation-mistakes.patch
rename to patches/api/Fix-Spigot-annotation-mistakes.patch
diff --git a/patches/unapplied/api/Mob-Spawner-API-Enhancements.patch b/patches/api/Mob-Spawner-API-Enhancements.patch
similarity index 100%
rename from patches/unapplied/api/Mob-Spawner-API-Enhancements.patch
rename to patches/api/Mob-Spawner-API-Enhancements.patch
diff --git a/patches/unapplied/api/PlayerDeathEvent-getItemsToKeep.patch b/patches/api/PlayerDeathEvent-getItemsToKeep.patch
similarity index 100%
rename from patches/unapplied/api/PlayerDeathEvent-getItemsToKeep.patch
rename to patches/api/PlayerDeathEvent-getItemsToKeep.patch
diff --git a/patches/unapplied/api/Server-Tick-Events.patch b/patches/api/Server-Tick-Events.patch
similarity index 100%
rename from patches/unapplied/api/Server-Tick-Events.patch
rename to patches/api/Server-Tick-Events.patch
diff --git a/patches/unapplied/server/Add-Heightmap-API.patch b/patches/server/Add-Heightmap-API.patch
similarity index 100%
rename from patches/unapplied/server/Add-Heightmap-API.patch
rename to patches/server/Add-Heightmap-API.patch
diff --git a/patches/unapplied/server/Fix-CB-call-to-changed-postToMainThread-method.patch b/patches/server/Fix-CB-call-to-changed-postToMainThread-method.patch
similarity index 100%
rename from patches/unapplied/server/Fix-CB-call-to-changed-postToMainThread-method.patch
rename to patches/server/Fix-CB-call-to-changed-postToMainThread-method.patch
diff --git a/patches/unapplied/server/Fix-CraftServer-isPrimaryThread-and-MinecraftServer-.patch b/patches/server/Fix-CraftServer-isPrimaryThread-and-MinecraftServer-.patch
similarity index 100%
rename from patches/unapplied/server/Fix-CraftServer-isPrimaryThread-and-MinecraftServer-.patch
rename to patches/server/Fix-CraftServer-isPrimaryThread-and-MinecraftServer-.patch
diff --git a/patches/unapplied/server/Fix-sounds-when-item-frames-are-modified-MC-123450.patch b/patches/server/Fix-sounds-when-item-frames-are-modified-MC-123450.patch
similarity index 100%
rename from patches/unapplied/server/Fix-sounds-when-item-frames-are-modified-MC-123450.patch
rename to patches/server/Fix-sounds-when-item-frames-are-modified-MC-123450.patch
diff --git a/patches/unapplied/server/Implement-CraftBlockSoundGroup.patch b/patches/server/Implement-CraftBlockSoundGroup.patch
similarity index 94%
rename from patches/unapplied/server/Implement-CraftBlockSoundGroup.patch
rename to patches/server/Implement-CraftBlockSoundGroup.patch
index cc014ec24d..6deda421ca 100644
--- a/patches/unapplied/server/Implement-CraftBlockSoundGroup.patch
+++ b/patches/server/Implement-CraftBlockSoundGroup.patch
@@ -53,9 +53,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
@@ -0,0 +0,0 @@ public class CraftBlock implements Block {
- VoxelShape shape = this.getNMS().getCollisionShape(world, position);
- return new CraftVoxelShape(shape);
+
+ return iblockdata.canSurvive(world, this.position);
}
++
+ // Paper start
+ @Override
+ public com.destroystokyo.paper.block.BlockSoundGroup getSoundGroup() {
diff --git a/patches/unapplied/server/Mob-Spawner-API-Enhancements.patch b/patches/server/Mob-Spawner-API-Enhancements.patch
similarity index 56%
rename from patches/unapplied/server/Mob-Spawner-API-Enhancements.patch
rename to patches/server/Mob-Spawner-API-Enhancements.patch
index ad07f9dee7..7fdc3a3819 100644
--- a/patches/unapplied/server/Mob-Spawner-API-Enhancements.patch
+++ b/patches/server/Mob-Spawner-API-Enhancements.patch
@@ -8,33 +8,6 @@ diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
+++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
-@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
-
- private static final Logger LOGGER = LogManager.getLogger();
- private static final int EVENT_SPAWN = 1;
-- private static WeightedRandomList EMPTY_POTENTIALS = WeightedRandomList.create();
-+ public static WeightedRandomList EMPTY_POTENTIALS = WeightedRandomList.create(); // Paper - private->public
- public int spawnDelay = 20;
- public WeightedRandomList spawnPotentials;
- public SpawnData nextSpawnData;
-@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
- this.spawnPotentials = BaseSpawner.EMPTY_POTENTIALS; // CraftBukkit - SPIGOT-3496, MC-92282
- }
-
-- private boolean isNearPlayer(Level world, BlockPos pos) {
-+ public boolean isNearPlayer(Level world, BlockPos pos) { // Paper private->public
- return world.isAffectsSpawningPlayerNearby((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange); // Paper
- }
-
-@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
- }
- }
-
-- private void delay(Level world, BlockPos pos) {
-+ public void delay(Level world, BlockPos pos) { // Paper private->public
- if (this.maxSpawnDelay <= this.minSpawnDelay) {
- this.spawnDelay = this.minSpawnDelay;
- } else {
@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
}
@@ -46,14 +19,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
this.spawnDelay = nbt.getShort("Delay");
+ }
+ // Paper end
- List list = Lists.newArrayList();
+ boolean flag = nbt.contains("SpawnPotentials", 9);
+ boolean flag1 = nbt.contains("SpawnData", 10);
- if (nbt.contains("SpawnPotentials", 9)) {
@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
- this.setNextSpawnData(world, pos, mobspawnerdata);
- });
+ }
}
--
+
+ // Paper start - use ints if set
+ if (nbt.contains("Paper.MinSpawnDelay", 99)) {
+ this.minSpawnDelay = nbt.getInt("Paper.MinSpawnDelay");
@@ -63,35 +35,35 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
if (nbt.contains("MinSpawnDelay", 99)) {
- this.minSpawnDelay = nbt.getShort("MinSpawnDelay");
- this.maxSpawnDelay = nbt.getShort("MaxSpawnDelay");
-+ this.minSpawnDelay = nbt.getInt("MinSpawnDelay"); // Paper - short->int
-+ this.maxSpawnDelay = nbt.getInt("MaxSpawnDelay"); // Paper - short->int
++ this.minSpawnDelay = nbt.getInt("MinSpawnDelay"); // Paper - short -> int
++ this.maxSpawnDelay = nbt.getInt("MaxSpawnDelay"); // Paper - short -> int
this.spawnCount = nbt.getShort("SpawnCount");
}
@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
- if (minecraftkey == null) {
- return nbt;
- } else {
-- 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) {
-+ nbt.putInt("Paper.Delay", this.spawnDelay);
-+ }
-+ nbt.putShort("Delay", (short) Math.min(Short.MAX_VALUE, this.spawnDelay));
+ }
+
+ public CompoundTag save(CompoundTag nbttagcompound) {
+- nbttagcompound.putShort("Delay", (short) this.spawnDelay);
+- nbttagcompound.putShort("MinSpawnDelay", (short) this.minSpawnDelay);
+- nbttagcompound.putShort("MaxSpawnDelay", (short) this.maxSpawnDelay);
++ // Paper start
++ if (spawnDelay > Short.MAX_VALUE) {
++ nbttagcompound.putInt("Paper.Delay", this.spawnDelay);
++ }
++ nbttagcompound.putShort("Delay", (short) Math.min(Short.MAX_VALUE, this.spawnDelay));
+
-+ if (minSpawnDelay > Short.MAX_VALUE || maxSpawnDelay > Short.MAX_VALUE) {
-+ nbt.putInt("Paper.MinSpawnDelay", this.minSpawnDelay);
-+ nbt.putInt("Paper.MaxSpawnDelay", this.maxSpawnDelay);
-+ }
++ if (minSpawnDelay > Short.MAX_VALUE || maxSpawnDelay > Short.MAX_VALUE) {
++ nbttagcompound.putInt("Paper.MinSpawnDelay", this.minSpawnDelay);
++ nbttagcompound.putInt("Paper.MaxSpawnDelay", this.maxSpawnDelay);
++ }
+
-+ nbt.putShort("MinSpawnDelay", (short) Math.min(Short.MAX_VALUE, this.minSpawnDelay));
-+ nbt.putShort("MaxSpawnDelay", (short) Math.min(Short.MAX_VALUE, this.maxSpawnDelay));
-+ // Paper end
- nbt.putShort("SpawnCount", (short) this.spawnCount);
- nbt.putShort("MaxNearbyEntities", (short) this.maxNearbyEntities);
- nbt.putShort("RequiredPlayerRange", (short) this.requiredPlayerRange);
++ 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);
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
@@ -122,8 +94,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ entity.put("Item", item.save(new net.minecraft.nbt.CompoundTag()));
+ compound.put("Entity", entity);
+ compound.putInt("Weight", this.getSnapshotNBT().contains("Weight", org.bukkit.craftbukkit.util.CraftMagicNumbers.NBT.TAG_ANY_NUMBER) ? this.getSnapshotNBT().getInt("Weight") : 1);
-+ this.getSnapshot().getSpawner().setNextSpawnData(world.getHandle(), getPosition(), new net.minecraft.world.level.SpawnData(compound));
-+ this.getSnapshot().getSpawner().spawnPotentials= net.minecraft.world.level.BaseSpawner.EMPTY_POTENTIALS;
++ this.getSnapshot().getSpawner().setNextSpawnData(world.getHandle(), getPosition(), new net.minecraft.world.level.SpawnData(compound, java.util.Optional.empty())); // 1.18 todo - is empty optional correct
++ this.getSnapshot().getSpawner().spawnPotentials = net.minecraft.util.random.SimpleWeightedRandomList.empty(); // 1.18 todo - previously used removed field, check
+ }
+ // Paper end
}
diff --git a/patches/unapplied/server/Optimize-Captured-TileEntity-Lookup.patch b/patches/server/Optimize-Captured-TileEntity-Lookup.patch
similarity index 95%
rename from patches/unapplied/server/Optimize-Captured-TileEntity-Lookup.patch
rename to patches/server/Optimize-Captured-TileEntity-Lookup.patch
index 4aa94be0fb..1925711d6f 100644
--- a/patches/unapplied/server/Optimize-Captured-TileEntity-Lookup.patch
+++ b/patches/server/Optimize-Captured-TileEntity-Lookup.patch
@@ -16,7 +16,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
@@ -0,0 +0,0 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@Nullable
- public BlockEntity getTileEntity(BlockPos blockposition, boolean validate) {
+ public BlockEntity getBlockEntity(BlockPos blockposition, boolean validate) {
- if (this.capturedTileEntities.containsKey(blockposition)) {
- return this.capturedTileEntities.get(blockposition);
+ // Paper start - Optimize capturedTileEntities lookup
diff --git a/patches/server/Player-affects-spawning-API.patch b/patches/server/Player-affects-spawning-API.patch
index afb3abe98c..3b4b2a657f 100644
--- a/patches/server/Player-affects-spawning-API.patch
+++ b/patches/server/Player-affects-spawning-API.patch
@@ -67,7 +67,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
@@ -0,0 +0,0 @@ public abstract class BaseSpawner {
}
- private boolean isNearPlayer(Level world, BlockPos pos) {
+ public boolean isNearPlayer(Level world, BlockPos pos) {
- return world.hasNearbyAlivePlayer((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange);
+ return world.isAffectsSpawningPlayerNearby((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange); // Paper
}
diff --git a/patches/unapplied/server/PlayerDeathEvent-getItemsToKeep.patch b/patches/server/PlayerDeathEvent-getItemsToKeep.patch
similarity index 100%
rename from patches/unapplied/server/PlayerDeathEvent-getItemsToKeep.patch
rename to patches/server/PlayerDeathEvent-getItemsToKeep.patch
diff --git a/patches/unapplied/server/Server-Tick-Events.patch b/patches/server/Server-Tick-Events.patch
similarity index 97%
rename from patches/unapplied/server/Server-Tick-Events.patch
rename to patches/server/Server-Tick-Events.patch
index 0eec3b56bb..42d8da8af5 100644
--- a/patches/unapplied/server/Server-Tick-Events.patch
+++ b/patches/server/Server-Tick-Events.patch
@@ -18,15 +18,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
++this.tickCount;
this.tickChildren(shouldKeepTicking);
@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop