diff --git a/nms-patches/net/minecraft/advancements/Advancement.patch b/nms-patches/net/minecraft/advancements/Advancement.patch deleted file mode 100644 index e526fe525..000000000 --- a/nms-patches/net/minecraft/advancements/Advancement.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/net/minecraft/advancements/Advancement.java -+++ b/net/minecraft/advancements/Advancement.java -@@ -41,6 +41,7 @@ - private final Set children = Sets.newLinkedHashSet(); - private final IChatBaseComponent chatComponent; - private final boolean sendsTelemetryEvent; -+ public final org.bukkit.advancement.Advancement bukkit = new org.bukkit.craftbukkit.advancement.CraftAdvancement(this); // CraftBukkit - - public Advancement(MinecraftKey minecraftkey, @Nullable Advancement advancement, @Nullable AdvancementDisplay advancementdisplay, AdvancementRewards advancementrewards, Map map, String[][] astring, boolean flag) { - this.id = minecraftkey; diff --git a/nms-patches/net/minecraft/advancements/AdvancementHolder.patch b/nms-patches/net/minecraft/advancements/AdvancementHolder.patch new file mode 100644 index 000000000..211bb9e58 --- /dev/null +++ b/nms-patches/net/minecraft/advancements/AdvancementHolder.patch @@ -0,0 +1,25 @@ +--- a/net/minecraft/advancements/AdvancementHolder.java ++++ b/net/minecraft/advancements/AdvancementHolder.java +@@ -3,6 +3,11 @@ + import net.minecraft.network.PacketDataSerializer; + import net.minecraft.resources.MinecraftKey; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.advancement.CraftAdvancement; ++import org.bukkit.craftbukkit.util.CraftNamespacedKey; ++// CraftBukkit end ++ + public record AdvancementHolder(MinecraftKey id, Advancement value) { + + public void write(PacketDataSerializer packetdataserializer) { +@@ -41,4 +46,10 @@ + public String toString() { + return this.id.toString(); + } ++ ++ // CraftBukkit start ++ public final org.bukkit.advancement.Advancement toBukkit() { ++ return new CraftAdvancement(this); ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/net/minecraft/advancements/AdvancementTree.patch b/nms-patches/net/minecraft/advancements/AdvancementTree.patch new file mode 100644 index 000000000..f736fbf6e --- /dev/null +++ b/nms-patches/net/minecraft/advancements/AdvancementTree.patch @@ -0,0 +1,20 @@ +--- a/net/minecraft/advancements/AdvancementTree.java ++++ b/net/minecraft/advancements/AdvancementTree.java +@@ -68,7 +68,7 @@ + } + + public void addAll(Collection collection) { +- ArrayList arraylist = new ArrayList(collection); ++ ArrayList arraylist = new ArrayList(collection); // CraftBukkit - decompile error + + while (!arraylist.isEmpty()) { + if (!arraylist.removeIf(this::tryInsert)) { +@@ -77,7 +77,7 @@ + } + } + +- AdvancementTree.LOGGER.info("Loaded {} advancements", this.nodes.size()); ++ // AdvancementTree.LOGGER.info("Loaded {} advancements", this.nodes.size()); // CraftBukkit - moved to AdvancementDataWorld#reload + } + + private boolean tryInsert(AdvancementHolder advancementholder) { diff --git a/nms-patches/net/minecraft/advancements/Advancements.patch b/nms-patches/net/minecraft/advancements/Advancements.patch deleted file mode 100644 index 3a6d36d59..000000000 --- a/nms-patches/net/minecraft/advancements/Advancements.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/net/minecraft/advancements/Advancements.java -+++ b/net/minecraft/advancements/Advancements.java -@@ -80,7 +80,7 @@ - entry = (Entry) iterator.next(); - MinecraftKey minecraftkey = (MinecraftKey) entry.getKey(); - Advancement.SerializedAdvancement advancement_serializedadvancement = (Advancement.SerializedAdvancement) entry.getValue(); -- Map map1 = this.advancements; -+ Map map1 = this.advancements; // CraftBukkit - decompile error - - Objects.requireNonNull(this.advancements); - if (advancement_serializedadvancement.canBuild(map1::get)) { -@@ -117,7 +117,7 @@ - } - } - -- Advancements.LOGGER.info("Loaded {} advancements", this.advancements.size()); -+ // Advancements.LOGGER.info("Loaded {} advancements", this.advancements.size()); // CraftBukkit - moved to AdvancementDataWorld#reload - } - - public void clear() { diff --git a/nms-patches/net/minecraft/commands/CommandDispatcher.patch b/nms-patches/net/minecraft/commands/CommandDispatcher.patch index d8501d35d..726a35898 100644 --- a/nms-patches/net/minecraft/commands/CommandDispatcher.patch +++ b/nms-patches/net/minecraft/commands/CommandDispatcher.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/commands/CommandDispatcher.java +++ b/net/minecraft/commands/CommandDispatcher.java -@@ -120,6 +120,14 @@ +@@ -122,6 +122,14 @@ import net.minecraft.util.profiling.jfr.JvmProfiler; import org.slf4j.Logger; @@ -15,7 +15,7 @@ public class CommandDispatcher { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -131,6 +139,7 @@ +@@ -133,6 +141,7 @@ private final com.mojang.brigadier.CommandDispatcher dispatcher = new com.mojang.brigadier.CommandDispatcher(); public CommandDispatcher(CommandDispatcher.ServerType commanddispatcher_servertype, CommandBuildContext commandbuildcontext) { @@ -23,7 +23,7 @@ CommandAdvancement.register(this.dispatcher); CommandAttribute.register(this.dispatcher, commandbuildcontext); CommandExecute.register(this.dispatcher, commandbuildcontext); -@@ -220,6 +229,11 @@ +@@ -226,6 +235,11 @@ CommandPublish.register(this.dispatcher); } @@ -35,7 +35,7 @@ this.dispatcher.setConsumer((commandcontext, flag, i) -> { ((CommandListenerWrapper) commandcontext.getSource()).onCommandComplete(commandcontext, flag, i); }); -@@ -232,12 +246,59 @@ +@@ -238,12 +252,59 @@ return new ParseResults(commandcontextbuilder1, parseresults.getReader(), parseresults.getExceptions()); } @@ -96,7 +96,7 @@ CommandListenerWrapper commandlistenerwrapper = (CommandListenerWrapper) parseresults.getContext().getSource(); commandlistenerwrapper.getServer().getProfiler().push(() -> { -@@ -262,7 +323,7 @@ +@@ -268,7 +329,7 @@ if (commandsyntaxexception.getInput() != null && commandsyntaxexception.getCursor() >= 0) { int j = Math.min(commandsyntaxexception.getInput().length(), commandsyntaxexception.getCursor()); IChatMutableComponent ichatmutablecomponent = IChatBaseComponent.empty().withStyle(EnumChatFormat.GRAY).withStyle((chatmodifier) -> { @@ -105,7 +105,7 @@ }); if (j > 10) { -@@ -312,11 +373,36 @@ +@@ -318,11 +379,36 @@ } public void sendCommands(EntityPlayer entityplayer) { @@ -143,7 +143,7 @@ entityplayer.connection.send(new PacketPlayOutCommands(rootcommandnode)); } -@@ -327,7 +413,7 @@ +@@ -333,7 +419,7 @@ CommandNode commandnode2 = (CommandNode) iterator.next(); if (commandnode2.canUse(commandlistenerwrapper)) { @@ -152,7 +152,7 @@ argumentbuilder.requires((icompletionprovider) -> { return true; -@@ -350,7 +436,7 @@ +@@ -356,7 +442,7 @@ argumentbuilder.redirect((CommandNode) map.get(argumentbuilder.getRedirect())); } diff --git a/nms-patches/net/minecraft/commands/CommandListenerWrapper.patch b/nms-patches/net/minecraft/commands/CommandListenerWrapper.patch index bc97dc4f7..7a2d3a116 100644 --- a/nms-patches/net/minecraft/commands/CommandListenerWrapper.patch +++ b/nms-patches/net/minecraft/commands/CommandListenerWrapper.patch @@ -17,7 +17,7 @@ public CommandListenerWrapper(ICommandListener icommandlistener, Vec3D vec3d, Vec2F vec2f, WorldServer worldserver, int i, String s, IChatBaseComponent ichatbasecomponent, MinecraftServer minecraftserver, @Nullable Entity entity) { this(icommandlistener, vec3d, vec2f, worldserver, i, s, ichatbasecomponent, minecraftserver, entity, false, (commandcontext, flag, j) -> { -@@ -179,9 +182,23 @@ +@@ -175,9 +178,23 @@ @Override public boolean hasPermission(int i) { @@ -41,7 +41,7 @@ public Vec3D getPosition() { return this.worldPosition; } -@@ -318,7 +335,7 @@ +@@ -314,7 +331,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); @@ -50,7 +50,7 @@ entityplayer.sendSystemMessage(ichatmutablecomponent); } } -@@ -391,4 +408,10 @@ +@@ -387,4 +404,10 @@ public FeatureFlagSet enabledFeatures() { return this.level.enabledFeatures(); } diff --git a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorBoat.patch b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorBoat.patch index 7d33299be..1c940f154 100644 --- a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorBoat.patch +++ b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorBoat.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/core/dispenser/DispenseBehaviorBoat.java +++ b/net/minecraft/core/dispenser/DispenseBehaviorBoat.java -@@ -12,6 +12,11 @@ - import net.minecraft.world.item.ItemStack; +@@ -12,6 +12,12 @@ import net.minecraft.world.level.block.BlockDispenser; + import net.minecraft.world.phys.Vec3D; +// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +// CraftBukkit end @@ -12,7 +13,7 @@ public class DispenseBehaviorBoat extends DispenseBehaviorItem { private final DispenseBehaviorItem defaultDispenseItemBehavior; -@@ -49,12 +54,40 @@ +@@ -50,12 +56,40 @@ d4 = 0.0D; } @@ -20,7 +21,7 @@ + // Object object = this.isChestBoat ? new ChestBoat(worldserver, d1, d2 + d4, d3) : new EntityBoat(worldserver, d1, d2 + d4, d3); + // CraftBukkit start + ItemStack itemstack1 = itemstack.split(1); -+ org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d1, d2 + d4, d3)); @@ -39,7 +40,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } diff --git a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorItem.patch b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorItem.patch index 6f3240066..621d2a4b4 100644 --- a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorItem.patch +++ b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorItem.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/core/dispenser/DispenseBehaviorItem.java +++ b/net/minecraft/core/dispenser/DispenseBehaviorItem.java -@@ -8,8 +8,22 @@ +@@ -7,8 +7,23 @@ import net.minecraft.world.level.World; import net.minecraft.world.level.block.BlockDispenser; +// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftVector; +import org.bukkit.event.block.BlockDispenseEvent; @@ -23,13 +24,13 @@ public DispenseBehaviorItem() {} @Override -@@ -26,11 +40,19 @@ - IPosition iposition = BlockDispenser.getDispensePosition(isourceblock); +@@ -25,11 +40,19 @@ + IPosition iposition = BlockDispenser.getDispensePosition(sourceblock); ItemStack itemstack1 = itemstack.split(1); -- spawnItem(isourceblock.getLevel(), itemstack1, 6, enumdirection, iposition); +- spawnItem(sourceblock.level(), itemstack1, 6, enumdirection, iposition); + // CraftBukkit start -+ if (!spawnItem(isourceblock.getLevel(), itemstack1, 6, enumdirection, isourceblock, dropper)) { ++ if (!spawnItem(sourceblock.level(), itemstack1, 6, enumdirection, sourceblock, dropper)) { + itemstack.grow(1); + } + // CraftBukkit end @@ -38,20 +39,20 @@ - public static void spawnItem(World world, ItemStack itemstack, int i, EnumDirection enumdirection, IPosition iposition) { + // CraftBukkit start - void -> boolean return, IPosition -> ISourceBlock last argument, dropper -+ public static boolean spawnItem(World world, ItemStack itemstack, int i, EnumDirection enumdirection, ISourceBlock isourceblock, boolean dropper) { ++ public static boolean spawnItem(World world, ItemStack itemstack, int i, EnumDirection enumdirection, SourceBlock sourceblock, boolean dropper) { + if (itemstack.isEmpty()) return true; -+ IPosition iposition = BlockDispenser.getDispensePosition(isourceblock); ++ IPosition iposition = BlockDispenser.getDispensePosition(sourceblock); + // CraftBukkit end double d0 = iposition.x(); double d1 = iposition.y(); double d2 = iposition.z(); -@@ -45,7 +67,39 @@ +@@ -44,7 +67,39 @@ double d3 = world.random.nextDouble() * 0.1D + 0.2D; entityitem.setDeltaMovement(world.random.triangle((double) enumdirection.getStepX() * d3, 0.0172275D * (double) i), world.random.triangle(0.2D, 0.0172275D * (double) i), world.random.triangle((double) enumdirection.getStepZ() * d3, 0.0172275D * (double) i)); + + // CraftBukkit start -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block = CraftBlock.at(world, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), CraftVector.toBukkit(entityitem.getDeltaMovement())); @@ -71,7 +72,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior.getClass() != DispenseBehaviorItem.class) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + } else { + world.addFreshEntity(entityitem); + } @@ -84,4 +85,4 @@ + // CraftBukkit end } - protected void playSound(ISourceBlock isourceblock) { + protected void playSound(SourceBlock sourceblock) { diff --git a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorProjectile.patch b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorProjectile.patch index 80c1d7c29..df420f085 100644 --- a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorProjectile.patch +++ b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorProjectile.patch @@ -1,12 +1,12 @@ --- a/net/minecraft/core/dispenser/DispenseBehaviorProjectile.java +++ b/net/minecraft/core/dispenser/DispenseBehaviorProjectile.java -@@ -9,6 +9,13 @@ +@@ -8,6 +8,13 @@ import net.minecraft.world.level.World; import net.minecraft.world.level.block.BlockDispenser; +// CraftBukkit start +import net.minecraft.world.entity.Entity; -+import net.minecraft.world.level.block.entity.TileEntityDispenser; ++import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +// CraftBukkit end @@ -14,15 +14,15 @@ public abstract class DispenseBehaviorProjectile extends DispenseBehaviorItem { public DispenseBehaviorProjectile() {} -@@ -20,9 +27,38 @@ - EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); +@@ -19,9 +26,38 @@ + EnumDirection enumdirection = (EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING); IProjectile iprojectile = this.getProjectile(worldserver, iposition, itemstack); - iprojectile.shoot((double) enumdirection.getStepX(), (double) ((float) enumdirection.getStepY() + 0.1F), (double) enumdirection.getStepZ(), this.getPower(), this.getUncertainty()); + // CraftBukkit start + // iprojectile.shoot((double) enumdirection.getStepX(), (double) ((float) enumdirection.getStepY() + 0.1F), (double) enumdirection.getStepZ(), this.getPower(), this.getUncertainty()); + ItemStack itemstack1 = itemstack.split(1); -+ org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) enumdirection.getStepX(), (double) ((float) enumdirection.getStepY() + 0.1F), (double) enumdirection.getStepZ())); @@ -41,13 +41,13 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } + + iprojectile.shoot(event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.getPower(), this.getUncertainty()); -+ ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getEntity()); ++ ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource(sourceblock.blockEntity()); + // CraftBukkit end worldserver.addFreshEntity(iprojectile); - itemstack.shrink(1); diff --git a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShears.patch b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShears.patch index 42d96f8b1..7db955528 100644 --- a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShears.patch +++ b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShears.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/core/dispenser/DispenseBehaviorShears.java +++ b/net/minecraft/core/dispenser/DispenseBehaviorShears.java -@@ -23,6 +23,12 @@ +@@ -22,6 +22,13 @@ import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.phys.AxisAlignedBB; +// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; @@ -13,12 +14,12 @@ public class DispenseBehaviorShears extends DispenseBehaviorMaybe { public DispenseBehaviorShears() {} -@@ -30,11 +36,34 @@ +@@ -29,11 +36,34 @@ @Override - protected ItemStack execute(ISourceBlock isourceblock, ItemStack itemstack) { - WorldServer worldserver = isourceblock.getLevel(); + protected ItemStack execute(SourceBlock sourceblock, ItemStack itemstack) { + WorldServer worldserver = sourceblock.level(); + // CraftBukkit start -+ org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block bukkitBlock = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -35,21 +36,21 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } + // CraftBukkit end if (!worldserver.isClientSide()) { - BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); + BlockPosition blockposition = sourceblock.pos().relative((EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING)); - this.setSuccess(tryShearBeehive(worldserver, blockposition) || tryShearLivingEntity(worldserver, blockposition)); + this.setSuccess(tryShearBeehive(worldserver, blockposition) || tryShearLivingEntity(worldserver, blockposition, bukkitBlock, craftItem)); // CraftBukkit if (this.isSuccess() && itemstack.hurt(1, worldserver.getRandom(), (EntityPlayer) null)) { itemstack.setCount(0); } -@@ -63,7 +92,7 @@ +@@ -62,7 +92,7 @@ return false; } @@ -58,7 +59,7 @@ List list = worldserver.getEntitiesOfClass(EntityLiving.class, new AxisAlignedBB(blockposition), IEntitySelector.NO_SPECTATORS); Iterator iterator = list.iterator(); -@@ -74,6 +103,11 @@ +@@ -73,6 +103,11 @@ IShearable ishearable = (IShearable) entityliving; if (ishearable.readyForShearing()) { diff --git a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShulkerBox.patch b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShulkerBox.patch index fdced11b9..4c4b20013 100644 --- a/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShulkerBox.patch +++ b/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShulkerBox.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/core/dispenser/DispenseBehaviorShulkerBox.java +++ b/net/minecraft/core/dispenser/DispenseBehaviorShulkerBox.java -@@ -11,6 +11,11 @@ +@@ -10,6 +10,12 @@ import net.minecraft.world.level.block.BlockDispenser; import org.slf4j.Logger; +// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +// CraftBukkit end @@ -12,17 +13,17 @@ public class DispenseBehaviorShulkerBox extends DispenseBehaviorMaybe { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -27,6 +32,30 @@ - BlockPosition blockposition = isourceblock.getPos().relative(enumdirection); - EnumDirection enumdirection1 = isourceblock.getLevel().isEmptyBlock(blockposition.below()) ? enumdirection : EnumDirection.UP; +@@ -26,6 +32,30 @@ + BlockPosition blockposition = sourceblock.pos().relative(enumdirection); + EnumDirection enumdirection1 = sourceblock.level().isEmptyBlock(blockposition.below()) ? enumdirection : EnumDirection.UP; + // CraftBukkit start -+ org.bukkit.block.Block bukkitBlock = isourceblock.getLevel().getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block bukkitBlock = CraftBlock.at(sourceblock.level(), sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); + if (!BlockDispenser.eventFired) { -+ isourceblock.getLevel().getCraftServer().getPluginManager().callEvent(event); ++ sourceblock.level().getCraftServer().getPluginManager().callEvent(event); + } + + if (event.isCancelled()) { @@ -34,12 +35,12 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } + // CraftBukkit end + try { - this.setSuccess(((ItemBlock) item).place(new BlockActionContextDirectional(isourceblock.getLevel(), blockposition, enumdirection, itemstack, enumdirection1)).consumesAction()); + this.setSuccess(((ItemBlock) item).place(new BlockActionContextDirectional(sourceblock.level(), blockposition, enumdirection, itemstack, enumdirection1)).consumesAction()); } catch (Exception exception) { diff --git a/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch b/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch index 54eeaf411..b6779a955 100644 --- a/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch +++ b/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/core/dispenser/IDispenseBehavior.java +++ b/net/minecraft/core/dispenser/IDispenseBehavior.java -@@ -78,6 +78,21 @@ - import net.minecraft.world.phys.MovingObjectPositionBlock; +@@ -77,6 +77,22 @@ + import net.minecraft.world.phys.Vec3D; import org.slf4j.Logger; +// CraftBukkit start @@ -10,6 +10,7 @@ +import net.minecraft.world.level.block.IFluidContainer; +import org.bukkit.Location; +import org.bukkit.TreeType; ++import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftLocation; +import org.bukkit.craftbukkit.util.DummyGeneratorAccess; @@ -22,14 +23,14 @@ public interface IDispenseBehavior { Logger LOGGER = LogUtils.getLogger(); -@@ -202,14 +217,42 @@ - EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); +@@ -201,14 +217,42 @@ + EnumDirection enumdirection = (EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING); EntityTypes entitytypes = ((ItemMonsterEgg) itemstack.getItem()).getType(itemstack.getTag()); + // CraftBukkit start -+ WorldServer worldserver = isourceblock.getLevel(); ++ WorldServer worldserver = sourceblock.level(); + ItemStack itemstack1 = itemstack.split(1); -+ org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -48,33 +49,33 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } + try { - entitytypes.spawn(isourceblock.getLevel(), itemstack, (EntityHuman) null, isourceblock.getPos().relative(enumdirection), EnumMobSpawn.DISPENSER, enumdirection != EnumDirection.UP, false); + entitytypes.spawn(sourceblock.level(), itemstack, (EntityHuman) null, sourceblock.pos().relative(enumdirection), EnumMobSpawn.DISPENSER, enumdirection != EnumDirection.UP, false); } catch (Exception exception) { -- null.LOGGER.error("Error while dispensing spawn egg from dispenser at {}", isourceblock.getPos(), exception); -+ LOGGER.error("Error while dispensing spawn egg from dispenser at {}", isourceblock.getPos(), exception); // CraftBukkit - decompile error +- null.LOGGER.error("Error while dispensing spawn egg from dispenser at {}", sourceblock.pos(), exception); ++ LOGGER.error("Error while dispensing spawn egg from dispenser at {}", sourceblock.pos(), exception); // CraftBukkit - decompile error return ItemStack.EMPTY; } - itemstack.shrink(1); + // itemstack.shrink(1); // Handled during event processing + // CraftBukkit end - isourceblock.getLevel().gameEvent((Entity) null, GameEvent.ENTITY_PLACE, isourceblock.getPos()); + sourceblock.level().gameEvent((Entity) null, GameEvent.ENTITY_PLACE, sourceblock.pos()); return itemstack; } -@@ -228,13 +271,41 @@ - EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); - BlockPosition blockposition = isourceblock.getPos().relative(enumdirection); - WorldServer worldserver = isourceblock.getLevel(); +@@ -227,13 +271,41 @@ + EnumDirection enumdirection = (EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING); + BlockPosition blockposition = sourceblock.pos().relative(enumdirection); + WorldServer worldserver = sourceblock.level(); + + // CraftBukkit start + ItemStack itemstack1 = itemstack.split(1); -+ org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -93,7 +94,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -110,14 +111,14 @@ } return itemstack; -@@ -255,8 +326,35 @@ +@@ -254,8 +326,35 @@ }); if (!list.isEmpty()) { + // CraftBukkit start + ItemStack itemstack1 = itemstack.split(1); -+ World world = isourceblock.getLevel(); -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ World world = sourceblock.level(); ++ org.bukkit.block.Block block = CraftBlock.at(world, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) list.get(0).getBukkitEntity()); @@ -136,7 +137,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != ItemArmor.DISPENSE_ITEM_BEHAVIOR) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -147,15 +148,15 @@ this.setSuccess(true); return itemstack; } else { -@@ -283,7 +381,35 @@ +@@ -282,7 +381,35 @@ entityhorseabstract = (EntityHorseAbstract) iterator1.next(); } while (!entityhorseabstract.isArmor(itemstack) || entityhorseabstract.isWearingArmor() || !entityhorseabstract.isTamed()); - entityhorseabstract.getSlot(401).set(itemstack.split(1)); + // CraftBukkit start + ItemStack itemstack1 = itemstack.split(1); -+ World world = isourceblock.getLevel(); -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ World world = sourceblock.level(); ++ org.bukkit.block.Block block = CraftBlock.at(world, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) entityhorseabstract.getBukkitEntity()); @@ -174,7 +175,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != ItemArmor.DISPENSE_ITEM_BEHAVIOR) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -184,7 +185,7 @@ this.setSuccess(true); return itemstack; } -@@ -326,9 +452,35 @@ +@@ -325,9 +452,35 @@ } entityhorsechestedabstract = (EntityHorseChestedAbstract) iterator1.next(); @@ -192,8 +193,8 @@ + // CraftBukkit start + } while (!entityhorsechestedabstract.isTamed()); + ItemStack itemstack1 = itemstack.split(1); -+ World world = isourceblock.getLevel(); -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ World world = sourceblock.level(); ++ org.bukkit.block.Block block = CraftBlock.at(world, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) entityhorsechestedabstract.getBukkitEntity()); @@ -211,7 +212,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != ItemArmor.DISPENSE_ITEM_BEHAVIOR) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -222,14 +223,14 @@ this.setSuccess(true); return itemstack; } -@@ -337,12 +489,41 @@ +@@ -336,12 +489,41 @@ @Override - public ItemStack execute(ISourceBlock isourceblock, ItemStack itemstack) { - EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); + public ItemStack execute(SourceBlock sourceblock, ItemStack itemstack) { + EnumDirection enumdirection = (EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING); + // CraftBukkit start -+ WorldServer worldserver = isourceblock.getLevel(); ++ WorldServer worldserver = sourceblock.level(); + ItemStack itemstack1 = itemstack.split(1); -+ org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(enumdirection.getStepX(), enumdirection.getStepY(), enumdirection.getStepZ())); @@ -248,24 +249,24 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } + + itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); - EntityFireworks entityfireworks = new EntityFireworks(isourceblock.getLevel(), itemstack, isourceblock.x(), isourceblock.y(), isourceblock.x(), true); + Vec3D vec3d = IDispenseBehavior.getEntityPokingOutOfBlockPos(sourceblock, EntityTypes.FIREWORK_ROCKET, enumdirection); + EntityFireworks entityfireworks = new EntityFireworks(sourceblock.level(), itemstack, vec3d.x(), vec3d.y(), vec3d.z(), true); - IDispenseBehavior.setEntityPokingOutOfBlock(isourceblock, entityfireworks, enumdirection); entityfireworks.shoot((double) enumdirection.getStepX(), (double) enumdirection.getStepY(), (double) enumdirection.getStepZ(), 0.5F, 1.0F); - isourceblock.getLevel().addFreshEntity(entityfireworks); + sourceblock.level().addFreshEntity(entityfireworks); - itemstack.shrink(1); + // itemstack.shrink(1); // Handled during event processing + // CraftBukkit end return itemstack; } -@@ -364,12 +545,40 @@ +@@ -363,12 +545,40 @@ double d3 = randomsource.triangle((double) enumdirection.getStepX(), 0.11485000000000001D); double d4 = randomsource.triangle((double) enumdirection.getStepY(), 0.11485000000000001D); double d5 = randomsource.triangle((double) enumdirection.getStepZ(), 0.11485000000000001D); @@ -277,7 +278,7 @@ - itemstack.shrink(1); + // CraftBukkit start + ItemStack itemstack1 = itemstack.split(1); -+ org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d3, d4, d5)); @@ -296,14 +297,14 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } + + EntitySmallFireball entitysmallfireball = new EntitySmallFireball(worldserver, d0, d1, d2, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); + entitysmallfireball.setItem(itemstack1); -+ entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getEntity()); ++ entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource(sourceblock.blockEntity()); + + worldserver.addFreshEntity(entitysmallfireball); + // itemstack.shrink(1); // Handled during event processing @@ -311,17 +312,17 @@ return itemstack; } -@@ -405,9 +614,51 @@ - BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); - WorldServer worldserver = isourceblock.getLevel(); +@@ -404,9 +614,51 @@ + BlockPosition blockposition = sourceblock.pos().relative((EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING)); + WorldServer worldserver = sourceblock.level(); + // CraftBukkit start + int x = blockposition.getX(); + int y = blockposition.getY(); + int z = blockposition.getZ(); + IBlockData iblockdata = worldserver.getBlockState(blockposition); -+ if (iblockdata.isAir() || iblockdata.canBeReplaced() || (dispensiblecontaineritem instanceof ItemBucket && iblockdata.getBlock() instanceof IFluidContainer && ((IFluidContainer) iblockdata.getBlock()).canPlaceLiquid(worldserver, blockposition, iblockdata, ((ItemBucket) dispensiblecontaineritem).content))) { -+ org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ if (iblockdata.isAir() || iblockdata.canBeReplaced() || (dispensiblecontaineritem instanceof ItemBucket && iblockdata.getBlock() instanceof IFluidContainer && ((IFluidContainer) iblockdata.getBlock()).canPlaceLiquid((EntityHuman) null, worldserver, blockposition, iblockdata, ((ItemBucket) dispensiblecontaineritem).content))) { ++ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z)); @@ -338,7 +339,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -356,29 +357,29 @@ + if (itemstack.isEmpty()) { + itemstack.setItem(Items.BUCKET); + itemstack.setCount(1); -+ } else if (((TileEntityDispenser) isourceblock.getEntity()).addItem(new ItemStack(item)) < 0) { -+ this.defaultDispenseItemBehavior.dispense(isourceblock, new ItemStack(item)); ++ } else if (sourceblock.blockEntity().addItem(new ItemStack(item)) < 0) { ++ this.defaultDispenseItemBehavior.dispense(sourceblock, new ItemStack(item)); + } + return itemstack; + // CraftBukkit end } else { - return this.defaultDispenseItemBehavior.dispense(isourceblock, itemstack); + return this.defaultDispenseItemBehavior.dispense(sourceblock, itemstack); } -@@ -434,7 +685,7 @@ - Block block = iblockdata.getBlock(); +@@ -434,7 +686,7 @@ if (block instanceof IFluidSource) { -- ItemStack itemstack1 = ((IFluidSource) block).pickupBlock(worldserver, blockposition, iblockdata); -+ ItemStack itemstack1 = ((IFluidSource) block).pickupBlock(DummyGeneratorAccess.INSTANCE, blockposition, iblockdata); // CraftBukkit + IFluidSource ifluidsource = (IFluidSource) block; +- ItemStack itemstack1 = ifluidsource.pickupBlock((EntityHuman) null, worldserver, blockposition, iblockdata); ++ ItemStack itemstack1 = ifluidsource.pickupBlock((EntityHuman) null, DummyGeneratorAccess.INSTANCE, blockposition, iblockdata); // CraftBukkit if (itemstack1.isEmpty()) { - return super.execute(isourceblock, itemstack); -@@ -442,6 +693,32 @@ + return super.execute(sourceblock, itemstack); +@@ -442,6 +694,32 @@ worldserver.gameEvent((Entity) null, GameEvent.FLUID_PICKUP, blockposition); Item item = itemstack1.getItem(); + // CraftBukkit start -+ org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block bukkitBlock = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -395,23 +396,23 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } + -+ itemstack1 = ((IFluidSource) block).pickupBlock(worldserver, blockposition, iblockdata); // From above ++ itemstack1 = ifluidsource.pickupBlock((EntityHuman) null, worldserver, blockposition, iblockdata); // From above + // CraftBukkit end + itemstack.shrink(1); if (itemstack.isEmpty()) { return new ItemStack(item); -@@ -463,16 +740,44 @@ - protected ItemStack execute(ISourceBlock isourceblock, ItemStack itemstack) { - WorldServer worldserver = isourceblock.getLevel(); +@@ -463,16 +741,44 @@ + protected ItemStack execute(SourceBlock sourceblock, ItemStack itemstack) { + WorldServer worldserver = sourceblock.level(); + // CraftBukkit start -+ org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block bukkitBlock = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -428,38 +429,38 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } + // CraftBukkit end + this.setSuccess(true); - EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); - BlockPosition blockposition = isourceblock.getPos().relative(enumdirection); + EnumDirection enumdirection = (EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING); + BlockPosition blockposition = sourceblock.pos().relative(enumdirection); IBlockData iblockdata = worldserver.getBlockState(blockposition); if (BlockFireAbstract.canBePlacedAt(worldserver, blockposition, enumdirection)) { - worldserver.setBlockAndUpdate(blockposition, BlockFireAbstract.getState(worldserver, blockposition)); - worldserver.gameEvent((Entity) null, GameEvent.BLOCK_PLACE, blockposition); + // CraftBukkit start - Ignition by dispensing flint and steel -+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(worldserver, blockposition, isourceblock.getPos()).isCancelled()) { ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(worldserver, blockposition, sourceblock.pos()).isCancelled()) { + worldserver.setBlockAndUpdate(blockposition, BlockFireAbstract.getState(worldserver, blockposition)); + worldserver.gameEvent((Entity) null, GameEvent.BLOCK_PLACE, blockposition); + } + // CraftBukkit end } else if (!BlockCampfire.canLight(iblockdata) && !CandleBlock.canLight(iblockdata) && !CandleCakeBlock.canLight(iblockdata)) { - if (iblockdata.getBlock() instanceof BlockTNT) { -+ if (iblockdata.getBlock() instanceof BlockTNT && org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(worldserver, blockposition, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.DISPENSER, null, isourceblock.getPos())) { // CraftBukkit - TNTPrimeEvent ++ if (iblockdata.getBlock() instanceof BlockTNT && org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(worldserver, blockposition, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.DISPENSER, null, sourceblock.pos())) { // CraftBukkit - TNTPrimeEvent BlockTNT.explode(worldserver, blockposition); worldserver.removeBlock(blockposition, false); } else { -@@ -496,12 +801,62 @@ +@@ -496,12 +802,62 @@ this.setSuccess(true); - WorldServer worldserver = isourceblock.getLevel(); - BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); + WorldServer worldserver = sourceblock.level(); + BlockPosition blockposition = sourceblock.pos().relative((EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING)); + // CraftBukkit start -+ org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -476,7 +477,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -517,16 +518,16 @@ return itemstack; } -@@ -511,12 +866,41 @@ - protected ItemStack execute(ISourceBlock isourceblock, ItemStack itemstack) { - WorldServer worldserver = isourceblock.getLevel(); - BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); +@@ -511,12 +867,41 @@ + protected ItemStack execute(SourceBlock sourceblock, ItemStack itemstack) { + WorldServer worldserver = sourceblock.level(); + BlockPosition blockposition = sourceblock.pos().relative((EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING)); - EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(worldserver, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null); + // CraftBukkit start + // EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(worldserver, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null); + + ItemStack itemstack1 = itemstack.split(1); -+ org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D)); @@ -545,7 +546,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -561,12 +562,12 @@ return itemstack; } }); -@@ -541,6 +925,30 @@ - EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); - BlockPosition blockposition = isourceblock.getPos().relative(enumdirection); +@@ -541,6 +926,30 @@ + EnumDirection enumdirection = (EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING); + BlockPosition blockposition = sourceblock.pos().relative(enumdirection); + // CraftBukkit start -+ org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block bukkitBlock = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -583,7 +584,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -592,12 +593,12 @@ if (worldserver.isEmptyBlock(blockposition) && BlockWitherSkull.canSpawnMob(worldserver, blockposition, itemstack)) { worldserver.setBlock(blockposition, (IBlockData) Blocks.WITHER_SKELETON_SKULL.defaultBlockState().setValue(BlockSkull.ROTATION, RotationSegment.convertToSegment(enumdirection)), 3); worldserver.gameEvent((Entity) null, GameEvent.BLOCK_PLACE, blockposition); -@@ -566,6 +974,30 @@ - BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); +@@ -566,6 +975,30 @@ + BlockPosition blockposition = sourceblock.pos().relative((EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING)); BlockPumpkinCarved blockpumpkincarved = (BlockPumpkinCarved) Blocks.CARVED_PUMPKIN; + // CraftBukkit start -+ org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block bukkitBlock = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -614,7 +615,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -623,12 +624,12 @@ if (worldserver.isEmptyBlock(blockposition) && blockpumpkincarved.canSpawnGolem(worldserver, blockposition)) { if (!worldserver.isClientSide) { worldserver.setBlock(blockposition, blockpumpkincarved.defaultBlockState(), 3); -@@ -615,6 +1047,30 @@ - BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); +@@ -615,6 +1048,30 @@ + BlockPosition blockposition = sourceblock.pos().relative((EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING)); IBlockData iblockdata = worldserver.getBlockState(blockposition); + // CraftBukkit start -+ org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block bukkitBlock = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + + BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -645,7 +646,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } diff --git a/nms-patches/net/minecraft/network/NetworkManager.patch b/nms-patches/net/minecraft/network/NetworkManager.patch index 3542e1171..fb4e0c61d 100644 --- a/nms-patches/net/minecraft/network/NetworkManager.patch +++ b/nms-patches/net/minecraft/network/NetworkManager.patch @@ -1,14 +1,14 @@ --- a/net/minecraft/network/NetworkManager.java +++ b/net/minecraft/network/NetworkManager.java -@@ -88,6 +88,7 @@ - private boolean handlingFault; - @Nullable +@@ -105,6 +105,7 @@ private volatile IChatBaseComponent delayedDisconnect; + @Nullable + BandwidthDebugMonitor bandwidthDebugMonitor; + public String hostname = ""; // CraftBukkit - add field public NetworkManager(EnumProtocolDirection enumprotocoldirection) { this.receiving = enumprotocoldirection; -@@ -173,7 +174,7 @@ +@@ -194,7 +195,7 @@ } private static void genericsFtw(Packet packet, PacketListener packetlistener) { @@ -16,8 +16,8 @@ + packet.handle((T) packetlistener); // CraftBukkit - decompile error } - public void setListener(PacketListener packetlistener) { -@@ -306,7 +307,7 @@ + public void suspendInboundAfterProtocolChange() { +@@ -421,7 +422,7 @@ } if (this.isConnected()) { diff --git a/nms-patches/net/minecraft/network/PacketDataSerializer.patch b/nms-patches/net/minecraft/network/PacketDataSerializer.patch index 4e2539ed1..dc91f7c5a 100644 --- a/nms-patches/net/minecraft/network/PacketDataSerializer.patch +++ b/nms-patches/net/minecraft/network/PacketDataSerializer.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/network/PacketDataSerializer.java +++ b/net/minecraft/network/PacketDataSerializer.java -@@ -81,6 +81,8 @@ +@@ -80,6 +80,8 @@ import org.joml.Quaternionf; import org.joml.Vector3f; @@ -8,8 +8,8 @@ + public class PacketDataSerializer extends ByteBuf { - private static final int MAX_VARINT_SIZE = 5; -@@ -220,7 +222,7 @@ + public static final int DEFAULT_NBT_QUOTA = 2097152; +@@ -204,7 +206,7 @@ public > C readCollection(IntFunction intfunction, PacketDataSerializer.a packetdataserializer_a) { int i = this.readVarInt(); @@ -18,7 +18,7 @@ for (int j = 0; j < i; ++j) { c0.add(packetdataserializer_a.apply(this)); -@@ -231,7 +233,7 @@ +@@ -215,7 +217,7 @@ public void writeCollection(Collection collection, PacketDataSerializer.b packetdataserializer_b) { this.writeVarInt(collection.size()); @@ -27,7 +27,7 @@ while (iterator.hasNext()) { T t0 = iterator.next(); -@@ -258,12 +260,12 @@ +@@ -242,12 +244,12 @@ public void writeIntIdList(IntList intlist) { this.writeVarInt(intlist.size()); @@ -42,7 +42,7 @@ for (int j = 0; j < i; ++j) { K k0 = packetdataserializer_a.apply(this); -@@ -297,7 +299,7 @@ +@@ -281,7 +283,7 @@ } public > void writeEnumSet(EnumSet enumset, Class oclass) { @@ -51,7 +51,7 @@ BitSet bitset = new BitSet(ae.length); for (int i = 0; i < ae.length; ++i) { -@@ -308,7 +310,7 @@ +@@ -292,7 +294,7 @@ } public > EnumSet readEnumSet(Class oclass) { @@ -60,7 +60,7 @@ BitSet bitset = this.readFixedBitSet(ae.length); EnumSet enumset = EnumSet.noneOf(oclass); -@@ -545,7 +547,7 @@ +@@ -530,7 +532,7 @@ } public > T readEnum(Class oclass) { @@ -69,16 +69,16 @@ } public PacketDataSerializer writeEnum(Enum oenum) { -@@ -622,7 +624,7 @@ - } else { - try { - NBTCompressedStreamTools.write(nbttagcompound, (DataOutput) (new ByteBufOutputStream(this))); -- } catch (IOException ioexception) { -+ } catch (Exception ioexception) { // CraftBukkit - IOException -> Exception - throw new EncoderException(ioexception); - } +@@ -585,7 +587,7 @@ + try { + NBTCompressedStreamTools.writeAnyTag((NBTBase) nbtbase, new ByteBufOutputStream(this)); + return this; +- } catch (IOException ioexception) { ++ } catch (Exception ioexception) { // CraftBukkit - IOException -> Exception + throw new EncoderException(ioexception); } -@@ -659,7 +661,7 @@ + } +@@ -613,7 +615,7 @@ } public PacketDataSerializer writeItem(ItemStack itemstack) { @@ -87,7 +87,7 @@ this.writeBoolean(false); } else { this.writeBoolean(true); -@@ -688,6 +690,11 @@ +@@ -642,6 +644,11 @@ ItemStack itemstack = new ItemStack(item, b0); itemstack.setTag(this.readNbt()); diff --git a/nms-patches/net/minecraft/network/protocol/PlayerConnectionUtils.patch b/nms-patches/net/minecraft/network/protocol/PlayerConnectionUtils.patch index 57d31871c..d2ba474ea 100644 --- a/nms-patches/net/minecraft/network/protocol/PlayerConnectionUtils.patch +++ b/nms-patches/net/minecraft/network/protocol/PlayerConnectionUtils.patch @@ -1,31 +1,31 @@ --- a/net/minecraft/network/protocol/PlayerConnectionUtils.java +++ b/net/minecraft/network/protocol/PlayerConnectionUtils.java -@@ -7,6 +7,11 @@ +@@ -8,6 +8,11 @@ import net.minecraft.util.thread.IAsyncTaskHandler; import org.slf4j.Logger; +// CraftBukkit start +import net.minecraft.server.MinecraftServer; -+import net.minecraft.server.network.PlayerConnection; ++import net.minecraft.server.network.ServerCommonPacketListenerImpl; +// CraftBukkit end + public class PlayerConnectionUtils { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -20,6 +25,7 @@ +@@ -21,6 +26,7 @@ public static void ensureRunningOnSameThread(Packet packet, T t0, IAsyncTaskHandler iasynctaskhandler) throws CancelledPacketHandleException { if (!iasynctaskhandler.isSameThread()) { iasynctaskhandler.executeIfPossible(() -> { -+ if (MinecraftServer.getServer().hasStopped() || (t0 instanceof PlayerConnection && ((PlayerConnection) t0).processedDisconnect)) return; // CraftBukkit, MC-142590 - if (t0.isAcceptingMessages()) { ++ if (MinecraftServer.getServer().hasStopped() || (t0 instanceof ServerCommonPacketListenerImpl && ((ServerCommonPacketListenerImpl) t0).processedDisconnect)) return; // CraftBukkit, MC-142590 + if (t0.shouldHandleMessage(packet)) { try { packet.handle(t0); -@@ -36,6 +42,10 @@ +@@ -46,6 +52,10 @@ }); throw CancelledPacketHandleException.RUNNING_ON_DIFFERENT_THREAD; + // CraftBukkit start - SPIGOT-5477, MC-142590 -+ } else if (MinecraftServer.getServer().hasStopped() || (t0 instanceof PlayerConnection && ((PlayerConnection) t0).processedDisconnect)) { ++ } else if (MinecraftServer.getServer().hasStopped() || (t0 instanceof ServerCommonPacketListenerImpl && ((ServerCommonPacketListenerImpl) t0).processedDisconnect)) { + throw CancelledPacketHandleException.RUNNING_ON_DIFFERENT_THREAD; + // CraftBukkit end } diff --git a/nms-patches/net/minecraft/network/protocol/common/ServerboundCustomPayloadPacket.patch b/nms-patches/net/minecraft/network/protocol/common/ServerboundCustomPayloadPacket.patch new file mode 100644 index 000000000..bb9e6bf41 --- /dev/null +++ b/nms-patches/net/minecraft/network/protocol/common/ServerboundCustomPayloadPacket.patch @@ -0,0 +1,43 @@ +--- a/net/minecraft/network/protocol/common/ServerboundCustomPayloadPacket.java ++++ b/net/minecraft/network/protocol/common/ServerboundCustomPayloadPacket.java +@@ -12,7 +12,7 @@ + public record ServerboundCustomPayloadPacket(CustomPacketPayload payload) implements Packet { + + private static final int MAX_PAYLOAD_SIZE = 32767; +- private static final Map> KNOWN_TYPES = ImmutableMap.builder().put(BrandPayload.ID, BrandPayload::new).build(); ++ private static final Map> KNOWN_TYPES = ImmutableMap.>builder().put(BrandPayload.ID, BrandPayload::new).build(); // CraftBukkit - decompile error + + public ServerboundCustomPayloadPacket(PacketDataSerializer packetdataserializer) { + this(readPayload(packetdataserializer.readResourceLocation(), packetdataserializer)); +@@ -24,12 +24,13 @@ + return (CustomPacketPayload) (packetdataserializer_a != null ? (CustomPacketPayload) packetdataserializer_a.apply(packetdataserializer) : readUnknownPayload(minecraftkey, packetdataserializer)); + } + +- private static DiscardedPayload readUnknownPayload(MinecraftKey minecraftkey, PacketDataSerializer packetdataserializer) { ++ private static UnknownPayload readUnknownPayload(MinecraftKey minecraftkey, PacketDataSerializer packetdataserializer) { // CraftBukkit + int i = packetdataserializer.readableBytes(); + + if (i >= 0 && i <= 32767) { +- packetdataserializer.skipBytes(i); +- return new DiscardedPayload(minecraftkey); ++ // CraftBukkit start ++ return new UnknownPayload(minecraftkey, packetdataserializer.readBytes(i)); ++ // CraftBukkit end + } else { + throw new IllegalArgumentException("Payload may not be larger than 32767 bytes"); + } +@@ -44,4 +45,14 @@ + public void handle(ServerCommonPacketListener servercommonpacketlistener) { + servercommonpacketlistener.handleCustomPayload(this); + } ++ ++ // CraftBukkit start ++ public record UnknownPayload(MinecraftKey id, io.netty.buffer.ByteBuf data) implements CustomPacketPayload { ++ ++ @Override ++ public void write(PacketDataSerializer packetdataserializer) { ++ packetdataserializer.writeBytes(data); ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.patch b/nms-patches/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.patch index 9e5f50457..3ab554b77 100644 --- a/nms-patches/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.patch +++ b/nms-patches/net/minecraft/network/protocol/handshake/PacketHandshakingInSetProtocol.patch @@ -4,4 +4,4 @@ +// mc-dev import package net.minecraft.network.protocol.handshake; - import net.minecraft.SharedConstants; + import net.minecraft.network.EnumProtocol; diff --git a/nms-patches/net/minecraft/server/AdvancementDataPlayer.patch b/nms-patches/net/minecraft/server/AdvancementDataPlayer.patch index 42e602d64..d9c6f72fe 100644 --- a/nms-patches/net/minecraft/server/AdvancementDataPlayer.patch +++ b/nms-patches/net/minecraft/server/AdvancementDataPlayer.patch @@ -1,23 +1,18 @@ --- a/net/minecraft/server/AdvancementDataPlayer.java +++ b/net/minecraft/server/AdvancementDataPlayer.java -@@ -144,7 +144,11 @@ - Advancement advancement = advancementdataworld.getAdvancement((MinecraftKey) entry.getKey()); +@@ -197,6 +197,7 @@ + AdvancementHolder advancementholder = advancementdataworld.get(minecraftkey); - if (advancement == null) { -- AdvancementDataPlayer.LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", entry.getKey(), this.playerSavePath); -+ // CraftBukkit start -+ if (entry.getKey().getNamespace().equals("minecraft")) { -+ AdvancementDataPlayer.LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", entry.getKey(), this.playerSavePath); -+ } -+ // CraftBukkit end - } else { - this.startProgress(advancement, (AdvancementProgress) entry.getValue()); - this.progressChanged.add(advancement); -@@ -227,6 +231,7 @@ - this.progressChanged.add(advancement); + if (advancementholder == null) { ++ if (!minecraftkey.getNamespace().equals("minecraft")) return; // CraftBukkit + AdvancementDataPlayer.LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", minecraftkey, this.playerSavePath); + } else { + this.startProgress(advancementholder, advancementprogress); +@@ -228,6 +229,7 @@ + this.progressChanged.add(advancementholder); flag = true; if (!flag1 && advancementprogress.isDone()) { -+ this.player.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.player.PlayerAdvancementDoneEvent(this.player.getBukkitEntity(), advancement.bukkit)); // CraftBukkit - advancement.getRewards().grant(this.player); - if (advancement.getDisplay() != null && advancement.getDisplay().shouldAnnounceChat() && this.player.level().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) { - this.playerList.broadcastSystemMessage(IChatBaseComponent.translatable("chat.type.advancement." + advancement.getDisplay().getFrame().getName(), this.player.getDisplayName(), advancement.getChatComponent()), false); ++ this.player.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.player.PlayerAdvancementDoneEvent(this.player.getBukkitEntity(), advancementholder.toBukkit())); // CraftBukkit + advancementholder.value().rewards().grant(this.player); + advancementholder.value().display().ifPresent((advancementdisplay) -> { + if (advancementdisplay.shouldAnnounceChat() && this.player.level().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) { diff --git a/nms-patches/net/minecraft/server/AdvancementDataWorld.patch b/nms-patches/net/minecraft/server/AdvancementDataWorld.patch index 7ec05282d..7c005ced9 100644 --- a/nms-patches/net/minecraft/server/AdvancementDataWorld.patch +++ b/nms-patches/net/minecraft/server/AdvancementDataWorld.patch @@ -4,4 +4,4 @@ +// mc-dev import package net.minecraft.server; - import com.google.common.collect.Maps; + import com.google.common.collect.ImmutableMap; diff --git a/nms-patches/net/minecraft/server/CustomFunctionData.patch b/nms-patches/net/minecraft/server/CustomFunctionData.patch index 3bd47afc4..91a5cc21f 100644 --- a/nms-patches/net/minecraft/server/CustomFunctionData.patch +++ b/nms-patches/net/minecraft/server/CustomFunctionData.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/CustomFunctionData.java +++ b/net/minecraft/server/CustomFunctionData.java -@@ -43,7 +43,7 @@ +@@ -45,7 +45,7 @@ } public CommandDispatcher getDispatcher() { diff --git a/nms-patches/net/minecraft/server/Main.patch b/nms-patches/net/minecraft/server/Main.patch index 2bfd4f53a..d3fba4bba 100644 --- a/nms-patches/net/minecraft/server/Main.patch +++ b/nms-patches/net/minecraft/server/Main.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/Main.java +++ b/net/minecraft/server/Main.java -@@ -64,6 +64,16 @@ +@@ -61,6 +61,17 @@ import net.minecraft.world.level.storage.WorldInfo; import org.slf4j.Logger; @@ -11,13 +11,14 @@ +import net.minecraft.SharedConstants; +import net.minecraft.server.packs.EnumResourcePackType; +import net.minecraft.world.level.dimension.WorldDimension; ++import net.minecraft.world.level.storage.SavedFile; +import org.bukkit.configuration.file.YamlConfiguration; +// CraftBukkit end + public class Main { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -71,8 +81,9 @@ +@@ -68,8 +79,9 @@ public Main() {} @DontObfuscate @@ -28,7 +29,7 @@ OptionParser optionparser = new OptionParser(); OptionSpec optionspec = optionparser.accepts("nogui"); OptionSpec optionspec1 = optionparser.accepts("initSettings", "Initializes 'server.properties' and 'eula.txt', then quits"); -@@ -98,15 +109,18 @@ +@@ -94,15 +106,18 @@ optionparser.printHelpOn(System.err); return; } @@ -36,7 +37,7 @@ + + try { -- Path path = (Path) optionset.valueOf(optionspec14); +- Path path = (Path) optionset.valueOf(optionspec13); + Path path = (Path) optionset.valueOf("pidFile"); // CraftBukkit if (path != null) { @@ -44,12 +45,12 @@ } CrashReport.preload(); -- if (optionset.has(optionspec13)) { +- if (optionset.has(optionspec12)) { + if (optionset.has("jfrProfile")) { // CraftBukkit JvmProfiler.INSTANCE.start(Environment.SERVER); } -@@ -114,13 +128,26 @@ +@@ -110,13 +125,26 @@ DispenserRegistry.validate(); SystemUtils.startTimerHackThread(); Path path1 = Paths.get("server.properties"); @@ -78,14 +79,14 @@ Main.LOGGER.info("Initialized '{}' and '{}'", path1.toAbsolutePath(), path2.toAbsolutePath()); return; } -@@ -130,11 +157,12 @@ +@@ -126,11 +154,12 @@ return; } -- File file = new File((String) optionset.valueOf(optionspec9)); +- File file = new File((String) optionset.valueOf(optionspec8)); + File file = (File) optionset.valueOf("universe"); // CraftBukkit Services services = Services.create(new YggdrasilAuthenticationService(Proxy.NO_PROXY), file); -- String s = (String) Optional.ofNullable((String) optionset.valueOf(optionspec10)).orElse(dedicatedserversettings.getProperties().levelName); +- String s = (String) Optional.ofNullable((String) optionset.valueOf(optionspec9)).orElse(dedicatedserversettings.getProperties().levelName); + // CraftBukkit start + String s = (String) Optional.ofNullable((String) optionset.valueOf("world")).orElse(dedicatedserversettings.getProperties().levelName); Convertable convertable = Convertable.createDefault(file.toPath()); @@ -94,7 +95,7 @@ WorldInfo worldinfo = convertable_conversionsession.getSummary(); if (worldinfo != null) { -@@ -149,13 +177,31 @@ +@@ -145,13 +174,31 @@ } } @@ -105,7 +106,7 @@ Main.LOGGER.warn("Safe mode active, only vanilla datapack will be loaded"); } - ResourcePackRepository resourcepackrepository = ResourcePackSourceVanilla.createPackRepository(convertable_conversionsession.getLevelPath(SavedFile.DATAPACK_DIR)); + ResourcePackRepository resourcepackrepository = ResourcePackSourceVanilla.createPackRepository(convertable_conversionsession); + // CraftBukkit start + File bukkitDataPackFolder = new File(convertable_conversionsession.getLevelPath(SavedFile.DATAPACK_DIR).toFile(), "bukkit"); + if (!bukkitDataPackFolder.exists()) { @@ -127,7 +128,7 @@ WorldStem worldstem; -@@ -164,6 +210,7 @@ +@@ -160,6 +207,7 @@ worldstem = (WorldStem) SystemUtils.blockUntilDone((executor) -> { return WorldLoader.load(worldloader_c, (worldloader_a) -> { @@ -135,7 +136,7 @@ IRegistry iregistry = worldloader_a.datapackDimensions().registryOrThrow(Registries.LEVEL_STEM); DynamicOps dynamicops = RegistryOps.create(DynamicOpsNBT.INSTANCE, (HolderLookup.b) worldloader_a.datapackWorldgen()); Pair pair = convertable_conversionsession.getDataTag(dynamicops, worldloader_a.dataConfiguration(), iregistry, worldloader_a.datapackWorldgen().allRegistriesLifecycle()); -@@ -175,7 +222,7 @@ +@@ -171,7 +219,7 @@ WorldOptions worldoptions; WorldDimensions worlddimensions; @@ -144,7 +145,7 @@ worldsettings = MinecraftServer.DEMO_SETTINGS; worldoptions = WorldOptions.DEMO_OPTIONS; worlddimensions = WorldPresets.createNormalWorldDimensions(worldloader_a.datapackWorldgen()); -@@ -183,7 +230,7 @@ +@@ -179,7 +227,7 @@ DedicatedServerProperties dedicatedserverproperties = dedicatedserversettings.getProperties(); worldsettings = new WorldSettings(dedicatedserverproperties.levelName, dedicatedserverproperties.gamemode, dedicatedserverproperties.hardcore, dedicatedserverproperties.difficulty, false, new GameRules(), worldloader_a.dataConfiguration()); @@ -153,7 +154,7 @@ worlddimensions = dedicatedserverproperties.createDimensions(worldloader_a.datapackWorldgen()); } -@@ -199,6 +246,7 @@ +@@ -195,6 +243,7 @@ return; } @@ -161,7 +162,7 @@ IRegistryCustom.Dimension iregistrycustom_dimension = worldstem.registries().compositeAccess(); if (optionset.has(optionspec4)) { -@@ -210,21 +258,32 @@ +@@ -206,20 +255,31 @@ SaveData savedata = worldstem.worldData(); convertable_conversionsession.saveDataTag(iregistrycustom_dimension, savedata); @@ -171,10 +172,9 @@ + DedicatedServer dedicatedserver1 = new DedicatedServer(optionset, worldLoader.get(), thread, convertable_conversionsession, resourcepackrepository, worldstem, dedicatedserversettings, DataConverterRegistry.getDataFixer(), services, WorldLoadListenerLogger::new); + /* - dedicatedserver1.setSingleplayerProfile(optionset.has(optionspec8) ? new GameProfile((UUID) null, (String) optionset.valueOf(optionspec8)) : null); - dedicatedserver1.setPort((Integer) optionset.valueOf(optionspec11)); + dedicatedserver1.setPort((Integer) optionset.valueOf(optionspec10)); dedicatedserver1.setDemo(optionset.has(optionspec2)); - dedicatedserver1.setId((String) optionset.valueOf(optionspec12)); + dedicatedserver1.setId((String) optionset.valueOf(optionspec11)); - boolean flag1 = !optionset.has(optionspec) && !optionset.valuesOf(nonoptionargumentspec).contains("nogui"); + */ + boolean flag1 = !optionset.has("nogui") && !optionset.nonOptionArguments().contains("nogui"); @@ -196,7 +196,7 @@ Thread thread = new Thread("Server Shutdown Thread") { public void run() { dedicatedserver.halt(true); -@@ -233,6 +292,7 @@ +@@ -228,6 +288,7 @@ thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(Main.LOGGER)); Runtime.getRuntime().addShutdownHook(thread); @@ -204,7 +204,7 @@ } catch (Exception exception1) { Main.LOGGER.error(LogUtils.FATAL_MARKER, "Failed to start the minecraft server", exception1); } -@@ -268,7 +328,7 @@ +@@ -263,7 +324,7 @@ } public static void forceUpgrade(Convertable.ConversionSession convertable_conversionsession, DataFixer datafixer, boolean flag, BooleanSupplier booleansupplier, IRegistry iregistry) { diff --git a/nms-patches/net/minecraft/server/MinecraftServer.patch b/nms-patches/net/minecraft/server/MinecraftServer.patch index a69da70d9..b20405c50 100644 --- a/nms-patches/net/minecraft/server/MinecraftServer.patch +++ b/nms-patches/net/minecraft/server/MinecraftServer.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -164,6 +164,33 @@ +@@ -163,6 +163,30 @@ import net.minecraft.world.phys.Vec3D; import org.slf4j.Logger; @@ -25,16 +25,13 @@ +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.Main; -+import org.bukkit.craftbukkit.util.CraftChatMessage; -+import org.bukkit.craftbukkit.util.LazyPlayerSet; -+import org.bukkit.event.player.AsyncPlayerChatPreviewEvent; +import org.bukkit.event.server.ServerLoadEvent; +// CraftBukkit end + - public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant implements ICommandListener, AutoCloseable { + public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant implements ServerInfo, ICommandListener, AutoCloseable { public static final Logger LOGGER = LogUtils.getLogger(); -@@ -249,6 +276,19 @@ +@@ -247,6 +271,19 @@ protected SaveData worldData; private volatile boolean isSaving; @@ -54,7 +51,7 @@ public static S spin(Function function) { AtomicReference atomicreference = new AtomicReference(); Thread thread = new Thread(() -> { -@@ -262,14 +302,14 @@ +@@ -260,14 +297,14 @@ thread.setPriority(8); } @@ -71,8 +68,8 @@ super("Server"); this.metricsRecorder = InactiveMetricsRecorder.INSTANCE; this.profiler = this.metricsRecorder.getProfiler(); -@@ -289,7 +329,7 @@ - this.frameTimer = new CircularTimer(); +@@ -286,7 +323,7 @@ + this.customBossEvents = new BossBattleCustomData(); this.registries = worldstem.registries(); this.worldData = worldstem.worldData(); - if (!this.registries.compositeAccess().registryOrThrow(Registries.LEVEL_STEM).containsKey(WorldDimension.OVERWORLD)) { @@ -80,7 +77,7 @@ throw new IllegalStateException("Missing Overworld dimension data"); } else { this.proxy = proxy; -@@ -312,13 +352,40 @@ +@@ -309,6 +346,33 @@ this.serverThread = thread; this.executor = SystemUtils.backgroundExecutor(); } @@ -110,19 +107,11 @@ + } + } + Runtime.getRuntime().addShutdownHook(new org.bukkit.craftbukkit.util.ServerShutdownThread(this)); ++ // CraftBukkit end } -+ // CraftBukkit end private void readScoreboard(WorldPersistentData worldpersistentdata) { - ScoreboardServer scoreboardserver = this.getScoreboard(); - - Objects.requireNonNull(scoreboardserver); -- Function function = scoreboardserver::createData; -+ Function function = scoreboardserver::createData; // CraftBukkit - decompile error - ScoreboardServer scoreboardserver1 = this.getScoreboard(); - - Objects.requireNonNull(scoreboardserver1); -@@ -327,7 +394,7 @@ +@@ -317,7 +381,7 @@ protected abstract boolean initServer() throws IOException; @@ -131,7 +120,7 @@ if (!JvmProfiler.INSTANCE.isRunning()) { ; } -@@ -335,12 +402,8 @@ +@@ -325,12 +389,8 @@ boolean flag = false; ProfiledDuration profiledduration = JvmProfiler.INSTANCE.onWorldLoadedStarted(); @@ -145,11 +134,20 @@ if (profiledduration != null) { profiledduration.finish(); } -@@ -355,25 +418,183 @@ +@@ -347,23 +407,179 @@ - } + protected void forceDifficulty() {} -- protected void forceDifficulty() {} +- protected void createLevels(WorldLoadListener worldloadlistener) { +- IWorldDataServer iworlddataserver = this.worldData.overworldData(); +- boolean flag = this.worldData.isDebugWorld(); +- IRegistry iregistry = this.registries.compositeAccess().registryOrThrow(Registries.LEVEL_STEM); +- WorldOptions worldoptions = this.worldData.worldGenOptions(); +- long i = worldoptions.seed(); +- long j = BiomeManager.obfuscateSeed(i); +- List list = ImmutableList.of(new MobSpawnerPhantom(), new MobSpawnerPatrol(), new MobSpawnerCat(), new VillageSiege(), new MobSpawnerTrader(iworlddataserver)); +- WorldDimension worlddimension = (WorldDimension) iregistry.get(WorldDimension.OVERWORLD); +- WorldServer worldserver = new WorldServer(this, this.executor, this.storageSource, iworlddataserver, World.OVERWORLD, worlddimension, worldloadlistener, flag, j, list, true, (RandomSequences) null); + // CraftBukkit start + private void loadWorld0(String s) { + Convertable.ConversionSession worldSession = this.storageSource; @@ -176,17 +174,7 @@ + } else if (dimensionKey != WorldDimension.OVERWORLD) { + dimension = -999; + } - -- protected void createLevels(WorldLoadListener worldloadlistener) { -- IWorldDataServer iworlddataserver = this.worldData.overworldData(); -- boolean flag = this.worldData.isDebugWorld(); -- IRegistry iregistry = this.registries.compositeAccess().registryOrThrow(Registries.LEVEL_STEM); -- WorldOptions worldoptions = this.worldData.worldGenOptions(); -- long i = worldoptions.seed(); -- long j = BiomeManager.obfuscateSeed(i); -- List list = ImmutableList.of(new MobSpawnerPhantom(), new MobSpawnerPatrol(), new MobSpawnerCat(), new VillageSiege(), new MobSpawnerTrader(iworlddataserver)); -- WorldDimension worlddimension = (WorldDimension) iregistry.get(WorldDimension.OVERWORLD); -- WorldServer worldserver = new WorldServer(this, this.executor, this.storageSource, iworlddataserver, World.OVERWORLD, worlddimension, worldloadlistener, flag, j, list, true, (RandomSequences) null); ++ + String worldType = (dimension == -999) ? dimensionKey.location().getNamespace() + "_" + dimensionKey.location().getPath() : org.bukkit.World.Environment.getEnvironment(dimension).toString().toLowerCase(); + String name = (dimensionKey == WorldDimension.OVERWORLD) ? s : s + "_" + worldType; + if (dimension != 0) { @@ -230,10 +218,14 @@ + throw new RuntimeException(ex); + } + } -+ + +- this.levels.put(World.OVERWORLD, worldserver); +- WorldPersistentData worldpersistentdata = worldserver.getDataStorage(); + org.bukkit.generator.ChunkGenerator gen = this.server.getGenerator(name); + org.bukkit.generator.BiomeProvider biomeProvider = this.server.getBiomeProvider(name); -+ + +- this.readScoreboard(worldpersistentdata); +- this.commandStorage = new PersistentCommandStorage(worldpersistentdata); + WorldDataServer worlddata; + WorldLoader.a worldloader_a = this.worldLoader; + IRegistry iregistry = worldloader_a.datapackDimensions().registryOrThrow(Registries.LEVEL_STEM); @@ -289,13 +281,9 @@ + if (dimensionKey == WorldDimension.OVERWORLD) { + this.worldData = worlddata; + this.worldData.setGameType(((DedicatedServer) this).getProperties().gamemode); // From DedicatedServer.init - -- this.levels.put(World.OVERWORLD, worldserver); -- WorldPersistentData worldpersistentdata = worldserver.getDataStorage(); ++ + WorldLoadListener worldloadlistener = this.progressListenerFactory.create(11); - -- this.readScoreboard(worldpersistentdata); -- this.commandStorage = new PersistentCommandStorage(worldpersistentdata); ++ + world = new WorldServer(this, this.executor, worldSession, iworlddataserver, worldKey, worlddimension, worldloadlistener, flag, j, list, true, (RandomSequences) null, org.bukkit.World.Environment.getEnvironment(dimension), gen, biomeProvider); + WorldPersistentData worldpersistentdata = world.getDataStorage(); + this.readScoreboard(worldpersistentdata); @@ -327,11 +315,7 @@ + this.server.getPluginManager().callEvent(new ServerLoadEvent(ServerLoadEvent.LoadType.STARTUP)); + this.connection.acceptConnections(); + } -+ // CraftBukkit end + -+ protected void forceDifficulty() {} -+ -+ // CraftBukkit start + public void initWorld(WorldServer worldserver, IWorldDataServer iworlddataserver, SaveData saveData, WorldOptions worldoptions) { + boolean flag = saveData.isDebugWorld(); + // CraftBukkit start @@ -344,7 +328,7 @@ if (!iworlddataserver.isInitialized()) { try { -@@ -397,30 +618,8 @@ +@@ -387,30 +603,8 @@ iworlddataserver.setInitialized(true); } @@ -376,7 +360,7 @@ private static void setInitialSpawn(WorldServer worldserver, IWorldDataServer iworlddataserver, boolean flag, boolean flag1) { if (flag1) { -@@ -428,6 +627,21 @@ +@@ -418,6 +612,21 @@ } else { ChunkProviderServer chunkproviderserver = worldserver.getChunkSource(); ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(chunkproviderserver.randomState().sampler().findSpawnPosition()); @@ -398,7 +382,7 @@ int i = chunkproviderserver.getGenerator().getSpawnHeight(worldserver); if (i < worldserver.getMinBuildHeight()) { -@@ -487,8 +701,11 @@ +@@ -477,8 +686,11 @@ iworlddataserver.setGameType(EnumGamemode.SPECTATOR); } @@ -412,7 +396,7 @@ MinecraftServer.LOGGER.info("Preparing start region for dimension {}", worldserver.dimension().location()); BlockPosition blockposition = worldserver.getSharedSpawnPos(); -@@ -497,19 +714,23 @@ +@@ -487,19 +699,23 @@ ChunkProviderServer chunkproviderserver = worldserver.getChunkSource(); this.nextTickTime = SystemUtils.getMillis(); @@ -442,10 +426,10 @@ + if (true) { + WorldServer worldserver1 = worldserver; + // CraftBukkit end - ForcedChunk forcedchunk = (ForcedChunk) worldserver1.getDataStorage().get(ForcedChunk::load, "chunks"); + ForcedChunk forcedchunk = (ForcedChunk) worldserver1.getDataStorage().get(ForcedChunk.factory(), "chunks"); if (forcedchunk != null) { -@@ -524,10 +745,17 @@ +@@ -514,10 +730,17 @@ } } @@ -466,7 +450,7 @@ } public EnumGamemode getDefaultGameType() { -@@ -557,12 +785,16 @@ +@@ -547,12 +770,16 @@ worldserver.save((IProgressUpdate) null, flag1, worldserver.noSave && !flag2); } @@ -483,7 +467,7 @@ if (flag1) { Iterator iterator1 = this.getAllLevels().iterator(); -@@ -597,12 +829,33 @@ +@@ -587,18 +814,40 @@ this.stopServer(); } @@ -514,10 +498,9 @@ + this.server.disablePlugins(); + } + // CraftBukkit end - if (this.getConnection() != null) { - this.getConnection().stop(); - } -@@ -612,6 +865,7 @@ + this.getConnection().stop(); + this.isSaving = true; + if (this.playerList != null) { MinecraftServer.LOGGER.info("Saving players"); this.playerList.saveAll(); this.playerList.removeAll(); @@ -525,7 +508,7 @@ } MinecraftServer.LOGGER.info("Saving worlds"); -@@ -699,15 +953,16 @@ +@@ -686,15 +935,16 @@ } this.nextTickTime = SystemUtils.getMillis(); @@ -544,7 +527,7 @@ MinecraftServer.LOGGER.warn("Can't keep up! Is the server overloaded? Running {}ms or {} ticks behind", i, j); this.nextTickTime += j * 50L; this.lastOverloadWarning = this.nextTickTime; -@@ -718,6 +973,7 @@ +@@ -705,6 +955,7 @@ this.debugCommandProfiler = new MinecraftServer.TimeProfiler(SystemUtils.getNanos(), this.tickCount); } @@ -552,7 +535,7 @@ this.nextTickTime += 50L; this.startMetricsRecordingTick(); this.profiler.push("tick"); -@@ -756,6 +1012,12 @@ +@@ -743,6 +994,12 @@ this.services.profileCache().clearExecutor(); } @@ -565,25 +548,23 @@ this.onServerExit(); } -@@ -789,9 +1051,16 @@ +@@ -776,7 +1033,14 @@ } private boolean haveTime() { - return this.runningTask() || SystemUtils.getMillis() < (this.mayHaveDelayedTasks ? this.delayedTasksMaxNextTickTime : this.nextTickTime); + // CraftBukkit start + return this.forceTicks || this.runningTask() || SystemUtils.getMillis() < (this.mayHaveDelayedTasks ? this.delayedTasksMaxNextTickTime : this.nextTickTime); - } - ++ } ++ + private void executeModerately() { + this.runAllTasks(); + java.util.concurrent.locks.LockSupport.parkNanos("executing tasks", 1000L); -+ } -+ // CraftBukkit end -+ ++ // CraftBukkit end + } + protected void waitUntilNextTick() { - this.runAllTasks(); - this.managedBlock(() -> { -@@ -836,7 +1105,7 @@ +@@ -823,7 +1087,7 @@ } } @@ -592,7 +573,7 @@ this.getProfiler().incrementCounter("runTask"); super.doRunTask(ticktask); } -@@ -889,7 +1158,7 @@ +@@ -876,7 +1140,7 @@ this.status = this.buildServerStatus(); } @@ -601,10 +582,10 @@ MinecraftServer.LOGGER.debug("Autosave started"); this.profiler.push("save"); this.saveEverything(true, false, false); -@@ -936,22 +1205,39 @@ - } - - public void tickChildren(BooleanSupplier booleansupplier) { +@@ -928,22 +1192,39 @@ + this.getPlayerList().getPlayers().forEach((entityplayer) -> { + entityplayer.connection.suspendFlushing(); + }); + this.server.getScheduler().mainThreadHeartbeat(this.tickCount); // CraftBukkit this.profiler.push("commandFunctions"); this.getFunctions().tick(); @@ -641,7 +622,7 @@ this.profiler.push("tick"); -@@ -1031,6 +1317,22 @@ +@@ -1033,6 +1314,22 @@ return (WorldServer) this.levels.get(resourcekey); } @@ -664,7 +645,7 @@ public Set> levelKeys() { return this.levels.keySet(); } -@@ -1057,7 +1359,7 @@ +@@ -1062,7 +1359,7 @@ @DontObfuscate public String getServerModName() { @@ -673,7 +654,7 @@ } public SystemReport fillSystemReport(SystemReport systemreport) { -@@ -1398,11 +1700,11 @@ +@@ -1403,11 +1700,11 @@ public CompletableFuture reloadResources(Collection collection) { IRegistryCustom.Dimension iregistrycustom_dimension = this.registries.getAccessForLoading(RegistryLayer.RELOADABLE); CompletableFuture completablefuture = CompletableFuture.supplyAsync(() -> { @@ -687,7 +668,7 @@ }, this).thenCompose((immutablelist) -> { ResourceManager resourcemanager = new ResourceManager(EnumResourcePackType.SERVER_DATA, immutablelist); -@@ -1417,6 +1719,7 @@ +@@ -1422,6 +1719,7 @@ }).thenAcceptAsync((minecraftserver_reloadableresources) -> { this.resources.close(); this.resources = minecraftserver_reloadableresources; @@ -695,7 +676,7 @@ this.packRepository.setSelected(collection); WorldDataConfiguration worlddataconfiguration = new WorldDataConfiguration(getSelectedPacks(this.packRepository), this.worldData.enabledFeatures()); -@@ -1777,7 +2080,7 @@ +@@ -1778,7 +2076,7 @@ try { label51: { @@ -704,7 +685,7 @@ try { arraylist = Lists.newArrayList(NativeModuleLister.listModules()); -@@ -1827,6 +2130,22 @@ +@@ -1828,6 +2126,22 @@ } @@ -727,35 +708,15 @@ private void startMetricsRecordingTick() { if (this.willStartRecordingMetrics) { this.metricsRecorder = ActiveMetricsRecorder.createStarted(new ServerMetricsSamplersProvider(SystemUtils.timeSource, this.isDedicatedServer()), SystemUtils.timeSource, SystemUtils.ioPool(), new MetricsPersister("server"), this.onMetricsRecordingStopped, (path) -> { -@@ -1953,8 +2272,30 @@ +@@ -1954,6 +2268,11 @@ } + // CraftBukkit start + public final java.util.concurrent.ExecutorService chatExecutor = java.util.concurrent.Executors.newCachedThreadPool( + new com.google.common.util.concurrent.ThreadFactoryBuilder().setDaemon(true).setNameFormat("Async Chat Thread - #%d").build()); ++ // CraftBukkit end + public ChatDecorator getChatDecorator() { -- return ChatDecorator.PLAIN; -+ return (entityplayer, ichatbasecomponent) -> { -+ // SPIGOT-7127: Console /say and similar -+ if (entityplayer == null) { -+ return CompletableFuture.completedFuture(ichatbasecomponent); -+ } -+ -+ return CompletableFuture.supplyAsync(() -> { -+ AsyncPlayerChatPreviewEvent event = new AsyncPlayerChatPreviewEvent(true, entityplayer.getBukkitEntity(), CraftChatMessage.fromComponent(ichatbasecomponent), new LazyPlayerSet(this)); -+ String originalFormat = event.getFormat(), originalMessage = event.getMessage(); -+ this.server.getPluginManager().callEvent(event); -+ -+ if (originalFormat.equals(event.getFormat()) && originalMessage.equals(event.getMessage()) && event.getPlayer().getName().equalsIgnoreCase(event.getPlayer().getDisplayName())) { -+ return ichatbasecomponent; -+ } -+ -+ return CraftChatMessage.fromStringOrNull(String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage())); -+ }, chatExecutor); -+ }; -+ // CraftBukkit end + return ChatDecorator.PLAIN; } - - public static record ReloadableResources(IReloadableResourceManager resourceManager, DataPackResources managers) implements AutoCloseable { diff --git a/nms-patches/net/minecraft/server/ScoreboardServer.patch b/nms-patches/net/minecraft/server/ScoreboardServer.patch index 7625398a4..9aff50c32 100644 --- a/nms-patches/net/minecraft/server/ScoreboardServer.patch +++ b/nms-patches/net/minecraft/server/ScoreboardServer.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/ScoreboardServer.java +++ b/net/minecraft/server/ScoreboardServer.java -@@ -34,7 +34,7 @@ +@@ -37,7 +37,7 @@ public void onScoreChanged(ScoreboardScore scoreboardscore) { super.onScoreChanged(scoreboardscore); if (this.trackedObjectives.contains(scoreboardscore.getObjective())) { @@ -9,7 +9,7 @@ } this.setDirty(); -@@ -43,7 +43,7 @@ +@@ -46,7 +46,7 @@ @Override public void onPlayerRemoved(String s) { super.onPlayerRemoved(s); @@ -18,7 +18,7 @@ this.setDirty(); } -@@ -51,7 +51,7 @@ +@@ -54,7 +54,7 @@ public void onPlayerScoreRemoved(String s, ScoreboardObjective scoreboardobjective) { super.onPlayerScoreRemoved(s, scoreboardobjective); if (this.trackedObjectives.contains(scoreboardobjective)) { @@ -27,25 +27,25 @@ } this.setDirty(); -@@ -64,7 +64,7 @@ - super.setDisplayObjective(i, scoreboardobjective); +@@ -67,7 +67,7 @@ + super.setDisplayObjective(displayslot, scoreboardobjective); if (scoreboardobjective1 != scoreboardobjective && scoreboardobjective1 != null) { if (this.getObjectiveDisplaySlotCount(scoreboardobjective1) > 0) { -- this.server.getPlayerList().broadcastAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); -+ this.broadcastAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); +- this.server.getPlayerList().broadcastAll(new PacketPlayOutScoreboardDisplayObjective(displayslot, scoreboardobjective)); ++ this.broadcastAll(new PacketPlayOutScoreboardDisplayObjective(displayslot, scoreboardobjective)); } else { this.stopTrackingObjective(scoreboardobjective1); } -@@ -72,7 +72,7 @@ +@@ -75,7 +75,7 @@ if (scoreboardobjective != null) { if (this.trackedObjectives.contains(scoreboardobjective)) { -- this.server.getPlayerList().broadcastAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); -+ this.broadcastAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); +- this.server.getPlayerList().broadcastAll(new PacketPlayOutScoreboardDisplayObjective(displayslot, scoreboardobjective)); ++ this.broadcastAll(new PacketPlayOutScoreboardDisplayObjective(displayslot, scoreboardobjective)); } else { this.startTrackingObjective(scoreboardobjective); } -@@ -84,7 +84,7 @@ +@@ -87,7 +87,7 @@ @Override public boolean addPlayerToTeam(String s, ScoreboardTeam scoreboardteam) { if (super.addPlayerToTeam(s, scoreboardteam)) { @@ -54,7 +54,7 @@ this.setDirty(); return true; } else { -@@ -95,7 +95,7 @@ +@@ -98,7 +98,7 @@ @Override public void removePlayerFromTeam(String s, ScoreboardTeam scoreboardteam) { super.removePlayerFromTeam(s, scoreboardteam); @@ -63,7 +63,7 @@ this.setDirty(); } -@@ -109,7 +109,7 @@ +@@ -112,7 +112,7 @@ public void onObjectiveChanged(ScoreboardObjective scoreboardobjective) { super.onObjectiveChanged(scoreboardobjective); if (this.trackedObjectives.contains(scoreboardobjective)) { @@ -72,7 +72,7 @@ } this.setDirty(); -@@ -128,21 +128,21 @@ +@@ -131,21 +131,21 @@ @Override public void onTeamAdded(ScoreboardTeam scoreboardteam) { super.onTeamAdded(scoreboardteam); @@ -97,7 +97,7 @@ this.setDirty(); } -@@ -189,6 +189,7 @@ +@@ -196,6 +196,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); @@ -105,7 +105,7 @@ Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { -@@ -221,6 +222,7 @@ +@@ -232,6 +233,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); @@ -113,7 +113,7 @@ Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { -@@ -257,6 +259,16 @@ +@@ -276,6 +278,16 @@ return this.createData().load(nbttagcompound); } diff --git a/nms-patches/net/minecraft/server/bossevents/BossBattleCustom.patch b/nms-patches/net/minecraft/server/bossevents/BossBattleCustom.patch index 1a9e30de9..896ccb39e 100644 --- a/nms-patches/net/minecraft/server/bossevents/BossBattleCustom.patch +++ b/nms-patches/net/minecraft/server/bossevents/BossBattleCustom.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/bossevents/BossBattleCustom.java +++ b/net/minecraft/server/bossevents/BossBattleCustom.java -@@ -17,12 +17,27 @@ +@@ -18,12 +18,27 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.BossBattle; diff --git a/nms-patches/net/minecraft/server/dedicated/DedicatedServer.patch b/nms-patches/net/minecraft/server/dedicated/DedicatedServer.patch index 0e855c211..cbccc1a81 100644 --- a/nms-patches/net/minecraft/server/dedicated/DedicatedServer.patch +++ b/nms-patches/net/minecraft/server/dedicated/DedicatedServer.patch @@ -21,8 +21,8 @@ private final List consoleInput = Collections.synchronizedList(Lists.newArrayList()); @Nullable private RemoteStatusListener queryThreadGs4; -- public final RemoteControlCommandListener rconConsoleSource; -+ // public final RemoteControlCommandListener rconConsoleSource; // CraftBukkit - remove field +- private final RemoteControlCommandListener rconConsoleSource; ++ // private final RemoteControlCommandListener rconConsoleSource; // CraftBukkit - remove field @Nullable private RemoteControlListener rconThread; public DedicatedServerSettings settings; @@ -181,7 +181,7 @@ } } -@@ -539,16 +618,52 @@ +@@ -544,16 +623,52 @@ @Override public String getPluginNames() { @@ -238,7 +238,7 @@ } public void storeUsingWhiteList(boolean flag) { -@@ -599,4 +714,15 @@ +@@ -604,4 +719,15 @@ public Optional getServerResourcePack() { return this.settings.getProperties().serverResourcePackInfo; } diff --git a/nms-patches/net/minecraft/server/dedicated/DedicatedServerProperties.patch b/nms-patches/net/minecraft/server/dedicated/DedicatedServerProperties.patch index 18c047aec..c2ce26e7d 100644 --- a/nms-patches/net/minecraft/server/dedicated/DedicatedServerProperties.patch +++ b/nms-patches/net/minecraft/server/dedicated/DedicatedServerProperties.patch @@ -17,7 +17,7 @@ public final boolean onlineMode = this.get("online-mode", true); public final boolean preventProxyConnections = this.get("prevent-proxy-connections", false); public final String serverIp = this.get("server-ip", ""); -@@ -103,8 +108,10 @@ +@@ -104,8 +109,10 @@ private final DedicatedServerProperties.WorldDimensionData worldDimensionData; public final WorldOptions worldOptions; @@ -30,7 +30,7 @@ this.difficulty = (EnumDifficulty) this.get("difficulty", dispatchNumberOrString(EnumDifficulty::byId, EnumDifficulty::byName), EnumDifficulty::getKey, EnumDifficulty.EASY); this.gamemode = (EnumGamemode) this.get("gamemode", dispatchNumberOrString(EnumGamemode::byId, EnumGamemode::byName), EnumGamemode::getName, EnumGamemode.SURVIVAL); this.levelName = this.get("level-name", "world"); -@@ -160,13 +167,15 @@ +@@ -162,13 +169,15 @@ this.initialDataPackConfiguration = getDatapackConfig(this.get("initial-enabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getEnabled())), this.get("initial-disabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getDisabled()))); } @@ -50,7 +50,7 @@ } @Nullable -@@ -247,10 +256,10 @@ +@@ -249,10 +258,10 @@ }).orElseThrow(() -> { return new IllegalStateException("Invalid datapack contents: can't find default preset"); }); @@ -63,7 +63,7 @@ }); Objects.requireNonNull(iregistry); -@@ -262,7 +271,7 @@ +@@ -264,7 +273,7 @@ if (holder.is(WorldPresets.FLAT)) { RegistryOps registryops = RegistryOps.create(JsonOps.INSTANCE, (HolderLookup.b) iregistrycustom); diff --git a/nms-patches/net/minecraft/server/level/EntityPlayer.patch b/nms-patches/net/minecraft/server/level/EntityPlayer.patch index afad15411..fa6dcbba5 100644 --- a/nms-patches/net/minecraft/server/level/EntityPlayer.patch +++ b/nms-patches/net/minecraft/server/level/EntityPlayer.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/server/level/EntityPlayer.java +++ b/net/minecraft/server/level/EntityPlayer.java -@@ -155,6 +155,38 @@ +@@ -151,6 +151,37 @@ import net.minecraft.world.scores.criteria.IScoreboardCriteria; import org.slf4j.Logger; +// CraftBukkit start -+import net.minecraft.core.Position; +import net.minecraft.nbt.NBTBase; +import net.minecraft.world.damagesource.CombatTracker; +import net.minecraft.world.food.FoodMetaData; @@ -39,8 +38,17 @@ public class EntityPlayer extends EntityHuman { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -212,6 +244,21 @@ - public int latency; +@@ -185,7 +216,7 @@ + private int levitationStartTime; + private boolean disconnected; + private int requestedViewDistance; +- public String language; ++ public String language = "en_us"; // CraftBukkit - default + @Nullable + private Vec3D startingToFallPosition; + @Nullable +@@ -210,6 +241,20 @@ + private int containerCounter; public boolean wonGame; + // CraftBukkit start @@ -54,17 +62,16 @@ + public double maxHealthCache; + public boolean joining = true; + public boolean sentListPacket = false; -+ public Integer clientViewDistance; + public String kickLeaveMessage = null; // SPIGOT-3034: Forward leave message to PlayerQuitEvent + // CraftBukkit end + - public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile) { + public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, ClientInformation clientinformation) { super(worldserver, worldserver.getSharedSpawnPos(), worldserver.getSharedSpawnAngle(), gameprofile); this.chatVisibility = EnumChatVisibility.FULL; -@@ -274,12 +321,56 @@ - this.advancements = minecraftserver.getPlayerList().getPlayerAdvancements(this); +@@ -276,12 +321,56 @@ this.setMaxUpStep(1.0F); this.fudgeSpawnLocation(worldserver); + this.updateOptions(clientinformation); + + // CraftBukkit start + this.displayName = this.getScoreboardName(); @@ -119,7 +126,7 @@ int i = Math.max(0, this.server.getSpawnRadius(worldserver)); int j = MathHelper.floor(worldserver.getWorldBorder().getDistanceToBorder((double) blockposition.getX(), (double) blockposition.getZ())); -@@ -328,7 +419,7 @@ +@@ -330,7 +419,7 @@ public void readAdditionalSaveData(NBTTagCompound nbttagcompound) { super.readAdditionalSaveData(nbttagcompound); if (nbttagcompound.contains("warden_spawn_tracker", 10)) { @@ -128,7 +135,7 @@ Logger logger = EntityPlayer.LOGGER; Objects.requireNonNull(logger); -@@ -347,17 +438,26 @@ +@@ -349,17 +438,26 @@ if (nbttagcompound.contains("recipeBook", 10)) { this.recipeBook.fromNbt(nbttagcompound.getCompound("recipeBook"), this.server.getRecipeManager()); } @@ -156,7 +163,7 @@ Logger logger1 = EntityPlayer.LOGGER; Objects.requireNonNull(logger1); -@@ -370,7 +470,7 @@ +@@ -372,7 +470,7 @@ @Override public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); @@ -165,7 +172,7 @@ Logger logger = EntityPlayer.LOGGER; Objects.requireNonNull(logger); -@@ -391,7 +491,20 @@ +@@ -393,7 +491,20 @@ Entity entity = this.getRootVehicle(); Entity entity1 = this.getVehicle(); @@ -187,7 +194,7 @@ NBTTagCompound nbttagcompound2 = new NBTTagCompound(); NBTTagCompound nbttagcompound3 = new NBTTagCompound(); -@@ -416,8 +529,32 @@ +@@ -418,8 +529,32 @@ nbttagcompound.put("SpawnDimension", nbtbase); }); } @@ -220,7 +227,7 @@ public void setExperiencePoints(int i) { float f = (float) this.getXpNeededForNextLevel(); -@@ -477,6 +614,11 @@ +@@ -479,6 +614,11 @@ @Override public void tick() { @@ -232,7 +239,7 @@ this.gameMode.tick(); this.wardenSpawnTracker.tick(); --this.spawnInvulnerableTime; -@@ -533,7 +675,7 @@ +@@ -535,7 +675,7 @@ } if (this.getHealth() != this.lastSentHealth || this.lastSentFood != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.lastFoodSaturationZero) { @@ -241,7 +248,7 @@ this.lastSentHealth = this.getHealth(); this.lastSentFood = this.foodData.getFoodLevel(); this.lastFoodSaturationZero = this.foodData.getSaturationLevel() == 0.0F; -@@ -564,6 +706,12 @@ +@@ -566,6 +706,12 @@ this.updateScoreForCriteria(IScoreboardCriteria.EXPERIENCE, MathHelper.ceil((float) this.lastRecordedExperience)); } @@ -254,7 +261,7 @@ if (this.experienceLevel != this.lastRecordedLevel) { this.lastRecordedLevel = this.experienceLevel; this.updateScoreForCriteria(IScoreboardCriteria.LEVEL, MathHelper.ceil((float) this.lastRecordedLevel)); -@@ -578,6 +726,20 @@ +@@ -580,6 +726,20 @@ CriterionTriggers.LOCATION.trigger(this); } @@ -275,7 +282,7 @@ } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Ticking player"); CrashReportSystemDetails crashreportsystemdetails = crashreport.addCategory("Player being ticked"); -@@ -620,7 +782,8 @@ +@@ -622,7 +782,8 @@ } private void updateScoreForCriteria(IScoreboardCriteria iscoreboardcriteria, int i) { @@ -285,7 +292,7 @@ scoreboardscore.setScore(i); }); } -@@ -629,9 +792,47 @@ +@@ -631,9 +792,47 @@ public void die(DamageSource damagesource) { this.gameEvent(GameEvent.ENTITY_DIE); boolean flag = this.level().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); @@ -335,7 +342,7 @@ this.connection.send(new ClientboundPlayerCombatKillPacket(this.getId(), ichatbasecomponent), PacketSendListener.exceptionallySend(() -> { boolean flag1 = true; -@@ -662,12 +863,18 @@ +@@ -664,12 +863,18 @@ if (this.level().getGameRules().getBoolean(GameRules.RULE_FORGIVE_DEAD_PLAYERS)) { this.tellNeutralMobsThatIDied(); } @@ -358,7 +365,7 @@ EntityLiving entityliving = this.getKillCredit(); if (entityliving != null) { -@@ -705,10 +912,12 @@ +@@ -707,10 +912,12 @@ String s = this.getScoreboardName(); String s1 = entity.getScoreboardName(); @@ -373,7 +380,7 @@ } else { this.awardStat(StatisticList.MOB_KILLS); } -@@ -726,7 +935,8 @@ +@@ -728,7 +935,8 @@ int i = scoreboardteam.getColor().getId(); if (i >= 0 && i < aiscoreboardcriteria.length) { @@ -383,7 +390,7 @@ } } -@@ -776,18 +986,20 @@ +@@ -778,18 +986,20 @@ } private boolean isPvpAllowed() { @@ -407,7 +414,7 @@ } else { return shapedetectorshape; } -@@ -796,11 +1008,20 @@ +@@ -798,11 +1008,20 @@ @Nullable @Override public Entity changeDimension(WorldServer worldserver) { @@ -431,7 +438,7 @@ this.unRide(); this.serverLevel().removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); if (!this.wonGame) { -@@ -811,6 +1032,8 @@ +@@ -813,6 +1032,8 @@ return this; } else { @@ -439,8 +446,8 @@ + /* WorldData worlddata = worldserver.getLevelData(); - this.connection.send(new PacketPlayOutRespawn(worldserver.dimensionTypeId(), worldserver.dimension(), BiomeManager.obfuscateSeed(worldserver.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), (byte) 3, this.getLastDeathLocation(), this.getPortalCooldown())); -@@ -820,20 +1043,50 @@ + this.connection.send(new PacketPlayOutRespawn(this.createCommonSpawnInfo(worldserver), (byte) 3)); +@@ -822,20 +1043,50 @@ playerlist.sendPlayerPermissionLevel(this); worldserver1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); @@ -479,7 +486,7 @@ + if (true) { // CraftBukkit + this.isChangingDimension = true; // CraftBukkit - Set teleport invulnerability only if player changing worlds + -+ this.connection.send(new PacketPlayOutRespawn(worldserver.dimensionTypeId(), worldserver.dimension(), BiomeManager.obfuscateSeed(worldserver.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), (byte) 3, this.getLastDeathLocation(), this.getPortalCooldown())); ++ this.connection.send(new PacketPlayOutRespawn(this.createCommonSpawnInfo(worldserver), (byte) 3)); + this.connection.send(new PacketPlayOutServerDifficulty(this.level().getDifficulty(), this.level().getLevelData().isDifficultyLocked())); + PlayerList playerlist = this.server.getPlayerList(); + @@ -496,7 +503,7 @@ this.connection.resetPosition(); worldserver.addDuringPortalTeleport(this); worldserver1.getProfiler().pop(); -@@ -853,39 +1106,66 @@ +@@ -855,39 +1106,66 @@ this.lastSentExp = -1; this.lastSentHealth = -1.0F; this.lastSentFood = -1; @@ -513,7 +520,7 @@ + // CraftBukkit start + @Override -+ protected CraftPortalEvent callPortalEvent(Entity entity, WorldServer exitWorldServer, Position exitPosition, TeleportCause cause, int searchRadius, int creationRadius) { ++ protected CraftPortalEvent callPortalEvent(Entity entity, WorldServer exitWorldServer, Vec3D exitPosition, TeleportCause cause, int searchRadius, int creationRadius) { + Location enter = this.getBukkitEntity().getLocation(); + Location exit = CraftLocation.toBukkit(exitPosition, exitWorldServer.getWorld(), getYRot(), getXRot()); + PlayerPortalEvent event = new PlayerPortalEvent(this.getBukkitEntity(), enter, exit, cause, searchRadius, true, creationRadius); @@ -563,13 +570,13 @@ - Optional optional1 = worldserver.getPortalForcer().createPortal(blockposition, enumdirection_enumaxis); + Optional optional1 = worldserver.getPortalForcer().createPortal(blockposition, enumdirection_enumaxis, this, createRadius); // CraftBukkit - if (!optional1.isPresent()) { + if (optional1.isEmpty()) { - EntityPlayer.LOGGER.error("Unable to create a portal, likely target out of worldborder"); + // EntityPlayer.LOGGER.error("Unable to create a portal, likely target out of worldborder"); // CraftBukkit } return optional1; -@@ -895,13 +1175,21 @@ +@@ -897,13 +1175,21 @@ public void triggerDimensionChangeTriggers(WorldServer worldserver) { ResourceKey resourcekey = worldserver.dimension(); ResourceKey resourcekey1 = this.level().dimension(); @@ -594,7 +601,7 @@ this.enteredNetherPosition = null; } -@@ -918,19 +1206,17 @@ +@@ -920,19 +1206,17 @@ this.containerMenu.broadcastChanges(); } @@ -618,7 +625,7 @@ if (this.level().isDay()) { return Either.left(EntityHuman.EnumBedResult.NOT_POSSIBLE_NOW); } else { -@@ -947,7 +1233,36 @@ +@@ -949,7 +1233,36 @@ } } @@ -656,7 +663,7 @@ this.awardStat(StatisticList.SLEEP_IN_BED); CriterionTriggers.SLEPT_IN_BED.trigger(this); }); -@@ -960,9 +1275,8 @@ +@@ -962,9 +1275,8 @@ return either; } } @@ -667,7 +674,7 @@ } @Override -@@ -989,13 +1303,31 @@ +@@ -991,13 +1303,31 @@ @Override public void stopSleepInBed(boolean flag, boolean flag1) { @@ -700,7 +707,7 @@ } } -@@ -1037,8 +1369,9 @@ +@@ -1039,8 +1369,9 @@ this.connection.send(new PacketPlayOutOpenSignEditor(tileentitysign.getBlockPos(), flag)); } @@ -711,7 +718,7 @@ } @Override -@@ -1046,13 +1379,35 @@ +@@ -1048,13 +1379,35 @@ if (itileinventory == null) { return OptionalInt.empty(); } else { @@ -747,7 +754,7 @@ if (container == null) { if (this.isSpectator()) { this.displayClientMessage(IChatBaseComponent.translatable("container.spectatorCantOpen").withStyle(EnumChatFormat.RED), true); -@@ -1060,9 +1415,11 @@ +@@ -1062,9 +1415,11 @@ return OptionalInt.empty(); } else { @@ -761,7 +768,7 @@ return OptionalInt.of(this.containerCounter); } } -@@ -1075,13 +1432,24 @@ +@@ -1077,13 +1432,24 @@ @Override public void openHorseInventory(EntityHorseAbstract entityhorseabstract, IInventory iinventory) { @@ -788,7 +795,7 @@ this.initMenu(this.containerMenu); } -@@ -1104,6 +1472,7 @@ +@@ -1106,6 +1472,7 @@ @Override public void closeContainer() { @@ -796,7 +803,7 @@ this.connection.send(new PacketPlayOutCloseWindow(this.containerMenu.containerId)); this.doCloseContainer(); } -@@ -1126,6 +1495,16 @@ +@@ -1128,6 +1495,16 @@ } this.jumping = flag; @@ -813,7 +820,7 @@ this.setShiftKeyDown(flag1); } -@@ -1134,7 +1513,7 @@ +@@ -1136,7 +1513,7 @@ @Override public void awardStat(Statistic statistic, int i) { this.stats.increment(this, statistic, i); @@ -822,7 +829,7 @@ scoreboardscore.add(i); }); } -@@ -1142,7 +1521,7 @@ +@@ -1144,7 +1521,7 @@ @Override public void resetStat(Statistic statistic) { this.stats.setValue(this, statistic, 0); @@ -831,16 +838,16 @@ } @Override -@@ -1163,7 +1542,7 @@ +@@ -1165,7 +1542,7 @@ for (int j = 0; j < i; ++j) { MinecraftKey minecraftkey = aminecraftkey1[j]; - Optional optional = this.server.getRecipeManager().byKey(minecraftkey); -+ Optional> optional = this.server.getRecipeManager().byKey(minecraftkey); // CraftBukkit - decompile error ++ Optional> optional = this.server.getRecipeManager().byKey(minecraftkey); // CraftBukkit - decompile error Objects.requireNonNull(list); optional.ifPresent(list::add); -@@ -1198,6 +1577,7 @@ +@@ -1200,6 +1577,7 @@ public void resetSentInfo() { this.lastSentHealth = -1.0E8F; @@ -848,7 +855,7 @@ } @Override -@@ -1256,7 +1636,7 @@ +@@ -1257,7 +1635,7 @@ this.lastSentExp = -1; this.lastSentHealth = -1.0F; this.lastSentFood = -1; @@ -856,8 +863,8 @@ + // this.recipeBook.copyOverData(entityplayer.recipeBook); // CraftBukkit this.seenCredits = entityplayer.seenCredits; this.enteredNetherPosition = entityplayer.enteredNetherPosition; - this.setShoulderEntityLeft(entityplayer.getShoulderEntityLeft()); -@@ -1306,6 +1686,12 @@ + this.chunkTrackingView = entityplayer.chunkTrackingView; +@@ -1308,6 +1686,12 @@ @Override public boolean teleportTo(WorldServer worldserver, double d0, double d1, double d2, Set set, float f, float f1) { @@ -870,7 +877,7 @@ ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(BlockPosition.containing(d0, d1, d2)); worldserver.getChunkSource().addRegionTicket(TicketType.POST_TELEPORT, chunkcoordintpair, 1, this.getId()); -@@ -1315,9 +1701,9 @@ +@@ -1317,9 +1701,9 @@ } if (worldserver == this.level()) { @@ -882,28 +889,24 @@ } this.setYHeadRot(f); -@@ -1420,7 +1806,20 @@ - } +@@ -1423,6 +1807,16 @@ } -+ public String locale = "en_us"; // CraftBukkit - add, lowercase - public void updateOptions(PacketPlayInSettings packetplayinsettings) { + public void updateOptions(ClientInformation clientinformation) { + // CraftBukkit start -+ if (getMainArm() != packetplayinsettings.mainHand()) { ++ if (getMainArm() != clientinformation.mainHand()) { + PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(getBukkitEntity(), getMainArm() == EnumMainHand.LEFT ? MainHand.LEFT : MainHand.RIGHT); + this.server.server.getPluginManager().callEvent(event); + } -+ if (!this.locale.equals(packetplayinsettings.language)) { -+ PlayerLocaleChangeEvent event = new PlayerLocaleChangeEvent(getBukkitEntity(), packetplayinsettings.language); ++ if (!this.language.equals(clientinformation.language())) { ++ PlayerLocaleChangeEvent event = new PlayerLocaleChangeEvent(getBukkitEntity(), clientinformation.language()); + this.server.server.getPluginManager().callEvent(event); + } -+ this.locale = packetplayinsettings.language; -+ this.clientViewDistance = packetplayinsettings.viewDistance; + // CraftBukkit end - this.chatVisibility = packetplayinsettings.chatVisibility(); - this.canChatColor = packetplayinsettings.chatColors(); - this.textFilteringEnabled = packetplayinsettings.textFilteringEnabled(); -@@ -1495,7 +1894,7 @@ + this.language = clientinformation.language(); + this.requestedViewDistance = clientinformation.viewDistance(); + this.chatVisibility = clientinformation.chatVisibility(); +@@ -1506,7 +1900,7 @@ if (world instanceof WorldServer) { WorldServer worldserver = (WorldServer) world; @@ -912,7 +915,7 @@ } if (entity != null) { -@@ -1532,7 +1931,7 @@ +@@ -1543,7 +1937,7 @@ @Nullable public IChatBaseComponent getTabListDisplayName() { @@ -921,7 +924,7 @@ } @Override -@@ -1553,9 +1952,16 @@ +@@ -1564,9 +1958,16 @@ return this.advancements; } @@ -938,7 +941,7 @@ if (worldserver == this.level()) { this.connection.teleport(d0, d1, d2, f, f1); } else { -@@ -1575,6 +1981,9 @@ +@@ -1586,6 +1987,9 @@ this.server.getPlayerList().sendLevelInfo(this, worldserver); this.server.getPlayerList().sendAllPlayerInfo(this); } @@ -948,7 +951,7 @@ } -@@ -1596,6 +2005,32 @@ +@@ -1607,6 +2011,32 @@ } public void setRespawnPosition(ResourceKey resourcekey, @Nullable BlockPosition blockposition, float f, boolean flag, boolean flag1) { @@ -981,9 +984,9 @@ if (blockposition != null) { boolean flag2 = blockposition.equals(this.respawnPosition) && resourcekey.equals(this.respawnDimension); -@@ -1805,4 +2240,146 @@ - } - +@@ -1812,4 +2242,146 @@ + public CommonPlayerSpawnInfo createCommonSpawnInfo(WorldServer worldserver) { + return new CommonPlayerSpawnInfo(worldserver.dimensionTypeId(), worldserver.dimension(), BiomeManager.obfuscateSeed(worldserver.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), this.getLastDeathLocation(), this.getPortalCooldown()); } + + // CraftBukkit start - Add per-player time and weather. diff --git a/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch b/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch index eabb5faf6..8c3091e92 100644 --- a/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch +++ b/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch @@ -13,7 +13,7 @@ public class EntityTrackerEntry { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -63,8 +69,12 @@ +@@ -66,8 +72,12 @@ private boolean wasOnGround; @Nullable private List> trackedDataValues; @@ -27,7 +27,7 @@ this.ap = Vec3D.ZERO; this.lastPassengers = Collections.emptyList(); this.level = worldserver; -@@ -84,7 +94,7 @@ +@@ -87,7 +97,7 @@ List list = this.entity.getPassengers(); if (!list.equals(this.lastPassengers)) { @@ -36,7 +36,7 @@ removedPassengers(list, this.lastPassengers).forEach((entity) -> { if (entity instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer) entity; -@@ -101,18 +111,18 @@ +@@ -104,18 +114,18 @@ if (entity instanceof EntityItemFrame) { EntityItemFrame entityitemframe = (EntityItemFrame) entity; @@ -59,7 +59,7 @@ worldmap.tickCarriedBy(entityplayer, itemstack); Packet packet = worldmap.getUpdatePacket(integer, entityplayer); -@@ -225,7 +235,27 @@ +@@ -228,7 +238,27 @@ ++this.tickCount; if (this.entity.hurtMarked) { @@ -88,7 +88,7 @@ this.entity.hurtMarked = false; } -@@ -253,7 +283,10 @@ +@@ -256,7 +286,10 @@ public void sendPairingData(EntityPlayer entityplayer, Consumer> consumer) { if (this.entity.isRemoved()) { @@ -100,7 +100,7 @@ } Packet packet = this.entity.getAddEntityPacket(); -@@ -269,6 +302,12 @@ +@@ -272,6 +305,12 @@ if (this.entity instanceof EntityLiving) { Collection collection = ((EntityLiving) this.entity).getAttributes().getSyncableAttributes(); @@ -113,7 +113,7 @@ if (!collection.isEmpty()) { consumer.accept(new PacketPlayOutUpdateAttributes(this.entity.getId(), collection)); } -@@ -300,8 +339,15 @@ +@@ -303,8 +342,15 @@ if (!list.isEmpty()) { consumer.accept(new PacketPlayOutEntityEquipment(this.entity.getId(), list)); } @@ -129,7 +129,7 @@ if (!this.entity.getPassengers().isEmpty()) { consumer.accept(new PacketPlayOutMount(this.entity)); } -@@ -333,6 +379,11 @@ +@@ -338,6 +384,11 @@ Set set = ((EntityLiving) this.entity).getAttributes().getDirtyAttributes(); if (!set.isEmpty()) { diff --git a/nms-patches/net/minecraft/server/level/PlayerChunk.patch b/nms-patches/net/minecraft/server/level/PlayerChunk.patch index 35211d2ad..67d9bd0f2 100644 --- a/nms-patches/net/minecraft/server/level/PlayerChunk.patch +++ b/nms-patches/net/minecraft/server/level/PlayerChunk.patch @@ -11,7 +11,7 @@ public class PlayerChunk { public static final Either UNLOADED_CHUNK = Either.right(PlayerChunk.Failure.UNLOADED); -@@ -71,11 +75,11 @@ +@@ -72,12 +76,12 @@ this.fullChunkFuture = PlayerChunk.UNLOADED_LEVEL_CHUNK_FUTURE; this.tickingChunkFuture = PlayerChunk.UNLOADED_LEVEL_CHUNK_FUTURE; this.entityTickingChunkFuture = PlayerChunk.UNLOADED_LEVEL_CHUNK_FUTURE; @@ -21,11 +21,13 @@ this.blockChangedLightSectionFilter = new BitSet(); this.skyChangedLightSectionFilter = new BitSet(); - this.pendingFullStateConfirmation = CompletableFuture.completedFuture((Object) null); +- this.sendSync = CompletableFuture.completedFuture((Object) null); + this.pendingFullStateConfirmation = CompletableFuture.completedFuture(null); // CraftBukkit - decompile error ++ this.sendSync = CompletableFuture.completedFuture(null); // CraftBukkit - decompile error this.pos = chunkcoordintpair; this.levelHeightAccessor = levelheightaccessor; this.lightEngine = levellightengine; -@@ -88,6 +92,20 @@ +@@ -90,6 +94,20 @@ this.changedBlocksPerSection = new ShortSet[levelheightaccessor.getSectionsCount()]; } @@ -46,7 +48,7 @@ public CompletableFuture> getFutureIfPresentUnchecked(ChunkStatus chunkstatus) { CompletableFuture> completablefuture = (CompletableFuture) this.futures.get(chunkstatus.getIndex()); -@@ -113,17 +131,17 @@ +@@ -115,9 +133,9 @@ @Nullable public Chunk getTickingChunk() { CompletableFuture> completablefuture = this.getTickingChunkFuture(); @@ -57,6 +59,8 @@ + return either == null ? null : (Chunk) either.left().orElse(null); // CraftBukkit - decompile error } + public CompletableFuture getChunkSendSyncFuture() { +@@ -132,9 +150,9 @@ @Nullable public Chunk getFullChunk() { CompletableFuture> completablefuture = this.getFullChunkFuture(); @@ -68,7 +72,7 @@ } @Nullable -@@ -168,6 +186,7 @@ +@@ -179,6 +197,7 @@ if (chunk != null) { int i = this.levelHeightAccessor.getSectionIndex(blockposition.getY()); @@ -76,7 +80,7 @@ if (this.changedBlocksPerSection[i] == null) { this.hasChangedSections = true; this.changedBlocksPerSection[i] = new ShortOpenHashSet(); -@@ -178,10 +197,10 @@ +@@ -189,10 +208,10 @@ } public void sectionLightChanged(EnumSkyBlock enumskyblock, int i) { @@ -89,7 +93,7 @@ if (ichunkaccess != null) { ichunkaccess.setUnsaved(true); -@@ -246,8 +265,11 @@ +@@ -257,8 +276,11 @@ PacketPlayOutMultiBlockChange packetplayoutmultiblockchange = new PacketPlayOutMultiBlockChange(sectionposition, shortset, chunksection); this.broadcast(list, packetplayoutmultiblockchange); @@ -102,7 +106,7 @@ }); } } -@@ -372,7 +394,7 @@ +@@ -394,7 +416,7 @@ this.pendingFullStateConfirmation = completablefuture1; completablefuture.thenAccept((either) -> { either.ifLeft((chunk) -> { @@ -111,7 +115,7 @@ }); }); } -@@ -389,6 +411,30 @@ +@@ -411,6 +433,30 @@ boolean flag1 = ChunkLevel.isLoaded(this.ticketLevel); FullChunkStatus fullchunkstatus = ChunkLevel.fullStatus(this.oldTicketLevel); FullChunkStatus fullchunkstatus1 = ChunkLevel.fullStatus(this.ticketLevel); @@ -142,7 +146,7 @@ if (flag) { Either either = Either.right(new PlayerChunk.Failure() { -@@ -459,6 +505,26 @@ +@@ -481,6 +527,26 @@ this.onLevelChange.onLevelChange(this.pos, this::getQueueLevel, this.ticketLevel, this::setQueueLevel); this.oldTicketLevel = this.ticketLevel; diff --git a/nms-patches/net/minecraft/server/level/PlayerChunkMap.patch b/nms-patches/net/minecraft/server/level/PlayerChunkMap.patch index 91a533790..111579484 100644 --- a/nms-patches/net/minecraft/server/level/PlayerChunkMap.patch +++ b/nms-patches/net/minecraft/server/level/PlayerChunkMap.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/server/level/PlayerChunkMap.java +++ b/net/minecraft/server/level/PlayerChunkMap.java -@@ -109,6 +109,12 @@ - import org.apache.commons.lang3.mutable.MutableObject; +@@ -101,6 +101,12 @@ + import org.apache.commons.lang3.mutable.MutableBoolean; import org.slf4j.Logger; +// CraftBukkit start @@ -13,9 +13,9 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { private static final byte CHUNK_TYPE_REPLACEABLE = -1; -@@ -151,6 +157,27 @@ +@@ -143,6 +149,27 @@ private final Queue unloadQueue; - int viewDistance; + private int serverViewDistance; + // CraftBukkit start - recursion-safe executor for Chunk loadCallback() and unloadCallback() + public final CallbackExecutor callbackExecutor = new CallbackExecutor(); @@ -41,7 +41,7 @@ public PlayerChunkMap(WorldServer worldserver, Convertable.ConversionSession convertable_conversionsession, DataFixer datafixer, StructureTemplateManager structuretemplatemanager, Executor executor, IAsyncTaskHandler iasynctaskhandler, ILightAccess ilightaccess, ChunkGenerator chunkgenerator, WorldLoadListener worldloadlistener, ChunkStatusUpdateListener chunkstatusupdatelistener, Supplier supplier, int i, boolean flag) { super(convertable_conversionsession.getDimensionPath(worldserver.dimension()).resolve("region"), datafixer, flag); this.visibleChunkMap = this.updatingChunkMap.clone(); -@@ -169,6 +196,11 @@ +@@ -161,6 +188,11 @@ this.storageName = path.getFileName().toString(); this.level = worldserver; this.generator = chunkgenerator; @@ -53,7 +53,7 @@ IRegistryCustom iregistrycustom = worldserver.registryAccess(); long j = worldserver.getSeed(); -@@ -335,9 +367,12 @@ +@@ -332,9 +364,12 @@ CompletableFuture>> completablefuture1 = SystemUtils.sequence(list); CompletableFuture, PlayerChunk.Failure>> completablefuture2 = completablefuture1.thenApply((list2) -> { List list3 = Lists.newArrayList(); @@ -68,7 +68,7 @@ final Either either = (Either) iterator.next(); if (either == null) { -@@ -543,7 +578,7 @@ +@@ -540,7 +575,7 @@ private void scheduleUnload(long i, PlayerChunk playerchunk) { CompletableFuture completablefuture = playerchunk.getChunkToSave(); @@ -77,7 +77,7 @@ CompletableFuture completablefuture1 = playerchunk.getChunkToSave(); if (completablefuture1 != completablefuture) { -@@ -634,9 +669,9 @@ +@@ -631,9 +666,9 @@ ProtoChunk protochunk = ChunkRegionLoader.read(this.level, this.poiManager, chunkcoordintpair, (NBTTagCompound) optional.get()); this.markPosition(chunkcoordintpair, protochunk.getStatus().getChunkType()); @@ -89,7 +89,7 @@ } }, this.mainThreadExecutor).exceptionallyAsync((throwable) -> { return this.handleChunkLoadFailure(throwable, chunkcoordintpair); -@@ -751,7 +786,21 @@ +@@ -748,7 +783,21 @@ private static void postLoadProtoChunk(WorldServer worldserver, List list) { if (!list.isEmpty()) { @@ -112,7 +112,7 @@ } } -@@ -852,7 +901,7 @@ +@@ -860,7 +909,7 @@ if (!playerchunk.wasAccessibleSinceLastSave()) { return false; } else { @@ -121,7 +121,7 @@ if (!(ichunkaccess instanceof ProtoChunkExtension) && !(ichunkaccess instanceof Chunk)) { return false; -@@ -1014,7 +1063,8 @@ +@@ -1017,7 +1066,8 @@ return ichunkaccess instanceof Chunk ? Optional.of((Chunk) ichunkaccess) : Optional.empty(); }); @@ -131,7 +131,7 @@ return chunk.getBlockEntities().size(); }).orElse(0), tickingtracker.getTicketDebugString(i), tickingtracker.getLevel(i), optional1.map((chunk) -> { return chunk.getBlockTicks().count(); -@@ -1027,7 +1077,7 @@ +@@ -1030,7 +1080,7 @@ private static String printFuture(CompletableFuture> completablefuture) { try { @@ -140,7 +140,7 @@ return either != null ? (String) either.map((chunk) -> { return "done"; -@@ -1043,12 +1093,14 @@ +@@ -1046,12 +1096,14 @@ private CompletableFuture> readChunk(ChunkCoordIntPair chunkcoordintpair) { return this.read(chunkcoordintpair).thenApplyAsync((optional) -> { @@ -158,7 +158,7 @@ } boolean anyPlayerCloseEnoughForSpawning(ChunkCoordIntPair chunkcoordintpair) { -@@ -1503,7 +1555,7 @@ +@@ -1460,7 +1512,7 @@ public final Set seenBy = Sets.newIdentityHashSet(); public EntityTracker(Entity entity, int i, int j, boolean flag) { @@ -167,9 +167,9 @@ this.entity = entity; this.range = i; this.lastSectionPos = SectionPosition.of((EntityAccess) entity); -@@ -1562,6 +1614,11 @@ +@@ -1520,6 +1572,11 @@ double d2 = d0 * d0; - boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(entityplayer); + boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(entityplayer) && PlayerChunkMap.this.isChunkTracked(entityplayer, this.entity.chunkPosition().x, this.entity.chunkPosition().z); + // CraftBukkit start - respect vanish API + if (!entityplayer.getBukkitEntity().canSee(this.entity.getBukkitEntity())) { diff --git a/nms-patches/net/minecraft/server/level/WorldServer.patch b/nms-patches/net/minecraft/server/level/WorldServer.patch index 00f6dd003..830e23abf 100644 --- a/nms-patches/net/minecraft/server/level/WorldServer.patch +++ b/nms-patches/net/minecraft/server/level/WorldServer.patch @@ -95,7 +95,7 @@ boolean flag2 = minecraftserver.forceSynchronousWrites(); DataFixer datafixer = minecraftserver.getFixerUpper(); EntityPersistentStorage entitypersistentstorage = new EntityStorage(this, convertable_conversionsession.getDimensionPath(resourcekey).resolve("entities"), datafixer, flag2, minecraftserver); -@@ -250,9 +304,9 @@ +@@ -246,9 +300,9 @@ long l = minecraftserver.getWorldData().worldGenOptions().seed(); this.structureCheck = new StructureCheck(this.chunkSource.chunkScanner(), this.registryAccess(), minecraftserver.getStructureManager(), resourcekey, chunkgenerator, this.chunkSource.randomState(), this, chunkgenerator.getBiomeSource(), l, datafixer); @@ -108,15 +108,15 @@ } else { this.dragonFight = null; } -@@ -266,6 +320,7 @@ - return new RandomSequences(l); - }, "random_sequences"); +@@ -258,6 +312,7 @@ + this.randomSequences = (RandomSequences) Objects.requireNonNullElseGet(randomsequences, () -> { + return (RandomSequences) this.getDataStorage().computeIfAbsent(RandomSequences.factory(l), "random_sequences"); }); + this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit } /** @deprecated */ -@@ -304,12 +359,20 @@ +@@ -296,12 +351,20 @@ long j; if (this.sleepStatus.areEnoughSleeping(i) && this.sleepStatus.areEnoughDeepSleeping(i, this.players)) { @@ -140,7 +140,7 @@ if (this.getGameRules().getBoolean(GameRules.RULE_WEATHER_CYCLE) && this.isRaining()) { this.resetWeatherCycle(); } -@@ -335,7 +398,7 @@ +@@ -327,7 +390,7 @@ this.runBlockEvents(); this.handlingTick = false; gameprofilerfiller.pop(); @@ -149,7 +149,7 @@ if (flag) { this.resetEmptyTime(); -@@ -351,7 +414,7 @@ +@@ -343,7 +406,7 @@ this.entityTickList.forEach((entity) -> { if (!entity.isRemoved()) { @@ -158,7 +158,7 @@ entity.discard(); } else { gameprofilerfiller.push("checkDespawn"); -@@ -423,7 +486,7 @@ +@@ -415,7 +478,7 @@ private void wakeUpAllPlayers() { this.sleepStatus.removeAllSleepers(); @@ -167,7 +167,7 @@ entityplayer.stopSleepInBed(false, false); }); } -@@ -451,7 +514,7 @@ +@@ -442,7 +505,7 @@ entityhorseskeleton.setTrap(true); entityhorseskeleton.setAge(0); entityhorseskeleton.setPos((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); @@ -176,7 +176,7 @@ } } -@@ -460,7 +523,7 @@ +@@ -451,7 +514,7 @@ if (entitylightning != null) { entitylightning.moveTo(Vec3D.atBottomCenterOf(blockposition)); entitylightning.setVisualOnly(flag1); @@ -185,29 +185,29 @@ } } } -@@ -475,7 +538,7 @@ - BiomeBase biomebase = (BiomeBase) this.getBiome(blockposition).value(); +@@ -506,7 +569,7 @@ + BiomeBase biomebase = (BiomeBase) this.getBiome(blockposition1).value(); - if (biomebase.shouldFreeze(this, blockposition1)) { -- this.setBlockAndUpdate(blockposition1, Blocks.ICE.defaultBlockState()); -+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, blockposition1, Blocks.ICE.defaultBlockState(), null); // CraftBukkit + if (biomebase.shouldFreeze(this, blockposition2)) { +- this.setBlockAndUpdate(blockposition2, Blocks.ICE.defaultBlockState()); ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, blockposition2, Blocks.ICE.defaultBlockState(), null); // CraftBukkit + } + + if (flag) { +@@ -522,10 +585,10 @@ + IBlockData iblockdata1 = (IBlockData) iblockdata.setValue(BlockSnow.LAYERS, j + 1); + + Block.pushEntitiesUp(iblockdata, iblockdata1, this, blockposition1); +- this.setBlockAndUpdate(blockposition1, iblockdata1); ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, blockposition1, iblockdata1, null); // CraftBukkit + } + } else { +- this.setBlockAndUpdate(blockposition1, Blocks.SNOW.defaultBlockState()); ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, blockposition1, Blocks.SNOW.defaultBlockState(), null); // CraftBukkit + } } - if (flag) { -@@ -489,10 +552,10 @@ - IBlockData iblockdata1 = (IBlockData) iblockdata.setValue(BlockSnow.LAYERS, i1 + 1); - - Block.pushEntitiesUp(iblockdata, iblockdata1, this, blockposition); -- this.setBlockAndUpdate(blockposition, iblockdata1); -+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, blockposition, iblockdata1, null); // CraftBukkit - } - } else { -- this.setBlockAndUpdate(blockposition, Blocks.SNOW.defaultBlockState()); -+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, blockposition, Blocks.SNOW.defaultBlockState(), null); // CraftBukkit - } - } - -@@ -688,6 +751,7 @@ +@@ -686,6 +749,7 @@ this.rainLevel = MathHelper.clamp(this.rainLevel, 0.0F, 1.0F); } @@ -215,7 +215,7 @@ if (this.oRainLevel != this.rainLevel) { this.server.getPlayerList().broadcastAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.RAIN_LEVEL_CHANGE, this.rainLevel), this.dimension()); } -@@ -706,14 +770,47 @@ +@@ -704,14 +768,47 @@ this.server.getPlayerList().broadcastAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.RAIN_LEVEL_CHANGE, this.rainLevel)); this.server.getPlayerList().broadcastAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.THUNDER_LEVEL_CHANGE, this.thunderLevel)); } @@ -265,7 +265,7 @@ } public void resetEmptyTime() { -@@ -748,6 +845,7 @@ +@@ -746,6 +843,7 @@ }); gameprofilerfiller.incrementCounter("tickNonPassenger"); entity.tick(); @@ -273,7 +273,7 @@ this.getProfiler().pop(); Iterator iterator = entity.getPassengers().iterator(); -@@ -771,6 +869,7 @@ +@@ -769,6 +867,7 @@ }); gameprofilerfiller.incrementCounter("tickPassenger"); entity1.rideTick(); @@ -281,7 +281,7 @@ gameprofilerfiller.pop(); Iterator iterator = entity1.getPassengers().iterator(); -@@ -795,6 +894,7 @@ +@@ -793,6 +892,7 @@ ChunkProviderServer chunkproviderserver = this.getChunkSource(); if (!flag1) { @@ -289,7 +289,7 @@ if (iprogressupdate != null) { iprogressupdate.progressStartNoAbort(IChatBaseComponent.translatable("menu.savingLevel")); } -@@ -812,11 +912,19 @@ +@@ -810,11 +910,19 @@ } } @@ -310,7 +310,7 @@ } this.getChunkSource().getDataStorage().save(); -@@ -881,15 +989,37 @@ +@@ -879,15 +987,37 @@ @Override public boolean addFreshEntity(Entity entity) { @@ -351,7 +351,7 @@ } public void addDuringCommandTeleport(EntityPlayer entityplayer) { -@@ -920,24 +1050,37 @@ +@@ -918,24 +1048,37 @@ this.entityManager.addNewEntity(entityplayer); } @@ -393,7 +393,7 @@ return true; } } -@@ -951,10 +1094,32 @@ +@@ -949,10 +1092,32 @@ entityplayer.remove(entity_removalreason); } @@ -426,7 +426,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); -@@ -963,6 +1128,12 @@ +@@ -961,6 +1126,12 @@ double d1 = (double) blockposition.getY() - entityplayer.getY(); double d2 = (double) blockposition.getZ() - entityplayer.getZ(); @@ -439,7 +439,7 @@ if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { entityplayer.connection.send(new PacketPlayOutBlockBreakAnimation(i, blockposition, j)); } -@@ -1022,7 +1193,18 @@ +@@ -1020,7 +1191,18 @@ Iterator iterator = this.navigatingMobs.iterator(); while (iterator.hasNext()) { @@ -459,7 +459,7 @@ NavigationAbstract navigationabstract = entityinsentient.getNavigation(); if (navigationabstract.shouldRecomputePath(blockposition)) { -@@ -1084,6 +1266,11 @@ +@@ -1082,6 +1264,11 @@ @Override public Explosion explode(@Nullable Entity entity, @Nullable DamageSource damagesource, @Nullable ExplosionDamageCalculator explosiondamagecalculator, double d0, double d1, double d2, float f, boolean flag, World.a world_a) { Explosion explosion = this.explode(entity, damagesource, explosiondamagecalculator, d0, d1, d2, f, flag, world_a, false); @@ -471,7 +471,7 @@ if (!explosion.interactsWithBlocks()) { explosion.clearToBlow(); -@@ -1156,13 +1343,20 @@ +@@ -1154,13 +1341,20 @@ } public int sendParticles(T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { @@ -494,7 +494,7 @@ ++j; } } -@@ -1213,7 +1407,7 @@ +@@ -1211,7 +1405,7 @@ @Nullable public BlockPosition findNearestMapStructure(TagKey tagkey, BlockPosition blockposition, int i, boolean flag) { @@ -503,22 +503,7 @@ return null; } else { Optional> optional = this.registryAccess().registryOrThrow(Registries.STRUCTURE).getTag(tagkey); -@@ -1250,11 +1444,21 @@ - @Nullable - @Override - public WorldMap getMapData(String s) { -- return (WorldMap) this.getServer().overworld().getDataStorage().get(WorldMap::load, s); -+ // CraftBukkit start -+ return (WorldMap) this.getServer().overworld().getDataStorage().get((nbttagcompound) -> { -+ // We only get here when the data file exists, but is not a valid map -+ WorldMap newMap = WorldMap.load(nbttagcompound); -+ newMap.id = s; -+ MapInitializeEvent event = new MapInitializeEvent(newMap.mapView); -+ Bukkit.getServer().getPluginManager().callEvent(event); -+ return newMap; -+ }, s); -+ // CraftBukkit end - } +@@ -1253,6 +1447,7 @@ @Override public void setMapData(String s, WorldMap worldmap) { @@ -526,7 +511,7 @@ this.getServer().overworld().getDataStorage().set(s, worldmap); } -@@ -1552,6 +1756,11 @@ +@@ -1550,6 +1745,11 @@ @Override public void blockUpdated(BlockPosition blockposition, Block block) { if (!this.isDebug()) { @@ -538,7 +523,7 @@ this.updateNeighborsAt(blockposition, block); } -@@ -1571,12 +1780,12 @@ +@@ -1569,12 +1769,12 @@ } public boolean isFlat() { @@ -553,7 +538,7 @@ } @Nullable -@@ -1599,7 +1808,7 @@ +@@ -1597,7 +1797,7 @@ private static String getTypeCount(Iterable iterable, Function function) { try { Object2IntOpenHashMap object2intopenhashmap = new Object2IntOpenHashMap(); @@ -562,7 +547,7 @@ while (iterator.hasNext()) { T t0 = iterator.next(); -@@ -1608,7 +1817,7 @@ +@@ -1606,7 +1806,7 @@ object2intopenhashmap.addTo(s, 1); } @@ -571,7 +556,7 @@ String s1 = (String) entry.getKey(); return s1 + ":" + entry.getIntValue(); -@@ -1619,17 +1828,33 @@ +@@ -1617,17 +1817,33 @@ } public static void makeObsidianPlatform(WorldServer worldserver) { @@ -607,7 +592,7 @@ } @Override -@@ -1753,6 +1978,7 @@ +@@ -1751,6 +1967,7 @@ } entity.updateDynamicGameEventListener(DynamicGameEventListener::add); @@ -615,7 +600,7 @@ } public void onTrackingEnd(Entity entity) { -@@ -1789,6 +2015,14 @@ +@@ -1787,6 +2004,14 @@ } entity.updateDynamicGameEventListener(DynamicGameEventListener::remove); diff --git a/nms-patches/net/minecraft/server/network/HandshakeListener.patch b/nms-patches/net/minecraft/server/network/HandshakeListener.patch index e649d2e28..5abb5c22e 100644 --- a/nms-patches/net/minecraft/server/network/HandshakeListener.patch +++ b/nms-patches/net/minecraft/server/network/HandshakeListener.patch @@ -22,10 +22,10 @@ @Override public void handleIntention(PacketHandshakingInSetProtocol packethandshakinginsetprotocol) { -+ this.connection.hostname = packethandshakinginsetprotocol.hostName + ":" + packethandshakinginsetprotocol.port; // CraftBukkit - set hostname - switch (packethandshakinginsetprotocol.getIntention()) { ++ this.connection.hostname = packethandshakinginsetprotocol.hostName() + ":" + packethandshakinginsetprotocol.port(); // CraftBukkit - set hostname + switch (packethandshakinginsetprotocol.intention()) { case LOGIN: - this.connection.setProtocol(EnumProtocol.LOGIN); + this.connection.setClientboundProtocolAfterHandshake(ClientIntent.LOGIN); + // CraftBukkit start - Connection throttle + try { + long currentTime = System.currentTimeMillis(); @@ -60,6 +60,6 @@ + org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t); + } + // CraftBukkit end - if (packethandshakinginsetprotocol.getProtocolVersion() != SharedConstants.getCurrentVersion().getProtocolVersion()) { + if (packethandshakinginsetprotocol.protocolVersion() != SharedConstants.getCurrentVersion().getProtocolVersion()) { IChatMutableComponent ichatmutablecomponent; diff --git a/nms-patches/net/minecraft/server/network/LegacyPingHandler.patch b/nms-patches/net/minecraft/server/network/LegacyPingHandler.patch index 19162d39c..bed960eee 100644 --- a/nms-patches/net/minecraft/server/network/LegacyPingHandler.patch +++ b/nms-patches/net/minecraft/server/network/LegacyPingHandler.patch @@ -1,34 +1,45 @@ --- a/net/minecraft/server/network/LegacyPingHandler.java +++ b/net/minecraft/server/network/LegacyPingHandler.java -@@ -37,11 +37,12 @@ - MinecraftServer minecraftserver = this.serverConnectionListener.getServer(); - int i = bytebuf.readableBytes(); - String s; -+ org.bukkit.event.server.ServerListPingEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callServerListPingEvent(minecraftserver.server, inetsocketaddress.getAddress(), minecraftserver.getMotd(), minecraftserver.getPlayerCount(), minecraftserver.getMaxPlayers()); // CraftBukkit +@@ -35,10 +35,11 @@ + SocketAddress socketaddress = channelhandlercontext.channel().remoteAddress(); + int i = bytebuf.readableBytes(); + String s; ++ org.bukkit.event.server.ServerListPingEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callServerListPingEvent(socketaddress, server.getMotd(), server.getPlayerCount(), server.getMaxPlayers()); // CraftBukkit - switch (i) { - case 0: - LegacyPingHandler.LOGGER.debug("Ping: (<1.3.x) from {}:{}", inetsocketaddress.getAddress(), inetsocketaddress.getPort()); -- s = String.format(Locale.ROOT, "%s\u00a7%d\u00a7%d", minecraftserver.getMotd(), minecraftserver.getPlayerCount(), minecraftserver.getMaxPlayers()); -+ s = String.format(Locale.ROOT, "%s\u00a7%d\u00a7%d", event.getMotd(), event.getNumPlayers(), event.getMaxPlayers()); // CraftBukkit - this.sendFlushAndClose(channelhandlercontext, this.createReply(s)); - break; - case 1: -@@ -50,7 +51,7 @@ + if (i == 0) { + LegacyPingHandler.LOGGER.debug("Ping: (<1.3.x) from {}", socketaddress); +- s = createVersion0Response(this.server); ++ s = createVersion0Response(this.server, event); // CraftBukkit + sendFlushAndClose(channelhandlercontext, createLegacyDisconnectPacket(channelhandlercontext.alloc(), s)); + } else { + if (bytebuf.readUnsignedByte() != 1) { +@@ -55,7 +56,7 @@ + LegacyPingHandler.LOGGER.debug("Ping: (1.4-1.5.x) from {}", socketaddress); } - LegacyPingHandler.LOGGER.debug("Ping: (1.4-1.5.x) from {}:{}", inetsocketaddress.getAddress(), inetsocketaddress.getPort()); -- s = String.format(Locale.ROOT, "\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", 127, minecraftserver.getServerVersion(), minecraftserver.getMotd(), minecraftserver.getPlayerCount(), minecraftserver.getMaxPlayers()); -+ s = String.format(Locale.ROOT, "\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", 127, minecraftserver.getServerVersion(), event.getMotd(), event.getNumPlayers(), event.getMaxPlayers()); // CraftBukkit - this.sendFlushAndClose(channelhandlercontext, this.createReply(s)); - break; - default: -@@ -69,7 +70,7 @@ - } +- s = createVersion1Response(this.server); ++ s = createVersion1Response(this.server, event); // CraftBukkit + sendFlushAndClose(channelhandlercontext, createLegacyDisconnectPacket(channelhandlercontext.alloc(), s)); + } - LegacyPingHandler.LOGGER.debug("Ping: (1.6) from {}:{}", inetsocketaddress.getAddress(), inetsocketaddress.getPort()); -- String s1 = String.format(Locale.ROOT, "\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", 127, minecraftserver.getServerVersion(), minecraftserver.getMotd(), minecraftserver.getPlayerCount(), minecraftserver.getMaxPlayers()); -+ String s1 = String.format(Locale.ROOT, "\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", 127, minecraftserver.getServerVersion(), event.getMotd(), event.getNumPlayers(), event.getMaxPlayers()); // CraftBukkit - ByteBuf bytebuf1 = this.createReply(s1); +@@ -106,12 +107,16 @@ + } + } - try { +- private static String createVersion0Response(ServerInfo serverinfo) { +- return String.format(Locale.ROOT, "%s\u00a7%d\u00a7%d", serverinfo.getMotd(), serverinfo.getPlayerCount(), serverinfo.getMaxPlayers()); ++ // CraftBukkit start ++ private static String createVersion0Response(ServerInfo serverinfo, org.bukkit.event.server.ServerListPingEvent event) { ++ return String.format(Locale.ROOT, "%s\u00a7%d\u00a7%d", event.getMotd(), event.getNumPlayers(), event.getMaxPlayers()); ++ // CraftBukkit end + } + +- private static String createVersion1Response(ServerInfo serverinfo) { +- return String.format(Locale.ROOT, "\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", 127, serverinfo.getServerVersion(), serverinfo.getMotd(), serverinfo.getPlayerCount(), serverinfo.getMaxPlayers()); ++ // CraftBukkit start ++ private static String createVersion1Response(ServerInfo serverinfo, org.bukkit.event.server.ServerListPingEvent event) { ++ return String.format(Locale.ROOT, "\u00a71\u0000%d\u0000%s\u0000%s\u0000%d\u0000%d", 127, serverinfo.getServerVersion(), event.getMotd(), event.getNumPlayers(), event.getMaxPlayers()); ++ // CraftBukkit end + } + + private static void sendFlushAndClose(ChannelHandlerContext channelhandlercontext, ByteBuf bytebuf) { diff --git a/nms-patches/net/minecraft/server/network/LoginListener.patch b/nms-patches/net/minecraft/server/network/LoginListener.patch index ee6abfc0c..b94073753 100644 --- a/nms-patches/net/minecraft/server/network/LoginListener.patch +++ b/nms-patches/net/minecraft/server/network/LoginListener.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/server/network/LoginListener.java +++ b/net/minecraft/server/network/LoginListener.java -@@ -38,6 +38,12 @@ +@@ -39,6 +39,13 @@ import org.apache.commons.lang3.Validate; import org.slf4j.Logger; +// CraftBukkit start ++import net.minecraft.server.level.EntityPlayer; +import org.bukkit.craftbukkit.util.Waitable; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerPreLoginEvent; @@ -13,7 +14,15 @@ public class LoginListener implements PacketLoginInListener, TickablePacketListener { private static final AtomicInteger UNIQUE_THREAD_ID = new AtomicInteger(0); -@@ -83,6 +89,13 @@ +@@ -55,6 +62,7 @@ + @Nullable + private GameProfile authenticatedProfile; + private final String serverId; ++ private EntityPlayer player; // CraftBukkit + + public LoginListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { + this.state = LoginListener.EnumProtocolState.HELLO; +@@ -80,6 +88,13 @@ } @@ -27,43 +36,43 @@ @Override public boolean isAcceptingMessages() { return this.connection.isConnected(); -@@ -104,10 +117,12 @@ - this.gameProfile = this.createFakeProfile(this.gameProfile); - } +@@ -138,10 +153,12 @@ -- IChatBaseComponent ichatbasecomponent = this.server.getPlayerList().canPlayerLogin(this.connection.getRemoteAddress(), this.gameProfile); + private void verifyLoginAndFinishConnectionSetup(GameProfile gameprofile) { + PlayerList playerlist = this.server.getPlayerList(); +- IChatBaseComponent ichatbasecomponent = playerlist.canPlayerLogin(this.connection.getRemoteAddress(), gameprofile); + // CraftBukkit start - fire PlayerLoginEvent -+ EntityPlayer s = this.server.getPlayerList().canPlayerLogin(this, this.gameProfile); ++ this.player = playerlist.canPlayerLogin(this, gameprofile); // CraftBukkit - if (ichatbasecomponent != null) { - this.disconnect(ichatbasecomponent); -+ if (s == null) { ++ if (this.player == null) { + // this.disconnect(ichatbasecomponent); + // CraftBukkit end } else { - this.state = LoginListener.EnumProtocolState.ACCEPTED; if (this.server.getCompressionThreshold() >= 0 && !this.connection.isMemoryConnection()) { -@@ -120,7 +135,7 @@ - EntityPlayer entityplayer = this.server.getPlayerList().getPlayer(this.gameProfile.getId()); + this.connection.send(new PacketLoginOutSetCompression(this.server.getCompressionThreshold()), PacketSendListener.thenRun(() -> { +@@ -149,7 +166,7 @@ + })); + } - try { -- EntityPlayer entityplayer1 = this.server.getPlayerList().getPlayerForLogin(this.gameProfile); -+ EntityPlayer entityplayer1 = this.server.getPlayerList().getPlayerForLogin(this.gameProfile, s); // CraftBukkit - add player reference +- boolean flag = playerlist.disconnectAllPlayersWithProfile(gameprofile); ++ boolean flag = playerlist.disconnectAllPlayersWithProfile(gameprofile, this.player); // CraftBukkit - add player reference + + if (flag) { + this.state = LoginListener.EnumProtocolState.WAITING_FOR_DUPE_DISCONNECT; +@@ -205,6 +222,43 @@ + if (profileresult != null) { + GameProfile gameprofile = profileresult.profile(); - if (entityplayer != null) { - this.state = LoginListener.EnumProtocolState.DELAY_ACCEPT; -@@ -210,6 +225,43 @@ - try { - LoginListener.this.gameProfile = LoginListener.this.server.getSessionService().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s, this.getAddress()); - if (LoginListener.this.gameProfile != null) { + // CraftBukkit start - fire PlayerPreLoginEvent + if (!connection.isConnected()) { + return; + } + -+ String playerName = gameProfile.getName(); ++ String playerName = gameprofile.getName(); + java.net.InetAddress address = ((java.net.InetSocketAddress) connection.getRemoteAddress()).getAddress(); -+ java.util.UUID uniqueId = gameProfile.getId(); ++ java.util.UUID uniqueId = gameprofile.getId(); + final org.bukkit.craftbukkit.CraftServer server = LoginListener.this.server.server; + + AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); @@ -93,18 +102,27 @@ + } + } + // CraftBukkit end - LoginListener.LOGGER.info("UUID of player {} is {}", LoginListener.this.gameProfile.getName(), LoginListener.this.gameProfile.getId()); - LoginListener.this.state = LoginListener.EnumProtocolState.READY_TO_ACCEPT; + LoginListener.LOGGER.info("UUID of player {} is {}", gameprofile.getName(), gameprofile.getId()); + LoginListener.this.startClientVerification(gameprofile); } else if (LoginListener.this.server.isSingleplayer()) { -@@ -229,6 +281,11 @@ +@@ -222,6 +276,11 @@ LoginListener.this.disconnect(IChatBaseComponent.translatable("multiplayer.disconnect.authservers_down")); LoginListener.LOGGER.error("Couldn't verify username because servers are unavailable"); } + // CraftBukkit start - catch all exceptions + } catch (Exception exception) { + disconnect("Failed to verify username!"); -+ server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + gameprofile.getName(), exception); ++ server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + s1, exception); + // CraftBukkit end } } +@@ -247,7 +306,7 @@ + public void handleLoginAcknowledgement(ServerboundLoginAcknowledgedPacket serverboundloginacknowledgedpacket) { + Validate.validState(this.state == LoginListener.EnumProtocolState.PROTOCOL_SWITCHING, "Unexpected login acknowledgement packet", new Object[0]); + CommonListenerCookie commonlistenercookie = CommonListenerCookie.createInitial((GameProfile) Objects.requireNonNull(this.authenticatedProfile)); +- ServerConfigurationPacketListenerImpl serverconfigurationpacketlistenerimpl = new ServerConfigurationPacketListenerImpl(this.server, this.connection, commonlistenercookie); ++ ServerConfigurationPacketListenerImpl serverconfigurationpacketlistenerimpl = new ServerConfigurationPacketListenerImpl(this.server, this.connection, commonlistenercookie, this.player); // CraftBukkit + + this.connection.setListener(serverconfigurationpacketlistenerimpl); + serverconfigurationpacketlistenerimpl.startConfiguration(); diff --git a/nms-patches/net/minecraft/server/network/PlayerConnection.patch b/nms-patches/net/minecraft/server/network/PlayerConnection.patch index 09fc2656a..12dfffba5 100644 --- a/nms-patches/net/minecraft/server/network/PlayerConnection.patch +++ b/nms-patches/net/minecraft/server/network/PlayerConnection.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/network/PlayerConnection.java +++ b/net/minecraft/server/network/PlayerConnection.java -@@ -185,6 +185,71 @@ +@@ -180,6 +180,66 @@ import net.minecraft.world.phys.shapes.VoxelShapes; import org.slf4j.Logger; @@ -13,7 +13,6 @@ +import net.minecraft.network.protocol.game.PacketPlayOutAttachEntity; +import net.minecraft.network.protocol.game.PacketPlayOutEntityEquipment; +import net.minecraft.network.protocol.game.PacketPlayOutSpawnEntity; -+import net.minecraft.network.protocol.game.PacketPlayOutSpawnPosition; +import net.minecraft.world.entity.EntityInsentient; +import net.minecraft.world.entity.animal.Bucketable; +import net.minecraft.world.entity.EntityLiving; @@ -21,7 +20,7 @@ +import net.minecraft.world.entity.animal.allay.Allay; +import net.minecraft.world.inventory.InventoryClickType; +import net.minecraft.world.inventory.Slot; -+import net.minecraft.world.item.crafting.IRecipe; ++import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.level.RayTrace; +import net.minecraft.world.phys.MovingObjectPosition; +import org.bukkit.Location; @@ -30,7 +29,6 @@ +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftChatMessage; -+import org.bukkit.craftbukkit.util.CraftLocation; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.craftbukkit.util.LazyPlayerSet; @@ -38,7 +36,6 @@ +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.block.Action; -+import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.CraftItemEvent; +import org.bukkit.event.inventory.InventoryAction; @@ -54,9 +51,7 @@ +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerItemHeldEvent; -+import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerMoveEvent; -+import org.bukkit.event.player.PlayerResourcePackStatusEvent; +import org.bukkit.event.player.PlayerRespawnEvent.RespawnReason; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; +import org.bukkit.event.player.PlayerTeleportEvent; @@ -69,13 +64,13 @@ +import org.bukkit.inventory.SmithingInventory; +// CraftBukkit end + - public class PlayerConnection implements ServerPlayerConnection, TickablePacketListener, PacketListenerPlayIn { + public class PlayerConnection extends ServerCommonPacketListenerImpl implements PacketListenerPlayIn, ServerPlayerConnection, TickablePacketListener { static final Logger LOGGER = LogUtils.getLogger(); -@@ -201,7 +266,9 @@ - private long keepAliveTime; - private boolean keepAlivePending; - private long keepAliveChallenge; +@@ -191,7 +251,9 @@ + public final PlayerChunkSender chunkSender; + private int tickCount; + private int ackBlockChangesUpTo = -1; - private int chatSpamTickCount; + // CraftBukkit start - multithreaded fields + private final AtomicInteger chatSpamTickCount = new AtomicInteger(); @@ -83,18 +78,24 @@ private int dropSpamTickCount; private double firstGoodX; private double firstGoodY; -@@ -247,8 +314,31 @@ - this.keepAliveTime = SystemUtils.getMillis(); +@@ -227,7 +289,7 @@ + private boolean waitingForSwitchToConfig; + + public PlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer, CommonListenerCookie commonlistenercookie) { +- super(minecraftserver, networkmanager, commonlistenercookie); ++ super(minecraftserver, networkmanager, commonlistenercookie, entityplayer); // CraftBukkit + this.lastChatTimeStamp = new AtomicReference(Instant.EPOCH); + this.lastSeenMessages = new LastSeenMessagesValidator(20); + this.messageSignatureCache = MessageSignatureCache.createDefault(); +@@ -237,9 +299,25 @@ + entityplayer.connection = this; entityplayer.getTextFilter().join(); this.signedMessageDecoder = minecraftserver.enforceSecureProfile() ? SignedMessageChain.b.REJECT_ALL : SignedMessageChain.b.unsigned(entityplayer.getUUID()); - this.chatMessageChain = new FutureChain(minecraftserver); + this.chatMessageChain = new FutureChain(minecraftserver.chatExecutor); // CraftBukkit - async chat -+ // CraftBukkit start - add fields and methods -+ this.cserver = minecraftserver.server; -+ } -+ -+ private final org.bukkit.craftbukkit.CraftServer cserver; -+ public boolean processedDisconnect; + } + ++ // CraftBukkit start - add fields + private int lastTick = MinecraftServer.currentTick; + private int allowedPlayerTicks = 1; + private int lastDropTick = MinecraftServer.currentTick; @@ -108,27 +109,15 @@ + private float lastPitch = Float.MAX_VALUE; + private float lastYaw = Float.MAX_VALUE; + private boolean justTeleported = false; -+ -+ public CraftPlayer getCraftPlayer() { -+ return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity(); - } + // CraftBukkit end - ++ @Override public void tick() { -@@ -303,7 +393,7 @@ - this.server.getProfiler().push("keepAlive"); - long i = SystemUtils.getMillis(); - -- if (i - this.keepAliveTime >= 15000L) { -+ if (i - this.keepAliveTime >= 25000L) { // CraftBukkit - if (this.keepAlivePending) { - this.disconnect(IChatBaseComponent.translatable("disconnect.timeout")); - } else { -@@ -315,15 +405,21 @@ + if (this.ackBlockChangesUpTo > -1) { +@@ -291,15 +369,21 @@ } - this.server.getProfiler().pop(); + this.keepConnectionAlive(); + // CraftBukkit start + for (int spam; (spam = this.chatSpamTickCount.get()) > 0 && !chatSpamTickCount.compareAndSet(spam, spam - 1); ) ; + /* Use thread-safe field access instead @@ -147,76 +136,7 @@ this.disconnect(IChatBaseComponent.translatable("multiplayer.disconnect.idling")); } -@@ -347,16 +443,67 @@ - return this.server.isSingleplayerOwner(this.player.getGameProfile()); - } - -+ // CraftBukkit start -+ @Deprecated - public void disconnect(IChatBaseComponent ichatbasecomponent) { -+ disconnect(CraftChatMessage.fromComponent(ichatbasecomponent)); -+ } -+ // CraftBukkit end -+ -+ public void disconnect(String s) { -+ // CraftBukkit start - fire PlayerKickEvent -+ if (this.processedDisconnect) { -+ return; -+ } -+ if (!this.cserver.isPrimaryThread()) { -+ Waitable waitable = new Waitable() { -+ @Override -+ protected Object evaluate() { -+ PlayerConnection.this.disconnect(s); -+ return null; -+ } -+ }; -+ -+ this.server.processQueue.add(waitable); -+ -+ try { -+ waitable.get(); -+ } catch (InterruptedException e) { -+ Thread.currentThread().interrupt(); -+ } catch (ExecutionException e) { -+ throw new RuntimeException(e); -+ } -+ return; -+ } -+ -+ String leaveMessage = EnumChatFormat.YELLOW + this.player.getScoreboardName() + " left the game."; -+ -+ PlayerKickEvent event = new PlayerKickEvent(this.player.getBukkitEntity(), s, leaveMessage); -+ -+ if (this.cserver.getServer().isRunning()) { -+ this.cserver.getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ // Do not kick the player -+ return; -+ } -+ this.player.kickLeaveMessage = event.getLeaveMessage(); // CraftBukkit - SPIGOT-3034: Forward leave message to PlayerQuitEvent -+ // Send the possibly modified leave message -+ final IChatBaseComponent ichatbasecomponent = CraftChatMessage.fromString(event.getReason(), true)[0]; -+ // CraftBukkit end -+ - this.connection.send(new PacketPlayOutKickDisconnect(ichatbasecomponent), PacketSendListener.thenRun(() -> { - this.connection.disconnect(ichatbasecomponent); - })); -+ this.onDisconnect(ichatbasecomponent); // CraftBukkit - fire quit instantly - this.connection.setReadOnly(); - MinecraftServer minecraftserver = this.server; - NetworkManager networkmanager = this.connection; - - Objects.requireNonNull(this.connection); -- minecraftserver.executeBlocking(networkmanager::handleDisconnection); -+ // CraftBukkit - Don't wait -+ minecraftserver.wrapRunnable(networkmanager::handleDisconnection); - } - - private CompletableFuture filterTextPacket(T t0, BiFunction> bifunction) { -@@ -420,7 +567,34 @@ +@@ -390,7 +474,34 @@ double d9 = entity.getDeltaMovement().lengthSqr(); double d10 = d6 * d6 + d7 * d7 + d8 * d8; @@ -250,9 +170,9 @@ + if (d10 - d9 > Math.max(100.0D, Math.pow((double) (10.0F * (float) i * speed), 2)) && !this.isSingleplayerOwner()) { + // CraftBukkit end PlayerConnection.LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", new Object[]{entity.getName().getString(), this.player.getName().getString(), d6, d7, d8}); - this.connection.send(new PacketPlayOutVehicleMove(entity)); + this.send(new PacketPlayOutVehicleMove(entity)); return; -@@ -460,14 +634,72 @@ +@@ -430,14 +541,72 @@ } entity.absMoveTo(d3, d4, d5, f, f1); @@ -262,7 +182,7 @@ if (flag && (flag2 || !flag3)) { entity.absMoveTo(d0, d1, d2, f, f1); + player.absMoveTo(d0, d1, d2, this.player.getYRot(), this.player.getXRot()); // CraftBukkit - this.connection.send(new PacketPlayOutVehicleMove(entity)); + this.send(new PacketPlayOutVehicleMove(entity)); return; } @@ -325,7 +245,7 @@ this.player.serverLevel().getChunkSource().move(this.player); this.player.checkMovementStatistics(this.player.getX() - d0, this.player.getY() - d1, this.player.getZ() - d2); this.clientVehicleIsFloating = d11 >= -0.03125D && !flag1 && !this.server.isFlightAllowed() && !entity.isNoGravity() && this.noBlocksAround(entity); -@@ -501,6 +733,7 @@ +@@ -471,6 +640,7 @@ } this.awaitingPositionFromClient = null; @@ -333,16 +253,16 @@ } } -@@ -508,7 +741,7 @@ +@@ -478,7 +648,7 @@ @Override public void handleRecipeBookSeenRecipePacket(PacketPlayInRecipeDisplayed packetplayinrecipedisplayed) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinrecipedisplayed, this, this.player.serverLevel()); - Optional optional = this.server.getRecipeManager().byKey(packetplayinrecipedisplayed.getRecipe()); -+ Optional> optional = this.server.getRecipeManager().byKey(packetplayinrecipedisplayed.getRecipe()); // CraftBukkit - decompile error ++ Optional> optional = this.server.getRecipeManager().byKey(packetplayinrecipedisplayed.getRecipe()); // CraftBukkit - decompile error RecipeBookServer recipebookserver = this.player.getRecipeBook(); Objects.requireNonNull(recipebookserver); -@@ -538,6 +771,12 @@ +@@ -508,6 +678,12 @@ @Override public void handleCustomCommandSuggestions(PacketPlayInTabComplete packetplayintabcomplete) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayintabcomplete, this, this.player.serverLevel()); @@ -355,15 +275,15 @@ StringReader stringreader = new StringReader(packetplayintabcomplete.getCommand()); if (stringreader.canRead() && stringreader.peek() == '/') { -@@ -547,6 +786,7 @@ +@@ -517,6 +693,7 @@ ParseResults parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack()); this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> { + if (suggestions.isEmpty()) return; // CraftBukkit - don't send through empty suggestions - prevents [] from showing for plugins with nothing more to offer - this.connection.send(new PacketPlayOutTabComplete(packetplayintabcomplete.getId(), suggestions)); + this.send(new PacketPlayOutTabComplete(packetplayintabcomplete.getId(), suggestions)); }); } -@@ -792,6 +1032,13 @@ +@@ -762,6 +939,13 @@ if (container instanceof ContainerMerchant) { ContainerMerchant containermerchant = (ContainerMerchant) container; @@ -377,7 +297,7 @@ if (!containermerchant.stillValid(this.player)) { PlayerConnection.LOGGER.debug("Player {} interacted with invalid menu {}", this.player, containermerchant); -@@ -806,6 +1053,13 @@ +@@ -776,6 +960,13 @@ @Override public void handleEditBook(PacketPlayInBEdit packetplayinbedit) { @@ -391,7 +311,7 @@ int i = packetplayinbedit.getSlot(); if (PlayerInventory.isHotbarSlot(i) || i == 40) { -@@ -814,7 +1068,7 @@ +@@ -784,7 +975,7 @@ Objects.requireNonNull(list); optional.ifPresent(list::add); @@ -400,7 +320,7 @@ Objects.requireNonNull(list); stream.forEach(list::add); -@@ -832,7 +1086,7 @@ +@@ -802,7 +993,7 @@ ItemStack itemstack = this.player.getInventory().getItem(i); if (itemstack.is(Items.WRITABLE_BOOK)) { @@ -409,7 +329,7 @@ } } -@@ -857,16 +1111,16 @@ +@@ -827,16 +1018,16 @@ this.updateBookPages(list, (s) -> { return IChatBaseComponent.ChatSerializer.toJson(IChatBaseComponent.literal(s)); @@ -430,7 +350,7 @@ return NBTTagString.valueOf((String) unaryoperator.apply(filteredtext.filteredOrEmpty())); }); -@@ -892,6 +1146,7 @@ +@@ -862,6 +1053,7 @@ } itemstack.addTagElement("pages", nbttaglist); @@ -438,7 +358,7 @@ } @Override -@@ -928,7 +1183,7 @@ +@@ -898,7 +1090,7 @@ } else { WorldServer worldserver = this.player.serverLevel(); @@ -447,7 +367,7 @@ if (this.tickCount == 0) { this.resetPosition(); } -@@ -938,7 +1193,7 @@ +@@ -908,7 +1100,7 @@ this.awaitingTeleportTime = this.tickCount; this.teleport(this.awaitingPositionFromClient.x, this.awaitingPositionFromClient.y, this.awaitingPositionFromClient.z, this.player.getYRot(), this.player.getXRot()); } @@ -456,7 +376,7 @@ } else { this.awaitingTeleportTime = this.tickCount; double d0 = clampHorizontal(packetplayinflying.getX(this.player.getX())); -@@ -950,7 +1205,15 @@ +@@ -920,7 +1112,15 @@ if (this.player.isPassenger()) { this.player.absMoveTo(this.player.getX(), this.player.getY(), this.player.getZ(), f, f1); this.player.serverLevel().getChunkSource().move(this.player); @@ -472,7 +392,7 @@ double d3 = this.player.getX(); double d4 = this.player.getY(); double d5 = this.player.getZ(); -@@ -969,15 +1232,33 @@ +@@ -939,15 +1139,33 @@ ++this.receivedMovePacketCount; int i = this.receivedMovePacketCount - this.knownMovePacketCount; @@ -508,7 +428,7 @@ PlayerConnection.LOGGER.warn("{} moved too quickly! {},{},{}", new Object[]{this.player.getName().getString(), d6, d7, d8}); this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot()); return; -@@ -998,6 +1279,7 @@ +@@ -968,6 +1186,7 @@ boolean flag1 = this.player.verticalCollisionBelow; this.player.move(EnumMoveType.PLAYER, new Vec3D(d6, d7, d8)); @@ -516,7 +436,7 @@ double d11 = d7; d6 = d0 - this.player.getX(); -@@ -1016,9 +1298,70 @@ +@@ -986,9 +1205,70 @@ } if (!this.player.noPhysics && !this.player.isSleeping() && (flag2 && worldserver.noCollision(this.player, axisalignedbb) || this.isPlayerCollidingWithAnythingNew(worldserver, axisalignedbb, d0, d1, d2))) { @@ -588,7 +508,7 @@ this.player.absMoveTo(d0, d1, d2, f, f1); this.clientIsFloating = d11 >= -0.03125D && !flag1 && this.player.gameMode.getGameModeForPlayer() != EnumGamemode.SPECTATOR && !this.server.isFlightAllowed() && !this.player.getAbilities().mayfly && !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.isFallFlying() && !this.player.isAutoSpinAttack() && this.noBlocksAround(this.player); this.player.serverLevel().getChunkSource().move(this.player); -@@ -1059,11 +1402,68 @@ +@@ -1029,11 +1309,68 @@ return true; } @@ -658,7 +578,7 @@ double d3 = set.contains(RelativeMovement.X) ? this.player.getX() : 0.0D; double d4 = set.contains(RelativeMovement.Y) ? this.player.getY() : 0.0D; double d5 = set.contains(RelativeMovement.Z) ? this.player.getZ() : 0.0D; -@@ -1075,6 +1475,14 @@ +@@ -1045,6 +1382,14 @@ this.awaitingTeleport = 0; } @@ -673,7 +593,7 @@ this.awaitingTeleportTime = this.tickCount; this.player.absMoveTo(d0, d1, d2, f, f1); this.player.connection.send(new PacketPlayOutPosition(d0 - d3, d1 - d4, d2 - d5, f - f2, f1 - f3, set, this.awaitingTeleport)); -@@ -1083,6 +1491,7 @@ +@@ -1053,6 +1398,7 @@ @Override public void handlePlayerAction(PacketPlayInBlockDig packetplayinblockdig) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinblockdig, this, this.player.serverLevel()); @@ -681,7 +601,7 @@ BlockPosition blockposition = packetplayinblockdig.getPos(); this.player.resetLastActionTime(); -@@ -1093,14 +1502,46 @@ +@@ -1063,14 +1409,46 @@ if (!this.player.isSpectator()) { ItemStack itemstack = this.player.getItemInHand(EnumHand.OFF_HAND); @@ -730,7 +650,7 @@ this.player.drop(false); } -@@ -1138,6 +1579,7 @@ +@@ -1108,6 +1486,7 @@ @Override public void handleUseItemOn(PacketPlayInUseItem packetplayinuseitem) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseitem, this, this.player.serverLevel()); @@ -738,7 +658,7 @@ this.player.connection.ackBlockChangesUpTo(packetplayinuseitem.getSequence()); WorldServer worldserver = this.player.serverLevel(); EnumHand enumhand = packetplayinuseitem.getHand(); -@@ -1161,6 +1603,7 @@ +@@ -1131,6 +1510,7 @@ if (blockposition.getY() < i) { if (this.awaitingPositionFromClient == null && this.player.distanceToSqr((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D) < 64.0D && worldserver.mayInteract(this.player, blockposition)) { @@ -746,7 +666,7 @@ EnumInteractionResult enuminteractionresult = this.player.gameMode.useItemOn(this.player, worldserver, itemstack, enumhand, movingobjectpositionblock); if (enumdirection == EnumDirection.UP && !enuminteractionresult.consumesAction() && blockposition.getY() >= i - 1 && wasBlockPlacementAttempt(this.player, itemstack)) { -@@ -1189,6 +1632,7 @@ +@@ -1159,6 +1539,7 @@ @Override public void handleUseItem(PacketPlayInBlockPlace packetplayinblockplace) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinblockplace, this, this.player.serverLevel()); @@ -754,7 +674,7 @@ this.ackBlockChangesUpTo(packetplayinblockplace.getSequence()); WorldServer worldserver = this.player.serverLevel(); EnumHand enumhand = packetplayinblockplace.getHand(); -@@ -1196,6 +1640,49 @@ +@@ -1166,6 +1547,49 @@ this.player.resetLastActionTime(); if (!itemstack.isEmpty() && itemstack.isItemEnabled(worldserver.enabledFeatures())) { @@ -804,7 +724,7 @@ EnumInteractionResult enuminteractionresult = this.player.gameMode.useItem(this.player, worldserver, itemstack, enumhand); if (enuminteractionresult.shouldSwing()) { -@@ -1216,7 +1703,7 @@ +@@ -1186,7 +1610,7 @@ Entity entity = packetplayinspectate.getEntity(worldserver); if (entity != null) { @@ -813,15 +733,7 @@ return; } } -@@ -1231,6 +1718,7 @@ - PlayerConnection.LOGGER.info("Disconnecting {} due to resource pack rejection", this.player.getName()); - this.disconnect(IChatBaseComponent.translatable("multiplayer.requiredTexturePrompt.disconnect")); - } -+ this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(getCraftPlayer(), PlayerResourcePackStatusEvent.Status.values()[packetplayinresourcepackstatus.action.ordinal()])); // CraftBukkit - - } - -@@ -1252,12 +1740,27 @@ +@@ -1209,6 +1633,13 @@ @Override public void onDisconnect(IChatBaseComponent ichatbasecomponent) { @@ -832,8 +744,13 @@ + this.processedDisconnect = true; + } + // CraftBukkit end - this.chatMessageChain.close(); PlayerConnection.LOGGER.info("{} lost connection: {}", this.player.getName().getString(), ichatbasecomponent.getString()); + this.removePlayerFromWorld(); + super.onDisconnect(ichatbasecomponent); +@@ -1216,10 +1647,18 @@ + + private void removePlayerFromWorld() { + this.chatMessageChain.close(); + // CraftBukkit start - Replace vanilla quit message handling with our own. + /* this.server.invalidateStatus(); @@ -848,25 +765,9 @@ + } + // CraftBukkit end this.player.getTextFilter().leave(); - if (this.isSingleplayerOwner()) { - PlayerConnection.LOGGER.info("Stopping singleplayer server as player logged out"); -@@ -1280,6 +1783,15 @@ } - public void send(Packet packet, @Nullable PacketSendListener packetsendlistener) { -+ // CraftBukkit start -+ if (packet == null) { -+ return; -+ } else if (packet instanceof PacketPlayOutSpawnPosition) { -+ PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet; -+ this.player.compassTarget = CraftLocation.toBukkit(packet6.pos, this.getCraftPlayer().getWorld()); -+ } -+ // CraftBukkit end -+ - try { - this.connection.send(packet, packetsendlistener); - } catch (Throwable throwable) { -@@ -1296,7 +1808,16 @@ +@@ -1234,7 +1673,16 @@ @Override public void handleSetCarriedItem(PacketPlayInHeldItemSlot packetplayinhelditemslot) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinhelditemslot, this, this.player.serverLevel()); @@ -883,7 +784,7 @@ if (this.player.getInventory().selected != packetplayinhelditemslot.getSlot() && this.player.getUsedItemHand() == EnumHand.MAIN_HAND) { this.player.stopUsingItem(); } -@@ -1305,18 +1826,25 @@ +@@ -1243,18 +1691,25 @@ this.player.resetLastActionTime(); } else { PlayerConnection.LOGGER.warn("{} tried to set an invalid carried item", this.player.getName().getString()); @@ -910,8 +811,8 @@ PlayerChatMessage playerchatmessage; try { -@@ -1334,9 +1862,9 @@ - PlayerChatMessage playerchatmessage1 = playerchatmessage.withUnsignedContent((IChatBaseComponent) completablefuture1.join()).filter(((FilteredText) completablefuture.join()).mask()); +@@ -1272,9 +1727,9 @@ + PlayerChatMessage playerchatmessage1 = playerchatmessage.withUnsignedContent(ichatbasecomponent).filter(filteredtext.mask()); this.broadcastChatMessage(playerchatmessage1); - }, executor); @@ -922,7 +823,7 @@ } } -@@ -1351,6 +1879,12 @@ +@@ -1289,6 +1744,12 @@ if (optional.isPresent()) { this.server.submit(() -> { @@ -935,7 +836,7 @@ this.performChatCommand(serverboundchatcommandpacket, (LastSeenMessages) optional.get()); this.detectRateSpam(); }); -@@ -1360,12 +1894,25 @@ +@@ -1298,12 +1759,25 @@ } private void performChatCommand(ServerboundChatCommandPacket serverboundchatcommandpacket, LastSeenMessages lastseenmessages) { @@ -963,20 +864,20 @@ } catch (SignedMessageChain.a signedmessagechain_a) { this.handleMessageDecodeFailure(signedmessagechain_a); return; -@@ -1373,10 +1920,10 @@ +@@ -1311,10 +1785,10 @@ CommandSigningContext.a commandsigningcontext_a = new CommandSigningContext.a(map); - parseresults = CommandDispatcher.mapSource(parseresults, (commandlistenerwrapper) -> { + parseresults = CommandDispatcher.mapSource(parseresults, (commandlistenerwrapper) -> { // CraftBukkit - decompile error - return commandlistenerwrapper.withSigningContext(commandsigningcontext_a); + return commandlistenerwrapper.withSigningContext(commandsigningcontext_a, this.chatMessageChain); }); - this.server.getCommands().performCommand(parseresults, serverboundchatcommandpacket.command()); + this.server.getCommands().performCommand(parseresults, command); // CraftBukkit } private void handleMessageDecodeFailure(SignedMessageChain.a signedmessagechain_a) { -@@ -1417,7 +1964,7 @@ +@@ -1355,7 +1829,7 @@ } else { Optional optional = this.unpackAndApplyLastSeen(lastseenmessages_b); @@ -985,7 +886,7 @@ this.send(new ClientboundSystemChatPacket(IChatBaseComponent.translatable("chat.disabled.options").withStyle(EnumChatFormat.RED), false)); return Optional.empty(); } else { -@@ -1465,6 +2012,116 @@ +@@ -1403,6 +1877,116 @@ return false; } @@ -1102,7 +1003,7 @@ private PlayerChatMessage getSignedMessage(PacketPlayInChat packetplayinchat, LastSeenMessages lastseenmessages) throws SignedMessageChain.a { SignedMessageBody signedmessagebody = new SignedMessageBody(packetplayinchat.message(), packetplayinchat.timeStamp(), packetplayinchat.salt(), lastseenmessages); -@@ -1472,13 +2129,33 @@ +@@ -1410,13 +1994,33 @@ } private void broadcastChatMessage(PlayerChatMessage playerchatmessage) { @@ -1139,7 +1040,7 @@ this.disconnect(IChatBaseComponent.translatable("disconnect.spam")); } -@@ -1500,13 +2177,62 @@ +@@ -1438,13 +2042,62 @@ @Override public void handleAnimate(PacketPlayInArmAnimation packetplayinarmanimation) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinarmanimation, this, this.player.serverLevel()); @@ -1202,7 +1103,7 @@ this.player.resetLastActionTime(); Entity entity; IJumpable ijumpable; -@@ -1588,6 +2314,12 @@ +@@ -1526,6 +2179,12 @@ } public void sendPlayerChatMessage(PlayerChatMessage playerchatmessage, ChatMessageType.a chatmessagetype_a) { @@ -1215,7 +1116,7 @@ this.send(new ClientboundPlayerChatPacket(playerchatmessage.link().sender(), playerchatmessage.link().index(), playerchatmessage.signature(), playerchatmessage.signedBody().pack(this.messageSignatureCache), playerchatmessage.unsignedContent(), playerchatmessage.filterMask(), chatmessagetype_a.toNetwork(this.player.level().registryAccess()))); this.addPendingMessage(playerchatmessage); } -@@ -1603,6 +2335,7 @@ +@@ -1552,6 +2211,7 @@ @Override public void handleInteract(PacketPlayInUseEntity packetplayinuseentity) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseentity, this, this.player.serverLevel()); @@ -1223,7 +1124,7 @@ final WorldServer worldserver = this.player.serverLevel(); final Entity entity = packetplayinuseentity.getTarget(worldserver); -@@ -1617,13 +2350,51 @@ +@@ -1566,13 +2226,51 @@ if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < PlayerConnection.MAX_INTERACTION_DISTANCE) { packetplayinuseentity.dispatch(new PacketPlayInUseEntity.c() { @@ -1276,7 +1177,7 @@ if (enuminteractionresult.consumesAction()) { CriterionTriggers.PLAYER_INTERACTED_WITH_ENTITY.trigger(PlayerConnection.this.player, itemstack1, entity); if (enuminteractionresult.shouldSwing()) { -@@ -1636,23 +2407,29 @@ +@@ -1585,23 +2283,29 @@ @Override public void onInteraction(EnumHand enumhand) { @@ -1309,7 +1210,7 @@ } } else { PlayerConnection.this.disconnect(IChatBaseComponent.translatable("multiplayer.disconnect.invalid_entity_attacked")); -@@ -1675,14 +2452,14 @@ +@@ -1624,14 +2328,14 @@ case PERFORM_RESPAWN: if (this.player.wonGame) { this.player.wonGame = false; @@ -1326,7 +1227,7 @@ if (this.server.isHardcore()) { this.player.setGameMode(EnumGamemode.SPECTATOR); ((GameRules.GameRuleBoolean) this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS)).set(false, this.server); -@@ -1698,15 +2475,21 @@ +@@ -1647,15 +2351,21 @@ @Override public void handleContainerClose(PacketPlayInCloseWindow packetplayinclosewindow) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinclosewindow, this, this.player.serverLevel()); @@ -1350,7 +1251,7 @@ this.player.containerMenu.sendAllDataToRemote(); } else if (!this.player.containerMenu.stillValid(this.player)) { PlayerConnection.LOGGER.debug("Player {} interacted with invalid menu {}", this.player, this.player.containerMenu); -@@ -1719,7 +2502,284 @@ +@@ -1668,7 +2378,284 @@ boolean flag = packetplayinwindowclick.getStateId() != this.player.containerMenu.getStateId(); this.player.containerMenu.suppressRemoteUpdates(); @@ -1636,12 +1537,12 @@ ObjectIterator objectiterator = Int2ObjectMaps.fastIterable(packetplayinwindowclick.getChangedSlots()).iterator(); while (objectiterator.hasNext()) { -@@ -1749,9 +2809,18 @@ +@@ -1698,9 +2685,18 @@ if (!this.player.containerMenu.stillValid(this.player)) { PlayerConnection.LOGGER.debug("Player {} interacted with invalid menu {}", this.player, this.player.containerMenu); } else { -- this.server.getRecipeManager().byKey(packetplayinautorecipe.getRecipe()).ifPresent((irecipe) -> { -- ((ContainerRecipeBook) this.player.containerMenu).handlePlacement(packetplayinautorecipe.isShiftDown(), irecipe, this.player); +- this.server.getRecipeManager().byKey(packetplayinautorecipe.getRecipe()).ifPresent((recipeholder) -> { +- ((ContainerRecipeBook) this.player.containerMenu).handlePlacement(packetplayinautorecipe.isShiftDown(), recipeholder, this.player); + // CraftBukkit start - implement PlayerRecipeBookClickEvent + org.bukkit.inventory.Recipe recipe = this.cserver.getRecipe(CraftNamespacedKey.fromMinecraft(packetplayinautorecipe.getRecipe())); + if (recipe == null) { @@ -1650,14 +1551,14 @@ + org.bukkit.event.player.PlayerRecipeBookClickEvent event = CraftEventFactory.callRecipeBookClickEvent(this.player, recipe, packetplayinautorecipe.isShiftDown()); + + // Cast to keyed should be safe as the recipe will never be a MerchantRecipe. -+ this.server.getRecipeManager().byKey(CraftNamespacedKey.toMinecraft(((org.bukkit.Keyed) event.getRecipe()).getKey())).ifPresent((irecipe) -> { -+ ((ContainerRecipeBook) this.player.containerMenu).handlePlacement(event.isShiftClick(), irecipe, this.player); ++ this.server.getRecipeManager().byKey(CraftNamespacedKey.toMinecraft(((org.bukkit.Keyed) event.getRecipe()).getKey())).ifPresent((recipeholder) -> { ++ ((ContainerRecipeBook) this.player.containerMenu).handlePlacement(event.isShiftClick(), recipeholder, this.player); }); + // CraftBukkit end } } } -@@ -1759,6 +2828,7 @@ +@@ -1708,6 +2704,7 @@ @Override public void handleContainerButtonClick(PacketPlayInEnchantItem packetplayinenchantitem) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinenchantitem, this, this.player.serverLevel()); @@ -1665,7 +1566,7 @@ this.player.resetLastActionTime(); if (this.player.containerMenu.containerId == packetplayinenchantitem.getContainerId() && !this.player.isSpectator()) { if (!this.player.containerMenu.stillValid(this.player)) { -@@ -1801,6 +2871,43 @@ +@@ -1750,6 +2747,43 @@ boolean flag1 = packetplayinsetcreativeslot.getSlotNum() >= 1 && packetplayinsetcreativeslot.getSlotNum() <= 45; boolean flag2 = itemstack.isEmpty() || itemstack.getDamageValue() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty(); @@ -1709,7 +1610,7 @@ if (flag1 && flag2) { this.player.inventoryMenu.getSlot(packetplayinsetcreativeslot.getSlotNum()).setByPlayer(itemstack); -@@ -1823,6 +2930,7 @@ +@@ -1772,6 +2806,7 @@ } private void updateSignText(PacketPlayInUpdateSign packetplayinupdatesign, List list) { @@ -1717,15 +1618,7 @@ this.player.resetLastActionTime(); WorldServer worldserver = this.player.serverLevel(); BlockPosition blockposition = packetplayinupdatesign.getPos(); -@@ -1843,6 +2951,7 @@ - - @Override - public void handleKeepAlive(PacketPlayInKeepAlive packetplayinkeepalive) { -+ PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinkeepalive, this, this.player.serverLevel()); // CraftBukkit - if (this.keepAlivePending && packetplayinkeepalive.getId() == this.keepAliveChallenge) { - int i = (int) (SystemUtils.getMillis() - this.keepAliveTime); - -@@ -1857,7 +2966,17 @@ +@@ -1793,7 +2828,17 @@ @Override public void handlePlayerAbilities(PacketPlayInAbilities packetplayinabilities) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinabilities, this, this.player.serverLevel()); @@ -1744,56 +1637,12 @@ } @Override -@@ -1866,8 +2985,50 @@ - this.player.updateOptions(packetplayinsettings); +@@ -1852,7 +2897,7 @@ + if (!this.waitingForSwitchToConfig) { + throw new IllegalStateException("Client acknowledged config, but none was requested"); + } else { +- this.connection.setListener(new ServerConfigurationPacketListenerImpl(this.server, this.connection, this.createCookie(this.player.clientInformation()))); ++ this.connection.setListener(new ServerConfigurationPacketListenerImpl(this.server, this.connection, this.createCookie(this.player.clientInformation()), this.player)); // CraftBukkit + } } -- @Override -- public void handleCustomPayload(PacketPlayInCustomPayload packetplayincustompayload) {} -+ // CraftBukkit start -+ private static final MinecraftKey CUSTOM_REGISTER = new MinecraftKey("register"); -+ private static final MinecraftKey CUSTOM_UNREGISTER = new MinecraftKey("unregister"); -+ -+ @Override -+ public void handleCustomPayload(PacketPlayInCustomPayload packetplayincustompayload) { -+ PlayerConnectionUtils.ensureRunningOnSameThread(packetplayincustompayload, this, this.player.serverLevel()); -+ if (packetplayincustompayload.identifier.equals(CUSTOM_REGISTER)) { -+ try { -+ String channels = packetplayincustompayload.data.toString(com.google.common.base.Charsets.UTF_8); -+ for (String channel : channels.split("\0")) { -+ getCraftPlayer().addChannel(channel); -+ } -+ } catch (Exception ex) { -+ PlayerConnection.LOGGER.error("Couldn\'t register custom payload", ex); -+ this.disconnect("Invalid payload REGISTER!"); -+ } -+ } else if (packetplayincustompayload.identifier.equals(CUSTOM_UNREGISTER)) { -+ try { -+ String channels = packetplayincustompayload.data.toString(com.google.common.base.Charsets.UTF_8); -+ for (String channel : channels.split("\0")) { -+ getCraftPlayer().removeChannel(channel); -+ } -+ } catch (Exception ex) { -+ PlayerConnection.LOGGER.error("Couldn\'t unregister custom payload", ex); -+ this.disconnect("Invalid payload UNREGISTER!"); -+ } -+ } else { -+ try { -+ byte[] data = new byte[packetplayincustompayload.data.readableBytes()]; -+ packetplayincustompayload.data.readBytes(data); -+ cserver.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packetplayincustompayload.identifier.toString(), data); -+ } catch (Exception ex) { -+ PlayerConnection.LOGGER.error("Couldn\'t dispatch custom payload", ex); -+ this.disconnect("Invalid custom payload!"); -+ } -+ } -+ -+ } -+ -+ public final boolean isDisconnected() { -+ return !this.player.joining && !this.connection.isConnected(); -+ } -+ // CraftBukkit end - - @Override - public void handleChangeDifficulty(PacketPlayInDifficultyChange packetplayindifficultychange) { diff --git a/nms-patches/net/minecraft/server/network/ServerCommonPacketListenerImpl.patch b/nms-patches/net/minecraft/server/network/ServerCommonPacketListenerImpl.patch new file mode 100644 index 000000000..448d1287a --- /dev/null +++ b/nms-patches/net/minecraft/server/network/ServerCommonPacketListenerImpl.patch @@ -0,0 +1,215 @@ +--- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java ++++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +@@ -26,6 +26,21 @@ + import net.minecraft.util.thread.IAsyncTaskHandler; + import org.slf4j.Logger; + ++// CraftBukkit start ++import io.netty.buffer.ByteBuf; ++import java.util.concurrent.ExecutionException; ++import net.minecraft.EnumChatFormat; ++import net.minecraft.network.protocol.game.PacketPlayOutSpawnPosition; ++import net.minecraft.resources.MinecraftKey; ++import net.minecraft.server.level.EntityPlayer; ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++import org.bukkit.craftbukkit.util.CraftChatMessage; ++import org.bukkit.craftbukkit.util.CraftLocation; ++import org.bukkit.craftbukkit.util.Waitable; ++import org.bukkit.event.player.PlayerKickEvent; ++import org.bukkit.event.player.PlayerResourcePackStatusEvent; ++// CraftBukkit end ++ + public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener { + + private static final Logger LOGGER = LogUtils.getLogger(); +@@ -39,11 +54,22 @@ + private int latency; + private volatile boolean suspendFlushingOnServerThread = false; + +- public ServerCommonPacketListenerImpl(MinecraftServer minecraftserver, NetworkManager networkmanager, CommonListenerCookie commonlistenercookie) { ++ public ServerCommonPacketListenerImpl(MinecraftServer minecraftserver, NetworkManager networkmanager, CommonListenerCookie commonlistenercookie, EntityPlayer player) { // CraftBukkit + this.server = minecraftserver; + this.connection = networkmanager; + this.keepAliveTime = SystemUtils.getMillis(); + this.latency = commonlistenercookie.latency(); ++ // CraftBukkit start - add fields and methods ++ this.player = player; ++ this.cserver = minecraftserver.server; ++ } ++ protected final EntityPlayer player; ++ protected final org.bukkit.craftbukkit.CraftServer cserver; ++ public boolean processedDisconnect; ++ ++ public CraftPlayer getCraftPlayer() { ++ return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity(); ++ // CraftBukkit end + } + + @Override +@@ -57,6 +83,7 @@ + + @Override + public void handleKeepAlive(ServerboundKeepAlivePacket serverboundkeepalivepacket) { ++ PlayerConnectionUtils.ensureRunningOnSameThread(serverboundkeepalivepacket, this, this.player.serverLevel()); // CraftBukkit + if (this.keepAlivePending && serverboundkeepalivepacket.getId() == this.keepAliveChallenge) { + int i = (int) (SystemUtils.getMillis() - this.keepAliveTime); + +@@ -71,8 +98,56 @@ + @Override + public void handlePong(ServerboundPongPacket serverboundpongpacket) {} + ++ // CraftBukkit start ++ private static final MinecraftKey CUSTOM_REGISTER = new MinecraftKey("register"); ++ private static final MinecraftKey CUSTOM_UNREGISTER = new MinecraftKey("unregister"); ++ + @Override +- public void handleCustomPayload(ServerboundCustomPayloadPacket serverboundcustompayloadpacket) {} ++ public void handleCustomPayload(ServerboundCustomPayloadPacket serverboundcustompayloadpacket) { ++ if (!(serverboundcustompayloadpacket.payload() instanceof ServerboundCustomPayloadPacket.UnknownPayload)) { ++ return; ++ } ++ PlayerConnectionUtils.ensureRunningOnSameThread(serverboundcustompayloadpacket, this, this.player.serverLevel()); ++ MinecraftKey identifier = serverboundcustompayloadpacket.payload().id(); ++ ByteBuf payload = ((ServerboundCustomPayloadPacket.UnknownPayload)serverboundcustompayloadpacket.payload()).data(); ++ ++ if (identifier.equals(CUSTOM_REGISTER)) { ++ try { ++ String channels = payload.toString(com.google.common.base.Charsets.UTF_8); ++ for (String channel : channels.split("\0")) { ++ getCraftPlayer().addChannel(channel); ++ } ++ } catch (Exception ex) { ++ PlayerConnection.LOGGER.error("Couldn\'t register custom payload", ex); ++ this.disconnect("Invalid payload REGISTER!"); ++ } ++ } else if (identifier.equals(CUSTOM_UNREGISTER)) { ++ try { ++ String channels = payload.toString(com.google.common.base.Charsets.UTF_8); ++ for (String channel : channels.split("\0")) { ++ getCraftPlayer().removeChannel(channel); ++ } ++ } catch (Exception ex) { ++ PlayerConnection.LOGGER.error("Couldn\'t unregister custom payload", ex); ++ this.disconnect("Invalid payload UNREGISTER!"); ++ } ++ } else { ++ try { ++ byte[] data = new byte[payload.readableBytes()]; ++ payload.readBytes(data); ++ cserver.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), identifier.toString(), data); ++ } catch (Exception ex) { ++ PlayerConnection.LOGGER.error("Couldn\'t dispatch custom payload", ex); ++ this.disconnect("Invalid custom payload!"); ++ } ++ } ++ ++ } ++ ++ public final boolean isDisconnected() { ++ return !this.player.joining && !this.connection.isConnected(); ++ } ++ // CraftBukkit end + + @Override + public void handleResourcePackResponse(ServerboundResourcePackPacket serverboundresourcepackpacket) { +@@ -81,6 +156,7 @@ + ServerCommonPacketListenerImpl.LOGGER.info("Disconnecting {} due to resource pack rejection", this.playerProfile().getName()); + this.disconnect(IChatBaseComponent.translatable("multiplayer.requiredTexturePrompt.disconnect")); + } ++ this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(getCraftPlayer(), PlayerResourcePackStatusEvent.Status.values()[serverboundresourcepackpacket.getAction().ordinal()])); // CraftBukkit + + } + +@@ -88,7 +164,7 @@ + this.server.getProfiler().push("keepAlive"); + long i = SystemUtils.getMillis(); + +- if (i - this.keepAliveTime >= 15000L) { ++ if (i - this.keepAliveTime >= 25000L) { // CraftBukkit + if (this.keepAlivePending) { + this.disconnect(ServerCommonPacketListenerImpl.TIMEOUT_DISCONNECTION_MESSAGE); + } else { +@@ -116,6 +192,14 @@ + } + + public void send(Packet packet, @Nullable PacketSendListener packetsendlistener) { ++ // CraftBukkit start ++ if (packet == null) { ++ return; ++ } else if (packet instanceof PacketPlayOutSpawnPosition) { ++ PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet; ++ this.player.compassTarget = CraftLocation.toBukkit(packet6.pos, this.getCraftPlayer().getWorld()); ++ } ++ // CraftBukkit end + boolean flag = !this.suspendFlushingOnServerThread || !this.server.isSameThread(); + + try { +@@ -131,16 +215,67 @@ + } + } + ++ // CraftBukkit start ++ @Deprecated + public void disconnect(IChatBaseComponent ichatbasecomponent) { ++ disconnect(CraftChatMessage.fromComponent(ichatbasecomponent)); ++ } ++ // CraftBukkit end ++ ++ public void disconnect(String s) { ++ // CraftBukkit start - fire PlayerKickEvent ++ if (this.processedDisconnect) { ++ return; ++ } ++ if (!this.cserver.isPrimaryThread()) { ++ Waitable waitable = new Waitable() { ++ @Override ++ protected Object evaluate() { ++ ServerCommonPacketListenerImpl.this.disconnect(s); ++ return null; ++ } ++ }; ++ ++ this.server.processQueue.add(waitable); ++ ++ try { ++ waitable.get(); ++ } catch (InterruptedException e) { ++ Thread.currentThread().interrupt(); ++ } catch (ExecutionException e) { ++ throw new RuntimeException(e); ++ } ++ return; ++ } ++ ++ String leaveMessage = EnumChatFormat.YELLOW + this.player.getScoreboardName() + " left the game."; ++ ++ PlayerKickEvent event = new PlayerKickEvent(this.player.getBukkitEntity(), s, leaveMessage); ++ ++ if (this.cserver.getServer().isRunning()) { ++ this.cserver.getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ // Do not kick the player ++ return; ++ } ++ this.player.kickLeaveMessage = event.getLeaveMessage(); // CraftBukkit - SPIGOT-3034: Forward leave message to PlayerQuitEvent ++ // Send the possibly modified leave message ++ final IChatBaseComponent ichatbasecomponent = CraftChatMessage.fromString(event.getReason(), true)[0]; ++ // CraftBukkit end ++ + this.connection.send(new ClientboundDisconnectPacket(ichatbasecomponent), PacketSendListener.thenRun(() -> { + this.connection.disconnect(ichatbasecomponent); + })); ++ this.onDisconnect(ichatbasecomponent); // CraftBukkit - fire quit instantly + this.connection.setReadOnly(); + MinecraftServer minecraftserver = this.server; + NetworkManager networkmanager = this.connection; + + Objects.requireNonNull(this.connection); +- minecraftserver.executeBlocking(networkmanager::handleDisconnection); ++ // CraftBukkit - Don't wait ++ minecraftserver.wrapRunnable(networkmanager::handleDisconnection); + } + + protected boolean isSingleplayerOwner() { diff --git a/nms-patches/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.patch b/nms-patches/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.patch new file mode 100644 index 000000000..f35ab9432 --- /dev/null +++ b/nms-patches/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.patch @@ -0,0 +1,30 @@ +--- a/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java ++++ b/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java +@@ -44,8 +44,8 @@ + private ConfigurationTask currentTask; + private ClientInformation clientInformation; + +- public ServerConfigurationPacketListenerImpl(MinecraftServer minecraftserver, NetworkManager networkmanager, CommonListenerCookie commonlistenercookie) { +- super(minecraftserver, networkmanager, commonlistenercookie); ++ public ServerConfigurationPacketListenerImpl(MinecraftServer minecraftserver, NetworkManager networkmanager, CommonListenerCookie commonlistenercookie, EntityPlayer player) { // CraftBukkit ++ super(minecraftserver, networkmanager, commonlistenercookie, player); // CraftBukkit + this.gameProfile = commonlistenercookie.gameProfile(); + this.clientInformation = commonlistenercookie.clientInformation(); + } +@@ -117,14 +117,14 @@ + return; + } + +- IChatBaseComponent ichatbasecomponent = playerlist.canPlayerLogin(this.connection.getRemoteAddress(), this.gameProfile); ++ IChatBaseComponent ichatbasecomponent = null; // CraftBukkit - login checks already completed + + if (ichatbasecomponent != null) { + this.disconnect(ichatbasecomponent); + return; + } + +- EntityPlayer entityplayer = playerlist.getPlayerForLogin(this.gameProfile, this.clientInformation); ++ EntityPlayer entityplayer = playerlist.getPlayerForLogin(this.gameProfile, this.clientInformation, this.player); // CraftBukkit + + playerlist.placeNewPlayer(this.connection, entityplayer, this.createCookie(this.clientInformation)); + this.connection.resumeInboundAfterProtocolChange(); diff --git a/nms-patches/net/minecraft/server/network/ServerConnection.patch b/nms-patches/net/minecraft/server/network/ServerConnection.patch index 43d0944a7..65c45ba24 100644 --- a/nms-patches/net/minecraft/server/network/ServerConnection.patch +++ b/nms-patches/net/minecraft/server/network/ServerConnection.patch @@ -1,18 +1,18 @@ --- a/net/minecraft/server/network/ServerConnection.java +++ b/net/minecraft/server/network/ServerConnection.java -@@ -95,16 +95,26 @@ +@@ -98,16 +98,26 @@ - NetworkManager.configureSerialization(channelpipeline, EnumProtocolDirection.SERVERBOUND); + NetworkManager.configureSerialization(channelpipeline, EnumProtocolDirection.SERVERBOUND, (BandwidthDebugMonitor) null); int j = ServerConnection.this.server.getRateLimitPacketsPerSecond(); - Object object = j > 0 ? new NetworkManagerServer(j) : new NetworkManager(EnumProtocolDirection.SERVERBOUND); + NetworkManager object = j > 0 ? new NetworkManagerServer(j) : new NetworkManager(EnumProtocolDirection.SERVERBOUND); // CraftBukkit - decompile error ServerConnection.this.connections.add(object); - channelpipeline.addLast("packet_handler", (ChannelHandler) object); - ((NetworkManager) object).setListener(new HandshakeListener(ServerConnection.this.server, (NetworkManager) object)); + ((NetworkManager) object).configurePacketHandler(channelpipeline); + ((NetworkManager) object).setListenerForServerboundHandshake(new HandshakeListener(ServerConnection.this.server, (NetworkManager) object)); } -- }).group((EventLoopGroup) lazyinitvar.get()).localAddress(inetaddress, i)).bind().syncUninterruptibly()); -+ }).group((EventLoopGroup) lazyinitvar.get()).localAddress(inetaddress, i)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit +- }).group(eventloopgroup).localAddress(inetaddress, i)).bind().syncUninterruptibly()); ++ }).group(eventloopgroup).localAddress(inetaddress, i)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit } } diff --git a/nms-patches/net/minecraft/server/players/ExpirableListEntry.patch b/nms-patches/net/minecraft/server/players/ExpirableListEntry.patch index df193f97f..4291c5442 100644 --- a/nms-patches/net/minecraft/server/players/ExpirableListEntry.patch +++ b/nms-patches/net/minecraft/server/players/ExpirableListEntry.patch @@ -3,7 +3,7 @@ @@ -27,7 +27,7 @@ } - protected ExpirableListEntry(T t0, JsonObject jsonobject) { + protected ExpirableListEntry(@Nullable T t0, JsonObject jsonobject) { - super(t0); + super(checkExpiry(t0, jsonobject)); // CraftBukkit diff --git a/nms-patches/net/minecraft/server/players/JsonList.patch b/nms-patches/net/minecraft/server/players/JsonList.patch index 78aa48a54..5b359f8e0 100644 --- a/nms-patches/net/minecraft/server/players/JsonList.patch +++ b/nms-patches/net/minecraft/server/players/JsonList.patch @@ -41,12 +41,12 @@ JsonObject jsonobject = new JsonObject(); Objects.requireNonNull(jsonlistentry); -@@ -165,7 +166,7 @@ - JsonListEntry jsonlistentry = this.createEntry(jsonobject); +@@ -171,7 +172,7 @@ + JsonListEntry jsonlistentry = this.createEntry(jsonobject); - if (jsonlistentry.getUser() != null) { -- this.map.put(this.getKeyForUser(jsonlistentry.getUser()), jsonlistentry); -+ this.map.put(this.getKeyForUser(jsonlistentry.getUser()), (V) jsonlistentry); // CraftBukkit - decompile error + if (jsonlistentry.getUser() != null) { +- this.map.put(this.getKeyForUser(jsonlistentry.getUser()), jsonlistentry); ++ this.map.put(this.getKeyForUser(jsonlistentry.getUser()), (V) jsonlistentry); // CraftBukkit - decompile error + } } - } - } catch (Throwable throwable) { + } catch (Throwable throwable) { diff --git a/nms-patches/net/minecraft/server/players/NameReferencingFileConverter.patch b/nms-patches/net/minecraft/server/players/NameReferencingFileConverter.patch index 4c1cfb9ae..ae1f1bbce 100644 --- a/nms-patches/net/minecraft/server/players/NameReferencingFileConverter.patch +++ b/nms-patches/net/minecraft/server/players/NameReferencingFileConverter.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/players/NameReferencingFileConverter.java +++ b/net/minecraft/server/players/NameReferencingFileConverter.java -@@ -28,6 +28,11 @@ +@@ -27,6 +27,11 @@ import net.minecraft.world.level.storage.SavedFile; import org.slf4j.Logger; @@ -12,7 +12,7 @@ public class NameReferencingFileConverter { static final Logger LOGGER = LogUtils.getLogger(); -@@ -88,7 +93,7 @@ +@@ -87,7 +92,7 @@ try { gameprofilebanlist.load(); } catch (IOException ioexception) { @@ -21,7 +21,7 @@ } } -@@ -146,7 +151,7 @@ +@@ -145,7 +150,7 @@ try { ipbanlist.load(); } catch (IOException ioexception) { @@ -30,7 +30,7 @@ } } -@@ -187,7 +192,7 @@ +@@ -186,7 +191,7 @@ try { oplist.load(); } catch (IOException ioexception) { @@ -39,7 +39,7 @@ } } -@@ -231,7 +236,7 @@ +@@ -230,7 +235,7 @@ try { whitelist.load(); } catch (IOException ioexception) { @@ -48,7 +48,7 @@ } } -@@ -354,6 +359,30 @@ +@@ -349,6 +354,30 @@ File file5 = new File(file, s2 + ".dat"); File file6 = new File(file4, s3 + ".dat"); diff --git a/nms-patches/net/minecraft/server/players/PlayerList.patch b/nms-patches/net/minecraft/server/players/PlayerList.patch index 4d2e0f487..d4e9b43fe 100644 --- a/nms-patches/net/minecraft/server/players/PlayerList.patch +++ b/nms-patches/net/minecraft/server/players/PlayerList.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -108,6 +108,26 @@ +@@ -102,6 +102,26 @@ import net.minecraft.world.scores.ScoreboardTeamBase; import org.slf4j.Logger; @@ -27,7 +27,7 @@ public abstract class PlayerList { public static final File USERBANLIST_FILE = new File("banned-players.json"); -@@ -119,14 +139,16 @@ +@@ -114,14 +134,16 @@ private static final int SEND_PLAYER_INFO_INTERVAL = 600; private static final SimpleDateFormat BAN_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); private final MinecraftServer server; @@ -47,7 +47,7 @@ public final WorldNBTStorage playerIo; private boolean doWhiteList; private final LayeredRegistryAccess registries; -@@ -138,13 +160,23 @@ +@@ -132,13 +154,23 @@ private static final boolean ALLOW_LOGOUTIVATOR = false; private int sendAllPlayerInfoIn; @@ -72,8 +72,8 @@ + // CraftBukkit end this.server = minecraftserver; this.registries = layeredregistryaccess; - this.synchronizedRegistries = (new IRegistryCustom.c(RegistrySynchronization.networkedRegistries(layeredregistryaccess))).freeze(); -@@ -168,9 +200,15 @@ + this.maxPlayers = i; +@@ -161,9 +193,15 @@ NBTTagCompound nbttagcompound = this.load(entityplayer); ResourceKey resourcekey; @@ -90,9 +90,9 @@ Logger logger = PlayerList.LOGGER; Objects.requireNonNull(logger); -@@ -197,7 +235,8 @@ - s1 = networkmanager.getRemoteAddress().toString(); - } +@@ -186,7 +224,8 @@ + entityplayer.setServerLevel(worldserver1); + String s1 = networkmanager.getLoggableAddress(this.server.logIPs()); - PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", new Object[]{entityplayer.getName().getString(), s1, entityplayer.getId(), entityplayer.getX(), entityplayer.getY(), entityplayer.getZ()}); + // CraftBukkit - Moved message to after join @@ -100,15 +100,15 @@ WorldData worlddata = worldserver1.getLevelData(); entityplayer.loadGameTypes(nbttagcompound); -@@ -207,6 +246,7 @@ - boolean flag1 = gamerules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); +@@ -197,6 +236,7 @@ + boolean flag2 = gamerules.getBoolean(GameRules.RULE_LIMITED_CRAFTING); - playerconnection.send(new PacketPlayOutLogin(entityplayer.getId(), worlddata.isHardcore(), entityplayer.gameMode.getGameModeForPlayer(), entityplayer.gameMode.getPreviousGameModeForPlayer(), this.server.levelKeys(), this.synchronizedRegistries, worldserver1.dimensionTypeId(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), this.getMaxPlayers(), this.viewDistance, this.simulationDistance, flag1, !flag, worldserver1.isDebug(), worldserver1.isFlat(), entityplayer.getLastDeathLocation(), entityplayer.getPortalCooldown())); + playerconnection.send(new PacketPlayOutLogin(entityplayer.getId(), worlddata.isHardcore(), this.server.levelKeys(), this.getMaxPlayers(), this.viewDistance, this.simulationDistance, flag1, !flag, flag2, entityplayer.createCommonSpawnInfo(worldserver1))); + entityplayer.getBukkitEntity().sendSupportedChannels(); // CraftBukkit - playerconnection.send(new ClientboundUpdateEnabledFeaturesPacket(FeatureFlags.REGISTRY.toNames(worldserver1.enabledFeatures()))); - playerconnection.send(new PacketPlayOutCustomPayload(PacketPlayOutCustomPayload.BRAND, (new PacketDataSerializer(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); playerconnection.send(new PacketPlayOutServerDifficulty(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); -@@ -226,8 +266,10 @@ + playerconnection.send(new PacketPlayOutAbilities(entityplayer.getAbilities())); + playerconnection.send(new PacketPlayOutHeldItemSlot(entityplayer.getInventory().selected)); +@@ -213,8 +253,10 @@ } else { ichatmutablecomponent = IChatBaseComponent.translatable("multiplayer.player.joined.renamed", entityplayer.getDisplayName(), s); } @@ -120,7 +120,7 @@ playerconnection.teleport(entityplayer.getX(), entityplayer.getY(), entityplayer.getZ(), entityplayer.getYRot(), entityplayer.getXRot()); ServerPing serverping = this.server.getStatus(); -@@ -235,13 +277,64 @@ +@@ -222,13 +264,64 @@ entityplayer.sendServerStatus(serverping); } @@ -186,10 +186,10 @@ + + worldserver1 = entityplayer.serverLevel(); // CraftBukkit - Update in case join event changed it + // CraftBukkit end - this.server.getServerResourcePack().ifPresent((minecraftserver_serverresourcepackinfo) -> { - entityplayer.sendTexturePack(minecraftserver_serverresourcepackinfo.url(), minecraftserver_serverresourcepackinfo.hash(), minecraftserver_serverresourcepackinfo.isRequired(), minecraftserver_serverresourcepackinfo.prompt()); - }); -@@ -255,8 +348,11 @@ + Iterator iterator = entityplayer.getActiveEffects().iterator(); + + while (iterator.hasNext()) { +@@ -239,8 +332,11 @@ if (nbttagcompound != null && nbttagcompound.contains("RootVehicle", 10)) { NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("RootVehicle"); @@ -203,7 +203,7 @@ }); if (entity != null) { -@@ -299,6 +395,8 @@ +@@ -283,6 +379,8 @@ } entityplayer.initInventoryMenu(); @@ -212,7 +212,7 @@ } public void updateEntireScoreboard(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) { -@@ -331,30 +429,31 @@ +@@ -319,30 +417,31 @@ } public void addWorldborderListener(WorldServer worldserver) { @@ -249,7 +249,7 @@ } @Override -@@ -382,14 +481,15 @@ +@@ -370,14 +469,15 @@ } protected void save(EntityPlayer entityplayer) { @@ -267,7 +267,7 @@ if (advancementdataplayer != null) { advancementdataplayer.save(); -@@ -397,10 +497,24 @@ +@@ -385,10 +485,24 @@ } @@ -293,7 +293,7 @@ this.save(entityplayer); if (entityplayer.isPassenger()) { Entity entity = entityplayer.getRootVehicle(); -@@ -424,18 +538,66 @@ +@@ -412,18 +526,66 @@ if (entityplayer1 == entityplayer) { this.playersByUUID.remove(uuid); @@ -333,7 +333,7 @@ - if (this.bans.isBanned(gameprofile)) { + // Moved from processLogin -+ UUID uuid = UUIDUtil.getOrCreatePlayerUUID(gameprofile); ++ UUID uuid = gameprofile.getId(); + List list = Lists.newArrayList(); + + EntityPlayer entityplayer; @@ -358,7 +358,7 @@ + // depending on the outcome. + SocketAddress socketaddress = loginlistener.connection.getRemoteAddress(); + -+ EntityPlayer entity = new EntityPlayer(this.server, this.server.getLevel(World.OVERWORLD), gameprofile); ++ EntityPlayer entity = new EntityPlayer(this.server, this.server.getLevel(World.OVERWORLD), gameprofile, ClientInformation.createDefault()); + Player player = entity.getBukkitEntity(); + PlayerLoginEvent event = new PlayerLoginEvent(player, loginlistener.connection.hostname, ((java.net.InetSocketAddress) socketaddress).getAddress()); + @@ -366,7 +366,7 @@ GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.bans.get(gameprofile); ichatmutablecomponent = IChatBaseComponent.translatable("multiplayer.disconnect.banned.reason", gameprofilebanentry.getReason()); -@@ -443,10 +605,12 @@ +@@ -431,10 +593,12 @@ ichatmutablecomponent.append((IChatBaseComponent) IChatBaseComponent.translatable("multiplayer.disconnect.banned.expiration", PlayerList.BAN_DATE_FORMAT.format(gameprofilebanentry.getExpires()))); } @@ -382,7 +382,7 @@ IpBanEntry ipbanentry = this.ipBans.get(socketaddress); ichatmutablecomponent = IChatBaseComponent.translatable("multiplayer.disconnect.banned_ip.reason", ipbanentry.getReason()); -@@ -454,13 +618,25 @@ +@@ -442,17 +606,32 @@ ichatmutablecomponent.append((IChatBaseComponent) IChatBaseComponent.translatable("multiplayer.disconnect.banned_ip.expiration", PlayerList.BAN_DATE_FORMAT.format(ipbanentry.getExpires()))); } @@ -405,18 +405,27 @@ + return entity; } -- public EntityPlayer getPlayerForLogin(GameProfile gameprofile) { -+ public EntityPlayer getPlayerForLogin(GameProfile gameprofile, EntityPlayer player) { // CraftBukkit - added EntityPlayer -+ /* CraftBukkit startMoved up - UUID uuid = UUIDUtil.getOrCreatePlayerUUID(gameprofile); - List list = Lists.newArrayList(); +- public EntityPlayer getPlayerForLogin(GameProfile gameprofile, ClientInformation clientinformation) { +- return new EntityPlayer(this.server, this.server.overworld(), gameprofile, clientinformation); ++ // CraftBukkit start - added EntityPlayer ++ public EntityPlayer getPlayerForLogin(GameProfile gameprofile, ClientInformation clientinformation, EntityPlayer player) { ++ player.updateOptions(clientinformation); ++ return player; ++ // CraftBukkit end + } -@@ -487,14 +663,24 @@ +- public boolean disconnectAllPlayersWithProfile(GameProfile gameprofile) { ++ public boolean disconnectAllPlayersWithProfile(GameProfile gameprofile, EntityPlayer player) { // CraftBukkit - added EntityPlayer ++ /* CraftBukkit startMoved up + UUID uuid = gameprofile.getId(); + Set set = Sets.newIdentityHashSet(); + Iterator iterator = this.players.iterator(); +@@ -480,14 +659,24 @@ } - return new EntityPlayer(this.server, this.server.overworld(), gameprofile); + return !set.isEmpty(); + */ -+ return player; ++ return player == null; + // CraftBukkit end + } + @@ -437,10 +446,10 @@ WorldServer worldserver = this.server.getLevel(entityplayer.getRespawnDimension()); Optional optional; -@@ -506,6 +692,11 @@ +@@ -499,6 +688,11 @@ WorldServer worldserver1 = worldserver != null && optional.isPresent() ? worldserver : this.server.overworld(); - EntityPlayer entityplayer1 = new EntityPlayer(this.server, worldserver1, entityplayer.getGameProfile()); + EntityPlayer entityplayer1 = new EntityPlayer(this.server, worldserver1, entityplayer.getGameProfile(), entityplayer.clientInformation()); + // */ + EntityPlayer entityplayer1 = entityplayer; + org.bukkit.World fromWorld = entityplayer.getBukkitEntity().getWorld(); @@ -449,7 +458,7 @@ entityplayer1.connection = entityplayer.connection; entityplayer1.restoreFrom(entityplayer, flag); -@@ -521,50 +712,112 @@ +@@ -514,28 +708,66 @@ boolean flag2 = false; @@ -521,27 +530,23 @@ + location.setWorld(worldserver.getWorld()); } + WorldServer worldserver1 = ((CraftWorld) location.getWorld()).getHandle(); ++ entityplayer1.spawnIn(worldserver1); ++ entityplayer1.unsetRemoved(); ++ entityplayer1.setShiftKeyDown(false); + entityplayer1.forceSetPositionRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); -+ // CraftBukkit end - while (!worldserver1.noCollision((Entity) entityplayer1) && entityplayer1.getY() < (double) worldserver1.getMaxBuildHeight()) { + while (avoidSuffocation && !worldserver1.noCollision((Entity) entityplayer1) && entityplayer1.getY() < (double) worldserver1.getMaxBuildHeight()) { ++ // CraftBukkit end entityplayer1.setPos(entityplayer1.getX(), entityplayer1.getY() + 1.0D, entityplayer1.getZ()); } - int i = flag ? 1 : 0; -- WorldData worlddata = entityplayer1.level().getLevelData(); -+ // CraftBukkit start -+ WorldData worlddata = worldserver1.getLevelData(); -+ entityplayer1.connection.send(new PacketPlayOutRespawn(worldserver1.dimensionTypeId(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), worldserver1.isDebug(), worldserver1.isFlat(), (byte) i, entityplayer1.getLastDeathLocation(), entityplayer1.getPortalCooldown())); -+ entityplayer1.spawnIn(worldserver1); -+ entityplayer1.unsetRemoved(); -+ entityplayer1.connection.teleport(CraftLocation.toBukkit(entityplayer1.position(), worldserver1.getWorld(), entityplayer1.getYRot(), entityplayer1.getXRot())); -+ entityplayer1.setShiftKeyDown(false); +@@ -544,21 +776,43 @@ + WorldData worlddata = worldserver2.getLevelData(); -- entityplayer1.connection.send(new PacketPlayOutRespawn(entityplayer1.level().dimensionTypeId(), entityplayer1.level().dimension(), BiomeManager.obfuscateSeed(entityplayer1.serverLevel().getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), entityplayer1.level().isDebug(), entityplayer1.serverLevel().isFlat(), (byte) i, entityplayer1.getLastDeathLocation(), entityplayer1.getPortalCooldown())); + entityplayer1.connection.send(new PacketPlayOutRespawn(entityplayer1.createCommonSpawnInfo(worldserver2), (byte) i)); - entityplayer1.connection.teleport(entityplayer1.getX(), entityplayer1.getY(), entityplayer1.getZ(), entityplayer1.getYRot(), entityplayer1.getXRot()); -+ // entityplayer1.connection.teleport(entityplayer1.getX(), entityplayer1.getY(), entityplayer1.getZ(), entityplayer1.getYRot(), entityplayer1.getXRot()); ++ entityplayer1.connection.teleport(CraftLocation.toBukkit(entityplayer1.position(), worldserver2.getWorld(), entityplayer1.getYRot(), entityplayer1.getXRot())); // CraftBukkit entityplayer1.connection.send(new PacketPlayOutSpawnPosition(worldserver1.getSharedSpawnPos(), worldserver1.getSharedSpawnAngle())); entityplayer1.connection.send(new PacketPlayOutServerDifficulty(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); entityplayer1.connection.send(new PacketPlayOutExperience(entityplayer1.experienceProgress, entityplayer1.totalExperience, entityplayer1.experienceLevel)); @@ -570,13 +575,13 @@ + + // Fire advancement trigger + entityplayer.triggerDimensionChangeTriggers(((CraftWorld) fromWorld).getHandle()); - ++ + // Don't fire on respawn + if (fromWorld != location.getWorld()) { + PlayerChangedWorldEvent event = new PlayerChangedWorldEvent(entityplayer.getBukkitEntity(), fromWorld); + server.server.getPluginManager().callEvent(event); + } -+ + + // Save player file again if they were disconnected + if (entityplayer.connection.isDisconnected()) { + this.save(entityplayer); @@ -585,7 +590,7 @@ return entityplayer1; } -@@ -577,7 +830,18 @@ +@@ -571,7 +825,18 @@ public void tick() { if (++this.sendAllPlayerInfoIn > 600) { @@ -605,7 +610,7 @@ this.sendAllPlayerInfoIn = 0; } -@@ -594,6 +858,25 @@ +@@ -588,6 +853,25 @@ } @@ -631,7 +636,7 @@ public void broadcastAll(Packet packet, ResourceKey resourcekey) { Iterator iterator = this.players.iterator(); -@@ -672,7 +955,7 @@ +@@ -666,7 +950,7 @@ } public void deop(GameProfile gameprofile) { @@ -640,7 +645,7 @@ EntityPlayer entityplayer = this.getPlayer(gameprofile.getId()); if (entityplayer != null) { -@@ -696,6 +979,7 @@ +@@ -690,6 +974,7 @@ entityplayer.connection.send(new PacketPlayOutEntityStatus(entityplayer, b0)); } @@ -648,7 +653,7 @@ this.server.getCommands().sendCommands(entityplayer); } -@@ -728,6 +1012,12 @@ +@@ -722,6 +1007,12 @@ for (int i = 0; i < this.players.size(); ++i) { EntityPlayer entityplayer = (EntityPlayer) this.players.get(i); @@ -661,7 +666,7 @@ if (entityplayer != entityhuman && entityplayer.level().dimension() == resourcekey) { double d4 = d0 - entityplayer.getX(); double d5 = d1 - entityplayer.getY(); -@@ -767,23 +1057,35 @@ +@@ -761,23 +1052,35 @@ public void reloadWhiteList() {} public void sendLevelInfo(EntityPlayer entityplayer, WorldServer worldserver) { @@ -702,7 +707,7 @@ } public int getPlayerCount() { -@@ -839,12 +1141,22 @@ +@@ -833,12 +1136,22 @@ } public void removeAll() { @@ -727,7 +732,7 @@ public void broadcastSystemMessage(IChatBaseComponent ichatbasecomponent, boolean flag) { this.broadcastSystemMessage(ichatbasecomponent, (entityplayer) -> { return ichatbasecomponent; -@@ -902,16 +1214,23 @@ +@@ -896,16 +1209,23 @@ return playerchatmessage.hasSignature() && !playerchatmessage.hasExpiredServer(Instant.now()); } @@ -755,7 +760,7 @@ Path path = file2.toPath(); if (FileUtils.isPathNormalized(path) && FileUtils.isPathPortable(path) && path.startsWith(file.getPath()) && file2.isFile()) { -@@ -920,7 +1239,7 @@ +@@ -914,7 +1234,7 @@ } serverstatisticmanager = new ServerStatisticManager(this.server, file1); @@ -764,7 +769,7 @@ } return serverstatisticmanager; -@@ -928,13 +1247,13 @@ +@@ -922,13 +1242,13 @@ public AdvancementDataPlayer getPlayerAdvancements(EntityPlayer entityplayer) { UUID uuid = entityplayer.getUUID(); @@ -780,7 +785,7 @@ } advancementdataplayer.setPlayer(entityplayer); -@@ -985,13 +1304,20 @@ +@@ -979,13 +1299,20 @@ } public void reloadResources() { @@ -800,5 +805,5 @@ } + // CraftBukkit end - this.broadcastAll(new PacketPlayOutTags(TagNetworkSerialization.serializeTagsToNetwork(this.registries))); + this.broadcastAll(new ClientboundUpdateTagsPacket(TagNetworkSerialization.serializeTagsToNetwork(this.registries))); PacketPlayOutRecipeUpdate packetplayoutrecipeupdate = new PacketPlayOutRecipeUpdate(this.server.getRecipeManager().getRecipes()); diff --git a/nms-patches/net/minecraft/server/players/UserCache.patch b/nms-patches/net/minecraft/server/players/UserCache.patch index fbcc8d4af..959e77c72 100644 --- a/nms-patches/net/minecraft/server/players/UserCache.patch +++ b/nms-patches/net/minecraft/server/players/UserCache.patch @@ -5,10 +5,10 @@ package net.minecraft.server.players; import com.google.common.collect.ImmutableList; -@@ -93,7 +94,7 @@ +@@ -81,7 +82,7 @@ } - public void onProfileLookupFailed(GameProfile gameprofile, Exception exception) { + public void onProfileLookupFailed(String s1, Exception exception) { - atomicreference.set((Object) null); + atomicreference.set(null); // CraftBukkit - decompile error } diff --git a/nms-patches/net/minecraft/stats/RecipeBookServer.patch b/nms-patches/net/minecraft/stats/RecipeBookServer.patch index 705cbb4d3..82d48407a 100644 --- a/nms-patches/net/minecraft/stats/RecipeBookServer.patch +++ b/nms-patches/net/minecraft/stats/RecipeBookServer.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/stats/RecipeBookServer.java +++ b/net/minecraft/stats/RecipeBookServer.java @@ -20,6 +20,8 @@ - import net.minecraft.world.item.crafting.IRecipe; + import net.minecraft.world.item.crafting.RecipeHolder; import org.slf4j.Logger; +import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit @@ -10,11 +10,11 @@ public static final String RECIPE_BOOK_TAG = "recipeBook"; @@ -36,7 +38,7 @@ - IRecipe irecipe = (IRecipe) iterator.next(); - MinecraftKey minecraftkey = irecipe.getId(); + RecipeHolder recipeholder = (RecipeHolder) iterator.next(); + MinecraftKey minecraftkey = recipeholder.id(); -- if (!this.known.contains(minecraftkey) && !irecipe.isSpecial()) { -+ if (!this.known.contains(minecraftkey) && !irecipe.isSpecial() && CraftEventFactory.handlePlayerRecipeListUpdateEvent(entityplayer, minecraftkey)) { // CraftBukkit +- if (!this.known.contains(minecraftkey) && !recipeholder.value().isSpecial()) { ++ if (!this.known.contains(minecraftkey) && !recipeholder.value().isSpecial() && CraftEventFactory.handlePlayerRecipeListUpdateEvent(entityplayer, minecraftkey)) { // CraftBukkit this.add(minecraftkey); this.addHighlight(minecraftkey); list.add(minecraftkey); diff --git a/nms-patches/net/minecraft/util/datafix/DataConverterRegistry.patch b/nms-patches/net/minecraft/util/datafix/DataConverterRegistry.patch index 70a390799..b1448c8e2 100644 --- a/nms-patches/net/minecraft/util/datafix/DataConverterRegistry.patch +++ b/nms-patches/net/minecraft/util/datafix/DataConverterRegistry.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/util/datafix/DataConverterRegistry.java +++ b/net/minecraft/util/datafix/DataConverterRegistry.java -@@ -445,6 +445,18 @@ +@@ -448,6 +448,18 @@ datafixerbuilder.addFixer(new DataConverterItemFrame(schema44, false)); Schema schema45 = datafixerbuilder.addSchema(1458, DataConverterRegistry.SAME_NAMESPACED); @@ -19,7 +19,7 @@ datafixerbuilder.addFixer(new DataConverterCustomNameEntity(schema45, false)); datafixerbuilder.addFixer(new DataConverterCustomNameItem(schema45, false)); datafixerbuilder.addFixer(new DataConverterCustomNameTile(schema45, false)); -@@ -762,12 +774,14 @@ +@@ -766,12 +778,14 @@ datafixerbuilder.addFixer(new DataConverterAddChoices(schema129, "Added Glow Squid", DataConverterTypes.ENTITY)); datafixerbuilder.addFixer(new DataConverterAddChoices(schema129, "Added Glow Item Frame", DataConverterTypes.ENTITY)); Schema schema130 = datafixerbuilder.addSchema(2690, DataConverterRegistry.SAME_NAMESPACED); @@ -36,7 +36,7 @@ datafixerbuilder.addFixer(DataConverterItemName.create(schema131, "Rename copper item suffixes", createRenamer(immutablemap1))); datafixerbuilder.addFixer(BlockRenameFixWithJigsaw.create(schema131, "Rename copper blocks suffixes", createRenamer(immutablemap1))); -@@ -775,7 +789,8 @@ +@@ -779,7 +793,8 @@ datafixerbuilder.addFixer(new AddFlagIfNotPresentFix(schema132, DataConverterTypes.WORLD_GEN_SETTINGS, "has_increased_height_already", false)); Schema schema133 = datafixerbuilder.addSchema(2696, DataConverterRegistry.SAME_NAMESPACED); @@ -46,7 +46,7 @@ datafixerbuilder.addFixer(DataConverterItemName.create(schema133, "Renamed grimstone block items to deepslate", createRenamer(immutablemap2))); datafixerbuilder.addFixer(BlockRenameFixWithJigsaw.create(schema133, "Renamed grimstone blocks to deepslate", createRenamer(immutablemap2))); -@@ -862,10 +877,11 @@ +@@ -866,10 +881,11 @@ datafixerbuilder.addFixer(new DataConverterAddChoices(schema158, "Added Allay", DataConverterTypes.ENTITY)); Schema schema159 = datafixerbuilder.addSchema(3084, DataConverterRegistry.SAME_NAMESPACED); @@ -60,7 +60,7 @@ int2objectopenhashmap1.defaultReturnValue("minecraft:tabby"); int2objectopenhashmap1.put(0, "minecraft:tabby"); int2objectopenhashmap1.put(1, "minecraft:black"); -@@ -882,7 +898,8 @@ +@@ -886,7 +902,8 @@ Objects.requireNonNull(int2objectopenhashmap); datafixerbuilder.addFixer(new EntityVariantFix(schema160, "Change cat variant type", typereference, "minecraft:cat", "CatType", int2objectopenhashmap::get)); diff --git a/nms-patches/net/minecraft/world/IInventory.patch b/nms-patches/net/minecraft/world/IInventory.patch index 20655e444..8fecf7209 100644 --- a/nms-patches/net/minecraft/world/IInventory.patch +++ b/nms-patches/net/minecraft/world/IInventory.patch @@ -5,7 +5,7 @@ import net.minecraft.world.level.block.entity.TileEntity; +// CraftBukkit start -+import net.minecraft.world.item.crafting.IRecipe; ++import net.minecraft.world.item.crafting.RecipeHolder; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +// CraftBukkit end + @@ -43,11 +43,11 @@ + + org.bukkit.Location getLocation(); + -+ default IRecipe getCurrentRecipe() { ++ default RecipeHolder getCurrentRecipe() { + return null; + } + -+ default void setCurrentRecipe(IRecipe recipe) { ++ default void setCurrentRecipe(RecipeHolder recipe) { + } + + int MAX_STACK = 64; diff --git a/nms-patches/net/minecraft/world/effect/HealOrHarmMobEffect.patch b/nms-patches/net/minecraft/world/effect/HealOrHarmMobEffect.patch new file mode 100644 index 000000000..f4b437045 --- /dev/null +++ b/nms-patches/net/minecraft/world/effect/HealOrHarmMobEffect.patch @@ -0,0 +1,20 @@ +--- a/net/minecraft/world/effect/HealOrHarmMobEffect.java ++++ b/net/minecraft/world/effect/HealOrHarmMobEffect.java +@@ -17,7 +17,7 @@ + public void applyEffectTick(EntityLiving entityliving, int i) { + super.applyEffectTick(entityliving, i); + if (this.isHarm == entityliving.isInvertedHealAndHarm()) { +- entityliving.heal((float) Math.max(4 << i, 0)); ++ entityliving.heal((float) Math.max(4 << i, 0), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.MAGIC); // CraftBukkit + } else { + entityliving.hurt(entityliving.damageSources().magic(), (float) (6 << i)); + } +@@ -30,7 +30,7 @@ + + if (this.isHarm == entityliving.isInvertedHealAndHarm()) { + j = (int) (d0 * (double) (4 << i) + 0.5D); +- entityliving.heal((float) j); ++ entityliving.heal((float) j, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.MAGIC); // CraftBukkit + } else { + j = (int) (d0 * (double) (6 << i) + 0.5D); + if (entity == null) { diff --git a/nms-patches/net/minecraft/world/effect/HungerMobEffect.patch b/nms-patches/net/minecraft/world/effect/HungerMobEffect.patch new file mode 100644 index 000000000..65962d9d0 --- /dev/null +++ b/nms-patches/net/minecraft/world/effect/HungerMobEffect.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/world/effect/HungerMobEffect.java ++++ b/net/minecraft/world/effect/HungerMobEffect.java +@@ -15,7 +15,7 @@ + if (entityliving instanceof EntityHuman) { + EntityHuman entityhuman = (EntityHuman) entityliving; + +- entityhuman.causeFoodExhaustion(0.005F * (float) (i + 1)); ++ entityhuman.causeFoodExhaustion(0.005F * (float) (i + 1), org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.HUNGER_EFFECT); // CraftBukkit - EntityExhaustionEvent + } + + } diff --git a/nms-patches/net/minecraft/world/effect/MobEffectList.patch b/nms-patches/net/minecraft/world/effect/MobEffectList.patch deleted file mode 100644 index c4cecfb9b..000000000 --- a/nms-patches/net/minecraft/world/effect/MobEffectList.patch +++ /dev/null @@ -1,67 +0,0 @@ ---- a/net/minecraft/world/effect/MobEffectList.java -+++ b/net/minecraft/world/effect/MobEffectList.java -@@ -19,6 +19,14 @@ - import net.minecraft.world.entity.ai.attributes.AttributeModifier; - import net.minecraft.world.entity.player.EntityHuman; - -+// CraftBukkit start -+import net.minecraft.network.protocol.game.PacketPlayOutUpdateHealth; -+import net.minecraft.server.level.EntityPlayer; -+import org.bukkit.craftbukkit.entity.CraftPlayer; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; -+// CraftBukkit end -+ - public class MobEffectList { - - private final Map attributeModifiers = Maps.newHashMap(); -@@ -55,26 +63,35 @@ - public void applyEffectTick(EntityLiving entityliving, int i) { - if (this == MobEffects.REGENERATION) { - if (entityliving.getHealth() < entityliving.getMaxHealth()) { -- entityliving.heal(1.0F); -+ entityliving.heal(1.0F, RegainReason.MAGIC_REGEN); // CraftBukkit - } - } else if (this == MobEffects.POISON) { - if (entityliving.getHealth() > 1.0F) { -- entityliving.hurt(entityliving.damageSources().magic(), 1.0F); -+ entityliving.hurt(entityliving.damageSources().poison, 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON - } - } else if (this == MobEffects.WITHER) { - entityliving.hurt(entityliving.damageSources().wither(), 1.0F); - } else if (this == MobEffects.HUNGER && entityliving instanceof EntityHuman) { -- ((EntityHuman) entityliving).causeFoodExhaustion(0.005F * (float) (i + 1)); -+ ((EntityHuman) entityliving).causeFoodExhaustion(0.005F * (float) (i + 1), org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.HUNGER_EFFECT); // CraftBukkit - EntityExhaustionEvent - } else if (this == MobEffects.SATURATION && entityliving instanceof EntityHuman) { - if (!entityliving.level().isClientSide) { -- ((EntityHuman) entityliving).getFoodData().eat(i + 1, 1.0F); -+ // CraftBukkit start -+ EntityHuman entityhuman = (EntityHuman) entityliving; -+ int oldFoodLevel = entityhuman.getFoodData().foodLevel; -+ org.bukkit.event.entity.FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(entityhuman, i + 1 + oldFoodLevel); -+ if (!event.isCancelled()) { -+ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 1.0F); -+ } -+ -+ ((CraftPlayer) entityhuman.getBukkitEntity()).sendHealthUpdate(); -+ // CraftBukkit end - } - } else if ((this != MobEffects.HEAL || entityliving.isInvertedHealAndHarm()) && (this != MobEffects.HARM || !entityliving.isInvertedHealAndHarm())) { - if (this == MobEffects.HARM && !entityliving.isInvertedHealAndHarm() || this == MobEffects.HEAL && entityliving.isInvertedHealAndHarm()) { - entityliving.hurt(entityliving.damageSources().magic(), (float) (6 << i)); - } - } else { -- entityliving.heal((float) Math.max(4 << i, 0)); -+ entityliving.heal((float) Math.max(4 << i, 0), RegainReason.MAGIC); // CraftBukkit - } - - } -@@ -95,7 +112,7 @@ - } - } else { - j = (int) (d0 * (double) (4 << i) + 0.5D); -- entityliving.heal((float) j); -+ entityliving.heal((float) j, RegainReason.MAGIC); // CraftBukkit - } - - } diff --git a/nms-patches/net/minecraft/world/effect/MobEffects.patch b/nms-patches/net/minecraft/world/effect/MobEffects.patch index b3af648bb..09fd526f5 100644 --- a/nms-patches/net/minecraft/world/effect/MobEffects.patch +++ b/nms-patches/net/minecraft/world/effect/MobEffects.patch @@ -1,12 +1,12 @@ --- a/net/minecraft/world/effect/MobEffects.java +++ b/net/minecraft/world/effect/MobEffects.java -@@ -73,6 +73,10 @@ +@@ -47,6 +47,10 @@ public MobEffects() {} - private static MobEffectList register(int i, String s, MobEffectList mobeffectlist) { -- return (MobEffectList) IRegistry.registerMapping(BuiltInRegistries.MOB_EFFECT, i, s, mobeffectlist); + private static MobEffectList register(String s, MobEffectList mobeffectlist) { +- return (MobEffectList) IRegistry.register(BuiltInRegistries.MOB_EFFECT, s, mobeffectlist); + // CraftBukkit start -+ mobeffectlist = (MobEffectList) IRegistry.registerMapping(BuiltInRegistries.MOB_EFFECT, i, s, mobeffectlist); ++ mobeffectlist = (MobEffectList) IRegistry.register(BuiltInRegistries.MOB_EFFECT, s, mobeffectlist); + org.bukkit.potion.PotionEffectType.registerPotionEffectType(new org.bukkit.craftbukkit.potion.CraftPotionEffectType(mobeffectlist)); + return mobeffectlist; + // CraftBukkit end diff --git a/nms-patches/net/minecraft/world/effect/PoisonMobEffect.patch b/nms-patches/net/minecraft/world/effect/PoisonMobEffect.patch new file mode 100644 index 000000000..8ad160220 --- /dev/null +++ b/nms-patches/net/minecraft/world/effect/PoisonMobEffect.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/world/effect/PoisonMobEffect.java ++++ b/net/minecraft/world/effect/PoisonMobEffect.java +@@ -12,7 +12,7 @@ + public void applyEffectTick(EntityLiving entityliving, int i) { + super.applyEffectTick(entityliving, i); + if (entityliving.getHealth() > 1.0F) { +- entityliving.hurt(entityliving.damageSources().magic(), 1.0F); ++ entityliving.hurt(entityliving.damageSources().poison, 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON + } + + } diff --git a/nms-patches/net/minecraft/world/effect/RegenerationMobEffect.patch b/nms-patches/net/minecraft/world/effect/RegenerationMobEffect.patch new file mode 100644 index 000000000..3c8b57619 --- /dev/null +++ b/nms-patches/net/minecraft/world/effect/RegenerationMobEffect.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/world/effect/RegenerationMobEffect.java ++++ b/net/minecraft/world/effect/RegenerationMobEffect.java +@@ -12,7 +12,7 @@ + public void applyEffectTick(EntityLiving entityliving, int i) { + super.applyEffectTick(entityliving, i); + if (entityliving.getHealth() < entityliving.getMaxHealth()) { +- entityliving.heal(1.0F); ++ entityliving.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.MAGIC_REGEN); // CraftBukkit + } + + } diff --git a/nms-patches/net/minecraft/world/effect/SaturationMobEffect.patch b/nms-patches/net/minecraft/world/effect/SaturationMobEffect.patch new file mode 100644 index 000000000..cd7fcfc9c --- /dev/null +++ b/nms-patches/net/minecraft/world/effect/SaturationMobEffect.patch @@ -0,0 +1,31 @@ +--- a/net/minecraft/world/effect/SaturationMobEffect.java ++++ b/net/minecraft/world/effect/SaturationMobEffect.java +@@ -3,6 +3,11 @@ + import net.minecraft.world.entity.EntityLiving; + import net.minecraft.world.entity.player.EntityHuman; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++// CraftBukkit end ++ + class SaturationMobEffect extends InstantMobEffect { + + protected SaturationMobEffect(MobEffectInfo mobeffectinfo, int i) { +@@ -15,7 +20,15 @@ + if (!entityliving.level().isClientSide && entityliving instanceof EntityHuman) { + EntityHuman entityhuman = (EntityHuman) entityliving; + +- entityhuman.getFoodData().eat(i + 1, 1.0F); ++ // CraftBukkit start ++ int oldFoodLevel = entityhuman.getFoodData().foodLevel; ++ org.bukkit.event.entity.FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(entityhuman, i + 1 + oldFoodLevel); ++ if (!event.isCancelled()) { ++ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 1.0F); ++ } ++ ++ ((CraftPlayer) entityhuman.getBukkitEntity()).sendHealthUpdate(); ++ // CraftBukkit end + } + + } diff --git a/nms-patches/net/minecraft/world/entity/Display.patch b/nms-patches/net/minecraft/world/entity/Display.patch deleted file mode 100644 index d0898c25a..000000000 --- a/nms-patches/net/minecraft/world/entity/Display.patch +++ /dev/null @@ -1,90 +0,0 @@ ---- a/net/minecraft/world/entity/Display.java -+++ b/net/minecraft/world/entity/Display.java -@@ -183,11 +183,11 @@ - - @Override - protected void readAdditionalSaveData(NBTTagCompound nbttagcompound) { -- DataResult dataresult; -+ // DataResult dataresult; // CraftBukkit - decompile error - Logger logger; - - if (nbttagcompound.contains("transformation")) { -- dataresult = Transformation.EXTENDED_CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("transformation")); -+ DataResult> dataresult = Transformation.EXTENDED_CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("transformation")); // CraftBukkit - decompile error - logger = Display.LOGGER; - Objects.requireNonNull(logger); - dataresult.resultOrPartial(SystemUtils.prefix("Display entity", logger::error)).ifPresent((pair) -> { -@@ -208,7 +208,7 @@ - } - - if (nbttagcompound.contains("billboard", 8)) { -- dataresult = Display.BillboardConstraints.CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("billboard")); -+ DataResult> dataresult = Display.BillboardConstraints.CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("billboard")); // CraftBukkit - decompile error - logger = Display.LOGGER; - Objects.requireNonNull(logger); - dataresult.resultOrPartial(SystemUtils.prefix("Display entity", logger::error)).ifPresent((pair) -> { -@@ -241,7 +241,7 @@ - } - - if (nbttagcompound.contains("brightness", 10)) { -- dataresult = Brightness.CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("brightness")); -+ DataResult> dataresult = Brightness.CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("brightness")); // CraftBukkit - decompile error - logger = Display.LOGGER; - Objects.requireNonNull(logger); - dataresult.resultOrPartial(SystemUtils.prefix("Display entity", logger::error)).ifPresent((pair) -> { -@@ -594,8 +594,8 @@ - private static final byte INITIAL_TEXT_OPACITY = -1; - public static final int INITIAL_BACKGROUND = 1073741824; - private static final DataWatcherObject DATA_TEXT_ID = DataWatcher.defineId(Display.TextDisplay.class, DataWatcherRegistry.COMPONENT); -- private static final DataWatcherObject DATA_LINE_WIDTH_ID = DataWatcher.defineId(Display.TextDisplay.class, DataWatcherRegistry.INT); -- private static final DataWatcherObject DATA_BACKGROUND_COLOR_ID = DataWatcher.defineId(Display.TextDisplay.class, DataWatcherRegistry.INT); -+ public static final DataWatcherObject DATA_LINE_WIDTH_ID = DataWatcher.defineId(Display.TextDisplay.class, DataWatcherRegistry.INT); -+ public static final DataWatcherObject DATA_BACKGROUND_COLOR_ID = DataWatcher.defineId(Display.TextDisplay.class, DataWatcherRegistry.INT); - private static final DataWatcherObject DATA_TEXT_OPACITY_ID = DataWatcher.defineId(Display.TextDisplay.class, DataWatcherRegistry.BYTE); - private static final DataWatcherObject DATA_STYLE_FLAGS_ID = DataWatcher.defineId(Display.TextDisplay.class, DataWatcherRegistry.BYTE); - private static final IntSet TEXT_RENDER_STATE_IDS = IntSet.of(new int[]{Display.TextDisplay.DATA_TEXT_ID.getId(), Display.TextDisplay.DATA_LINE_WIDTH_ID.getId(), Display.TextDisplay.DATA_BACKGROUND_COLOR_ID.getId(), Display.TextDisplay.DATA_TEXT_OPACITY_ID.getId(), Display.TextDisplay.DATA_STYLE_FLAGS_ID.getId()}); -@@ -614,7 +614,7 @@ - this.entityData.define(Display.TextDisplay.DATA_TEXT_ID, IChatBaseComponent.empty()); - this.entityData.define(Display.TextDisplay.DATA_LINE_WIDTH_ID, 200); - this.entityData.define(Display.TextDisplay.DATA_BACKGROUND_COLOR_ID, 1073741824); -- this.entityData.define(Display.TextDisplay.DATA_TEXT_OPACITY_ID, -1); -+ this.entityData.define(Display.TextDisplay.DATA_TEXT_OPACITY_ID, (byte) -1); // CraftBukkit - decompile error - this.entityData.define(Display.TextDisplay.DATA_STYLE_FLAGS_ID, (byte) 0); - } - -@@ -639,7 +639,7 @@ - return (Integer) this.entityData.get(Display.TextDisplay.DATA_LINE_WIDTH_ID); - } - -- public void setLineWidth(int i) { -+ private void setLineWidth(int i) { - this.entityData.set(Display.TextDisplay.DATA_LINE_WIDTH_ID, i); - } - -@@ -655,7 +655,7 @@ - return (Integer) this.entityData.get(Display.TextDisplay.DATA_BACKGROUND_COLOR_ID); - } - -- public void setBackgroundColor(int i) { -+ private void setBackgroundColor(int i) { - this.entityData.set(Display.TextDisplay.DATA_BACKGROUND_COLOR_ID, i); - } - -@@ -690,7 +690,7 @@ - - b0 = loadFlag(b0, nbttagcompound, "see_through", (byte) 2); - b0 = loadFlag(b0, nbttagcompound, "default_background", (byte) 4); -- DataResult dataresult = Display.TextDisplay.Align.CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("alignment")); -+ DataResult> dataresult = Display.TextDisplay.Align.CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("alignment")); // CraftBukkit - decompile error - Logger logger = Display.LOGGER; - - Objects.requireNonNull(logger); -@@ -961,7 +961,7 @@ - super.readAdditionalSaveData(nbttagcompound); - this.setItemStack(ItemStack.of(nbttagcompound.getCompound("item"))); - if (nbttagcompound.contains("item_display", 8)) { -- DataResult dataresult = ItemDisplayContext.CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("item_display")); -+ DataResult> dataresult = ItemDisplayContext.CODEC.decode(DynamicOpsNBT.INSTANCE, nbttagcompound.get("item_display")); // CraftBukkit - decompile error - Logger logger = Display.LOGGER; - - Objects.requireNonNull(logger); diff --git a/nms-patches/net/minecraft/world/entity/Entity.patch b/nms-patches/net/minecraft/world/entity/Entity.patch index 0f4c92b9a..f64a473be 100644 --- a/nms-patches/net/minecraft/world/entity/Entity.patch +++ b/nms-patches/net/minecraft/world/entity/Entity.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -124,8 +124,66 @@ - import net.minecraft.world.scores.ScoreboardTeamBase; +@@ -125,8 +125,65 @@ + import org.joml.Vector3f; import org.slf4j.Logger; +// CraftBukkit start -+import net.minecraft.core.Position; +import net.minecraft.world.level.dimension.WorldDimension; +import org.bukkit.Bukkit; +import org.bukkit.Location; @@ -67,7 +66,7 @@ private static final Logger LOGGER = LogUtils.getLogger(); public static final String ID_TAG = "id"; public static final String PASSENGERS_TAG = "Passengers"; -@@ -240,6 +298,25 @@ +@@ -241,6 +298,25 @@ public boolean hasVisualFire; @Nullable private IBlockData feetBlockState; @@ -93,7 +92,7 @@ public Entity(EntityTypes entitytypes, World world) { this.id = Entity.ENTITY_COUNTER.incrementAndGet(); -@@ -373,6 +450,12 @@ +@@ -374,6 +450,12 @@ public void onClientRemoval() {} public void setPose(EntityPose entitypose) { @@ -106,7 +105,7 @@ this.entityData.set(Entity.DATA_POSE, entitypose); } -@@ -397,6 +480,33 @@ +@@ -398,6 +480,33 @@ } protected void setRot(float f, float f1) { @@ -140,7 +139,7 @@ this.setYRot(f % 360.0F); this.setXRot(f1 % 360.0F); } -@@ -438,6 +548,15 @@ +@@ -439,6 +548,15 @@ this.baseTick(); } @@ -156,7 +155,7 @@ public void baseTick() { this.level().getProfiler().push("entityBaseTick"); this.feetBlockState = null; -@@ -452,7 +571,7 @@ +@@ -453,7 +571,7 @@ this.walkDistO = this.walkDist; this.xRotO = this.getXRot(); this.yRotO = this.getYRot(); @@ -165,7 +164,7 @@ if (this.canSpawnSprintParticle()) { this.spawnSprintParticle(); } -@@ -487,6 +606,10 @@ +@@ -488,6 +606,10 @@ if (this.isInLava()) { this.lavaHurt(); this.fallDistance *= 0.5F; @@ -176,7 +175,7 @@ } this.checkBelowWorld(); -@@ -538,15 +661,48 @@ +@@ -539,15 +661,48 @@ public void lavaHurt() { if (!this.fireImmune()) { @@ -226,7 +225,7 @@ int j = i * 20; if (this instanceof EntityLiving) { -@@ -697,6 +853,28 @@ +@@ -698,6 +853,28 @@ block.updateEntityAfterFallOn(this.level(), this); } @@ -255,7 +254,7 @@ if (this.onGround()) { block.stepOn(this.level(), blockposition, iblockdata, this); } -@@ -1024,6 +1202,20 @@ +@@ -1025,6 +1202,20 @@ return SoundEffects.GENERIC_SPLASH; } @@ -276,7 +275,7 @@ protected void checkInsideBlocks() { AxisAlignedBB axisalignedbb = this.getBoundingBox(); BlockPosition blockposition = BlockPosition.containing(axisalignedbb.minX + 1.0E-7D, axisalignedbb.minY + 1.0E-7D, axisalignedbb.minZ + 1.0E-7D); -@@ -1430,6 +1622,7 @@ +@@ -1439,6 +1630,7 @@ this.yo = d1; this.zo = d4; this.setPos(d3, d1, d4); @@ -284,7 +283,7 @@ } public void moveTo(Vec3D vec3d) { -@@ -1624,6 +1817,12 @@ +@@ -1633,6 +1825,12 @@ return false; } @@ -297,7 +296,7 @@ public void awardKillScore(Entity entity, int i, DamageSource damagesource) { if (entity instanceof EntityPlayer) { CriterionTriggers.ENTITY_KILLED_PLAYER.trigger((EntityPlayer) entity, this, damagesource); -@@ -1657,7 +1856,7 @@ +@@ -1666,7 +1864,7 @@ } else { String s = this.getEncodeId(); @@ -306,7 +305,7 @@ return false; } else { nbttagcompound.putString("id", s); -@@ -1682,6 +1881,18 @@ +@@ -1691,6 +1889,18 @@ Vec3D vec3d = this.getDeltaMovement(); nbttagcompound.put("Motion", this.newDoubleList(vec3d.x, vec3d.y, vec3d.z)); @@ -325,7 +324,7 @@ nbttagcompound.put("Rotation", this.newFloatList(this.getYRot(), this.getXRot())); nbttagcompound.putFloat("FallDistance", this.fallDistance); nbttagcompound.putShort("Fire", (short) this.remainingFireTicks); -@@ -1690,6 +1901,25 @@ +@@ -1699,6 +1909,25 @@ nbttagcompound.putBoolean("Invulnerable", this.invulnerable); nbttagcompound.putInt("PortalCooldown", this.portalCooldown); nbttagcompound.putUUID("UUID", this.getUUID()); @@ -351,7 +350,7 @@ IChatBaseComponent ichatbasecomponent = this.getCustomName(); if (ichatbasecomponent != null) { -@@ -1757,6 +1987,11 @@ +@@ -1766,6 +1995,11 @@ } } @@ -363,7 +362,7 @@ return nbttagcompound; } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT"); -@@ -1840,6 +2075,45 @@ +@@ -1849,6 +2083,45 @@ } else { throw new IllegalStateException("Entity has invalid position"); } @@ -409,7 +408,7 @@ } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT"); CrashReportSystemDetails crashreportsystemdetails = crashreport.addCategory("Entity being loaded"); -@@ -1915,9 +2189,22 @@ +@@ -1924,9 +2197,22 @@ } else if (this.level().isClientSide) { return null; } else { @@ -432,7 +431,7 @@ this.level().addFreshEntity(entityitem); return entityitem; } -@@ -2007,6 +2294,18 @@ +@@ -2024,6 +2310,18 @@ if (!flag && (!this.canRide(entity) || !entity.canAddPassenger(this))) { return false; } else { @@ -451,7 +450,7 @@ if (this.isPassenger()) { this.stopRiding(); } -@@ -2044,7 +2343,7 @@ +@@ -2057,7 +2355,7 @@ Entity entity = this.vehicle; this.vehicle = null; @@ -460,7 +459,7 @@ } } -@@ -2075,10 +2374,29 @@ +@@ -2088,10 +2386,29 @@ } } @@ -491,7 +490,7 @@ if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); } else { -@@ -2090,6 +2408,7 @@ +@@ -2103,6 +2420,7 @@ entity.boardingCooldown = 60; this.gameEvent(GameEvent.ENTITY_DISMOUNT, entity); } @@ -499,7 +498,7 @@ } protected boolean canAddPassenger(Entity entity) { -@@ -2156,14 +2475,20 @@ +@@ -2189,14 +2507,20 @@ if (this.isInsidePortal) { MinecraftServer minecraftserver = worldserver.getServer(); @@ -523,7 +522,7 @@ this.level().getProfiler().pop(); } -@@ -2283,6 +2608,13 @@ +@@ -2320,6 +2644,13 @@ } public void setSwimming(boolean flag) { @@ -537,7 +536,7 @@ this.setSharedFlag(4, flag); } -@@ -2332,8 +2664,12 @@ +@@ -2369,8 +2700,12 @@ return this.getTeam() != null ? this.getTeam().isAlliedTo(scoreboardteambase) : false; } @@ -551,7 +550,7 @@ } public boolean getSharedFlag(int i) { -@@ -2352,7 +2688,7 @@ +@@ -2389,7 +2724,7 @@ } public int getMaxAirSupply() { @@ -560,7 +559,7 @@ } public int getAirSupply() { -@@ -2360,7 +2696,18 @@ +@@ -2397,7 +2732,18 @@ } public void setAirSupply(int i) { @@ -580,7 +579,7 @@ } public int getTicksFrozen() { -@@ -2387,11 +2734,41 @@ +@@ -2424,11 +2770,41 @@ public void thunderHit(WorldServer worldserver, EntityLightning entitylightning) { this.setRemainingFireTicks(this.remainingFireTicks + 1); @@ -624,7 +623,7 @@ } public void onAboveBubbleCol(boolean flag) { -@@ -2556,15 +2933,38 @@ +@@ -2593,15 +2969,38 @@ @Nullable public Entity changeDimension(WorldServer worldserver) { @@ -633,7 +632,7 @@ + } + + @Nullable -+ public Entity teleportTo(WorldServer worldserver, Position location) { ++ public Entity teleportTo(WorldServer worldserver, Vec3D location) { + // CraftBukkit end if (this.level() instanceof WorldServer && !this.isRemoved()) { this.level().getProfiler().push("changeDimension"); @@ -665,7 +664,7 @@ this.level().getProfiler().popPush("reloading"); Entity entity = this.getType().create(worldserver); -@@ -2573,9 +2973,17 @@ +@@ -2610,9 +3009,17 @@ entity.moveTo(shapedetectorshape.pos.x, shapedetectorshape.pos.y, shapedetectorshape.pos.z, shapedetectorshape.yRot, entity.getXRot()); entity.setDeltaMovement(shapedetectorshape.speed); worldserver.addDuringTeleport(entity); @@ -685,7 +684,7 @@ } this.removeAfterChangingDimensions(); -@@ -2596,20 +3004,34 @@ +@@ -2633,20 +3040,34 @@ @Nullable protected ShapeDetectorShape findDimensionEntryPoint(WorldServer worldserver) { @@ -711,7 +710,7 @@ double d0 = DimensionManager.getTeleportationScale(this.level().dimensionType(), worldserver.dimensionType()); BlockPosition blockposition = worldborder.clampToBounds(this.getX() * d0, this.getY(), this.getZ() * d0); + // CraftBukkit start -+ CraftPortalEvent event = callPortalEvent(this, worldserver, new Position(blockposition.getX(), blockposition.getY(), blockposition.getZ()), PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, flag2 ? 16 : 128, 16); ++ CraftPortalEvent event = callPortalEvent(this, worldserver, new Vec3D(blockposition.getX(), blockposition.getY(), blockposition.getZ()), PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, flag2 ? 16 : 128, 16); + if (event == null) { + return null; + } @@ -725,7 +724,7 @@ IBlockData iblockdata = this.level().getBlockState(this.portalEntrancePos); EnumDirection.EnumAxis enumdirection_enumaxis; Vec3D vec3d; -@@ -2626,8 +3048,8 @@ +@@ -2663,8 +3084,8 @@ vec3d = new Vec3D(0.5D, 0.0D, 0.0D); } @@ -736,12 +735,12 @@ } } else { BlockPosition blockposition1; -@@ -2637,8 +3059,14 @@ +@@ -2674,8 +3095,14 @@ } else { blockposition1 = worldserver.getHeightmapPos(HeightMap.Type.MOTION_BLOCKING_NO_LEAVES, worldserver.getSharedSpawnPos()); } + // CraftBukkit start -+ CraftPortalEvent event = callPortalEvent(this, worldserver, new Position(blockposition1.getX() + 0.5D, blockposition1.getY(), blockposition1.getZ() + 0.5D), PlayerTeleportEvent.TeleportCause.END_PORTAL, 0, 0); ++ CraftPortalEvent event = callPortalEvent(this, worldserver, new Vec3D(blockposition1.getX() + 0.5D, blockposition1.getY(), blockposition1.getZ() + 0.5D), PlayerTeleportEvent.TeleportCause.END_PORTAL, 0, 0); + if (event == null) { + return null; + } @@ -752,14 +751,14 @@ } } -@@ -2646,8 +3074,23 @@ +@@ -2683,8 +3110,23 @@ return BlockPortalShape.getRelativePosition(blockutil_rectangle, enumdirection_enumaxis, this.position(), this.getDimensions(this.getPose())); } - protected Optional getExitPortal(WorldServer worldserver, BlockPosition blockposition, boolean flag, WorldBorder worldborder) { - return worldserver.getPortalForcer().findPortalAround(blockposition, flag, worldborder); + // CraftBukkit start -+ protected CraftPortalEvent callPortalEvent(Entity entity, WorldServer exitWorldServer, Position exitPosition, PlayerTeleportEvent.TeleportCause cause, int searchRadius, int creationRadius) { ++ protected CraftPortalEvent callPortalEvent(Entity entity, WorldServer exitWorldServer, Vec3D exitPosition, PlayerTeleportEvent.TeleportCause cause, int searchRadius, int creationRadius) { + org.bukkit.entity.Entity bukkitEntity = entity.getBukkitEntity(); + Location enter = bukkitEntity.getLocation(); + Location exit = CraftLocation.toBukkit(exitPosition, exitWorldServer.getWorld()); @@ -778,7 +777,7 @@ } public boolean canChangeDimensions() { -@@ -2767,6 +3210,12 @@ +@@ -2804,6 +3246,12 @@ } } @@ -791,7 +790,7 @@ public boolean teleportTo(WorldServer worldserver, double d0, double d1, double d2, Set set, float f, float f1) { float f2 = MathHelper.clamp(f1, -90.0F, 90.0F); -@@ -2901,7 +3350,26 @@ +@@ -2929,7 +3377,26 @@ } public final void setBoundingBox(AxisAlignedBB axisalignedbb) { @@ -819,7 +818,7 @@ } protected float getEyeHeight(EntityPose entitypose, EntitySize entitysize) { -@@ -3212,6 +3680,11 @@ +@@ -3240,6 +3707,11 @@ vec3d = vec3d.add(vec3d1); ++k1; } diff --git a/nms-patches/net/minecraft/world/entity/EntityAreaEffectCloud.patch b/nms-patches/net/minecraft/world/entity/EntityAreaEffectCloud.patch index 6c3bb588e..90305ddb1 100644 --- a/nms-patches/net/minecraft/world/entity/EntityAreaEffectCloud.patch +++ b/nms-patches/net/minecraft/world/entity/EntityAreaEffectCloud.patch @@ -13,25 +13,7 @@ public class EntityAreaEffectCloud extends Entity implements TraceableEntity { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -44,7 +50,7 @@ - private static final float DEFAULT_RADIUS = 3.0F; - public static final float DEFAULT_WIDTH = 6.0F; - public static final float HEIGHT = 0.5F; -- private PotionRegistry potion; -+ public PotionRegistry potion; // CraftBukkit - private -> public - public List effects; - private final Map victims; - private int duration; -@@ -112,7 +118,7 @@ - - } - -- private void updateColor() { -+ public void updateColor() { // Craftbukkit - private -> public - if (this.potion == Potions.EMPTY && this.effects.isEmpty()) { - this.getEntityData().set(EntityAreaEffectCloud.DATA_COLOR, 0); - } else { -@@ -263,6 +269,7 @@ +@@ -264,6 +270,7 @@ if (!list1.isEmpty()) { Iterator iterator1 = list1.iterator(); @@ -39,7 +21,7 @@ while (iterator1.hasNext()) { EntityLiving entityliving = (EntityLiving) iterator1.next(); -@@ -272,6 +279,17 @@ +@@ -273,6 +280,17 @@ double d8 = d6 * d6 + d7 * d7; if (d8 <= (double) (f * f)) { @@ -57,7 +39,7 @@ this.victims.put(entityliving, this.tickCount + this.reapplicationDelay); Iterator iterator2 = list.iterator(); -@@ -281,7 +299,7 @@ +@@ -282,7 +300,7 @@ if (mobeffect1.getEffect().isInstantenous()) { mobeffect1.getEffect().applyInstantenousEffect(this, this.getOwner(), entityliving, mobeffect1.getAmplifier(), 0.5D); } else { diff --git a/nms-patches/net/minecraft/world/entity/EntityCreature.patch b/nms-patches/net/minecraft/world/entity/EntityCreature.patch index 9cff885bf..0af2eb0e0 100644 --- a/nms-patches/net/minecraft/world/entity/EntityCreature.patch +++ b/nms-patches/net/minecraft/world/entity/EntityCreature.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/EntityCreature.java +++ b/net/minecraft/world/entity/EntityCreature.java -@@ -7,6 +7,10 @@ +@@ -9,6 +9,10 @@ import net.minecraft.world.level.World; import net.minecraft.world.phys.Vec3D; @@ -11,7 +11,7 @@ public abstract class EntityCreature extends EntityInsentient { protected static final float DEFAULT_WALK_TARGET_VALUE = 0.0F; -@@ -43,6 +47,7 @@ +@@ -51,6 +55,7 @@ if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isInSittingPose()) { if (f > 10.0F) { @@ -19,7 +19,7 @@ this.dropLeash(true, true); } -@@ -51,6 +56,7 @@ +@@ -59,6 +64,7 @@ this.onLeashDistance(f); if (f > 10.0F) { diff --git a/nms-patches/net/minecraft/world/entity/EntityInsentient.patch b/nms-patches/net/minecraft/world/entity/EntityInsentient.patch index 31239a1b6..ee2dbf823 100644 --- a/nms-patches/net/minecraft/world/entity/EntityInsentient.patch +++ b/nms-patches/net/minecraft/world/entity/EntityInsentient.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/EntityInsentient.java +++ b/net/minecraft/world/entity/EntityInsentient.java -@@ -74,6 +74,19 @@ - import net.minecraft.world.level.material.FluidType; +@@ -75,6 +75,19 @@ import net.minecraft.world.level.pathfinder.PathType; + import net.minecraft.world.phys.AxisAlignedBB; +// CraftBukkit start +import net.minecraft.server.level.EntityPlayer; @@ -20,7 +20,7 @@ public abstract class EntityInsentient extends EntityLiving implements Targeting { private static final DataWatcherObject DATA_MOB_FLAGS_ID = DataWatcher.defineId(EntityInsentient.class, DataWatcherRegistry.BYTE); -@@ -120,6 +133,8 @@ +@@ -122,6 +135,8 @@ private BlockPosition restrictCenter; private float restrictRadius; @@ -29,7 +29,7 @@ protected EntityInsentient(EntityTypes entitytypes, World world) { super(entitytypes, world); this.handItems = NonNullList.withSize(2, ItemStack.EMPTY); -@@ -145,6 +160,12 @@ +@@ -147,6 +162,12 @@ } @@ -42,7 +42,7 @@ protected void registerGoals() {} public static AttributeProvider.Builder createMobAttributes() { -@@ -257,7 +278,38 @@ +@@ -258,7 +279,38 @@ } public void setTarget(@Nullable EntityLiving entityliving) { @@ -81,7 +81,7 @@ } @Override -@@ -397,6 +449,12 @@ +@@ -398,6 +450,12 @@ return null; } @@ -94,7 +94,7 @@ @Override public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); -@@ -486,16 +544,26 @@ +@@ -487,16 +545,26 @@ nbttagcompound.putBoolean("NoAI", this.isNoAi()); } @@ -123,7 +123,7 @@ NBTTagList nbttaglist; int i; -@@ -542,6 +610,11 @@ +@@ -543,6 +611,11 @@ } this.setNoAi(nbttagcompound.getBoolean("NoAI")); @@ -135,7 +135,7 @@ } @Override -@@ -609,7 +682,7 @@ +@@ -610,7 +683,7 @@ protected void pickUpItem(EntityItem entityitem) { ItemStack itemstack = entityitem.getItem(); @@ -144,7 +144,7 @@ if (!itemstack1.isEmpty()) { this.onItemPickup(entityitem); -@@ -623,6 +696,12 @@ +@@ -624,6 +697,12 @@ } public ItemStack equipItemIfPossible(ItemStack itemstack) { @@ -157,7 +157,7 @@ EnumItemSlot enumitemslot = getEquipmentSlotForItem(itemstack); ItemStack itemstack1 = this.getItemBySlot(enumitemslot); boolean flag = this.canReplaceCurrentItem(itemstack, itemstack1); -@@ -633,11 +712,19 @@ +@@ -634,11 +713,19 @@ flag = itemstack1.isEmpty(); } @@ -178,7 +178,7 @@ } if (enumitemslot.isArmor() && itemstack.getCount() > 1) { -@@ -782,6 +869,7 @@ +@@ -790,6 +877,7 @@ @Override protected final void serverAiStep() { ++this.noActionTime; @@ -186,7 +186,7 @@ this.level().getProfiler().push("sensing"); this.sensing.tick(); this.level().getProfiler().pop(); -@@ -1175,6 +1263,12 @@ +@@ -1183,6 +1271,12 @@ if (!this.isAlive()) { return EnumInteractionResult.PASS; } else if (this.getLeashHolder() == entityhuman) { @@ -199,7 +199,7 @@ this.dropLeash(true, !entityhuman.getAbilities().instabuild); this.gameEvent(GameEvent.ENTITY_INTERACT, entityhuman); return EnumInteractionResult.sidedSuccess(this.level().isClientSide); -@@ -1200,6 +1294,12 @@ +@@ -1208,6 +1302,12 @@ ItemStack itemstack = entityhuman.getItemInHand(enumhand); if (itemstack.is(Items.LEAD) && this.canBeLeashed(entityhuman)) { @@ -212,7 +212,7 @@ this.setLeashedTo(entityhuman, true); itemstack.shrink(1); return EnumInteractionResult.sidedSuccess(this.level().isClientSide); -@@ -1215,7 +1315,7 @@ +@@ -1223,7 +1323,7 @@ if (itemstack.getItem() instanceof ItemMonsterEgg) { if (this.level() instanceof WorldServer) { ItemMonsterEgg itemmonsteregg = (ItemMonsterEgg) itemstack.getItem(); @@ -221,7 +221,7 @@ optional.ifPresent((entityinsentient) -> { this.onOffspringSpawnedFromEgg(entityhuman, entityinsentient); -@@ -1265,12 +1365,19 @@ +@@ -1273,12 +1373,19 @@ return this.restrictRadius != -1.0F; } @@ -242,7 +242,7 @@ if (t0 == null) { return null; -@@ -1304,7 +1411,12 @@ +@@ -1312,7 +1419,12 @@ } } @@ -256,7 +256,7 @@ if (this.isPassenger()) { Entity entity = this.getVehicle(); -@@ -1325,6 +1437,7 @@ +@@ -1333,6 +1445,7 @@ if (this.leashHolder != null) { if (!this.isAlive() || !this.leashHolder.isAlive()) { @@ -264,7 +264,7 @@ this.dropLeash(true, true); } -@@ -1336,7 +1449,9 @@ +@@ -1344,7 +1457,9 @@ this.leashHolder = null; this.leashInfoTag = null; if (!this.level().isClientSide && flag1) { @@ -274,7 +274,7 @@ } if (!this.level().isClientSide && flag && this.level() instanceof WorldServer) { -@@ -1386,6 +1501,7 @@ +@@ -1394,6 +1509,7 @@ boolean flag1 = super.startRiding(entity, flag); if (flag1 && this.isLeashed()) { @@ -282,7 +282,7 @@ this.dropLeash(true, true); } -@@ -1410,7 +1526,9 @@ +@@ -1418,7 +1534,9 @@ } if (this.tickCount > 100) { @@ -292,7 +292,7 @@ this.leashInfoTag = null; } } -@@ -1486,7 +1604,14 @@ +@@ -1500,7 +1618,14 @@ int i = EnchantmentManager.getFireAspect(this); if (i > 0) { @@ -308,7 +308,7 @@ } boolean flag = entity.hurt(this.damageSources().mobAttack(this), f); -@@ -1560,6 +1685,7 @@ +@@ -1574,6 +1699,7 @@ @Override protected void removeAfterChangingDimensions() { super.removeAfterChangingDimensions(); diff --git a/nms-patches/net/minecraft/world/entity/EntityLiving.patch b/nms-patches/net/minecraft/world/entity/EntityLiving.patch index f1357f685..9d8337a12 100644 --- a/nms-patches/net/minecraft/world/entity/EntityLiving.patch +++ b/nms-patches/net/minecraft/world/entity/EntityLiving.patch @@ -93,9 +93,9 @@ if (!flag && !ItemStack.isSameItemSameTags(itemstack, itemstack1) && !this.firstTick) { Equipable equipable = Equipable.get(itemstack1); - if (equipable != null && !this.isSpectator() && equipable.getEquipmentSlot() == enumitemslot) { -- if (!this.level().isClientSide() && !this.isSilent()) { -+ if (!this.level().isClientSide() && !this.isSilent() && !silent) { // CraftBukkit + if (!this.level().isClientSide() && !this.isSpectator()) { +- if (!this.isSilent() && equipable != null && equipable.getEquipmentSlot() == enumitemslot) { ++ if (!this.isSilent() && equipable != null && equipable.getEquipmentSlot() == enumitemslot && !silent) { // CraftBukkit this.level().playSound((EntityHuman) null, this.getX(), this.getY(), this.getZ(), equipable.getEquipSound(), this.getSoundSource(), 1.0F, 1.0F); } @@ -211,7 +211,7 @@ iterator.remove(); } -@@ -976,18 +1092,48 @@ +@@ -976,19 +1092,49 @@ return this.addEffect(mobeffect, (Entity) null); } @@ -235,6 +235,7 @@ return false; } else { MobEffect mobeffect1 = (MobEffect) this.activeEffects.get(mobeffect.getEffect()); + boolean flag = false; + // CraftBukkit start + boolean override = false; @@ -251,17 +252,17 @@ if (mobeffect1 == null) { this.activeEffects.put(mobeffect.getEffect(), mobeffect); this.onEffectAdded(mobeffect, entity); - return true; + flag = true; - } else if (mobeffect1.update(mobeffect)) { + // CraftBukkit start + } else if (event.isOverride()) { + mobeffect1.update(mobeffect); this.onEffectUpdated(mobeffect1, true, entity); + // CraftBukkit end - return true; - } else { - return false; -@@ -1024,13 +1170,39 @@ + flag = true; + } + +@@ -1026,13 +1172,39 @@ return this.getMobType() == EnumMonsterType.UNDEAD; } @@ -302,7 +303,7 @@ if (mobeffect != null) { this.onEffectRemoved(mobeffect); -@@ -1098,20 +1270,55 @@ +@@ -1130,20 +1302,55 @@ } @@ -359,7 +360,7 @@ this.entityData.set(EntityLiving.DATA_HEALTH_ID, MathHelper.clamp(f, 0.0F, this.getMaxHealth())); } -@@ -1125,7 +1332,7 @@ +@@ -1157,7 +1364,7 @@ return false; } else if (this.level().isClientSide) { return false; @@ -368,7 +369,7 @@ return false; } else if (damagesource.is(DamageTypeTags.IS_FIRE) && this.hasEffect(MobEffects.FIRE_RESISTANCE)) { return false; -@@ -1136,10 +1343,11 @@ +@@ -1168,10 +1375,11 @@ this.noActionTime = 0; float f1 = f; @@ -382,7 +383,7 @@ this.hurtCurrentlyUsedShield(f); f2 = f; f = 0.0F; -@@ -1163,23 +1371,33 @@ +@@ -1195,23 +1403,33 @@ this.walkAnimation.setSpeed(1.5F); boolean flag1 = true; @@ -421,7 +422,7 @@ this.hurtHelmet(damagesource, f); f *= 0.75F; } -@@ -1297,19 +1515,32 @@ +@@ -1329,19 +1547,32 @@ EnumHand[] aenumhand = EnumHand.values(); int i = aenumhand.length; @@ -458,7 +459,7 @@ EntityPlayer entityplayer = (EntityPlayer) this; entityplayer.awardStat(StatisticList.ITEM_USED.get(Items.TOTEM_OF_UNDYING)); -@@ -1317,14 +1548,16 @@ +@@ -1350,14 +1581,16 @@ } this.setHealth(1.0F); @@ -480,7 +481,7 @@ } } -@@ -1433,14 +1666,22 @@ +@@ -1466,14 +1699,22 @@ IBlockData iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); if (this.level().getBlockState(blockposition).isAir() && iblockdata.canSurvive(this.level(), blockposition)) { @@ -505,7 +506,7 @@ this.level().addFreshEntity(entityitem); } } -@@ -1460,21 +1701,40 @@ +@@ -1493,21 +1734,40 @@ boolean flag = this.lastHurtByPlayerTime > 0; @@ -549,7 +550,7 @@ } -@@ -1565,6 +1825,28 @@ +@@ -1599,6 +1859,28 @@ return itemstack.getEatingSound(); } @@ -578,7 +579,7 @@ public Optional getLastClimbablePos() { return this.lastClimbablePos; } -@@ -1611,9 +1893,14 @@ +@@ -1645,9 +1927,14 @@ int i = this.calculateFallDamage(f, f1); if (i > 0) { @@ -594,7 +595,7 @@ return true; } else { return flag; -@@ -1665,7 +1952,7 @@ +@@ -1699,7 +1986,7 @@ protected float getDamageAfterArmorAbsorb(DamageSource damagesource, float f) { if (!damagesource.is(DamageTypeTags.BYPASSES_ARMOR)) { @@ -603,7 +604,7 @@ f = CombatMath.getDamageAfterAbsorb(f, (float) this.getArmorValue(), (float) this.getAttributeValue(GenericAttributes.ARMOR_TOUGHNESS)); } -@@ -1678,7 +1965,8 @@ +@@ -1712,7 +1999,8 @@ } else { int i; @@ -613,7 +614,7 @@ i = (this.getEffect(MobEffects.DAMAGE_RESISTANCE).getAmplifier() + 1) * 5; int j = 25 - i; float f1 = f * (float) j; -@@ -1711,16 +1999,125 @@ +@@ -1745,16 +2033,125 @@ } } @@ -747,7 +748,7 @@ if (f2 > 0.0F && f2 < 3.4028235E37F) { Entity entity = damagesource.getEntity(); -@@ -1731,13 +2128,47 @@ +@@ -1765,13 +2162,47 @@ } } @@ -797,7 +798,7 @@ } public CombatTracker getCombatTracker() { -@@ -1758,8 +2189,18 @@ +@@ -1796,8 +2227,18 @@ } public final void setArrowCount(int i) { @@ -817,7 +818,7 @@ public final int getStingerCount() { return (Integer) this.entityData.get(EntityLiving.DATA_STINGER_COUNT_ID); -@@ -2001,6 +2442,12 @@ +@@ -2039,6 +2480,12 @@ public abstract ItemStack getItemBySlot(EnumItemSlot enumitemslot); @@ -830,7 +831,7 @@ @Override public abstract void setItemSlot(EnumItemSlot enumitemslot, ItemStack itemstack); -@@ -2238,6 +2685,7 @@ +@@ -2273,6 +2720,7 @@ } if (this.onGround() && !this.level().isClientSide) { @@ -838,7 +839,7 @@ this.setSharedFlag(7, false); } } else { -@@ -2809,6 +3257,7 @@ +@@ -2837,6 +3285,7 @@ } if (!this.level().isClientSide) { @@ -846,7 +847,7 @@ this.setSharedFlag(7, flag); } -@@ -2968,14 +3417,21 @@ +@@ -3027,14 +3476,21 @@ @Override public boolean isPickable() { @@ -870,7 +871,7 @@ @Override public float getYHeadRot() { return this.yHeadRot; -@@ -3170,7 +3626,26 @@ +@@ -3229,7 +3685,26 @@ } else { if (!this.useItem.isEmpty() && this.isUsingItem()) { this.triggerItemUseEffects(this.useItem, 16); @@ -898,7 +899,7 @@ if (itemstack != this.useItem) { this.setItemInHand(enumhand, itemstack); -@@ -3248,6 +3723,12 @@ +@@ -3307,6 +3782,12 @@ } public boolean randomTeleport(double d0, double d1, double d2, boolean flag) { @@ -911,7 +912,7 @@ double d3 = this.getX(); double d4 = this.getY(); double d5 = this.getZ(); -@@ -3272,16 +3753,41 @@ +@@ -3331,16 +3812,41 @@ } if (flag2) { @@ -956,7 +957,7 @@ } else { if (flag) { world.broadcastEntityEvent(this, (byte) 46); -@@ -3291,7 +3797,7 @@ +@@ -3350,7 +3856,7 @@ ((EntityCreature) this).getNavigation().stop(); } @@ -965,7 +966,7 @@ } } -@@ -3374,7 +3880,7 @@ +@@ -3439,7 +3945,7 @@ } public void stopSleeping() { @@ -974,7 +975,7 @@ World world = this.level(); java.util.Objects.requireNonNull(world); -@@ -3408,7 +3914,7 @@ +@@ -3473,7 +3979,7 @@ @Nullable public EnumDirection getBedOrientation() { @@ -983,7 +984,7 @@ return blockposition != null ? BlockBed.getBedOrientation(this.level(), blockposition) : null; } -@@ -3456,7 +3962,7 @@ +@@ -3521,7 +4027,7 @@ Pair pair = (Pair) iterator.next(); if (!world.isClientSide && pair.getFirst() != null && world.random.nextFloat() < (Float) pair.getSecond()) { diff --git a/nms-patches/net/minecraft/world/entity/EntityTypes.patch b/nms-patches/net/minecraft/world/entity/EntityTypes.patch index b9e22a799..b3491520a 100644 --- a/nms-patches/net/minecraft/world/entity/EntityTypes.patch +++ b/nms-patches/net/minecraft/world/entity/EntityTypes.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/EntityTypes.java +++ b/net/minecraft/world/entity/EntityTypes.java -@@ -157,6 +157,7 @@ +@@ -158,6 +158,7 @@ import net.minecraft.world.phys.AxisAlignedBB; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShapes; @@ -8,7 +8,7 @@ import org.slf4j.Logger; public class EntityTypes implements FeatureElement, EntityTypeTest { -@@ -167,7 +168,7 @@ +@@ -168,7 +169,7 @@ private static final float MAGIC_HORSE_WIDTH = 1.3964844F; private static final int DISPLAY_TRACKING_RANGE = 10; public static final EntityTypes ALLAY = register("allay", EntityTypes.Builder.of(Allay::new, EnumCreatureType.CREATURE).sized(0.35F, 0.6F).clientTrackingRange(8).updateInterval(2)); @@ -17,7 +17,7 @@ public static final EntityTypes ARMOR_STAND = register("armor_stand", EntityTypes.Builder.of(EntityArmorStand::new, EnumCreatureType.MISC).sized(0.5F, 1.975F).clientTrackingRange(10)); public static final EntityTypes ARROW = register("arrow", EntityTypes.Builder.of(EntityTippedArrow::new, EnumCreatureType.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20)); public static final EntityTypes AXOLOTL = register("axolotl", EntityTypes.Builder.of(Axolotl::new, EnumCreatureType.AXOLOTLS).sized(0.75F, 0.42F).clientTrackingRange(10)); -@@ -308,8 +309,8 @@ +@@ -309,8 +310,8 @@ private final EntitySize dimensions; private final FeatureFlagSet requiredFeatures; @@ -28,7 +28,7 @@ } public static MinecraftKey getKey(EntityTypes entitytypes) { -@@ -337,8 +338,15 @@ +@@ -338,8 +339,15 @@ @Nullable public T spawn(WorldServer worldserver, @Nullable ItemStack itemstack, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1) { @@ -45,7 +45,7 @@ if (itemstack != null) { nbttagcompound = itemstack.getTag(); -@@ -349,7 +357,7 @@ +@@ -350,7 +358,7 @@ nbttagcompound = null; } @@ -54,7 +54,7 @@ } public static Consumer createDefaultStackConfig(WorldServer worldserver, ItemStack itemstack, @Nullable EntityHuman entityhuman) { -@@ -371,21 +379,37 @@ +@@ -372,21 +380,37 @@ NBTTagCompound nbttagcompound = itemstack.getTag(); return nbttagcompound != null ? consumer.andThen((entity) -> { @@ -95,7 +95,7 @@ } return t0; -@@ -572,7 +596,7 @@ +@@ -573,7 +597,7 @@ } return entity; @@ -104,7 +104,7 @@ } public static Stream loadEntitiesRecursive(final List list, final World world) { -@@ -629,7 +653,7 @@ +@@ -634,7 +658,7 @@ @Nullable public T tryCast(Entity entity) { @@ -113,7 +113,7 @@ } @Override -@@ -664,7 +688,7 @@ +@@ -669,7 +693,7 @@ this.canSpawnFarFromPlayer = enumcreaturetype == EnumCreatureType.CREATURE || enumcreaturetype == EnumCreatureType.MISC; } diff --git a/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.patch b/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.patch index 11e2d4faf..a7469ed6d 100644 --- a/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.patch +++ b/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.patch @@ -12,12 +12,12 @@ public class PathfinderGoalTame extends PathfinderGoal { private final EntityHorseAbstract horse; -@@ -62,7 +67,7 @@ +@@ -63,7 +68,7 @@ int i = this.horse.getTemper(); int j = this.horse.getMaxTemper(); - if (j > 0 && this.horse.getRandom().nextInt(j) < i) { + if (j > 0 && this.horse.getRandom().nextInt(j) < i && !CraftEventFactory.callEntityTameEvent(this.horse, ((CraftHumanEntity) this.horse.getBukkitEntity().getPassenger()).getHandle()).isCancelled()) { // CraftBukkit - fire EntityTameEvent - this.horse.tameWithName((EntityHuman) entity); + this.horse.tameWithName(entityhuman); return; } diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityAnimal.patch b/nms-patches/net/minecraft/world/entity/animal/EntityAnimal.patch index 41d59ecb7..e84f9be30 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityAnimal.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityAnimal.patch @@ -35,7 +35,7 @@ } } -@@ -175,10 +187,17 @@ +@@ -170,10 +182,17 @@ } public void setInLove(@Nullable EntityHuman entityhuman) { @@ -54,7 +54,7 @@ this.level().broadcastEntityEvent(this, (byte) 18); } -@@ -220,12 +239,29 @@ +@@ -215,12 +234,29 @@ if (entityageable != null) { entityageable.setBaby(true); entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); @@ -86,7 +86,7 @@ Optional.ofNullable(this.getLoveCause()).or(() -> { return Optional.ofNullable(entityanimal.getLoveCause()); }).ifPresent((entityplayer) -> { -@@ -238,7 +274,11 @@ +@@ -233,7 +269,11 @@ entityanimal.resetLove(); worldserver.broadcastEntityEvent(this, (byte) 18); if (worldserver.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityCat.patch b/nms-patches/net/minecraft/world/entity/animal/EntityCat.patch index cbb1519cc..5f1548765 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityCat.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityCat.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityCat.java +++ b/net/minecraft/world/entity/animal/EntityCat.java -@@ -412,7 +412,7 @@ +@@ -413,7 +413,7 @@ } } else if (this.isFood(itemstack)) { this.usePlayerItem(entityhuman, enumhand, itemstack); @@ -9,7 +9,7 @@ this.tame(entityhuman); this.setOrderedToSit(true); this.level().broadcastEntityEvent(this, (byte) 7); -@@ -469,7 +469,7 @@ +@@ -475,7 +475,7 @@ private static class PathfinderGoalTemptChance extends PathfinderGoalTempt { @Nullable @@ -18,7 +18,7 @@ private final EntityCat cat; public PathfinderGoalTemptChance(EntityCat entitycat, double d0, RecipeItemStack recipeitemstack, boolean flag) { -@@ -610,7 +610,15 @@ +@@ -616,7 +616,15 @@ while (iterator.hasNext()) { ItemStack itemstack = (ItemStack) iterator.next(); @@ -35,7 +35,7 @@ } } -@@ -642,10 +650,10 @@ +@@ -648,10 +656,10 @@ private final EntityCat cat; public a(EntityCat entitycat, Class oclass, float f, double d0, double d1) { diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityChicken.patch b/nms-patches/net/minecraft/world/entity/animal/EntityChicken.patch index 84468709c..30e374f7f 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityChicken.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityChicken.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityChicken.java +++ b/net/minecraft/world/entity/animal/EntityChicken.java -@@ -96,7 +96,9 @@ +@@ -97,7 +97,9 @@ this.flap += this.flapping * 2.0F; if (!this.level().isClientSide && this.isAlive() && !this.isBaby() && !this.isChickenJockey() && --this.eggTime <= 0) { this.playSound(SoundEffects.CHICKEN_EGG, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityCow.patch b/nms-patches/net/minecraft/world/entity/animal/EntityCow.patch index 6847acb8a..c09b33ea8 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityCow.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityCow.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/animal/EntityCow.java +++ b/net/minecraft/world/entity/animal/EntityCow.java -@@ -31,6 +31,12 @@ - import net.minecraft.world.level.World; +@@ -33,6 +33,12 @@ import net.minecraft.world.level.block.state.IBlockData; + import org.joml.Vector3f; +// CraftBukkit start +import org.bukkit.craftbukkit.event.CraftEventFactory; @@ -13,7 +13,7 @@ public class EntityCow extends EntityAnimal { public EntityCow(EntityTypes entitytypes, World world) { -@@ -83,8 +89,16 @@ +@@ -85,8 +91,16 @@ ItemStack itemstack = entityhuman.getItemInHand(enumhand); if (itemstack.is(Items.BUCKET) && !this.isBaby()) { diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityFox.patch b/nms-patches/net/minecraft/world/entity/animal/EntityFox.patch index bee501961..ec6925091 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityFox.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityFox.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityFox.java +++ b/net/minecraft/world/entity/animal/EntityFox.java -@@ -517,7 +517,8 @@ +@@ -523,7 +523,8 @@ protected void pickUpItem(EntityItem entityitem) { ItemStack itemstack = entityitem.getItem(); @@ -10,7 +10,7 @@ int i = itemstack.getCount(); if (i > 1) { -@@ -872,6 +873,16 @@ +@@ -883,6 +884,16 @@ if (entityplayer1 != null && entityplayer != entityplayer1) { entityfox.addTrustedUUID(entityplayer1.getUUID()); } @@ -27,7 +27,7 @@ if (entityplayer2 != null) { entityplayer2.awardStat(StatisticList.ANIMALS_BRED); -@@ -882,12 +893,14 @@ +@@ -893,12 +904,14 @@ this.partner.setAge(6000); this.animal.resetLove(); this.partner.resetLove(); @@ -46,7 +46,7 @@ } } -@@ -1285,6 +1298,11 @@ +@@ -1294,6 +1307,11 @@ int i = (Integer) iblockdata.getValue(BlockSweetBerryBush.AGE); iblockdata.setValue(BlockSweetBerryBush.AGE, 1); @@ -58,7 +58,7 @@ int j = 1 + EntityFox.this.level().random.nextInt(2) + (i == 3 ? 1 : 0); ItemStack itemstack = EntityFox.this.getItemBySlot(EnumItemSlot.MAINHAND); -@@ -1441,7 +1459,7 @@ +@@ -1451,7 +1469,7 @@ private EntityLiving trustedLastHurt; private int timestamp; diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityMushroomCow.patch b/nms-patches/net/minecraft/world/entity/animal/EntityMushroomCow.patch index c9e0305ca..9e8f91384 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityMushroomCow.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityMushroomCow.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/animal/EntityMushroomCow.java +++ b/net/minecraft/world/entity/animal/EntityMushroomCow.java @@ -42,6 +42,13 @@ + import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.gameevent.GameEvent; - import org.apache.commons.lang3.tuple.Pair; +// CraftBukkit start +import org.bukkit.Bukkit; @@ -14,7 +14,7 @@ public class EntityMushroomCow extends EntityCow implements IShearable, VariantHolder { private static final DataWatcherObject DATA_TYPE = DataWatcher.defineId(EntityMushroomCow.class, DataWatcherRegistry.STRING); -@@ -115,6 +122,11 @@ +@@ -114,6 +121,11 @@ this.playSound(soundeffect, 1.0F, 1.0F); return EnumInteractionResult.sidedSuccess(this.level().isClientSide); } else if (itemstack.is(Items.SHEARS) && this.readyForShearing()) { @@ -26,7 +26,7 @@ this.shear(SoundCategory.PLAYERS); this.gameEvent(GameEvent.SHEAR, entityhuman); if (!this.level().isClientSide) { -@@ -165,7 +177,7 @@ +@@ -161,7 +173,7 @@ if (entitycow != null) { ((WorldServer) this.level()).sendParticles(Particles.EXPLOSION, this.getX(), this.getY(0.5D), this.getZ(), 1, 0.0D, 0.0D, 0.0D, 0.0D); @@ -35,7 +35,7 @@ entitycow.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); entitycow.setHealth(this.getHealth()); entitycow.yBodyRot = this.yBodyRot; -@@ -179,10 +191,25 @@ +@@ -175,10 +187,25 @@ } entitycow.setInvulnerable(this.isInvulnerable()); diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityOcelot.patch b/nms-patches/net/minecraft/world/entity/animal/EntityOcelot.patch index fd9f79c2e..e57d802e9 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityOcelot.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityOcelot.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityOcelot.java +++ b/net/minecraft/world/entity/animal/EntityOcelot.java -@@ -177,7 +177,7 @@ +@@ -179,7 +179,7 @@ if ((this.temptGoal == null || this.temptGoal.isRunning()) && !this.isTrusting() && this.isFood(itemstack) && entityhuman.distanceToSqr((Entity) this) < 9.0D) { this.usePlayerItem(entityhuman, enumhand, itemstack); if (!this.level().isClientSide) { @@ -9,7 +9,7 @@ this.setTrusting(true); this.spawnTrustingParticles(true); this.level().broadcastEntityEvent(this, (byte) 41); -@@ -308,10 +308,10 @@ +@@ -315,10 +315,10 @@ private final EntityOcelot ocelot; public a(EntityOcelot entityocelot, Class oclass, float f, double d0, double d1) { diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityPanda.patch b/nms-patches/net/minecraft/world/entity/animal/EntityPanda.patch index e6ba2a447..7d72eaafc 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityPanda.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityPanda.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/animal/EntityPanda.java +++ b/net/minecraft/world/entity/animal/EntityPanda.java -@@ -65,6 +65,11 @@ - import net.minecraft.world.level.gameevent.GameEvent; +@@ -67,6 +67,11 @@ import net.minecraft.world.phys.Vec3D; + import org.joml.Vector3f; +// CraftBukkit start; +import org.bukkit.craftbukkit.event.CraftEventFactory; @@ -12,7 +12,7 @@ public class EntityPanda extends EntityAnimal { private static final DataWatcherObject UNHAPPY_COUNTER = DataWatcher.defineId(EntityPanda.class, DataWatcherRegistry.INT); -@@ -532,7 +537,7 @@ +@@ -534,7 +539,7 @@ @Override protected void pickUpItem(EntityItem entityitem) { @@ -21,7 +21,7 @@ this.onItemPickup(entityitem); ItemStack itemstack = entityitem.getItem(); -@@ -863,10 +868,10 @@ +@@ -870,10 +875,10 @@ private final EntityPanda panda; public c(EntityPanda entitypanda, Class oclass, float f, double d0, double d1) { @@ -35,7 +35,7 @@ this.panda = entitypanda; } -@@ -1105,7 +1110,7 @@ +@@ -1112,7 +1117,7 @@ @Override protected void alertOther(EntityInsentient entityinsentient, EntityLiving entityliving) { if (entityinsentient instanceof EntityPanda && entityinsentient.isAggressive()) { diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityParrot.patch b/nms-patches/net/minecraft/world/entity/animal/EntityParrot.patch index 10ec16ba1..22d76067c 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityParrot.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityParrot.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityParrot.java +++ b/net/minecraft/world/entity/animal/EntityParrot.java -@@ -261,7 +261,7 @@ +@@ -262,7 +262,7 @@ } if (!this.level().isClientSide) { @@ -9,7 +9,7 @@ this.tame(entityhuman); this.level().broadcastEntityEvent(this, (byte) 7); } else { -@@ -275,7 +275,7 @@ +@@ -276,7 +276,7 @@ itemstack.shrink(1); } @@ -18,7 +18,7 @@ if (entityhuman.isCreative() || !this.isInvulnerable()) { this.hurt(this.damageSources().playerAttack(entityhuman), Float.MAX_VALUE); } -@@ -382,7 +382,7 @@ +@@ -383,7 +383,7 @@ @Override public boolean isPushable() { @@ -27,7 +27,7 @@ } @Override -@@ -397,11 +397,14 @@ +@@ -398,11 +398,14 @@ if (this.isInvulnerableTo(damagesource)) { return false; } else { diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityPig.patch b/nms-patches/net/minecraft/world/entity/animal/EntityPig.patch index 51a7c532a..9066083a4 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityPig.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityPig.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/animal/EntityPig.java +++ b/net/minecraft/world/entity/animal/EntityPig.java -@@ -49,6 +49,10 @@ - import net.minecraft.world.phys.AxisAlignedBB; +@@ -51,6 +51,10 @@ import net.minecraft.world.phys.Vec3D; + import org.joml.Vector3f; +// CraftBukkit start +import org.bukkit.craftbukkit.event.CraftEventFactory; @@ -11,7 +11,7 @@ public class EntityPig extends EntityAnimal implements ISteerable, ISaddleable { private static final DataWatcherObject DATA_SADDLE_ID = DataWatcher.defineId(EntityPig.class, DataWatcherRegistry.BOOLEAN); -@@ -250,7 +254,13 @@ +@@ -252,7 +256,13 @@ } entitypigzombie.setPersistenceRequired(); diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityRabbit.patch b/nms-patches/net/minecraft/world/entity/animal/EntityRabbit.patch index e328b66fd..faa5bddea 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityRabbit.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityRabbit.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityRabbit.java +++ b/net/minecraft/world/entity/animal/EntityRabbit.java -@@ -66,6 +66,10 @@ +@@ -67,6 +67,10 @@ import net.minecraft.world.level.pathfinder.PathEntity; import net.minecraft.world.phys.Vec3D; @@ -11,7 +11,7 @@ public class EntityRabbit extends EntityAnimal implements VariantHolder { public static final double STROLL_SPEED_MOD = 0.6D; -@@ -88,7 +92,6 @@ +@@ -89,7 +93,6 @@ super(entitytypes, world); this.jumpControl = new EntityRabbit.ControllerJumpRabbit(this); this.moveControl = new EntityRabbit.ControllerMoveRabbit(this); @@ -19,7 +19,7 @@ } @Override -@@ -576,9 +579,19 @@ +@@ -577,9 +580,19 @@ int i = (Integer) iblockdata.getValue(BlockCarrots.AGE); if (i == 0) { @@ -37,5 +37,5 @@ + } + // CraftBukkit end world.setBlock(blockposition, (IBlockData) iblockdata.setValue(BlockCarrots.AGE, i - 1), 2); + world.gameEvent(GameEvent.BLOCK_CHANGE, blockposition, GameEvent.a.of((Entity) this.rabbit)); world.levelEvent(2001, blockposition, Block.getId(iblockdata)); - } diff --git a/nms-patches/net/minecraft/world/entity/animal/EntitySheep.patch b/nms-patches/net/minecraft/world/entity/animal/EntitySheep.patch index 14f1ab76d..efda17bf7 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntitySheep.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntitySheep.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/animal/EntitySheep.java +++ b/net/minecraft/world/entity/animal/EntitySheep.java -@@ -64,6 +64,14 @@ - import net.minecraft.world.level.gameevent.GameEvent; +@@ -66,6 +66,14 @@ import net.minecraft.world.level.storage.loot.LootTables; + import org.joml.Vector3f; +// CraftBukkit start +import net.minecraft.world.inventory.InventoryCraftResult; @@ -15,7 +15,7 @@ public class EntitySheep extends EntityAnimal implements IShearable { private static final int EAT_ANIMATION_TICKS = 40; -@@ -244,6 +252,11 @@ +@@ -246,6 +254,11 @@ if (itemstack.is(Items.SHEARS)) { if (!this.level().isClientSide && this.readyForShearing()) { @@ -27,7 +27,7 @@ this.shear(SoundCategory.PLAYERS); this.gameEvent(GameEvent.SHEAR, entityhuman); itemstack.hurtAndBreak(1, entityhuman, (entityhuman1) -> { -@@ -265,7 +278,9 @@ +@@ -267,7 +280,9 @@ int i = 1 + this.random.nextInt(3); for (int j = 0; j < i; ++j) { @@ -37,7 +37,7 @@ if (entityitem != null) { entityitem.setDeltaMovement(entityitem.getDeltaMovement().add((double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F), (double) (this.random.nextFloat() * 0.05F), (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F))); -@@ -358,6 +373,12 @@ +@@ -360,6 +375,12 @@ @Override public void ate() { @@ -50,16 +50,16 @@ super.ate(); this.setSheared(false); if (this.isBaby()) { -@@ -377,7 +398,7 @@ +@@ -379,7 +400,7 @@ EnumColor enumcolor = ((EntitySheep) entityanimal).getColor(); EnumColor enumcolor1 = ((EntitySheep) entityanimal1).getColor(); InventoryCrafting inventorycrafting = makeContainer(enumcolor, enumcolor1); -- Optional optional = this.level().getRecipeManager().getRecipeFor(Recipes.CRAFTING, inventorycrafting, this.level()).map((recipecrafting) -> { -+ Optional optional = this.level().getRecipeManager().getRecipeFor(Recipes.CRAFTING, inventorycrafting, this.level()).map((recipecrafting) -> { // CraftBukkit - decompile error - return recipecrafting.assemble(inventorycrafting, this.level().registryAccess()); +- Optional optional = this.level().getRecipeManager().getRecipeFor(Recipes.CRAFTING, inventorycrafting, this.level()).map((recipeholder) -> { ++ Optional optional = this.level().getRecipeManager().getRecipeFor(Recipes.CRAFTING, inventorycrafting, this.level()).map((recipeholder) -> { // CraftBukkit - decompile error + return ((RecipeCrafting) recipeholder.value()).assemble(inventorycrafting, this.level().registryAccess()); }).map(ItemStack::getItem); -@@ -400,10 +421,18 @@ +@@ -402,10 +423,18 @@ public boolean stillValid(EntityHuman entityhuman) { return false; } diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityTurtle.patch b/nms-patches/net/minecraft/world/entity/animal/EntityTurtle.patch index fc54c0167..218c6bb7c 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityTurtle.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityTurtle.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityTurtle.java +++ b/net/minecraft/world/entity/animal/EntityTurtle.java -@@ -308,7 +308,9 @@ +@@ -312,7 +312,9 @@ protected void ageBoundaryReached() { super.ageBoundaryReached(); if (!this.isBaby() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { @@ -10,7 +10,7 @@ } } -@@ -335,7 +337,9 @@ +@@ -339,7 +341,9 @@ @Override public void thunderHit(WorldServer worldserver, EntityLightning entitylightning) { @@ -19,8 +19,8 @@ + org.bukkit.craftbukkit.event.CraftEventFactory.entityDamage = null; // CraftBukkit } - private static class e extends ControllerMove { -@@ -487,12 +491,14 @@ + @Override +@@ -496,12 +500,14 @@ } else if (this.turtle.layEggCounter > this.adjustedTickDelay(200)) { World world = this.turtle.level(); diff --git a/nms-patches/net/minecraft/world/entity/animal/EntityWolf.patch b/nms-patches/net/minecraft/world/entity/animal/EntityWolf.patch index 66831084f..8114754db 100644 --- a/nms-patches/net/minecraft/world/entity/animal/EntityWolf.patch +++ b/nms-patches/net/minecraft/world/entity/animal/EntityWolf.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/animal/EntityWolf.java +++ b/net/minecraft/world/entity/animal/EntityWolf.java -@@ -69,6 +69,12 @@ - import net.minecraft.world.level.pathfinder.PathType; +@@ -70,6 +70,12 @@ import net.minecraft.world.phys.Vec3D; + import org.joml.Vector3f; +// CraftBukkit start +import org.bukkit.event.entity.EntityRegainHealthEvent; @@ -13,7 +13,7 @@ public class EntityWolf extends EntityTameableAnimal implements IEntityAngerable { private static final DataWatcherObject DATA_INTERESTED_ID = DataWatcher.defineId(EntityWolf.class, DataWatcherRegistry.BOOLEAN); -@@ -297,15 +303,19 @@ +@@ -298,15 +304,19 @@ } else { Entity entity = damagesource.getEntity(); @@ -37,7 +37,7 @@ } } -@@ -325,7 +335,7 @@ +@@ -326,7 +336,7 @@ super.setTame(flag); if (flag) { this.getAttribute(GenericAttributes.MAX_HEALTH).setBaseValue(20.0D); @@ -46,7 +46,7 @@ } else { this.getAttribute(GenericAttributes.MAX_HEALTH).setBaseValue(8.0D); } -@@ -348,7 +358,7 @@ +@@ -349,7 +359,7 @@ itemstack.shrink(1); } @@ -55,7 +55,7 @@ return EnumInteractionResult.SUCCESS; } else { if (item instanceof ItemDye) { -@@ -376,7 +386,7 @@ +@@ -377,7 +387,7 @@ this.setOrderedToSit(!this.isOrderedToSit()); this.jumping = false; this.navigation.stop(); @@ -64,7 +64,7 @@ return EnumInteractionResult.SUCCESS; } else { return enuminteractionresult; -@@ -387,7 +397,8 @@ +@@ -388,7 +398,8 @@ itemstack.shrink(1); } diff --git a/nms-patches/net/minecraft/world/entity/animal/allay/Allay.patch b/nms-patches/net/minecraft/world/entity/animal/allay/Allay.patch index 2aa558355..40b4cd0b1 100644 --- a/nms-patches/net/minecraft/world/entity/animal/allay/Allay.patch +++ b/nms-patches/net/minecraft/world/entity/animal/allay/Allay.patch @@ -1,15 +1,6 @@ --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -93,13 +93,14 @@ - private final DynamicGameEventListener dynamicJukeboxListener; - private final InventorySubcontainer inventory = new InventorySubcontainer(1); - @Nullable -- private BlockPosition jukeboxPos; -- private long duplicationCooldown; -+ public BlockPosition jukeboxPos; // PAIL private -> public -+ public long duplicationCooldown; // PAIL private -> public - private float holdingItemAnimationTicks; - private float holdingItemAnimationTicks0; +@@ -99,6 +99,7 @@ private float dancingAnimationTicks; private float spinningAnimationTicks; private float spinningAnimationTicks0; @@ -17,7 +8,7 @@ public Allay(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -111,6 +112,12 @@ +@@ -110,6 +111,12 @@ this.dynamicJukeboxListener = new DynamicGameEventListener<>(new Allay.a(this.vibrationUser.getPositionSource(), GameEvent.JUKEBOX_PLAY.getNotificationRadius())); } @@ -30,7 +21,7 @@ @Override protected BehaviorController.b brainProvider() { return BehaviorController.provider(Allay.MEMORY_TYPES, Allay.SENSOR_TYPES); -@@ -123,7 +130,7 @@ +@@ -122,7 +129,7 @@ @Override public BehaviorController getBrain() { @@ -39,7 +30,7 @@ } public static AttributeProvider.Builder createAttributes() { -@@ -230,7 +237,7 @@ +@@ -229,7 +236,7 @@ public void aiStep() { super.aiStep(); if (!this.level().isClientSide && this.isAlive() && this.tickCount % 10 == 0) { @@ -48,7 +39,7 @@ } if (this.isDancing() && this.shouldStopDancing() && this.tickCount % 20 == 0) { -@@ -300,7 +307,12 @@ +@@ -299,7 +306,12 @@ ItemStack itemstack1 = this.getItemInHand(EnumHand.MAIN_HAND); if (this.isDancing() && this.isDuplicationItem(itemstack) && this.canDuplicate()) { @@ -62,7 +53,7 @@ this.level().broadcastEntityEvent(this, (byte) 18); this.level().playSound(entityhuman, (Entity) this, SoundEffects.AMETHYST_BLOCK_CHIME, SoundCategory.NEUTRAL, 2.0F, 1.0F); this.removeInteractionItem(entityhuman, itemstack); -@@ -311,7 +323,7 @@ +@@ -310,7 +322,7 @@ this.setItemInHand(EnumHand.MAIN_HAND, itemstack2); this.removeInteractionItem(entityhuman, itemstack); this.level().playSound(entityhuman, (Entity) this, SoundEffects.ALLAY_ITEM_GIVEN, SoundCategory.NEUTRAL, 2.0F, 1.0F); @@ -71,7 +62,7 @@ return EnumInteractionResult.SUCCESS; } else if (!itemstack1.isEmpty() && enumhand == EnumHand.MAIN_HAND && itemstack.isEmpty()) { this.setItemSlot(EnumItemSlot.MAINHAND, ItemStack.EMPTY); -@@ -432,6 +444,7 @@ +@@ -427,6 +439,7 @@ } private boolean shouldStopDancing() { @@ -79,7 +70,7 @@ return this.jukeboxPos == null || !this.jukeboxPos.closerToCenterThan(this.position(), (double) GameEvent.JUKEBOX_PLAY.getNotificationRadius()) || !this.level().getBlockState(this.jukeboxPos).is(Blocks.JUKEBOX); } -@@ -476,7 +489,7 @@ +@@ -471,7 +484,7 @@ public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); this.writeInventoryToTag(nbttagcompound); @@ -88,7 +79,7 @@ Logger logger = Allay.LOGGER; Objects.requireNonNull(logger); -@@ -492,7 +505,7 @@ +@@ -487,7 +500,7 @@ super.readAdditionalSaveData(nbttagcompound); this.readInventoryFromTag(nbttagcompound); if (nbttagcompound.contains("listener", 10)) { @@ -97,16 +88,16 @@ Logger logger = Allay.LOGGER; Objects.requireNonNull(logger); -@@ -525,7 +538,7 @@ +@@ -520,7 +533,7 @@ return Allay.DUPLICATION_ITEM.test(itemstack); } -- private void duplicateAllay() { -+ public Allay duplicateAllay() { // CraftBukkit - return allay and private -> public +- public void duplicateAllay() { ++ public Allay duplicateAllay() { // CraftBukkit - return allay Allay allay = (Allay) EntityTypes.ALLAY.create(this.level()); if (allay != null) { -@@ -533,17 +546,17 @@ +@@ -528,9 +541,9 @@ allay.setPersistenceRequired(); allay.resetDuplicationCooldown(); this.resetDuplicationCooldown(); @@ -117,14 +108,4 @@ + return allay; // CraftBukkit } -- private void resetDuplicationCooldown() { -+ public void resetDuplicationCooldown() { // PAIL private -> public - this.duplicationCooldown = 6000L; - this.entityData.set(Allay.DATA_CAN_DUPLICATE, false); - } - -- private boolean canDuplicate() { -+ public boolean canDuplicate() { // PAIL private -> public - return (Boolean) this.entityData.get(Allay.DATA_CAN_DUPLICATE); - } - + public void resetDuplicationCooldown() { diff --git a/nms-patches/net/minecraft/world/entity/animal/axolotl/Axolotl.patch b/nms-patches/net/minecraft/world/entity/animal/axolotl/Axolotl.patch index 18e86b029..76a396449 100644 --- a/nms-patches/net/minecraft/world/entity/animal/axolotl/Axolotl.patch +++ b/nms-patches/net/minecraft/world/entity/animal/axolotl/Axolotl.patch @@ -27,7 +27,7 @@ } @Override -@@ -419,7 +426,7 @@ +@@ -414,7 +421,7 @@ int i = mobeffect != null ? mobeffect.getDuration() : 0; int j = Math.min(2400, 100 + i); @@ -36,7 +36,7 @@ } entityhuman.removeEffect(MobEffects.DIG_SLOWDOWN); -@@ -469,7 +476,7 @@ +@@ -464,7 +471,7 @@ @Override public BehaviorController getBrain() { diff --git a/nms-patches/net/minecraft/world/entity/animal/goat/Goat.patch b/nms-patches/net/minecraft/world/entity/animal/goat/Goat.patch index 374233d16..ca94087b2 100644 --- a/nms-patches/net/minecraft/world/entity/animal/goat/Goat.patch +++ b/nms-patches/net/minecraft/world/entity/animal/goat/Goat.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java -@@ -54,6 +54,12 @@ - import net.minecraft.world.level.pathfinder.PathType; +@@ -55,6 +55,12 @@ import net.minecraft.world.phys.Vec3D; + import org.joml.Vector3f; +// CraftBukkit start +import org.bukkit.craftbukkit.event.CraftEventFactory; @@ -13,7 +13,7 @@ public class Goat extends EntityAnimal { public static final EntitySize LONG_JUMPING_DIMENSIONS = EntitySize.scalable(0.9F, 1.3F).scale(0.7F); -@@ -181,7 +187,7 @@ +@@ -182,7 +188,7 @@ @Override public BehaviorController getBrain() { @@ -22,7 +22,7 @@ } @Override -@@ -219,8 +225,15 @@ +@@ -220,8 +226,15 @@ ItemStack itemstack = entityhuman.getItemInHand(enumhand); if (itemstack.is(Items.BUCKET) && !this.isBaby()) { diff --git a/nms-patches/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.patch b/nms-patches/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.patch index 19ac9635b..ee280a238 100644 --- a/nms-patches/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.patch +++ b/nms-patches/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.java +++ b/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.java -@@ -78,6 +78,12 @@ - import net.minecraft.world.phys.Vec2F; +@@ -79,6 +79,12 @@ import net.minecraft.world.phys.Vec3D; + import org.joml.Vector3f; +// CraftBukkit start +import org.bukkit.craftbukkit.event.CraftEventFactory; @@ -13,7 +13,7 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInventoryListener, HasCustomInventoryScreen, OwnableEntity, IJumpable, ISaddleable { public static final int EQUIPMENT_SLOT_OFFSET = 400; -@@ -139,6 +145,7 @@ +@@ -140,6 +146,7 @@ protected int gallopSoundCounter; @Nullable private UUID owner; @@ -21,7 +21,7 @@ protected EntityHorseAbstract(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -334,7 +341,7 @@ +@@ -335,7 +342,7 @@ public void createInventory() { InventorySubcontainer inventorysubcontainer = this.inventory; @@ -30,7 +30,7 @@ if (inventorysubcontainer != null) { inventorysubcontainer.removeListener(this); int i = Math.min(inventorysubcontainer.getContainerSize(), this.inventory.getContainerSize()); -@@ -442,7 +449,7 @@ +@@ -443,7 +450,7 @@ } public int getMaxTemper() { @@ -39,7 +39,7 @@ } @Override -@@ -513,7 +520,7 @@ +@@ -514,7 +521,7 @@ } if (this.getHealth() < this.getMaxHealth() && f > 0.0F) { @@ -48,7 +48,7 @@ flag = true; } -@@ -590,7 +597,7 @@ +@@ -591,7 +598,7 @@ super.aiStep(); if (!this.level().isClientSide && this.isAlive()) { if (this.random.nextInt(900) == 0 && this.deathTime == 0) { @@ -57,7 +57,7 @@ } if (this.canEatGrass()) { -@@ -857,6 +864,7 @@ +@@ -858,6 +865,7 @@ if (this.getOwnerUUID() != null) { nbttagcompound.putUUID("Owner", this.getOwnerUUID()); } @@ -65,7 +65,7 @@ if (!this.inventory.getItem(0).isEmpty()) { nbttagcompound.put("SaddleItem", this.inventory.getItem(0).save(new NBTTagCompound())); -@@ -884,6 +892,11 @@ +@@ -885,6 +893,11 @@ if (uuid != null) { this.setOwnerUUID(uuid); } @@ -77,7 +77,7 @@ if (nbttagcompound.contains("SaddleItem", 10)) { ItemStack itemstack = ItemStack.of(nbttagcompound.getCompound("SaddleItem")); -@@ -986,6 +999,17 @@ +@@ -987,6 +1000,17 @@ @Override public void handleStartJump(int i) { diff --git a/nms-patches/net/minecraft/world/entity/animal/horse/EntityLlama.patch b/nms-patches/net/minecraft/world/entity/animal/horse/EntityLlama.patch index edd02d7ad..865898eeb 100644 --- a/nms-patches/net/minecraft/world/entity/animal/horse/EntityLlama.patch +++ b/nms-patches/net/minecraft/world/entity/animal/horse/EntityLlama.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/horse/EntityLlama.java +++ b/net/minecraft/world/entity/animal/horse/EntityLlama.java -@@ -82,6 +82,11 @@ +@@ -84,6 +84,11 @@ return false; } diff --git a/nms-patches/net/minecraft/world/entity/animal/sniffer/Sniffer.patch b/nms-patches/net/minecraft/world/entity/animal/sniffer/Sniffer.patch index 1eeb190c8..94108b6b1 100644 --- a/nms-patches/net/minecraft/world/entity/animal/sniffer/Sniffer.patch +++ b/nms-patches/net/minecraft/world/entity/animal/sniffer/Sniffer.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -82,14 +82,23 @@ +@@ -83,14 +83,23 @@ public Sniffer(EntityTypes entitytypes, World world) { super(entitytypes, world); @@ -26,7 +26,7 @@ @Override protected float getStandingEyeHeight(EntityPose entitypose, EntitySize entitysize) { return this.getDimensions(entitypose).height * 0.6F; -@@ -270,6 +279,13 @@ +@@ -267,6 +276,13 @@ ItemStack itemstack = (ItemStack) iterator.next(); EntityItem entityitem = new EntityItem(worldserver, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), itemstack); @@ -40,7 +40,7 @@ entityitem.setDefaultPickUpDelay(); worldserver.addFreshEntity(entityitem); } -@@ -309,7 +325,7 @@ +@@ -306,7 +322,7 @@ List list = (List) this.getExploredPositions().limit(20L).collect(Collectors.toList()); list.add(0, GlobalPos.of(this.level().dimension(), blockposition)); @@ -49,7 +49,7 @@ return this; } -@@ -461,7 +477,7 @@ +@@ -458,7 +474,7 @@ @Override public BehaviorController getBrain() { diff --git a/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.patch b/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.patch index 45dc955d6..2d276f391 100644 --- a/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.patch +++ b/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java -@@ -51,6 +51,19 @@ - import net.minecraft.world.phys.Vec3D; +@@ -53,6 +53,19 @@ + import org.joml.Vector3f; import org.slf4j.Logger; +// CraftBukkit start @@ -20,7 +20,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -88,6 +101,7 @@ +@@ -90,6 +103,7 @@ private final PathPoint[] nodes; private final int[] nodeAdjacency; private final Path openSet; @@ -28,7 +28,7 @@ public EntityEnderDragon(EntityTypes entitytypes, World world) { super(EntityTypes.ENDER_DRAGON, world); -@@ -109,6 +123,7 @@ +@@ -111,6 +125,7 @@ this.noPhysics = true; this.noCulling = true; this.phaseManager = new DragonControllerManager(this); @@ -36,16 +36,16 @@ } public void setDragonFight(EnderDragonBattle enderdragonbattle) { -@@ -267,7 +282,7 @@ +@@ -258,7 +273,7 @@ Vec3D vec3d1 = idragoncontroller.getFlyTargetLocation(); - if (vec3d1 != null) { + if (vec3d1 != null && idragoncontroller.getPhase() != DragonControllerPhase.HOVERING) { // CraftBukkit - Don't move when hovering - d0 = vec3d1.x - this.getX(); - d1 = vec3d1.y - this.getY(); - d2 = vec3d1.z - this.getZ(); -@@ -408,7 +423,14 @@ + double d0 = vec3d1.x - this.getX(); + double d1 = vec3d1.y - this.getY(); + double d2 = vec3d1.z - this.getZ(); +@@ -399,7 +414,14 @@ if (this.nearestCrystal.isRemoved()) { this.nearestCrystal = null; } else if (this.tickCount % 10 == 0 && this.getHealth() < this.getMaxHealth()) { @@ -61,7 +61,7 @@ } } -@@ -483,6 +505,9 @@ +@@ -474,6 +496,9 @@ int j1 = MathHelper.floor(axisalignedbb.maxZ); boolean flag = false; boolean flag1 = false; @@ -71,7 +71,7 @@ for (int k1 = i; k1 <= l; ++k1) { for (int l1 = j; l1 <= i1; ++l1) { -@@ -492,7 +517,11 @@ +@@ -483,7 +508,11 @@ if (!iblockdata.isAir() && !iblockdata.is(TagsBlock.DRAGON_TRANSPARENT)) { if (this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !iblockdata.is(TagsBlock.DRAGON_IMMUNE)) { @@ -84,7 +84,7 @@ } else { flag = true; } -@@ -501,6 +530,51 @@ +@@ -492,6 +521,51 @@ } } @@ -136,7 +136,7 @@ if (flag1) { BlockPosition blockposition1 = new BlockPosition(i + this.random.nextInt(l - i + 1), j + this.random.nextInt(i1 - j + 1), k + this.random.nextInt(j1 - k + 1)); -@@ -565,6 +639,21 @@ +@@ -556,6 +630,21 @@ } @@ -158,7 +158,7 @@ @Override protected void tickDeath() { if (this.dragonFight != null) { -@@ -580,15 +669,20 @@ +@@ -571,15 +660,20 @@ this.level().addParticle(Particles.EXPLOSION_EMITTER, this.getX() + (double) f, this.getY() + 2.0D + (double) f1, this.getZ() + (double) f2, 0.0D, 0.0D, 0.0D); } @@ -180,7 +180,7 @@ EntityExperienceOrb.award((WorldServer) this.level(), this.position(), MathHelper.floor((float) short0 * 0.08F)); } -@@ -599,7 +693,7 @@ +@@ -590,7 +684,7 @@ this.move(EnumMoveType.SELF, new Vec3D(0.0D, 0.10000000149011612D, 0.0D)); if (this.dragonDeathTime == 200 && this.level() instanceof WorldServer) { @@ -189,7 +189,7 @@ EntityExperienceOrb.award((WorldServer) this.level(), this.position(), MathHelper.floor((float) short0 * 0.2F)); } -@@ -820,6 +914,7 @@ +@@ -811,6 +905,7 @@ super.addAdditionalSaveData(nbttagcompound); nbttagcompound.putInt("DragonPhase", this.phaseManager.getCurrentPhase().getPhase().getId()); nbttagcompound.putInt("DragonDeathTime", this.dragonDeathTime); @@ -197,7 +197,7 @@ } @Override -@@ -833,6 +928,11 @@ +@@ -824,6 +919,11 @@ this.dragonDeathTime = nbttagcompound.getInt("DragonDeathTime"); } diff --git a/nms-patches/net/minecraft/world/entity/decoration/EntityArmorStand.patch b/nms-patches/net/minecraft/world/entity/decoration/EntityArmorStand.patch index b6007e5c4..2d3409dfa 100644 --- a/nms-patches/net/minecraft/world/entity/decoration/EntityArmorStand.patch +++ b/nms-patches/net/minecraft/world/entity/decoration/EntityArmorStand.patch @@ -53,7 +53,7 @@ } } -@@ -401,7 +424,25 @@ +@@ -402,7 +425,25 @@ return false; } else if (itemstack1.isEmpty() && (this.disabledSlots & 1 << enumitemslot.getFilterFlag() + 16) != 0) { return false; @@ -80,7 +80,7 @@ this.setItemSlot(enumitemslot, itemstack.copyWithCount(1)); return true; } else if (!itemstack.isEmpty() && itemstack.getCount() > 1) { -@@ -416,15 +457,26 @@ +@@ -417,15 +458,26 @@ entityhuman.setItemInHand(enumhand, itemstack1); return true; } @@ -108,7 +108,7 @@ if (damagesource.is(DamageTypeTags.IS_EXPLOSION)) { this.brokenByAnything(damagesource); this.kill(); -@@ -473,7 +525,7 @@ +@@ -486,7 +538,7 @@ } else { this.brokenByPlayer(damagesource); this.showBreakingParticles(); @@ -117,7 +117,7 @@ } return true; -@@ -541,13 +593,13 @@ +@@ -554,13 +606,13 @@ itemstack.setHoverName(this.getCustomName()); } @@ -133,7 +133,7 @@ ItemStack itemstack; int i; -@@ -555,7 +607,7 @@ +@@ -568,7 +620,7 @@ for (i = 0; i < this.handItems.size(); ++i) { itemstack = (ItemStack) this.handItems.get(i); if (!itemstack.isEmpty()) { @@ -142,7 +142,7 @@ this.handItems.set(i, ItemStack.EMPTY); } } -@@ -563,10 +615,11 @@ +@@ -576,10 +628,11 @@ for (i = 0; i < this.armorItems.size(); ++i) { itemstack = (ItemStack) this.armorItems.get(i); if (!itemstack.isEmpty()) { @@ -155,7 +155,7 @@ } -@@ -667,8 +720,16 @@ +@@ -675,8 +728,16 @@ return this.isSmall(); } diff --git a/nms-patches/net/minecraft/world/entity/item/EntityFallingBlock.patch b/nms-patches/net/minecraft/world/entity/item/EntityFallingBlock.patch index 9e43bec5c..db4e674df 100644 --- a/nms-patches/net/minecraft/world/entity/item/EntityFallingBlock.patch +++ b/nms-patches/net/minecraft/world/entity/item/EntityFallingBlock.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/item/EntityFallingBlock.java +++ b/net/minecraft/world/entity/item/EntityFallingBlock.java -@@ -49,13 +49,17 @@ +@@ -49,6 +49,10 @@ import net.minecraft.world.phys.Vec3D; import org.slf4j.Logger; @@ -11,14 +11,6 @@ public class EntityFallingBlock extends Entity { private static final Logger LOGGER = LogUtils.getLogger(); - private IBlockData blockState; - public int time; - public boolean dropItem; -- private boolean cancelDrop; -+ public boolean cancelDrop; // PAIL private -> public - public boolean hurtEntities; - public int fallDamageMax; - public float fallDamagePerDistance; @@ -83,10 +87,17 @@ } diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityCaveSpider.patch b/nms-patches/net/minecraft/world/entity/monster/EntityCaveSpider.patch index 71fd6ae8a..b73945ea1 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityCaveSpider.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityCaveSpider.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityCaveSpider.java +++ b/net/minecraft/world/entity/monster/EntityCaveSpider.java -@@ -41,7 +41,7 @@ +@@ -42,7 +42,7 @@ } if (b0 > 0) { diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityEnderman.patch b/nms-patches/net/minecraft/world/entity/monster/EntityEnderman.patch index 886df19ef..0470b2434 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityEnderman.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityEnderman.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/monster/EntityEnderman.java +++ b/net/minecraft/world/entity/monster/EntityEnderman.java -@@ -70,6 +70,11 @@ - import net.minecraft.world.phys.MovingObjectPositionBlock; +@@ -71,6 +71,11 @@ import net.minecraft.world.phys.Vec3D; + import org.joml.Vector3f; +// CraftBukkit start; +import org.bukkit.craftbukkit.event.CraftEventFactory; @@ -12,7 +12,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable { private static final UUID SPEED_MODIFIER_ATTACKING_UUID = UUID.fromString("020E0DFB-87AE-4653-9556-831010E291A0"); -@@ -114,7 +119,17 @@ +@@ -115,7 +120,17 @@ @Override public void setTarget(@Nullable EntityLiving entityliving) { @@ -31,7 +31,7 @@ AttributeModifiable attributemodifiable = this.getAttribute(GenericAttributes.MOVEMENT_SPEED); if (entityliving == null) { -@@ -129,6 +144,7 @@ +@@ -130,6 +145,7 @@ attributemodifiable.addTransientModifier(EntityEnderman.SPEED_MODIFIER_ATTACKING); } } @@ -39,7 +39,7 @@ } -@@ -487,9 +503,11 @@ +@@ -493,9 +509,11 @@ if (iblockdata2 != null) { iblockdata2 = Block.updateFromNeighbourShapes(iblockdata2, this.enderman.level(), blockposition); if (this.canPlaceBlock(world, blockposition, iblockdata2, iblockdata, iblockdata1, blockposition1)) { @@ -51,7 +51,7 @@ } } -@@ -528,9 +546,11 @@ +@@ -534,9 +552,11 @@ boolean flag = movingobjectpositionblock.getBlockPos().equals(blockposition); if (iblockdata.is(TagsBlock.ENDERMAN_HOLDABLE) && flag) { diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityEvoker.patch b/nms-patches/net/minecraft/world/entity/monster/EntityEvoker.patch index 1a6e2a83d..3149eefff 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityEvoker.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityEvoker.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/monster/EntityEvoker.java +++ b/net/minecraft/world/entity/monster/EntityEvoker.java -@@ -192,7 +192,7 @@ +@@ -194,7 +194,7 @@ entityvex.setOwner(EntityEvoker.this); entityvex.setBoundOrigin(blockposition); entityvex.setLimitedLife(20 * (30 + EntityEvoker.this.random.nextInt(90))); - worldserver.addFreshEntityWithPassengers(entityvex); + worldserver.addFreshEntityWithPassengers(entityvex, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPELL); // CraftBukkit - Add SpawnReason + worldserver.gameEvent(GameEvent.ENTITY_PLACE, blockposition, GameEvent.a.of((Entity) EntityEvoker.this)); } } - diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityGhast.patch b/nms-patches/net/minecraft/world/entity/monster/EntityGhast.patch index 10f7881bb..b13f60c7e 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityGhast.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityGhast.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityGhast.java +++ b/net/minecraft/world/entity/monster/EntityGhast.java -@@ -337,6 +337,8 @@ +@@ -348,6 +348,8 @@ EntityLargeFireball entitylargefireball = new EntityLargeFireball(world, this.ghast, d2, d3, d4, this.ghast.getExplosionPower()); diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityGuardian.patch b/nms-patches/net/minecraft/world/entity/monster/EntityGuardian.patch index d448ed9dc..ca9e89b61 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityGuardian.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityGuardian.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityGuardian.java +++ b/net/minecraft/world/entity/monster/EntityGuardian.java -@@ -62,6 +62,7 @@ +@@ -63,6 +63,7 @@ private boolean clientSideTouchedGround; @Nullable public PathfinderGoalRandomStroll randomStrollGoal; @@ -8,7 +8,7 @@ public EntityGuardian(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -77,7 +78,7 @@ +@@ -78,7 +79,7 @@ PathfinderGoalMoveTowardsRestriction pathfindergoalmovetowardsrestriction = new PathfinderGoalMoveTowardsRestriction(this, 1.0D); this.randomStrollGoal = new PathfinderGoalRandomStroll(this, 1.0D, 80); diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityGuardianElder.patch b/nms-patches/net/minecraft/world/entity/monster/EntityGuardianElder.patch index c708cf101..d1e4065c3 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityGuardianElder.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityGuardianElder.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityGuardianElder.java +++ b/net/minecraft/world/entity/monster/EntityGuardianElder.java -@@ -67,7 +67,7 @@ +@@ -70,7 +70,7 @@ super.customServerAiStep(); if ((this.tickCount + this.getId()) % 1200 == 0) { MobEffect mobeffect = new MobEffect(MobEffects.DIG_SLOWDOWN, 6000, 2); diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityPhantom.patch b/nms-patches/net/minecraft/world/entity/monster/EntityPhantom.patch index 67782a516..d1fe7ee4b 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityPhantom.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityPhantom.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityPhantom.java +++ b/net/minecraft/world/entity/monster/EntityPhantom.java -@@ -538,14 +538,14 @@ +@@ -543,14 +543,14 @@ List list = EntityPhantom.this.level().getNearbyPlayers(this.attackTargeting, EntityPhantom.this, EntityPhantom.this.getBoundingBox().inflate(16.0D, 64.0D, 16.0D)); if (!list.isEmpty()) { diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityPigZombie.patch b/nms-patches/net/minecraft/world/entity/monster/EntityPigZombie.patch index 90bb4fb34..0c71b9df7 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityPigZombie.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityPigZombie.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityPigZombie.java +++ b/net/minecraft/world/entity/monster/EntityPigZombie.java -@@ -154,7 +154,7 @@ +@@ -150,7 +150,7 @@ }).filter((entitypigzombie) -> { return !entitypigzombie.isAlliedTo((Entity) this.getTarget()); }).forEach((entitypigzombie) -> { @@ -9,7 +9,7 @@ }); } -@@ -163,7 +163,7 @@ +@@ -159,7 +159,7 @@ } @Override @@ -18,7 +18,7 @@ if (this.getTarget() == null && entityliving != null) { this.playFirstAngerSoundIn = EntityPigZombie.FIRST_ANGER_SOUND_DELAY.sample(this.random); this.ticksUntilNextAlert = EntityPigZombie.ALERT_INTERVAL.sample(this.random); -@@ -173,12 +173,21 @@ +@@ -169,12 +169,21 @@ this.setLastHurtByPlayer((EntityHuman) entityliving); } diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityRavager.patch b/nms-patches/net/minecraft/world/entity/monster/EntityRavager.patch index 25949a9b8..feae2dad0 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityRavager.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityRavager.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/monster/EntityRavager.java +++ b/net/minecraft/world/entity/monster/EntityRavager.java -@@ -41,6 +41,10 @@ - import net.minecraft.world.phys.AxisAlignedBB; +@@ -43,6 +43,10 @@ import net.minecraft.world.phys.Vec3D; + import org.joml.Vector3f; +// CraftBukkit start +import org.bukkit.craftbukkit.event.CraftEventFactory; @@ -11,7 +11,7 @@ public class EntityRavager extends EntityRaider { private static final Predicate NO_RAVAGER_AND_ALIVE = (entity) -> { -@@ -171,6 +175,11 @@ +@@ -153,6 +157,11 @@ Block block = iblockdata.getBlock(); if (block instanceof BlockLeaves) { diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityShulker.patch b/nms-patches/net/minecraft/world/entity/monster/EntityShulker.patch index c2a77144a..1a9d64e26 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityShulker.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityShulker.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityShulker.java +++ b/net/minecraft/world/entity/monster/EntityShulker.java -@@ -60,6 +60,12 @@ +@@ -59,6 +59,12 @@ import net.minecraft.world.phys.Vec3D; import org.joml.Vector3f; @@ -13,7 +13,7 @@ public class EntityShulker extends EntityGolem implements VariantHolder>, IMonster { private static final UUID COVERED_ARMOR_MODIFIER_UUID = UUID.fromString("7E0292F2-9434-48D5-A29F-9583AF7DF27F"); -@@ -408,6 +414,14 @@ +@@ -400,6 +406,14 @@ EnumDirection enumdirection = this.findAttachableSurface(blockposition1); if (enumdirection != null) { @@ -28,7 +28,7 @@ this.unRide(); this.setAttachFace(enumdirection); this.playSound(SoundEffects.SHULKER_TELEPORT, 1.0F, 1.0F); -@@ -478,7 +492,7 @@ +@@ -470,7 +484,7 @@ if (entityshulker != null) { entityshulker.setVariant(this.getVariant()); entityshulker.moveTo(vec3d); diff --git a/nms-patches/net/minecraft/world/entity/monster/EntitySilverfish.patch b/nms-patches/net/minecraft/world/entity/monster/EntitySilverfish.patch index 20dff0560..d7e3c5aab 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntitySilverfish.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntitySilverfish.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/monster/EntitySilverfish.java +++ b/net/minecraft/world/entity/monster/EntitySilverfish.java -@@ -33,6 +33,10 @@ - import net.minecraft.world.level.block.BlockMonsterEggs; +@@ -34,6 +34,10 @@ import net.minecraft.world.level.block.state.IBlockData; + import org.joml.Vector3f; +// CraftBukkit start +import org.bukkit.craftbukkit.event.CraftEventFactory; @@ -11,7 +11,7 @@ public class EntitySilverfish extends EntityMonster { @Nullable -@@ -175,6 +179,11 @@ +@@ -176,6 +180,11 @@ Block block = iblockdata.getBlock(); if (block instanceof BlockMonsterEggs) { @@ -23,7 +23,7 @@ if (world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { world.destroyBlock(blockposition1, true, this.silverfish); } else { -@@ -244,6 +253,11 @@ +@@ -245,6 +254,11 @@ IBlockData iblockdata = world.getBlockState(blockposition); if (BlockMonsterEggs.isCompatibleHostBlock(iblockdata)) { diff --git a/nms-patches/net/minecraft/world/entity/monster/EntitySkeletonWither.patch b/nms-patches/net/minecraft/world/entity/monster/EntitySkeletonWither.patch index e928a66d5..b5f342f3e 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntitySkeletonWither.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntitySkeletonWither.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntitySkeletonWither.java +++ b/net/minecraft/world/entity/monster/EntitySkeletonWither.java -@@ -106,7 +106,7 @@ +@@ -111,7 +111,7 @@ return false; } else { if (entity instanceof EntityLiving) { diff --git a/nms-patches/net/minecraft/world/entity/monster/EntitySlime.patch b/nms-patches/net/minecraft/world/entity/monster/EntitySlime.patch index c22e95ef4..1c26a1f3a 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntitySlime.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntitySlime.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/monster/EntitySlime.java +++ b/net/minecraft/world/entity/monster/EntitySlime.java -@@ -42,6 +42,14 @@ - import net.minecraft.world.level.levelgen.SeededRandom; +@@ -44,6 +44,14 @@ import net.minecraft.world.phys.Vec3D; + import org.joml.Vector3f; +// CraftBukkit start +import java.util.ArrayList; @@ -15,7 +15,7 @@ public class EntitySlime extends EntityInsentient implements IMonster { private static final DataWatcherObject ID_SIZE = DataWatcher.defineId(EntitySlime.class, DataWatcherRegistry.INT); -@@ -185,7 +193,7 @@ +@@ -192,7 +200,7 @@ @Override public EntityTypes getType() { @@ -24,7 +24,7 @@ } @Override -@@ -199,6 +207,19 @@ +@@ -206,6 +214,19 @@ int j = i / 2; int k = 2 + this.random.nextInt(3); @@ -44,7 +44,7 @@ for (int l = 0; l < k; ++l) { float f1 = ((float) (l % 2) - 0.5F) * f; float f2 = ((float) (l / 2) - 0.5F) * f; -@@ -214,9 +235,18 @@ +@@ -221,9 +242,18 @@ entityslime.setInvulnerable(this.isInvulnerable()); entityslime.setSize(j, true); entityslime.moveTo(this.getX() + (double) f1, this.getY() + 0.5D, this.getZ() + (double) f2, this.random.nextFloat() * 360.0F, 0.0F); diff --git a/nms-patches/net/minecraft/world/entity/monster/EntitySpider.patch b/nms-patches/net/minecraft/world/entity/monster/EntitySpider.patch index 4ba9a4b61..530bbaf31 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntitySpider.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntitySpider.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntitySpider.java +++ b/net/minecraft/world/entity/monster/EntitySpider.java -@@ -180,7 +180,7 @@ +@@ -182,7 +182,7 @@ MobEffectList mobeffectlist = entityspider_groupdataspider.effect; if (mobeffectlist != null) { diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityStrider.patch b/nms-patches/net/minecraft/world/entity/monster/EntityStrider.patch index 66789b531..53c7c3088 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityStrider.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityStrider.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityStrider.java +++ b/net/minecraft/world/entity/monster/EntityStrider.java -@@ -349,7 +349,14 @@ +@@ -351,7 +351,14 @@ boolean flag2 = flag1; diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityVex.patch b/nms-patches/net/minecraft/world/entity/monster/EntityVex.patch index d56a27fc7..b06e265fb 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityVex.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityVex.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityVex.java +++ b/net/minecraft/world/entity/monster/EntityVex.java -@@ -388,7 +388,7 @@ +@@ -393,7 +393,7 @@ @Override public void start() { diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityWitch.patch b/nms-patches/net/minecraft/world/entity/monster/EntityWitch.patch index e1ca8f1a9..27eff7ad4 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityWitch.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityWitch.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityWitch.java +++ b/net/minecraft/world/entity/monster/EntityWitch.java -@@ -132,7 +132,7 @@ +@@ -134,7 +134,7 @@ while (iterator.hasNext()) { MobEffect mobeffect = (MobEffect) iterator.next(); diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityZombie.patch b/nms-patches/net/minecraft/world/entity/monster/EntityZombie.patch index 6071fb1c4..1c62de83f 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityZombie.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityZombie.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/monster/EntityZombie.java +++ b/net/minecraft/world/entity/monster/EntityZombie.java -@@ -66,6 +66,15 @@ - import net.minecraft.world.level.block.Blocks; +@@ -67,6 +67,15 @@ import net.minecraft.world.level.block.state.IBlockData; + import org.joml.Vector3f; +// CraftBukkit start +import net.minecraft.server.MinecraftServer; @@ -16,7 +16,7 @@ public class EntityZombie extends EntityMonster { private static final UUID SPEED_MODIFIER_BABY_UUID = UUID.fromString("B9766B59-9566-4402-BC1F-2EE2A276D836"); -@@ -86,6 +95,7 @@ +@@ -87,6 +96,7 @@ private boolean canBreakDoors; private int inWaterTime; public int conversionTime; @@ -24,7 +24,7 @@ public EntityZombie(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -202,7 +212,10 @@ +@@ -203,7 +213,10 @@ public void tick() { if (!this.level().isClientSide && this.isAlive() && !this.isNoAi()) { if (this.isUnderWaterConverting()) { @@ -36,7 +36,7 @@ if (this.conversionTime < 0) { this.doUnderWaterConversion(); } -@@ -219,6 +232,7 @@ +@@ -220,6 +233,7 @@ } super.tick(); @@ -44,7 +44,7 @@ } @Override -@@ -251,6 +265,7 @@ +@@ -252,6 +266,7 @@ } public void startUnderWaterConversion(int i) { @@ -52,7 +52,7 @@ this.conversionTime = i; this.getEntityData().set(EntityZombie.DATA_DROWNED_CONVERSION_ID, true); } -@@ -264,11 +279,15 @@ +@@ -265,11 +280,15 @@ } protected void convertToZombieType(EntityTypes entitytypes) { @@ -69,7 +69,7 @@ } } -@@ -308,9 +327,9 @@ +@@ -309,9 +328,9 @@ if (SpawnerCreature.isSpawnPositionOk(entitypositiontypes_surface, this.level(), blockposition, entitytypes) && EntityPositionTypes.checkSpawnRules(entitytypes, worldserver, EnumMobSpawn.REINFORCEMENT, blockposition, this.level().random)) { entityzombie.setPos((double) i1, (double) j1, (double) k1); if (!this.level().hasNearbyAlivePlayer((double) i1, (double) j1, (double) k1, 7.0D) && this.level().isUnobstructed(entityzombie) && this.level().noCollision((Entity) entityzombie) && !this.level().containsAnyLiquid(entityzombie.getBoundingBox())) { @@ -81,7 +81,7 @@ this.getAttribute(GenericAttributes.SPAWN_REINFORCEMENTS_CHANCE).addPermanentModifier(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, AttributeModifier.Operation.ADDITION)); entityzombie.getAttribute(GenericAttributes.SPAWN_REINFORCEMENTS_CHANCE).addPermanentModifier(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, AttributeModifier.Operation.ADDITION)); break; -@@ -331,7 +350,14 @@ +@@ -332,7 +351,14 @@ float f = this.level().getCurrentDifficultyAt(this.blockPosition()).getEffectiveDifficulty(); if (this.getMainHandItem().isEmpty() && this.isOnFire() && this.random.nextFloat() < f * 0.3F) { @@ -97,7 +97,7 @@ } } -@@ -413,8 +439,17 @@ +@@ -414,8 +440,17 @@ if (worldserver.getDifficulty() != EnumDifficulty.HARD && this.random.nextBoolean()) { return flag; } @@ -116,7 +116,7 @@ if (entityzombievillager != null) { entityzombievillager.finalizeSpawn(worldserver, worldserver.getCurrentDifficultyAt(entityzombievillager.blockPosition()), EnumMobSpawn.CONVERSION, new EntityZombie.GroupDataZombie(false, true), (NBTTagCompound) null); -@@ -422,15 +457,17 @@ +@@ -423,15 +458,17 @@ entityzombievillager.setGossips((NBTBase) entityvillager.getGossips().store(DynamicOpsNBT.INSTANCE)); entityzombievillager.setTradeOffers(entityvillager.getOffers().createTag()); entityzombievillager.setVillagerXp(entityvillager.getVillagerXp()); @@ -139,7 +139,7 @@ } @Override -@@ -483,7 +520,7 @@ +@@ -484,7 +521,7 @@ entitychicken1.finalizeSpawn(worldaccess, difficultydamagescaler, EnumMobSpawn.JOCKEY, (GroupDataEntity) null, (NBTTagCompound) null); entitychicken1.setChickenJockey(true); this.startRiding(entitychicken1); diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityZombieHusk.patch b/nms-patches/net/minecraft/world/entity/monster/EntityZombieHusk.patch index dab22fcd4..f02083ca8 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityZombieHusk.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityZombieHusk.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EntityZombieHusk.java +++ b/net/minecraft/world/entity/monster/EntityZombieHusk.java -@@ -58,7 +58,7 @@ +@@ -60,7 +60,7 @@ if (flag && this.getMainHandItem().isEmpty() && entity instanceof EntityLiving) { float f = this.level().getCurrentDifficultyAt(this.blockPosition()).getEffectiveDifficulty(); diff --git a/nms-patches/net/minecraft/world/entity/monster/EntityZombieVillager.patch b/nms-patches/net/minecraft/world/entity/monster/EntityZombieVillager.patch index 61117d8bb..bfa1832ad 100644 --- a/nms-patches/net/minecraft/world/entity/monster/EntityZombieVillager.patch +++ b/nms-patches/net/minecraft/world/entity/monster/EntityZombieVillager.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/entity/monster/EntityZombieVillager.java +++ b/net/minecraft/world/entity/monster/EntityZombieVillager.java -@@ -47,6 +47,13 @@ - import net.minecraft.world.level.block.state.IBlockData; +@@ -50,6 +50,13 @@ + import org.joml.Vector3f; import org.slf4j.Logger; +// CraftBukkit start @@ -14,7 +14,7 @@ public class EntityZombieVillager extends EntityZombie implements VillagerDataHolder { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -64,6 +71,7 @@ +@@ -67,6 +74,7 @@ @Nullable private NBTTagCompound tradeOffers; private int villagerXp; @@ -22,7 +22,7 @@ public EntityZombieVillager(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -82,7 +90,7 @@ +@@ -85,7 +93,7 @@ @Override public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); @@ -31,7 +31,7 @@ Logger logger = EntityZombieVillager.LOGGER; Objects.requireNonNull(logger); -@@ -138,6 +146,10 @@ +@@ -141,6 +149,10 @@ public void tick() { if (!this.level().isClientSide && this.isAlive() && this.isConverting()) { int i = this.getConversionProgress(); @@ -42,7 +42,7 @@ this.villagerConversionTime -= i; if (this.villagerConversionTime <= 0) { -@@ -146,6 +158,7 @@ +@@ -149,6 +161,7 @@ } super.tick(); @@ -50,7 +50,7 @@ } @Override -@@ -189,8 +202,10 @@ +@@ -192,8 +205,10 @@ this.conversionStarter = uuid; this.villagerConversionTime = i; this.getEntityData().set(EntityZombieVillager.DATA_CONVERTING_ID, true); @@ -63,7 +63,7 @@ this.level().broadcastEntityEvent(this, (byte) 16); } -@@ -207,7 +222,13 @@ +@@ -210,7 +225,13 @@ } private void finishConversion(WorldServer worldserver) { @@ -78,7 +78,7 @@ EnumItemSlot[] aenumitemslot = EnumItemSlot.values(); int i = aenumitemslot.length; -@@ -222,7 +243,9 @@ +@@ -225,7 +246,9 @@ double d0 = (double) this.getEquipmentDropChance(enumitemslot); if (d0 > 1.0D) { @@ -88,7 +88,7 @@ } } } -@@ -249,7 +272,7 @@ +@@ -252,7 +275,7 @@ } } diff --git a/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglin.patch b/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglin.patch index 8418045ad..e52f9a28e 100644 --- a/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglin.patch +++ b/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglin.patch @@ -65,7 +65,7 @@ } @Override -@@ -365,7 +393,7 @@ +@@ -360,7 +388,7 @@ } protected void holdInOffHand(ItemStack itemstack) { @@ -74,7 +74,7 @@ this.setItemSlot(EnumItemSlot.OFFHAND, itemstack); this.setGuaranteedDrop(EnumItemSlot.OFFHAND); } else { -@@ -391,8 +419,8 @@ +@@ -386,8 +414,8 @@ if (EnchantmentManager.hasBindingCurse(itemstack1)) { return false; } else { @@ -85,7 +85,7 @@ return flag && !flag1 ? true : (!flag && flag1 ? false : (this.isAdult() && !itemstack.is(Items.CROSSBOW) && itemstack1.is(Items.CROSSBOW) ? false : super.canReplaceCurrentItem(itemstack, itemstack1))); } -@@ -421,7 +449,7 @@ +@@ -416,7 +444,7 @@ @Override protected SoundEffect getAmbientSound() { diff --git a/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglinAbstract.patch b/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglinAbstract.patch index 0ea9568fe..6c912b25f 100644 --- a/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglinAbstract.patch +++ b/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglinAbstract.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/piglin/EntityPiglinAbstract.java +++ b/net/minecraft/world/entity/monster/piglin/EntityPiglinAbstract.java -@@ -108,7 +108,7 @@ +@@ -115,7 +115,7 @@ } protected void finishConversion(WorldServer worldserver) { @@ -9,7 +9,7 @@ if (entitypigzombie != null) { entitypigzombie.addEffect(new MobEffect(MobEffects.CONFUSION, 200, 0)); -@@ -125,7 +125,7 @@ +@@ -132,7 +132,7 @@ @Nullable @Override public EntityLiving getTarget() { diff --git a/nms-patches/net/minecraft/world/entity/monster/warden/Warden.patch b/nms-patches/net/minecraft/world/entity/monster/warden/Warden.patch index 1591dcbed..a7771eacd 100644 --- a/nms-patches/net/minecraft/world/entity/monster/warden/Warden.patch +++ b/nms-patches/net/minecraft/world/entity/monster/warden/Warden.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java -@@ -371,7 +371,7 @@ +@@ -372,7 +372,7 @@ @Override public BehaviorController getBrain() { @@ -9,7 +9,7 @@ } @Override -@@ -412,13 +412,13 @@ +@@ -413,13 +413,13 @@ public static void applyDarknessAround(WorldServer worldserver, Vec3D vec3d, @Nullable Entity entity, int i) { MobEffect mobeffect = new MobEffect(MobEffects.DARKNESS, 260, 0, false, false); @@ -25,7 +25,7 @@ Logger logger = Warden.LOGGER; Objects.requireNonNull(logger); -@@ -443,7 +443,7 @@ +@@ -444,7 +444,7 @@ dataresult = AngerManagement.codec(this::canTargetEntity).parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.get("anger"))); logger = Warden.LOGGER; Objects.requireNonNull(logger); @@ -34,7 +34,7 @@ this.angerManagement = angermanagement; }); this.syncClientAngerLevel(); -@@ -453,7 +453,7 @@ +@@ -454,7 +454,7 @@ dataresult = VibrationSystem.a.CODEC.parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("listener"))); logger = Warden.LOGGER; Objects.requireNonNull(logger); @@ -43,7 +43,7 @@ this.vibrationData = vibrationsystem_a; }); } -@@ -487,7 +487,7 @@ +@@ -488,7 +488,7 @@ public void increaseAngerAt(@Nullable Entity entity, int i, boolean flag) { if (!this.isNoAi() && this.canTargetEntity(entity)) { WardenAi.setDigCooldown(this); @@ -52,7 +52,7 @@ int j = this.angerManagement.increaseAnger(entity, i); if (entity instanceof EntityHuman && flag1 && AngerLevel.byAnger(j).isAngry()) { -@@ -508,7 +508,7 @@ +@@ -509,7 +509,7 @@ @Nullable @Override public EntityLiving getTarget() { @@ -61,7 +61,7 @@ } @Override -@@ -551,7 +551,7 @@ +@@ -552,7 +552,7 @@ public void setAttackTarget(EntityLiving entityliving) { this.getBrain().eraseMemory(MemoryModuleType.ROAR_TARGET); diff --git a/nms-patches/net/minecraft/world/entity/npc/EntityVillager.patch b/nms-patches/net/minecraft/world/entity/npc/EntityVillager.patch index 5fe6a637c..9e8c71fa8 100644 --- a/nms-patches/net/minecraft/world/entity/npc/EntityVillager.patch +++ b/nms-patches/net/minecraft/world/entity/npc/EntityVillager.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/npc/EntityVillager.java +++ b/net/minecraft/world/entity/npc/EntityVillager.java -@@ -91,6 +91,14 @@ +@@ -92,6 +92,14 @@ import net.minecraft.world.phys.AxisAlignedBB; import org.slf4j.Logger; @@ -15,7 +15,7 @@ public class EntityVillager extends EntityVillagerAbstract implements ReputationHandler, VillagerDataHolder { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -149,7 +157,7 @@ +@@ -150,7 +158,7 @@ @Override public BehaviorController getBrain() { @@ -24,7 +24,7 @@ } @Override -@@ -232,7 +240,7 @@ +@@ -233,7 +241,7 @@ this.increaseProfessionLevelOnUpdate = false; } @@ -33,7 +33,7 @@ } } -@@ -360,7 +368,13 @@ +@@ -361,7 +369,13 @@ while (iterator.hasNext()) { MerchantRecipe merchantrecipe = (MerchantRecipe) iterator.next(); @@ -48,7 +48,7 @@ } this.resendOffersToTradingPlayer(); -@@ -429,7 +443,13 @@ +@@ -430,7 +444,13 @@ while (iterator.hasNext()) { MerchantRecipe merchantrecipe = (MerchantRecipe) iterator.next(); @@ -63,7 +63,7 @@ } } -@@ -489,7 +509,7 @@ +@@ -490,7 +510,7 @@ @Override public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); @@ -72,7 +72,7 @@ Logger logger = EntityVillager.LOGGER; Objects.requireNonNull(logger); -@@ -833,7 +853,12 @@ +@@ -834,7 +854,12 @@ } entitywitch.setPersistenceRequired(); @@ -86,16 +86,16 @@ this.releaseAllPois(); this.discard(); } else { -@@ -924,7 +949,7 @@ +@@ -933,7 +958,7 @@ }).limit(5L).collect(Collectors.toList()); if (list1.size() >= j) { -- if (SpawnUtil.trySpawnMob(EntityTypes.IRON_GOLEM, EnumMobSpawn.MOB_SUMMONED, worldserver, this.blockPosition(), 10, 8, 6, SpawnUtil.a.LEGACY_IRON_GOLEM).isPresent()) { -+ if (SpawnUtil.trySpawnMob(EntityTypes.IRON_GOLEM, EnumMobSpawn.MOB_SUMMONED, worldserver, this.blockPosition(), 10, 8, 6, SpawnUtil.a.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE).isPresent()) { // CraftBukkit +- if (!SpawnUtil.trySpawnMob(EntityTypes.IRON_GOLEM, EnumMobSpawn.MOB_SUMMONED, worldserver, this.blockPosition(), 10, 8, 6, SpawnUtil.a.LEGACY_IRON_GOLEM).isEmpty()) { ++ if (!SpawnUtil.trySpawnMob(EntityTypes.IRON_GOLEM, EnumMobSpawn.MOB_SUMMONED, worldserver, this.blockPosition(), 10, 8, 6, SpawnUtil.a.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE).isEmpty()) { // CraftBukkit list.forEach(SensorGolemLastSeen::golemDetected); } } -@@ -981,7 +1006,7 @@ +@@ -990,7 +1015,7 @@ @Override public void startSleeping(BlockPosition blockposition) { super.startSleeping(blockposition); @@ -104,7 +104,7 @@ this.brain.eraseMemory(MemoryModuleType.WALK_TARGET); this.brain.eraseMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE); } -@@ -989,7 +1014,7 @@ +@@ -998,7 +1023,7 @@ @Override public void stopSleeping() { super.stopSleeping(); diff --git a/nms-patches/net/minecraft/world/entity/npc/EntityVillagerAbstract.patch b/nms-patches/net/minecraft/world/entity/npc/EntityVillagerAbstract.patch index b9dc5cb26..d6c61da36 100644 --- a/nms-patches/net/minecraft/world/entity/npc/EntityVillagerAbstract.patch +++ b/nms-patches/net/minecraft/world/entity/npc/EntityVillagerAbstract.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/npc/EntityVillagerAbstract.java +++ b/net/minecraft/world/entity/npc/EntityVillagerAbstract.java -@@ -36,8 +36,24 @@ +@@ -35,8 +35,24 @@ import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.phys.Vec3D; @@ -25,7 +25,7 @@ private static final DataWatcherObject DATA_UNHAPPY_COUNTER = DataWatcher.defineId(EntityVillagerAbstract.class, DataWatcherRegistry.INT); public static final int VILLAGER_SLOT_OFFSET = 300; private static final int VILLAGER_INVENTORY_SIZE = 8; -@@ -45,7 +61,7 @@ +@@ -44,7 +60,7 @@ private EntityHuman tradingPlayer; @Nullable protected MerchantRecipeList offers; @@ -34,8 +34,8 @@ public EntityVillagerAbstract(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -247,7 +263,16 @@ - MerchantRecipe merchantrecipe = villagertrades_imerchantrecipeoption.getOffer(this, this.random); +@@ -233,7 +249,16 @@ + MerchantRecipe merchantrecipe = ((VillagerTrades.IMerchantRecipeOption) arraylist.remove(this.random.nextInt(arraylist.size()))).getOffer(this, this.random); if (merchantrecipe != null) { - merchantrecipelist.add(merchantrecipe); @@ -49,6 +49,6 @@ + merchantrecipelist.add(CraftMerchantRecipe.fromBukkit(event.getRecipe()).toMinecraft()); + } + // CraftBukkit end + ++j; } } - diff --git a/nms-patches/net/minecraft/world/entity/npc/EntityVillagerTrader.patch b/nms-patches/net/minecraft/world/entity/npc/EntityVillagerTrader.patch index a3be4da98..13fa1f829 100644 --- a/nms-patches/net/minecraft/world/entity/npc/EntityVillagerTrader.patch +++ b/nms-patches/net/minecraft/world/entity/npc/EntityVillagerTrader.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/npc/EntityVillagerTrader.java +++ b/net/minecraft/world/entity/npc/EntityVillagerTrader.java -@@ -44,6 +44,13 @@ - import net.minecraft.world.level.World; +@@ -47,6 +47,13 @@ import net.minecraft.world.phys.Vec3D; + import org.apache.commons.lang3.tuple.Pair; +// CraftBukkit start +import org.bukkit.Bukkit; @@ -14,7 +14,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract { private static final int NUMBER_OF_TRADE_OFFERS = 5; -@@ -53,6 +60,7 @@ +@@ -56,6 +63,7 @@ public EntityVillagerTrader(EntityTypes entitytypes, World world) { super(entitytypes, world); @@ -22,21 +22,21 @@ } @Override -@@ -130,7 +138,16 @@ - MerchantRecipe merchantrecipe = villagertrades_imerchantrecipeoption.getOffer(this, this.random); +@@ -136,7 +144,16 @@ + MerchantRecipe merchantrecipe = villagertrades_imerchantrecipeoption.getOffer(this, this.random); + + if (merchantrecipe != null) { +- merchantrecipelist.add(merchantrecipe); ++ // CraftBukkit start ++ VillagerAcquireTradeEvent event = new VillagerAcquireTradeEvent((AbstractVillager) getBukkitEntity(), merchantrecipe.asBukkit()); ++ // Suppress during worldgen ++ if (this.valid) { ++ Bukkit.getPluginManager().callEvent(event); ++ } ++ if (!event.isCancelled()) { ++ merchantrecipelist.add(CraftMerchantRecipe.fromBukkit(event.getRecipe()).toMinecraft()); ++ } ++ // CraftBukkit end + } - if (merchantrecipe != null) { -- merchantrecipelist.add(merchantrecipe); -+ // CraftBukkit start -+ VillagerAcquireTradeEvent event = new VillagerAcquireTradeEvent((AbstractVillager) getBukkitEntity(), merchantrecipe.asBukkit()); -+ // Suppress during worldgen -+ if (this.valid) { -+ Bukkit.getPluginManager().callEvent(event); -+ } -+ if (!event.isCancelled()) { -+ merchantrecipelist.add(CraftMerchantRecipe.fromBukkit(event.getRecipe()).toMinecraft()); -+ } -+ // CraftBukkit end } - - } diff --git a/nms-patches/net/minecraft/world/entity/player/EntityHuman.patch b/nms-patches/net/minecraft/world/entity/player/EntityHuman.patch index 84c487028..0c8f20ac9 100644 --- a/nms-patches/net/minecraft/world/entity/player/EntityHuman.patch +++ b/nms-patches/net/minecraft/world/entity/player/EntityHuman.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/player/EntityHuman.java +++ b/net/minecraft/world/entity/player/EntityHuman.java -@@ -118,6 +118,20 @@ +@@ -117,6 +117,20 @@ import net.minecraft.world.scores.ScoreboardTeamBase; import org.slf4j.Logger; @@ -21,7 +21,7 @@ public abstract class EntityHuman extends EntityLiving { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -131,7 +145,8 @@ +@@ -132,7 +146,8 @@ public static final float SWIMMING_BB_HEIGHT = 0.6F; public static final float DEFAULT_EYE_HEIGHT = 1.62F; public static final EntitySize STANDING_DIMENSIONS = EntitySize.scalable(0.6F, 1.8F); @@ -31,7 +31,7 @@ private static final int FLY_ACHIEVEMENT_SPEED = 25; private static final DataWatcherObject DATA_PLAYER_ABSORPTION_ID = DataWatcher.defineId(EntityHuman.class, DataWatcherRegistry.FLOAT); private static final DataWatcherObject DATA_SCORE_ID = DataWatcher.defineId(EntityHuman.class, DataWatcherRegistry.INT); -@@ -141,10 +156,10 @@ +@@ -142,10 +157,10 @@ protected static final DataWatcherObject DATA_SHOULDER_RIGHT = DataWatcher.defineId(EntityHuman.class, DataWatcherRegistry.COMPOUND_TAG); private long timeEntitySatOnShoulder; private final PlayerInventory inventory = new PlayerInventory(this); @@ -44,7 +44,7 @@ protected int jumpTriggerTime; public float oBob; public float bob; -@@ -173,6 +188,16 @@ +@@ -174,6 +189,16 @@ public EntityFishingHook fishing; protected float hurtDir; @@ -61,7 +61,7 @@ public EntityHuman(World world, BlockPosition blockposition, float f, GameProfile gameprofile) { super(EntityTypes.PLAYER, world); this.lastItemInMainHand = ItemStack.EMPTY; -@@ -312,7 +337,7 @@ +@@ -313,7 +338,7 @@ ItemStack itemstack = this.getItemBySlot(EnumItemSlot.HEAD); if (itemstack.is(Items.TURTLE_HELMET) && !this.isEyeInFluid(TagsFluid.WATER)) { @@ -70,7 +70,7 @@ } } -@@ -478,8 +503,14 @@ +@@ -483,8 +508,14 @@ public void rideTick() { if (!this.level().isClientSide && this.wantsToStopRiding() && this.isPassenger()) { this.stopRiding(); @@ -87,7 +87,7 @@ double d0 = this.getX(); double d1 = this.getY(); double d2 = this.getZ(); -@@ -506,7 +537,8 @@ +@@ -511,7 +542,8 @@ if (this.level().getDifficulty() == EnumDifficulty.PEACEFUL && this.level().getGameRules().getBoolean(GameRules.RULE_NATURAL_REGENERATION)) { if (this.getHealth() < this.getMaxHealth() && this.tickCount % 20 == 0) { @@ -97,7 +97,7 @@ } if (this.foodData.needsFood() && this.tickCount % 10 == 0) { -@@ -665,6 +697,13 @@ +@@ -671,6 +703,13 @@ @Nullable public EntityItem drop(ItemStack itemstack, boolean flag, boolean flag1) { @@ -111,7 +111,7 @@ if (itemstack.isEmpty()) { return null; } else { -@@ -699,6 +738,33 @@ +@@ -705,6 +744,33 @@ entityitem.setDeltaMovement((double) (-f3 * f2 * 0.3F) + Math.cos((double) f5) * (double) f6, (double) (-f1 * 0.3F + 0.1F + (this.random.nextFloat() - this.random.nextFloat()) * 0.1F), (double) (f4 * f2 * 0.3F) + Math.sin((double) f5) * (double) f6); } @@ -145,7 +145,7 @@ return entityitem; } } -@@ -789,7 +855,7 @@ +@@ -795,7 +861,7 @@ } if (nbttagcompound.contains("LastDeathLocation", 10)) { @@ -154,7 +154,7 @@ Logger logger = EntityHuman.LOGGER; Objects.requireNonNull(logger); -@@ -822,7 +888,7 @@ +@@ -828,7 +894,7 @@ } this.getLastDeathLocation().flatMap((globalpos) -> { @@ -163,7 +163,7 @@ Logger logger = EntityHuman.LOGGER; Objects.requireNonNull(logger); -@@ -849,12 +915,12 @@ +@@ -855,12 +921,12 @@ return false; } else { if (!this.level().isClientSide) { @@ -178,7 +178,7 @@ } if (this.level().getDifficulty() == EnumDifficulty.EASY) { -@@ -866,7 +932,13 @@ +@@ -872,7 +938,13 @@ } } @@ -193,7 +193,7 @@ } } } -@@ -886,10 +958,29 @@ +@@ -892,10 +964,29 @@ } public boolean canHarmPlayer(EntityHuman entityhuman) { @@ -226,7 +226,7 @@ } @Override -@@ -931,8 +1022,13 @@ +@@ -937,8 +1028,13 @@ } } @@ -241,7 +241,7 @@ if (!this.isInvulnerableTo(damagesource)) { f = this.getDamageAfterArmorAbsorb(damagesource, f); f = this.getDamageAfterMagicAbsorb(damagesource, f); -@@ -947,7 +1043,7 @@ +@@ -953,7 +1049,7 @@ } if (f != 0.0F) { @@ -250,7 +250,7 @@ this.getCombatTracker().recordDamage(damagesource, f); this.setHealth(this.getHealth() - f); if (f < 3.4028235E37F) { -@@ -957,6 +1053,7 @@ +@@ -963,6 +1059,7 @@ this.gameEvent(GameEvent.ENTITY_DAMAGE); } } @@ -258,7 +258,7 @@ } @Override -@@ -1121,7 +1218,7 @@ +@@ -1127,7 +1224,7 @@ f *= 0.2F + f2 * f2 * 0.8F; f1 *= f2; @@ -267,7 +267,7 @@ if (f > 0.0F || f1 > 0.0F) { boolean flag = f2 > 0.9F; boolean flag1 = false; -@@ -1160,8 +1257,15 @@ +@@ -1166,8 +1263,15 @@ if (entity instanceof EntityLiving) { f3 = ((EntityLiving) entity).getHealth(); if (j > 0 && !entity.isOnFire()) { @@ -285,7 +285,7 @@ } } -@@ -1189,8 +1293,11 @@ +@@ -1195,8 +1299,11 @@ EntityLiving entityliving = (EntityLiving) iterator.next(); if (entityliving != this && entityliving != entity && !this.isAlliedTo((Entity) entityliving) && (!(entityliving instanceof EntityArmorStand) || !((EntityArmorStand) entityliving).isMarker()) && this.distanceToSqr((Entity) entityliving) < 9.0D) { @@ -298,7 +298,7 @@ } } -@@ -1199,9 +1306,26 @@ +@@ -1205,9 +1312,26 @@ } if (entity instanceof EntityPlayer && entity.hurtMarked) { @@ -325,7 +325,7 @@ } if (flag2) { -@@ -1246,7 +1370,14 @@ +@@ -1252,7 +1376,14 @@ this.awardStat(StatisticList.DAMAGE_DEALT, Math.round(f5 * 10.0F)); if (j > 0) { @@ -341,7 +341,7 @@ } if (this.level() instanceof WorldServer && f5 > 2.0F) { -@@ -1256,12 +1387,17 @@ +@@ -1262,12 +1393,17 @@ } } @@ -360,7 +360,7 @@ } } -@@ -1338,6 +1474,12 @@ +@@ -1344,6 +1480,12 @@ } public Either startSleepInBed(BlockPosition blockposition) { @@ -373,7 +373,7 @@ this.startSleeping(blockposition); this.sleepCounter = 0; return Either.right(Unit.INSTANCE); -@@ -1425,9 +1567,9 @@ +@@ -1431,9 +1573,9 @@ super.jumpFromGround(); this.awardStat(StatisticList.JUMP); if (this.isSprinting()) { @@ -385,7 +385,7 @@ } } -@@ -1457,7 +1599,11 @@ +@@ -1463,7 +1605,11 @@ this.setDeltaMovement(vec3d2.x, d3 * 0.6D, vec3d2.z); this.resetFallDistance(); @@ -398,7 +398,7 @@ } else { super.travel(vec3d); } -@@ -1492,19 +1638,19 @@ +@@ -1498,19 +1644,19 @@ i = Math.round((float) Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2) * 100.0F); if (i > 0) { this.awardStat(StatisticList.SWIM_ONE_CM, i); @@ -421,7 +421,7 @@ } } else if (this.onClimbable()) { if (d1 > 0.0D) { -@@ -1515,13 +1661,13 @@ +@@ -1521,13 +1667,13 @@ if (i > 0) { if (this.isSprinting()) { this.awardStat(StatisticList.SPRINT_ONE_CM, i); @@ -438,7 +438,7 @@ } } } else if (this.isFallFlying()) { -@@ -1587,12 +1733,24 @@ +@@ -1593,12 +1739,24 @@ } public void startFallFlying() { @@ -464,7 +464,7 @@ } @Override -@@ -1706,10 +1864,21 @@ +@@ -1712,10 +1870,21 @@ return this.experienceLevel >= 30 ? 112 + (this.experienceLevel - 30) * 9 : (this.experienceLevel >= 15 ? 37 + (this.experienceLevel - 15) * 5 : 7 + this.experienceLevel * 2); } @@ -487,7 +487,7 @@ } } -@@ -1795,13 +1964,20 @@ +@@ -1801,13 +1970,20 @@ @Override public void setItemSlot(EnumItemSlot enumitemslot, ItemStack itemstack) { @@ -511,7 +511,7 @@ } } -@@ -1840,26 +2016,31 @@ +@@ -1846,26 +2022,31 @@ protected void removeEntitiesOnShoulder() { if (this.timeEntitySatOnShoulder + 20L < this.level().getGameTime()) { diff --git a/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch b/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch index 6bd5ea762..aa4c19d80 100644 --- a/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch +++ b/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/EntityEnderPearl.java +++ b/net/minecraft/world/entity/projectile/EntityEnderPearl.java -@@ -16,6 +16,13 @@ +@@ -15,6 +15,13 @@ import net.minecraft.world.phys.MovingObjectPosition; import net.minecraft.world.phys.MovingObjectPositionEntity; @@ -14,7 +14,7 @@ public class EntityEnderPearl extends EntityProjectileThrowable { public EntityEnderPearl(EntityTypes entitytypes, World world) { -@@ -52,23 +59,36 @@ +@@ -51,23 +58,36 @@ EntityPlayer entityplayer = (EntityPlayer) entity; if (entityplayer.connection.isAcceptingMessages() && entityplayer.level() == this.level() && !entityplayer.isSleeping()) { @@ -64,7 +64,7 @@ } } else if (entity != null) { entity.teleportTo(this.getX(), this.getY(), this.getZ()); -@@ -97,7 +117,7 @@ +@@ -96,7 +116,7 @@ public Entity changeDimension(WorldServer worldserver) { Entity entity = this.getOwner(); diff --git a/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch b/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch index fee8b35c8..2f4e54633 100644 --- a/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch +++ b/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/EntityPotion.java +++ b/net/minecraft/world/entity/projectile/EntityPotion.java -@@ -31,6 +31,16 @@ +@@ -31,6 +31,17 @@ import net.minecraft.world.phys.MovingObjectPositionBlock; import net.minecraft.world.phys.MovingObjectPositionEntity; @@ -8,6 +8,7 @@ +import java.util.HashMap; +import java.util.Map; +import net.minecraft.server.level.EntityPlayer; ++import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.level.block.Blocks; +import org.bukkit.craftbukkit.entity.CraftLivingEntity; +import org.bukkit.craftbukkit.event.CraftEventFactory; @@ -17,7 +18,7 @@ public class EntityPotion extends EntityProjectileThrowable implements ItemSupplier { public static final double SPLASH_RANGE = 4.0D; -@@ -99,7 +109,7 @@ +@@ -99,7 +110,7 @@ if (flag) { this.applyWater(); @@ -26,7 +27,7 @@ if (this.isLingering()) { this.makeAreaOfEffectCloud(itemstack, potionregistry); } else { -@@ -148,6 +158,7 @@ +@@ -148,6 +159,7 @@ private void applySplash(List list, @Nullable Entity entity) { AxisAlignedBB axisalignedbb = this.getBoundingBox().inflate(4.0D, 2.0D, 4.0D); List list1 = this.level().getEntitiesOfClass(EntityLiving.class, axisalignedbb); @@ -34,7 +35,7 @@ if (!list1.isEmpty()) { Entity entity1 = this.getEffectSource(); -@@ -168,24 +179,50 @@ +@@ -168,24 +180,49 @@ d1 = 1.0D - Math.sqrt(d0) / 4.0D; } @@ -65,9 +66,8 @@ + MobEffectList mobeffectlist = mobeffect.getEffect(); + // CraftBukkit start - Abide by PVP settings - for players only! + if (!this.level().pvpMode && this.getOwner() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getOwner()) { -+ int i = MobEffectList.getId(mobeffectlist); -+ // Block SLOWER_MOVEMENT, SLOWER_DIG, HARM, BLINDNESS, HUNGER, WEAKNESS and POISON potions -+ if (i == 2 || i == 4 || i == 7 || i == 15 || i == 17 || i == 18 || i == 19) { ++ if (mobeffectlist == MobEffects.MOVEMENT_SLOWDOWN || mobeffectlist == MobEffects.DIG_SLOWDOWN || mobeffectlist == MobEffects.HARM || mobeffectlist == MobEffects.BLINDNESS ++ || mobeffectlist == MobEffects.HUNGER || mobeffectlist == MobEffects.WEAKNESS || mobeffectlist == MobEffects.POISON) { + continue; + } + } @@ -122,10 +122,10 @@ IBlockData iblockdata = this.level().getBlockState(blockposition); if (iblockdata.is(TagsBlock.FIRE)) { -- this.level().removeBlock(blockposition, false); +- this.level().destroyBlock(blockposition, false, this); + // CraftBukkit start + if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, Blocks.AIR.defaultBlockState())) { -+ this.level().removeBlock(blockposition, false); ++ this.level().destroyBlock(blockposition, false, this); + } + // CraftBukkit end } else if (AbstractCandleBlock.isLit(iblockdata)) { diff --git a/nms-patches/net/minecraft/world/entity/projectile/EntityTippedArrow.patch b/nms-patches/net/minecraft/world/entity/projectile/EntityTippedArrow.patch index d5fbf3a61..705d5e7ed 100644 --- a/nms-patches/net/minecraft/world/entity/projectile/EntityTippedArrow.patch +++ b/nms-patches/net/minecraft/world/entity/projectile/EntityTippedArrow.patch @@ -1,23 +1,5 @@ --- a/net/minecraft/world/entity/projectile/EntityTippedArrow.java +++ b/net/minecraft/world/entity/projectile/EntityTippedArrow.java -@@ -28,7 +28,7 @@ - private static final int NO_EFFECT_COLOR = -1; - private static final DataWatcherObject ID_EFFECT_COLOR = DataWatcher.defineId(EntityTippedArrow.class, DataWatcherRegistry.INT); - private static final byte EVENT_POTION_PUFF = 0; -- private PotionRegistry potion; -+ public PotionRegistry potion; // CraftBukkit private -> public - public final Set effects; - private boolean fixedColor; - -@@ -86,7 +86,7 @@ - return nbttagcompound != null && nbttagcompound.contains("CustomPotionColor", 99) ? nbttagcompound.getInt("CustomPotionColor") : -1; - } - -- private void updateColor() { -+ public void updateColor() { // CraftBukkit private -> public - this.fixedColor = false; - if (this.potion == Potions.EMPTY && this.effects.isEmpty()) { - this.entityData.set(EntityTippedArrow.ID_EFFECT_COLOR, -1); @@ -212,7 +212,7 @@ mobeffect = (MobEffect) iterator.next(); entityliving.addEffect(new MobEffect(mobeffect.getEffect(), Math.max(mobeffect.mapDuration((i) -> { diff --git a/nms-patches/net/minecraft/world/entity/raid/PersistentRaid.patch b/nms-patches/net/minecraft/world/entity/raid/PersistentRaid.patch index 3dffec07e..72213d9b1 100644 --- a/nms-patches/net/minecraft/world/entity/raid/PersistentRaid.patch +++ b/nms-patches/net/minecraft/world/entity/raid/PersistentRaid.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/raid/PersistentRaid.java +++ b/net/minecraft/world/entity/raid/PersistentRaid.java -@@ -112,19 +112,33 @@ +@@ -121,19 +121,33 @@ boolean flag = false; if (!raid.isStarted()) { diff --git a/nms-patches/net/minecraft/world/entity/raid/Raid.patch b/nms-patches/net/minecraft/world/entity/raid/Raid.patch index 07dd23d35..c44497a2f 100644 --- a/nms-patches/net/minecraft/world/entity/raid/Raid.patch +++ b/nms-patches/net/minecraft/world/entity/raid/Raid.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/raid/Raid.java +++ b/net/minecraft/world/entity/raid/Raid.java -@@ -174,6 +174,12 @@ +@@ -176,6 +176,12 @@ return this.status == Raid.Status.LOSS; } @@ -13,7 +13,7 @@ public float getTotalHealth() { return this.totalHealth; } -@@ -270,6 +276,7 @@ +@@ -272,6 +278,7 @@ this.active = this.level.hasChunkAt(this.center); if (this.level.getDifficulty() == EnumDifficulty.PEACEFUL) { @@ -21,7 +21,7 @@ this.stop(); return; } -@@ -289,13 +296,16 @@ +@@ -291,13 +298,16 @@ if (!this.level.isVillage(this.center)) { if (this.groupsSpawned > 0) { this.status = Raid.Status.LOSS; @@ -38,7 +38,7 @@ this.stop(); return; } -@@ -369,6 +379,7 @@ +@@ -371,6 +381,7 @@ } if (j > 3) { @@ -46,7 +46,7 @@ this.stop(); break; } -@@ -381,6 +392,7 @@ +@@ -383,6 +394,7 @@ this.status = Raid.Status.VICTORY; Iterator iterator = this.heroesOfTheVillage.iterator(); @@ -54,11 +54,12 @@ while (iterator.hasNext()) { UUID uuid = (UUID) iterator.next(); Entity entity = this.level.getEntity(uuid); -@@ -394,9 +406,11 @@ +@@ -397,10 +409,12 @@ - entityplayer.awardStat(StatisticList.RAID_WIN); - CriterionTriggers.RAID_WIN.trigger(entityplayer); -+ winners.add(entityplayer.getBukkitEntity()); // CraftBukkit + entityplayer.awardStat(StatisticList.RAID_WIN); + CriterionTriggers.RAID_WIN.trigger(entityplayer); ++ winners.add(entityplayer.getBukkitEntity()); // CraftBukkit + } } } } @@ -66,7 +67,7 @@ } } -@@ -404,6 +418,7 @@ +@@ -408,6 +422,7 @@ } else if (this.isOver()) { ++this.celebrationTicks; if (this.celebrationTicks >= 600) { @@ -74,7 +75,7 @@ this.stop(); return; } -@@ -540,6 +555,10 @@ +@@ -544,6 +559,10 @@ int j = araid_wave.length; int k = 0; @@ -85,7 +86,7 @@ while (k < j) { Raid.Wave raid_wave = araid_wave[k]; int l = this.getDefaultNumSpawns(raid_wave, i, flag1) + this.getPotentialBonusSpawns(raid_wave, this.random, i, difficultydamagescaler, flag1); -@@ -555,9 +574,11 @@ +@@ -559,9 +578,11 @@ entityraider.setPatrolLeader(true); this.setLeader(i, entityraider); flag = true; @@ -97,7 +98,7 @@ if (raid_wave.entityType == EntityTypes.RAVAGER) { EntityRaider entityraider1 = null; -@@ -576,6 +597,7 @@ +@@ -580,6 +601,7 @@ this.joinRaid(i, entityraider1, blockposition, false); entityraider1.moveTo(blockposition, 0.0F, 0.0F); entityraider1.startRiding(entityraider); @@ -105,7 +106,7 @@ } } -@@ -593,6 +615,7 @@ +@@ -597,6 +619,7 @@ ++this.groupsSpawned; this.updateBossbar(); this.setDirty(); @@ -113,7 +114,7 @@ } public void joinRaid(int i, EntityRaider entityraider, @Nullable BlockPosition blockposition, boolean flag) { -@@ -608,7 +631,7 @@ +@@ -612,7 +635,7 @@ entityraider.finalizeSpawn(this.level, this.level.getCurrentDifficultyAt(blockposition), EnumMobSpawn.EVENT, (GroupDataEntity) null, (NBTTagCompound) null); entityraider.applyRaidBuffs(i, false); entityraider.setOnGround(true); @@ -122,7 +123,7 @@ } } -@@ -858,6 +881,12 @@ +@@ -862,6 +885,12 @@ this.heroesOfTheVillage.add(entity.getUUID()); } diff --git a/nms-patches/net/minecraft/world/entity/vehicle/EntityBoat.patch b/nms-patches/net/minecraft/world/entity/vehicle/EntityBoat.patch index 06995eb69..dab649250 100644 --- a/nms-patches/net/minecraft/world/entity/vehicle/EntityBoat.patch +++ b/nms-patches/net/minecraft/world/entity/vehicle/EntityBoat.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/vehicle/EntityBoat.java +++ b/net/minecraft/world/entity/vehicle/EntityBoat.java -@@ -53,6 +53,16 @@ - import net.minecraft.world.phys.shapes.VoxelShape; +@@ -55,6 +55,16 @@ import net.minecraft.world.phys.shapes.VoxelShapes; + import org.joml.Vector3f; +// CraftBukkit start +import org.bukkit.Location; @@ -17,7 +17,7 @@ public class EntityBoat extends Entity implements VariantHolder { private static final DataWatcherObject DATA_ID_HURT = DataWatcher.defineId(EntityBoat.class, DataWatcherRegistry.INT); -@@ -93,6 +103,14 @@ +@@ -95,6 +105,14 @@ private float bubbleAngle; private float bubbleAngleO; @@ -32,7 +32,7 @@ public EntityBoat(EntityTypes entitytypes, World world) { super(entitytypes, world); this.paddlePositions = new float[2]; -@@ -162,6 +180,19 @@ +@@ -180,6 +198,19 @@ if (this.isInvulnerableTo(damagesource)) { return false; } else if (!this.level().isClientSide && !this.isRemoved()) { @@ -52,7 +52,7 @@ this.setHurtDir(-this.getHurtDir()); this.setHurtTime(10); this.setDamage(this.getDamage() + f * 10.0F); -@@ -170,6 +201,15 @@ +@@ -188,6 +219,15 @@ boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).getAbilities().instabuild; if (flag || this.getDamage() > 40.0F) { @@ -68,7 +68,7 @@ if (!flag && this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { this.destroy(damagesource); } -@@ -209,9 +249,29 @@ +@@ -227,9 +267,29 @@ public void push(Entity entity) { if (entity instanceof EntityBoat) { if (entity.getBoundingBox().minY < this.getBoundingBox().maxY) { @@ -98,7 +98,7 @@ super.push(entity); } -@@ -279,6 +339,7 @@ +@@ -322,6 +382,7 @@ return this.getDirection().getClockWise(); } @@ -106,7 +106,7 @@ @Override public void tick() { this.oldStatus = this.status; -@@ -319,6 +380,22 @@ +@@ -362,6 +423,22 @@ this.setDeltaMovement(Vec3D.ZERO); } @@ -129,7 +129,7 @@ this.tickBubbleColumn(); for (int i = 0; i <= 1; ++i) { -@@ -830,6 +907,11 @@ +@@ -845,6 +922,11 @@ this.causeFallDamage(this.fallDistance, 1.0F, this.damageSources().fall()); if (!this.level().isClientSide && !this.isRemoved()) { @@ -141,7 +141,7 @@ this.kill(); if (this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { int i; -@@ -843,6 +925,7 @@ +@@ -858,6 +940,7 @@ } } } diff --git a/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.patch b/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.patch index da6cba53a..bbb44bb99 100644 --- a/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.patch +++ b/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.java +++ b/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.java -@@ -47,6 +47,16 @@ - import net.minecraft.world.phys.AxisAlignedBB; +@@ -50,6 +50,16 @@ import net.minecraft.world.phys.Vec3D; + import org.joml.Vector3f; +// CraftBukkit start +import org.bukkit.Location; @@ -16,10 +16,10 @@ + public abstract class EntityMinecartAbstract extends Entity { - private static final DataWatcherObject DATA_ID_HURT = DataWatcher.defineId(EntityMinecartAbstract.class, DataWatcherRegistry.INT); -@@ -90,6 +100,17 @@ - private double lyd; - private double lzd; + private static final float LOWERED_PASSENGER_ATTACHMENT_Y = 0.0F; +@@ -93,6 +103,17 @@ + enummap.put(BlockPropertyTrackPosition.NORTH_EAST, Pair.of(baseblockposition2, baseblockposition1)); + }); + // CraftBukkit start + public boolean slowWhenEmpty = true; @@ -34,8 +34,8 @@ + protected EntityMinecartAbstract(EntityTypes entitytypes, World world) { super(entitytypes, world); - this.blocksBuilding = true; -@@ -216,6 +237,19 @@ + this.targetDeltaMovement = Vec3D.ZERO; +@@ -222,6 +243,19 @@ if (this.isInvulnerableTo(damagesource)) { return false; } else { @@ -55,7 +55,7 @@ this.setHurtDir(-this.getHurtDir()); this.setHurtTime(10); this.markHurt(); -@@ -224,6 +258,15 @@ +@@ -230,6 +264,15 @@ boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).getAbilities().instabuild; if (flag || this.getDamage() > 40.0F) { @@ -71,7 +71,7 @@ this.ejectPassengers(); if (flag && !this.hasCustomName()) { this.discard(); -@@ -285,6 +328,14 @@ +@@ -291,6 +334,14 @@ @Override public void tick() { @@ -86,16 +86,16 @@ if (this.getHurtTime() > 0) { this.setHurtTime(this.getHurtTime() - 1); } -@@ -294,7 +345,7 @@ +@@ -300,7 +351,7 @@ } this.checkBelowWorld(); - this.handleNetherPortal(); + // this.handleNetherPortal(); // CraftBukkit - handled in postTick - double d0; - if (this.level().isClientSide) { -@@ -361,6 +412,18 @@ + if (this.lerpSteps > 0) { + this.lerpPositionAndRotationStep(this.lerpSteps, this.lerpX, this.lerpY, this.lerpZ, this.lerpYRot, this.lerpXRot); +@@ -358,6 +409,18 @@ } this.setRot(this.getYRot(), this.getXRot()); @@ -114,8 +114,8 @@ if (this.getMinecartType() == EntityMinecartAbstract.EnumMinecartType.RIDEABLE && this.getDeltaMovement().horizontalDistanceSqr() > 0.01D) { List list = this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), IEntitySelector.pushableBy(this)); -@@ -369,8 +432,26 @@ - Entity entity = (Entity) list.get(l); +@@ -368,8 +431,26 @@ + Entity entity = (Entity) iterator.next(); if (!(entity instanceof EntityHuman) && !(entity instanceof EntityIronGolem) && !(entity instanceof EntityMinecartAbstract) && !this.isVehicle() && !entity.isPassenger()) { + // CraftBukkit start @@ -141,8 +141,8 @@ entity.push(this); } } -@@ -382,6 +463,14 @@ - Entity entity1 = (Entity) iterator.next(); +@@ -381,6 +462,14 @@ + Entity entity1 = (Entity) iterator1.next(); if (!this.hasPassenger(entity1) && entity1.isPushable() && entity1 instanceof EntityMinecartAbstract) { + // CraftBukkit start @@ -156,7 +156,7 @@ entity1.push(this); } } -@@ -398,7 +487,7 @@ +@@ -397,7 +486,7 @@ } protected double getMaxSpeed() { @@ -165,7 +165,7 @@ } public void activateMinecart(int i, int j, int k, boolean flag) {} -@@ -409,12 +498,16 @@ +@@ -408,12 +497,16 @@ this.setDeltaMovement(MathHelper.clamp(vec3d.x, -d0, d0), vec3d.y, MathHelper.clamp(vec3d.z, -d0, d0)); if (this.onGround()) { @@ -184,7 +184,7 @@ } } -@@ -610,7 +703,7 @@ +@@ -609,7 +702,7 @@ } protected void applyNaturalSlowdown() { @@ -193,7 +193,7 @@ Vec3D vec3d = this.getDeltaMovement(); vec3d = vec3d.multiply(d0, 0.0D, d0); -@@ -749,6 +842,14 @@ +@@ -748,6 +841,14 @@ if (!this.level().isClientSide) { if (!entity.noPhysics && !this.noPhysics) { if (!this.hasPassenger(entity)) { @@ -208,7 +208,7 @@ double d0 = entity.getX() - this.getX(); double d1 = entity.getZ() - this.getZ(); double d2 = d0 * d0 + d1 * d1; -@@ -923,4 +1024,26 @@ +@@ -945,4 +1046,26 @@ private EnumMinecartType() {} } diff --git a/nms-patches/net/minecraft/world/inventory/Container.patch b/nms-patches/net/minecraft/world/inventory/Container.patch index 2e1cc660a..8a0c7c479 100644 --- a/nms-patches/net/minecraft/world/inventory/Container.patch +++ b/nms-patches/net/minecraft/world/inventory/Container.patch @@ -179,7 +179,7 @@ } } -@@ -830,6 +924,11 @@ +@@ -828,6 +922,11 @@ } public ItemStack getCarried() { diff --git a/nms-patches/net/minecraft/world/inventory/ContainerBeacon.patch b/nms-patches/net/minecraft/world/inventory/ContainerBeacon.patch index a44cfc069..c416f9619 100644 --- a/nms-patches/net/minecraft/world/inventory/ContainerBeacon.patch +++ b/nms-patches/net/minecraft/world/inventory/ContainerBeacon.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/ContainerBeacon.java +++ b/net/minecraft/world/inventory/ContainerBeacon.java -@@ -11,6 +11,11 @@ +@@ -12,6 +12,11 @@ import net.minecraft.world.level.World; import net.minecraft.world.level.block.Blocks; @@ -12,7 +12,7 @@ public class ContainerBeacon extends Container { private static final int PAYMENT_SLOT = 0; -@@ -24,6 +29,10 @@ +@@ -26,6 +31,10 @@ private final ContainerBeacon.SlotBeacon paymentSlot; private final ContainerAccess access; private final IContainerProperties beaconData; @@ -23,7 +23,7 @@ public ContainerBeacon(int i, IInventory iinventory) { this(i, iinventory, new ContainerProperties(3), ContainerAccess.NULL); -@@ -31,6 +40,7 @@ +@@ -33,6 +42,7 @@ public ContainerBeacon(int i, IInventory iinventory, IContainerProperties icontainerproperties, ContainerAccess containeraccess) { super(Containers.BEACON, i); @@ -31,7 +31,7 @@ this.beacon = new InventorySubcontainer(1) { @Override public boolean canPlaceItem(int j, ItemStack itemstack) { -@@ -80,6 +90,7 @@ +@@ -82,6 +92,7 @@ @Override public boolean stillValid(EntityHuman entityhuman) { @@ -39,7 +39,18 @@ return stillValid(this.access, entityhuman, Blocks.BEACON); } -@@ -180,4 +191,17 @@ +@@ -163,8 +174,8 @@ + + public void updateEffects(Optional optional, Optional optional1) { + if (this.paymentSlot.hasItem()) { +- this.beaconData.set(1, encodeEffect((MobEffectList) optional.orElse((Object) null))); +- this.beaconData.set(2, encodeEffect((MobEffectList) optional1.orElse((Object) null))); ++ this.beaconData.set(1, encodeEffect((MobEffectList) optional.orElse(null))); // CraftBukkit - decompile error ++ this.beaconData.set(2, encodeEffect((MobEffectList) optional1.orElse(null))); // CraftBukkit - decompile error + this.paymentSlot.remove(1); + this.access.execute(World::blockEntityChanged); + } +@@ -191,4 +202,17 @@ return 1; } } diff --git a/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch b/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch index 6878c0d75..17b521cde 100644 --- a/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch +++ b/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/ContainerEnchantTable.java +++ b/net/minecraft/world/inventory/ContainerEnchantTable.java -@@ -25,6 +25,21 @@ +@@ -27,6 +27,21 @@ import net.minecraft.world.level.block.BlockEnchantmentTable; import net.minecraft.world.level.block.Blocks; @@ -21,8 +21,8 @@ + public class ContainerEnchantTable extends Container { - private final IInventory enchantSlots; -@@ -34,6 +49,10 @@ + static final MinecraftKey EMPTY_SLOT_LAPIS_LAZULI = new MinecraftKey("item/empty_slot_lapis_lazuli"); +@@ -37,6 +52,10 @@ public final int[] costs; public final int[] enchantClue; public final int[] levelClue; @@ -33,7 +33,7 @@ public ContainerEnchantTable(int i, PlayerInventory playerinventory) { this(i, playerinventory, ContainerAccess.NULL); -@@ -47,6 +66,13 @@ +@@ -50,6 +69,13 @@ super.setChanged(); ContainerEnchantTable.this.slotsChanged(this); } @@ -47,7 +47,7 @@ }; this.random = RandomSource.create(); this.enchantmentSeed = ContainerProperty.standalone(); -@@ -94,6 +120,9 @@ +@@ -97,6 +123,9 @@ this.addDataSlot(ContainerProperty.shared(this.levelClue, 0)); this.addDataSlot(ContainerProperty.shared(this.levelClue, 1)); this.addDataSlot(ContainerProperty.shared(this.levelClue, 2)); @@ -57,7 +57,7 @@ } @Override -@@ -101,7 +130,7 @@ +@@ -104,7 +133,7 @@ if (iinventory == this.enchantSlots) { ItemStack itemstack = iinventory.getItem(0); @@ -66,7 +66,7 @@ this.access.execute((world, blockposition) -> { int i = 0; Iterator iterator = BlockEnchantmentTable.BOOKSHELF_OFFSETS.iterator(); -@@ -140,6 +169,41 @@ +@@ -143,6 +172,41 @@ } } @@ -108,7 +108,7 @@ this.broadcastChanges(); }); } else { -@@ -167,9 +231,26 @@ +@@ -170,8 +234,25 @@ ItemStack itemstack2 = itemstack; List list = this.getEnchantmentList(itemstack, i, this.costs[i]); @@ -117,10 +117,8 @@ + // CraftBukkit start + if (true || !list.isEmpty()) { + // entityhuman.onEnchantmentPerformed(itemstack, j); // Moved down - boolean flag = itemstack.is(Items.BOOK); + Map enchants = new java.util.HashMap(); -+ for (Object obj : list) { -+ WeightedRandomEnchant instance = (WeightedRandomEnchant) obj; ++ for (WeightedRandomEnchant instance : list) { + enchants.put(org.bukkit.enchantments.Enchantment.getByKey(CraftNamespacedKey.fromMinecraft(BuiltInRegistries.ENCHANTMENT.getKey(instance.enchantment))), instance.level); + } + CraftItemStack item = CraftItemStack.asCraftMirror(itemstack2); @@ -134,20 +132,24 @@ + if (event.isCancelled() || (level > entityhuman.experienceLevel && !entityhuman.getAbilities().instabuild) || event.getEnchantsToAdd().isEmpty()) { + return; + } ++ // CraftBukkit end + boolean flag = itemstack.is(Items.BOOK); if (flag) { - itemstack2 = new ItemStack(Items.ENCHANTED_BOOK); -@@ -182,16 +263,29 @@ +@@ -185,18 +266,30 @@ this.enchantSlots.setItem(0, itemstack2); } -- for (int k = 0; k < list.size(); ++k) { -- WeightedRandomEnchant weightedrandomenchant = (WeightedRandomEnchant) list.get(k); +- Iterator iterator = list.iterator(); +- +- while (iterator.hasNext()) { +- WeightedRandomEnchant weightedrandomenchant = (WeightedRandomEnchant) iterator.next(); - - if (flag) { - ItemEnchantedBook.addEnchantment(itemstack2, weightedrandomenchant); - } else { - itemstack2.enchant(weightedrandomenchant.enchantment, weightedrandomenchant.level); ++ // CraftBukkit start + for (Map.Entry entry : event.getEnchantsToAdd().entrySet()) { + try { + if (flag) { @@ -174,7 +176,7 @@ if (!entityhuman.getAbilities().instabuild) { itemstack1.shrink(j); if (itemstack1.isEmpty()) { -@@ -254,6 +348,7 @@ +@@ -259,6 +352,7 @@ @Override public boolean stillValid(EntityHuman entityhuman) { @@ -182,7 +184,7 @@ return stillValid(this.access, entityhuman, Blocks.ENCHANTING_TABLE); } -@@ -304,4 +399,17 @@ +@@ -309,4 +403,17 @@ return itemstack; } diff --git a/nms-patches/net/minecraft/world/inventory/ContainerFurnace.patch b/nms-patches/net/minecraft/world/inventory/ContainerFurnace.patch index b9cf96671..12f662acb 100644 --- a/nms-patches/net/minecraft/world/inventory/ContainerFurnace.patch +++ b/nms-patches/net/minecraft/world/inventory/ContainerFurnace.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/ContainerFurnace.java +++ b/net/minecraft/world/inventory/ContainerFurnace.java -@@ -12,6 +12,11 @@ +@@ -14,6 +14,11 @@ import net.minecraft.world.level.World; import net.minecraft.world.level.block.entity.TileEntityFurnace; @@ -12,7 +12,7 @@ public abstract class ContainerFurnace extends ContainerRecipeBook { public static final int INGREDIENT_SLOT = 0; -@@ -29,6 +34,22 @@ +@@ -31,6 +36,22 @@ private final Recipes recipeType; private final RecipeBookType recipeBookType; @@ -35,7 +35,7 @@ protected ContainerFurnace(Containers containers, Recipes recipes, RecipeBookType recipebooktype, int i, PlayerInventory playerinventory) { this(containers, recipes, recipebooktype, i, playerinventory, new InventorySubcontainer(3), new ContainerProperties(4)); } -@@ -45,6 +66,7 @@ +@@ -47,6 +68,7 @@ this.addSlot(new Slot(iinventory, 0, 56, 17)); this.addSlot(new SlotFurnaceFuel(this, iinventory, 1, 56, 53)); this.addSlot(new SlotFurnaceResult(playerinventory.player, iinventory, 2, 116, 35)); @@ -43,7 +43,7 @@ int j; -@@ -102,6 +124,7 @@ +@@ -104,6 +126,7 @@ @Override public boolean stillValid(EntityHuman entityhuman) { @@ -51,7 +51,7 @@ return this.container.stillValid(entityhuman); } -@@ -157,7 +180,7 @@ +@@ -159,7 +182,7 @@ } protected boolean canSmelt(ItemStack itemstack) { diff --git a/nms-patches/net/minecraft/world/inventory/ContainerPlayer.patch b/nms-patches/net/minecraft/world/inventory/ContainerPlayer.patch index 9b5c0069c..527e1dcde 100644 --- a/nms-patches/net/minecraft/world/inventory/ContainerPlayer.patch +++ b/nms-patches/net/minecraft/world/inventory/ContainerPlayer.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/inventory/ContainerPlayer.java +++ b/net/minecraft/world/inventory/ContainerPlayer.java @@ -13,6 +13,12 @@ - import net.minecraft.world.item.crafting.IRecipe; + import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.enchantment.EnchantmentManager; +// CraftBukkit start @@ -44,7 +44,7 @@ this.addSlot(new SlotResult(playerinventory.player, this.craftSlots, this.resultSlots, 0, 154, 28)); int i; -@@ -264,4 +283,17 @@ +@@ -259,4 +278,17 @@ public boolean shouldMoveToInventory(int i) { return i != this.getResultSlotIndex(); } diff --git a/nms-patches/net/minecraft/world/inventory/ContainerSmithing.patch b/nms-patches/net/minecraft/world/inventory/ContainerSmithing.patch index 728e38b1b..3484de6c6 100644 --- a/nms-patches/net/minecraft/world/inventory/ContainerSmithing.patch +++ b/nms-patches/net/minecraft/world/inventory/ContainerSmithing.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/ContainerSmithing.java +++ b/net/minecraft/world/inventory/ContainerSmithing.java -@@ -12,6 +12,8 @@ +@@ -13,6 +13,8 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.IBlockData; @@ -9,29 +9,29 @@ public class ContainerSmithing extends ContainerAnvilAbstract { public static final int TEMPLATE_SLOT = 0; -@@ -27,6 +29,9 @@ +@@ -28,6 +30,9 @@ @Nullable - private SmithingRecipe selectedRecipe; - private final List recipes; + private RecipeHolder selectedRecipe; + private final List> recipes; + // CraftBukkit start + private CraftInventoryView bukkitEntity; + // CraftBukkit end public ContainerSmithing(int i, PlayerInventory playerinventory) { this(i, playerinventory, ContainerAccess.NULL); -@@ -96,7 +101,7 @@ - List list = this.level.getRecipeManager().getRecipesFor(Recipes.SMITHING, this.inputSlots, this.level); +@@ -97,7 +102,7 @@ + List> list = this.level.getRecipeManager().getRecipesFor(Recipes.SMITHING, this.inputSlots, this.level); if (list.isEmpty()) { - this.resultSlots.setItem(0, ItemStack.EMPTY); + org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareSmithingEvent(getBukkitView(), ItemStack.EMPTY); // CraftBukkit } else { - SmithingRecipe smithingrecipe = (SmithingRecipe) list.get(0); - ItemStack itemstack = smithingrecipe.assemble(this.inputSlots, this.level.registryAccess()); -@@ -104,7 +109,9 @@ + RecipeHolder recipeholder = (RecipeHolder) list.get(0); + ItemStack itemstack = ((SmithingRecipe) recipeholder.value()).assemble(this.inputSlots, this.level.registryAccess()); +@@ -105,7 +110,9 @@ if (itemstack.isItemEnabled(this.level.enabledFeatures())) { - this.selectedRecipe = smithingrecipe; - this.resultSlots.setRecipeUsed(smithingrecipe); + this.selectedRecipe = recipeholder; + this.resultSlots.setRecipeUsed(recipeholder); - this.resultSlots.setItem(0, itemstack); + // CraftBukkit start + org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareSmithingEvent(getBukkitView(), itemstack); @@ -39,9 +39,9 @@ } } -@@ -132,4 +139,18 @@ - return findSlotMatchingIngredient(smithingrecipe, itemstack); - }).anyMatch(Optional::isPresent); +@@ -137,4 +144,18 @@ + return !this.getSlot(i).hasItem(); + }).findFirst(); } + + // CraftBukkit start diff --git a/nms-patches/net/minecraft/world/inventory/ContainerStonecutter.patch b/nms-patches/net/minecraft/world/inventory/ContainerStonecutter.patch index d756cdd1f..2ea9c6719 100644 --- a/nms-patches/net/minecraft/world/inventory/ContainerStonecutter.patch +++ b/nms-patches/net/minecraft/world/inventory/ContainerStonecutter.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/ContainerStonecutter.java +++ b/net/minecraft/world/inventory/ContainerStonecutter.java -@@ -15,6 +15,13 @@ +@@ -16,6 +16,13 @@ import net.minecraft.world.level.World; import net.minecraft.world.level.block.Blocks; @@ -14,7 +14,7 @@ public class ContainerStonecutter extends Container { public static final int INPUT_SLOT = 0; -@@ -34,6 +41,21 @@ +@@ -35,6 +42,21 @@ Runnable slotUpdateListener; public final IInventory container; final InventoryCraftResult resultContainer; @@ -36,7 +36,7 @@ public ContainerStonecutter(int i, PlayerInventory playerinventory) { this(i, playerinventory, ContainerAccess.NULL); -@@ -53,6 +75,13 @@ +@@ -54,6 +76,13 @@ ContainerStonecutter.this.slotsChanged(this); ContainerStonecutter.this.slotUpdateListener.run(); } @@ -50,7 +50,7 @@ }; this.resultContainer = new InventoryCraftResult(); this.access = containeraccess; -@@ -104,6 +133,7 @@ +@@ -105,6 +134,7 @@ } this.addDataSlot(this.selectedRecipeIndex); @@ -58,7 +58,7 @@ } public int getSelectedRecipeIndex() { -@@ -124,6 +154,7 @@ +@@ -125,6 +155,7 @@ @Override public boolean stillValid(EntityHuman entityhuman) { diff --git a/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch b/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch index 37eb039a4..8ed346b3b 100644 --- a/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch +++ b/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/ContainerWorkbench.java +++ b/net/minecraft/world/inventory/ContainerWorkbench.java -@@ -14,6 +14,12 @@ +@@ -15,6 +15,12 @@ import net.minecraft.world.level.World; import net.minecraft.world.level.block.Blocks; @@ -13,7 +13,7 @@ public class ContainerWorkbench extends ContainerRecipeBook { public static final int RESULT_SLOT = 0; -@@ -23,10 +29,13 @@ +@@ -24,10 +30,13 @@ private static final int INV_SLOT_END = 37; private static final int USE_ROW_SLOT_START = 37; private static final int USE_ROW_SLOT_END = 46; @@ -28,7 +28,7 @@ public ContainerWorkbench(int i, PlayerInventory playerinventory) { this(i, playerinventory, ContainerAccess.NULL); -@@ -34,8 +43,11 @@ +@@ -35,8 +44,11 @@ public ContainerWorkbench(int i, PlayerInventory playerinventory, ContainerAccess containeraccess) { super(Containers.CRAFTING, i); @@ -41,15 +41,15 @@ this.access = containeraccess; this.player = playerinventory.player; this.addSlot(new SlotResult(playerinventory.player, this.craftSlots, this.resultSlots, 0, 124, 35)); -@@ -78,6 +90,7 @@ +@@ -80,6 +92,7 @@ } } } -+ itemstack = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, inventorycraftresult, itemstack, container.getBukkitView(), optional.orElse(null) instanceof RecipeRepair); // CraftBukkit ++ itemstack = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, inventorycraftresult, itemstack, container.getBukkitView(), optional.map(RecipeHolder::toBukkitRecipe).orElse(null) instanceof RecipeRepair); // CraftBukkit inventorycraftresult.setItem(0, itemstack); container.setRemoteSlot(0, itemstack); -@@ -118,6 +131,7 @@ +@@ -120,6 +133,7 @@ @Override public boolean stillValid(EntityHuman entityhuman) { @@ -57,7 +57,7 @@ return stillValid(this.access, entityhuman, Blocks.CRAFTING_TABLE); } -@@ -206,4 +220,17 @@ +@@ -208,4 +222,17 @@ public boolean shouldMoveToInventory(int i) { return i != this.getResultSlotIndex(); } diff --git a/nms-patches/net/minecraft/world/inventory/InventoryCraftResult.patch b/nms-patches/net/minecraft/world/inventory/InventoryCraftResult.patch index 0a95d8ce7..8b0b0e954 100644 --- a/nms-patches/net/minecraft/world/inventory/InventoryCraftResult.patch +++ b/nms-patches/net/minecraft/world/inventory/InventoryCraftResult.patch @@ -2,7 +2,7 @@ +++ b/net/minecraft/world/inventory/InventoryCraftResult.java @@ -9,12 +9,51 @@ import net.minecraft.world.item.ItemStack; - import net.minecraft.world.item.crafting.IRecipe; + import net.minecraft.world.item.crafting.RecipeHolder; +// CraftBukkit start +import org.bukkit.Location; @@ -10,11 +10,11 @@ +import org.bukkit.entity.HumanEntity; +// CraftBukkit end + - public class InventoryCraftResult implements IInventory, RecipeHolder { + public class InventoryCraftResult implements IInventory, RecipeCraftingHolder { private final NonNullList itemStacks; @Nullable - private IRecipe recipeUsed; + private RecipeHolder recipeUsed; + // CraftBukkit start + private int maxStack = MAX_STACK; diff --git a/nms-patches/net/minecraft/world/inventory/TransientCraftingContainer.patch b/nms-patches/net/minecraft/world/inventory/TransientCraftingContainer.patch index a6bb0c12e..87f4eec5f 100644 --- a/nms-patches/net/minecraft/world/inventory/TransientCraftingContainer.patch +++ b/nms-patches/net/minecraft/world/inventory/TransientCraftingContainer.patch @@ -7,7 +7,7 @@ +// CraftBukkit start +import java.util.List; +import net.minecraft.world.IInventory; -+import net.minecraft.world.item.crafting.IRecipe; ++import net.minecraft.world.item.crafting.RecipeHolder; +import org.bukkit.Location; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.entity.HumanEntity; @@ -23,7 +23,7 @@ + // CraftBukkit start - add fields + public List transaction = new java.util.ArrayList(); -+ private IRecipe currentRecipe; ++ private RecipeHolder currentRecipe; + public IInventory resultInventory; + private EntityHuman owner; + private int maxStack = MAX_STACK; @@ -68,12 +68,12 @@ + } + + @Override -+ public IRecipe getCurrentRecipe() { ++ public RecipeHolder getCurrentRecipe() { + return currentRecipe; + } + + @Override -+ public void setCurrentRecipe(IRecipe currentRecipe) { ++ public void setCurrentRecipe(RecipeHolder currentRecipe) { + this.currentRecipe = currentRecipe; + } + diff --git a/nms-patches/net/minecraft/world/item/ItemArmor.patch b/nms-patches/net/minecraft/world/item/ItemArmor.patch index 171bed269..9717bdc4b 100644 --- a/nms-patches/net/minecraft/world/item/ItemArmor.patch +++ b/nms-patches/net/minecraft/world/item/ItemArmor.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/world/item/ItemArmor.java +++ b/net/minecraft/world/item/ItemArmor.java -@@ -27,6 +27,11 @@ +@@ -27,6 +27,12 @@ import net.minecraft.world.level.block.BlockDispenser; import net.minecraft.world.phys.AxisAlignedBB; +// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseArmorEvent; +// CraftBukkit end @@ -12,13 +13,13 @@ public class ItemArmor extends Item implements Equipable { private static final EnumMap ARMOR_MODIFIER_UUID_PER_TYPE = (EnumMap) SystemUtils.make(new EnumMap(ItemArmor.a.class), (enummap) -> { -@@ -58,8 +63,34 @@ +@@ -58,8 +64,34 @@ EntityLiving entityliving = (EntityLiving) list.get(0); EnumItemSlot enumitemslot = EntityInsentient.getEquipmentSlotForItem(itemstack); ItemStack itemstack1 = itemstack.split(1); + // CraftBukkit start -+ World world = isourceblock.getLevel(); -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ World world = sourceblock.level(); ++ org.bukkit.block.Block block = CraftBlock.at(world, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) entityliving.getBukkitEntity()); @@ -37,7 +38,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != ItemArmor.DISPENSE_ITEM_BEHAVIOR) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return true; + } + } diff --git a/nms-patches/net/minecraft/world/item/ItemBoneMeal.patch b/nms-patches/net/minecraft/world/item/ItemBoneMeal.patch index e995559ae..31e2bb214 100644 --- a/nms-patches/net/minecraft/world/item/ItemBoneMeal.patch +++ b/nms-patches/net/minecraft/world/item/ItemBoneMeal.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/ItemBoneMeal.java +++ b/net/minecraft/world/item/ItemBoneMeal.java -@@ -33,6 +33,12 @@ +@@ -34,6 +34,12 @@ @Override public EnumInteractionResult useOn(ItemActionContext itemactioncontext) { diff --git a/nms-patches/net/minecraft/world/item/ItemBucket.patch b/nms-patches/net/minecraft/world/item/ItemBucket.patch index a0706cca1..6f02b19e9 100644 --- a/nms-patches/net/minecraft/world/item/ItemBucket.patch +++ b/nms-patches/net/minecraft/world/item/ItemBucket.patch @@ -17,12 +17,12 @@ public class ItemBucket extends Item implements DispensibleContainerItem { public final FluidType content; -@@ -59,6 +69,17 @@ - iblockdata = world.getBlockState(blockposition); - if (iblockdata.getBlock() instanceof IFluidSource) { - IFluidSource ifluidsource = (IFluidSource) iblockdata.getBlock(); +@@ -61,6 +71,17 @@ + + if (block instanceof IFluidSource) { + IFluidSource ifluidsource = (IFluidSource) block; + // CraftBukkit start -+ ItemStack dummyFluid = ifluidsource.pickupBlock(DummyGeneratorAccess.INSTANCE, blockposition, iblockdata); ++ ItemStack dummyFluid = ifluidsource.pickupBlock(entityhuman, DummyGeneratorAccess.INSTANCE, blockposition, iblockdata); + if (dummyFluid.isEmpty()) return InteractionResultWrapper.fail(itemstack); // Don't fire event if the bucket won't be filled. + PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((WorldServer) world, entityhuman, blockposition, blockposition, movingobjectpositionblock.getDirection(), itemstack, dummyFluid.getItem(), enumhand); + @@ -32,10 +32,10 @@ + return InteractionResultWrapper.fail(itemstack); + } + // CraftBukkit end - ItemStack itemstack1 = ifluidsource.pickupBlock(world, blockposition, iblockdata); + ItemStack itemstack1 = ifluidsource.pickupBlock(entityhuman, world, blockposition, iblockdata); if (!itemstack1.isEmpty()) { -@@ -67,7 +88,7 @@ +@@ -69,7 +90,7 @@ entityhuman.playSound(soundeffect, 1.0F, 1.0F); }); world.gameEvent((Entity) entityhuman, GameEvent.FLUID_PICKUP, blockposition); @@ -44,7 +44,7 @@ if (!world.isClientSide) { CriterionTriggers.FILLED_BUCKET.trigger((EntityPlayer) entityhuman, itemstack1); -@@ -82,7 +103,7 @@ +@@ -84,7 +105,7 @@ iblockdata = world.getBlockState(blockposition); BlockPosition blockposition2 = iblockdata.getBlock() instanceof IFluidContainer && this.content == FluidTypes.WATER ? blockposition : blockposition1; @@ -53,7 +53,7 @@ this.checkExtraContent(entityhuman, world, itemstack, blockposition2); if (entityhuman instanceof EntityPlayer) { CriterionTriggers.PLACED_BLOCK.trigger((EntityPlayer) entityhuman, blockposition2, itemstack); -@@ -109,6 +130,12 @@ +@@ -111,6 +132,12 @@ @Override public boolean emptyContents(@Nullable EntityHuman entityhuman, World world, BlockPosition blockposition, @Nullable MovingObjectPositionBlock movingobjectpositionblock) { @@ -63,15 +63,15 @@ + + public boolean emptyContents(EntityHuman entityhuman, World world, BlockPosition blockposition, @Nullable MovingObjectPositionBlock movingobjectpositionblock, EnumDirection enumdirection, BlockPosition clicked, ItemStack itemstack, EnumHand enumhand) { + // CraftBukkit end - if (!(this.content instanceof FluidTypeFlowing)) { - return false; - } else { -@@ -117,8 +144,18 @@ - boolean flag = iblockdata.canBeReplaced(this.content); - boolean flag1 = iblockdata.isAir() || flag || block instanceof IFluidContainer && ((IFluidContainer) block).canPlaceLiquid(world, blockposition, iblockdata, this.content); + FluidType fluidtype = this.content; + + if (!(fluidtype instanceof FluidTypeFlowing)) { +@@ -148,8 +175,18 @@ + + boolean flag2 = flag1; + // CraftBukkit start -+ if (flag1 && entityhuman != null) { ++ if (flag2 && entityhuman != null) { + PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent((WorldServer) world, entityhuman, blockposition, clicked, enumdirection, itemstack, enumhand); + if (event.isCancelled()) { + ((EntityPlayer) entityhuman).connection.send(new PacketPlayOutBlockChange(world, blockposition)); // SPIGOT-4238: needed when looking through entity @@ -80,7 +80,7 @@ + } + } + // CraftBukkit end - if (!flag1) { + if (!flag2) { - return movingobjectpositionblock != null && this.emptyContents(entityhuman, world, movingobjectpositionblock.getBlockPos().relative(movingobjectpositionblock.getDirection()), (MovingObjectPositionBlock) null); + return movingobjectpositionblock != null && this.emptyContents(entityhuman, world, movingobjectpositionblock.getBlockPos().relative(movingobjectpositionblock.getDirection()), (MovingObjectPositionBlock) null, enumdirection, clicked, itemstack, enumhand); // CraftBukkit } else if (world.dimensionType().ultraWarm() && this.content.is(TagsFluid.WATER)) { diff --git a/nms-patches/net/minecraft/world/item/ItemMinecart.patch b/nms-patches/net/minecraft/world/item/ItemMinecart.patch index 449be3774..634dae55a 100644 --- a/nms-patches/net/minecraft/world/item/ItemMinecart.patch +++ b/nms-patches/net/minecraft/world/item/ItemMinecart.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/world/item/ItemMinecart.java +++ b/net/minecraft/world/item/ItemMinecart.java -@@ -17,6 +17,11 @@ - import net.minecraft.world.level.block.state.properties.BlockPropertyTrackPosition; +@@ -18,6 +18,12 @@ import net.minecraft.world.level.gameevent.GameEvent; + import net.minecraft.world.phys.Vec3D; +// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +// CraftBukkit end @@ -12,7 +13,7 @@ public class ItemMinecart extends Item { private static final IDispenseBehavior DISPENSE_ITEM_BEHAVIOR = new DispenseBehaviorItem() { -@@ -55,14 +60,43 @@ +@@ -57,14 +63,43 @@ } } @@ -20,7 +21,7 @@ + // CraftBukkit start + // EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.createMinecart(worldserver, d0, d1 + d3, d2, ((ItemMinecart) itemstack.getItem()).type); + ItemStack itemstack1 = itemstack.split(1); -+ org.bukkit.block.Block block2 = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); ++ org.bukkit.block.Block block2 = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block2, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); @@ -39,7 +40,7 @@ + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != IDispenseBehavior.NOOP && idispensebehavior != this) { -+ idispensebehavior.dispense(isourceblock, eventStack); ++ idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } @@ -59,7 +60,7 @@ return itemstack; } -@@ -104,7 +138,12 @@ +@@ -106,7 +141,12 @@ entityminecartabstract.setCustomName(itemstack.getHoverName()); } diff --git a/nms-patches/net/minecraft/world/item/ItemStack.patch b/nms-patches/net/minecraft/world/item/ItemStack.patch index 17695cb7b..417d106d7 100644 --- a/nms-patches/net/minecraft/world/item/ItemStack.patch +++ b/nms-patches/net/minecraft/world/item/ItemStack.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -76,6 +76,43 @@ +@@ -77,6 +77,43 @@ import net.minecraft.world.level.block.state.pattern.ShapeDetectorBlock; import org.slf4j.Logger; @@ -44,7 +44,7 @@ public final class ItemStack { public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { -@@ -151,11 +188,24 @@ +@@ -152,11 +189,24 @@ this.item = null; } @@ -71,7 +71,7 @@ this.getItem().verifyTagAfterLoad(this.tag); } -@@ -165,6 +215,11 @@ +@@ -166,6 +216,11 @@ } @@ -83,7 +83,7 @@ public static ItemStack of(NBTTagCompound nbttagcompound) { try { return new ItemStack(nbttagcompound); -@@ -238,11 +293,190 @@ +@@ -243,11 +298,190 @@ return EnumInteractionResult.PASS; } else { Item item = this.getItem(); @@ -276,7 +276,7 @@ return enuminteractionresult; } -@@ -323,6 +557,21 @@ +@@ -328,6 +562,21 @@ } i -= k; @@ -298,7 +298,7 @@ if (i <= 0) { return false; } -@@ -344,6 +593,11 @@ +@@ -349,6 +598,11 @@ if (this.hurt(i, t0.getRandom(), t0 instanceof EntityPlayer ? (EntityPlayer) t0 : null)) { consumer.accept(t0); Item item = this.getItem(); @@ -310,7 +310,7 @@ this.shrink(1); if (t0 instanceof EntityHuman) { -@@ -492,6 +746,17 @@ +@@ -497,6 +751,17 @@ return this.tag; } @@ -328,20 +328,7 @@ public NBTTagCompound getOrCreateTag() { if (this.tag == null) { this.setTag(new NBTTagCompound()); -@@ -862,6 +1127,12 @@ - } - - public void setRepairCost(int i) { -+ // CraftBukkit start - remove RepairCost tag when 0 (SPIGOT-3945) -+ if (i == 0) { -+ this.removeTagKey("RepairCost"); -+ return; -+ } -+ // CraftBukkit end - this.getOrCreateTag().putInt("RepairCost", i); - } - -@@ -911,6 +1182,13 @@ +@@ -921,6 +1186,13 @@ nbttaglist.add(nbttagcompound); } diff --git a/nms-patches/net/minecraft/world/item/crafting/CraftingManager.patch b/nms-patches/net/minecraft/world/item/crafting/CraftingManager.patch index 6a51bb211..c4367e380 100644 --- a/nms-patches/net/minecraft/world/item/crafting/CraftingManager.patch +++ b/nms-patches/net/minecraft/world/item/crafting/CraftingManager.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/crafting/CraftingManager.java +++ b/net/minecraft/world/item/crafting/CraftingManager.java -@@ -34,11 +34,13 @@ +@@ -37,11 +37,13 @@ import net.minecraft.world.level.World; import org.slf4j.Logger; @@ -10,39 +10,39 @@ private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().disableHtmlEscaping().create(); private static final Logger LOGGER = LogUtils.getLogger(); -- public Map, Map>> recipes = ImmutableMap.of(); -+ public Map, Object2ObjectLinkedOpenHashMap>> recipes = ImmutableMap.of(); // CraftBukkit - private Map> byName = ImmutableMap.of(); +- public Map, Map>> recipes = ImmutableMap.of(); ++ public Map, Object2ObjectLinkedOpenHashMap>> recipes = ImmutableMap.of(); // CraftBukkit + private Map> byName = ImmutableMap.of(); private boolean hasErrors; -@@ -48,7 +50,12 @@ +@@ -51,7 +53,12 @@ protected void apply(Map map, IResourceManager iresourcemanager, GameProfilerFiller gameprofilerfiller) { this.hasErrors = false; -- Map, Builder>> map1 = Maps.newHashMap(); +- Map, Builder>> map1 = Maps.newHashMap(); + // CraftBukkit start - SPIGOT-5667 make sure all types are populated and mutable -+ Map, Object2ObjectLinkedOpenHashMap>> map1 = Maps.newHashMap(); ++ Map, Object2ObjectLinkedOpenHashMap>> map1 = Maps.newHashMap(); + for (Recipes recipeType : BuiltInRegistries.RECIPE_TYPE) { + map1.put(recipeType, new Object2ObjectLinkedOpenHashMap<>()); + } + // CraftBukkit end - Builder> builder = ImmutableMap.builder(); + Builder> builder = ImmutableMap.builder(); Iterator iterator = map.entrySet().iterator(); -@@ -59,8 +66,10 @@ +@@ -62,8 +69,10 @@ try { - IRecipe irecipe = fromJson(minecraftkey, ChatDeserializer.convertToJsonObject((JsonElement) entry.getValue(), "top element")); + RecipeHolder recipeholder = fromJson(minecraftkey, ChatDeserializer.convertToJsonObject((JsonElement) entry.getValue(), "top element")); -- ((Builder) map1.computeIfAbsent(irecipe.getType(), (recipes) -> { +- ((Builder) map1.computeIfAbsent(recipeholder.value().getType(), (recipes) -> { - return ImmutableMap.builder(); + // CraftBukkit start -+ (map1.computeIfAbsent(irecipe.getType(), (recipes) -> { ++ (map1.computeIfAbsent(recipeholder.value().getType(), (recipes) -> { + return new Object2ObjectLinkedOpenHashMap<>(); + // CraftBukkit end - })).put(minecraftkey, irecipe); - builder.put(minecraftkey, irecipe); + })).put(minecraftkey, recipeholder); + builder.put(minecraftkey, recipeholder); } catch (IllegalArgumentException | JsonParseException jsonparseexception) { -@@ -69,27 +78,44 @@ +@@ -72,20 +81,37 @@ } this.recipes = (Map) map1.entrySet().stream().collect(ImmutableMap.toImmutableMap(Entry::getKey, (entry1) -> { @@ -55,14 +55,14 @@ } + // CraftBukkit start -+ public void addRecipe(IRecipe irecipe) { -+ Object2ObjectLinkedOpenHashMap> map = this.recipes.get(irecipe.getType()); // CraftBukkit ++ public void addRecipe(RecipeHolder irecipe) { ++ Object2ObjectLinkedOpenHashMap> map = this.recipes.get(irecipe.value().getType()); // CraftBukkit + -+ if (byName.containsKey(irecipe.getId()) || map.containsKey(irecipe.getId())) { -+ throw new IllegalStateException("Duplicate recipe ignored with ID " + irecipe.getId()); ++ if (byName.containsKey(irecipe.id()) || map.containsKey(irecipe.id())) { ++ throw new IllegalStateException("Duplicate recipe ignored with ID " + irecipe.id()); + } else { -+ map.putAndMoveToFirst(irecipe.getId(), irecipe); // CraftBukkit - SPIGOT-4638: last recipe gets priority -+ byName.put(irecipe.getId(), irecipe); ++ map.putAndMoveToFirst(irecipe.id(), irecipe); // CraftBukkit - SPIGOT-4638: last recipe gets priority ++ byName.put(irecipe.id(), irecipe); + } + } + // CraftBukkit end @@ -71,69 +71,43 @@ return this.hasErrors; } - public > Optional getRecipeFor(Recipes recipes, C c0, World world) { -- return this.byType(recipes).values().stream().filter((irecipe) -> { + public > Optional> getRecipeFor(Recipes recipes, C c0, World world) { +- return this.byType(recipes).values().stream().filter((recipeholder) -> { + // CraftBukkit start -+ Optional recipe = this.byType(recipes).values().stream().filter((irecipe) -> { - return irecipe.matches(c0, world); ++ Optional> recipe = this.byType(recipes).values().stream().filter((recipeholder) -> { + return recipeholder.value().matches(c0, world); }).findFirst(); + c0.setCurrentRecipe(recipe.orElse(null)); // CraftBukkit - Clear recipe when no recipe is found -+ // CraftBukkit end + return recipe; ++ // CraftBukkit end } - public > Optional> getRecipeFor(Recipes recipes, C c0, World world, @Nullable MinecraftKey minecraftkey) { - Map map = this.byType(recipes); - - if (minecraftkey != null) { -- T t0 = (IRecipe) map.get(minecraftkey); -+ T t0 = map.get(minecraftkey); // CraftBukkit - decompile error - - if (t0 != null && t0.matches(c0, world)) { - return Optional.of(Pair.of(minecraftkey, t0)); -@@ -99,7 +125,7 @@ - return map.entrySet().stream().filter((entry) -> { - return ((IRecipe) entry.getValue()).matches(c0, world); - }).findFirst().map((entry) -> { -- return Pair.of((MinecraftKey) entry.getKey(), (IRecipe) entry.getValue()); -+ return Pair.of((MinecraftKey) entry.getKey(), entry.getValue()); // CraftBukkit - decompile error - }); + public > Optional>> getRecipeFor(Recipes recipes, C c0, World world, @Nullable MinecraftKey minecraftkey) { +@@ -119,7 +145,7 @@ } -@@ -116,7 +142,7 @@ - } - - private > Map byType(Recipes recipes) { + private > Map> byType(Recipes recipes) { - return (Map) this.recipes.getOrDefault(recipes, Collections.emptyMap()); + return (Map) this.recipes.getOrDefault(recipes, new Object2ObjectLinkedOpenHashMap<>()); // CraftBukkit } public > NonNullList getRemainingItemsFor(Recipes recipes, C c0, World world) { -@@ -136,7 +162,7 @@ - } +@@ -166,12 +192,12 @@ - public Optional> byKey(MinecraftKey minecraftkey) { -- return Optional.ofNullable((IRecipe) this.byName.get(minecraftkey)); -+ return Optional.ofNullable(this.byName.get(minecraftkey)); // CraftBukkit - decompile error - } - - public Collection> getRecipes() { -@@ -161,12 +187,12 @@ - - public void replaceRecipes(Iterable> iterable) { + public void replaceRecipes(Iterable> iterable) { this.hasErrors = false; -- Map, Map>> map = Maps.newHashMap(); -+ Map, Object2ObjectLinkedOpenHashMap>> map = Maps.newHashMap(); // CraftBukkit - Builder> builder = ImmutableMap.builder(); +- Map, Map>> map = Maps.newHashMap(); ++ Map, Object2ObjectLinkedOpenHashMap>> map = Maps.newHashMap(); // CraftBukkit + Builder> builder = ImmutableMap.builder(); - iterable.forEach((irecipe) -> { - Map> map1 = (Map) map.computeIfAbsent(irecipe.getType(), (recipes) -> { + iterable.forEach((recipeholder) -> { + Map> map1 = (Map) map.computeIfAbsent(recipeholder.value().getType(), (recipes) -> { - return Maps.newHashMap(); + return new Object2ObjectLinkedOpenHashMap<>(); // CraftBukkit }); - MinecraftKey minecraftkey = irecipe.getId(); - IRecipe irecipe1 = (IRecipe) map1.put(minecraftkey, irecipe); -@@ -177,8 +203,28 @@ + MinecraftKey minecraftkey = recipeholder.id(); + RecipeHolder recipeholder1 = (RecipeHolder) map1.put(minecraftkey, recipeholder); +@@ -182,8 +208,28 @@ } }); this.recipes = ImmutableMap.copyOf(map); @@ -143,7 +117,7 @@ + + // CraftBukkit start + public boolean removeRecipe(MinecraftKey mcKey) { -+ for (Object2ObjectLinkedOpenHashMap> recipes : recipes.values()) { ++ for (Object2ObjectLinkedOpenHashMap> recipes : recipes.values()) { + recipes.remove(mcKey); + } + @@ -163,12 +137,3 @@ public static > CraftingManager.a createCheck(final Recipes recipes) { return new CraftingManager.a() { -@@ -194,7 +240,7 @@ - Pair pair = (Pair) optional.get(); - - this.lastRecipe = (MinecraftKey) pair.getFirst(); -- return Optional.of((IRecipe) pair.getSecond()); -+ return Optional.of(pair.getSecond()); // CraftBukkit - decompile error - } else { - return Optional.empty(); - } diff --git a/nms-patches/net/minecraft/world/item/crafting/FurnaceRecipe.patch b/nms-patches/net/minecraft/world/item/crafting/FurnaceRecipe.patch index 29cfe021b..30ac7e912 100644 --- a/nms-patches/net/minecraft/world/item/crafting/FurnaceRecipe.patch +++ b/nms-patches/net/minecraft/world/item/crafting/FurnaceRecipe.patch @@ -1,31 +1,31 @@ --- a/net/minecraft/world/item/crafting/FurnaceRecipe.java +++ b/net/minecraft/world/item/crafting/FurnaceRecipe.java -@@ -4,6 +4,14 @@ +@@ -3,6 +3,14 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; +// CraftBukkit start ++import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftFurnaceRecipe; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftRecipe; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.inventory.Recipe; +// CraftBukkit end + public class FurnaceRecipe extends RecipeCooking { - public FurnaceRecipe(MinecraftKey minecraftkey, String s, CookingBookCategory cookingbookcategory, RecipeItemStack recipeitemstack, ItemStack itemstack, float f, int i) { -@@ -19,4 +27,17 @@ + public FurnaceRecipe(String s, CookingBookCategory cookingbookcategory, RecipeItemStack recipeitemstack, ItemStack itemstack, float f, int i) { +@@ -18,4 +26,17 @@ public RecipeSerializer getSerializer() { return RecipeSerializer.SMELTING_RECIPE; } + + // CraftBukkit start + @Override -+ public Recipe toBukkitRecipe() { ++ public Recipe toBukkitRecipe(NamespacedKey id) { + CraftItemStack result = CraftItemStack.asCraftMirror(this.result); + -+ CraftFurnaceRecipe recipe = new CraftFurnaceRecipe(CraftNamespacedKey.fromMinecraft(this.id), result, CraftRecipe.toBukkit(this.ingredient), this.experience, this.cookingTime); ++ CraftFurnaceRecipe recipe = new CraftFurnaceRecipe(id, result, CraftRecipe.toBukkit(this.ingredient), this.experience, this.cookingTime); + recipe.setGroup(this.group); + recipe.setCategory(CraftRecipe.getCategory(this.category())); + diff --git a/nms-patches/net/minecraft/world/item/crafting/IRecipe.patch b/nms-patches/net/minecraft/world/item/crafting/IRecipe.patch index 24c9cde50..40ff44f2e 100644 --- a/nms-patches/net/minecraft/world/item/crafting/IRecipe.patch +++ b/nms-patches/net/minecraft/world/item/crafting/IRecipe.patch @@ -1,9 +1,9 @@ --- a/net/minecraft/world/item/crafting/IRecipe.java +++ b/net/minecraft/world/item/crafting/IRecipe.java -@@ -66,4 +66,6 @@ +@@ -63,4 +63,6 @@ return recipeitemstack.getItems().length == 0; }); } + -+ org.bukkit.inventory.Recipe toBukkitRecipe(); // CraftBukkit ++ org.bukkit.inventory.Recipe toBukkitRecipe(org.bukkit.NamespacedKey id); // CraftBukkit } diff --git a/nms-patches/net/minecraft/world/item/crafting/IRecipeComplex.patch b/nms-patches/net/minecraft/world/item/crafting/IRecipeComplex.patch index 68a83f37e..80ea716a5 100644 --- a/nms-patches/net/minecraft/world/item/crafting/IRecipeComplex.patch +++ b/nms-patches/net/minecraft/world/item/crafting/IRecipeComplex.patch @@ -1,14 +1,26 @@ --- a/net/minecraft/world/item/crafting/IRecipeComplex.java +++ b/net/minecraft/world/item/crafting/IRecipeComplex.java -@@ -33,4 +33,11 @@ +@@ -3,6 +3,11 @@ + import net.minecraft.core.IRegistryCustom; + import net.minecraft.world.item.ItemStack; + ++// CraftBukkit start ++import org.bukkit.NamespacedKey; ++import org.bukkit.inventory.Recipe; ++// CraftBukkit end ++ + public abstract class IRecipeComplex implements RecipeCrafting { + + private final CraftingBookCategory category; +@@ -25,4 +30,11 @@ public CraftingBookCategory category() { return this.category; } + + // CraftBukkit start + @Override -+ public org.bukkit.inventory.Recipe toBukkitRecipe() { -+ return new org.bukkit.craftbukkit.inventory.CraftComplexRecipe(this); ++ public Recipe toBukkitRecipe(NamespacedKey id) { ++ return new org.bukkit.craftbukkit.inventory.CraftComplexRecipe(id, this); + } + // CraftBukkit end } diff --git a/nms-patches/net/minecraft/world/item/crafting/RecipeBlasting.patch b/nms-patches/net/minecraft/world/item/crafting/RecipeBlasting.patch index 009430c47..daa0c936b 100644 --- a/nms-patches/net/minecraft/world/item/crafting/RecipeBlasting.patch +++ b/nms-patches/net/minecraft/world/item/crafting/RecipeBlasting.patch @@ -1,31 +1,31 @@ --- a/net/minecraft/world/item/crafting/RecipeBlasting.java +++ b/net/minecraft/world/item/crafting/RecipeBlasting.java -@@ -4,6 +4,14 @@ +@@ -3,6 +3,14 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; +// CraftBukkit start ++import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftBlastingRecipe; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftRecipe; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.inventory.Recipe; +// CraftBukkit end + public class RecipeBlasting extends RecipeCooking { - public RecipeBlasting(MinecraftKey minecraftkey, String s, CookingBookCategory cookingbookcategory, RecipeItemStack recipeitemstack, ItemStack itemstack, float f, int i) { -@@ -19,4 +27,17 @@ + public RecipeBlasting(String s, CookingBookCategory cookingbookcategory, RecipeItemStack recipeitemstack, ItemStack itemstack, float f, int i) { +@@ -18,4 +26,17 @@ public RecipeSerializer getSerializer() { return RecipeSerializer.BLASTING_RECIPE; } + + // CraftBukkit start + @Override -+ public Recipe toBukkitRecipe() { ++ public Recipe toBukkitRecipe(NamespacedKey id) { + CraftItemStack result = CraftItemStack.asCraftMirror(this.result); + -+ CraftBlastingRecipe recipe = new CraftBlastingRecipe(CraftNamespacedKey.fromMinecraft(this.id), result, CraftRecipe.toBukkit(this.ingredient), this.experience, this.cookingTime); ++ CraftBlastingRecipe recipe = new CraftBlastingRecipe(id, result, CraftRecipe.toBukkit(this.ingredient), this.experience, this.cookingTime); + recipe.setGroup(this.group); + recipe.setCategory(CraftRecipe.getCategory(this.category())); + diff --git a/nms-patches/net/minecraft/world/item/crafting/RecipeCampfire.patch b/nms-patches/net/minecraft/world/item/crafting/RecipeCampfire.patch index 9d3bbbd4f..fa7909db0 100644 --- a/nms-patches/net/minecraft/world/item/crafting/RecipeCampfire.patch +++ b/nms-patches/net/minecraft/world/item/crafting/RecipeCampfire.patch @@ -1,31 +1,31 @@ --- a/net/minecraft/world/item/crafting/RecipeCampfire.java +++ b/net/minecraft/world/item/crafting/RecipeCampfire.java -@@ -4,6 +4,14 @@ +@@ -3,6 +3,14 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; +// CraftBukkit start ++import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftCampfireRecipe; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftRecipe; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.inventory.Recipe; +// CraftBukkit end + public class RecipeCampfire extends RecipeCooking { - public RecipeCampfire(MinecraftKey minecraftkey, String s, CookingBookCategory cookingbookcategory, RecipeItemStack recipeitemstack, ItemStack itemstack, float f, int i) { -@@ -19,4 +27,17 @@ + public RecipeCampfire(String s, CookingBookCategory cookingbookcategory, RecipeItemStack recipeitemstack, ItemStack itemstack, float f, int i) { +@@ -18,4 +26,17 @@ public RecipeSerializer getSerializer() { return RecipeSerializer.CAMPFIRE_COOKING_RECIPE; } + + // CraftBukkit start + @Override -+ public Recipe toBukkitRecipe() { ++ public Recipe toBukkitRecipe(NamespacedKey id) { + CraftItemStack result = CraftItemStack.asCraftMirror(this.result); + -+ CraftCampfireRecipe recipe = new CraftCampfireRecipe(CraftNamespacedKey.fromMinecraft(this.id), result, CraftRecipe.toBukkit(this.ingredient), this.experience, this.cookingTime); ++ CraftCampfireRecipe recipe = new CraftCampfireRecipe(id, result, CraftRecipe.toBukkit(this.ingredient), this.experience, this.cookingTime); + recipe.setGroup(this.group); + recipe.setCategory(CraftRecipe.getCategory(this.category())); + diff --git a/nms-patches/net/minecraft/world/item/crafting/RecipeHolder.patch b/nms-patches/net/minecraft/world/item/crafting/RecipeHolder.patch new file mode 100644 index 000000000..980b0b897 --- /dev/null +++ b/nms-patches/net/minecraft/world/item/crafting/RecipeHolder.patch @@ -0,0 +1,20 @@ +--- a/net/minecraft/world/item/crafting/RecipeHolder.java ++++ b/net/minecraft/world/item/crafting/RecipeHolder.java +@@ -2,7 +2,16 @@ + + import net.minecraft.resources.MinecraftKey; + +-public record RecipeHolder> (MinecraftKey id, T value) { ++// CraftBukkit start ++import org.bukkit.craftbukkit.util.CraftNamespacedKey; ++import org.bukkit.inventory.Recipe; ++ ++public record RecipeHolder>(MinecraftKey id, T value) { ++ ++ public final Recipe toBukkitRecipe() { ++ return this.value.toBukkitRecipe(CraftNamespacedKey.fromMinecraft(this.id)); ++ } ++ // CraftBukkit end + + public boolean equals(Object object) { + if (this == object) { diff --git a/nms-patches/net/minecraft/world/item/crafting/RecipeItemStack.patch b/nms-patches/net/minecraft/world/item/crafting/RecipeItemStack.patch index 87b08310f..abadc10a7 100644 --- a/nms-patches/net/minecraft/world/item/crafting/RecipeItemStack.patch +++ b/nms-patches/net/minecraft/world/item/crafting/RecipeItemStack.patch @@ -5,10 +5,10 @@ @Nullable private IntList stackingIds; + public boolean exact; // CraftBukkit + public static final Codec CODEC = codec(true); + public static final Codec CODEC_NONEMPTY = codec(false); - public RecipeItemStack(Stream stream) { - this.values = (RecipeItemStack.Provider[]) stream.toArray((i) -> { -@@ -69,6 +70,15 @@ +@@ -75,6 +76,15 @@ for (int j = 0; j < i; ++j) { ItemStack itemstack1 = aitemstack[j]; diff --git a/nms-patches/net/minecraft/world/item/crafting/RecipeSmoking.patch b/nms-patches/net/minecraft/world/item/crafting/RecipeSmoking.patch index d862c495b..2fe099127 100644 --- a/nms-patches/net/minecraft/world/item/crafting/RecipeSmoking.patch +++ b/nms-patches/net/minecraft/world/item/crafting/RecipeSmoking.patch @@ -1,31 +1,31 @@ --- a/net/minecraft/world/item/crafting/RecipeSmoking.java +++ b/net/minecraft/world/item/crafting/RecipeSmoking.java -@@ -4,6 +4,14 @@ +@@ -3,6 +3,14 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; +// CraftBukkit start ++import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftRecipe; +import org.bukkit.craftbukkit.inventory.CraftSmokingRecipe; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.inventory.Recipe; +// CraftBukkit end + public class RecipeSmoking extends RecipeCooking { - public RecipeSmoking(MinecraftKey minecraftkey, String s, CookingBookCategory cookingbookcategory, RecipeItemStack recipeitemstack, ItemStack itemstack, float f, int i) { -@@ -19,4 +27,17 @@ + public RecipeSmoking(String s, CookingBookCategory cookingbookcategory, RecipeItemStack recipeitemstack, ItemStack itemstack, float f, int i) { +@@ -18,4 +26,17 @@ public RecipeSerializer getSerializer() { return RecipeSerializer.SMOKING_RECIPE; } + + // CraftBukkit start + @Override -+ public Recipe toBukkitRecipe() { ++ public Recipe toBukkitRecipe(NamespacedKey id) { + CraftItemStack result = CraftItemStack.asCraftMirror(this.result); + -+ CraftSmokingRecipe recipe = new CraftSmokingRecipe(CraftNamespacedKey.fromMinecraft(this.id), result, CraftRecipe.toBukkit(this.ingredient), this.experience, this.cookingTime); ++ CraftSmokingRecipe recipe = new CraftSmokingRecipe(id, result, CraftRecipe.toBukkit(this.ingredient), this.experience, this.cookingTime); + recipe.setGroup(this.group); + recipe.setCategory(CraftRecipe.getCategory(this.category())); + diff --git a/nms-patches/net/minecraft/world/item/crafting/RecipeStonecutting.patch b/nms-patches/net/minecraft/world/item/crafting/RecipeStonecutting.patch index 6a1389a8b..8f96573bb 100644 --- a/nms-patches/net/minecraft/world/item/crafting/RecipeStonecutting.patch +++ b/nms-patches/net/minecraft/world/item/crafting/RecipeStonecutting.patch @@ -1,31 +1,31 @@ --- a/net/minecraft/world/item/crafting/RecipeStonecutting.java +++ b/net/minecraft/world/item/crafting/RecipeStonecutting.java -@@ -6,6 +6,14 @@ +@@ -5,6 +5,14 @@ import net.minecraft.world.level.World; import net.minecraft.world.level.block.Blocks; +// CraftBukkit start ++import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftRecipe; +import org.bukkit.craftbukkit.inventory.CraftStonecuttingRecipe; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.inventory.Recipe; +// CraftBukkit end + public class RecipeStonecutting extends RecipeSingleItem { - public RecipeStonecutting(MinecraftKey minecraftkey, String s, RecipeItemStack recipeitemstack, ItemStack itemstack) { -@@ -21,4 +29,16 @@ + public RecipeStonecutting(String s, RecipeItemStack recipeitemstack, ItemStack itemstack) { +@@ -20,4 +28,16 @@ public ItemStack getToastSymbol() { return new ItemStack(Blocks.STONECUTTER); } + + // CraftBukkit start + @Override -+ public Recipe toBukkitRecipe() { ++ public Recipe toBukkitRecipe(NamespacedKey id) { + CraftItemStack result = CraftItemStack.asCraftMirror(this.result); + -+ CraftStonecuttingRecipe recipe = new CraftStonecuttingRecipe(CraftNamespacedKey.fromMinecraft(this.id), result, CraftRecipe.toBukkit(this.ingredient)); ++ CraftStonecuttingRecipe recipe = new CraftStonecuttingRecipe(id, result, CraftRecipe.toBukkit(this.ingredient)); + recipe.setGroup(this.group); + + return recipe; diff --git a/nms-patches/net/minecraft/world/item/crafting/ShapedRecipes.patch b/nms-patches/net/minecraft/world/item/crafting/ShapedRecipes.patch index a25886ed8..81b104778 100644 --- a/nms-patches/net/minecraft/world/item/crafting/ShapedRecipes.patch +++ b/nms-patches/net/minecraft/world/item/crafting/ShapedRecipes.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/world/item/crafting/ShapedRecipes.java +++ b/net/minecraft/world/item/crafting/ShapedRecipes.java -@@ -24,6 +24,13 @@ - import net.minecraft.world.item.Items; +@@ -18,6 +18,14 @@ import net.minecraft.world.level.World; + import org.apache.commons.lang3.NotImplementedException; +// CraftBukkit start ++import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftRecipe; +import org.bukkit.craftbukkit.inventory.CraftShapedRecipe; @@ -14,14 +15,15 @@ public class ShapedRecipes implements RecipeCrafting { final int width; -@@ -50,6 +57,67 @@ - this(minecraftkey, s, craftingbookcategory, i, j, nonnulllist, itemstack, true); +@@ -42,6 +50,68 @@ + this(s, craftingbookcategory, i, j, nonnulllist, itemstack, true); } + // CraftBukkit start -+ public org.bukkit.inventory.ShapedRecipe toBukkitRecipe() { ++ @Override ++ public org.bukkit.inventory.ShapedRecipe toBukkitRecipe(NamespacedKey id) { + CraftItemStack result = CraftItemStack.asCraftMirror(this.result); -+ CraftShapedRecipe recipe = new CraftShapedRecipe(result, this); ++ CraftShapedRecipe recipe = new CraftShapedRecipe(id, result, this); + recipe.setGroup(this.group); + recipe.setCategory(CraftRecipe.getCategory(this.category())); + @@ -80,5 +82,5 @@ + // CraftBukkit end + @Override - public MinecraftKey getId() { - return this.id; + public RecipeSerializer getSerializer() { + return RecipeSerializer.SHAPED_RECIPE; diff --git a/nms-patches/net/minecraft/world/item/crafting/ShapelessRecipes.patch b/nms-patches/net/minecraft/world/item/crafting/ShapelessRecipes.patch index 3e0711dae..d9fc255ff 100644 --- a/nms-patches/net/minecraft/world/item/crafting/ShapelessRecipes.patch +++ b/nms-patches/net/minecraft/world/item/crafting/ShapelessRecipes.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/world/item/crafting/ShapelessRecipes.java +++ b/net/minecraft/world/item/crafting/ShapelessRecipes.java -@@ -15,6 +15,12 @@ +@@ -14,6 +14,13 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.World; +// CraftBukkit start ++import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftRecipe; +import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe; @@ -12,16 +13,17 @@ + public class ShapelessRecipes implements RecipeCrafting { - private final MinecraftKey id; -@@ -31,6 +37,21 @@ + final String group; +@@ -28,6 +35,22 @@ this.ingredients = nonnulllist; } + // CraftBukkit start + @SuppressWarnings("unchecked") -+ public org.bukkit.inventory.ShapelessRecipe toBukkitRecipe() { ++ @Override ++ public org.bukkit.inventory.ShapelessRecipe toBukkitRecipe(NamespacedKey id) { + CraftItemStack result = CraftItemStack.asCraftMirror(this.result); -+ CraftShapelessRecipe recipe = new CraftShapelessRecipe(result, this); ++ CraftShapelessRecipe recipe = new CraftShapelessRecipe(id, result, this); + recipe.setGroup(this.group); + recipe.setCategory(CraftRecipe.getCategory(this.category())); + @@ -33,5 +35,5 @@ + // CraftBukkit end + @Override - public MinecraftKey getId() { - return this.id; + public RecipeSerializer getSerializer() { + return RecipeSerializer.SHAPELESS_RECIPE; diff --git a/nms-patches/net/minecraft/world/item/crafting/SmithingTransformRecipe.patch b/nms-patches/net/minecraft/world/item/crafting/SmithingTransformRecipe.patch index 0b440d00f..6fa252918 100644 --- a/nms-patches/net/minecraft/world/item/crafting/SmithingTransformRecipe.patch +++ b/nms-patches/net/minecraft/world/item/crafting/SmithingTransformRecipe.patch @@ -1,30 +1,30 @@ --- a/net/minecraft/world/item/crafting/SmithingTransformRecipe.java +++ b/net/minecraft/world/item/crafting/SmithingTransformRecipe.java -@@ -11,6 +11,14 @@ +@@ -10,6 +10,14 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.World; +// CraftBukkit start ++import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftRecipe; +import org.bukkit.craftbukkit.inventory.CraftSmithingTransformRecipe; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.inventory.Recipe; +// CraftBukkit end + public class SmithingTransformRecipe implements SmithingRecipe { - private final MinecraftKey id; -@@ -79,6 +87,17 @@ + final RecipeItemStack template; +@@ -71,6 +79,17 @@ return Stream.of(this.template, this.base, this.addition).anyMatch(RecipeItemStack::isEmpty); } + // CraftBukkit start + @Override -+ public Recipe toBukkitRecipe() { ++ public Recipe toBukkitRecipe(NamespacedKey id) { + CraftItemStack result = CraftItemStack.asCraftMirror(this.result); + -+ CraftSmithingTransformRecipe recipe = new CraftSmithingTransformRecipe(CraftNamespacedKey.fromMinecraft(this.id), result, CraftRecipe.toBukkit(this.template), CraftRecipe.toBukkit(this.base), CraftRecipe.toBukkit(this.addition)); ++ CraftSmithingTransformRecipe recipe = new CraftSmithingTransformRecipe(id, result, CraftRecipe.toBukkit(this.template), CraftRecipe.toBukkit(this.base), CraftRecipe.toBukkit(this.addition)); + + return recipe; + } @@ -32,4 +32,4 @@ + public static class a implements RecipeSerializer { - public a() {} + private static final Codec CODEC = RecordCodecBuilder.create((instance) -> { diff --git a/nms-patches/net/minecraft/world/item/crafting/SmithingTrimRecipe.patch b/nms-patches/net/minecraft/world/item/crafting/SmithingTrimRecipe.patch index 2e66fa5ec..f598fae7a 100644 --- a/nms-patches/net/minecraft/world/item/crafting/SmithingTrimRecipe.patch +++ b/nms-patches/net/minecraft/world/item/crafting/SmithingTrimRecipe.patch @@ -1,30 +1,30 @@ --- a/net/minecraft/world/item/crafting/SmithingTrimRecipe.java +++ b/net/minecraft/world/item/crafting/SmithingTrimRecipe.java -@@ -19,6 +19,13 @@ +@@ -18,6 +18,13 @@ import net.minecraft.world.item.armortrim.TrimPatterns; import net.minecraft.world.level.World; +// CraftBukkit start ++import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.inventory.CraftRecipe; +import org.bukkit.craftbukkit.inventory.CraftSmithingTrimRecipe; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.inventory.Recipe; +// CraftBukkit end + public class SmithingTrimRecipe implements SmithingRecipe { - private final MinecraftKey id; -@@ -115,6 +122,13 @@ + final RecipeItemStack template; +@@ -107,6 +114,13 @@ return Stream.of(this.template, this.base, this.addition).anyMatch(RecipeItemStack::isEmpty); } + // CraftBukkit start + @Override -+ public Recipe toBukkitRecipe() { -+ return new CraftSmithingTrimRecipe(CraftNamespacedKey.fromMinecraft(this.id), CraftRecipe.toBukkit(this.template), CraftRecipe.toBukkit(this.base), CraftRecipe.toBukkit(this.addition)); ++ public Recipe toBukkitRecipe(NamespacedKey id) { ++ return new CraftSmithingTrimRecipe(id, CraftRecipe.toBukkit(this.template), CraftRecipe.toBukkit(this.base), CraftRecipe.toBukkit(this.addition)); + } + // CraftBukkit end + public static class a implements RecipeSerializer { - public a() {} + private static final Codec CODEC = RecordCodecBuilder.create((instance) -> { diff --git a/nms-patches/net/minecraft/world/item/trading/MerchantRecipe.patch b/nms-patches/net/minecraft/world/item/trading/MerchantRecipe.patch index 3589ce09d..b5c719516 100644 --- a/nms-patches/net/minecraft/world/item/trading/MerchantRecipe.patch +++ b/nms-patches/net/minecraft/world/item/trading/MerchantRecipe.patch @@ -32,7 +32,7 @@ public MerchantRecipe(NBTTagCompound nbttagcompound) { this.rewardExp = true; -@@ -81,6 +99,7 @@ +@@ -96,6 +114,7 @@ return ItemStack.EMPTY; } else { int i = this.baseCostA.getCount(); @@ -40,7 +40,7 @@ int j = Math.max(0, MathHelper.floor((float) (i * this.demand) * this.priceMultiplier)); return this.baseCostA.copyWithCount(MathHelper.clamp(i + j + this.specialPriceDiff, 1, this.baseCostA.getItem().getMaxStackSize())); -@@ -201,7 +220,11 @@ +@@ -216,7 +235,11 @@ if (!this.satisfiedBy(itemstack, itemstack1)) { return false; } else { diff --git a/nms-patches/net/minecraft/world/level/Explosion.patch b/nms-patches/net/minecraft/world/level/Explosion.patch index f3a1f86a6..d94876ec2 100644 --- a/nms-patches/net/minecraft/world/level/Explosion.patch +++ b/nms-patches/net/minecraft/world/level/Explosion.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/Explosion.java +++ b/net/minecraft/world/level/Explosion.java -@@ -40,6 +40,15 @@ +@@ -41,6 +41,15 @@ import net.minecraft.world.phys.MovingObjectPosition; import net.minecraft.world.phys.Vec3D; @@ -16,7 +16,7 @@ public class Explosion { private static final ExplosionDamageCalculator EXPLOSION_DAMAGE_CALCULATOR = new ExplosionDamageCalculator(); -@@ -58,6 +67,7 @@ +@@ -59,6 +68,7 @@ private final ExplosionDamageCalculator damageCalculator; private final ObjectArrayList toBlow; private final Map hitPlayers; @@ -24,7 +24,7 @@ public Explosion(World world, @Nullable Entity entity, double d0, double d1, double d2, float f, List list) { this(world, entity, d0, d1, d2, f, false, Explosion.Effect.DESTROY_WITH_DECAY, list); -@@ -78,7 +88,7 @@ +@@ -79,7 +89,7 @@ this.hitPlayers = Maps.newHashMap(); this.level = world; this.source = entity; @@ -33,7 +33,7 @@ this.x = d0; this.y = d1; this.z = d2; -@@ -128,6 +138,11 @@ +@@ -129,6 +139,11 @@ } public void explode() { @@ -45,7 +45,7 @@ this.level.gameEvent(this.source, GameEvent.EXPLODE, new Vec3D(this.x, this.y, this.z)); Set set = Sets.newHashSet(); boolean flag = true; -@@ -211,7 +226,39 @@ +@@ -213,7 +228,39 @@ double d12 = (double) getSeenPercent(vec3d, entity); double d13 = (1.0D - d7) * d12; @@ -86,7 +86,7 @@ double d14; if (entity instanceof EntityLiving) { -@@ -263,11 +310,66 @@ +@@ -265,11 +312,66 @@ SystemUtils.shuffle(this.toBlow, this.level.random); ObjectListIterator objectlistiterator = this.toBlow.iterator(); @@ -153,7 +153,7 @@ if (!iblockdata.isAir()) { BlockPosition blockposition1 = blockposition.immutable(); -@@ -281,8 +383,8 @@ +@@ -283,8 +385,8 @@ TileEntity tileentity = iblockdata.hasBlockEntity() ? this.level.getBlockEntity(blockposition) : null; LootParams.a lootparams_a = (new LootParams.a(worldserver)).withParameter(LootContextParameters.ORIGIN, Vec3D.atCenterOf(blockposition)).withParameter(LootContextParameters.TOOL, ItemStack.EMPTY).withOptionalParameter(LootContextParameters.BLOCK_ENTITY, tileentity).withOptionalParameter(LootContextParameters.THIS_ENTITY, this.source); @@ -164,7 +164,7 @@ } iblockdata.spawnAfterBreak(worldserver, blockposition, ItemStack.EMPTY, flag2); -@@ -314,7 +416,11 @@ +@@ -316,7 +418,11 @@ BlockPosition blockposition2 = (BlockPosition) objectlistiterator1.next(); if (this.random.nextInt(3) == 0 && this.level.getBlockState(blockposition2).isAir() && this.level.getBlockState(blockposition2.below()).isSolidRender(this.level, blockposition2.below())) { @@ -177,7 +177,7 @@ } } } -@@ -326,6 +432,7 @@ +@@ -328,6 +434,7 @@ } private static void addBlockDrops(ObjectArrayList> objectarraylist, ItemStack itemstack, BlockPosition blockposition) { diff --git a/nms-patches/net/minecraft/world/level/GameRules.patch b/nms-patches/net/minecraft/world/level/GameRules.patch index 48a469734..8f6b6d3b1 100644 --- a/nms-patches/net/minecraft/world/level/GameRules.patch +++ b/nms-patches/net/minecraft/world/level/GameRules.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/GameRules.java +++ b/net/minecraft/world/level/GameRules.java -@@ -128,7 +128,7 @@ +@@ -138,7 +138,7 @@ } public > T getRule(GameRules.GameRuleKey gamerules_gamerulekey) { @@ -9,7 +9,7 @@ } public NBTTagCompound createTag() { -@@ -142,7 +142,7 @@ +@@ -152,7 +152,7 @@ private void loadFromTag(DynamicLike dynamiclike) { this.rules.forEach((gamerules_gamerulekey, gamerules_gamerulevalue) -> { @@ -18,7 +18,7 @@ Objects.requireNonNull(gamerules_gamerulevalue); optional.ifPresent(gamerules_gamerulevalue::deserialize); -@@ -162,8 +162,8 @@ +@@ -172,8 +172,8 @@ } private static > void callVisitorCap(GameRules.GameRuleVisitor gamerules_gamerulevisitor, GameRules.GameRuleKey gamerules_gamerulekey, GameRules.GameRuleDefinition gamerules_gameruledefinition) { @@ -29,7 +29,7 @@ } public void assignFrom(GameRules gamerules, @Nullable MinecraftServer minecraftserver) { -@@ -255,7 +255,7 @@ +@@ -265,7 +265,7 @@ } public T createRule() { @@ -38,7 +38,7 @@ } public void callVisitor(GameRules.GameRuleVisitor gamerules_gamerulevisitor, GameRules.GameRuleKey gamerules_gamerulekey) { -@@ -285,7 +285,7 @@ +@@ -295,7 +295,7 @@ } @@ -47,7 +47,7 @@ public abstract String serialize(); -@@ -351,7 +351,7 @@ +@@ -361,7 +361,7 @@ } @Override @@ -56,7 +56,7 @@ this.value = Boolean.parseBoolean(s); } -@@ -416,7 +416,7 @@ +@@ -426,7 +426,7 @@ } @Override diff --git a/nms-patches/net/minecraft/world/level/block/BlockBeehive.patch b/nms-patches/net/minecraft/world/level/block/BlockBeehive.patch index 4377717ed..18699cd59 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockBeehive.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockBeehive.patch @@ -1,15 +1,15 @@ --- a/net/minecraft/world/level/block/BlockBeehive.java +++ b/net/minecraft/world/level/block/BlockBeehive.java -@@ -105,7 +105,7 @@ - EntityBee entitybee = (EntityBee) iterator.next(); - +@@ -112,7 +112,7 @@ if (entitybee.getTarget() == null) { -- entitybee.setTarget((EntityLiving) list1.get(world.random.nextInt(i))); -+ entitybee.setTarget((EntityLiving) list1.get(world.random.nextInt(i)), org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit + EntityHuman entityhuman = (EntityHuman) SystemUtils.getRandom(list1, world.random); + +- entitybee.setTarget(entityhuman); ++ entitybee.setTarget(entityhuman, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit } } } -@@ -331,4 +331,16 @@ +@@ -338,4 +338,16 @@ return super.updateShape(iblockdata, enumdirection, iblockdata1, generatoraccess, blockposition, blockposition1); } diff --git a/nms-patches/net/minecraft/world/level/block/BlockCampfire.patch b/nms-patches/net/minecraft/world/level/block/BlockCampfire.patch index e32ea1aef..36d555fff 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockCampfire.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockCampfire.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockCampfire.java +++ b/net/minecraft/world/level/block/BlockCampfire.java -@@ -46,6 +46,10 @@ +@@ -47,6 +47,10 @@ import net.minecraft.world.phys.shapes.VoxelShapeCollision; import net.minecraft.world.phys.shapes.VoxelShapes; @@ -11,7 +11,7 @@ public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged { protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 7.0D, 16.0D); -@@ -90,7 +94,9 @@ +@@ -91,7 +95,9 @@ @Override public void entityInside(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) { if ((Boolean) iblockdata.getValue(BlockCampfire.LIT) && entity instanceof EntityLiving && !EnchantmentManager.hasFrostWalker((EntityLiving) entity)) { @@ -21,7 +21,7 @@ } super.entityInside(iblockdata, world, blockposition, entity); -@@ -200,6 +206,11 @@ +@@ -201,6 +207,11 @@ BlockPosition blockposition = movingobjectpositionblock.getBlockPos(); if (!world.isClientSide && iprojectile.isOnFire() && iprojectile.mayInteract(world, blockposition) && !(Boolean) iblockdata.getValue(BlockCampfire.LIT) && !(Boolean) iblockdata.getValue(BlockCampfire.WATERLOGGED)) { diff --git a/nms-patches/net/minecraft/world/level/block/BlockChorusFlower.patch b/nms-patches/net/minecraft/world/level/block/BlockChorusFlower.patch index 6d0f4915d..f0b786528 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockChorusFlower.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockChorusFlower.patch @@ -1,15 +1,15 @@ --- a/net/minecraft/world/level/block/BlockChorusFlower.java +++ b/net/minecraft/world/level/block/BlockChorusFlower.java -@@ -18,6 +18,8 @@ - import net.minecraft.world.level.block.state.properties.BlockStateInteger; +@@ -20,6 +20,8 @@ import net.minecraft.world.phys.MovingObjectPositionBlock; + import net.minecraft.world.phys.shapes.VoxelShape; +import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit + public class BlockChorusFlower extends Block { public static final int DEAD_AGE = 5; -@@ -82,8 +84,12 @@ +@@ -90,8 +92,12 @@ } if (flag && allNeighborsEmpty(worldserver, blockposition1, (EnumDirection) null) && worldserver.isEmptyBlock(blockposition.above(2))) { @@ -24,7 +24,7 @@ } else if (i < 4) { j = randomsource.nextInt(4); if (flag1) { -@@ -97,18 +103,30 @@ +@@ -105,18 +111,30 @@ BlockPosition blockposition2 = blockposition.relative(enumdirection); if (worldserver.isEmptyBlock(blockposition2) && worldserver.isEmptyBlock(blockposition2.below()) && allNeighborsEmpty(worldserver, blockposition2, enumdirection.getOpposite())) { @@ -59,7 +59,7 @@ } } -@@ -245,6 +263,11 @@ +@@ -253,6 +271,11 @@ BlockPosition blockposition = movingobjectpositionblock.getBlockPos(); if (!world.isClientSide && iprojectile.mayInteract(world, blockposition) && iprojectile.getType().is(TagsEntity.IMPACT_PROJECTILES)) { diff --git a/nms-patches/net/minecraft/world/level/block/BlockCrops.patch b/nms-patches/net/minecraft/world/level/block/BlockCrops.patch index 25cf6f52a..5c823a473 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockCrops.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockCrops.patch @@ -27,7 +27,7 @@ } protected int getBonemealAgeIncrease(World world) { -@@ -149,7 +151,7 @@ +@@ -153,7 +155,7 @@ @Override public void entityInside(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) { diff --git a/nms-patches/net/minecraft/world/level/block/BlockDiodeAbstract.patch b/nms-patches/net/minecraft/world/level/block/BlockDiodeAbstract.patch index 16226cff4..e16bf4b0e 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockDiodeAbstract.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockDiodeAbstract.patch @@ -9,7 +9,7 @@ public abstract class BlockDiodeAbstract extends BlockFacingHorizontal { protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 2.0D, 16.0D); -@@ -46,8 +48,18 @@ +@@ -52,8 +54,18 @@ boolean flag1 = this.shouldTurnOn(worldserver, blockposition, iblockdata); if (flag && !flag1) { diff --git a/nms-patches/net/minecraft/world/level/block/BlockDispenser.patch b/nms-patches/net/minecraft/world/level/block/BlockDispenser.patch index 30344ab7f..d2060fabe 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockDispenser.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockDispenser.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockDispenser.java +++ b/net/minecraft/world/level/block/BlockDispenser.java -@@ -46,6 +46,7 @@ +@@ -48,6 +48,7 @@ object2objectopenhashmap.defaultReturnValue(new DispenseBehaviorItem()); }); private static final int TRIGGER_DURATION = 4; @@ -8,11 +8,20 @@ public static void registerBehavior(IMaterial imaterial, IDispenseBehavior idispensebehavior) { BlockDispenser.DISPENSER_REGISTRY.put(imaterial.asItem(), idispensebehavior); -@@ -89,6 +90,7 @@ - IDispenseBehavior idispensebehavior = this.getDispenseMethod(itemstack); +@@ -79,7 +80,7 @@ + } - if (idispensebehavior != IDispenseBehavior.NOOP) { -+ eventFired = false; // CraftBukkit - reset event status - tileentitydispenser.setItem(i, idispensebehavior.dispense(sourceblock, itemstack)); - } + public void dispenseFrom(WorldServer worldserver, IBlockData iblockdata, BlockPosition blockposition) { +- TileEntityDispenser tileentitydispenser = (TileEntityDispenser) worldserver.getBlockEntity(blockposition, TileEntityTypes.DISPENSER).orElse((Object) null); ++ TileEntityDispenser tileentitydispenser = (TileEntityDispenser) worldserver.getBlockEntity(blockposition, TileEntityTypes.DISPENSER).orElse(null); // CraftBukkit - decompile error + + if (tileentitydispenser == null) { + BlockDispenser.LOGGER.warn("Ignoring dispensing attempt for Dispenser without matching block entity at {}", blockposition); +@@ -95,6 +96,7 @@ + IDispenseBehavior idispensebehavior = this.getDispenseMethod(itemstack); + + if (idispensebehavior != IDispenseBehavior.NOOP) { ++ eventFired = false; // CraftBukkit - reset event status + tileentitydispenser.setItem(i, idispensebehavior.dispense(sourceblock, itemstack)); + } diff --git a/nms-patches/net/minecraft/world/level/block/BlockDropper.patch b/nms-patches/net/minecraft/world/level/block/BlockDropper.patch index 8c43e9f52..c0e22f8ba 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockDropper.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockDropper.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/level/block/BlockDropper.java +++ b/net/minecraft/world/level/block/BlockDropper.java -@@ -15,9 +15,15 @@ - import net.minecraft.world.level.block.state.BlockBase; +@@ -18,10 +18,16 @@ import net.minecraft.world.level.block.state.IBlockData; + import org.slf4j.Logger; +// CraftBukkit start +import net.minecraft.world.InventoryLargeChest; @@ -12,36 +12,46 @@ + public class BlockDropper extends BlockDispenser { + private static final Logger LOGGER = LogUtils.getLogger(); - private static final IDispenseBehavior DISPENSE_BEHAVIOUR = new DispenseBehaviorItem(); + private static final IDispenseBehavior DISPENSE_BEHAVIOUR = new DispenseBehaviorItem(true); // CraftBukkit public BlockDropper(BlockBase.Info blockbase_info) { super(blockbase_info); -@@ -52,8 +58,25 @@ - if (iinventory == null) { - itemstack1 = BlockDropper.DISPENSE_BEHAVIOUR.dispense(sourceblock, itemstack); - } else { -- itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, itemstack.copy().split(1), enumdirection.getOpposite()); -- if (itemstack1.isEmpty()) { -+ // CraftBukkit start - Fire event when pushing items into other inventories -+ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.copy().split(1)); -+ -+ org.bukkit.inventory.Inventory destinationInventory; -+ // Have to special case large chests as they work oddly -+ if (iinventory instanceof InventoryLargeChest) { -+ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); -+ } else { -+ destinationInventory = iinventory.getOwner().getInventory(); -+ } -+ -+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); -+ worldserver.getCraftServer().getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ return; -+ } -+ itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection.getOpposite()); -+ if (event.getItem().equals(oitemstack) && itemstack1.isEmpty()) { -+ // CraftBukkit end - itemstack1 = itemstack.copy(); - itemstack1.shrink(1); +@@ -39,7 +45,7 @@ + + @Override + public void dispenseFrom(WorldServer worldserver, IBlockData iblockdata, BlockPosition blockposition) { +- TileEntityDispenser tileentitydispenser = (TileEntityDispenser) worldserver.getBlockEntity(blockposition, TileEntityTypes.DROPPER).orElse((Object) null); ++ TileEntityDispenser tileentitydispenser = (TileEntityDispenser) worldserver.getBlockEntity(blockposition, TileEntityTypes.DROPPER).orElse(null); // CraftBukkit - decompile error + + if (tileentitydispenser == null) { + BlockDropper.LOGGER.warn("Ignoring dispensing attempt for Dropper without matching block entity at {}", blockposition); +@@ -60,8 +66,25 @@ + if (iinventory == null) { + itemstack1 = BlockDropper.DISPENSE_BEHAVIOUR.dispense(sourceblock, itemstack); } else { +- itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, itemstack.copy().split(1), enumdirection.getOpposite()); +- if (itemstack1.isEmpty()) { ++ // CraftBukkit start - Fire event when pushing items into other inventories ++ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.copy().split(1)); ++ ++ org.bukkit.inventory.Inventory destinationInventory; ++ // Have to special case large chests as they work oddly ++ if (iinventory instanceof InventoryLargeChest) { ++ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); ++ } else { ++ destinationInventory = iinventory.getOwner().getInventory(); ++ } ++ ++ InventoryMoveItemEvent event = new InventoryMoveItemEvent(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); ++ worldserver.getCraftServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return; ++ } ++ itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection.getOpposite()); ++ if (event.getItem().equals(oitemstack) && itemstack1.isEmpty()) { ++ // CraftBukkit end + itemstack1 = itemstack.copy(); + itemstack1.shrink(1); + } else { diff --git a/nms-patches/net/minecraft/world/level/block/BlockFluids.patch b/nms-patches/net/minecraft/world/level/block/BlockFluids.patch index 9ee557bcf..f8d578c4e 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockFluids.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockFluids.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockFluids.java +++ b/net/minecraft/world/level/block/BlockFluids.java -@@ -140,14 +140,20 @@ +@@ -142,14 +142,20 @@ if (world.getFluidState(blockposition1).is(TagsFluid.WATER)) { Block block = world.getFluidState(blockposition).isSource() ? Blocks.OBSIDIAN : Blocks.COBBLESTONE; diff --git a/nms-patches/net/minecraft/world/level/block/BlockRedstoneComparator.patch b/nms-patches/net/minecraft/world/level/block/BlockRedstoneComparator.patch index d9561c2b1..e38cdc8a1 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockRedstoneComparator.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockRedstoneComparator.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockRedstoneComparator.java +++ b/net/minecraft/world/level/block/BlockRedstoneComparator.java -@@ -26,6 +26,8 @@ +@@ -27,6 +27,8 @@ import net.minecraft.world.phys.MovingObjectPositionBlock; import net.minecraft.world.ticks.TickListPriority; @@ -9,7 +9,7 @@ public class BlockRedstoneComparator extends BlockDiodeAbstract implements ITileEntity { public static final BlockStateEnum MODE = BlockProperties.MODE_COMPARATOR; -@@ -97,7 +99,8 @@ +@@ -103,7 +105,8 @@ @Nullable private EntityItemFrame getItemFrame(World world, EnumDirection enumdirection, BlockPosition blockposition) { @@ -19,7 +19,7 @@ return entityitemframe != null && entityitemframe.getDirection() == enumdirection; }); -@@ -152,8 +155,18 @@ +@@ -158,8 +161,18 @@ boolean flag1 = (Boolean) iblockdata.getValue(BlockRedstoneComparator.POWERED); if (flag1 && !flag) { diff --git a/nms-patches/net/minecraft/world/level/block/BlockRedstoneTorch.patch b/nms-patches/net/minecraft/world/level/block/BlockRedstoneTorch.patch index bf8c4cbc3..e96e53508 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockRedstoneTorch.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockRedstoneTorch.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockRedstoneTorch.java +++ b/net/minecraft/world/level/block/BlockRedstoneTorch.java -@@ -17,6 +17,8 @@ +@@ -18,6 +18,8 @@ import net.minecraft.world.level.block.state.properties.BlockProperties; import net.minecraft.world.level.block.state.properties.BlockStateBoolean; @@ -9,7 +9,7 @@ public class BlockRedstoneTorch extends BlockTorch { public static final BlockStateBoolean LIT = BlockProperties.LIT; -@@ -77,8 +79,24 @@ +@@ -78,8 +80,24 @@ list.remove(0); } @@ -34,7 +34,7 @@ worldserver.setBlock(blockposition, (IBlockData) iblockdata.setValue(BlockRedstoneTorch.LIT, false), 3); if (isToggledTooFrequently(worldserver, blockposition, true)) { worldserver.levelEvent(1502, blockposition, 0); -@@ -86,6 +104,15 @@ +@@ -87,6 +105,15 @@ } } } else if (!flag && !isToggledTooFrequently(worldserver, blockposition, false)) { diff --git a/nms-patches/net/minecraft/world/level/block/BlockSign.patch b/nms-patches/net/minecraft/world/level/block/BlockSign.patch index e67f645a7..fa7a32b1a 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockSign.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockSign.patch @@ -6,10 +6,10 @@ } else if (!this.otherPlayerIsEditingSign(entityhuman, tileentitysign) && entityhuman.mayBuild() && this.hasEditableText(entityhuman, tileentitysign, flag1)) { - this.openTextEdit(entityhuman, tileentitysign, flag1); + this.openTextEdit(entityhuman, tileentitysign, flag1, org.bukkit.event.player.PlayerSignOpenEvent.Cause.INTERACT); // CraftBukkit - return EnumInteractionResult.SUCCESS; + return this.getInteractionResult(flag); } else { return EnumInteractionResult.PASS; -@@ -164,6 +164,15 @@ +@@ -168,6 +168,15 @@ } public void openTextEdit(EntityHuman entityhuman, TileEntitySign tileentitysign, boolean flag) { diff --git a/nms-patches/net/minecraft/world/level/block/BlockSponge.patch b/nms-patches/net/minecraft/world/level/block/BlockSponge.patch index 78d23a4bd..4607f52a3 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockSponge.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockSponge.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockSponge.java +++ b/net/minecraft/world/level/block/BlockSponge.java -@@ -9,6 +9,13 @@ +@@ -12,6 +12,13 @@ import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.material.Fluid; @@ -14,7 +14,7 @@ public class BlockSponge extends Block { public static final int MAX_DEPTH = 6; -@@ -41,7 +48,8 @@ +@@ -44,7 +51,8 @@ } private boolean removeWaterBreadthFirstSearch(World world, BlockPosition blockposition) { @@ -24,7 +24,7 @@ EnumDirection[] aenumdirection = BlockSponge.ALL_DIRECTIONS; int i = aenumdirection.length; -@@ -55,8 +63,10 @@ +@@ -58,8 +66,10 @@ if (blockposition1.equals(blockposition)) { return true; } else { @@ -37,12 +37,12 @@ if (!fluid.is(TagsFluid.WATER)) { return false; -@@ -66,27 +76,64 @@ +@@ -69,27 +79,64 @@ if (block instanceof IFluidSource) { IFluidSource ifluidsource = (IFluidSource) block; -- if (!ifluidsource.pickupBlock(world, blockposition1, iblockdata).isEmpty()) { -+ if (!ifluidsource.pickupBlock(blockList, blockposition1, iblockdata).isEmpty()) { // CraftBukkit +- if (!ifluidsource.pickupBlock((EntityHuman) null, world, blockposition1, iblockdata).isEmpty()) { ++ if (!ifluidsource.pickupBlock((EntityHuman) null, blockList, blockposition1, iblockdata).isEmpty()) { // CraftBukkit return true; } } @@ -89,7 +89,7 @@ + Fluid fluid = world.getFluidState(blockposition1); + + if (fluid.is(TagsFluid.WATER)) { -+ if (iblockdata.getBlock() instanceof IFluidSource && !((IFluidSource) iblockdata.getBlock()).pickupBlock(blockList, blockposition1, iblockdata).isEmpty()) { ++ if (iblockdata.getBlock() instanceof IFluidSource && !((IFluidSource) iblockdata.getBlock()).pickupBlock((EntityHuman) null, blockList, blockposition1, iblockdata).isEmpty()) { + // NOP + } else if (iblockdata.getBlock() instanceof BlockFluids) { + // NOP diff --git a/nms-patches/net/minecraft/world/level/block/BlockTurtleEgg.patch b/nms-patches/net/minecraft/world/level/block/BlockTurtleEgg.patch index da3b4f904..510eeca50 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockTurtleEgg.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockTurtleEgg.patch @@ -33,7 +33,7 @@ this.decreaseEggs(world, blockposition, iblockdata); } -@@ -91,9 +110,19 @@ +@@ -91,10 +110,20 @@ int i = (Integer) iblockdata.getValue(BlockTurtleEgg.HATCH); if (i < 2) { @@ -45,6 +45,7 @@ worldserver.playSound((EntityHuman) null, blockposition, SoundEffects.TURTLE_EGG_CRACK, SoundCategory.BLOCKS, 0.7F, 0.9F + randomsource.nextFloat() * 0.2F); - worldserver.setBlock(blockposition, (IBlockData) iblockdata.setValue(BlockTurtleEgg.HATCH, i + 1), 2); + // worldserver.setBlock(blockposition, (IBlockData) iblockdata.setValue(BlockTurtleEgg.HATCH, i + 1), 2); // CraftBukkit - handled above + worldserver.gameEvent(GameEvent.BLOCK_CHANGE, blockposition, GameEvent.a.of(iblockdata)); } else { + // CraftBukkit start - Call BlockFadeEvent + if (CraftEventFactory.callBlockFadeEvent(worldserver, blockposition, Blocks.AIR.defaultBlockState()).isCancelled()) { @@ -53,8 +54,8 @@ + // CraftBukkit end worldserver.playSound((EntityHuman) null, blockposition, SoundEffects.TURTLE_EGG_HATCH, SoundCategory.BLOCKS, 0.7F, 0.9F + randomsource.nextFloat() * 0.2F); worldserver.removeBlock(blockposition, false); - -@@ -105,7 +134,7 @@ + worldserver.gameEvent(GameEvent.BLOCK_DESTROY, blockposition, GameEvent.a.of(iblockdata)); +@@ -107,7 +136,7 @@ entityturtle.setAge(-24000); entityturtle.setHomePos(blockposition); entityturtle.moveTo((double) blockposition.getX() + 0.3D + (double) j * 0.2D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.3D, 0.0F, 0.0F); diff --git a/nms-patches/net/minecraft/world/level/block/ChiseledBookShelfBlock.patch b/nms-patches/net/minecraft/world/level/block/ChiseledBookShelfBlock.patch deleted file mode 100644 index 7a78a6395..000000000 --- a/nms-patches/net/minecraft/world/level/block/ChiseledBookShelfBlock.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/net/minecraft/world/level/block/ChiseledBookShelfBlock.java -+++ b/net/minecraft/world/level/block/ChiseledBookShelfBlock.java -@@ -128,7 +128,7 @@ - } - } - -- private static int getHitSlot(Vec2F vec2f) { -+ public static int getHitSlot(Vec2F vec2f) { //CraftBukkit - private -> public - int i = vec2f.y >= 0.5F ? 0 : 1; - int j = getSection(vec2f.x); - -@@ -190,7 +190,7 @@ - - Objects.requireNonNull(blockstatelist_a); - list.forEach((iblockstate) -> { -- blockstatelist_a.add(iblockstate); -+ blockstatelist_a.add((BlockStateBoolean) iblockstate); // CraftBukkit - Decompile error - }); - } - diff --git a/nms-patches/net/minecraft/world/level/block/PowderSnowBlock.patch b/nms-patches/net/minecraft/world/level/block/PowderSnowBlock.patch index 05e0dfced..52b489144 100644 --- a/nms-patches/net/minecraft/world/level/block/PowderSnowBlock.patch +++ b/nms-patches/net/minecraft/world/level/block/PowderSnowBlock.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/PowderSnowBlock.java +++ b/net/minecraft/world/level/block/PowderSnowBlock.java -@@ -69,7 +69,12 @@ +@@ -70,7 +70,12 @@ entity.setIsInPowderSnow(true); if (!world.isClientSide) { diff --git a/nms-patches/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.patch b/nms-patches/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.patch index 0b2f7a74e..85e86180b 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java -@@ -17,12 +17,54 @@ - import net.minecraft.world.level.block.state.properties.BlockStateBoolean; +@@ -18,12 +18,54 @@ + import net.minecraft.world.level.gameevent.GameEvent; import org.slf4j.Logger; +// CraftBukkit start @@ -55,7 +55,7 @@ public ChiseledBookShelfBlockEntity(BlockPosition blockposition, IBlockData iblockdata) { super(TileEntityTypes.CHISELED_BOOKSHELF, blockposition, iblockdata); -@@ -50,6 +92,7 @@ +@@ -52,6 +94,7 @@ @Override public void load(NBTTagCompound nbttagcompound) { @@ -63,7 +63,7 @@ this.items.clear(); ContainerUtil.loadAllItems(nbttagcompound, this.items); this.lastInteractedSlot = nbttagcompound.getInt("last_interacted_slot"); -@@ -91,7 +134,7 @@ +@@ -93,7 +136,7 @@ this.items.set(i, ItemStack.EMPTY); if (!itemstack.isEmpty()) { @@ -72,16 +72,16 @@ } return itemstack; -@@ -106,7 +149,7 @@ +@@ -108,7 +151,7 @@ public void setItem(int i, ItemStack itemstack) { if (itemstack.is(TagsItem.BOOKSHELF_BOOKS)) { this.items.set(i, itemstack); - this.updateState(i); + if (level != null) this.updateState(i); // CraftBukkit - SPIGOT-7381: check for null world + } else if (itemstack.isEmpty()) { + this.removeItem(i, 1); } - - } -@@ -120,7 +163,7 @@ +@@ -124,7 +167,7 @@ @Override public int getMaxStackSize() { diff --git a/nms-patches/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.patch b/nms-patches/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.patch index 398b38b68..18579c8be 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.patch @@ -3,7 +3,7 @@ @@ -32,14 +32,18 @@ public SculkCatalystBlockEntity(BlockPosition blockposition, IBlockData iblockdata) { super(TileEntityTypes.SCULK_CATALYST, blockposition, iblockdata); - this.catalystListener = new SculkCatalystBlockEntity.a(iblockdata, new BlockPositionSource(blockposition)); + this.catalystListener = new SculkCatalystBlockEntity.CatalystListener(iblockdata, new BlockPositionSource(blockposition)); + catalystListener.level = level; // CraftBukkit } @@ -25,14 +25,5 @@ private final PositionSource positionSource; + private World level; // CraftBukkit - public a(IBlockData iblockdata, PositionSource positionsource) { + public CatalystListener(IBlockData iblockdata, PositionSource positionsource) { this.blockState = iblockdata; -@@ -116,7 +121,7 @@ - return this.sculkSpreader; - } - -- private void bloom(WorldServer worldserver, BlockPosition blockposition, IBlockData iblockdata, RandomSource randomsource) { -+ public void bloom(WorldServer worldserver, BlockPosition blockposition, IBlockData iblockdata, RandomSource randomsource) { - worldserver.setBlock(blockposition, (IBlockData) iblockdata.setValue(SculkCatalystBlock.PULSE, true), 3); - worldserver.scheduleTick(blockposition, iblockdata.getBlock(), 8); - worldserver.sendParticles(Particles.SCULK_SOUL, (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 1.15D, (double) blockposition.getZ() + 0.5D, 2, 0.2D, 0.0D, 0.2D, 0.0D); diff --git a/nms-patches/net/minecraft/world/level/block/entity/TileEntityBeacon.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntityBeacon.patch index f44d969f7..890bb9706 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntityBeacon.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntityBeacon.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/TileEntityBeacon.java +++ b/net/minecraft/world/level/block/entity/TileEntityBeacon.java -@@ -38,6 +38,11 @@ +@@ -40,6 +40,11 @@ import net.minecraft.world.level.levelgen.HeightMap; import net.minecraft.world.phys.AxisAlignedBB; @@ -12,7 +12,7 @@ public class TileEntityBeacon extends TileEntity implements ITileInventory, INamableTileEntity { private static final int MAX_LEVELS = 4; -@@ -61,6 +66,15 @@ +@@ -65,6 +70,15 @@ public IChatBaseComponent name; public ChestLock lockKey; private final IContainerProperties dataAccess; @@ -26,9 +26,9 @@ + } + // CraftBukkit end - public TileEntityBeacon(BlockPosition blockposition, IBlockData iblockdata) { - super(TileEntityTypes.BEACON, blockposition, iblockdata); -@@ -236,39 +250,78 @@ + @Nullable + static MobEffectList filterEffect(@Nullable MobEffectList mobeffectlist) { +@@ -245,39 +259,78 @@ super.setRemoved(); } @@ -117,17 +117,20 @@ public static void playSound(World world, BlockPosition blockposition, SoundEffect soundeffect) { world.playSound((EntityHuman) null, blockposition, soundeffect, SoundCategory.BLOCKS, 1.0F, 1.0F); } -@@ -297,8 +350,11 @@ - @Override - public void load(NBTTagCompound nbttagcompound) { +@@ -312,7 +365,7 @@ + if (nbttagcompound.contains(s, 8)) { + MinecraftKey minecraftkey = MinecraftKey.tryParse(nbttagcompound.getString(s)); + +- return filterEffect((MobEffectList) BuiltInRegistries.MOB_EFFECT.get(minecraftkey)); ++ return (MobEffectList) BuiltInRegistries.MOB_EFFECT.get(minecraftkey); // CraftBukkit - persist manually set non-default beacon effects (SPIGOT-3598) + } else { + return null; + } +@@ -323,6 +376,7 @@ super.load(nbttagcompound); -- this.primaryPower = getValidEffectById(nbttagcompound.getInt("Primary")); -- this.secondaryPower = getValidEffectById(nbttagcompound.getInt("Secondary")); -+ // CraftBukkit start - persist manually set non-default beacon effects (SPIGOT-3598) -+ this.primaryPower = MobEffectList.byId(nbttagcompound.getInt("Primary")); -+ this.secondaryPower = MobEffectList.byId(nbttagcompound.getInt("Secondary")); -+ this.levels = nbttagcompound.getInt("Levels"); // SPIGOT-5053, use where available -+ // CraftBukkit end + this.primaryPower = loadEffect(nbttagcompound, "primary_effect"); + this.secondaryPower = loadEffect(nbttagcompound, "secondary_effect"); ++ this.levels = nbttagcompound.getInt("Levels"); // CraftBukkit - SPIGOT-5053, use where available if (nbttagcompound.contains("CustomName", 8)) { this.name = IChatBaseComponent.ChatSerializer.fromJson(nbttagcompound.getString("CustomName")); } diff --git a/nms-patches/net/minecraft/world/level/block/entity/TileEntityCampfire.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntityCampfire.patch index fa7e0db83..21a94892e 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntityCampfire.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntityCampfire.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/TileEntityCampfire.java +++ b/net/minecraft/world/level/block/entity/TileEntityCampfire.java -@@ -25,6 +25,14 @@ +@@ -26,6 +26,14 @@ import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.gameevent.GameEvent; @@ -15,7 +15,7 @@ public class TileEntityCampfire extends TileEntity implements Clearable { private static final int BURN_COOL_SPEED = 2; -@@ -59,6 +67,20 @@ +@@ -60,6 +68,20 @@ }).orElse(itemstack); if (itemstack1.isItemEnabled(world.enabledFeatures())) { @@ -36,7 +36,7 @@ InventoryUtils.dropItemStack(world, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), itemstack1); tileentitycampfire.items.set(i, ItemStack.EMPTY); world.sendBlockUpdated(blockposition, iblockdata, iblockdata, 3); -@@ -171,7 +193,11 @@ +@@ -172,7 +194,11 @@ ItemStack itemstack1 = (ItemStack) this.items.get(j); if (itemstack1.isEmpty()) { diff --git a/nms-patches/net/minecraft/world/level/block/entity/TileEntityFurnace.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntityFurnace.patch index 1ffcfd054..a23e69cbf 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntityFurnace.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntityFurnace.patch @@ -18,7 +18,7 @@ +import org.bukkit.inventory.CookingRecipe; +// CraftBukkit end + - public abstract class TileEntityFurnace extends TileEntityContainer implements IWorldInventory, RecipeHolder, AutoRecipeOutput { + public abstract class TileEntityFurnace extends TileEntityContainer implements IWorldInventory, RecipeCraftingHolder, AutoRecipeOutput { protected static final int SLOT_INPUT = 0; @@ -115,7 +129,7 @@ @@ -72,18 +72,18 @@ return item.builtInRegistryHolder().is(TagsItem.NON_FLAMMABLE_WOOD); } @@ -271,7 +319,7 @@ - IRecipe irecipe; + RecipeHolder recipeholder; if (flag2) { -- irecipe = (IRecipe) tileentityfurnace.quickCheck.getRecipeFor(tileentityfurnace, world).orElse((Object) null); -+ irecipe = (IRecipe) tileentityfurnace.quickCheck.getRecipeFor(tileentityfurnace, world).orElse(null); // CraftBukkit - decompile error +- recipeholder = (RecipeHolder) tileentityfurnace.quickCheck.getRecipeFor(tileentityfurnace, world).orElse((Object) null); ++ recipeholder = (RecipeHolder) tileentityfurnace.quickCheck.getRecipeFor(tileentityfurnace, world).orElse(null); // CraftBukkit - decompile error } else { - irecipe = null; + recipeholder = null; } @@ -279,9 +327,20 @@ int i = tileentityfurnace.getMaxStackSize(); - if (!tileentityfurnace.isLit() && canBurn(world.registryAccess(), irecipe, tileentityfurnace.items, i)) { + if (!tileentityfurnace.isLit() && canBurn(world.registryAccess(), recipeholder, tileentityfurnace.items, i)) { - tileentityfurnace.litTime = tileentityfurnace.getBurnDuration(itemstack); + // CraftBukkit start + CraftItemStack fuel = CraftItemStack.asCraftMirror(itemstack); @@ -106,11 +106,11 @@ @@ -297,11 +356,23 @@ } - if (tileentityfurnace.isLit() && canBurn(world.registryAccess(), irecipe, tileentityfurnace.items, i)) { + if (tileentityfurnace.isLit() && canBurn(world.registryAccess(), recipeholder, tileentityfurnace.items, i)) { + // CraftBukkit start -+ if (irecipe != null && tileentityfurnace.cookingProgress == 0) { ++ if (recipeholder != null && tileentityfurnace.cookingProgress == 0) { + CraftItemStack source = CraftItemStack.asCraftMirror(tileentityfurnace.items.get(0)); -+ CookingRecipe recipe = (CookingRecipe) irecipe.toBukkitRecipe(); ++ CookingRecipe recipe = (CookingRecipe) recipeholder.toBukkitRecipe(); + + FurnaceStartSmeltEvent event = new FurnaceStartSmeltEvent(CraftBlock.at(world, blockposition), source, recipe); + world.getCraftServer().getPluginManager().callEvent(event); @@ -123,20 +123,20 @@ if (tileentityfurnace.cookingProgress == tileentityfurnace.cookingTotalTime) { tileentityfurnace.cookingProgress = 0; tileentityfurnace.cookingTotalTime = getTotalCookTime(world, tileentityfurnace); -- if (burn(world.registryAccess(), irecipe, tileentityfurnace.items, i)) { -+ if (burn(tileentityfurnace.level, tileentityfurnace.worldPosition, world.registryAccess(), irecipe, tileentityfurnace.items, i)) { // CraftBukkit - tileentityfurnace.setRecipeUsed(irecipe); +- if (burn(world.registryAccess(), recipeholder, tileentityfurnace.items, i)) { ++ if (burn(tileentityfurnace.level, tileentityfurnace.worldPosition, world.registryAccess(), recipeholder, tileentityfurnace.items, i)) { // CraftBukkit + tileentityfurnace.setRecipeUsed(recipeholder); } @@ -340,17 +411,44 @@ } } -- private static boolean burn(IRegistryCustom iregistrycustom, @Nullable IRecipe irecipe, NonNullList nonnulllist, int i) { -+ private static boolean burn(World world, BlockPosition blockposition, IRegistryCustom iregistrycustom, @Nullable IRecipe irecipe, NonNullList nonnulllist, int i) { // CraftBukkit - if (irecipe != null && canBurn(iregistrycustom, irecipe, nonnulllist, i)) { +- private static boolean burn(IRegistryCustom iregistrycustom, @Nullable RecipeHolder recipeholder, NonNullList nonnulllist, int i) { ++ private static boolean burn(World world, BlockPosition blockposition, IRegistryCustom iregistrycustom, @Nullable RecipeHolder recipeholder, NonNullList nonnulllist, int i) { // CraftBukkit + if (recipeholder != null && canBurn(iregistrycustom, recipeholder, nonnulllist, i)) { ItemStack itemstack = (ItemStack) nonnulllist.get(0); - ItemStack itemstack1 = irecipe.getResultItem(iregistrycustom); + ItemStack itemstack1 = recipeholder.value().getResultItem(iregistrycustom); ItemStack itemstack2 = (ItemStack) nonnulllist.get(2); + // CraftBukkit start - fire FurnaceSmeltEvent @@ -174,45 +174,44 @@ if (itemstack.is(Blocks.WET_SPONGE.asItem()) && !((ItemStack) nonnulllist.get(1)).isEmpty() && ((ItemStack) nonnulllist.get(1)).is(Items.BUCKET)) { nonnulllist.set(1, new ItemStack(Items.WATER_BUCKET)); -@@ -374,7 +472,7 @@ +@@ -374,6 +472,7 @@ } private static int getTotalCookTime(World world, TileEntityFurnace tileentityfurnace) { -- return (Integer) tileentityfurnace.quickCheck.getRecipeFor(tileentityfurnace, world).map(RecipeCooking::getCookingTime).orElse(200); -+ return (world != null) ? (Integer) tileentityfurnace.quickCheck.getRecipeFor(tileentityfurnace, world).map(RecipeCooking::getCookingTime).orElse(200) : 200; // CraftBukkit - SPIGOT-4302 - } - - public static boolean isFuel(ItemStack itemstack) { -@@ -493,8 +591,8 @@ ++ if (world == null) return 200; // CraftBukkit - SPIGOT-4302 + return (Integer) tileentityfurnace.quickCheck.getRecipeFor(tileentityfurnace, world).map((recipeholder) -> { + return ((RecipeCooking) recipeholder.value()).getCookingTime(); + }).orElse(200); +@@ -495,8 +594,8 @@ @Override public void awardUsedRecipes(EntityHuman entityhuman, List list) {} - public void awardUsedRecipesAndPopExperience(EntityPlayer entityplayer) { -- List> list = this.getRecipesToAwardAndPopExperience(entityplayer.serverLevel(), entityplayer.position()); +- List> list = this.getRecipesToAwardAndPopExperience(entityplayer.serverLevel(), entityplayer.position()); + public void awardUsedRecipesAndPopExperience(EntityPlayer entityplayer, ItemStack itemstack, int amount) { // CraftBukkit -+ List> list = this.getRecipesToAwardAndPopExperience(entityplayer.serverLevel(), entityplayer.position(), this.worldPosition, entityplayer, itemstack, amount); // CraftBukkit ++ List> list = this.getRecipesToAwardAndPopExperience(entityplayer.serverLevel(), entityplayer.position(), this.worldPosition, entityplayer, itemstack, amount); // CraftBukkit entityplayer.awardRecipes(list); Iterator iterator = list.iterator(); -@@ -511,6 +609,12 @@ +@@ -513,6 +612,12 @@ } - public List> getRecipesToAwardAndPopExperience(WorldServer worldserver, Vec3D vec3d) { + public List> getRecipesToAwardAndPopExperience(WorldServer worldserver, Vec3D vec3d) { + // CraftBukkit start + return this.getRecipesToAwardAndPopExperience(worldserver, vec3d, this.worldPosition, null, null, 0); + } + -+ public List> getRecipesToAwardAndPopExperience(WorldServer worldserver, Vec3D vec3d, BlockPosition blockposition, EntityPlayer entityplayer, ItemStack itemstack, int amount) { ++ public List> getRecipesToAwardAndPopExperience(WorldServer worldserver, Vec3D vec3d, BlockPosition blockposition, EntityPlayer entityplayer, ItemStack itemstack, int amount) { + // CraftBukkit end - List> list = Lists.newArrayList(); + List> list = Lists.newArrayList(); ObjectIterator objectiterator = this.recipesUsed.object2IntEntrySet().iterator(); -@@ -519,14 +623,14 @@ +@@ -521,14 +626,14 @@ - worldserver.getRecipeManager().byKey((MinecraftKey) entry.getKey()).ifPresent((irecipe) -> { - list.add(irecipe); -- createExperience(worldserver, vec3d, entry.getIntValue(), ((RecipeCooking) irecipe).getExperience()); -+ createExperience(worldserver, vec3d, entry.getIntValue(), ((RecipeCooking) irecipe).getExperience(), blockposition, entityplayer, itemstack, amount); // CraftBukkit + worldserver.getRecipeManager().byKey((MinecraftKey) entry.getKey()).ifPresent((recipeholder) -> { + list.add(recipeholder); +- createExperience(worldserver, vec3d, entry.getIntValue(), ((RecipeCooking) recipeholder.value()).getExperience()); ++ createExperience(worldserver, vec3d, entry.getIntValue(), ((RecipeCooking) recipeholder.value()).getExperience(), blockposition, entityplayer, itemstack, amount); // CraftBukkit }); } @@ -224,7 +223,7 @@ int j = MathHelper.floor((float) i * f); float f1 = MathHelper.frac((float) i * f); -@@ -534,6 +638,17 @@ +@@ -536,6 +641,17 @@ ++j; } diff --git a/nms-patches/net/minecraft/world/level/block/entity/TileEntityHopper.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntityHopper.patch index 3f8467ca7..31cee6b13 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntityHopper.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntityHopper.patch @@ -159,7 +159,7 @@ ItemStack itemstack = entityitem.getItem().copy(); ItemStack itemstack1 = addItem((IInventory) null, iinventory, itemstack, (EnumDirection) null); -@@ -366,16 +468,40 @@ +@@ -367,16 +469,40 @@ return itemstack; } diff --git a/nms-patches/net/minecraft/world/level/block/entity/TileEntityJukeBox.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntityJukeBox.patch index d5579c182..2b370eee3 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntityJukeBox.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntityJukeBox.patch @@ -57,7 +57,7 @@ public TileEntityJukeBox(BlockPosition blockposition, IBlockData iblockdata) { super(TileEntityTypes.JUKEBOX, blockposition, iblockdata); -@@ -150,7 +193,7 @@ +@@ -152,7 +195,7 @@ @Override public int getMaxStackSize() { @@ -66,7 +66,7 @@ } @Override -@@ -203,7 +246,11 @@ +@@ -205,7 +248,11 @@ @VisibleForTesting public void setRecordWithoutPlaying(ItemStack itemstack) { this.items.set(0, itemstack); diff --git a/nms-patches/net/minecraft/world/level/block/entity/TileEntityShulkerBox.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntityShulkerBox.patch index 60667be8f..56eb39fb5 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntityShulkerBox.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntityShulkerBox.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/TileEntityShulkerBox.java +++ b/net/minecraft/world/level/block/entity/TileEntityShulkerBox.java -@@ -31,6 +31,11 @@ +@@ -32,6 +32,11 @@ import net.minecraft.world.phys.AxisAlignedBB; import net.minecraft.world.phys.Vec3D; @@ -12,7 +12,7 @@ public class TileEntityShulkerBox extends TileEntityLootable implements IWorldInventory { public static final int COLUMNS = 9; -@@ -50,6 +55,37 @@ +@@ -51,6 +56,37 @@ @Nullable private final EnumColor color; @@ -50,7 +50,7 @@ public TileEntityShulkerBox(@Nullable EnumColor enumcolor, BlockPosition blockposition, IBlockData iblockdata) { super(TileEntityTypes.SHULKER_BOX, blockposition, iblockdata); this.itemStacks = NonNullList.withSize(27, ItemStack.EMPTY); -@@ -162,6 +198,7 @@ +@@ -172,6 +208,7 @@ } ++this.openCount; @@ -58,7 +58,7 @@ this.level.blockEvent(this.worldPosition, this.getBlockState().getBlock(), 1, this.openCount); if (this.openCount == 1) { this.level.gameEvent((Entity) entityhuman, GameEvent.CONTAINER_OPEN, this.worldPosition); -@@ -175,6 +212,7 @@ +@@ -185,6 +222,7 @@ public void stopOpen(EntityHuman entityhuman) { if (!this.remove && !entityhuman.isSpectator()) { --this.openCount; diff --git a/nms-patches/net/minecraft/world/item/ItemSkullPlayer.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntitySkull.patch similarity index 65% rename from nms-patches/net/minecraft/world/item/ItemSkullPlayer.patch rename to nms-patches/net/minecraft/world/level/block/entity/TileEntitySkull.patch index 7578b47a4..dbd107e0e 100644 --- a/nms-patches/net/minecraft/world/item/ItemSkullPlayer.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntitySkull.patch @@ -1,9 +1,9 @@ ---- a/net/minecraft/world/item/ItemSkullPlayer.java -+++ b/net/minecraft/world/item/ItemSkullPlayer.java -@@ -51,6 +51,16 @@ - TileEntitySkull.updateGameprofile(gameprofile, (gameprofile1) -> { - nbttagcompound.put("SkullOwner", GameProfileSerializer.writeGameProfile(new NBTTagCompound(), gameprofile1)); - }); +--- a/net/minecraft/world/level/block/entity/TileEntitySkull.java ++++ b/net/minecraft/world/level/block/entity/TileEntitySkull.java +@@ -173,6 +173,16 @@ + + if (!SystemUtils.isBlank(s)) { + resolveGameProfile(nbttagcompound, s); + // CraftBukkit start + } else { + net.minecraft.nbt.NBTTagList textures = nbttagcompound.getCompound("SkullOwner").getCompound("Properties").getList("textures", 10); // Safe due to method contracts diff --git a/nms-patches/net/minecraft/world/level/block/piston/BlockPiston.patch b/nms-patches/net/minecraft/world/level/block/piston/BlockPiston.patch index 76375ba23..af1b07bc3 100644 --- a/nms-patches/net/minecraft/world/level/block/piston/BlockPiston.patch +++ b/nms-patches/net/minecraft/world/level/block/piston/BlockPiston.patch @@ -34,10 +34,10 @@ world.blockEvent(blockposition, this, b0, enumdirection.get3DDataValue()); } -@@ -317,6 +337,48 @@ +@@ -318,6 +338,48 @@ IBlockData[] aiblockdata = new IBlockData[list.size() + list2.size()]; EnumDirection enumdirection1 = flag ? enumdirection : enumdirection.getOpposite(); - int j = 0; + int i = 0; + // CraftBukkit start + final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); + @@ -82,4 +82,4 @@ + // CraftBukkit end BlockPosition blockposition3; - int k; + int j; diff --git a/nms-patches/net/minecraft/world/level/chunk/storage/RegionFileCache.patch b/nms-patches/net/minecraft/world/level/chunk/storage/RegionFileCache.patch index 139e55385..d4050c646 100644 --- a/nms-patches/net/minecraft/world/level/chunk/storage/RegionFileCache.patch +++ b/nms-patches/net/minecraft/world/level/chunk/storage/RegionFileCache.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/storage/RegionFileCache.java +++ b/net/minecraft/world/level/chunk/storage/RegionFileCache.java -@@ -29,7 +29,7 @@ +@@ -30,7 +30,7 @@ this.sync = flag; } @@ -9,7 +9,7 @@ long i = ChunkCoordIntPair.asLong(chunkcoordintpair.getRegionX(), chunkcoordintpair.getRegionZ()); RegionFile regionfile = (RegionFile) this.regionCache.getAndMoveToFirst(i); -@@ -44,6 +44,7 @@ +@@ -45,6 +45,7 @@ Path path = this.folder; int j = chunkcoordintpair.getRegionX(); Path path1 = path.resolve("r." + j + "." + chunkcoordintpair.getRegionZ() + ".mca"); @@ -17,7 +17,7 @@ RegionFile regionfile1 = new RegionFile(path1, this.folder, this.sync); this.regionCache.putAndMoveToFirst(i, regionfile1); -@@ -53,7 +54,12 @@ +@@ -54,7 +55,12 @@ @Nullable public NBTTagCompound read(ChunkCoordIntPair chunkcoordintpair) throws IOException { @@ -31,7 +31,7 @@ DataInputStream datainputstream = regionfile.getChunkDataInputStream(chunkcoordintpair); NBTTagCompound nbttagcompound; -@@ -93,7 +99,12 @@ +@@ -94,7 +100,12 @@ } public void scanChunk(ChunkCoordIntPair chunkcoordintpair, StreamTagVisitor streamtagvisitor) throws IOException { @@ -45,7 +45,7 @@ DataInputStream datainputstream = regionfile.getChunkDataInputStream(chunkcoordintpair); try { -@@ -119,7 +130,7 @@ +@@ -120,7 +131,7 @@ } protected void write(ChunkCoordIntPair chunkcoordintpair, @Nullable NBTTagCompound nbttagcompound) throws IOException { diff --git a/nms-patches/net/minecraft/world/level/dimension/end/EnderDragonBattle.patch b/nms-patches/net/minecraft/world/level/dimension/end/EnderDragonBattle.patch index 92fd71697..66b3002c0 100644 --- a/nms-patches/net/minecraft/world/level/dimension/end/EnderDragonBattle.patch +++ b/nms-patches/net/minecraft/world/level/dimension/end/EnderDragonBattle.patch @@ -17,7 +17,7 @@ this.gateways.addAll((Collection) enderdragonbattle_a.gateways.orElseGet(() -> { ObjectArrayList objectarraylist = new ObjectArrayList(ContiguousSet.create(Range.closedOpen(0, 20), DiscreteDomain.integers())); -@@ -505,7 +505,7 @@ +@@ -510,7 +510,7 @@ return this.previouslyKilled; } @@ -26,7 +26,7 @@ if (this.dragonKilled && this.respawnStage == null) { BlockPosition blockposition = this.portalLocation; -@@ -532,19 +532,19 @@ +@@ -537,19 +537,19 @@ List list1 = this.level.getEntitiesOfClass(EntityEnderCrystal.class, new AxisAlignedBB(blockposition1.relative(enumdirection, 2))); if (list1.isEmpty()) { @@ -45,12 +45,12 @@ + return false; // CraftBukkit - return value } -- private void respawnDragon(List list) { -+ public boolean respawnDragon(List list) { // PAIL private -> public // CraftBukkit - return boolean +- public void respawnDragon(List list) { ++ public boolean respawnDragon(List list) { // CraftBukkit - return boolean if (this.dragonKilled && this.respawnStage == null) { for (ShapeDetector.ShapeDetectorCollection shapedetector_shapedetectorcollection = this.findExitPortal(); shapedetector_shapedetectorcollection != null; shapedetector_shapedetectorcollection = this.findExitPortal()) { for (int i = 0; i < this.exitPortalPattern.getWidth(); ++i) { -@@ -564,8 +564,9 @@ +@@ -569,8 +569,9 @@ this.respawnTime = 0; this.spawnExitPortal(false); this.respawnCrystals = list; diff --git a/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.patch b/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.patch index ad86ab14b..e36dd6a4b 100644 --- a/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.patch +++ b/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.java +++ b/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.java -@@ -29,6 +29,12 @@ +@@ -28,6 +28,12 @@ import net.minecraft.world.phys.MovingObjectPosition; import net.minecraft.world.phys.Vec3D; @@ -13,7 +13,7 @@ public interface VibrationSystem { GameEvent[] RESONANCE_EVENTS = new GameEvent[]{GameEvent.RESONATE_1, GameEvent.RESONATE_2, GameEvent.RESONATE_3, GameEvent.RESONATE_4, GameEvent.RESONATE_5, GameEvent.RESONATE_6, GameEvent.RESONATE_7, GameEvent.RESONATE_8, GameEvent.RESONATE_9, GameEvent.RESONATE_10, GameEvent.RESONATE_11, GameEvent.RESONATE_12, GameEvent.RESONATE_13, GameEvent.RESONATE_14, GameEvent.RESONATE_15}; -@@ -228,7 +234,8 @@ +@@ -227,7 +233,8 @@ if (vibrationsystem_d.requiresAdjacentChunksToBeTicking() && !areAdjacentChunksTicking(worldserver, blockposition1)) { return false; } else { @@ -23,7 +23,7 @@ vibrationsystem_a.setCurrentVibration((VibrationInfo) null); return true; } -@@ -285,8 +292,14 @@ +@@ -282,8 +289,14 @@ return false; } else { Vec3D vec3d1 = (Vec3D) optional.get(); @@ -40,7 +40,7 @@ return false; } else if (isOccluded(worldserver, vec3d, vec3d1)) { return false; -@@ -339,7 +352,7 @@ +@@ -336,7 +349,7 @@ return instance.group(VibrationInfo.CODEC.optionalFieldOf("event").forGetter((vibrationsystem_a) -> { return Optional.ofNullable(vibrationsystem_a.currentVibration); }), VibrationSelector.CODEC.fieldOf("selector").forGetter(VibrationSystem.a::getSelectionStrategy), ExtraCodecs.NON_NEGATIVE_INT.fieldOf("event_delay").orElse(0).forGetter(VibrationSystem.a::getTravelTimeInTicks)).apply(instance, (optional, vibrationselector, integer) -> { diff --git a/nms-patches/net/minecraft/world/level/levelgen/structure/PersistentStructureLegacy.patch b/nms-patches/net/minecraft/world/level/levelgen/structure/PersistentStructureLegacy.patch index a519e64a8..1c6fcf598 100644 --- a/nms-patches/net/minecraft/world/level/levelgen/structure/PersistentStructureLegacy.patch +++ b/nms-patches/net/minecraft/world/level/levelgen/structure/PersistentStructureLegacy.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/levelgen/structure/PersistentStructureLegacy.java +++ b/net/minecraft/world/level/levelgen/structure/PersistentStructureLegacy.java -@@ -20,6 +20,10 @@ +@@ -21,6 +21,10 @@ import net.minecraft.world.level.World; import net.minecraft.world.level.storage.WorldPersistentData; @@ -11,7 +11,7 @@ public class PersistentStructureLegacy { private static final Map CURRENT_TO_LEGACY_MAP = (Map) SystemUtils.make(Maps.newHashMap(), (hashmap) -> { -@@ -235,16 +239,16 @@ +@@ -236,16 +240,16 @@ } } diff --git a/nms-patches/net/minecraft/world/level/material/FluidTypeFlowing.patch b/nms-patches/net/minecraft/world/level/material/FluidTypeFlowing.patch index c631b701e..8b3d30a04 100644 --- a/nms-patches/net/minecraft/world/level/material/FluidTypeFlowing.patch +++ b/nms-patches/net/minecraft/world/level/material/FluidTypeFlowing.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/material/FluidTypeFlowing.java +++ b/net/minecraft/world/level/material/FluidTypeFlowing.java -@@ -31,6 +31,15 @@ +@@ -32,6 +32,15 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShapes; @@ -16,7 +16,7 @@ public abstract class FluidTypeFlowing extends FluidType { public static final BlockStateBoolean FALLING = BlockProperties.FALLING; -@@ -131,6 +140,15 @@ +@@ -132,6 +141,15 @@ Fluid fluid1 = this.getNewLiquid(world, blockposition1, iblockdata1); if (this.canSpreadTo(world, blockposition, iblockdata, EnumDirection.DOWN, blockposition1, iblockdata1, world.getFluidState(blockposition1), fluid1.getType())) { @@ -32,7 +32,7 @@ this.spreadTo(world, blockposition1, iblockdata1, EnumDirection.DOWN, fluid1); if (this.sourceNeighborCount(world, blockposition) >= 3) { this.spreadToSides(world, blockposition, fluid, iblockdata); -@@ -161,6 +179,15 @@ +@@ -162,6 +180,15 @@ IBlockData iblockdata1 = world.getBlockState(blockposition1); if (this.canSpreadTo(world, blockposition, iblockdata, enumdirection, blockposition1, iblockdata1, world.getFluidState(blockposition1), fluid1.getType())) { @@ -48,7 +48,7 @@ this.spreadTo(world, blockposition1, iblockdata1, enumdirection, fluid1); } } -@@ -431,12 +458,23 @@ +@@ -438,12 +465,23 @@ if (fluid1.isEmpty()) { fluid = fluid1; diff --git a/nms-patches/net/minecraft/world/level/saveddata/maps/WorldMap.patch b/nms-patches/net/minecraft/world/level/saveddata/maps/WorldMap.patch index 7b829d2ef..92a6fd444 100644 --- a/nms-patches/net/minecraft/world/level/saveddata/maps/WorldMap.patch +++ b/nms-patches/net/minecraft/world/level/saveddata/maps/WorldMap.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/saveddata/maps/WorldMap.java +++ b/net/minecraft/world/level/saveddata/maps/WorldMap.java -@@ -31,6 +31,16 @@ +@@ -32,6 +32,16 @@ import net.minecraft.world.level.saveddata.PersistentBase; import org.slf4j.Logger; @@ -17,7 +17,7 @@ public class WorldMap extends PersistentBase { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -53,6 +63,13 @@ +@@ -54,6 +64,13 @@ private final Map frameMarkers = Maps.newHashMap(); private int trackedDecorationCount; @@ -28,10 +28,10 @@ + public String id; + // CraftBukkit end + - private WorldMap(int i, int j, byte b0, boolean flag, boolean flag1, boolean flag2, ResourceKey resourcekey) { - this.scale = b0; - this.centerX = i; -@@ -62,6 +79,10 @@ + public static PersistentBase.a factory() { + return new PersistentBase.a<>(() -> { + throw new IllegalStateException("Should never create an empty map saved data"); +@@ -69,6 +86,10 @@ this.unlimitedTracking = flag1; this.locked = flag2; this.setDirty(); @@ -42,7 +42,7 @@ } public static WorldMap createFresh(double d0, double d1, byte b0, boolean flag, boolean flag1, ResourceKey resourcekey) { -@@ -79,12 +100,30 @@ +@@ -86,12 +107,30 @@ } public static WorldMap load(NBTTagCompound nbttagcompound) { @@ -76,7 +76,7 @@ }); int i = nbttagcompound.getInt("xCenter"); int j = nbttagcompound.getInt("zCenter"); -@@ -122,13 +161,32 @@ +@@ -129,13 +168,32 @@ @Override public NBTTagCompound save(NBTTagCompound nbttagcompound) { @@ -110,7 +110,7 @@ nbttagcompound.putInt("xCenter", this.centerX); nbttagcompound.putInt("zCenter", this.centerZ); nbttagcompound.putByte("scale", this.scale); -@@ -503,7 +561,7 @@ +@@ -510,7 +568,7 @@ this.player = entityhuman; } @@ -119,7 +119,7 @@ int i = this.minDirtyX; int j = this.minDirtyY; int k = this.maxDirtyX + 1 - this.minDirtyX; -@@ -512,7 +570,7 @@ +@@ -519,7 +577,7 @@ for (int i1 = 0; i1 < k; ++i1) { for (int j1 = 0; j1 < l; ++j1) { @@ -128,7 +128,7 @@ } } -@@ -522,19 +580,29 @@ +@@ -529,19 +587,29 @@ @Nullable Packet nextUpdatePacket(int i) { WorldMap.b worldmap_b; diff --git a/nms-patches/net/minecraft/world/level/storage/Convertable.patch b/nms-patches/net/minecraft/world/level/storage/Convertable.patch index 917222d4c..6b4de80d3 100644 --- a/nms-patches/net/minecraft/world/level/storage/Convertable.patch +++ b/nms-patches/net/minecraft/world/level/storage/Convertable.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/Convertable.java +++ b/net/minecraft/world/level/storage/Convertable.java -@@ -74,6 +74,10 @@ +@@ -80,6 +80,10 @@ import net.minecraft.world.level.validation.PathAllowList; import org.slf4j.Logger; @@ -11,7 +11,7 @@ public class Convertable { static final Logger LOGGER = LogUtils.getLogger(); -@@ -160,7 +164,7 @@ +@@ -169,7 +173,7 @@ } private static WorldDataConfiguration readDataConfig(Dynamic dynamic) { @@ -20,7 +20,7 @@ Logger logger = Convertable.LOGGER; Objects.requireNonNull(logger); -@@ -176,7 +180,7 @@ +@@ -185,7 +189,7 @@ throw new LevelStorageException(IChatBaseComponent.translatable("selectWorld.load_folder_access")); } else { try { @@ -29,7 +29,7 @@ Convertable.a convertable_a; -@@ -320,6 +324,7 @@ +@@ -343,6 +347,7 @@ WorldDimensions.b worlddimensions_b = generatorsettings.dimensions().bake(iregistry); Lifecycle lifecycle1 = worlddimensions_b.lifecycle().add(lifecycle); WorldDataServer worlddataserver = WorldDataServer.parse(dynamic, datafixer, i, nbttagcompound2, worldsettings, levelversion, worlddimensions_b.specialWorldProperty(), generatorsettings.options(), lifecycle1); @@ -37,14 +37,14 @@ return Pair.of(worlddataserver, worlddimensions_b); }; -@@ -415,27 +420,41 @@ +@@ -441,27 +446,41 @@ return this.backupDir; } - public Convertable.ConversionSession validateAndCreateAccess(String s) throws IOException, ContentValidationException { + public Convertable.ConversionSession validateAndCreateAccess(String s, ResourceKey dimensionType) throws IOException, ContentValidationException { // CraftBukkit Path path = this.getLevelPath(s); - List list = this.worldDirValidator.validateSave(path, true); + List list = this.worldDirValidator.validateDirectory(path, true); if (!list.isEmpty()) { throw new ContentValidationException(path, list); @@ -83,7 +83,7 @@ public static record a(List levels) implements Iterable { public boolean isEmpty() { -@@ -487,8 +506,12 @@ +@@ -513,8 +532,12 @@ public final Convertable.b levelDirectory; private final String levelId; private final Map resources = Maps.newHashMap(); @@ -97,7 +97,7 @@ this.levelId = s; this.levelDirectory = new Convertable.b(path); this.lock = SessionLock.create(path); -@@ -499,7 +522,7 @@ +@@ -529,7 +552,7 @@ } public Path getLevelPath(SavedFile savedfile) { @@ -106,7 +106,7 @@ Convertable.b convertable_b = this.levelDirectory; Objects.requireNonNull(this.levelDirectory); -@@ -507,7 +530,7 @@ +@@ -537,7 +560,7 @@ } public Path getDimensionPath(ResourceKey resourcekey) { diff --git a/nms-patches/net/minecraft/world/level/storage/loot/LootDataManager.patch b/nms-patches/net/minecraft/world/level/storage/loot/LootDataManager.patch index 457a5fb5d..d39a8088d 100644 --- a/nms-patches/net/minecraft/world/level/storage/loot/LootDataManager.patch +++ b/nms-patches/net/minecraft/world/level/storage/loot/LootDataManager.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/loot/LootDataManager.java +++ b/net/minecraft/world/level/storage/loot/LootDataManager.java -@@ -36,6 +36,7 @@ +@@ -30,6 +30,7 @@ public static final LootDataId EMPTY_LOOT_TABLE_KEY = new LootDataId<>(LootDataType.TABLE, LootTables.EMPTY); private Map, ?> elements = Map.of(); private Multimap, MinecraftKey> typeKeys = ImmutableMultimap.of(); @@ -8,7 +8,7 @@ public LootDataManager() {} -@@ -93,7 +94,7 @@ +@@ -87,7 +88,7 @@ @Nullable @Override public T getElement(LootDataId lootdataid) { @@ -17,7 +17,7 @@ } }); -@@ -105,16 +106,21 @@ +@@ -99,16 +100,21 @@ }); this.elements = map1; this.typeKeys = com_google_common_collect_immutablemultimap_builder.build(); diff --git a/nms-patches/net/minecraft/world/level/storage/loot/LootTable.patch b/nms-patches/net/minecraft/world/level/storage/loot/LootTable.patch index 0ed1ef643..9c212fb69 100644 --- a/nms-patches/net/minecraft/world/level/storage/loot/LootTable.patch +++ b/nms-patches/net/minecraft/world/level/storage/loot/LootTable.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/level/storage/loot/LootTable.java +++ b/net/minecraft/world/level/storage/loot/LootTable.java -@@ -34,6 +34,13 @@ - import org.apache.commons.lang3.ArrayUtils; +@@ -29,6 +29,13 @@ + import net.minecraft.world.level.storage.loot.parameters.LootContextParameterSets; import org.slf4j.Logger; +// CraftBukkit start @@ -13,8 +13,8 @@ + public class LootTable { - static final Logger LOGGER = LogUtils.getLogger(); -@@ -145,9 +152,22 @@ + private static final Logger LOGGER = LogUtils.getLogger(); +@@ -149,9 +156,22 @@ } public void fill(IInventory iinventory, LootParams lootparams, long i) { diff --git a/nms-patches/net/minecraft/world/level/storage/loot/functions/LootEnchantFunction.patch b/nms-patches/net/minecraft/world/level/storage/loot/functions/LootEnchantFunction.patch index 65e587eb3..29bd58bed 100644 --- a/nms-patches/net/minecraft/world/level/storage/loot/functions/LootEnchantFunction.patch +++ b/nms-patches/net/minecraft/world/level/storage/loot/functions/LootEnchantFunction.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/loot/functions/LootEnchantFunction.java +++ b/net/minecraft/world/level/storage/loot/functions/LootEnchantFunction.java -@@ -49,8 +49,13 @@ +@@ -57,8 +57,13 @@ if (entity instanceof EntityLiving) { int i = EnchantmentManager.getMobLooting((EntityLiving) entity); @@ -15,12 +15,3 @@ return itemstack; } -@@ -99,7 +104,7 @@ - public b() {} - - public void serialize(JsonObject jsonobject, LootEnchantFunction lootenchantfunction, JsonSerializationContext jsonserializationcontext) { -- super.serialize(jsonobject, (LootItemFunctionConditional) lootenchantfunction, jsonserializationcontext); -+ super.serialize(jsonobject, lootenchantfunction, jsonserializationcontext); // CraftBukkit - decompile error - jsonobject.add("count", jsonserializationcontext.serialize(lootenchantfunction.value)); - if (lootenchantfunction.hasLimit()) { - jsonobject.add("limit", jsonserializationcontext.serialize(lootenchantfunction.limit)); diff --git a/nms-patches/net/minecraft/world/level/storage/loot/predicates/LootItemConditionRandomChanceWithLooting.patch b/nms-patches/net/minecraft/world/level/storage/loot/predicates/LootItemConditionRandomChanceWithLooting.patch index 36ea7ff3a..c14edd239 100644 --- a/nms-patches/net/minecraft/world/level/storage/loot/predicates/LootItemConditionRandomChanceWithLooting.patch +++ b/nms-patches/net/minecraft/world/level/storage/loot/predicates/LootItemConditionRandomChanceWithLooting.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/loot/predicates/LootItemConditionRandomChanceWithLooting.java +++ b/net/minecraft/world/level/storage/loot/predicates/LootItemConditionRandomChanceWithLooting.java -@@ -41,6 +41,11 @@ +@@ -34,6 +34,11 @@ if (entity instanceof EntityLiving) { i = EnchantmentManager.getMobLooting((EntityLiving) entity); } diff --git a/nms-patches/net/minecraft/world/level/storage/loot/predicates/LootItemConditionSurvivesExplosion.patch b/nms-patches/net/minecraft/world/level/storage/loot/predicates/LootItemConditionSurvivesExplosion.patch index a770a8b1c..d0a4a03db 100644 --- a/nms-patches/net/minecraft/world/level/storage/loot/predicates/LootItemConditionSurvivesExplosion.patch +++ b/nms-patches/net/minecraft/world/level/storage/loot/predicates/LootItemConditionSurvivesExplosion.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/loot/predicates/LootItemConditionSurvivesExplosion.java +++ b/net/minecraft/world/level/storage/loot/predicates/LootItemConditionSurvivesExplosion.java -@@ -34,7 +34,8 @@ +@@ -32,7 +32,8 @@ RandomSource randomsource = loottableinfo.getRandom(); float f = 1.0F / ofloat; diff --git a/pom.xml b/pom.xml index be914160e..24dea1378 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.bukkit craftbukkit jar - 1.20.1-R0.1-SNAPSHOT + 1.20.2-R0.1-SNAPSHOT CraftBukkit https://www.spigotmc.org/ @@ -13,7 +13,7 @@ UTF-8 unknown git - 1_20_R1 + 1_20_R2 17 17 @@ -61,13 +61,13 @@ com.github.oshi oshi-core - 6.2.2 + 6.4.5 compile com.mojang authlib - 4.0.43 + 5.0.47 compile @@ -91,87 +91,87 @@ commons-io commons-io - 2.11.0 + 2.13.0 compile io.netty netty-buffer - 4.1.82.Final + 4.1.97.Final compile io.netty netty-codec - 4.1.82.Final + 4.1.97.Final compile io.netty netty-common - 4.1.82.Final + 4.1.97.Final compile io.netty netty-handler - 4.1.82.Final + 4.1.97.Final compile io.netty netty-resolver - 4.1.82.Final + 4.1.97.Final compile io.netty netty-transport - 4.1.82.Final + 4.1.97.Final compile io.netty netty-transport-classes-epoll - 4.1.82.Final + 4.1.97.Final compile io.netty netty-transport-native-epoll - 4.1.82.Final + 4.1.97.Final linux-x86_64 compile io.netty netty-transport-native-epoll - 4.1.82.Final + 4.1.97.Final linux-aarch_64 compile io.netty netty-transport-native-unix-common - 4.1.82.Final + 4.1.97.Final compile it.unimi.dsi fastutil - 8.5.9 + 8.5.12 compile net.java.dev.jna jna - 5.12.1 + 5.13.0 compile net.java.dev.jna jna-platform - 5.12.1 + 5.13.0 compile @@ -183,7 +183,7 @@ org.apache.commons commons-lang3 - 3.12.0 + 3.13.0 compile @@ -201,7 +201,7 @@ org.slf4j slf4j-api - 2.0.1 + 2.0.7 compile @@ -221,13 +221,13 @@ org.xerial sqlite-jdbc - 3.42.0.0 + 3.43.0.0 runtime com.mysql mysql-connector-j - 8.0.33 + 8.1.0 runtime diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 7c4beedd9..2acdf4052 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -46,6 +46,7 @@ import java.util.stream.Collectors; import javax.imageio.ImageIO; import jline.console.ConsoleReader; import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.commands.CommandDispatcher; import net.minecraft.commands.CommandListenerWrapper; import net.minecraft.commands.arguments.ArgumentEntity; @@ -95,6 +96,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemWorldMap; import net.minecraft.world.item.crafting.IRecipe; import net.minecraft.world.item.crafting.RecipeCrafting; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeRepair; import net.minecraft.world.item.crafting.Recipes; import net.minecraft.world.item.enchantment.Enchantments; @@ -187,6 +189,7 @@ import org.bukkit.craftbukkit.metadata.PlayerMetadataStore; import org.bukkit.craftbukkit.metadata.WorldMetadataStore; import org.bukkit.craftbukkit.packs.CraftDataPackManager; import org.bukkit.craftbukkit.potion.CraftPotionBrewer; +import org.bukkit.craftbukkit.profile.CraftGameProfile; import org.bukkit.craftbukkit.profile.CraftPlayerProfile; import org.bukkit.craftbukkit.scheduler.CraftScheduler; import org.bukkit.craftbukkit.scoreboard.CraftCriteria; @@ -1319,7 +1322,7 @@ public final class CraftServer implements Server { public Recipe getRecipe(NamespacedKey recipeKey) { Preconditions.checkArgument(recipeKey != null, "NamespacedKey recipeKey cannot be null"); - return getServer().getRecipeManager().byKey(CraftNamespacedKey.toMinecraft(recipeKey)).map(IRecipe::toBukkitRecipe).orElse(null); + return getServer().getRecipeManager().byKey(CraftNamespacedKey.toMinecraft(recipeKey)).map(RecipeHolder::toBukkitRecipe).orElse(null); } @Override @@ -1343,7 +1346,7 @@ public final class CraftServer implements Server { }; InventoryCrafting inventoryCrafting = new TransientCraftingContainer(container, 3, 3); - return getNMSRecipe(craftingMatrix, inventoryCrafting, (CraftWorld) world).map(IRecipe::toBukkitRecipe).orElse(null); + return getNMSRecipe(craftingMatrix, inventoryCrafting, (CraftWorld) world).map(RecipeHolder::toBukkitRecipe).orElse(null); } @Override @@ -1359,20 +1362,20 @@ public final class CraftServer implements Server { InventoryCrafting inventoryCrafting = container.craftSlots; InventoryCraftResult craftResult = container.resultSlots; - Optional recipe = getNMSRecipe(craftingMatrix, inventoryCrafting, craftWorld); + Optional> recipe = getNMSRecipe(craftingMatrix, inventoryCrafting, craftWorld); // Generate the resulting ItemStack from the Crafting Matrix net.minecraft.world.item.ItemStack itemstack = net.minecraft.world.item.ItemStack.EMPTY; if (recipe.isPresent()) { - RecipeCrafting recipeCrafting = recipe.get(); + RecipeHolder recipeCrafting = recipe.get(); if (craftResult.setRecipeUsed(craftWorld.getHandle(), craftPlayer.getHandle(), recipeCrafting)) { - itemstack = recipeCrafting.assemble(inventoryCrafting, craftWorld.getHandle().registryAccess()); + itemstack = recipeCrafting.value().assemble(inventoryCrafting, craftWorld.getHandle().registryAccess()); } } // Call Bukkit event to check for matrix/result changes. - net.minecraft.world.item.ItemStack result = CraftEventFactory.callPreCraftEvent(inventoryCrafting, craftResult, itemstack, container.getBukkitView(), recipe.orElse(null) instanceof RecipeRepair); + net.minecraft.world.item.ItemStack result = CraftEventFactory.callPreCraftEvent(inventoryCrafting, craftResult, itemstack, container.getBukkitView(), recipe.map(RecipeHolder::toBukkitRecipe).orElse(null) instanceof RecipeRepair); // Set the resulting matrix items for (int i = 0; i < craftingMatrix.length; i++) { @@ -1383,7 +1386,7 @@ public final class CraftServer implements Server { return CraftItemStack.asBukkitCopy(result); } - private Optional getNMSRecipe(ItemStack[] craftingMatrix, InventoryCrafting inventoryCrafting, CraftWorld world) { + private Optional> getNMSRecipe(ItemStack[] craftingMatrix, InventoryCrafting inventoryCrafting, CraftWorld world) { Preconditions.checkArgument(craftingMatrix != null, "craftingMatrix must not be null"); Preconditions.checkArgument(craftingMatrix.length == 9, "craftingMatrix must be an array of length 9"); Preconditions.checkArgument(world != null, "world must not be null"); @@ -1673,7 +1676,7 @@ public final class CraftServer implements Server { if (result == null) { result = offlinePlayers.get(id); if (result == null) { - result = new CraftOfflinePlayer(this, new GameProfile(id, null)); + result = new CraftOfflinePlayer(this, new CraftGameProfile(id, null)); offlinePlayers.put(id, result); } } else { @@ -2198,16 +2201,16 @@ public final class CraftServer implements Server { public org.bukkit.advancement.Advancement getAdvancement(NamespacedKey key) { Preconditions.checkArgument(key != null, "NamespacedKey key cannot be null"); - Advancement advancement = console.getAdvancements().getAdvancement(CraftNamespacedKey.toMinecraft(key)); - return (advancement == null) ? null : advancement.bukkit; + AdvancementHolder advancement = console.getAdvancements().get(CraftNamespacedKey.toMinecraft(key)); + return (advancement == null) ? null : advancement.toBukkit(); } @Override public Iterator advancementIterator() { - return Iterators.unmodifiableIterator(Iterators.transform(console.getAdvancements().getAllAdvancements().iterator(), new Function() { + return Iterators.unmodifiableIterator(Iterators.transform(console.getAdvancements().getAllAdvancements().iterator(), new Function() { @Override - public org.bukkit.advancement.Advancement apply(Advancement advancement) { - return advancement.bukkit; + public org.bukkit.advancement.Advancement apply(AdvancementHolder advancement) { + return advancement.toBukkit(); } })); } diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java index c71ec42cc..560fa9b85 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -200,11 +200,11 @@ public class Main { useConsole = false; } - if (false && Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { + if (Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { Date buildDate = new Date(Integer.parseInt(Main.class.getPackage().getImplementationVendor()) * 1000L); Calendar deadline = Calendar.getInstance(); - deadline.add(Calendar.DAY_OF_YEAR, -21); + deadline.add(Calendar.DAY_OF_YEAR, -3); if (buildDate.before(deadline.getTime())) { System.err.println("*** Error, this build is outdated ***"); System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/go/outdated-spigot ***"); diff --git a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java index 2d3642b1f..472d910a6 100644 --- a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java +++ b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java @@ -2,39 +2,39 @@ package org.bukkit.craftbukkit.advancement; import java.util.Collection; import java.util.Collections; -import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import org.bukkit.NamespacedKey; import org.bukkit.advancement.AdvancementDisplay; import org.bukkit.craftbukkit.util.CraftNamespacedKey; public class CraftAdvancement implements org.bukkit.advancement.Advancement { - private final Advancement handle; + private final AdvancementHolder handle; - public CraftAdvancement(Advancement handle) { + public CraftAdvancement(AdvancementHolder handle) { this.handle = handle; } - public Advancement getHandle() { + public AdvancementHolder getHandle() { return handle; } @Override public NamespacedKey getKey() { - return CraftNamespacedKey.fromMinecraft(handle.getId()); + return CraftNamespacedKey.fromMinecraft(handle.id()); } @Override public Collection getCriteria() { - return Collections.unmodifiableCollection(handle.getCriteria().keySet()); + return Collections.unmodifiableCollection(handle.value().criteria().keySet()); } @Override public AdvancementDisplay getDisplay() { - if (handle.getDisplay() == null) { + if (handle.value().display().isEmpty()) { return null; } - return new CraftAdvancementDisplay(handle.getDisplay()); + return new CraftAdvancementDisplay(handle.value().display().get()); } } diff --git a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementProgress.java b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementProgress.java index 6b053669b..ee1a1ea5c 100644 --- a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementProgress.java +++ b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementProgress.java @@ -44,7 +44,7 @@ public class CraftAdvancementProgress implements AdvancementProgress { @Override public Date getDateAwarded(String criteria) { CriterionProgress criterion = handle.getCriterion(criteria); - return (criterion == null) ? null : criterion.getObtained(); + return (criterion == null) ? null : Date.from(criterion.getObtained()); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java index cb9dd20c0..71c1060f3 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java @@ -1,15 +1,14 @@ package org.bukkit.craftbukkit.block; -import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Collection; import net.minecraft.world.ChestLock; -import net.minecraft.world.effect.MobEffectList; import net.minecraft.world.entity.player.EntityHuman; import net.minecraft.world.level.block.entity.TileEntity; import net.minecraft.world.level.block.entity.TileEntityBeacon; import org.bukkit.World; import org.bukkit.block.Beacon; +import org.bukkit.craftbukkit.potion.CraftPotionEffectType; import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.entity.LivingEntity; import org.bukkit.potion.PotionEffect; @@ -55,7 +54,7 @@ public class CraftBeacon extends CraftBlockEntityState impleme @Override public void setPrimaryEffect(PotionEffectType effect) { - this.getSnapshot().primaryPower = (effect != null) ? MobEffectList.byId(effect.getId()) : null; + this.getSnapshot().primaryPower = (effect != null) ? CraftPotionEffectType.bukkitToMinecraft(effect) : null; } @Override @@ -65,7 +64,7 @@ public class CraftBeacon extends CraftBlockEntityState impleme @Override public void setSecondaryEffect(PotionEffectType effect) { - this.getSnapshot().secondaryPower = (effect != null) ? MobEffectList.byId(effect.getId()) : null; + this.getSnapshot().secondaryPower = (effect != null) ? CraftPotionEffectType.bukkitToMinecraft(effect) : null; } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDecoratedPot.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDecoratedPot.java index b87125870..42fc1eae9 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDecoratedPot.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDecoratedPot.java @@ -26,13 +26,13 @@ public class CraftDecoratedPot extends CraftBlockEntityState getSnapshot().decorations = new DecoratedPotBlockEntity.a(sherdItem, decorations.left(), decorations.right(), decorations.front()); - case LEFT -> getSnapshot().decorations = new DecoratedPotBlockEntity.a(decorations.back(), sherdItem, decorations.right(), decorations.front()); - case RIGHT -> getSnapshot().decorations = new DecoratedPotBlockEntity.a(decorations.back(), decorations.left(), sherdItem, decorations.front()); - case FRONT -> getSnapshot().decorations = new DecoratedPotBlockEntity.a(decorations.back(), decorations.left(), decorations.right(), sherdItem); + case BACK -> getSnapshot().decorations = new DecoratedPotBlockEntity.Decoration(sherdItem, decorations.left(), decorations.right(), decorations.front()); + case LEFT -> getSnapshot().decorations = new DecoratedPotBlockEntity.Decoration(decorations.back(), sherdItem, decorations.right(), decorations.front()); + case RIGHT -> getSnapshot().decorations = new DecoratedPotBlockEntity.Decoration(decorations.back(), decorations.left(), sherdItem, decorations.front()); + case FRONT -> getSnapshot().decorations = new DecoratedPotBlockEntity.Decoration(decorations.back(), decorations.left(), decorations.right(), sherdItem); default -> throw new IllegalArgumentException("Unexpected value: " + face); } } @@ -41,7 +41,7 @@ public class CraftDecoratedPot extends CraftBlockEntityState decorations.back(); case LEFT -> decorations.left(); @@ -55,7 +55,7 @@ public class CraftDecoratedPot extends CraftBlockEntityState getSherds() { - DecoratedPotBlockEntity.a decorations = getSnapshot().getDecorations(); // PAIL rename Decorations + DecoratedPotBlockEntity.Decoration decorations = getSnapshot().getDecorations(); Map sherds = new EnumMap<>(Side.class); sherds.put(Side.BACK, CraftMagicNumbers.getMaterial(decorations.back())); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java index 14cb18b13..32ef3ef46 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java @@ -1,6 +1,5 @@ package org.bukkit.craftbukkit.block; -import com.google.common.base.Preconditions; import net.minecraft.world.level.block.BlockDispenser; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.TileEntityDispenser; @@ -53,7 +52,7 @@ public class CraftDispenser extends CraftLootable implement CraftWorld world = (CraftWorld) this.getWorld(); BlockDispenser dispense = (BlockDispenser) Blocks.DISPENSER; - dispense.dispenseFrom(world.getHandle(), this.getPosition()); + dispense.dispenseFrom(world.getHandle(), this.getHandle(), this.getPosition()); return true; } else { return false; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java index 9bd43e791..64edfd457 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java @@ -1,6 +1,5 @@ package org.bukkit.craftbukkit.block; -import com.google.common.base.Preconditions; import net.minecraft.world.level.block.BlockDropper; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.TileEntityDropper; @@ -40,7 +39,7 @@ public class CraftDropper extends CraftLootable implements Dr CraftWorld world = (CraftWorld) this.getWorld(); BlockDropper drop = (BlockDropper) Blocks.DROPPER; - drop.dispenseFrom(world.getHandle(), this.getPosition()); + drop.dispenseFrom(world.getHandle(), this.getHandle(), this.getPosition()); } } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java index 81d3493a3..dbed8a91a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java @@ -16,6 +16,7 @@ import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; import org.bukkit.block.data.Rotatable; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.profile.CraftGameProfile; import org.bukkit.craftbukkit.profile.CraftPlayerProfile; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.profile.PlayerProfile; @@ -102,7 +103,7 @@ public class CraftSkull extends CraftBlockEntityState implement if (player instanceof CraftPlayer) { this.profile = ((CraftPlayer) player).getProfile(); } else { - this.profile = new GameProfile(player.getUniqueId(), player.getName()); + this.profile = new CraftGameProfile(player.getUniqueId(), player.getName()); } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java index 3259b2c97..08c284727 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java @@ -13,6 +13,7 @@ import org.bukkit.Color; import org.bukkit.Particle; import org.bukkit.craftbukkit.CraftParticle; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.potion.CraftPotionEffectType; import org.bukkit.craftbukkit.potion.CraftPotionUtil; import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.LivingEntity; @@ -134,10 +135,10 @@ public class CraftAreaEffectCloud extends CraftEntity implements AreaEffectCloud @Override public boolean addCustomEffect(PotionEffect effect, boolean override) { - int effectId = effect.getType().getId(); + MobEffectList minecraft = CraftPotionEffectType.bukkitToMinecraft(effect.getType()); MobEffect existing = null; for (MobEffect mobEffect : getHandle().effects) { - if (MobEffectList.getId(mobEffect.getEffect()) == effectId) { + if (mobEffect.getEffect() == minecraft) { existing = mobEffect; } } @@ -184,10 +185,10 @@ public class CraftAreaEffectCloud extends CraftEntity implements AreaEffectCloud @Override public boolean removeCustomEffect(PotionEffectType effect) { - int effectId = effect.getId(); + MobEffectList minecraft = CraftPotionEffectType.bukkitToMinecraft(effect); MobEffect existing = null; for (MobEffect mobEffect : getHandle().effects) { - if (MobEffectList.getId(mobEffect.getEffect()) == effectId) { + if (mobEffect.getEffect() == minecraft) { existing = mobEffect; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java index e4947785a..c5f28d69b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java @@ -45,12 +45,12 @@ public class CraftDisplay extends CraftEntity implements Display { @Override public int getInterpolationDuration() { - return getHandle().getInterpolationDuration(); + return getHandle().getTransformationInterpolationDuration(); } @Override public void setInterpolationDuration(int duration) { - getHandle().setInterpolationDuration(duration); + getHandle().setTransformationInterpolationDuration(duration); } @Override @@ -105,12 +105,12 @@ public class CraftDisplay extends CraftEntity implements Display { @Override public int getInterpolationDelay() { - return getHandle().getInterpolationDelay(); + return getHandle().getTransformationInterpolationDelay(); } @Override public void setInterpolationDelay(int ticks) { - getHandle().setInterpolationDelay(ticks); + getHandle().setTransformationInterpolationDelay(ticks); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index b4dcaf77a..4bc06b5ad 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -7,7 +7,6 @@ import com.google.common.collect.Lists; import java.util.List; import java.util.Set; import java.util.UUID; -import net.minecraft.core.Position; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.chat.IChatBaseComponent; @@ -545,7 +544,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { if (location.getWorld() != null && !location.getWorld().equals(getWorld())) { // Prevent teleportation to an other world during world generation Preconditions.checkState(!entity.generation, "Cannot teleport entity to an other world during world generation"); - entity.teleportTo(((CraftWorld) location.getWorld()).getHandle(), CraftLocation.toPosition(location)); + entity.teleportTo(((CraftWorld) location.getWorld()).getHandle(), CraftLocation.toVec3D(location)); return true; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index b4a2a50d5..a2c7b1dcb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -24,6 +24,7 @@ import net.minecraft.world.inventory.Containers; import net.minecraft.world.item.ItemCooldown; import net.minecraft.world.item.crafting.CraftingManager; import net.minecraft.world.item.crafting.IRecipe; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.trading.IMerchant; import net.minecraft.world.level.block.BlockBed; import net.minecraft.world.level.block.BlockEnchantmentTable; @@ -540,12 +541,12 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { return ImmutableSet.of(); } - private Collection> bukkitKeysToMinecraftRecipes(Collection recipeKeys) { - Collection> recipes = new ArrayList<>(); + private Collection> bukkitKeysToMinecraftRecipes(Collection recipeKeys) { + Collection> recipes = new ArrayList<>(); CraftingManager manager = getHandle().level().getServer().getRecipeManager(); for (NamespacedKey recipeKey : recipeKeys) { - Optional> recipe = manager.byKey(CraftNamespacedKey.toMinecraft(recipeKey)); + Optional> recipe = manager.byKey(CraftNamespacedKey.toMinecraft(recipeKey)); if (!recipe.isPresent()) { continue; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index 8d35243c0..4a2c855c1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -56,6 +56,7 @@ import org.bukkit.craftbukkit.entity.memory.CraftMemoryKey; import org.bukkit.craftbukkit.entity.memory.CraftMemoryMapper; import org.bukkit.craftbukkit.inventory.CraftEntityEquipment; import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.potion.CraftPotionEffectType; import org.bukkit.craftbukkit.potion.CraftPotionUtil; import org.bukkit.entity.AbstractArrow; import org.bukkit.entity.Arrow; @@ -373,7 +374,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @Override public boolean addPotionEffect(PotionEffect effect, boolean force) { - getHandle().addEffect(new MobEffect(MobEffectList.byId(effect.getType().getId()), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), effect.hasParticles()), EntityPotionEffectEvent.Cause.PLUGIN); + getHandle().addEffect(new MobEffect(CraftPotionEffectType.bukkitToMinecraft(effect.getType()), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), effect.hasParticles()), EntityPotionEffectEvent.Cause.PLUGIN); return true; } @@ -388,25 +389,25 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @Override public boolean hasPotionEffect(PotionEffectType type) { - return getHandle().hasEffect(MobEffectList.byId(type.getId())); + return getHandle().hasEffect(CraftPotionEffectType.bukkitToMinecraft(type)); } @Override public PotionEffect getPotionEffect(PotionEffectType type) { - MobEffect handle = getHandle().getEffect(MobEffectList.byId(type.getId())); - return (handle == null) ? null : new PotionEffect(PotionEffectType.getById(MobEffectList.getId(handle.getEffect())), handle.getDuration(), handle.getAmplifier(), handle.isAmbient(), handle.isVisible()); + MobEffect handle = getHandle().getEffect(CraftPotionEffectType.bukkitToMinecraft(type)); + return (handle == null) ? null : new PotionEffect(CraftPotionEffectType.minecraftToBukkit(handle.getEffect()), handle.getDuration(), handle.getAmplifier(), handle.isAmbient(), handle.isVisible()); } @Override public void removePotionEffect(PotionEffectType type) { - getHandle().removeEffect(MobEffectList.byId(type.getId()), EntityPotionEffectEvent.Cause.PLUGIN); + getHandle().removeEffect(CraftPotionEffectType.bukkitToMinecraft(type), EntityPotionEffectEvent.Cause.PLUGIN); } @Override public Collection getActivePotionEffects() { List effects = new ArrayList(); for (MobEffect handle : getHandle().activeEffects.values()) { - effects.add(new PotionEffect(PotionEffectType.getById(MobEffectList.getId(handle.getEffect())), handle.getDuration(), handle.getAmplifier(), handle.isAmbient(), handle.isVisible())); + effects.add(new PotionEffect(CraftPotionEffectType.minecraftToBukkit(handle.getEffect()), handle.getDuration(), handle.getAmplifier(), handle.isAmbient(), handle.isVisible())); } return effects; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 6bb6a83c1..a3245bf71 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -41,6 +41,9 @@ import net.minecraft.network.PacketDataSerializer; import net.minecraft.network.chat.IChatBaseComponent; import net.minecraft.network.chat.PlayerChatMessage; import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; +import net.minecraft.network.protocol.common.ClientboundResourcePackPacket; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.network.protocol.game.ClientboundClearTitlesPacket; import net.minecraft.network.protocol.game.ClientboundCustomChatCompletionsPacket; import net.minecraft.network.protocol.game.ClientboundHurtAnimationPacket; @@ -56,7 +59,6 @@ import net.minecraft.network.protocol.game.ClientboundSetTitleTextPacket; import net.minecraft.network.protocol.game.ClientboundSetTitlesAnimationPacket; import net.minecraft.network.protocol.game.PacketPlayOutBlockBreakAnimation; import net.minecraft.network.protocol.game.PacketPlayOutBlockChange; -import net.minecraft.network.protocol.game.PacketPlayOutCustomPayload; import net.minecraft.network.protocol.game.PacketPlayOutEntityEquipment; import net.minecraft.network.protocol.game.PacketPlayOutEntitySound; import net.minecraft.network.protocol.game.PacketPlayOutExperience; @@ -1659,12 +1661,26 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (getHandle().connection == null) return; if (channels.contains(channel)) { - channel = StandardMessenger.validateAndCorrectChannel(channel); - PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload(new MinecraftKey(channel), new PacketDataSerializer(Unpooled.wrappedBuffer(message))); - getHandle().connection.send(packet); + MinecraftKey id = new MinecraftKey(StandardMessenger.validateAndCorrectChannel(channel)); + sendCustomPayload(id, message); } } + private void sendCustomPayload(MinecraftKey id, byte[] message) { + ClientboundCustomPayloadPacket packet = new ClientboundCustomPayloadPacket(new CustomPacketPayload() { + @Override + public void write(PacketDataSerializer pds) { + pds.writeBytes(message); + } + + @Override + public MinecraftKey id() { + return id; + } + }); + getHandle().connection.send(packet); + } + @Override public void setTexturePack(String url) { setResourcePack(url); @@ -1697,9 +1713,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (hash != null) { Preconditions.checkArgument(hash.length == 20, "Resource pack hash should be 20 bytes long but was %s", hash.length); - getHandle().sendTexturePack(url, BaseEncoding.base16().lowerCase().encode(hash), force, CraftChatMessage.fromStringOrNull(prompt, true)); + getHandle().connection.send(new ClientboundResourcePackPacket(url, BaseEncoding.base16().lowerCase().encode(hash), force, CraftChatMessage.fromStringOrNull(prompt, true))); } else { - getHandle().sendTexturePack(url, "", force, CraftChatMessage.fromStringOrNull(prompt, true)); + getHandle().connection.send(new ClientboundResourcePackPacket(url, "", force, CraftChatMessage.fromStringOrNull(prompt, true))); } } @@ -1739,7 +1755,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } } - getHandle().connection.send(new PacketPlayOutCustomPayload(new MinecraftKey("register"), new PacketDataSerializer(Unpooled.wrappedBuffer(stream.toByteArray())))); + sendCustomPayload(new MinecraftKey("register"), stream.toByteArray()); } } @@ -2085,17 +2101,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public int getClientViewDistance() { - return (getHandle().clientViewDistance == null) ? Bukkit.getViewDistance() : getHandle().clientViewDistance; + return (getHandle().requestedViewDistance() == 0) ? Bukkit.getViewDistance() : getHandle().requestedViewDistance(); } @Override public int getPing() { - return getHandle().latency; + return getHandle().connection.latency(); } @Override public String getLocale() { - return getHandle().locale; + return getHandle().language; } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTippedArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTippedArrow.java index 99d82b2a2..f1ec6929d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTippedArrow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTippedArrow.java @@ -10,6 +10,7 @@ import net.minecraft.world.effect.MobEffectList; import net.minecraft.world.entity.projectile.EntityTippedArrow; import org.bukkit.Color; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.potion.CraftPotionEffectType; import org.bukkit.craftbukkit.potion.CraftPotionUtil; import org.bukkit.entity.Arrow; import org.bukkit.potion.PotionData; @@ -34,10 +35,10 @@ public class CraftTippedArrow extends CraftArrow implements Arrow { @Override public boolean addCustomEffect(PotionEffect effect, boolean override) { - int effectId = effect.getType().getId(); + MobEffectList minecraft = CraftPotionEffectType.bukkitToMinecraft(effect.getType()); MobEffect existing = null; for (MobEffect mobEffect : getHandle().effects) { - if (MobEffectList.getId(mobEffect.getEffect()) == effectId) { + if (mobEffect.getEffect() == minecraft) { existing = mobEffect; } } @@ -84,10 +85,10 @@ public class CraftTippedArrow extends CraftArrow implements Arrow { @Override public boolean removeCustomEffect(PotionEffectType effect) { - int effectId = effect.getId(); + MobEffectList minecraft = CraftPotionEffectType.bukkitToMinecraft(effect); MobEffect existing = null; for (MobEffect mobEffect : getHandle().effects) { - if (MobEffectList.getId(mobEffect.getEffect()) == effectId) { + if (mobEffect.getEffect() == minecraft) { existing = mobEffect; } } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index d0227995e..a5906de1e 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -6,6 +6,8 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.mojang.datafixers.util.Either; import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.util.ArrayList; import java.util.Collections; import java.util.EnumMap; @@ -899,9 +901,9 @@ public class CraftEventFactory { /** * Server methods */ - public static ServerListPingEvent callServerListPingEvent(Server craftServer, InetAddress address, String motd, int numPlayers, int maxPlayers) { - ServerListPingEvent event = new ServerListPingEvent("", address, motd, numPlayers, maxPlayers); - craftServer.getPluginManager().callEvent(event); + public static ServerListPingEvent callServerListPingEvent(SocketAddress address, String motd, int numPlayers, int maxPlayers) { + ServerListPingEvent event = new ServerListPingEvent("", ((InetSocketAddress) address).getAddress(), motd, numPlayers, maxPlayers); + Bukkit.getServer().getPluginManager().callEvent(event); return event; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlastingRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlastingRecipe.java index 276216473..0c028b66d 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlastingRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftBlastingRecipe.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.BlastingRecipe; @@ -26,6 +27,6 @@ public class CraftBlastingRecipe extends BlastingRecipe implements CraftRecipe { public void addToCraftingManager() { ItemStack result = this.getResult(); - MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.RecipeBlasting(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftRecipe.getCategory(this.getCategory()), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime())); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new net.minecraft.world.item.crafting.RecipeBlasting(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime()))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftCampfireRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftCampfireRecipe.java index 132e8c924..07d48eee3 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftCampfireRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftCampfireRecipe.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.CampfireRecipe; @@ -26,6 +27,6 @@ public class CraftCampfireRecipe extends CampfireRecipe implements CraftRecipe { public void addToCraftingManager() { ItemStack result = this.getResult(); - MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.RecipeCampfire(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftRecipe.getCategory(this.getCategory()), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime())); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new net.minecraft.world.item.crafting.RecipeCampfire(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime()))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftComplexRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftComplexRecipe.java index 336ba3884..3fd7db9b2 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftComplexRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftComplexRecipe.java @@ -3,6 +3,7 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.core.IRegistryCustom; import net.minecraft.server.MinecraftServer; import net.minecraft.world.item.crafting.IRecipeComplex; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.ComplexRecipe; @@ -10,9 +11,11 @@ import org.bukkit.inventory.ItemStack; public class CraftComplexRecipe implements CraftRecipe, ComplexRecipe { + private final NamespacedKey key; private final IRecipeComplex recipe; - public CraftComplexRecipe(IRecipeComplex recipe) { + public CraftComplexRecipe(NamespacedKey key, IRecipeComplex recipe) { + this.key = key; this.recipe = recipe; } @@ -23,11 +26,11 @@ public class CraftComplexRecipe implements CraftRecipe, ComplexRecipe { @Override public NamespacedKey getKey() { - return CraftNamespacedKey.fromMinecraft(recipe.getId()); + return key; } @Override public void addToCraftingManager() { - MinecraftServer.getServer().getRecipeManager().addRecipe(recipe); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(key), recipe)); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java index a4e919164..1d8382659 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.FurnaceRecipe; @@ -26,6 +27,6 @@ public class CraftFurnaceRecipe extends FurnaceRecipe implements CraftRecipe { public void addToCraftingManager() { ItemStack result = this.getResult(); - MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.FurnaceRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftRecipe.getCategory(this.getCategory()), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime())); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new net.minecraft.world.item.crafting.FurnaceRecipe(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime()))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java index a27136d12..927603301 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java @@ -4,7 +4,7 @@ import com.google.common.base.Preconditions; import java.util.Arrays; import java.util.List; import net.minecraft.world.IInventory; -import net.minecraft.world.item.crafting.IRecipe; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; @@ -115,7 +115,7 @@ public class CraftInventoryCrafting extends CraftInventory implements CraftingIn @Override public Recipe getRecipe() { - IRecipe recipe = getInventory().getCurrentRecipe(); + RecipeHolder recipe = getInventory().getCurrentRecipe(); return recipe == null ? null : recipe.toBukkitRecipe(); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithing.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithing.java index 4fd40f76c..3259b09d9 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithing.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithing.java @@ -2,7 +2,7 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.world.IInventory; import net.minecraft.world.inventory.InventoryCraftResult; -import net.minecraft.world.item.crafting.IRecipe; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.Location; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; @@ -39,7 +39,7 @@ public class CraftInventorySmithing extends CraftResultInventory implements Smit @Override public Recipe getRecipe() { - IRecipe recipe = getResultInventory().getRecipeUsed(); + RecipeHolder recipe = getResultInventory().getRecipeUsed(); return (recipe == null) ? null : recipe.toBukkitRecipe(); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java index 96cad37f1..4fc460294 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java @@ -13,6 +13,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import org.bukkit.Color; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.configuration.serialization.DelegateDeserialization; import org.bukkit.craftbukkit.inventory.CraftMetaItem.SerializableMeta; import org.bukkit.craftbukkit.potion.CraftPotionUtil; @@ -33,14 +34,14 @@ class CraftMetaPotion extends CraftMetaItem implements PotionMeta { Material.TIPPED_ARROW ); - static final ItemMetaKey AMPLIFIER = new ItemMetaKey("Amplifier", "amplifier"); - static final ItemMetaKey AMBIENT = new ItemMetaKey("Ambient", "ambient"); - static final ItemMetaKey DURATION = new ItemMetaKey("Duration", "duration"); - static final ItemMetaKey SHOW_PARTICLES = new ItemMetaKey("ShowParticles", "has-particles"); - static final ItemMetaKey SHOW_ICON = new ItemMetaKey("ShowIcon", "has-icon"); - static final ItemMetaKey POTION_EFFECTS = new ItemMetaKey("CustomPotionEffects", "custom-effects"); + static final ItemMetaKey AMPLIFIER = new ItemMetaKey("amplifier", "amplifier"); + static final ItemMetaKey AMBIENT = new ItemMetaKey("ambient", "ambient"); + static final ItemMetaKey DURATION = new ItemMetaKey("duration", "duration"); + static final ItemMetaKey SHOW_PARTICLES = new ItemMetaKey("show_particles", "has-particles"); + static final ItemMetaKey SHOW_ICON = new ItemMetaKey("show_icon", "has-icon"); + static final ItemMetaKey POTION_EFFECTS = new ItemMetaKey("custom_potion_effects", "custom-effects"); static final ItemMetaKey POTION_COLOR = new ItemMetaKey("CustomPotionColor", "custom-color"); - static final ItemMetaKey ID = new ItemMetaKey("Id", "potion-id"); + static final ItemMetaKey ID = new ItemMetaKey("id", "potion-id"); static final ItemMetaKey DEFAULT_POTION = new ItemMetaKey("Potion", "potion-type"); // Having an initial "state" in ItemMeta seems bit dirty but the UNCRAFTABLE potion type @@ -80,7 +81,7 @@ class CraftMetaPotion extends CraftMetaItem implements PotionMeta { for (int i = 0; i < length; i++) { NBTTagCompound effect = list.getCompound(i); - PotionEffectType type = PotionEffectType.getById(effect.getByte(ID.NBT)); + PotionEffectType type = PotionEffectType.getByKey(NamespacedKey.fromString(effect.getString(ID.NBT))); // SPIGOT-4047: Vanilla just disregards these if (type == null) { continue; @@ -132,7 +133,7 @@ class CraftMetaPotion extends CraftMetaItem implements PotionMeta { for (PotionEffect effect : customEffects) { NBTTagCompound effectData = new NBTTagCompound(); - effectData.putByte(ID.NBT, (byte) effect.getType().getId()); + effectData.putString(ID.NBT, effect.getType().getKey().toString()); effectData.putByte(AMPLIFIER.NBT, (byte) effect.getAmplifier()); effectData.putInt(DURATION.NBT, effect.getDuration()); effectData.putBoolean(AMBIENT.NBT, effect.isAmbient()); diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java index 6f68ee6c8..e335076e0 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java @@ -18,6 +18,7 @@ import org.bukkit.OfflinePlayer; import org.bukkit.configuration.serialization.DelegateDeserialization; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftMetaItem.SerializableMeta; +import org.bukkit.craftbukkit.profile.CraftGameProfile; import org.bukkit.craftbukkit.profile.CraftPlayerProfile; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.craftbukkit.util.CraftNamespacedKey; @@ -74,7 +75,7 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { if (tag.contains(SKULL_OWNER.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND)) { this.setProfile(GameProfileSerializer.readGameProfile(tag.getCompound(SKULL_OWNER.NBT))); } else if (tag.contains(SKULL_OWNER.NBT, CraftMagicNumbers.NBT.TAG_STRING) && !tag.getString(SKULL_OWNER.NBT).isEmpty()) { - this.setProfile(new GameProfile(null, tag.getString(SKULL_OWNER.NBT))); + this.setProfile(new CraftGameProfile(null, tag.getString(SKULL_OWNER.NBT))); } if (tag.contains(BLOCK_ENTITY_TAG.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND)) { @@ -142,9 +143,11 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { // SPIGOT-6558: Set initial textures tag.put(SKULL_OWNER.NBT, serializedProfile); // Fill in textures - TileEntitySkull.updateGameprofile(profile, (filledProfile) -> { - setProfile(filledProfile); - tag.put(SKULL_OWNER.NBT, serializedProfile); + TileEntitySkull.fillProfileTextures(profile).thenAccept((optional) -> { + optional.ifPresent((filledProfile) -> { + setProfile(filledProfile); + tag.put(SKULL_OWNER.NBT, serializedProfile); + }); }); } @@ -208,7 +211,7 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { if (name == null) { setProfile(null); } else { - setProfile(new GameProfile(null, name)); + setProfile(new CraftGameProfile(null, name)); } return true; @@ -221,7 +224,7 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { } else if (owner instanceof CraftPlayer) { setProfile(((CraftPlayer) owner).getProfile()); } else { - setProfile(new GameProfile(owner.getUniqueId(), owner.getName())); + setProfile(new CraftGameProfile(owner.getUniqueId(), owner.getName())); } return true; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSuspiciousStew.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSuspiciousStew.java index 269fe8a68..66ce8d741 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSuspiciousStew.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSuspiciousStew.java @@ -10,6 +10,7 @@ import java.util.Map; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.configuration.serialization.DelegateDeserialization; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.inventory.meta.SuspiciousStewMeta; @@ -21,7 +22,7 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious static final ItemMetaKey DURATION = new ItemMetaKey("EffectDuration", "duration"); static final ItemMetaKey EFFECTS = new ItemMetaKey("Effects", "effects"); - static final ItemMetaKey ID = new ItemMetaKey("EffectId", "id"); + static final ItemMetaKey ID = new ItemMetaKey("id", "id"); private List customEffects; @@ -44,7 +45,7 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious for (int i = 0; i < length; i++) { NBTTagCompound effect = list.getCompound(i); - PotionEffectType type = PotionEffectType.getById(effect.getByte(ID.NBT)); + PotionEffectType type = PotionEffectType.getByKey(NamespacedKey.fromString(effect.getString(ID.NBT))); if (type == null) { continue; } @@ -78,7 +79,7 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious for (PotionEffect effect : customEffects) { NBTTagCompound effectData = new NBTTagCompound(); - effectData.putByte(ID.NBT, ((byte) effect.getType().getId())); + effectData.putString(ID.NBT, effect.getType().getKey().toString()); effectData.putInt(DURATION.NBT, effect.getDuration()); effectList.add(effectData); } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java index c967eb73b..5aa9a7c17 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java @@ -3,7 +3,7 @@ package org.bukkit.craftbukkit.inventory; import java.util.Map; import net.minecraft.core.NonNullList; import net.minecraft.server.MinecraftServer; -import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeItemStack; import net.minecraft.world.item.crafting.ShapedRecipes; import org.bukkit.NamespacedKey; @@ -20,8 +20,8 @@ public class CraftShapedRecipe extends ShapedRecipe implements CraftRecipe { super(key, result); } - public CraftShapedRecipe(ItemStack result, ShapedRecipes recipe) { - this(CraftNamespacedKey.fromMinecraft(recipe.getId()), result); + public CraftShapedRecipe(NamespacedKey key, ItemStack result, ShapedRecipes recipe) { + this(key, result); this.recipe = recipe; } @@ -57,6 +57,6 @@ public class CraftShapedRecipe extends ShapedRecipe implements CraftRecipe { data.set(i * width + j, toNMS(ingred.get(row.charAt(j)), false)); } } - MinecraftServer.getServer().getRecipeManager().addRecipe(new ShapedRecipes(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftRecipe.getCategory(this.getCategory()), width, shape.length, data, CraftItemStack.asNMSCopy(this.getResult()))); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new ShapedRecipes(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), width, shape.length, data, CraftItemStack.asNMSCopy(this.getResult())))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java index 9f9c7f18a..c69c90cd4 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java @@ -3,6 +3,7 @@ package org.bukkit.craftbukkit.inventory; import java.util.List; import net.minecraft.core.NonNullList; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeItemStack; import net.minecraft.world.item.crafting.ShapelessRecipes; import org.bukkit.NamespacedKey; @@ -19,8 +20,8 @@ public class CraftShapelessRecipe extends ShapelessRecipe implements CraftRecipe super(key, result); } - public CraftShapelessRecipe(ItemStack result, ShapelessRecipes recipe) { - this(CraftNamespacedKey.fromMinecraft(recipe.getId()), result); + public CraftShapelessRecipe(NamespacedKey key, ItemStack result, ShapelessRecipes recipe) { + this(key, result); this.recipe = recipe; } @@ -45,6 +46,6 @@ public class CraftShapelessRecipe extends ShapelessRecipe implements CraftRecipe data.set(i, toNMS(ingred.get(i), true)); } - MinecraftServer.getServer().getRecipeManager().addRecipe(new ShapelessRecipes(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftRecipe.getCategory(this.getCategory()), CraftItemStack.asNMSCopy(this.getResult()), data)); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new ShapelessRecipes(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), CraftItemStack.asNMSCopy(this.getResult()), data))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTransformRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTransformRecipe.java index 872baa62d..cd04f4a5d 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTransformRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTransformRecipe.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.ItemStack; @@ -24,6 +25,6 @@ public class CraftSmithingTransformRecipe extends SmithingTransformRecipe implem public void addToCraftingManager() { ItemStack result = this.getResult(); - MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.SmithingTransformRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), toNMS(this.getTemplate(), true), toNMS(this.getBase(), true), toNMS(this.getAddition(), true), CraftItemStack.asNMSCopy(result))); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new net.minecraft.world.item.crafting.SmithingTransformRecipe(toNMS(this.getTemplate(), true), toNMS(this.getBase(), true), toNMS(this.getAddition(), true), CraftItemStack.asNMSCopy(result)))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTrimRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTrimRecipe.java index 6ef43f58d..f1206c462 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTrimRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingTrimRecipe.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.RecipeChoice; @@ -22,6 +23,6 @@ public class CraftSmithingTrimRecipe extends SmithingTrimRecipe implements Craft @Override public void addToCraftingManager() { - MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.SmithingTrimRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), toNMS(this.getTemplate(), true), toNMS(this.getBase(), true), toNMS(this.getAddition(), true))); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new net.minecraft.world.item.crafting.SmithingTrimRecipe(toNMS(this.getTemplate(), true), toNMS(this.getBase(), true), toNMS(this.getAddition(), true)))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmokingRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmokingRecipe.java index d1644f401..0b30003b8 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmokingRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmokingRecipe.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.ItemStack; @@ -26,6 +27,6 @@ public class CraftSmokingRecipe extends SmokingRecipe implements CraftRecipe { public void addToCraftingManager() { ItemStack result = this.getResult(); - MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.RecipeSmoking(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftRecipe.getCategory(this.getCategory()), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime())); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new net.minecraft.world.item.crafting.RecipeSmoking(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime()))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftStonecuttingRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftStonecuttingRecipe.java index 544e416dc..ec27634cc 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftStonecuttingRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftStonecuttingRecipe.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.crafting.RecipeHolder; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.ItemStack; @@ -25,6 +26,6 @@ public class CraftStonecuttingRecipe extends StonecuttingRecipe implements Craft public void addToCraftingManager() { ItemStack result = this.getResult(); - MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.RecipeStonecutting(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result))); + MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new net.minecraft.world.item.crafting.RecipeStonecutting(this.getGroup(), toNMS(this.getInputChoice(), true), CraftItemStack.asNMSCopy(result)))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java b/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java index e1e1c1199..193d24e07 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java @@ -6,13 +6,13 @@ import java.util.Iterator; import java.util.Map; import net.minecraft.resources.MinecraftKey; import net.minecraft.server.MinecraftServer; -import net.minecraft.world.item.crafting.IRecipe; +import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.Recipes; import org.bukkit.inventory.Recipe; public class RecipeIterator implements Iterator { - private final Iterator, Object2ObjectLinkedOpenHashMap>>> recipes; - private Iterator> current; + private final Iterator, Object2ObjectLinkedOpenHashMap>>> recipes; + private Iterator> current; public RecipeIterator() { this.recipes = MinecraftServer.getServer().getRecipeManager().recipes.entrySet().iterator(); diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java index aeb286ed5..c5dbcf41b 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java @@ -42,7 +42,7 @@ public class CraftMapRenderer extends MapRenderer { } MapIcon decoration = worldMap.decorations.get(key); - cursors.addCursor(decoration.getX(), decoration.getY(), (byte) (decoration.getRot() & 15), decoration.getType().getIcon(), true, CraftChatMessage.fromComponent(decoration.getName())); + cursors.addCursor(decoration.x(), decoration.y(), (byte) (decoration.rot() & 15), decoration.type().getIcon(), true, CraftChatMessage.fromComponent(decoration.name())); } } diff --git a/src/main/java/org/bukkit/craftbukkit/packs/CraftDataPack.java b/src/main/java/org/bukkit/craftbukkit/packs/CraftDataPack.java index 8f22b453a..30e6f8920 100644 --- a/src/main/java/org/bukkit/craftbukkit/packs/CraftDataPack.java +++ b/src/main/java/org/bukkit/craftbukkit/packs/CraftDataPack.java @@ -40,8 +40,7 @@ public class CraftDataPack implements DataPack { @Override public int getPackFormat() { - ResourcePackLoader.a info = ResourcePackLoader.readPackInfo(this.getRawId(), this.getHandle().resources); - return (info == null) ? 0 : info.format(); + return 0; } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java index f7cbf787f..a4a806727 100644 --- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java +++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java @@ -1,15 +1,20 @@ package org.bukkit.craftbukkit.potion; +import com.google.common.base.Preconditions; +import net.minecraft.core.IRegistry; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; import net.minecraft.world.effect.MobEffectList; import org.bukkit.Color; +import org.bukkit.craftbukkit.CraftRegistry; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.potion.PotionEffectType; public class CraftPotionEffectType extends PotionEffectType { private final MobEffectList handle; public CraftPotionEffectType(MobEffectList handle) { - super(MobEffectList.getId(handle), org.bukkit.craftbukkit.util.CraftNamespacedKey.fromMinecraft(BuiltInRegistries.MOB_EFFECT.getKey(handle))); + super(BuiltInRegistries.MOB_EFFECT.getId(handle) + 1, CraftNamespacedKey.fromMinecraft(BuiltInRegistries.MOB_EFFECT.getKey(handle))); this.handle = handle; } @@ -105,4 +110,22 @@ public class CraftPotionEffectType extends PotionEffectType { public Color getColor() { return Color.fromRGB(handle.getColor()); } + + public static PotionEffectType minecraftToBukkit(MobEffectList minecraft) { + Preconditions.checkArgument(minecraft != null); + + IRegistry registry = CraftRegistry.getMinecraftRegistry(Registries.MOB_EFFECT); + PotionEffectType bukkit = PotionEffectType.getByKey(CraftNamespacedKey.fromMinecraft(registry.getResourceKey(minecraft).orElseThrow().location())); + + Preconditions.checkArgument(bukkit != null); + + return bukkit; + } + + public static MobEffectList bukkitToMinecraft(PotionEffectType bukkit) { + Preconditions.checkArgument(bukkit != null); + + return CraftRegistry.getMinecraftRegistry(Registries.MOB_EFFECT) + .getOptional(CraftNamespacedKey.toMinecraft(bukkit.getKey())).orElseThrow(); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java index dd19622a4..81062006f 100644 --- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java +++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java @@ -100,12 +100,12 @@ public class CraftPotionUtil { } public static MobEffect fromBukkit(PotionEffect effect) { - MobEffectList type = MobEffectList.byId(effect.getType().getId()); + MobEffectList type = CraftPotionEffectType.bukkitToMinecraft(effect.getType()); return new MobEffect(type, effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), effect.hasParticles()); } public static PotionEffect toBukkit(MobEffect effect) { - PotionEffectType type = PotionEffectType.getById(MobEffectList.getId(effect.getEffect())); + PotionEffectType type = CraftPotionEffectType.minecraftToBukkit(effect.getEffect()); int amp = effect.getAmplifier(); int duration = effect.getDuration(); boolean ambient = effect.isAmbient(); @@ -114,7 +114,7 @@ public class CraftPotionUtil { } public static boolean equals(MobEffectList mobEffect, PotionEffectType type) { - PotionEffectType typeV = PotionEffectType.getById(MobEffectList.getId(mobEffect)); + PotionEffectType typeV = CraftPotionEffectType.minecraftToBukkit(mobEffect); return typeV.equals(type); } } diff --git a/src/main/java/org/bukkit/craftbukkit/profile/CraftGameProfile.java b/src/main/java/org/bukkit/craftbukkit/profile/CraftGameProfile.java new file mode 100644 index 000000000..51ee9102a --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/profile/CraftGameProfile.java @@ -0,0 +1,63 @@ +package org.bukkit.craftbukkit.profile; + +import com.mojang.authlib.GameProfile; +import java.util.UUID; +import net.minecraft.SystemUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; + +public final class CraftGameProfile extends GameProfile { + + private final boolean nullId; + private final boolean nullName; + + public CraftGameProfile(UUID id, String name) { + super((id == null) ? SystemUtils.NIL_UUID : id, (name == null) ? "" : name); + + this.nullId = (id == null); + this.nullName = (name == null); + } + + @Override + public UUID getId() { + return (nullId) ? null : super.getId(); + } + + @Override + public String getName() { + return (nullName) ? null : super.getName(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + GameProfile that = (GameProfile) o; + if ((this.getId() != null) ? !this.getId().equals(that.getId()) : (that.getId() != null)) { + return false; + } + if ((this.getName() != null) ? !this.getName().equals(that.getName()) : (that.getName() != null)) { + return false; + } + return true; + } + + @Override + public int hashCode() { + int result = (this.getId() != null) ? this.getId().hashCode() : 0; + result = 31 * result + ((this.getName() != null) ? this.getName().hashCode() : 0); + return result; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("id", this.getId()) + .append("name", this.getName()) + .append("properties", this.getProperties()) + .toString(); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java b/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java index 3c08f3d43..bb3af1e0a 100644 --- a/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java +++ b/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerProfile.java @@ -13,11 +13,15 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; import net.minecraft.SystemUtils; import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.world.level.block.entity.TileEntitySkull; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.configuration.serialization.SerializableAs; @@ -88,7 +92,7 @@ public final class CraftPlayerProfile implements PlayerProfile { // Assert: (property == null) || property.getName().equals(propertyName) removeProperty(propertyName); if (property != null) { - properties.put(property.getName(), property); + properties.put(property.name(), property); } } @@ -135,7 +139,12 @@ public final class CraftPlayerProfile implements PlayerProfile { // Look up properties such as the textures: if (profile.getId() != null) { - GameProfile newProfile = server.getSessionService().fillProfileProperties(profile, true); + GameProfile newProfile; + try { + newProfile = TileEntitySkull.fillProfileTextures(profile).get().orElse(null); // TODO: replace with CompletableFuture + } catch (InterruptedException | ExecutionException ex) { + throw new RuntimeException("Exception filling profile textures", ex); + } if (newProfile != null) { profile = newProfile; } @@ -149,7 +158,7 @@ public final class CraftPlayerProfile implements PlayerProfile { @Nonnull public GameProfile buildGameProfile() { rebuildDirtyProperties(); - GameProfile profile = new GameProfile(uniqueId, name); + GameProfile profile = new CraftGameProfile(uniqueId, name); profile.getProperties().putAll(properties); return profile; } @@ -265,7 +274,7 @@ public final class CraftPlayerProfile implements PlayerProfile { for (Object propertyData : (List) map.get("properties")) { Preconditions.checkArgument(propertyData instanceof Map, "Propertu data (%s) is not a valid Map", propertyData); Property property = CraftProfileProperty.deserialize((Map) propertyData); - profile.properties.put(property.getName(), property); + profile.properties.put(property.name(), property); } } diff --git a/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerTextures.java b/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerTextures.java index 674a0d425..6d74092e4 100644 --- a/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerTextures.java +++ b/src/main/java/org/bukkit/craftbukkit/profile/CraftPlayerTextures.java @@ -96,7 +96,7 @@ final class CraftPlayerTextures implements PlayerTextures { Property property = getProperty(); if (property == null) return; - data = CraftProfileProperty.decodePropertyValue(property.getValue()); + data = CraftProfileProperty.decodePropertyValue(property.value()); if (data != null) { JsonObject texturesMap = JsonHelper.getObjectOrNull(data, "textures"); loadSkin(texturesMap); diff --git a/src/main/java/org/bukkit/craftbukkit/profile/CraftProfileProperty.java b/src/main/java/org/bukkit/craftbukkit/profile/CraftProfileProperty.java index a102ee4f4..2268abcc8 100644 --- a/src/main/java/org/bukkit/craftbukkit/profile/CraftProfileProperty.java +++ b/src/main/java/org/bukkit/craftbukkit/profile/CraftProfileProperty.java @@ -90,37 +90,37 @@ final class CraftProfileProperty { StringBuilder builder = new StringBuilder(); builder.append("{"); builder.append("name="); - builder.append(property.getName()); + builder.append(property.name()); builder.append(", value="); - builder.append(property.getValue()); + builder.append(property.value()); builder.append(", signature="); - builder.append(property.getSignature()); + builder.append(property.signature()); builder.append("}"); return builder.toString(); } public static int hashCode(@Nonnull Property property) { int result = 1; - result = 31 * result + Objects.hashCode(property.getName()); - result = 31 * result + Objects.hashCode(property.getValue()); - result = 31 * result + Objects.hashCode(property.getSignature()); + result = 31 * result + Objects.hashCode(property.name()); + result = 31 * result + Objects.hashCode(property.value()); + result = 31 * result + Objects.hashCode(property.signature()); return result; } public static boolean equals(@Nullable Property property, @Nullable Property other) { if (property == null || other == null) return (property == other); - if (!Objects.equals(property.getValue(), other.getValue())) return false; - if (!Objects.equals(property.getName(), other.getName())) return false; - if (!Objects.equals(property.getSignature(), other.getSignature())) return false; + if (!Objects.equals(property.value(), other.value())) return false; + if (!Objects.equals(property.name(), other.name())) return false; + if (!Objects.equals(property.signature(), other.signature())) return false; return true; } public static Map serialize(@Nonnull Property property) { Map map = new LinkedHashMap<>(); - map.put("name", property.getName()); - map.put("value", property.getValue()); + map.put("name", property.name()); + map.put("value", property.value()); if (property.hasSignature()) { - map.put("signature", property.getSignature()); + map.put("signature", property.signature()); } return map; } diff --git a/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java b/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java index 17df33277..f69589333 100644 --- a/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java +++ b/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java @@ -3,7 +3,7 @@ package org.bukkit.craftbukkit.projectiles; import com.google.common.base.Preconditions; import net.minecraft.core.EnumDirection; import net.minecraft.core.IPosition; -import net.minecraft.core.SourceBlock; +import net.minecraft.core.dispenser.SourceBlock; import net.minecraft.server.level.WorldServer; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.EntityTypes; @@ -24,7 +24,6 @@ import net.minecraft.world.level.block.entity.TileEntityDispenser; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.potion.CraftPotionUtil; import org.bukkit.entity.AbstractArrow; import org.bukkit.entity.Arrow; import org.bukkit.entity.Egg; @@ -66,10 +65,10 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { public T launchProjectile(Class projectile, Vector velocity) { Preconditions.checkArgument(getBlock().getType() == Material.DISPENSER, "Block is no longer dispenser"); // Copied from BlockDispenser.dispense() - SourceBlock isourceblock = new SourceBlock((WorldServer) dispenserBlock.getLevel(), dispenserBlock.getBlockPos()); + SourceBlock sourceblock = new SourceBlock((WorldServer) dispenserBlock.getLevel(), dispenserBlock.getBlockPos(), dispenserBlock.getBlockState(), dispenserBlock); // Copied from DispenseBehaviorProjectile - IPosition iposition = BlockDispenser.getDispensePosition(isourceblock); - EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); + IPosition iposition = BlockDispenser.getDispensePosition(sourceblock); + EnumDirection enumdirection = (EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING); net.minecraft.world.level.World world = dispenserBlock.getLevel(); net.minecraft.world.entity.Entity launch = null; diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java index f8f1da9ae..6eaa081e8 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java @@ -74,13 +74,13 @@ final class CraftObjective extends CraftScoreboardComponent implements Objective Scoreboard board = scoreboard.board; ScoreboardObjective objective = this.objective; - for (int i = 0; i < CraftScoreboardTranslations.MAX_DISPLAY_SLOT; i++) { + for (net.minecraft.world.scores.DisplaySlot i : net.minecraft.world.scores.DisplaySlot.values()) { if (board.getDisplayObjective(i) == objective) { board.setDisplayObjective(i, null); } } if (slot != null) { - int slotNumber = CraftScoreboardTranslations.fromBukkitSlot(slot); + net.minecraft.world.scores.DisplaySlot slotNumber = CraftScoreboardTranslations.fromBukkitSlot(slot); board.setDisplayObjective(slotNumber, getHandle()); } } @@ -91,7 +91,7 @@ final class CraftObjective extends CraftScoreboardComponent implements Objective Scoreboard board = scoreboard.board; ScoreboardObjective objective = this.objective; - for (int i = 0; i < CraftScoreboardTranslations.MAX_DISPLAY_SLOT; i++) { + for (net.minecraft.world.scores.DisplaySlot i : net.minecraft.world.scores.DisplaySlot.values()) { if (board.getDisplayObjective(i) == objective) { return CraftScoreboardTranslations.toBukkitSlot(i); } diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java index 6c147a74b..1713b8698 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java @@ -74,7 +74,7 @@ public final class CraftScoreboardManager implements ScoreboardManager { // Old objective tracking HashSet removed = new HashSet<>(); for (int i = 0; i < 3; ++i) { - ScoreboardObjective scoreboardobjective = oldboard.getDisplayObjective(i); + ScoreboardObjective scoreboardobjective = oldboard.getDisplayObjective(net.minecraft.world.scores.DisplaySlot.BY_ID.apply(i)); if (scoreboardobjective != null && !removed.contains(scoreboardobjective)) { entityplayer.connection.send(new PacketPlayOutScoreboardObjective(scoreboardobjective, 1)); removed.add(scoreboardobjective); diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardTranslations.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardTranslations.java index 05d10a3b7..9cfc3e888 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardTranslations.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardTranslations.java @@ -1,7 +1,6 @@ package org.bukkit.craftbukkit.scoreboard; import com.google.common.collect.ImmutableBiMap; -import net.minecraft.world.scores.Scoreboard; import net.minecraft.world.scores.criteria.IScoreboardCriteria; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.RenderType; @@ -9,7 +8,7 @@ import org.bukkit.scoreboard.RenderType; final class CraftScoreboardTranslations { static final int MAX_DISPLAY_SLOT = 19; static final ImmutableBiMap SLOTS = ImmutableBiMap.builder() - .put(DisplaySlot.BELOW_NAME, "belowName") + .put(DisplaySlot.BELOW_NAME, "below_name") .put(DisplaySlot.PLAYER_LIST, "list") .put(DisplaySlot.SIDEBAR, "sidebar") .put(DisplaySlot.SIDEBAR_BLACK, "sidebar.team.black") @@ -32,12 +31,12 @@ final class CraftScoreboardTranslations { private CraftScoreboardTranslations() {} - static DisplaySlot toBukkitSlot(int i) { - return SLOTS.inverse().get(Scoreboard.getDisplaySlotName(i)); + static DisplaySlot toBukkitSlot(net.minecraft.world.scores.DisplaySlot minecraft) { + return SLOTS.inverse().get(minecraft.getSerializedName()); } - static int fromBukkitSlot(DisplaySlot slot) { - return Scoreboard.getDisplaySlotByName(SLOTS.get(slot)); + static net.minecraft.world.scores.DisplaySlot fromBukkitSlot(DisplaySlot slot) { + return net.minecraft.world.scores.DisplaySlot.CODEC.byName(SLOTS.get(slot)); } static RenderType toBukkitRender(IScoreboardCriteria.EnumScoreboardHealthDisplay display) { diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftLocation.java b/src/main/java/org/bukkit/craftbukkit/util/CraftLocation.java index 40893399c..d62fb1f6f 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftLocation.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftLocation.java @@ -1,7 +1,6 @@ package org.bukkit.craftbukkit.util; import net.minecraft.core.BlockPosition; -import net.minecraft.core.Position; import net.minecraft.world.phys.Vec3D; import org.bukkit.Location; import org.bukkit.World; @@ -37,26 +36,10 @@ public final class CraftLocation { return new Location(world, blockPosition.getX(), blockPosition.getY(), blockPosition.getZ(), yaw, pitch); } - public static Location toBukkit(Position position) { - return toBukkit(position, null, 0.0F, 0.0F); - } - - public static Location toBukkit(Position position, World world) { - return toBukkit(position, world, 0.0F, 0.0F); - } - - public static Location toBukkit(Position position, World world, float yaw, float pitch) { - return new Location(world, position.x(), position.y(), position.z(), yaw, pitch); - } - public static BlockPosition toBlockPosition(Location location) { return new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()); } - public static Position toPosition(Location location) { - return new Position(location.getX(), location.getY(), location.getZ()); - } - public static Vec3D toVec3D(Location location) { return new Vec3D(location.getX(), location.getY(), location.getZ()); } diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java index 31e148ca1..2ea1c8f72 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -24,6 +24,7 @@ import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; import net.minecraft.SharedConstants; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.critereon.LootDeserializationContext; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.DynamicOpsNBT; @@ -239,7 +240,7 @@ public final class CraftMagicNumbers implements UnsafeValues { * @return string */ public String getMappingsVersion() { - return "bcf3dcb22ad42792794079f9443df2c0"; + return "3478a65bfd04b15b431fe107b3617dfc"; } @Override @@ -273,9 +274,9 @@ public final class CraftMagicNumbers implements UnsafeValues { JsonElement jsonelement = AdvancementDataWorld.GSON.fromJson(advancement, JsonElement.class); JsonObject jsonobject = ChatDeserializer.convertToJsonObject(jsonelement, "advancement"); - net.minecraft.advancements.Advancement.SerializedAdvancement nms = net.minecraft.advancements.Advancement.SerializedAdvancement.fromJson(jsonobject, new LootDeserializationContext(minecraftkey, MinecraftServer.getServer().getLootData())); + net.minecraft.advancements.Advancement nms = net.minecraft.advancements.Advancement.fromJson(jsonobject, new LootDeserializationContext(minecraftkey, MinecraftServer.getServer().getLootData())); if (nms != null) { - MinecraftServer.getServer().getAdvancements().advancements.add(Maps.newHashMap(Collections.singletonMap(minecraftkey, nms))); + MinecraftServer.getServer().getAdvancements().advancements.put(minecraftkey, new AdvancementHolder(minecraftkey, nms)); Advancement bukkit = Bukkit.getAdvancement(key); if (bukkit != null) { diff --git a/src/test/java/org/bukkit/craftbukkit/profile/PlayerProfileTest.java b/src/test/java/org/bukkit/craftbukkit/profile/PlayerProfileTest.java index ba3b67fea..d399962d1 100644 --- a/src/test/java/org/bukkit/craftbukkit/profile/PlayerProfileTest.java +++ b/src/test/java/org/bukkit/craftbukkit/profile/PlayerProfileTest.java @@ -95,11 +95,11 @@ public class PlayerProfileTest { Assert.assertEquals("Unique id is not the same", UNIQUE_ID, profile1.getUniqueId()); Assert.assertEquals("Name is not the same", NAME, profile1.getName()); - CraftPlayerProfile profile2 = new CraftPlayerProfile(new GameProfile(UNIQUE_ID, null)); + CraftPlayerProfile profile2 = new CraftPlayerProfile(new CraftGameProfile(UNIQUE_ID, null)); Assert.assertEquals("Unique id is not the same", UNIQUE_ID, profile2.getUniqueId()); Assert.assertEquals("Name is not null", null, profile2.getName()); - CraftPlayerProfile profile3 = new CraftPlayerProfile(new GameProfile(null, NAME)); + CraftPlayerProfile profile3 = new CraftPlayerProfile(new CraftGameProfile(null, NAME)); Assert.assertEquals("Unique id is not null", null, profile3.getUniqueId()); Assert.assertEquals("Name is not the same", NAME, profile3.getName()); } @@ -123,7 +123,7 @@ public class PlayerProfileTest { Property property = CraftPlayerProfile.getProperty(gameProfile, CraftPlayerTextures.PROPERTY_NAME); Assert.assertNotNull("Textures property is null", property); - Assert.assertEquals("Property values are not the same", VALUE, property.getValue()); + Assert.assertEquals("Property values are not the same", VALUE, property.value()); Assert.assertEquals("Names are not the same", NAME, gameProfile.getName()); Assert.assertEquals("Unique ids are not the same", UNIQUE_ID, gameProfile.getId()); Assert.assertTrue("Signature is missing", property.hasSignature()); @@ -198,17 +198,17 @@ public class PlayerProfileTest { public void testCustomSkin() { CraftPlayerProfile profile = new CraftPlayerProfile(UNIQUE_ID, NAME); profile.getTextures().setSkin(SKIN); - Assert.assertEquals("profile with custom skin does not match expected value", COMPACT_VALUE, profile.getTextures().getProperty().getValue()); + Assert.assertEquals("profile with custom skin does not match expected value", COMPACT_VALUE, profile.getTextures().getProperty().value()); } @Test public void testEquals() { CraftPlayerProfile profile1 = buildPlayerProfile(); CraftPlayerProfile profile2 = buildPlayerProfile(); - CraftPlayerProfile profile3 = new CraftPlayerProfile(new GameProfile(UNIQUE_ID, NAME)); - CraftPlayerProfile profile4 = new CraftPlayerProfile(new GameProfile(UNIQUE_ID, NAME)); - CraftPlayerProfile profile5 = new CraftPlayerProfile(new GameProfile(UNIQUE_ID, null)); - CraftPlayerProfile profile6 = new CraftPlayerProfile(new GameProfile(null, NAME)); + CraftPlayerProfile profile3 = new CraftPlayerProfile(UNIQUE_ID, NAME); + CraftPlayerProfile profile4 = new CraftPlayerProfile(UNIQUE_ID, NAME); + CraftPlayerProfile profile5 = new CraftPlayerProfile(UNIQUE_ID, null); + CraftPlayerProfile profile6 = new CraftPlayerProfile(null, NAME); Assert.assertEquals("profile1 and profile2 are not equal", profile1, profile2); Assert.assertEquals("profile3 and profile4 are not equal", profile3, profile4); diff --git a/src/test/java/org/bukkit/potion/PotionTest.java b/src/test/java/org/bukkit/potion/PotionTest.java index aca572f75..e13bd7e8b 100644 --- a/src/test/java/org/bukkit/potion/PotionTest.java +++ b/src/test/java/org/bukkit/potion/PotionTest.java @@ -9,6 +9,7 @@ import net.minecraft.resources.MinecraftKey; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectList; import net.minecraft.world.item.alchemy.PotionRegistry; +import org.bukkit.craftbukkit.potion.CraftPotionEffectType; import org.bukkit.support.AbstractTestingBase; import org.junit.Test; @@ -16,12 +17,11 @@ public class PotionTest extends AbstractTestingBase { @Test public void testEffectCompleteness() throws Throwable { Map effects = new EnumMap(PotionType.class); - for (Object reg : BuiltInRegistries.POTION) { - List eff = ((PotionRegistry) reg).getEffects(); + for (PotionRegistry reg : BuiltInRegistries.POTION) { + List eff = reg.getEffects(); if (eff.size() != 1) continue; - int id = MobEffectList.getId(eff.get(0).getEffect()); - PotionEffectType type = PotionEffectType.getById(id); - assertNotNull(String.valueOf(id), PotionEffectType.getById(id)); + PotionEffectType type = CraftPotionEffectType.minecraftToBukkit(eff.get(0).getEffect()); + assertNotNull(String.valueOf(reg), type); PotionType enumType = PotionType.getByEffect(type); assertNotNull(type.getName(), enumType); @@ -37,8 +37,7 @@ public class PotionTest extends AbstractTestingBase { for (MobEffectList nms : BuiltInRegistries.MOB_EFFECT) { MinecraftKey key = BuiltInRegistries.MOB_EFFECT.getKey(nms); - int id = MobEffectList.getId(nms); - PotionEffectType bukkit = PotionEffectType.getById(id); + PotionEffectType bukkit = CraftPotionEffectType.minecraftToBukkit(nms); assertNotNull("No Bukkit type for " + key, bukkit); assertFalse("No name for " + key, bukkit.getName().contains("UNKNOWN")); diff --git a/src/test/java/org/bukkit/support/AbstractTestingBase.java b/src/test/java/org/bukkit/support/AbstractTestingBase.java index 7db12678a..ecfac636c 100644 --- a/src/test/java/org/bukkit/support/AbstractTestingBase.java +++ b/src/test/java/org/bukkit/support/AbstractTestingBase.java @@ -46,7 +46,7 @@ public abstract class AbstractTestingBase { SharedConstants.tryDetectVersion(); DispenserRegistry.bootStrap(); // Populate available packs - ResourcePackRepository resourceRepository = new ResourcePackRepository(new ResourcePackSourceVanilla()); + ResourcePackRepository resourceRepository = ResourcePackSourceVanilla.createVanillaTrustedRepository(); resourceRepository.reload(); // Set up resource manager ResourceManager resourceManager = new ResourceManager(EnumResourcePackType.SERVER_DATA, resourceRepository.getAvailablePacks().stream().map(ResourcePackLoader::open).toList());