diff --git a/paper-server/patches/sources/net/minecraft/world/entity/animal/Parrot.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/animal/Parrot.java.patch index 554ab3d969..863d2bcb91 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/animal/Parrot.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/animal/Parrot.java.patch @@ -29,16 +29,18 @@ } @Override -@@ -387,10 +_,11 @@ - @Override - public boolean hurtServer(ServerLevel level, DamageSource damageSource, float amount) { +@@ -389,8 +_,13 @@ if (this.isInvulnerableTo(level, damageSource)) { -+ if (!super.hurtServer(level, damageSource, amount)) return false; // CraftBukkit return false; } else { ++ // CraftBukkit start ++ if (!super.hurtServer(level, damageSource, amount)) { ++ return false; ++ } this.setOrderedToSit(false); - return super.hurtServer(level, damageSource, amount); -+ return true; // CraftBukkit ++ return true; ++ // CraftBukkit } } diff --git a/paper-server/patches/sources/net/minecraft/world/entity/animal/Turtle.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/animal/Turtle.java.patch index 6a7f48e29a..741323b5b1 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/animal/Turtle.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/animal/Turtle.java.patch @@ -59,7 +59,7 @@ + int eggCount = this.turtle.random.nextInt(4) + 1; + com.destroystokyo.paper.event.entity.TurtleLayEggEvent layEggEvent = new com.destroystokyo.paper.event.entity.TurtleLayEggEvent((org.bukkit.entity.Turtle) this.turtle.getBukkitEntity(), io.papermc.paper.util.MCUtil.toLocation(this.turtle.level(), this.blockPos.above()), eggCount); + if (layEggEvent.callEvent() && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.turtle, this.blockPos.above(), Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, layEggEvent.getEggCount()))) { -+ // Paper end ++ // Paper end - Turtle API Level level = this.turtle.level(); level.playSound(null, blockPos, SoundEvents.TURTLE_LAY_EGG, SoundSource.BLOCKS, 0.3F, 0.9F + level.random.nextFloat() * 0.2F); BlockPos blockPos1 = this.blockPos.above(); @@ -69,7 +69,7 @@ + .setValue(TurtleEggBlock.EGGS, layEggEvent.getEggCount()); // Paper level.setBlock(blockPos1, blockState, 3); level.gameEvent(GameEvent.BLOCK_PLACE, blockPos1, GameEvent.Context.of(this.turtle, blockState)); -+ } // Paper ++ } // CraftBukkit this.turtle.setHasEgg(false); this.turtle.setLayingEgg(false); this.turtle.setInLoveTime(600); diff --git a/paper-server/patches/sources/net/minecraft/world/entity/animal/Wolf.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/animal/Wolf.java.patch index f162736896..f783d4c772 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/animal/Wolf.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/animal/Wolf.java.patch @@ -7,7 +7,7 @@ + if (!super.hurtServer(level, damageSource, amount)) return false; // CraftBukkit this.setOrderedToSit(false); - return super.hurtServer(level, damageSource, amount); -+ return true; // CraftBUkkit ++ return true; // CraftBukkit } } diff --git a/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch index d69e9ebf10..f318988a05 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch @@ -55,15 +55,15 @@ } else { if (!this.isRemoved()) { - this.remove(Entity.RemovalReason.KILLED); -+ // Paper start - All non-living entities need this ++ // CraftBukkit start - All non-living entities need this + if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damageSource, amount, false)) { + return false; + } -+ // Paper end ++ // CraftBukkit end if (!damageSource.is(DamageTypeTags.IS_EXPLOSION)) { DamageSource damageSource1 = damageSource.getEntity() != null ? this.damageSources().explosion(this, damageSource.getEntity()) : null; - level.explode(this, damageSource1, null, this.getX(), this.getY(), this.getZ(), 6.0F, false, Level.ExplosionInteraction.BLOCK); -+ // Paper start ++ // CraftBukkit start + org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, 6.0F, false); + if (event.isCancelled()) { + return false; @@ -73,7 +73,7 @@ + level.explode(this, damageSource1, null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.BLOCK); + } else { + this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // Paper - add Bukkit remove cause -+ // Paper end ++ // CraftBukkit end } this.onDestroyedBy(level, damageSource); diff --git a/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch index 95f6a4e90e..beddc1e044 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch @@ -34,7 +34,7 @@ + public void setPodium(@Nullable BlockPos blockPos) { + this.podium = blockPos; + } -+ // Paper end ++ // Paper end - Allow changing the EnderDragon podium + @Override public boolean isFlapping() { @@ -44,7 +44,7 @@ Vec3 flyTargetLocation = currentPhase.getFlyTargetLocation(); - if (flyTargetLocation != null) { -+ if (flyTargetLocation != null && currentPhase.getPhase() != EnderDragonPhase.HOVERING) { // Paper - Don't move when hovering ++ if (flyTargetLocation != null && currentPhase.getPhase() != EnderDragonPhase.HOVERING) { // CraftBukkit - Don't move when hovering double d = flyTargetLocation.x - this.getX(); double d1 = flyTargetLocation.y - this.getY(); double d2 = flyTargetLocation.z - this.getZ(); @@ -53,14 +53,14 @@ this.nearestCrystal = null; } else if (this.tickCount % 10 == 0 && this.getHealth() < this.getMaxHealth()) { - this.setHealth(this.getHealth() + 1.0F); -+ // Paper start ++ // CraftBukkit start + org.bukkit.event.entity.EntityRegainHealthEvent event = new org.bukkit.event.entity.EntityRegainHealthEvent(this.getBukkitEntity(), 1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL); + this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + this.setHealth((float) (this.getHealth() + event.getAmount())); + } -+ // Paper end ++ // CraftBukkit end } } @@ -86,11 +86,11 @@ if (!blockState.isAir() && !blockState.is(BlockTags.DRAGON_TRANSPARENT)) { if (level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !blockState.is(BlockTags.DRAGON_IMMUNE)) { - flag1 = level.removeBlock(blockPos, false) || flag1; -+ // Paper start - Add blocks to list rather than destroying them ++ // CraftBukkit start - Add blocks to list rather than destroying them + //flag1 = level.removeBlock(blockPos, false) || flag1; + flag1 = true; + destroyedBlocks.add(org.bukkit.craftbukkit.block.CraftBlock.at(level, blockPos)); -+ // Paper end ++ // CraftBukkit end } else { flag = true; } @@ -98,7 +98,7 @@ } } -+ // Paper start - Set off an EntityExplodeEvent for the dragon exploding all these blocks ++ // CraftBukkit start - Set off an EntityExplodeEvent for the dragon exploding all these blocks + // SPIGOT-4882: don't fire event if nothing hit + if (!flag1) { + return flag; @@ -144,7 +144,7 @@ + this.level().removeBlock(blockposition, false); + } + } -+ // Paper end ++ // CraftBukkit end + if (flag1) { BlockPos blockPos1 = new BlockPos( @@ -161,7 +161,7 @@ + this.silentDeath = false; // Reset to default if event was cancelled + return; + } -+ this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // Paper - add Bukkit remove cause ++ this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // CraftBukkit - add Bukkit remove cause + // Paper end - Fire entity death event this.gameEvent(GameEvent.ENTITY_DIE); if (this.dragonFight != null) { @@ -170,7 +170,7 @@ this.level().addParticle(ParticleTypes.EXPLOSION_EMITTER, this.getX() + f, this.getY() + 2.0 + f1, this.getZ() + f2, 0.0, 0.0, 0.0); } -+ // Paper start - SPIGOT-2420: Moved up to #getExpReward method ++ // CraftBukkit start - SPIGOT-2420: Moved up to #getExpReward method + /* int i = 500; if (this.dragonFight != null && !this.dragonFight.hasPreviouslyKilledDragon()) { @@ -178,18 +178,18 @@ } + */ + int i = this.expToDrop; -+ // Paper end ++ // CraftBukkit end if (this.level() instanceof ServerLevel serverLevel) { - if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0 && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { - ExperienceOrb.award(serverLevel, this.position(), Mth.floor(i * 0.08F)); -+ if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0) { // Paper - SPIGOT-2420: Already checked for the game rule when calculating the xp ++ if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0) { // CraftBukkit - SPIGOT-2420: Already checked for the game rule when calculating the xp + ExperienceOrb.award(serverLevel, this.position(), Mth.floor(i * 0.08F), org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, this.lastHurtByPlayer, this); // Paper } if (this.dragonDeathTime == 1 && !this.isSilent()) { - serverLevel.globalLevelEvent(1028, this.blockPosition(), 0); -+ // Paper start - Use relative location for far away sounds ++ // CraftBukkit start - Use relative location for far away sounds + // serverLevel.globalLevelEvent(1028, this.blockPosition(), 0); + int viewDistance = serverLevel.getCraftServer().getViewDistance() * 16; + for (net.minecraft.server.level.ServerPlayer player : serverLevel.getPlayersForGlobalSoundGamerule()) { // Paper - respect global sound events gamerule @@ -207,7 +207,7 @@ + player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelEventPacket(1028, new BlockPos((int) this.getX(), (int) this.getY(), (int) this.getZ()), 0, true)); + } + } -+ // Paper end ++ // CraftBukkit end } } @@ -226,7 +226,7 @@ } - this.remove(Entity.RemovalReason.KILLED); -+ this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // Paper - add Bukkit remove cause ++ this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // CraftBukkit - add Bukkit remove cause this.gameEvent(GameEvent.ENTITY_DIE); } } @@ -234,7 +234,7 @@ super.addAdditionalSaveData(compound); compound.putInt("DragonPhase", this.phaseManager.getCurrentPhase().getPhase().getId()); compound.putInt("DragonDeathTime", this.dragonDeathTime); -+ compound.putInt("Bukkit.expToDrop", this.expToDrop); // Paper - SPIGOT-2420: The ender dragon drops xp over time which can also happen between server starts ++ compound.putInt("Bukkit.expToDrop", this.expToDrop); // CraftBukkit - SPIGOT-2420: The ender dragon drops xp over time which can also happen between server starts } @Override @@ -243,11 +243,11 @@ this.dragonDeathTime = compound.getInt("DragonDeathTime"); } + -+ // Paper start - SPIGOT-2420: The ender dragon drops xp over time which can also happen between server starts ++ // CraftBukkit start - SPIGOT-2420: The ender dragon drops xp over time which can also happen between server starts + if (compound.contains("Bukkit.expToDrop")) { + this.expToDrop = compound.getInt("Bukkit.expToDrop"); + } -+ // Paper end ++ // CraftBukkit end } @Override @@ -265,7 +265,7 @@ return 1.0F; } + -+ // Paper start - SPIGOT-2420: Special case, the ender dragon drops 12000 xp for the first kill and 500 xp for every other kill and this over time. ++ // CraftBukkit start - SPIGOT-2420: Special case, the ender dragon drops 12000 xp for the first kill and 500 xp for every other kill and this over time. + @Override + public int getExpReward(ServerLevel worldserver, Entity entity) { + // CraftBukkit - Moved from #tickDeath method @@ -278,6 +278,6 @@ + + return flag ? short0 : 0; + } -+ // Paper end ++ // CraftBukkit end + } diff --git a/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/phases/DragonSittingFlamingPhase.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/phases/DragonSittingFlamingPhase.java.patch index f6723920d3..61de7efb59 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/phases/DragonSittingFlamingPhase.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/phases/DragonSittingFlamingPhase.java.patch @@ -6,11 +6,11 @@ this.flame.addEffect(new MobEffectInstance(MobEffects.HARM)); + if (new com.destroystokyo.paper.event.entity.EnderDragonFlameEvent((org.bukkit.entity.EnderDragon) this.dragon.getBukkitEntity(), (org.bukkit.entity.AreaEffectCloud) this.flame.getBukkitEntity()).callEvent()) { // Paper - EnderDragon Events level.addFreshEntity(this.flame); -+ // Paper start ++ // Paper start - EnderDragon Events + } else { + this.end(); + } -+ // Paper end ++ // Paper end - EnderDragon Events } } @@ -19,7 +19,7 @@ public void end() { if (this.flame != null) { - this.flame.discard(); -+ this.flame.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // Paper- add Bukkit remove cause ++ this.flame.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause this.flame = null; } } diff --git a/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/phases/EnderDragonPhaseManager.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/phases/EnderDragonPhaseManager.java.patch index 8f1877cd14..a99fa7b9c1 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/phases/EnderDragonPhaseManager.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/phases/EnderDragonPhaseManager.java.patch @@ -4,7 +4,7 @@ this.currentPhase.end(); } -+ // Paper start - Call EnderDragonChangePhaseEvent ++ // CraftBukkit start - Call EnderDragonChangePhaseEvent + org.bukkit.event.entity.EnderDragonChangePhaseEvent event = new org.bukkit.event.entity.EnderDragonChangePhaseEvent( + (org.bukkit.craftbukkit.entity.CraftEnderDragon) this.dragon.getBukkitEntity(), + (this.currentPhase == null) ? null : org.bukkit.craftbukkit.entity.CraftEnderDragon.getBukkitPhase(this.currentPhase.getPhase()), @@ -15,7 +15,7 @@ + return; + } + phase = org.bukkit.craftbukkit.entity.CraftEnderDragon.getMinecraftPhase(event.getNewPhase()); -+ // Paper end ++ // CraftBukkit end + this.currentPhase = this.getPhase((EnderDragonPhase)phase); if (!this.dragon.level().isClientSide) {