221
This commit is contained in:
		
					parent
					
						
							
								717c16dc69
							
						
					
				
			
			
				commit
				
					
						e45f4f85f4
					
				
			
		
					 49 changed files with 107 additions and 168 deletions
				
			
		| 
						 | 
					@ -19,11 +19,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
@@ -0,0 +0,0 @@ import org.bukkit.Material;
 | 
					@@ -0,0 +0,0 @@ import org.bukkit.Material;
 | 
				
			||||||
 import org.bukkit.configuration.serialization.DelegateDeserialization;
 | 
					 import org.bukkit.configuration.serialization.DelegateDeserialization;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 @DelegateDeserialization(CraftMetaItem.SerializableMeta.class)
 | 
					 @DelegateDeserialization(SerializableMeta.class)
 | 
				
			||||||
-public class CraftMetaArmorStand extends CraftMetaItem {
 | 
					-public class CraftMetaArmorStand extends CraftMetaItem {
 | 
				
			||||||
+public class CraftMetaArmorStand extends CraftMetaItem implements com.destroystokyo.paper.inventory.meta.ArmorStandMeta { // Paper
 | 
					+public class CraftMetaArmorStand extends CraftMetaItem implements com.destroystokyo.paper.inventory.meta.ArmorStandMeta { // Paper
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     static final ItemMetaKey ENTITY_TAG = new ItemMetaKey("EntityTag", "entity-tag");
 | 
					     static final ItemMetaKeyType<CustomData> ENTITY_TAG = new ItemMetaKeyType<>(DataComponents.ENTITY_DATA, "entity-tag");
 | 
				
			||||||
+    // Paper start
 | 
					+    // Paper start
 | 
				
			||||||
+    static final ItemMetaKey INVISIBLE = new ItemMetaKey("Invisible", "invisible");
 | 
					+    static final ItemMetaKey INVISIBLE = new ItemMetaKey("Invisible", "invisible");
 | 
				
			||||||
+    static final ItemMetaKey NO_BASE_PLATE = new ItemMetaKey("NoBasePlate", "no-base-plate");
 | 
					+    static final ItemMetaKey NO_BASE_PLATE = new ItemMetaKey("NoBasePlate", "no-base-plate");
 | 
				
			||||||
| 
						 | 
					@ -56,8 +56,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
 | 
					@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
         if (tag.contains(CraftMetaArmorStand.ENTITY_TAG.NBT)) {
 | 
					         getOrEmpty(tag, CraftMetaArmorStand.ENTITY_TAG).ifPresent((nbt) -> {
 | 
				
			||||||
             this.entityTag = tag.getCompound(CraftMetaArmorStand.ENTITY_TAG.NBT).copy();
 | 
					             this.entityTag = nbt.copyTag();
 | 
				
			||||||
+            // Paper start
 | 
					+            // Paper start
 | 
				
			||||||
+            if (entityTag.contains(INVISIBLE.NBT)) {
 | 
					+            if (entityTag.contains(INVISIBLE.NBT)) {
 | 
				
			||||||
+                invisible = entityTag.getBoolean(INVISIBLE.NBT);
 | 
					+                invisible = entityTag.getBoolean(INVISIBLE.NBT);
 | 
				
			||||||
| 
						 | 
					@ -79,7 +79,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+                marker = entityTag.getBoolean(MARKER.NBT);
 | 
					+                marker = entityTag.getBoolean(MARKER.NBT);
 | 
				
			||||||
+            }
 | 
					+            }
 | 
				
			||||||
+            // Paper end
 | 
					+            // Paper end
 | 
				
			||||||
         }
 | 
					         });
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     CraftMetaArmorStand(Map<String, Object> map) {
 | 
					     CraftMetaArmorStand(Map<String, Object> map) {
 | 
				
			||||||
| 
						 | 
					@ -95,7 +95,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     @Override
 | 
					     @Override
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
 | 
					@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
 | 
				
			||||||
     void applyToItem(CompoundTag tag) {
 | 
					     void applyToItem(CraftMetaItem.Applicator tag) {
 | 
				
			||||||
         super.applyToItem(tag);
 | 
					         super.applyToItem(tag);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+        // Paper start
 | 
					+        // Paper start
 | 
				
			||||||
| 
						 | 
					@ -124,7 +124,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+        }
 | 
					+        }
 | 
				
			||||||
+        // Paper end
 | 
					+        // Paper end
 | 
				
			||||||
         if (this.entityTag != null) {
 | 
					         if (this.entityTag != null) {
 | 
				
			||||||
             tag.put(CraftMetaArmorStand.ENTITY_TAG.NBT, this.entityTag);
 | 
					             tag.put(CraftMetaArmorStand.ENTITY_TAG, CustomData.of(this.entityTag));
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
 | 
					@@ -0,0 +0,0 @@ public class CraftMetaArmorStand extends CraftMetaItem {
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
| 
						 | 
					@ -254,25 +254,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+    }
 | 
					+    }
 | 
				
			||||||
+    // Paper end
 | 
					+    // Paper end
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
 | 
					 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					 | 
				
			||||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
 | 
					 | 
				
			||||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
 | 
					 | 
				
			||||||
@@ -0,0 +0,0 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
 | 
					 | 
				
			||||||
                         CraftMetaCrossbow.CHARGED.NBT,
 | 
					 | 
				
			||||||
                         CraftMetaCrossbow.CHARGED_PROJECTILES.NBT,
 | 
					 | 
				
			||||||
                         CraftMetaSuspiciousStew.EFFECTS.NBT,
 | 
					 | 
				
			||||||
+                        // Paper start
 | 
					 | 
				
			||||||
+                        CraftMetaArmorStand.ENTITY_TAG.NBT,
 | 
					 | 
				
			||||||
+                        CraftMetaArmorStand.INVISIBLE.NBT,
 | 
					 | 
				
			||||||
+                        CraftMetaArmorStand.NO_BASE_PLATE.NBT,
 | 
					 | 
				
			||||||
+                        CraftMetaArmorStand.SHOW_ARMS.NBT,
 | 
					 | 
				
			||||||
+                        CraftMetaArmorStand.SMALL.NBT,
 | 
					 | 
				
			||||||
+                        CraftMetaArmorStand.MARKER.NBT,
 | 
					 | 
				
			||||||
+                        // Paper end
 | 
					 | 
				
			||||||
                         CraftMetaCompass.LODESTONE_DIMENSION.NBT,
 | 
					 | 
				
			||||||
                         CraftMetaCompass.LODESTONE_POS.NBT,
 | 
					 | 
				
			||||||
                         CraftMetaCompass.LODESTONE_TRACKED.NBT,
 | 
					 | 
				
			||||||
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
 | 
					diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
 | 
					--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/jav
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
 | 
					--- a/src/main/java/net/minecraft/world/entity/Entity.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
 | 
					+++ b/src/main/java/net/minecraft/world/entity/Entity.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
 | 
					@@ -0,0 +0,0 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
| 
						 | 
					@ -102,13 +102,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/warden/SonicBoom.java
 | 
					--- a/src/main/java/net/minecraft/world/entity/ai/behavior/warden/SonicBoom.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/warden/SonicBoom.java
 | 
					+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/warden/SonicBoom.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class SonicBoom extends Behavior<Warden> {
 | 
					@@ -0,0 +0,0 @@ public class SonicBoom extends Behavior<Warden> {
 | 
				
			||||||
                     target.hurt(world.damageSources().sonicBoom(entity), 10.0F);
 | 
					                     if (target.hurt(world.damageSources().sonicBoom(entity), 10.0F)) {
 | 
				
			||||||
                         double d = 0.5 * (1.0 - target.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE));
 | 
					                         double d = 0.5 * (1.0 - target.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE));
 | 
				
			||||||
                         double e = 2.5 * (1.0 - target.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE));
 | 
					                         double e = 2.5 * (1.0 - target.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE));
 | 
				
			||||||
-                        target.push(vec33.x() * e, vec33.y() * d, vec33.z() * e);
 | 
					-                        target.push(vec33.x() * e, vec33.y() * d, vec33.z() * e);
 | 
				
			||||||
+                        target.push(vec33.x() * e, vec33.y() * d, vec33.z() * e, entity); // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent
 | 
					+                        target.push(vec33.x() * e, vec33.y() * d, vec33.z() * e, entity); // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent
 | 
				
			||||||
                 });
 | 
					 | 
				
			||||||
                     }
 | 
					                     }
 | 
				
			||||||
 | 
					                 });
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
 | 
					diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
