From 6d4b25bf1979eaf999e7056cd87d95dab4013783 Mon Sep 17 00:00:00 2001 From: md_5 Date: Fri, 22 Sep 2023 02:57:13 +1000 Subject: [PATCH] Increase diff stability --- makePatches.sh | 2 +- .../core/dispenser/IDispenseBehavior.patch | 6 +-- nms-patches/net/minecraft/server/Main.patch | 4 +- .../minecraft/server/MinecraftServer.patch | 16 ++++---- .../minecraft/server/level/EntityPlayer.patch | 32 ++++++++-------- .../server/level/EntityTrackerEntry.patch | 11 +++--- .../server/level/PlayerInteractManager.patch | 10 ++--- .../minecraft/server/level/WorldServer.patch | 8 ++-- .../server/network/ServerConnection.patch | 15 ++++---- .../minecraft/server/players/PlayerList.patch | 26 ++++++------- .../rcon/RemoteControlCommandListener.patch | 5 +-- .../net/minecraft/world/entity/Entity.patch | 14 +++---- .../minecraft/world/entity/EntityLiving.patch | 15 ++++---- .../entity/decoration/EntityItemFrame.patch | 9 ++--- .../entity/projectile/EntityEnderPearl.patch | 24 ++++++------ .../entity/projectile/EntityPotion.patch | 38 +++++++++---------- .../projectile/EntityShulkerBullet.patch | 11 +++--- .../inventory/ContainerEnchantTable.patch | 11 +++--- .../world/inventory/InventoryEnderChest.patch | 6 +-- .../net/minecraft/world/item/ItemArmor.patch | 6 +-- .../net/minecraft/world/item/ItemBlock.patch | 6 +-- .../world/item/crafting/CraftingManager.patch | 11 +++--- .../minecraft/world/level/WorldAccess.patch | 4 +- .../minecraft/world/level/block/Block.patch | 11 +++--- .../world/level/block/BlockDoor.patch | 6 +-- .../level/block/entity/TileEntityBeacon.patch | 15 ++++---- .../block/entity/TileEntityBrewingStand.patch | 10 ++--- 27 files changed, 162 insertions(+), 170 deletions(-) diff --git a/makePatches.sh b/makePatches.sh index 3760fa10c..f43bc70f2 100755 --- a/makePatches.sh +++ b/makePatches.sh @@ -42,7 +42,7 @@ do strip_cr "$nms/$file" > /dev/null strip_cr "$cb/$file" > /dev/null outName=$(echo nms-patches/"$(echo $file | cut -d. -f1)".patch) - patchNew=$(diff -u --label a/$file "$nms/$file" --label b/$file "$cb/$file" || true) + patchNew=$(diff -u --minimal --label a/$file "$nms/$file" --label b/$file "$cb/$file" || true) if [ -f "$outName" ] then patchCut=$(echo "$patchNew" | tail -n +3) diff --git a/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch b/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch index b6779a955..4a9d4f7e2 100644 --- a/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch +++ b/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch @@ -196,13 +196,13 @@ + World world = sourceblock.level(); + org.bukkit.block.Block block = CraftBlock.at(world, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); -+ + +- itemstack.shrink(1); + BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) entityhorsechestedabstract.getBukkitEntity()); + if (!BlockDispenser.eventFired) { + world.getCraftServer().getPluginManager().callEvent(event); + } - -- itemstack.shrink(1); ++ + if (event.isCancelled()) { + return itemstack; + } diff --git a/nms-patches/net/minecraft/server/Main.patch b/nms-patches/net/minecraft/server/Main.patch index d3fba4bba..b1f7175f4 100644 --- a/nms-patches/net/minecraft/server/Main.patch +++ b/nms-patches/net/minecraft/server/Main.patch @@ -34,10 +34,10 @@ return; } + */ // CraftBukkit end -+ -+ try { - Path path = (Path) optionset.valueOf(optionspec13); ++ try { ++ + Path path = (Path) optionset.valueOf("pidFile"); // CraftBukkit if (path != null) { diff --git a/nms-patches/net/minecraft/server/MinecraftServer.patch b/nms-patches/net/minecraft/server/MinecraftServer.patch index b20405c50..0fbd5e7f9 100644 --- a/nms-patches/net/minecraft/server/MinecraftServer.patch +++ b/nms-patches/net/minecraft/server/MinecraftServer.patch @@ -151,11 +151,15 @@ + // CraftBukkit start + private void loadWorld0(String s) { + Convertable.ConversionSession worldSession = this.storageSource; -+ + +- this.levels.put(World.OVERWORLD, worldserver); +- WorldPersistentData worldpersistentdata = worldserver.getDataStorage(); + IRegistry dimensions = this.registries.compositeAccess().registryOrThrow(Registries.LEVEL_STEM); + for (WorldDimension worldDimension : dimensions) { + ResourceKey dimensionKey = dimensions.getResourceKey(worldDimension).get(); -+ + +- this.readScoreboard(worldpersistentdata); +- this.commandStorage = new PersistentCommandStorage(worldpersistentdata); + WorldServer world; + int dimension = 0; + @@ -218,14 +222,10 @@ + 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); diff --git a/nms-patches/net/minecraft/server/level/EntityPlayer.patch b/nms-patches/net/minecraft/server/level/EntityPlayer.patch index fa6dcbba5..bb44cec0b 100644 --- a/nms-patches/net/minecraft/server/level/EntityPlayer.patch +++ b/nms-patches/net/minecraft/server/level/EntityPlayer.patch @@ -77,8 +77,8 @@ + this.displayName = this.getScoreboardName(); + this.bukkitPickUpLoot = true; + this.maxHealthCache = this.getMaxHealth(); -+ } -+ + } + + // Yes, this doesn't match Vanilla, but it's the best we can do for now. + // If this is an issue, PRs are welcome + public final BlockPosition getSpawnPoint(WorldServer worldserver) { @@ -115,9 +115,9 @@ + } + + return blockposition; - } ++ } + // CraftBukkit end - ++ private void fudgeSpawnLocation(WorldServer worldserver) { BlockPosition blockposition = worldserver.getSharedSpawnPos(); @@ -302,7 +302,9 @@ + } + java.util.List loot = new java.util.ArrayList(this.getInventory().getContainerSize()); + boolean keepInventory = this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || this.isSpectator(); -+ + +- if (flag) { +- IChatBaseComponent ichatbasecomponent = this.getCombatTracker().getDeathMessage(); + if (!keepInventory) { + for (ItemStack item : this.getInventory().getContents()) { + if (!item.isEmpty() && !EnchantmentManager.hasVanishingCurse(item)) { @@ -316,9 +318,7 @@ + loot.add(item); + } + this.drops.clear(); // SPIGOT-5188: make sure to clear - -- if (flag) { -- IChatBaseComponent ichatbasecomponent = this.getCombatTracker().getDeathMessage(); ++ + IChatBaseComponent defaultMessage = this.getCombatTracker().getDeathMessage(); + + String deathmessage = defaultMessage.getString(); @@ -480,7 +480,9 @@ + exit = tpEvent.getTo(); + worldserver = ((CraftWorld) exit.getWorld()).getHandle(); + // CraftBukkit end -+ + +- worldserver1.getProfiler().pop(); +- worldserver1.getProfiler().push("placing"); + worldserver1.getProfiler().pop(); + worldserver1.getProfiler().push("placing"); + if (true) { // CraftBukkit @@ -493,9 +495,7 @@ + playerlist.sendPlayerPermissionLevel(this); + worldserver1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); + this.unsetRemoved(); - -- worldserver1.getProfiler().pop(); -- worldserver1.getProfiler().push("placing"); ++ + // CraftBukkit end this.setServerLevel(worldserver); - this.connection.teleport(shapedetectorshape.pos.x, shapedetectorshape.pos.y, shapedetectorshape.pos.z, shapedetectorshape.yRot, shapedetectorshape.xRot); @@ -583,14 +583,14 @@ + // CraftBukkit start + ResourceKey maindimensionkey = CraftDimensionUtil.getMainDimensionKey(worldserver); + ResourceKey maindimensionkey1 = CraftDimensionUtil.getMainDimensionKey(this.level()); -+ + +- CriterionTriggers.CHANGED_DIMENSION.trigger(this, resourcekey, resourcekey1); +- if (resourcekey == World.NETHER && resourcekey1 == World.OVERWORLD && this.enteredNetherPosition != null) { + CriterionTriggers.CHANGED_DIMENSION.trigger(this, maindimensionkey, maindimensionkey1); + if (maindimensionkey != resourcekey || maindimensionkey1 != resourcekey1) { + CriterionTriggers.CHANGED_DIMENSION.trigger(this, resourcekey, resourcekey1); + } - -- CriterionTriggers.CHANGED_DIMENSION.trigger(this, resourcekey, resourcekey1); -- if (resourcekey == World.NETHER && resourcekey1 == World.OVERWORLD && this.enteredNetherPosition != null) { ++ + if (maindimensionkey == World.NETHER && maindimensionkey1 == World.OVERWORLD && this.enteredNetherPosition != null) { + // CraftBukkit end CriterionTriggers.NETHER_TRAVEL.trigger(this, this.enteredNetherPosition); diff --git a/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch b/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch index 8c3091e92..5f735d50f 100644 --- a/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch +++ b/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch @@ -113,22 +113,21 @@ if (!collection.isEmpty()) { consumer.accept(new PacketPlayOutUpdateAttributes(this.entity.getId(), collection)); } -@@ -303,8 +342,15 @@ +@@ -303,7 +342,14 @@ if (!list.isEmpty()) { consumer.accept(new PacketPlayOutEntityEquipment(this.entity.getId(), list)); } + ((EntityLiving) this.entity).detectEquipmentUpdates(); // CraftBukkit - SPIGOT-3789: sync again immediately after sending - } - ++ } ++ + // CraftBukkit start - MC-109346: Fix for nonsensical head yaw + if (this.entity instanceof EntityPlayer) { + consumer.accept(new PacketPlayOutEntityHeadRotation(this.entity, (byte) MathHelper.floor(this.entity.getYHeadRot() * 256.0F / 360.0F))); -+ } + } + // CraftBukkit end -+ + if (!this.entity.getPassengers().isEmpty()) { consumer.accept(new PacketPlayOutMount(this.entity)); - } @@ -338,6 +384,11 @@ Set set = ((EntityLiving) this.entity).getAttributes().getDirtyAttributes(); diff --git a/nms-patches/net/minecraft/server/level/PlayerInteractManager.patch b/nms-patches/net/minecraft/server/level/PlayerInteractManager.patch index 89d26ea2c..ebd8253b9 100644 --- a/nms-patches/net/minecraft/server/level/PlayerInteractManager.patch +++ b/nms-patches/net/minecraft/server/level/PlayerInteractManager.patch @@ -158,7 +158,8 @@ + // CraftBukkit start - fire BlockBreakEvent + org.bukkit.block.Block bblock = CraftBlock.at(level, blockposition); + BlockBreakEvent event = null; -+ + +- if (!this.player.getMainHandItem().getItem().canAttackBlock(iblockdata, this.level, blockposition, this.player)) { + if (this.player instanceof EntityPlayer) { + // Sword + Creative mode pre-cancel + boolean isSwordNoBreak = !this.player.getMainHandItem().getItem().canAttackBlock(iblockdata, this.level, blockposition, this.player); @@ -193,8 +194,7 @@ + } + // Let the client know the block still exists + this.player.connection.send(new PacketPlayOutBlockChange(this.level, blockposition)); - -- if (!this.player.getMainHandItem().getItem().canAttackBlock(iblockdata, this.level, blockposition, this.player)) { ++ + // Brute force all possible updates + for (EnumDirection dir : EnumDirection.values()) { + this.player.connection.send(new PacketPlayOutBlockChange(level, blockposition.relative(dir))); @@ -252,13 +252,13 @@ + // CraftBukkit start + if (event.isDropItems()) { + org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, state, this.player, level.captureDrops); - } ++ } + level.captureDrops = null; + + // Drop event experience + if (flag && event != null) { + iblockdata.getBlock().popExperience(this.level, blockposition, event.getExpToDrop()); -+ } + } + + return true; + // CraftBukkit end diff --git a/nms-patches/net/minecraft/server/level/WorldServer.patch b/nms-patches/net/minecraft/server/level/WorldServer.patch index 830e23abf..62f0b0a4d 100644 --- a/nms-patches/net/minecraft/server/level/WorldServer.patch +++ b/nms-patches/net/minecraft/server/level/WorldServer.patch @@ -46,7 +46,9 @@ + // CraftBukkit start + public final Convertable.ConversionSession convertable; + public final UUID uuid; -+ + +- Objects.requireNonNull(minecraftserver); +- super(iworlddataserver, resourcekey, iregistrycustom_dimension, holder, minecraftserver::getProfiler, false, flag, i, minecraftserver.getMaxChainedNeighborUpdates()); + public Chunk getChunkIfLoaded(int x, int z) { + return this.chunkSource.getChunk(x, z, false); + } @@ -55,9 +57,7 @@ + public ResourceKey getTypeKey() { + return convertable.dimensionType; + } - -- Objects.requireNonNull(minecraftserver); -- super(iworlddataserver, resourcekey, iregistrycustom_dimension, holder, minecraftserver::getProfiler, false, flag, i, minecraftserver.getMaxChainedNeighborUpdates()); ++ + // Add env and gen to constructor, IWorldDataServer -> WorldDataServer + public WorldServer(MinecraftServer minecraftserver, Executor executor, Convertable.ConversionSession convertable_conversionsession, WorldDataServer iworlddataserver, ResourceKey resourcekey, WorldDimension worlddimension, WorldLoadListener worldloadlistener, boolean flag, long i, List list, boolean flag1, @Nullable RandomSequences randomsequences, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider) { + // IRegistryCustom.Dimension iregistrycustom_dimension = minecraftserver.registryAccess(); // CraftBukkit - decompile error diff --git a/nms-patches/net/minecraft/server/network/ServerConnection.patch b/nms-patches/net/minecraft/server/network/ServerConnection.patch index 65c45ba24..1108bf202 100644 --- a/nms-patches/net/minecraft/server/network/ServerConnection.patch +++ b/nms-patches/net/minecraft/server/network/ServerConnection.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/network/ServerConnection.java +++ b/net/minecraft/server/network/ServerConnection.java -@@ -98,16 +98,26 @@ +@@ -98,15 +98,25 @@ NetworkManager.configureSerialization(channelpipeline, EnumProtocolDirection.SERVERBOUND, (BandwidthDebugMonitor) null); int j = ServerConnection.this.server.getRateLimitPacketsPerSecond(); @@ -13,19 +13,18 @@ } - }).group(eventloopgroup).localAddress(inetaddress, i)).bind().syncUninterruptibly()); + }).group(eventloopgroup).localAddress(inetaddress, i)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit - } - } - ++ } ++ } ++ + // CraftBukkit start + public void acceptConnections() { + synchronized (this.channels) { + for (ChannelFuture future : this.channels) { + future.channel().config().setAutoRead(true); + } -+ } -+ } + } + } + // CraftBukkit end -+ + public SocketAddress startMemoryChannel() { List list = this.channels; - ChannelFuture channelfuture; diff --git a/nms-patches/net/minecraft/server/players/PlayerList.patch b/nms-patches/net/minecraft/server/players/PlayerList.patch index d4e9b43fe..162b8428a 100644 --- a/nms-patches/net/minecraft/server/players/PlayerList.patch +++ b/nms-patches/net/minecraft/server/players/PlayerList.patch @@ -427,14 +427,14 @@ + */ + return player == null; + // CraftBukkit end -+ } -+ -+ // CraftBukkit start -+ public EntityPlayer respawn(EntityPlayer entityplayer, boolean flag, RespawnReason reason) { -+ return this.respawn(entityplayer, this.server.getLevel(entityplayer.getRespawnDimension()), flag, null, true, reason); } - public EntityPlayer respawn(EntityPlayer entityplayer, boolean flag) { ++ // CraftBukkit start ++ public EntityPlayer respawn(EntityPlayer entityplayer, boolean flag, RespawnReason reason) { ++ return this.respawn(entityplayer, this.server.getLevel(entityplayer.getRespawnDimension()), flag, null, true, reason); ++ } ++ + public EntityPlayer respawn(EntityPlayer entityplayer, WorldServer worldserver, boolean flag, Location location, boolean avoidSuffocation, RespawnReason reason) { + entityplayer.stopRiding(); // CraftBukkit this.players.remove(entityplayer); @@ -483,7 +483,8 @@ + } else { + optional = Optional.empty(); + } -+ + +- f1 = (float) MathHelper.wrapDegrees(MathHelper.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D); + if (optional.isPresent()) { + IBlockData iblockdata = worldserver1.getBlockState(blockposition); + boolean flag3 = iblockdata.is(Blocks.RESPAWN_ANCHOR); @@ -506,13 +507,6 @@ + entityplayer1.connection.send(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F)); + entityplayer1.setRespawnPosition(null, null, 0f, false, false, PlayerSpawnChangeEvent.Cause.RESET); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed + } -+ } - -- f1 = (float) MathHelper.wrapDegrees(MathHelper.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D); -+ if (location == null) { -+ worldserver1 = this.server.getLevel(World.OVERWORLD); -+ blockposition = entityplayer1.getSpawnPoint(worldserver1); -+ location = CraftLocation.toBukkit(blockposition, worldserver1.getWorld()).add(0.5F, 0.1F, 0.5F); } - entityplayer1.moveTo(vec3d.x, vec3d.y, vec3d.z, f1, 0.0F); @@ -520,6 +514,12 @@ - flag2 = !flag && flag3; - } else if (blockposition != null) { - entityplayer1.connection.send(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F)); ++ if (location == null) { ++ worldserver1 = this.server.getLevel(World.OVERWORLD); ++ blockposition = entityplayer1.getSpawnPoint(worldserver1); ++ location = CraftLocation.toBukkit(blockposition, worldserver1.getWorld()).add(0.5F, 0.1F, 0.5F); ++ } ++ + Player respawnPlayer = entityplayer1.getBukkitEntity(); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn && !flag2, flag2, reason); + cserver.getPluginManager().callEvent(respawnEvent); diff --git a/nms-patches/net/minecraft/server/rcon/RemoteControlCommandListener.patch b/nms-patches/net/minecraft/server/rcon/RemoteControlCommandListener.patch index 10d573509..df736515a 100644 --- a/nms-patches/net/minecraft/server/rcon/RemoteControlCommandListener.patch +++ b/nms-patches/net/minecraft/server/rcon/RemoteControlCommandListener.patch @@ -14,12 +14,11 @@ private static final IChatBaseComponent RCON_COMPONENT = IChatBaseComponent.literal("Rcon"); private final StringBuffer buffer = new StringBuffer(); private final MinecraftServer server; -- -- public RemoteControlCommandListener(MinecraftServer minecraftserver) { + // CraftBukkit start + public final SocketAddress socketAddress; + private final CraftRemoteConsoleCommandSender remoteConsole = new CraftRemoteConsoleCommandSender(this); -+ + +- public RemoteControlCommandListener(MinecraftServer minecraftserver) { + public RemoteControlCommandListener(MinecraftServer minecraftserver, SocketAddress socketAddress) { + this.socketAddress = socketAddress; + // CraftBukkit end diff --git a/nms-patches/net/minecraft/world/entity/Entity.patch b/nms-patches/net/minecraft/world/entity/Entity.patch index f64a473be..cd99fd620 100644 --- a/nms-patches/net/minecraft/world/entity/Entity.patch +++ b/nms-patches/net/minecraft/world/entity/Entity.patch @@ -598,8 +598,9 @@ + this.setSecondsOnFire(entityCombustEvent.getDuration(), false); + } + // CraftBukkit end -+ } -+ + } + +- this.hurt(this.damageSources().lightningBolt(), 5.0F); + // CraftBukkit start + if (thisBukkitEntity instanceof Hanging) { + HangingBreakByEntityEvent hangingEvent = new HangingBreakByEntityEvent((Hanging) thisBukkitEntity, stormBukkitEntity); @@ -608,9 +609,8 @@ + if (hangingEvent.isCancelled()) { + return; + } - } - -- this.hurt(this.damageSources().lightningBolt(), 5.0F); ++ } ++ + if (this.fireImmune()) { + return; + } @@ -672,14 +672,14 @@ - WorldServer.makeObsidianPlatform(worldserver); + if (worldserver.getTypeKey() == WorldDimension.END) { // CraftBukkit + WorldServer.makeObsidianPlatform(worldserver, this); // CraftBukkit -+ } + } + // CraftBukkit start - Forward the CraftEntity to the new entity + this.getBukkitEntity().setHandle(entity); + entity.bukkitEntity = this.getBukkitEntity(); + + if (this instanceof EntityInsentient) { + ((EntityInsentient) this).dropLeash(true, false); // Unleash to prevent duping of leads. - } ++ } + // CraftBukkit end } diff --git a/nms-patches/net/minecraft/world/entity/EntityLiving.patch b/nms-patches/net/minecraft/world/entity/EntityLiving.patch index 9d8337a12..00cef3d77 100644 --- a/nms-patches/net/minecraft/world/entity/EntityLiving.patch +++ b/nms-patches/net/minecraft/world/entity/EntityLiving.patch @@ -703,7 +703,7 @@ + } + + f = (float) event.getFinalDamage(); - ++ + // Resistance + if (event.getDamage(DamageModifier.RESISTANCE) < 0) { + float f3 = (float) -event.getDamage(DamageModifier.RESISTANCE); @@ -726,7 +726,7 @@ + float armorDamage = (float) (event.getDamage() + event.getDamage(DamageModifier.BLOCKING) + event.getDamage(DamageModifier.HARD_HAT)); + this.hurtArmor(damagesource, armorDamage); + } -+ + + // Apply blocking code // PAIL: steal from above + if (event.getDamage(DamageModifier.BLOCKING) < 0) { + this.level().broadcastEntityEvent(this, (byte) 29); // SPIGOT-4635 - shield damage sound @@ -847,7 +847,7 @@ this.setSharedFlag(7, flag); } -@@ -3027,14 +3476,21 @@ +@@ -3027,13 +3476,20 @@ @Override public boolean isPickable() { @@ -859,18 +859,17 @@ public boolean isPushable() { - return this.isAlive() && !this.isSpectator() && !this.onClimbable(); + return this.isAlive() && !this.isSpectator() && !this.onClimbable() && this.collides; // CraftBukkit - } - ++ } ++ + // CraftBukkit start - collidable API + @Override + public boolean canCollideWithBukkit(Entity entity) { + return isPushable() && this.collides != this.collidableExemptions.contains(entity.getUUID()); -+ } + } + // CraftBukkit end -+ + @Override public float getYHeadRot() { - return this.yHeadRot; @@ -3229,7 +3685,26 @@ } else { if (!this.useItem.isEmpty() && this.isUsingItem()) { diff --git a/nms-patches/net/minecraft/world/entity/decoration/EntityItemFrame.patch b/nms-patches/net/minecraft/world/entity/decoration/EntityItemFrame.patch index b233ded22..4feeb281f 100644 --- a/nms-patches/net/minecraft/world/entity/decoration/EntityItemFrame.patch +++ b/nms-patches/net/minecraft/world/entity/decoration/EntityItemFrame.patch @@ -17,16 +17,15 @@ - double d1 = (double) this.pos.getX() + 0.5D - (double) this.direction.getStepX() * 0.46875D; - double d2 = (double) this.pos.getY() + 0.5D - (double) this.direction.getStepY() * 0.46875D; - double d3 = (double) this.pos.getZ() + 0.5D - (double) this.direction.getStepZ() * 0.46875D; -- ++ double d1 = (double) blockPosition.getX() + 0.5D - (double) direction.getStepX() * 0.46875D; ++ double d2 = (double) blockPosition.getY() + 0.5D - (double) direction.getStepY() * 0.46875D; ++ double d3 = (double) blockPosition.getZ() + 0.5D - (double) direction.getStepZ() * 0.46875D; + - this.setPosRaw(d1, d2, d3); - double d4 = (double) this.getWidth(); - double d5 = (double) this.getHeight(); - double d6 = (double) this.getWidth(); - EnumDirection.EnumAxis enumdirection_enumaxis = this.direction.getAxis(); -+ double d1 = (double) blockPosition.getX() + 0.5D - (double) direction.getStepX() * 0.46875D; -+ double d2 = (double) blockPosition.getY() + 0.5D - (double) direction.getStepY() * 0.46875D; -+ double d3 = (double) blockPosition.getZ() + 0.5D - (double) direction.getStepZ() * 0.46875D; -+ + if (entity != null) { + entity.setPosRaw(d1, d2, d3); + } diff --git a/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch b/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch index aa4c19d80..66071b16c 100644 --- a/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch +++ b/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch @@ -25,7 +25,10 @@ + org.bukkit.Location location = getBukkitEntity().getLocation(); + location.setPitch(player.getLocation().getPitch()); + location.setYaw(player.getLocation().getYaw()); -+ + +- if (entityendermite != null) { +- entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); +- this.level().addFreshEntity(entityendermite); + PlayerTeleportEvent teleEvent = new PlayerTeleportEvent(player, player.getLocation(), location, PlayerTeleportEvent.TeleportCause.ENDER_PEARL); + Bukkit.getPluginManager().callEvent(teleEvent); + @@ -37,13 +40,6 @@ + entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); + this.level().addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); + } -+ } - -- if (entityendermite != null) { -- entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); -- this.level().addFreshEntity(entityendermite); -+ if (entity.isPassenger()) { -+ entity.stopRiding(); } - } @@ -51,15 +47,19 @@ - entityplayer.dismountTo(this.getX(), this.getY(), this.getZ()); - } else { - entity.teleportTo(this.getX(), this.getY(), this.getZ()); +- } ++ if (entity.isPassenger()) { ++ entity.stopRiding(); ++ } + +- entity.resetFallDistance(); +- entity.hurt(this.damageSources().fall(), 5.0F); + entityplayer.connection.teleport(teleEvent.getTo()); + entity.resetFallDistance(); + CraftEventFactory.entityDamage = this; + entity.hurt(this.damageSources().fall(), 5.0F); + CraftEventFactory.entityDamage = null; - } -- -- entity.resetFallDistance(); -- entity.hurt(this.damageSources().fall(), 5.0F); ++ } + // CraftBukkit end } } else if (entity != null) { diff --git a/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch b/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch index 2f4e54633..158eec446 100644 --- a/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch +++ b/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch @@ -46,7 +46,10 @@ + } + } + } -+ + +- while (iterator1.hasNext()) { +- MobEffect mobeffect = (MobEffect) iterator1.next(); +- MobEffectList mobeffectlist = mobeffect.getEffect(); + org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, affected); + if (!event.isCancelled() && list != null && !list.isEmpty()) { // do not process effects if there are no effects to process + Entity entity1 = this.getEffectSource(); @@ -54,11 +57,22 @@ + if (!(victim instanceof CraftLivingEntity)) { + continue; + } -+ + +- if (mobeffectlist.isInstantenous()) { +- mobeffectlist.applyInstantenousEffect(this, this.getOwner(), entityliving, mobeffect.getAmplifier(), d1); +- } else { +- int i = mobeffect.mapDuration((j) -> { +- return (int) (d1 * (double) j + 0.5D); +- }); +- MobEffect mobeffect1 = new MobEffect(mobeffectlist, i, mobeffect.getAmplifier(), mobeffect.isAmbient(), mobeffect.isVisible()); + EntityLiving entityliving = ((CraftLivingEntity) victim).getHandle(); + double d1 = event.getIntensity(victim); + // CraftBukkit end -+ + +- if (!mobeffect1.endsWithin(20)) { +- entityliving.addEffect(mobeffect1, entity1); +- } +- } + Iterator iterator1 = list.iterator(); + + while (iterator1.hasNext()) { @@ -80,23 +94,7 @@ + return (int) (d1 * (double) j + 0.5D); + }); + MobEffect mobeffect1 = new MobEffect(mobeffectlist, i, mobeffect.getAmplifier(), mobeffect.isAmbient(), mobeffect.isVisible()); - -- while (iterator1.hasNext()) { -- MobEffect mobeffect = (MobEffect) iterator1.next(); -- MobEffectList mobeffectlist = mobeffect.getEffect(); -- -- if (mobeffectlist.isInstantenous()) { -- mobeffectlist.applyInstantenousEffect(this, this.getOwner(), entityliving, mobeffect.getAmplifier(), d1); -- } else { -- int i = mobeffect.mapDuration((j) -> { -- return (int) (d1 * (double) j + 0.5D); -- }); -- MobEffect mobeffect1 = new MobEffect(mobeffectlist, i, mobeffect.getAmplifier(), mobeffect.isAmbient(), mobeffect.isVisible()); -- -- if (!mobeffect1.endsWithin(20)) { -- entityliving.addEffect(mobeffect1, entity1); -- } -- } ++ + if (!mobeffect1.endsWithin(20)) { + entityliving.addEffect(mobeffect1, entity1, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.POTION_SPLASH); // CraftBukkit } diff --git a/nms-patches/net/minecraft/world/entity/projectile/EntityShulkerBullet.patch b/nms-patches/net/minecraft/world/entity/projectile/EntityShulkerBullet.patch index d6a8f7057..cdcf10b22 100644 --- a/nms-patches/net/minecraft/world/entity/projectile/EntityShulkerBullet.patch +++ b/nms-patches/net/minecraft/world/entity/projectile/EntityShulkerBullet.patch @@ -1,12 +1,12 @@ --- a/net/minecraft/world/entity/projectile/EntityShulkerBullet.java +++ b/net/minecraft/world/entity/projectile/EntityShulkerBullet.java -@@ -60,8 +60,21 @@ +@@ -60,7 +60,20 @@ this.finalTarget = entity; this.currentMoveDirection = EnumDirection.UP; this.selectNextMoveDirection(enumdirection_enumaxis); + projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - } - ++ } ++ + // CraftBukkit start + public Entity getTarget() { + return this.finalTarget; @@ -16,12 +16,11 @@ + this.finalTarget = e; + this.currentMoveDirection = EnumDirection.UP; + this.selectNextMoveDirection(EnumDirection.EnumAxis.X); -+ } + } + // CraftBukkit end -+ + @Override public SoundCategory getSoundSource() { - return SoundCategory.HOSTILE; @@ -225,7 +238,7 @@ MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResultOnMoveVector(this, this::canHitEntity); diff --git a/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch b/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch index 17b521cde..4775eabe3 100644 --- a/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch +++ b/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch @@ -144,11 +144,6 @@ - - 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 { @@ -158,7 +153,11 @@ + if (nms == null) { + continue; + } -+ + +- if (flag) { +- ItemEnchantedBook.addEnchantment(itemstack2, weightedrandomenchant); +- } else { +- itemstack2.enchant(weightedrandomenchant.enchantment, weightedrandomenchant.level); + WeightedRandomEnchant weightedrandomenchant = new WeightedRandomEnchant(nms, entry.getValue()); + ItemEnchantedBook.addEnchantment(itemstack2, weightedrandomenchant); + } else { diff --git a/nms-patches/net/minecraft/world/inventory/InventoryEnderChest.patch b/nms-patches/net/minecraft/world/inventory/InventoryEnderChest.patch index 6b762b3b6..38e077798 100644 --- a/nms-patches/net/minecraft/world/inventory/InventoryEnderChest.patch +++ b/nms-patches/net/minecraft/world/inventory/InventoryEnderChest.patch @@ -16,7 +16,8 @@ private TileEntityEnderChest activeChest; + // CraftBukkit start + private final EntityHuman owner; -+ + +- public InventoryEnderChest() { + public InventoryHolder getBukkitOwner() { + return owner.getBukkitEntity(); + } @@ -25,8 +26,7 @@ + public Location getLocation() { + return this.activeChest != null ? CraftLocation.toBukkit(this.activeChest.getBlockPos(), this.activeChest.getLevel().getWorld()) : null; + } - -- public InventoryEnderChest() { ++ + public InventoryEnderChest(EntityHuman owner) { super(27); + this.owner = owner; diff --git a/nms-patches/net/minecraft/world/item/ItemArmor.patch b/nms-patches/net/minecraft/world/item/ItemArmor.patch index 9717bdc4b..4b18f9463 100644 --- a/nms-patches/net/minecraft/world/item/ItemArmor.patch +++ b/nms-patches/net/minecraft/world/item/ItemArmor.patch @@ -21,7 +21,8 @@ + World world = sourceblock.level(); + org.bukkit.block.Block block = CraftBlock.at(world, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); -+ + +- entityliving.setItemSlot(enumitemslot, itemstack1); + BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) entityliving.getBukkitEntity()); + if (!BlockDispenser.eventFired) { + world.getCraftServer().getPluginManager().callEvent(event); @@ -42,8 +43,7 @@ + return true; + } + } - -- entityliving.setItemSlot(enumitemslot, itemstack1); ++ + entityliving.setItemSlot(enumitemslot, CraftItemStack.asNMSCopy(event.getItem())); + // CraftBukkit end if (entityliving instanceof EntityInsentient) { diff --git a/nms-patches/net/minecraft/world/item/ItemBlock.patch b/nms-patches/net/minecraft/world/item/ItemBlock.patch index 387341211..0f096b5bd 100644 --- a/nms-patches/net/minecraft/world/item/ItemBlock.patch +++ b/nms-patches/net/minecraft/world/item/ItemBlock.patch @@ -100,11 +100,11 @@ + // CraftBukkit start - store default return + boolean defaultReturn = (!this.mustSurvive() || iblockdata.canSurvive(blockactioncontext.getLevel(), blockactioncontext.getClickedPos())) && blockactioncontext.getLevel().isUnobstructed(iblockdata, blockactioncontext.getClickedPos(), voxelshapecollision); + org.bukkit.entity.Player player = (blockactioncontext.getPlayer() instanceof EntityPlayer) ? (org.bukkit.entity.Player) blockactioncontext.getPlayer().getBukkitEntity() : null; -+ -+ BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(blockactioncontext.getLevel(), blockactioncontext.getClickedPos()), player, CraftBlockData.fromData(iblockdata), defaultReturn); -+ blockactioncontext.getLevel().getCraftServer().getPluginManager().callEvent(event); - return (!this.mustSurvive() || iblockdata.canSurvive(blockactioncontext.getLevel(), blockactioncontext.getClickedPos())) && blockactioncontext.getLevel().isUnobstructed(iblockdata, blockactioncontext.getClickedPos(), voxelshapecollision); ++ BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(blockactioncontext.getLevel(), blockactioncontext.getClickedPos()), player, CraftBlockData.fromData(iblockdata), defaultReturn); ++ blockactioncontext.getLevel().getCraftServer().getPluginManager().callEvent(event); ++ + return event.isBuildable(); + // CraftBukkit end } diff --git a/nms-patches/net/minecraft/world/item/crafting/CraftingManager.patch b/nms-patches/net/minecraft/world/item/crafting/CraftingManager.patch index c4367e380..90318d052 100644 --- a/nms-patches/net/minecraft/world/item/crafting/CraftingManager.patch +++ b/nms-patches/net/minecraft/world/item/crafting/CraftingManager.patch @@ -107,7 +107,7 @@ }); MinecraftKey minecraftkey = recipeholder.id(); RecipeHolder recipeholder1 = (RecipeHolder) map1.put(minecraftkey, recipeholder); -@@ -182,8 +208,28 @@ +@@ -182,9 +208,29 @@ } }); this.recipes = ImmutableMap.copyOf(map); @@ -122,8 +122,8 @@ + } + + return byName.remove(mcKey) != null; -+ } -+ + } + + public void clearRecipes() { + this.recipes = Maps.newHashMap(); + @@ -132,8 +132,9 @@ + } + + this.byName = Maps.newHashMap(); - } ++ } + // CraftBukkit end - ++ public static > CraftingManager.a createCheck(final Recipes recipes) { return new CraftingManager.a() { + @Nullable diff --git a/nms-patches/net/minecraft/world/level/WorldAccess.patch b/nms-patches/net/minecraft/world/level/WorldAccess.patch index 204d48ae8..46d84cb1c 100644 --- a/nms-patches/net/minecraft/world/level/WorldAccess.patch +++ b/nms-patches/net/minecraft/world/level/WorldAccess.patch @@ -7,11 +7,11 @@ - entity.getSelfAndPassengers().forEach(this::addFreshEntity); + // CraftBukkit start + this.addFreshEntityWithPassengers(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); - } ++ } + + default void addFreshEntityWithPassengers(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) { + entity.getSelfAndPassengers().forEach((e) -> this.addFreshEntity(e, reason)); -+ } + } + + @Override + default WorldServer getMinecraftWorld() { diff --git a/nms-patches/net/minecraft/world/level/block/Block.patch b/nms-patches/net/minecraft/world/level/block/Block.patch index 3fc1a6510..a71805eda 100644 --- a/nms-patches/net/minecraft/world/level/block/Block.patch +++ b/nms-patches/net/minecraft/world/level/block/Block.patch @@ -24,7 +24,7 @@ dropResources(iblockdata, world, blockposition, tileentity, entityhuman, itemstack); } -@@ -504,16 +510,24 @@ +@@ -504,17 +510,25 @@ return this.builtInRegistryHolder; } @@ -42,12 +42,13 @@ } + return 0; -+ } -+ + } + + public int getExpDrop(IBlockData iblockdata, WorldServer worldserver, BlockPosition blockposition, ItemStack itemstack, boolean flag) { + return 0; - } ++ } + // CraftBukkit end - ++ public static final class a { + private final IBlockData first; diff --git a/nms-patches/net/minecraft/world/level/block/BlockDoor.patch b/nms-patches/net/minecraft/world/level/block/BlockDoor.patch index 70e0efbfe..85cc97f30 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockDoor.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockDoor.patch @@ -16,7 +16,8 @@ - boolean flag1 = world.hasNeighborSignal(blockposition) || world.hasNeighborSignal(blockposition.relative(iblockdata.getValue(BlockDoor.HALF) == BlockPropertyDoubleBlockHalf.LOWER ? EnumDirection.UP : EnumDirection.DOWN)); + // CraftBukkit start + BlockPosition otherHalf = blockposition.relative(iblockdata.getValue(BlockDoor.HALF) == BlockPropertyDoubleBlockHalf.LOWER ? EnumDirection.UP : EnumDirection.DOWN); -+ + +- if (!this.defaultBlockState().is(block) && flag1 != (Boolean) iblockdata.getValue(BlockDoor.POWERED)) { + org.bukkit.World bworld = world.getWorld(); + org.bukkit.block.Block bukkitBlock = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); + org.bukkit.block.Block blockTop = bworld.getBlockAt(otherHalf.getX(), otherHalf.getY(), otherHalf.getZ()); @@ -29,8 +30,7 @@ + if (oldPower == 0 ^ power == 0) { + BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power); + world.getCraftServer().getPluginManager().callEvent(eventRedstone); - -- if (!this.defaultBlockState().is(block) && flag1 != (Boolean) iblockdata.getValue(BlockDoor.POWERED)) { ++ + boolean flag1 = eventRedstone.getNewCurrent() > 0; + // CraftBukkit end if (flag1 != (Boolean) iblockdata.getValue(BlockDoor.OPEN)) { 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 890bb9706..a6a2223b3 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntityBeacon.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntityBeacon.patch @@ -28,7 +28,7 @@ @Nullable static MobEffectList filterEffect(@Nullable MobEffectList mobeffectlist) { -@@ -245,39 +259,78 @@ +@@ -245,38 +259,77 @@ super.setRemoved(); } @@ -93,9 +93,9 @@ } + return false; - } - } - ++ } ++ } ++ + private static void applyEffects(World world, BlockPosition blockposition, int i, @Nullable MobEffectList mobeffectlist, @Nullable MobEffectList mobeffectlist1) { + if (!world.isClientSide && mobeffectlist != null) { + double d0 = (double) (i * 10 + 10); @@ -109,14 +109,13 @@ + if (hasSecondaryEffect(i, mobeffectlist, mobeffectlist1)) { + applyEffect(list, mobeffectlist1, j, 0); + } -+ } + } + -+ } + } + // CraftBukkit end -+ + public static void playSound(World world, BlockPosition blockposition, SoundEffect soundeffect) { world.playSound((EntityHuman) null, blockposition, soundeffect, SoundCategory.BLOCKS, 1.0F, 1.0F); - } @@ -312,7 +365,7 @@ if (nbttagcompound.contains(s, 8)) { MinecraftKey minecraftkey = MinecraftKey.tryParse(nbttagcompound.getString(s)); diff --git a/nms-patches/net/minecraft/world/level/block/entity/TileEntityBrewingStand.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntityBrewingStand.patch index 74b4b219c..ebdc6f2ba 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntityBrewingStand.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntityBrewingStand.patch @@ -124,8 +124,9 @@ ItemStack itemstack = (ItemStack) nonnulllist.get(3); + InventoryHolder owner = tileentitybrewingstand.getOwner(); + List brewResults = new ArrayList<>(3); -+ -+ for (int i = 0; i < 3; ++i) { + + for (int i = 0; i < 3; ++i) { +- nonnulllist.set(i, PotionBrewer.mix(itemstack, (ItemStack) nonnulllist.get(i))); + brewResults.add(i, CraftItemStack.asCraftMirror(PotionBrewer.mix(itemstack, (ItemStack) nonnulllist.get(i)))); + } + @@ -137,9 +138,8 @@ + } + } + // CraftBukkit end - - for (int i = 0; i < 3; ++i) { -- nonnulllist.set(i, PotionBrewer.mix(itemstack, (ItemStack) nonnulllist.get(i))); ++ ++ for (int i = 0; i < 3; ++i) { + // CraftBukkit start - validate index in case it is cleared by plugins + if (i < brewResults.size()) { + nonnulllist.set(i, CraftItemStack.asNMSCopy(brewResults.get(i)));