| 
						 | 
					@ -39,11 +39,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
         java.util.UUID uniqueId = gameprofile.getId();
 | 
					         java.util.UUID uniqueId = gameprofile.getId();
 | 
				
			||||||
         final org.bukkit.craftbukkit.CraftServer server = ServerLoginPacketListenerImpl.this.server.server;
 | 
					         final org.bukkit.craftbukkit.CraftServer server = ServerLoginPacketListenerImpl.this.server.server;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
-        AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId);
 | 
					-        AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId, this.transferred);
 | 
				
			||||||
+        // Paper start - Add more fields to AsyncPlayerPreLoginEvent
 | 
					+        // Paper start - Add more fields to AsyncPlayerPreLoginEvent
 | 
				
			||||||
+        final InetAddress rawAddress = ((InetSocketAddress) this.connection.channel.remoteAddress()).getAddress();
 | 
					+        final InetAddress rawAddress = ((InetSocketAddress) this.connection.channel.remoteAddress()).getAddress();
 | 
				
			||||||
+        com.destroystokyo.paper.profile.PlayerProfile profile = org.bukkit.Bukkit.createProfile(uniqueId, playerName);
 | 
					+        com.destroystokyo.paper.profile.PlayerProfile profile = org.bukkit.Bukkit.createProfile(uniqueId, playerName);
 | 
				
			||||||
+        AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, rawAddress, uniqueId, profile, this.connection.hostname);
 | 
					+        AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, rawAddress, uniqueId, this.transferred, profile, this.connection.hostname);
 | 
				
			||||||
         server.getPluginManager().callEvent(asyncEvent);
 | 
					         server.getPluginManager().callEvent(asyncEvent);
 | 
				
			||||||
+        profile = asyncEvent.getPlayerProfile();
 | 
					+        profile = asyncEvent.getPlayerProfile();
 | 
				
			||||||
+        profile.complete();
 | 
					+        profile.complete();
 | 
				
			||||||
| 
						 | 
					@ -13,12 +13,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
                                 }
 | 
					                                 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
                                 this.setDeltaMovement(this.getDeltaMovement().multiply(0.6D, 1.0D, 0.6D));
 | 
					                                 this.setDeltaMovement(this.getDeltaMovement().multiply(0.6D, 1.0D, 0.6D));
 | 
				
			||||||
-                            this.setSprinting(false);
 | 
					 | 
				
			||||||
+                            // Paper start - Configurable sprint interruption on attack
 | 
					+                            // Paper start - Configurable sprint interruption on attack
 | 
				
			||||||
+                            if (!this.level().paperConfig().misc.disableSprintInterruptionOnAttack) {
 | 
					+                            if (!this.level().paperConfig().misc.disableSprintInterruptionOnAttack) {
 | 
				
			||||||
+                                this.setSprinting(false);
 | 
					                                 this.setSprinting(false);
 | 
				
			||||||
+                            }
 | 
					 | 
				
			||||||
+                            // Paper end - Configurable sprint interruption on attack
 | 
					 | 
				
			||||||
                             }
 | 
					                             }
 | 
				
			||||||
 | 
					+                            // Paper end - Configurable sprint interruption on attack
 | 
				
			||||||
 | 
					+                            }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
                             if (flag3) {
 | 
					                             if (flag3) {
 | 
				
			||||||
 | 
					                                 float f4 = 1.0F + EnchantmentHelper.getSweepingDamageRatio(this) * f;
 | 
				
			||||||
| 
						 | 
					@ -10,8 +10,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
 | 
					--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
 | 
				
			||||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
 | 
					+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class CraftWorld extends CraftRegionAccessor implements World {
 | 
					@@ -0,0 +0,0 @@ public class CraftWorld extends CraftRegionAccessor implements World {
 | 
				
			||||||
     public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source) {
 | 
					 
 | 
				
			||||||
         return !this.world.explode(source == null ? null : ((CraftEntity) source).getHandle(), x, y, z, power, setFire, breakBlocks ? net.minecraft.world.level.Level.ExplosionInteraction.MOB : net.minecraft.world.level.Level.ExplosionInteraction.NONE).wasCanceled;
 | 
					         return !this.world.explode(source == null ? null : ((CraftEntity) source).getHandle(), x, y, z, power, setFire, explosionType).wasCanceled;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
+    // Paper start
 | 
					+    // Paper start
 | 
				
			||||||
+    @Override
 | 
					+    @Override
 | 
				
			||||||
| 
						 | 
					@ -42,12 +42,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
     @Override
 | 
					     @Override
 | 
				
			||||||
     public <T> void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) {
 | 
					     public <T> void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) {
 | 
				
			||||||
+        // Paper start - Particle API
 | 
					+        // Paper start - Particle API
 | 
				
			||||||
+        spawnParticle(particle, null, null, x, y, z, count, offsetX, offsetY, offsetZ, extra, data, force);
 | 
					+        this.spawnParticle(particle, null, null, x, y, z, count, offsetX, offsetY, offsetZ, extra, data, force);
 | 
				
			||||||
+    }
 | 
					+    }
 | 
				
			||||||
+    @Override
 | 
					+    @Override
 | 
				
			||||||
+    public <T> void spawnParticle(Particle particle, List<Player> receivers, Player sender, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) {
 | 
					+    public <T> void spawnParticle(Particle particle, List<Player> receivers, Player sender, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) {
 | 
				
			||||||
+        // Paper end - Particle API
 | 
					+        // Paper end - Particle API
 | 
				
			||||||
         particle = CraftParticle.convertLegacy(particle);
 | 
					 | 
				
			||||||
         data = CraftParticle.convertLegacy(data);
 | 
					         data = CraftParticle.convertLegacy(data);
 | 
				
			||||||
         if (data != null) {
 | 
					         if (data != null) {
 | 
				
			||||||
             Preconditions.checkArgument(particle.getDataType().isInstance(data), "data (%s) should be %s", data.getClass(), particle.getDataType());
 | 
					             Preconditions.checkArgument(particle.getDataType().isInstance(data), "data (%s) should be %s", data.getClass(), particle.getDataType());
 | 
				
			||||||
| 
						 | 
					@ -23,5 +23,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
             }
 | 
					             }
 | 
				
			||||||
+            // Paper end - extend Player Interact cancellation
 | 
					+            // Paper end - extend Player Interact cancellation
 | 
				
			||||||
             player.getBukkitEntity().updateInventory(); // SPIGOT-2867
 | 
					             player.getBukkitEntity().updateInventory(); // SPIGOT-2867
 | 
				
			||||||
             enuminteractionresult = (event.useItemInHand() != Event.Result.ALLOW) ? InteractionResult.SUCCESS : InteractionResult.PASS;
 | 
					             return (event.useItemInHand() != Event.Result.ALLOW) ? InteractionResult.SUCCESS : InteractionResult.PASS;
 | 
				
			||||||
         } else if (this.gameModeForPlayer == GameType.SPECTATOR) {
 | 
					         } else if (this.gameModeForPlayer == GameType.SPECTATOR) {
 | 
				
			||||||
| 
						 | 
					@ -45,16 +45,3 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
     public @Nullable ProfileResult fetchProfile(final UUID profileId, final boolean requireSecure) {
 | 
					     public @Nullable ProfileResult fetchProfile(final UUID profileId, final boolean requireSecure) {
 | 
				
			||||||
         return super.fetchProfile(profileId, requireSecure);
 | 
					         return super.fetchProfile(profileId, requireSecure);
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
diff --git a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
 | 
					 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
 | 
					 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
 | 
					 | 
				
			||||||
@@ -0,0 +0,0 @@ public class SkullBlockEntity extends BlockEntity {
 | 
					 | 
				
			||||||
         return apiServices.profileCache().getAsync(name).thenApplyAsync((optional) -> {
 | 
					 | 
				
			||||||
             if (optional.isPresent() && !booleansupplier.getAsBoolean()) {
 | 
					 | 
				
			||||||
                 UUID uuid = ((GameProfile) optional.get()).getId();
 | 
					 | 
				
			||||||
-                ProfileResult profileresult = apiServices.sessionService().fetchProfile(uuid, true);
 | 
					 | 
				
			||||||
+                ProfileResult profileresult = apiServices.sessionService() instanceof com.destroystokyo.paper.profile.PaperMinecraftSessionService paperMinecraftSessionService ? paperMinecraftSessionService.fetchProfile(optional.get(), true) : apiServices.sessionService().fetchProfile(uuid, true); // Paper - FillProfileEvent
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
                 return profileresult != null ? Optional.ofNullable(profileresult.profile()) : optional;
 | 
					 | 
				
			||||||
             } else {
 | 
					 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
 | 
					--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
 | 
				
			||||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
 | 
					+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public final class CraftItemStack extends ItemStack {
 | 
					@@ -0,0 +0,0 @@ public final class CraftItemStack extends ItemStack {
 | 
				
			||||||
         return (this.handle == null) ? Material.AIR.getMaxStackSize() : this.handle.getItem().getMaxStackSize();
 | 
					         return (this.handle == null) ? Material.AIR.getMaxStackSize() : this.handle.getMaxStackSize();
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+    // Paper start
 | 
					+    // Paper start
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
         final InetAddress rawAddress = ((InetSocketAddress) this.connection.channel.remoteAddress()).getAddress();
 | 
					         final InetAddress rawAddress = ((InetSocketAddress) this.connection.channel.remoteAddress()).getAddress();
 | 
				
			||||||
-        com.destroystokyo.paper.profile.PlayerProfile profile = org.bukkit.Bukkit.createProfile(uniqueId, playerName);
 | 
					-        com.destroystokyo.paper.profile.PlayerProfile profile = org.bukkit.Bukkit.createProfile(uniqueId, playerName);
 | 
				
			||||||
+        com.destroystokyo.paper.profile.PlayerProfile profile = com.destroystokyo.paper.profile.CraftPlayerProfile.asBukkitMirror(gameprofile); // Paper - setPlayerProfileAPI
 | 
					+        com.destroystokyo.paper.profile.PlayerProfile profile = com.destroystokyo.paper.profile.CraftPlayerProfile.asBukkitMirror(gameprofile); // Paper - setPlayerProfileAPI
 | 
				
			||||||
         AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, rawAddress, uniqueId, profile, this.connection.hostname);
 | 
					         AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, rawAddress, uniqueId, this.transferred, profile, this.connection.hostname);
 | 
				
			||||||
         server.getPluginManager().callEvent(asyncEvent);
 | 
					         server.getPluginManager().callEvent(asyncEvent);
 | 
				
			||||||
         profile = asyncEvent.getPlayerProfile();
 | 
					         profile = asyncEvent.getPlayerProfile();
 | 
				
			||||||
-        profile.complete();
 | 
					-        profile.complete();
 | 
				
			||||||
| 
						 | 
					@ -91,7 +91,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
-
 | 
					-
 | 
				
			||||||
     @Override
 | 
					     @Override
 | 
				
			||||||
     public InetSocketAddress getAddress() {
 | 
					     public InetSocketAddress getAddress() {
 | 
				
			||||||
         if (this.getHandle().connection == null) return null;
 | 
					         if (this.getHandle().connection.protocol() == null) return null;
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
 | 
					@@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     private void untrackAndHideEntity(org.bukkit.entity.Entity entity) {
 | 
					     private void untrackAndHideEntity(org.bukkit.entity.Entity entity) {
 | 
				
			||||||
| 
						 | 
					@ -224,8 +224,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
--- a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
 | 
					--- a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
 | 
				
			||||||
+++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
 | 
					+++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class Commodore {
 | 
					@@ -0,0 +0,0 @@ public class Commodore {
 | 
				
			||||||
                             return;
 | 
					 | 
				
			||||||
                         }
 | 
					                         }
 | 
				
			||||||
 | 
					                         // Paper end - Rewrite plugins
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+                        // Paper start - Rewrite plugins
 | 
					+                        // Paper start - Rewrite plugins
 | 
				
			||||||
+                        if ((owner.equals("org/bukkit/OfflinePlayer") || owner.equals("org/bukkit/entity/Player")) && name.equals("getPlayerProfile") && desc.equals("()Lorg/bukkit/profile/PlayerProfile;")) {
 | 
					+                        if ((owner.equals("org/bukkit/OfflinePlayer") || owner.equals("org/bukkit/entity/Player")) && name.equals("getPlayerProfile") && desc.equals("()Lorg/bukkit/profile/PlayerProfile;")) {
 | 
				
			||||||
| 
						 | 
					@ -8,25 +8,25 @@ diff --git a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java b/sr
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
					--- a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
					+++ b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class FireworkRocketItem extends Item {
 | 
					@@ -0,0 +0,0 @@ public class FireworkRocketItem extends Item implements ProjectileItem {
 | 
				
			||||||
             if (!world.isClientSide) {
 | 
					             if (!world.isClientSide) {
 | 
				
			||||||
                 FireworkRocketEntity fireworkRocketEntity = new FireworkRocketEntity(world, itemStack, user);
 | 
					                 FireworkRocketEntity fireworkRocketEntity = new FireworkRocketEntity(world, itemStack, user);
 | 
				
			||||||
                 fireworkRocketEntity.spawningEntity = user.getUUID(); // Paper
 | 
					                 fireworkRocketEntity.spawningEntity = user.getUUID(); // Paper
 | 
				
			||||||
-                world.addFreshEntity(fireworkRocketEntity);
 | 
					-                world.addFreshEntity(fireworkRocketEntity);
 | 
				
			||||||
-                if (!user.getAbilities().instabuild) {
 | 
					-                itemStack.consume(1, user);
 | 
				
			||||||
 | 
					-                user.awardStat(Stats.ITEM_USED.get(this));
 | 
				
			||||||
+                // Paper start - PlayerElytraBoostEvent
 | 
					+                // Paper start - PlayerElytraBoostEvent
 | 
				
			||||||
+                com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Firework) fireworkRocketEntity.getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand));
 | 
					+                com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Firework) fireworkRocketEntity.getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand));
 | 
				
			||||||
+                if (event.callEvent() && world.addFreshEntity(fireworkRocketEntity)) {
 | 
					+                if (event.callEvent() && world.addFreshEntity(fireworkRocketEntity)) {
 | 
				
			||||||
+                    user.awardStat(Stats.ITEM_USED.get(this));
 | 
					+                    user.awardStat(Stats.ITEM_USED.get(this));
 | 
				
			||||||
+                    if (event.shouldConsume() && !user.getAbilities().instabuild) {
 | 
					+                    if (event.shouldConsume() && !user.hasInfiniteMaterials()) {
 | 
				
			||||||
                     itemStack.shrink(1);
 | 
					+                        itemStack.shrink(1);
 | 
				
			||||||
+                    } else ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
					+                    } else ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
				
			||||||
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
					+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
				
			||||||
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
					+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
				
			||||||
+                    // Paper end - PlayerElytraBoostEvent
 | 
					+                    // Paper end - PlayerElytraBoostEvent
 | 
				
			||||||
                 }
 | 
					+                }
 | 
				
			||||||
 
 | 
					+
 | 
				
			||||||
-                user.awardStat(Stats.ITEM_USED.get(this));
 | 
					 | 
				
			||||||
+                // user.awardStat(Stats.ITEM_USED.get(this)); // Paper - PlayerElytraBoostEvent; move up
 | 
					+                // user.awardStat(Stats.ITEM_USED.get(this)); // Paper - PlayerElytraBoostEvent; move up
 | 
				
			||||||
             }
 | 
					             }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ diff --git a/src/main/java/net/minecraft/world/item/EggItem.java b/src/main/java
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/item/EggItem.java
 | 
					--- a/src/main/java/net/minecraft/world/item/EggItem.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/item/EggItem.java
 | 
					+++ b/src/main/java/net/minecraft/world/item/EggItem.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class EggItem extends Item {
 | 
					@@ -0,0 +0,0 @@ public class EggItem extends Item implements ProjectileItem {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
             entityegg.setItem(itemstack);
 | 
					             entityegg.setItem(itemstack);
 | 
				
			||||||
             entityegg.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
 | 
					             entityegg.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
 | 
				
			||||||
| 
						 | 
					@ -17,8 +17,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+            // Paper start - PlayerLaunchProjectileEvent
 | 
					+            // Paper start - PlayerLaunchProjectileEvent
 | 
				
			||||||
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityegg.getBukkitEntity());
 | 
					+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityegg.getBukkitEntity());
 | 
				
			||||||
+            if (event.callEvent() && world.addFreshEntity(entityegg)) {
 | 
					+            if (event.callEvent() && world.addFreshEntity(entityegg)) {
 | 
				
			||||||
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
 | 
					+                if (event.shouldConsume()) {
 | 
				
			||||||
+                    itemstack.shrink(1);
 | 
					+                    itemstack.consume(1, user);
 | 
				
			||||||
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
					+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
				
			||||||
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
					+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
				
			||||||
+                }
 | 
					+                }
 | 
				
			||||||
| 
						 | 
					@ -38,13 +38,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+        /* // Paper start - PlayerLaunchProjectileEvent; moved up
 | 
					+        /* // Paper start - PlayerLaunchProjectileEvent; moved up
 | 
				
			||||||
         user.awardStat(Stats.ITEM_USED.get(this));
 | 
					         user.awardStat(Stats.ITEM_USED.get(this));
 | 
				
			||||||
         if (!user.getAbilities().instabuild) {
 | 
					         itemstack.consume(1, user);
 | 
				
			||||||
             itemstack.shrink(1);
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
+        */ // Paper end - PlayerLaunchProjectileEvent
 | 
					+        */ // Paper end - PlayerLaunchProjectileEvent
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
         return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
 | 
					         return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java
 | 
					diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java
 | 
					--- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java
 | 
				
			||||||
| 
						 | 
					@ -57,8 +55,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+            // Paper start - PlayerLaunchProjectileEvent
 | 
					+            // Paper start - PlayerLaunchProjectileEvent
 | 
				
			||||||
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityenderpearl.getBukkitEntity());
 | 
					+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityenderpearl.getBukkitEntity());
 | 
				
			||||||
+            if (event.callEvent() && world.addFreshEntity(entityenderpearl)) {
 | 
					+            if (event.callEvent() && world.addFreshEntity(entityenderpearl)) {
 | 
				
			||||||
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
 | 
					+                if (event.shouldConsume()) {
 | 
				
			||||||
+                    itemstack.shrink(1);
 | 
					+                    itemstack.consume(1, user);
 | 
				
			||||||
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
					+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
				
			||||||
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
					+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
				
			||||||
+                }
 | 
					+                }
 | 
				
			||||||
| 
						 | 
					@ -79,19 +77,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
         world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
 | 
					         world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
 | 
				
			||||||
         user.getCooldowns().addCooldown(this, 20);
 | 
					         user.getCooldowns().addCooldown(this, 20);
 | 
				
			||||||
         // CraftBukkit end
 | 
					         // CraftBukkit end
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class EnderpearlItem extends Item {
 | 
					 | 
				
			||||||
         if (!user.getAbilities().instabuild) {
 | 
					 | 
				
			||||||
             itemstack.shrink(1);
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
+        */ // Paper end - PlayerLaunchProjectileEvent; moved up
 | 
					 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
					         user.awardStat(Stats.ITEM_USED.get(this));
 | 
				
			||||||
 | 
					         itemstack.consume(1, user);
 | 
				
			||||||
 | 
					+        */ // Paper end - PlayerLaunchProjectileEvent; moved up
 | 
				
			||||||
         return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
 | 
					         return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
diff --git a/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java b/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java
 | 
					diff --git a/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java b/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java
 | 
					--- a/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java
 | 
					+++ b/src/main/java/net/minecraft/world/item/ExperienceBottleItem.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class ExperienceBottleItem extends Item {
 | 
					@@ -0,0 +0,0 @@ public class ExperienceBottleItem extends Item implements ProjectileItem {
 | 
				
			||||||
     @Override
 | 
					     @Override
 | 
				
			||||||
     public InteractionResultHolder<ItemStack> use(Level world, Player user, InteractionHand hand) {
 | 
					     public InteractionResultHolder<ItemStack> use(Level world, Player user, InteractionHand hand) {
 | 
				
			||||||
         ItemStack itemStack = user.getItemInHand(hand);
 | 
					         ItemStack itemStack = user.getItemInHand(hand);
 | 
				
			||||||
| 
						 | 
					@ -114,8 +111,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+            // Paper start - PlayerLaunchProjectileEvent
 | 
					+            // Paper start - PlayerLaunchProjectileEvent
 | 
				
			||||||
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownExperienceBottle.getBukkitEntity());
 | 
					+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownExperienceBottle.getBukkitEntity());
 | 
				
			||||||
+            if (event.callEvent() && world.addFreshEntity(thrownExperienceBottle)) {
 | 
					+            if (event.callEvent() && world.addFreshEntity(thrownExperienceBottle)) {
 | 
				
			||||||
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
 | 
					+                if (event.shouldConsume()) {
 | 
				
			||||||
+                    itemStack.shrink(1);
 | 
					+                    itemStack.consume(1, user);
 | 
				
			||||||
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
					+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
				
			||||||
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
					+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
				
			||||||
+                }
 | 
					+                }
 | 
				
			||||||
| 
						 | 
					@ -142,18 +139,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+        /* // Paper start - PlayerLaunchProjectileEvent; moved up
 | 
					+        /* // Paper start - PlayerLaunchProjectileEvent; moved up
 | 
				
			||||||
         user.awardStat(Stats.ITEM_USED.get(this));
 | 
					         user.awardStat(Stats.ITEM_USED.get(this));
 | 
				
			||||||
         if (!user.getAbilities().instabuild) {
 | 
					         itemStack.consume(1, user);
 | 
				
			||||||
             itemStack.shrink(1);
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
+        */ // Paper end - PlayerLaunchProjectileEvent
 | 
					+        */ // Paper end - PlayerLaunchProjectileEvent
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
         return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide());
 | 
					         return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide());
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
diff --git a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
					diff --git a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
					--- a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
					+++ b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class FireworkRocketItem extends Item {
 | 
					@@ -0,0 +0,0 @@ public class FireworkRocketItem extends Item implements ProjectileItem {
 | 
				
			||||||
                 itemStack
 | 
					                 itemStack
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
             fireworkRocketEntity.spawningEntity = context.getPlayer() == null ? null : context.getPlayer().getUUID(); // Paper
 | 
					             fireworkRocketEntity.spawningEntity = context.getPlayer() == null ? null : context.getPlayer().getUUID(); // Paper
 | 
				
			||||||
| 
						 | 
					@ -198,22 +193,22 @@ diff --git a/src/main/java/net/minecraft/world/item/SnowballItem.java b/src/main
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/item/SnowballItem.java
 | 
					--- a/src/main/java/net/minecraft/world/item/SnowballItem.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/item/SnowballItem.java
 | 
					+++ b/src/main/java/net/minecraft/world/item/SnowballItem.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class SnowballItem extends Item {
 | 
					@@ -0,0 +0,0 @@ public class SnowballItem extends Item implements ProjectileItem {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
             entitysnowball.setItem(itemstack);
 | 
					             entitysnowball.setItem(itemstack);
 | 
				
			||||||
             entitysnowball.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
 | 
					             entitysnowball.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
 | 
				
			||||||
-            if (world.addFreshEntity(entitysnowball)) {
 | 
					-            if (world.addFreshEntity(entitysnowball)) {
 | 
				
			||||||
-                if (!user.getAbilities().instabuild) {
 | 
					-                itemstack.consume(1, user);
 | 
				
			||||||
+            // Paper start - PlayerLaunchProjectileEvent
 | 
					+            // Paper start - PlayerLaunchProjectileEvent
 | 
				
			||||||
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entitysnowball.getBukkitEntity());
 | 
					+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entitysnowball.getBukkitEntity());
 | 
				
			||||||
+            if (event.callEvent() && world.addFreshEntity(entitysnowball)) {
 | 
					+            if (event.callEvent() && world.addFreshEntity(entitysnowball)) {
 | 
				
			||||||
+                user.awardStat(Stats.ITEM_USED.get(this));
 | 
					+                user.awardStat(Stats.ITEM_USED.get(this));
 | 
				
			||||||
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
 | 
					+                if (event.shouldConsume()) {
 | 
				
			||||||
+                    // Paper end - PlayerLaunchProjectileEvent
 | 
					+                    // Paper end - PlayerLaunchProjectileEvent
 | 
				
			||||||
                     itemstack.shrink(1);
 | 
					+                    itemstack.consume(1, user);
 | 
				
			||||||
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {  // Paper - PlayerLaunchProjectileEvent
 | 
					+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {  // Paper - PlayerLaunchProjectileEvent
 | 
				
			||||||
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();  // Paper - PlayerLaunchProjectileEvent
 | 
					+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();  // Paper - PlayerLaunchProjectileEvent
 | 
				
			||||||
                 }
 | 
					+                }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
                 world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.SNOWBALL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
 | 
					                 world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.SNOWBALL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
 | 
				
			||||||
-            } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
					-            } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
				
			||||||
| 
						 | 
					@ -225,16 +220,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         // CraftBukkit end
 | 
					         // CraftBukkit end
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+        /* // Paper start - PlayerLaunchProjectileEvent; moved up
 | 
					-        user.awardStat(Stats.ITEM_USED.get(this));
 | 
				
			||||||
         user.awardStat(Stats.ITEM_USED.get(this));
 | 
					+        // user.awardStat(Stats.ITEM_USED.get(this)); // Paper - PlayerLaunchProjectileEvent; moved up
 | 
				
			||||||
         // CraftBukkit start - moved up
 | 
					         // itemstack.consume(1, entityhuman); // CraftBukkit - moved up
 | 
				
			||||||
         /*
 | 
					 | 
				
			||||||
@@ -0,0 +0,0 @@ public class SnowballItem extends Item {
 | 
					 | 
				
			||||||
             itemstack.shrink(1);
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
         */
 | 
					 | 
				
			||||||
+        // Paper end - PlayerLaunchProjectileEvent
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
         return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
 | 
					         return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
diff --git a/src/main/java/net/minecraft/world/item/SplashPotionItem.java b/src/main/java/net/minecraft/world/item/SplashPotionItem.java
 | 
					diff --git a/src/main/java/net/minecraft/world/item/SplashPotionItem.java b/src/main/java/net/minecraft/world/item/SplashPotionItem.java
 | 
				
			||||||
| 
						 | 
					@ -267,7 +255,7 @@ diff --git a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java b/s
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
 | 
					--- a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
 | 
					+++ b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class ThrowablePotionItem extends PotionItem {
 | 
					@@ -0,0 +0,0 @@ public class ThrowablePotionItem extends PotionItem implements ProjectileItem {
 | 
				
			||||||
             ThrownPotion thrownPotion = new ThrownPotion(world, user);
 | 
					             ThrownPotion thrownPotion = new ThrownPotion(world, user);
 | 
				
			||||||
             thrownPotion.setItem(itemStack);
 | 
					             thrownPotion.setItem(itemStack);
 | 
				
			||||||
             thrownPotion.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.5F, 1.0F);
 | 
					             thrownPotion.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.5F, 1.0F);
 | 
				
			||||||
| 
						 | 
					@ -275,8 +263,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+            // Paper start - PlayerLaunchProjectileEvent
 | 
					+            // Paper start - PlayerLaunchProjectileEvent
 | 
				
			||||||
+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownPotion.getBukkitEntity());
 | 
					+            com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownPotion.getBukkitEntity());
 | 
				
			||||||
+            if (event.callEvent() && world.addFreshEntity(thrownPotion)) {
 | 
					+            if (event.callEvent() && world.addFreshEntity(thrownPotion)) {
 | 
				
			||||||
+                if (event.shouldConsume() && !user.getAbilities().instabuild) {
 | 
					+                if (event.shouldConsume()) {
 | 
				
			||||||
+                    itemStack.shrink(1);
 | 
					+                    itemStack.consume(1, user);
 | 
				
			||||||
+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
					+                } else if (user instanceof net.minecraft.server.level.ServerPlayer) {
 | 
				
			||||||
+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
					+                    ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
 | 
				
			||||||
+                }
 | 
					+                }
 | 
				
			||||||
| 
						 | 
					@ -293,18 +281,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+        /* // Paper start - PlayerLaunchProjectileEvent; moved up
 | 
					+        /* // Paper start - PlayerLaunchProjectileEvent; moved up
 | 
				
			||||||
         user.awardStat(Stats.ITEM_USED.get(this));
 | 
					         user.awardStat(Stats.ITEM_USED.get(this));
 | 
				
			||||||
         if (!user.getAbilities().instabuild) {
 | 
					         itemStack.consume(1, user);
 | 
				
			||||||
             itemStack.shrink(1);
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
+        */ // Paper end
 | 
					+        */ // Paper end
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
         return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide());
 | 
					         return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide());
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java
 | 
					diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/item/TridentItem.java
 | 
					--- a/src/main/java/net/minecraft/world/item/TridentItem.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/item/TridentItem.java
 | 
					+++ b/src/main/java/net/minecraft/world/item/TridentItem.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class TridentItem extends Item implements Vanishable {
 | 
					@@ -0,0 +0,0 @@ public class TridentItem extends Item implements ProjectileItem {
 | 
				
			||||||
                             }
 | 
					                             }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
                             // CraftBukkit start
 | 
					                             // CraftBukkit start
 | 
				
			||||||
| 
						 | 
					@ -320,16 +306,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
                             }
 | 
					                             }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+                            if (event.shouldConsume()) { // Paper - PlayerLaunchProjectileEvent
 | 
					+                            if (event.shouldConsume()) { // Paper - PlayerLaunchProjectileEvent
 | 
				
			||||||
                             stack.hurtAndBreak(1, entityhuman, (entityhuman1) -> {
 | 
					                             stack.hurtAndBreak(1, entityhuman, LivingEntity.getSlotForHand(user.getUsedItemHand()));
 | 
				
			||||||
                                 entityhuman1.broadcastBreakEvent(user.getUsedItemHand());
 | 
					 | 
				
			||||||
                             });
 | 
					 | 
				
			||||||
+                            } // Paper - PlayerLaunchProjectileEvent
 | 
					+                            } // Paper - PlayerLaunchProjectileEvent
 | 
				
			||||||
                             entitythrowntrident.pickupItemStack = stack.copy(); // SPIGOT-4511 update since damage call moved
 | 
					                             entitythrowntrident.pickupItemStack = stack.copy(); // SPIGOT-4511 update since damage call moved
 | 
				
			||||||
                             // CraftBukkit end
 | 
					                             // CraftBukkit end
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
                             world.playSound((Player) null, (Entity) entitythrowntrident, SoundEvents.TRIDENT_THROW, SoundSource.PLAYERS, 1.0F, 1.0F);
 | 
					                             world.playSound((Player) null, (Entity) entitythrowntrident, SoundEvents.TRIDENT_THROW, SoundSource.PLAYERS, 1.0F, 1.0F);
 | 
				
			||||||
-                            if (!entityhuman.getAbilities().instabuild) {
 | 
					-                            if (!entityhuman.hasInfiniteMaterials()) {
 | 
				
			||||||
+                            if (event.shouldConsume() && !entityhuman.getAbilities().instabuild) { // Paper - PlayerLaunchProjectileEvent
 | 
					+                            if (event.shouldConsume() && !entityhuman.hasInfiniteMaterials()) {
 | 
				
			||||||
                                 entityhuman.getInventory().removeItem(stack);
 | 
					                                 entityhuman.getInventory().removeItem(stack);
 | 
				
			||||||
                             }
 | 
					                             }
 | 
				
			||||||
                             // CraftBukkit start - SPIGOT-5458 also need in this branch :(
 | 
					                             // CraftBukkit start - SPIGOT-5458 also need in this branch :(
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+                    break;
 | 
					+                    break;
 | 
				
			||||||
+                }
 | 
					+                }
 | 
				
			||||||
+                // Paper end - PreCreatureSpawnEvent
 | 
					+                // Paper end - PreCreatureSpawnEvent
 | 
				
			||||||
                 T t0 = entitytypes.create(worldserver, (CompoundTag) null, null, blockposition_mutableblockposition, enummobspawn, false, false); // CraftBukkit - decompile error
 | 
					                 T t0 = entitytypes.create(worldserver, (Consumer<T>) null, blockposition_mutableblockposition, enummobspawn, false, false); // CraftBukkit - decompile error
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
                 if (t0 != null) {
 | 
					                 if (t0 != null) {
 | 
				
			||||||
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
 | 
					diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
 | 
					+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
 | 
					@@ -0,0 +0,0 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
 | 
				
			||||||
     @Nullable
 | 
					     @Nullable
 | 
				
			||||||
     public T spawn(ServerLevel worldserver, @Nullable CompoundTag nbttagcompound, @Nullable Consumer<T> consumer, BlockPos blockposition, MobSpawnType enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
 | 
					     public T spawn(ServerLevel worldserver, @Nullable Consumer<T> consumer, BlockPos blockposition, MobSpawnType enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
 | 
				
			||||||
         // CraftBukkit end
 | 
					         // CraftBukkit end
 | 
				
			||||||
+        // Paper start - PreCreatureSpawnEvent
 | 
					+        // Paper start - PreCreatureSpawnEvent
 | 
				
			||||||
+        com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
 | 
					+        com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+            return null;
 | 
					+            return null;
 | 
				
			||||||
+        }
 | 
					+        }
 | 
				
			||||||
+        // Paper end - PreCreatureSpawnEvent
 | 
					+        // Paper end - PreCreatureSpawnEvent
 | 
				
			||||||
         T t0 = this.create(worldserver, nbttagcompound, consumer, blockposition, enummobspawn, flag, flag1);
 | 
					         T t0 = this.create(worldserver, consumer, blockposition, enummobspawn, flag, flag1);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
         if (t0 != null) {
 | 
					         if (t0 != null) {
 | 
				
			||||||
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
 | 
					diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
 | 
				
			||||||
| 
						 | 
					@ -148,6 +148,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+        // Paper end - PreCreatureSpawnEvent
 | 
					+        // Paper end - PreCreatureSpawnEvent
 | 
				
			||||||
         EntityType<?> entitytypes = spawnEntry.type;
 | 
					         EntityType<?> entitytypes = spawnEntry.type;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
					-        return entitytypes.getCategory() == MobCategory.MISC ? false : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? false : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? false : (!SpawnPlacements.checkSpawnRules(entitytypes, world, MobSpawnType.NATURAL, pos, world.random) ? false : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)))) : false));
 | 
				
			||||||
+        // Paper start - PreCreatureSpawnEvent
 | 
					+        // Paper start - PreCreatureSpawnEvent
 | 
				
			||||||
+        com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
 | 
					+        com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
 | 
				
			||||||
+            io.papermc.paper.util.MCUtil.toLocation(world, pos),
 | 
					+            io.papermc.paper.util.MCUtil.toLocation(world, pos),
 | 
				
			||||||
| 
						 | 
					@ -160,21 +161,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+            return PreSpawnStatus.CANCELLED;
 | 
					+            return PreSpawnStatus.CANCELLED;
 | 
				
			||||||
+        }
 | 
					+        }
 | 
				
			||||||
+        // Paper end - PreCreatureSpawnEvent
 | 
					+        // Paper end - PreCreatureSpawnEvent
 | 
				
			||||||
         if (entitytypes.getCategory() == MobCategory.MISC) {
 | 
					+
 | 
				
			||||||
-            return false;
 | 
					+        return entitytypes.getCategory() == MobCategory.MISC ? PreSpawnStatus.FAIL : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? PreSpawnStatus.FAIL : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? PreSpawnStatus.FAIL : (!SpawnPlacements.checkSpawnRules(entitytypes, world, MobSpawnType.NATURAL, pos, world.random) ? PreSpawnStatus.FAIL : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)) ? PreSpawnStatus.SUCCESS : PreSpawnStatus.FAIL)) : PreSpawnStatus.FAIL)); // Paper - PreCreatureSpawnEvent
 | 
				
			||||||
+            return PreSpawnStatus.FAIL; // Paper - PreCreatureSpawnEvent
 | 
					 | 
				
			||||||
         } else if (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance())) {
 | 
					 | 
				
			||||||
-            return false;
 | 
					 | 
				
			||||||
+            return PreSpawnStatus.FAIL; // Paper - PreCreatureSpawnEvent
 | 
					 | 
				
			||||||
         } else if (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos)) {
 | 
					 | 
				
			||||||
             SpawnPlacements.Type entitypositiontypes_surface = SpawnPlacements.getPlacementType(entitytypes);
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-            return !NaturalSpawner.isSpawnPositionOk(entitypositiontypes_surface, world, pos, entitytypes) ? false : (!SpawnPlacements.checkSpawnRules(entitytypes, world, MobSpawnType.NATURAL, pos, world.random) ? false : world.noCollision(entitytypes.getAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)));
 | 
					 | 
				
			||||||
+            boolean isValid = !NaturalSpawner.isSpawnPositionOk(entitypositiontypes_surface, world, pos, entitytypes) ? false : (!SpawnPlacements.checkSpawnRules(entitytypes, world, MobSpawnType.NATURAL, pos, world.random) ? false : world.noCollision(entitytypes.getAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D))); // Paper - PreCreatureSpawnEvent
 | 
					 | 
				
			||||||
+            return isValid ? PreSpawnStatus.SUCCESS : PreSpawnStatus.FAIL; // Paper - PreCreatureSpawnEvent
 | 
					 | 
				
			||||||
         } else {
 | 
					 | 
				
			||||||
-            return false;
 | 
					 | 
				
			||||||
+            return PreSpawnStatus.FAIL; // Paper - PreCreatureSpawnEvent
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
					     @Nullable
 | 
				
			||||||
| 
						 | 
					@ -9,10 +9,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
 | 
					--- a/src/main/java/net/minecraft/world/entity/player/Player.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
 | 
					+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public abstract class Player extends LivingEntity {
 | 
					@@ -0,0 +0,0 @@ public abstract class Player extends LivingEntity {
 | 
				
			||||||
 
 | 
					                         f += this.getItemInHand(InteractionHand.MAIN_HAND).getItem().getAttackDamageBonus(this, f);
 | 
				
			||||||
                     boolean flag2 = flag && this.fallDistance > 0.0F && !this.onGround() && !this.onClimbable() && !this.isInWater() && !this.hasEffect(MobEffects.BLINDNESS) && !this.isPassenger() && target instanceof LivingEntity;
 | 
					                         boolean flag2 = flag && this.fallDistance > 0.0F && !this.onGround() && !this.onClimbable() && !this.isInWater() && !this.hasEffect(MobEffects.BLINDNESS) && !this.isPassenger() && target instanceof LivingEntity && !this.isSprinting();
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+                        flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits
 | 
					+                        flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits
 | 
				
			||||||
                     flag2 = flag2 && !this.isSprinting();
 | 
					 | 
				
			||||||
                         if (flag2) {
 | 
					                         if (flag2) {
 | 
				
			||||||
                             f *= 1.5F;
 | 
					                             f *= 1.5F;
 | 
				
			||||||
 | 
					                         }
 | 
				
			||||||
| 
						 | 
					@ -12,13 +12,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class Witch extends Raider implements RangedAttackMob {
 | 
					@@ -0,0 +0,0 @@ public class Witch extends Raider implements RangedAttackMob {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
                     this.setItemSlot(EquipmentSlot.MAINHAND, ItemStack.EMPTY);
 | 
					                     this.setItemSlot(EquipmentSlot.MAINHAND, ItemStack.EMPTY);
 | 
				
			||||||
                     if (itemstack.is(Items.POTION)) {
 | 
					                     PotionContents potioncontents = (PotionContents) itemstack.get(DataComponents.POTION_CONTENTS);
 | 
				
			||||||
-                        List<MobEffectInstance> list = PotionUtils.getMobEffects(itemstack);
 | 
					 | 
				
			||||||
+                    // Paper start - WitchConsumePotionEvent
 | 
					+                    // Paper start - WitchConsumePotionEvent
 | 
				
			||||||
 | 
					+                    if (itemstack.is(Items.POTION)) {
 | 
				
			||||||
+                        com.destroystokyo.paper.event.entity.WitchConsumePotionEvent event = new com.destroystokyo.paper.event.entity.WitchConsumePotionEvent((org.bukkit.entity.Witch) this.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack));
 | 
					+                        com.destroystokyo.paper.event.entity.WitchConsumePotionEvent event = new com.destroystokyo.paper.event.entity.WitchConsumePotionEvent((org.bukkit.entity.Witch) this.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack));
 | 
				
			||||||
+
 | 
					+                        potioncontents = event.callEvent() ? org.bukkit.craftbukkit.inventory.CraftItemStack.unwrap(event.getPotion()).get(DataComponents.POTION_CONTENTS) : null;
 | 
				
			||||||
+                        List<MobEffectInstance> list = event.callEvent() ? PotionUtils.getMobEffects(org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getPotion())) : null;
 | 
					+                    }
 | 
				
			||||||
+                    // Paper end - WitchConsumePotionEvent
 | 
					+                    // Paper end - WitchConsumePotionEvent
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
                         if (list != null) {
 | 
					                     if (itemstack.is(Items.POTION) && potioncontents != null) {
 | 
				
			||||||
                             Iterator iterator = list.iterator();
 | 
					                         potioncontents.forEachEffect((effect) -> this.addEffect(effect, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK)); // CraftBukkit
 | 
				
			||||||
| 
						 | 
					@ -11,10 +11,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class Witch extends Raider implements RangedAttackMob {
 | 
					@@ -0,0 +0,0 @@ public class Witch extends Raider implements RangedAttackMob {
 | 
				
			||||||
                 }
 | 
					                 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
                 if (potionregistry != null) {
 | 
					                 if (holder != null) {
 | 
				
			||||||
-                    this.setItemSlot(EquipmentSlot.MAINHAND, PotionUtils.setPotion(new ItemStack(Items.POTION), potionregistry));
 | 
					-                    this.setItemSlot(EquipmentSlot.MAINHAND, PotionContents.createItemStack(Items.POTION, holder));
 | 
				
			||||||
+                    // Paper start
 | 
					+                    // Paper start
 | 
				
			||||||
+                    ItemStack potion = PotionUtils.setPotion(new ItemStack(Items.POTION), potionregistry);
 | 
					+                    ItemStack potion = PotionContents.createItemStack(Items.POTION, holder);
 | 
				
			||||||
+                    potion = org.bukkit.craftbukkit.event.CraftEventFactory.handleWitchReadyPotionEvent(this, potion);
 | 
					+                    potion = org.bukkit.craftbukkit.event.CraftEventFactory.handleWitchReadyPotionEvent(this, potion);
 | 
				
			||||||
+                    this.setItemSlot(EquipmentSlot.MAINHAND, potion);
 | 
					+                    this.setItemSlot(EquipmentSlot.MAINHAND, potion);
 | 
				
			||||||
+                    // Paper end
 | 
					+                    // Paper end
 | 
				
			||||||
| 
						 | 
					@ -10,11 +10,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/entity/monster/Witch.java
 | 
					--- a/src/main/java/net/minecraft/world/entity/monster/Witch.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java
 | 
					+++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public class Witch extends Raider implements RangedAttackMob {
 | 
					@@ -0,0 +0,0 @@ public class Witch extends Raider implements RangedAttackMob {
 | 
				
			||||||
                 potionregistry = Potions.WEAKNESS;
 | 
					                 holder = Potions.WEAKNESS;
 | 
				
			||||||
             }
 | 
					             }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+            // Paper start - WitchThrowPotionEvent
 | 
					+            // Paper start - WitchThrowPotionEvent
 | 
				
			||||||
+            ItemStack potion = PotionUtils.setPotion(new ItemStack(Items.SPLASH_POTION), potionregistry);
 | 
					+            ItemStack potion = PotionContents.createItemStack(Items.SPLASH_POTION, holder);
 | 
				
			||||||
+            com.destroystokyo.paper.event.entity.WitchThrowPotionEvent event = new com.destroystokyo.paper.event.entity.WitchThrowPotionEvent((org.bukkit.entity.Witch) this.getBukkitEntity(), (org.bukkit.entity.LivingEntity) target.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(potion));
 | 
					+            com.destroystokyo.paper.event.entity.WitchThrowPotionEvent event = new com.destroystokyo.paper.event.entity.WitchThrowPotionEvent((org.bukkit.entity.Witch) this.getBukkitEntity(), (org.bukkit.entity.LivingEntity) target.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(potion));
 | 
				
			||||||
+            if (!event.callEvent()) {
 | 
					+            if (!event.callEvent()) {
 | 
				
			||||||
+                return;
 | 
					+                return;
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 | 
				
			||||||
+            potion = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getPotion());
 | 
					+            potion = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getPotion());
 | 
				
			||||||
             ThrownPotion entitypotion = new ThrownPotion(this.level(), this);
 | 
					             ThrownPotion entitypotion = new ThrownPotion(this.level(), this);
 | 
				
			||||||
-
 | 
					-
 | 
				
			||||||
-            entitypotion.setItem(PotionUtils.setPotion(new ItemStack(Items.SPLASH_POTION), potionregistry));
 | 
					-            entitypotion.setItem(PotionContents.createItemStack(Items.SPLASH_POTION, holder));
 | 
				
			||||||
+            entitypotion.setItem(potion);
 | 
					+            entitypotion.setItem(potion);
 | 
				
			||||||
+            // Paper end - WitchThrowPotionEvent
 | 
					+            // Paper end - WitchThrowPotionEvent
 | 
				
			||||||
             entitypotion.setXRot(entitypotion.getXRot() - -20.0F);
 | 
					             entitypotion.setXRot(entitypotion.getXRot() - -20.0F);
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/jav
 | 
				
			||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
					index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
				
			||||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
 | 
					--- a/src/main/java/net/minecraft/world/entity/Entity.java
 | 
				
			||||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
 | 
					+++ b/src/main/java/net/minecraft/world/entity/Entity.java
 | 
				
			||||||
@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
 | 
					@@ -0,0 +0,0 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
 | 
				
			||||||
     public String toString() {
 | 
					     public String toString() {
 | 
				
			||||||
         String s = this.level() == null ? "~NULL~" : this.level().toString();
 | 
					         String s = this.level() == null ? "~NULL~" : this.level().toString();
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue