Block package

This commit is contained in:
Owen1212055 committed 2025-03-12 15:27:32 -04:00
1 parent c0718848eb
commit ac68fdc170
85 files changed
+743 -1368

No files matched your search

@@ -1,19 +0,0 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/entity/ai/behavior/RamTarget.java b/net/minecraft/world/entity/ai/behavior/RamTarget.java
index 25107d2bb455c66c072d7d8a8c699c5804f51761..755579c209e8f16d34df352863aa1cc649b7a8e5 100644
--- a/net/minecraft/world/entity/ai/behavior/RamTarget.java
+++ b/net/minecraft/world/entity/ai/behavior/RamTarget.java
@@ -89,7 +89,7 @@ public class RamTarget extends Behavior<Goat> {
float f = 0.25F * (i - i1);
float f1 = Mth.clamp(owner.getSpeed() * 1.65F, 0.2F, 3.0F) + f;
float f2 = livingEntity.isDamageSourceBlocked(level.damageSources().mobAttack(owner)) ? 0.5F : 1.0F;
- livingEntity.knockback(f2 * f1 * this.getKnockbackForce.applyAsDouble(owner), this.ramDirection.x(), this.ramDirection.z());
+ livingEntity.knockback(f2 * f1 * this.getKnockbackForce.applyAsDouble(owner), this.ramDirection.x(), this.ramDirection.z(), owner, io.papermc.paper.event.entity.EntityKnockbackEvent.Cause.ENTITY_ATTACK); // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent
this.finishRam(level, owner);
level.playSound(null, owner, this.getImpactSound.apply(owner), SoundSource.NEUTRAL, 1.0F, 1.0F);
} else if (this.hasRammedHornBreakingBlock(level, owner)) {
@@ -1,26 +0,0 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/entity/ai/behavior/ResetProfession.java b/net/minecraft/world/entity/ai/behavior/ResetProfession.java
index 146af7eddabb7abb47921784f88c2180ce13a613..0fba9d252fb11715bdbda0576f519f947f2a7d4e 100644
--- a/net/minecraft/world/entity/ai/behavior/ResetProfession.java
+++ b/net/minecraft/world/entity/ai/behavior/ResetProfession.java
@@ -18,7 +18,14 @@ public class ResetProfession {
&& villagerData.getProfession() != VillagerProfession.NITWIT
&& villager.getVillagerXp() == 0
&& villagerData.getLevel() <= 1) {
- villager.setVillagerData(villager.getVillagerData().setProfession(VillagerProfession.NONE));
+ // CraftBukkit start
+ org.bukkit.event.entity.VillagerCareerChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callVillagerCareerChangeEvent(villager, org.bukkit.craftbukkit.entity.CraftVillager.CraftProfession.minecraftToBukkit(VillagerProfession.NONE), org.bukkit.event.entity.VillagerCareerChangeEvent.ChangeReason.LOSING_JOB);
+ if (event.isCancelled()) {
+ return false;
+ }
+
+ villager.setVillagerData(villager.getVillagerData().setProfession(org.bukkit.craftbukkit.entity.CraftVillager.CraftProfession.bukkitToMinecraft(event.getProfession())));
+ // CraftBukkit end
villager.refreshBrain(level);
return true;
} else {
@@ -1,18 +0,0 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/BubbleColumnBlock.java b/net/minecraft/world/level/block/BubbleColumnBlock.java
index 8bb3284f5c72d7768b5734897b77806be1fb4b57..400e213f4a2f8f09198257ce64d528932180edb5 100644
--- a/net/minecraft/world/level/block/BubbleColumnBlock.java
+++ b/net/minecraft/world/level/block/BubbleColumnBlock.java
@@ -48,6 +48,7 @@ public class BubbleColumnBlock extends Block implements BucketPickup {
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
BlockState blockState = level.getBlockState(pos.above());
if (blockState.isAir()) {
entity.onAboveBubbleCol(state.getValue(DRAG_DOWN));
@@ -1,29 +0,0 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/BushBlock.java b/net/minecraft/world/level/block/BushBlock.java
index f7aebd71e972562f2f7cbaa3c36f46ee3102d0b4..bc52568bfa56635300266424488e524d77d95e09 100644
--- a/net/minecraft/world/level/block/BushBlock.java
+++ b/net/minecraft/world/level/block/BushBlock.java
@@ -35,9 +35,15 @@ public abstract class BushBlock extends Block {
BlockState neighborState,
RandomSource random
) {
- return !state.canSurvive(level, pos)
- ? Blocks.AIR.defaultBlockState()
- : super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random);
+ // CraftBukkit start
+ if (!state.canSurvive(level, pos)) {
+ // Suppress during worldgen
+ if (!(level instanceof net.minecraft.server.level.ServerLevel serverLevel && serverLevel.hasPhysicsEvent) || !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(serverLevel, pos).isCancelled()) { // Paper
+ return Blocks.AIR.defaultBlockState();
+ }
+ }
+ return super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random);
+ // CraftBukkit end
}
@Override
@@ -1,41 +0,0 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/CactusBlock.java b/net/minecraft/world/level/block/CactusBlock.java
index 2c72540d41bbb29d24cfaee254348401ceb76700..8c3aca2430eac2a31d1e0b1137e3324ec5b29a20 100644
--- a/net/minecraft/world/level/block/CactusBlock.java
+++ b/net/minecraft/world/level/block/CactusBlock.java
@@ -56,14 +56,16 @@ public class CactusBlock extends Block {
i++;
}
- if (i < 3) {
+ if (i < level.paperConfig().maxGrowthHeight.cactus) { // Paper - Configurable cactus/bamboo/reed growth height
int ageValue = state.getValue(AGE);
- if (ageValue == 15) {
- level.setBlockAndUpdate(blockPos, this.defaultBlockState());
+
+ int modifier = level.spigotConfig.cactusModifier; // Spigot - SPIGOT-7159: Better modifier resolution
+ if (ageValue >= 15 || (modifier != 100 && random.nextFloat() < (modifier / (100.0f * 16)))) { // Spigot - SPIGOT-7159: Better modifier
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, blockPos, this.defaultBlockState()); // CraftBukkit
BlockState blockState = state.setValue(AGE, Integer.valueOf(0));
level.setBlock(pos, blockState, 4);
level.neighborChanged(blockState, blockPos, this, null, false);
- } else {
+ } else if (modifier == 100 || random.nextFloat() < (modifier / (100.0f * 16))) { // Spigot - SPIGOT-7159: Better modifier resolution
level.setBlock(pos, state.setValue(AGE, Integer.valueOf(ageValue + 1)), 4);
}
}
@@ -113,7 +115,8 @@ public class CactusBlock extends Block {
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
- entity.hurt(level.damageSources().cactus(), 1.0F);
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
+ entity.hurt(level.damageSources().cactus().eventBlockDamager(level, pos), 1.0F); // CraftBukkit
}
@Override
@@ -1,18 +0,0 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/DaylightDetectorBlock.java b/net/minecraft/world/level/block/DaylightDetectorBlock.java
index f8e34f58edf4bc7014d15fb1fe4a1055e8bc6e5d..a83d1dd4cac85d34f695333fd917a41f14dd5715 100644
--- a/net/minecraft/world/level/block/DaylightDetectorBlock.java
+++ b/net/minecraft/world/level/block/DaylightDetectorBlock.java
@@ -70,6 +70,7 @@ public class DaylightDetectorBlock extends BaseEntityBlock {
i = Mth.clamp(i, 0, 15);
if (state.getValue(POWER) != i) {
+ i = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, state.getValue(DaylightDetectorBlock.POWER), i).getNewCurrent(); // CraftBukkit - Call BlockRedstoneEvent
level.setBlock(pos, state.setValue(POWER, Integer.valueOf(i)), 3);
}
}
@@ -1,18 +0,0 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/LavaCauldronBlock.java b/net/minecraft/world/level/block/LavaCauldronBlock.java
index 7a31c3075d5c42a459dbcedb6ad2bff9be7447da..c8b2e8944cb0bdd6fd8b31b26de0aa9f577db28d 100644
--- a/net/minecraft/world/level/block/LavaCauldronBlock.java
+++ b/net/minecraft/world/level/block/LavaCauldronBlock.java
@@ -32,6 +32,7 @@ public class LavaCauldronBlock extends AbstractCauldronBlock {
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (this.isEntityInsideContent(state, pos, entity)) {
entity.lavaHurt();
}
@@ -1,33 +0,0 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/PowderSnowBlock.java b/net/minecraft/world/level/block/PowderSnowBlock.java
index 89d1696543193bb80d8e86a30cccf58fd4e3b0b6..9c0ded7ae7e3a520704033a866f80743ae85d772 100644
--- a/net/minecraft/world/level/block/PowderSnowBlock.java
+++ b/net/minecraft/world/level/block/PowderSnowBlock.java
@@ -58,6 +58,7 @@ public class PowderSnowBlock extends Block implements BucketPickup {
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!(entity instanceof LivingEntity) || entity.getInBlockState().is(this)) {
entity.makeStuckInBlock(state, new Vec3(0.9F, 1.5, 0.9F));
if (level.isClientSide) {
@@ -80,8 +81,13 @@ public class PowderSnowBlock extends Block implements BucketPickup {
entity.setIsInPowderSnow(true);
if (level instanceof ServerLevel serverLevel) {
if (entity.isOnFire()
- && (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity instanceof Player)
+ // CraftBukkit - move down
&& entity.mayInteract(serverLevel, pos)) {
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity instanceof Player))) {
+ return;
+ }
+ // CraftBukkit end
level.destroyBlock(pos, false);
}
@@ -1,99 +0,0 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/TntBlock.java b/net/minecraft/world/level/block/TntBlock.java
index 7ff897c12e6a4b77178cb4bb32ca242c972e45c3..9dca05fb66ce3ff9e0c3e31978bf4d5d9e139b8e 100644
--- a/net/minecraft/world/level/block/TntBlock.java
+++ b/net/minecraft/world/level/block/TntBlock.java
@@ -45,7 +45,13 @@ public class TntBlock extends Block {
@Override
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
if (!oldState.is(state.getBlock())) {
- if (level.hasNeighborSignal(pos)) {
+ if (level.hasNeighborSignal(pos) && org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.REDSTONE, null, null)) { // CraftBukkit - TNTPrimeEvent
+ // Paper start - TNTPrimeEvent
+ org.bukkit.block.Block tntBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.REDSTONE, null).callEvent()) {
+ return;
+ }
+ // Paper end - TNTPrimeEvent
explode(level, pos);
level.removeBlock(pos, false);
}
@@ -54,7 +60,13 @@ public class TntBlock extends Block {
@Override
protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
- if (level.hasNeighborSignal(pos)) {
+ if (level.hasNeighborSignal(pos) && org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.REDSTONE, null, null)) { // CraftBukkit - TNTPrimeEvent
+ // Paper start - TNTPrimeEvent
+ org.bukkit.block.Block tntBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.REDSTONE, null).callEvent()) {
+ return;
+ }
+ // Paper end - TNTPrimeEvent
explode(level, pos);
level.removeBlock(pos, false);
}
@@ -62,7 +74,7 @@ public class TntBlock extends Block {
@Override
public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) {
- if (!level.isClientSide() && !player.isCreative() && state.getValue(UNSTABLE)) {
+ if (!level.isClientSide() && !player.isCreative() && state.getValue(UNSTABLE) && org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.BLOCK_BREAK, player, null)) { // CraftBukkit - TNTPrimeEvent
explode(level, pos);
}
@@ -71,6 +83,13 @@ public class TntBlock extends Block {
@Override
public void wasExploded(ServerLevel level, BlockPos pos, Explosion explosion) {
+ // Paper start - TNTPrimeEvent
+ org.bukkit.block.Block tntBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.entity.Entity source = explosion.getDirectSourceEntity() != null ? explosion.getDirectSourceEntity().getBukkitEntity() : null;
+ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.EXPLOSION, source).callEvent()) {
+ return;
+ }
+ // Paper end - TNTPrimeEvent
PrimedTnt primedTnt = new PrimedTnt(level, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, explosion.getIndirectSourceEntity());
int fuse = primedTnt.getFuse();
primedTnt.setFuse((short)(level.random.nextInt(fuse / 4) + fuse / 8));
@@ -97,6 +116,17 @@ public class TntBlock extends Block {
if (!stack.is(Items.FLINT_AND_STEEL) && !stack.is(Items.FIRE_CHARGE)) {
return super.useItemOn(stack, state, level, pos, player, hand, hitResult);
} else {
+ // CraftBukkit start - TNTPrimeEvent
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.PLAYER, player, null)) {
+ return InteractionResult.CONSUME;
+ }
+ // CraftBukkit end
+ // Paper start - TNTPrimeEvent
+ org.bukkit.block.Block tntBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.ITEM, player.getBukkitEntity()).callEvent()) {
+ return InteractionResult.FAIL;
+ }
+ // Paper end - TNTPrimeEvent
explode(level, pos, player);
level.setBlock(pos, Blocks.AIR.defaultBlockState(), 11);
Item item = stack.getItem();
@@ -117,6 +147,17 @@ public class TntBlock extends Block {
BlockPos blockPos = hit.getBlockPos();
Entity owner = projectile.getOwner();
if (projectile.isOnFire() && projectile.mayInteract(serverLevel, blockPos)) {
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(projectile, blockPos, state.getFluidState().createLegacyBlock()) || !org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, blockPos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.PROJECTILE, projectile, null)) { // Paper - fix wrong block state
+ return;
+ }
+ // CraftBukkit end
+ // Paper start - TNTPrimeEvent
+ org.bukkit.block.Block tntBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, blockPos);
+ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.PROJECTILE, projectile.getBukkitEntity()).callEvent()) {
+ return;
+ }
+ // Paper end - TNTPrimeEvent
explode(level, blockPos, owner instanceof LivingEntity ? (LivingEntity)owner : null);
level.removeBlock(blockPos, false);
}
@@ -1,25 +1,19 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/entity/ai/behavior/AssignProfessionFromJobSite.java b/net/minecraft/world/entity/ai/behavior/AssignProfessionFromJobSite.java
index 2ac16883afb6ef96c42b63882cc2648f7994d142..90eeb026605b5f82b0d9f3be17de7c9e3cd45b13 100644
--- a/net/minecraft/world/entity/ai/behavior/AssignProfessionFromJobSite.java
+++ b/net/minecraft/world/entity/ai/behavior/AssignProfessionFromJobSite.java
@@ -38,7 +38,14 @@ public class AssignProfessionFromJobSite {
@@ -37,8 +_,15 @@
.filter(reference -> reference.value().heldJobSite().test((Holder<PoiType>)poi))
.findFirst()
)
.ifPresent(profession -> {
- villager.setVillagerData(villager.getVillagerData().setProfession(profession));
- .ifPresent(reference -> {
- villager.setVillagerData(villager.getVillagerData().withProfession(reference));
+ .ifPresent(profession -> {
+ // CraftBukkit start - Fire VillagerCareerChangeEvent where Villager gets employed
+ org.bukkit.event.entity.VillagerCareerChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callVillagerCareerChangeEvent(villager, org.bukkit.craftbukkit.entity.CraftVillager.CraftProfession.minecraftToBukkit(profession), org.bukkit.event.entity.VillagerCareerChangeEvent.ChangeReason.EMPLOYED);
+ org.bukkit.event.entity.VillagerCareerChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callVillagerCareerChangeEvent(villager, org.bukkit.craftbukkit.entity.CraftVillager.CraftProfession.minecraftHolderToBukkit(profession), org.bukkit.event.entity.VillagerCareerChangeEvent.ChangeReason.EMPLOYED);
+ if (event.isCancelled()) {
+ return;
+ }
+
+ villager.setVillagerData(villager.getVillagerData().setProfession(org.bukkit.craftbukkit.entity.CraftVillager.CraftProfession.bukkitToMinecraft(event.getProfession())));
+ villager.setVillagerData(villager.getVillagerData().withProfession(org.bukkit.craftbukkit.entity.CraftVillager.CraftProfession.bukkitToMinecraftHolder(event.getProfession())));
+ // CraftBukkit end
villager.refreshBrain(level);
});
@@ -0,0 +1,11 @@
--- a/net/minecraft/world/entity/ai/behavior/RamTarget.java
+++ b/net/minecraft/world/entity/ai/behavior/RamTarget.java
@@ -92,7 +_,7 @@
DamageSource damageSource1 = level.damageSources().mobAttack(owner);
float f3 = livingEntity.applyItemBlocking(level, damageSource1, f);
float f4 = f3 > 0.0F ? 0.5F : 1.0F;
- livingEntity.knockback(f4 * f2 * this.getKnockbackForce.applyAsDouble(owner), this.ramDirection.x(), this.ramDirection.z());
+ livingEntity.knockback(f4 * f2 * this.getKnockbackForce.applyAsDouble(owner), this.ramDirection.x(), this.ramDirection.z(), owner, io.papermc.paper.event.entity.EntityKnockbackEvent.Cause.ENTITY_ATTACK); // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent
this.finishRam(level, owner);
level.playSound(null, owner, this.getImpactSound.apply(owner), SoundSource.NEUTRAL, 1.0F, 1.0F);
} else if (this.hasRammedHornBreakingBlock(level, owner)) {
@@ -0,0 +1,18 @@
--- a/net/minecraft/world/entity/ai/behavior/ResetProfession.java
+++ b/net/minecraft/world/entity/ai/behavior/ResetProfession.java
@@ -13,7 +_,14 @@
VillagerData villagerData = villager.getVillagerData();
boolean flag = !villagerData.profession().is(VillagerProfession.NONE) && !villagerData.profession().is(VillagerProfession.NITWIT);
if (flag && villager.getVillagerXp() == 0 && villagerData.level() <= 1) {
- villager.setVillagerData(villager.getVillagerData().withProfession(level.registryAccess(), VillagerProfession.NONE));
+ // CraftBukkit start
+ org.bukkit.event.entity.VillagerCareerChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callVillagerCareerChangeEvent(villager, org.bukkit.craftbukkit.entity.CraftVillager.CraftProfession.minecraftHolderToBukkit(level.registryAccess().getOrThrow(VillagerProfession.NONE)), org.bukkit.event.entity.VillagerCareerChangeEvent.ChangeReason.LOSING_JOB);
+ if (event.isCancelled()) {
+ return false;
+ }
+
+ villager.setVillagerData(villager.getVillagerData().withProfession(org.bukkit.craftbukkit.entity.CraftVillager.CraftProfession.bukkitToMinecraftHolder(event.getProfession())));
+ // CraftBukkit end
villager.refreshBrain(level);
return true;
} else {
@@ -1,27 +1,19 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java b/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java
index d2c0ae2abd1e16996e7d3bafa4cb6c4004ea337e..8fe5bd54b5a4848da1f08ea65fe2bc3514bed8c8 100644
--- a/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java
+++ b/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java
@@ -111,11 +111,17 @@ public class VillagerMakeLove extends Behavior<Villager> {
@@ -111,11 +_,17 @@
if (breedOffspring == null) {
return Optional.empty();
} else {
- parent.setAge(6000);
- partner.setAge(6000);
breedOffspring.setAge(-24000);
breedOffspring.moveTo(parent.getX(), parent.getY(), parent.getZ(), 0.0F, 0.0F);
+ // Paper - Move age setting down
breedOffspring.snapTo(parent.getX(), parent.getY(), parent.getZ(), 0.0F, 0.0F);
- level.addFreshEntityWithPassengers(breedOffspring);
+ // CraftBukkit start - call EntityBreedEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(breedOffspring, parent, partner, null, null, 0).isCancelled()) {
+ return Optional.empty();
+ }
+ // Move age setting down
+ parent.setAge(6000);
+ partner.setAge(6000);
+ level.addFreshEntityWithPassengers(breedOffspring, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING);
@@ -1,30 +1,24 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
index 96b285c7de0798cf7aa459c624b49ad041ac66d7..ff1c84d37db48e1bd0283a900e199647c0e8eba1 100644
--- a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
+++ b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
@@ -25,6 +25,7 @@ public class EndCrystal extends Entity {
);
@@ -25,6 +_,7 @@
private static final EntityDataAccessor<Boolean> DATA_SHOW_BOTTOM = SynchedEntityData.defineId(EndCrystal.class, EntityDataSerializers.BOOLEAN);
private static final boolean DEFAULT_SHOW_BOTTOM = true;
public int time;
+ public boolean generatedByDragonFight = false; // Paper - Fix invulnerable end crystals
public EndCrystal(EntityType<? extends EndCrystal> entityType, Level level) {
super(entityType, level);
@@ -56,9 +57,23 @@ public class EndCrystal extends Entity {
@@ -56,21 +_,37 @@
if (this.level() instanceof ServerLevel) {
BlockPos blockPos = this.blockPosition();
if (((ServerLevel)this.level()).getDragonFight() != null && this.level().getBlockState(blockPos).isAir()) {
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(this.level(), blockPos, this).isCancelled()) { // Paper
this.level().setBlockAndUpdate(blockPos, BaseFireBlock.getState(this.level(), blockPos));
- }
- }
+ } // Paper
}
}
+ }
+ }
+
+ // Paper start - Fix invulnerable end crystals
+ if (this.level().paperConfig().unsupportedSettings.fixInvulnerableEndCrystalExploit && this.generatedByDragonFight && this.isInvulnerable()) {
@@ -40,23 +34,21 @@ index 96b285c7de0798cf7aa459c624b49ad041ac66d7..ff1c84d37db48e1bd0283a900e199647
}
@Override
@@ -68,6 +83,7 @@ public class EndCrystal extends Entity {
}
protected void addAdditionalSaveData(CompoundTag compound) {
compound.storeNullable("beam_target", BlockPos.CODEC, this.getBeamTarget());
compound.putBoolean("ShowBottom", this.showsBottom());
+ if (this.generatedByDragonFight) compound.putBoolean("Paper.GeneratedByDragonFight", this.generatedByDragonFight); // Paper - Fix invulnerable end crystals
+ compound.putBoolean("Paper.GeneratedByDragonFight", this.generatedByDragonFight); // Paper - Fix invulnerable end crystals
}
@Override
@@ -76,6 +92,7 @@ public class EndCrystal extends Entity {
if (compound.contains("ShowBottom", 1)) {
this.setShowBottom(compound.getBoolean("ShowBottom"));
}
+ if (compound.contains("Paper.GeneratedByDragonFight", 1)) this.generatedByDragonFight = compound.getBoolean("Paper.GeneratedByDragonFight"); // Paper - Fix invulnerable end crystals
protected void readAdditionalSaveData(CompoundTag compound) {
this.setBeamTarget(compound.read("beam_target", BlockPos.CODEC).orElse(null));
this.setShowBottom(compound.getBooleanOr("ShowBottom", true));
+ this.generatedByDragonFight = compound.getBooleanOr("Paper.GeneratedByDragonFight", this.generatedByDragonFight); // Paper - Fix invulnerable end crystals
}
@Override
@@ -96,10 +113,24 @@ public class EndCrystal extends Entity {
@@ -91,10 +_,24 @@
return false;
} else {
if (!this.isRemoved()) {
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc117a1881 100644
--- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
+++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
@@ -86,6 +86,10 @@ public class EnderDragon extends Mob implements Enemy {
@@ -87,6 +_,10 @@
private final Node[] nodes = new Node[24];
private final int[] nodeAdjacency = new int[24];
private final BinaryHeap openSet = new BinaryHeap();
@@ -19,7 +11,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
public EnderDragon(EntityType<? extends EnderDragon> entityType, Level level) {
super(EntityType.ENDER_DRAGON, level);
@@ -101,6 +105,7 @@ public class EnderDragon extends Mob implements Enemy {
@@ -102,6 +_,7 @@
this.setHealth(this.getMaxHealth());
this.noPhysics = true;
this.phaseManager = new EnderDragonPhaseManager(this);
@@ -27,7 +19,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
}
public void setDragonFight(EndDragonFight dragonFight) {
@@ -119,6 +124,19 @@ public class EnderDragon extends Mob implements Enemy {
@@ -120,6 +_,19 @@
return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 200.0);
}
@@ -47,7 +39,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
@Override
public boolean isFlapping() {
float cos = Mth.cos(this.flapTime * (float) (Math.PI * 2));
@@ -210,7 +228,7 @@ public class EnderDragon extends Mob implements Enemy {
@@ -211,7 +_,7 @@
}
Vec3 flyTargetLocation = currentPhase.getFlyTargetLocation();
@@ -56,7 +48,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
double d = flyTargetLocation.x - this.getX();
double d1 = flyTargetLocation.y - this.getY();
double d2 = flyTargetLocation.z - this.getZ();
@@ -369,7 +387,12 @@ public class EnderDragon extends Mob implements Enemy {
@@ -366,7 +_,12 @@
if (this.nearestCrystal.isRemoved()) {
this.nearestCrystal = null;
} else if (this.tickCount % 10 == 0 && this.getHealth() < this.getMaxHealth()) {
@@ -70,7 +62,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
}
}
@@ -400,7 +423,7 @@ public class EnderDragon extends Mob implements Enemy {
@@ -396,7 +_,7 @@
double d2 = entity.getX() - d;
double d3 = entity.getZ() - d1;
double max = Math.max(d2 * d2 + d3 * d3, 0.1);
@@ -79,7 +71,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
if (!this.phaseManager.getCurrentPhase().isSitting() && livingEntity.getLastHurtByMobTimestamp() < entity.tickCount - 2) {
DamageSource damageSource = this.damageSources().mobAttack(this);
entity.hurtServer(level, damageSource, 5.0F);
@@ -433,6 +456,7 @@ public class EnderDragon extends Mob implements Enemy {
@@ -429,6 +_,7 @@
int floor5 = Mth.floor(box.maxZ);
boolean flag = false;
boolean flag1 = false;
@@ -87,7 +79,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
for (int i = floor; i <= floor3; i++) {
for (int i1 = floor1; i1 <= floor4; i1++) {
@@ -441,7 +465,11 @@ public class EnderDragon extends Mob implements Enemy {
@@ -437,7 +_,11 @@
BlockState blockState = level.getBlockState(blockPos);
if (!blockState.isAir() && !blockState.is(BlockTags.DRAGON_TRANSPARENT)) {
if (level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !blockState.is(BlockTags.DRAGON_IMMUNE)) {
@@ -100,7 +92,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
} else {
flag = true;
}
@@ -450,6 +478,58 @@ public class EnderDragon extends Mob implements Enemy {
@@ -446,6 +_,58 @@
}
}
@@ -159,7 +151,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
if (flag1) {
BlockPos blockPos1 = new BlockPos(
floor + this.random.nextInt(floor3 - floor + 1),
@@ -507,7 +587,15 @@ public class EnderDragon extends Mob implements Enemy {
@@ -503,7 +_,15 @@
@Override
public void kill(ServerLevel level) {
@@ -176,7 +168,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
this.gameEvent(GameEvent.ENTITY_DIE);
if (this.dragonFight != null) {
this.dragonFight.updateDragon(this);
@@ -529,18 +617,41 @@ public class EnderDragon extends Mob implements Enemy {
@@ -525,18 +_,41 @@
this.level().addParticle(ParticleTypes.EXPLOSION_EMITTER, this.getX() + f, this.getY() + 2.0 + f1, this.getZ() + f2, 0.0, 0.0, 0.0);
}
@@ -194,7 +186,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
- 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) { // 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
+ ExperienceOrb.award(serverLevel, this.position(), Mth.floor(i * 0.08F), org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, this.lastHurtByPlayer.getEntity(this.level(), Player.class), this); // Paper
}
if (this.dragonDeathTime == 1 && !this.isSilent()) {
@@ -221,14 +213,14 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
}
}
@@ -553,15 +664,15 @@ public class EnderDragon extends Mob implements Enemy {
@@ -549,15 +_,15 @@
}
if (this.dragonDeathTime == 200 && this.level() instanceof ServerLevel serverLevel1) {
- if (serverLevel1.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
- ExperienceOrb.award(serverLevel1, this.position(), Mth.floor(i * 0.2F));
+ if (true) { // Paper - SPIGOT-2420: Already checked for the game rule when calculating the xp
+ ExperienceOrb.award(serverLevel1, this.position(), Mth.floor(i * 0.2F), org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, this.lastHurtByPlayer, this); // Paper
+ ExperienceOrb.award(serverLevel1, this.position(), Mth.floor(i * 0.2F), org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, this.lastHurtByPlayer.getEntity(this.level(), Player.class), this); // Paper
}
if (this.dragonFight != null) {
@@ -240,7 +232,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
this.gameEvent(GameEvent.ENTITY_DIE);
}
}
@@ -743,6 +854,7 @@ public class EnderDragon extends Mob implements Enemy {
@@ -739,6 +_,7 @@
super.addAdditionalSaveData(compound);
compound.putInt("DragonPhase", this.phaseManager.getCurrentPhase().getPhase().getId());
compound.putInt("DragonDeathTime", this.dragonDeathTime);
@@ -248,20 +240,19 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
}
@Override
@@ -755,6 +867,12 @@ public class EnderDragon extends Mob implements Enemy {
if (compound.contains("DragonDeathTime")) {
this.dragonDeathTime = compound.getInt("DragonDeathTime");
}
+
@@ -746,6 +_,11 @@
super.readAdditionalSaveData(compound);
compound.getInt("DragonPhase").ifPresent(integer -> this.phaseManager.setPhase(EnderDragonPhase.getById(integer)));
this.dragonDeathTime = compound.getIntOr("DragonDeathTime", 0);
+ // 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");
+ this.expToDrop = compound.getIntOr("Bukkit.expToDrop", 0);
+ }
+ // CraftBukkit end
}
@Override
@@ -795,7 +913,7 @@ public class EnderDragon extends Mob implements Enemy {
@@ -786,7 +_,7 @@
EnderDragonPhase<? extends DragonPhaseInstance> phase = currentPhase.getPhase();
Vec3 viewVector;
if (phase == EnderDragonPhase.LANDING || phase == EnderDragonPhase.TAKEOFF) {
@@ -270,7 +261,7 @@ index db159b10011a81d8fb2fdbfb7f69911518ab56cc..403bcd056bf9c385599383983bf7a0cc
float max = Math.max((float)Math.sqrt(heightmapPos.distToCenterSqr(this.position())) / 4.0F, 1.0F);
float f = 6.0F / max;
float xRot = this.getXRot();
@@ -883,4 +1001,19 @@ public class EnderDragon extends Mob implements Enemy {
@@ -874,4 +_,19 @@
protected float sanitizeScale(float scale) {
return 1.0F;
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/BaseSpawner.java b/net/minecraft/world/level/BaseSpawner.java
index 68f5110c2ecae321887b8c0b1cb21437784fd860..425fcc7872c6ebd2156be8bea1d516ce7aeeb280 100644
--- a/net/minecraft/world/level/BaseSpawner.java
+++ b/net/minecraft/world/level/BaseSpawner.java
@@ -44,13 +44,15 @@ public abstract class BaseSpawner {
@@ -46,13 +_,15 @@
public int maxNearbyEntities = 6;
public int requiredPlayerRange = 16;
public int spawnRange = 4;
@@ -25,7 +17,7 @@ index 68f5110c2ecae321887b8c0b1cb21437784fd860..425fcc7872c6ebd2156be8bea1d516ce
}
public void clientTick(Level level, BlockPos pos) {
@@ -73,13 +75,19 @@ public abstract class BaseSpawner {
@@ -75,13 +_,19 @@
}
public void serverTick(ServerLevel serverLevel, BlockPos pos) {
@@ -47,7 +39,7 @@ index 68f5110c2ecae321887b8c0b1cb21437784fd860..425fcc7872c6ebd2156be8bea1d516ce
} else {
boolean flag = false;
RandomSource random = serverLevel.getRandom();
@@ -113,6 +121,21 @@ public abstract class BaseSpawner {
@@ -118,6 +_,21 @@
continue;
}
@@ -67,17 +59,17 @@ index 68f5110c2ecae321887b8c0b1cb21437784fd860..425fcc7872c6ebd2156be8bea1d516ce
+ // Paper end - PreCreatureSpawnEvent
+
Entity entity = EntityType.loadEntityRecursive(entityToSpawn, serverLevel, EntitySpawnReason.SPAWNER, entity1 -> {
entity1.moveTo(d, d1, d2, entity1.getYRot(), entity1.getXRot());
entity1.snapTo(vec3.x, vec3.y, vec3.z, entity1.getYRot(), entity1.getXRot());
return entity1;
@@ -133,6 +156,7 @@ public abstract class BaseSpawner {
@@ -138,6 +_,7 @@
return;
}
+ entity.preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported; preserve entity motion from tag
entity.moveTo(entity.getX(), entity.getY(), entity.getZ(), random.nextFloat() * 360.0F, 0.0F);
entity.snapTo(entity.getX(), entity.getY(), entity.getZ(), random.nextFloat() * 360.0F, 0.0F);
if (entity instanceof Mob mob) {
if (nextSpawnData.getCustomSpawnRules().isEmpty() && !mob.checkSpawnRules(serverLevel, EntitySpawnReason.SPAWNER)
@@ -147,9 +171,22 @@ public abstract class BaseSpawner {
@@ -152,9 +_,22 @@
}
nextSpawnData.getEquipment().ifPresent(mob::equip);
@@ -101,7 +93,7 @@ index 68f5110c2ecae321887b8c0b1cb21437784fd860..425fcc7872c6ebd2156be8bea1d516ce
this.delay(serverLevel, pos);
return;
}
@@ -160,7 +197,7 @@ public abstract class BaseSpawner {
@@ -165,7 +_,7 @@
((Mob)entity).spawnAnim();
}
@@ -110,39 +102,38 @@ index 68f5110c2ecae321887b8c0b1cb21437784fd860..425fcc7872c6ebd2156be8bea1d516ce
}
}
@@ -184,7 +221,13 @@ public abstract class BaseSpawner {
@@ -189,13 +_,27 @@
}
public void load(@Nullable Level level, BlockPos pos, CompoundTag tag) {
- this.spawnDelay = tag.getShortOr("Delay", (short)20);
+ // Paper start - use larger int if set
+ if (tag.contains("Paper.Delay")) {
+ this.spawnDelay = tag.getInt("Paper.Delay");
+ this.spawnDelay = tag.getIntOr("Paper.Delay", 0);
+ } else {
this.spawnDelay = tag.getShort("Delay");
+ this.spawnDelay = tag.getShortOr("Delay", (short) 0);
+ }
+ // Paper end
boolean flag = tag.contains("SpawnData", 10);
if (flag) {
SpawnData spawnData = SpawnData.CODEC
@@ -205,9 +248,15 @@ public abstract class BaseSpawner {
this.spawnPotentials = SimpleWeightedRandomList.single(this.nextSpawnData != null ? this.nextSpawnData : new SpawnData());
}
+ this.spawnDelay = tag.getShortOr("Delay", (short) 20);
tag.read("SpawnData", SpawnData.CODEC).ifPresent(spawnData -> this.setNextSpawnData(level, pos, spawnData));
this.spawnPotentials = tag.read("SpawnPotentials", SpawnData.LIST_CODEC)
- .orElseGet(() -> WeightedList.of(this.nextSpawnData != null ? this.nextSpawnData : new SpawnData()));
- this.minSpawnDelay = tag.getIntOr("MinSpawnDelay", 200);
+ .orElseGet(() -> WeightedList.of(this.nextSpawnData != null ? this.nextSpawnData : new SpawnData()));
+ // Paper start - use ints if set
+ if (tag.contains("Paper.MinSpawnDelay", net.minecraft.nbt.Tag.TAG_ANY_NUMERIC)) {
+ this.minSpawnDelay = tag.getInt("Paper.MinSpawnDelay");
+ this.maxSpawnDelay = tag.getInt("Paper.MaxSpawnDelay");
+ this.spawnCount = tag.getShort("SpawnCount");
+ if (tag.contains("Paper.MinSpawnDelay")) {
+ this.minSpawnDelay = tag.getIntOr("Paper.MinSpawnDelay", 0);
+ this.maxSpawnDelay = tag.getIntOr("Paper.MaxSpawnDelay", 0);
+ this.spawnCount = tag.getShortOr("SpawnCount", (short) 0);
+ } else // Paper end
if (tag.contains("MinSpawnDelay", 99)) {
- this.minSpawnDelay = tag.getShort("MinSpawnDelay");
- this.maxSpawnDelay = tag.getShort("MaxSpawnDelay");
+ this.minSpawnDelay = tag.getInt("MinSpawnDelay"); // Paper - short -> int
+ this.maxSpawnDelay = tag.getInt("MaxSpawnDelay"); // Paper - short -> int
this.spawnCount = tag.getShort("SpawnCount");
}
@@ -224,9 +273,20 @@ public abstract class BaseSpawner {
+ this.minSpawnDelay = tag.getIntOr("MinSpawnDelay", 200);
this.maxSpawnDelay = tag.getIntOr("MaxSpawnDelay", 800);
this.spawnCount = tag.getIntOr("SpawnCount", 4);
+ } // Paper end
this.maxNearbyEntities = tag.getIntOr("MaxNearbyEntities", 6);
this.requiredPlayerRange = tag.getIntOr("RequiredPlayerRange", 16);
this.spawnRange = tag.getIntOr("SpawnRange", 4);
@@ -203,9 +_,20 @@
}
public CompoundTag save(CompoundTag tag) {
@@ -1,25 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b0163df4dc4 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -24,8 +24,10 @@ import net.minecraft.core.registries.Registries;
import net.minecraft.network.protocol.Packet;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
+import io.papermc.paper.util.MCUtil;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.FullChunkStatus;
+import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
@@ -79,6 +81,27 @@ import net.minecraft.world.phys.AABB;
@@ -81,6 +_,28 @@
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.scores.Scoreboard;
@@ -31,6 +12,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
+import net.minecraft.network.protocol.game.ClientboundSetBorderSizePacket;
+import net.minecraft.network.protocol.game.ClientboundSetBorderWarningDelayPacket;
+import net.minecraft.network.protocol.game.ClientboundSetBorderWarningDistancePacket;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.world.level.border.BorderChangeListener;
+import net.minecraft.world.level.dimension.LevelStem;
+import org.bukkit.Bukkit;
@@ -44,10 +26,10 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
+import org.bukkit.event.block.BlockPhysicsEvent;
+// CraftBukkit end
+
public abstract class Level implements LevelAccessor, AutoCloseable {
public abstract class Level implements LevelAccessor, UUIDLookup<Entity>, AutoCloseable {
public static final Codec<ResourceKey<Level>> RESOURCE_KEY_CODEC = ResourceKey.codec(Registries.DIMENSION);
public static final ResourceKey<Level> OVERWORLD = ResourceKey.create(Registries.DIMENSION, ResourceLocation.withDefaultNamespace("overworld"));
@@ -91,7 +114,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -93,7 +_,7 @@
public static final int TICKS_PER_DAY = 24000;
public static final int MAX_ENTITY_SPAWN_Y = 20000000;
public static final int MIN_ENTITY_SPAWN_Y = -20000000;
@@ -56,7 +38,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
protected final NeighborUpdater neighborUpdater;
private final List<TickingBlockEntity> pendingBlockEntityTickers = Lists.newArrayList();
private boolean tickingBlockEntities;
@@ -117,6 +140,61 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -119,6 +_,61 @@
private final DamageSources damageSources;
private long subTickCount;
@@ -118,7 +100,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
protected Level(
WritableLevelData levelData,
ResourceKey<Level> dimension,
@@ -125,8 +203,26 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -127,8 +_,26 @@
boolean isClientSide,
boolean isDebug,
long biomeZoomSeed,
@@ -146,7 +128,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
this.levelData = levelData;
this.dimensionTypeRegistration = dimensionTypeRegistration;
final DimensionType dimensionType = dimensionTypeRegistration.value();
@@ -136,12 +232,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -138,12 +_,12 @@
this.worldBorder = new WorldBorder() {
@Override
public double getCenterX() {
@@ -161,10 +143,11 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
}
};
} else {
@@ -154,7 +250,86 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -156,7 +_,86 @@
this.neighborUpdater = new CollectingNeighborUpdater(this, maxChainedNeighborUpdates);
this.registryAccess = registryAccess;
this.damageSources = new DamageSources(registryAccess);
- }
+
+ // CraftBukkit start
+ this.getWorldBorder().world = (ServerLevel) this;
@@ -243,12 +226,12 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
+ }
+
+ return true;
}
+ }
+ // Paper end - Cancel hit for vanished players
@Override
public boolean isClientSide() {
@@ -167,8 +342,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -169,8 +_,15 @@
return null;
}
@@ -265,7 +248,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
}
public static boolean isInSpawnableBounds(BlockPos pos) {
@@ -176,22 +358,85 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -178,21 +_,84 @@
}
private static boolean isInWorldBoundsHorizontal(BlockPos pos) {
@@ -285,6 +268,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
@Override
- public LevelChunk getChunk(int chunkX, int chunkZ) {
- return (LevelChunk)this.getChunk(chunkX, chunkZ, ChunkStatus.FULL);
- }
+ public final LevelChunk getChunk(int chunkX, int chunkZ) { // Paper - final to help inline
+ // Paper start - Perf: make sure loaded chunks get the inlined variant of this function
+ net.minecraft.server.level.ServerChunkCache cps = ((ServerLevel)this).getChunkSource();
@@ -344,18 +328,17 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
+ }
+ public final @Nullable LevelChunk getChunkIfLoaded(BlockPos blockposition) {
+ return ((ServerLevel) this).getChunkSource().getChunkAtIfLoadedImmediately(blockposition.getX() >> 4, blockposition.getZ() >> 4);
}
+ }
+
+ // reduces need to do isLoaded before getType
+ public final @Nullable BlockState getBlockStateIfLoadedAndInBounds(BlockPos blockposition) {
+ return getWorldBorder().isWithinBounds(blockposition) ? getBlockStateIfLoaded(blockposition) : null;
+ }
+ // Paper end
+
@Nullable
@Override
public ChunkAccess getChunk(int x, int z, ChunkStatus chunkStatus, boolean requireChunk) {
@@ -210,6 +455,22 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -212,6 +_,22 @@
@Override
public boolean setBlock(BlockPos pos, BlockState state, int flags, int recursionLeft) {
@@ -378,11 +361,11 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
if (this.isOutsideBuildHeight(pos)) {
return false;
} else if (!this.isClientSide && this.isDebug()) {
@@ -217,11 +478,28 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -219,11 +_,26 @@
} else {
LevelChunk chunkAt = this.getChunkAt(pos);
Block block = state.getBlock();
- BlockState blockState = chunkAt.setBlockState(pos, state, (flags & 64) != 0);
- BlockState blockState = chunkAt.setBlockState(pos, state, flags);
+ // CraftBukkit start - capture blockstates
+ boolean captured = false;
+ if (this.captureBlockStates && !this.capturedBlockStates.containsKey(pos)) {
@@ -391,10 +374,8 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
+ this.capturedBlockStates.put(pos.immutable(), blockstate);
+ captured = true;
+ }
+ BlockState blockState = chunkAt.setBlockState(pos, state, flags, (flags & 1024) == 0); // CraftBukkit custom NO_PLACE flag
+ // CraftBukkit end
+
+ BlockState blockState = chunkAt.setBlockState(pos, state, (flags & 64) != 0, (flags & 1024) == 0); // CraftBukkit custom NO_PLACE flag
+
if (blockState == null) {
+ // CraftBukkit start - remove blockstate if failed (or the same)
+ if (this.captureBlockStates && captured) {
@@ -408,9 +389,9 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
if (blockState1 == state) {
if (blockState != blockState1) {
this.setBlocksDirty(pos, blockState, blockState1);
@@ -249,12 +527,76 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -251,12 +_,75 @@
this.onBlockStateChange(pos, blockState, blockState1);
this.updatePOIOnBlockStateChange(pos, blockState, blockState1);
}
+ */
+
@@ -447,7 +428,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
+ }
+
+ if ((i & 1) != 0) {
+ this.blockUpdated(blockposition, iblockdata1.getBlock());
+ this.updateNeighborsAt(blockposition, iblockdata1.getBlock());
+ if (!this.isClientSide && iblockdata.hasAnalogOutputSignal()) {
+ this.updateNeighbourForOutputSignal(blockposition, newBlock.getBlock());
+ }
@@ -481,11 +462,10 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
+ }
+ }
+ // CraftBukkit end
+
public void onBlockStateChange(BlockPos pos, BlockState blockState, BlockState newState) {
public void updatePOIOnBlockStateChange(BlockPos pos, BlockState oldState, BlockState newState) {
}
@@ -271,13 +613,31 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -273,13 +_,31 @@
return false;
} else {
FluidState fluidState = this.getFluidState(pos);
@@ -520,7 +500,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
}
boolean flag = this.setBlock(pos, fluidState.createLegacyBlock(), 3, recursionLeft);
@@ -344,10 +704,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -343,10 +_,18 @@
@Override
public BlockState getBlockState(BlockPos pos) {
@@ -540,7 +520,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
return chunk.getBlockState(pos);
}
}
@@ -454,33 +822,50 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -461,32 +_,49 @@
this.pendingBlockEntityTickers.clear();
}
@@ -586,7 +566,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
+ // Paper end - Prevent block entity and entity crashes
}
}
+
+ // Paper start - Option to prevent armor stands from doing entity lookups
+ @Override
+ public boolean noCollision(@Nullable Entity entity, AABB box) {
@@ -595,11 +575,10 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
+ return LevelAccessor.super.noCollision(entity, box);
+ }
+ // Paper end - Option to prevent armor stands from doing entity lookups
+
public boolean shouldTickDeath(Entity entity) {
return true;
}
@@ -599,6 +984,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -606,6 +_,19 @@
@Nullable
@Override
public BlockEntity getBlockEntity(BlockPos pos) {
@@ -619,7 +598,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
if (this.isOutsideBuildHeight(pos)) {
return null;
} else {
@@ -611,6 +1009,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -618,6 +_,12 @@
public void setBlockEntity(BlockEntity blockEntity) {
BlockPos blockPos = blockEntity.getBlockPos();
if (!this.isOutsideBuildHeight(blockPos)) {
@@ -632,7 +611,7 @@ index 3f09a4cc7349a96b3efc8909b5ed760789a987d7..32f184288f6065259c921293922c1b01
this.getChunkAt(blockPos).addAndRegisterBlockEntity(blockEntity);
}
}
@@ -987,7 +1391,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -1008,7 +_,8 @@
BLOCK("block"),
MOB("mob"),
TNT("tnt"),
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java
index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227044aea63 100644
--- a/net/minecraft/world/level/NaturalSpawner.java
+++ b/net/minecraft/world/level/NaturalSpawner.java
@@ -49,6 +49,13 @@ import net.minecraft.world.level.material.FluidState;
@@ -49,6 +_,13 @@
import net.minecraft.world.phys.Vec3;
import org.slf4j.Logger;
@@ -22,7 +14,7 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
public final class NaturalSpawner {
private static final Logger LOGGER = LogUtils.getLogger();
private static final int MIN_SPAWN_DISTANCE = 24;
@@ -72,6 +79,13 @@ public final class NaturalSpawner {
@@ -73,6 +_,13 @@
if (!(entity instanceof Mob mob && (mob.isPersistenceRequired() || mob.requiresCustomPersistence()))) {
MobCategory category = entity.getType().getCategory();
if (category != MobCategory.MISC) {
@@ -36,7 +28,7 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
BlockPos blockPos = entity.blockPosition();
chunkGetter.query(ChunkPos.asLong(blockPos), chunk -> {
MobSpawnSettings.MobSpawnCost mobSpawnCost = getRoughBiome(blockPos, chunk).getMobSettings().getMobSpawnCost(entity.getType());
@@ -96,17 +110,34 @@ public final class NaturalSpawner {
@@ -97,17 +_,34 @@
return chunk.getNoiseBiome(QuartPos.fromBlock(pos.getX()), QuartPos.fromBlock(pos.getY()), QuartPos.fromBlock(pos.getZ())).value();
}
@@ -73,7 +65,7 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
}
}
@@ -126,6 +157,16 @@ public final class NaturalSpawner {
@@ -127,6 +_,16 @@
profilerFiller.pop();
}
@@ -90,7 +82,7 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
public static void spawnCategoryForChunk(
MobCategory category, ServerLevel level, LevelChunk chunk, NaturalSpawner.SpawnPredicate filter, NaturalSpawner.AfterSpawnCallback callback
) {
@@ -151,8 +192,8 @@ public final class NaturalSpawner {
@@ -152,8 +_,8 @@
StructureManager structureManager = level.structureManager();
ChunkGenerator generator = level.getChunkSource().getGenerator();
int y = pos.getY();
@@ -101,7 +93,7 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
int i = 0;
@@ -174,7 +215,7 @@ public final class NaturalSpawner {
@@ -175,7 +_,7 @@
Player nearestPlayer = level.getNearestPlayer(d, y, d1, -1.0, false);
if (nearestPlayer != null) {
double d2 = nearestPlayer.distanceToSqr(d, y, d1);
@@ -110,23 +102,22 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
if (spawnerData == null) {
Optional<MobSpawnSettings.SpawnerData> randomSpawnMobAt = getRandomSpawnMobAt(
level, structureManager, generator, category, level.random, mutableBlockPos
@@ -187,8 +228,13 @@ public final class NaturalSpawner {
ceil = spawnerData.minCount + level.random.nextInt(1 + spawnerData.maxCount - spawnerData.minCount);
@@ -188,7 +_,13 @@
ceil = spawnerData.minCount() + level.random.nextInt(1 + spawnerData.maxCount() - spawnerData.minCount());
}
- if (isValidSpawnPostitionForType(level, category, structureManager, generator, spawnerData, mutableBlockPos, d2)
- && filter.test(spawnerData.type, mutableBlockPos, chunk)) {
+ // Paper start - PreCreatureSpawnEvent
+ PreSpawnStatus doSpawning = isValidSpawnPostitionForType(level, category, structureManager, generator, spawnerData, mutableBlockPos, d2);
+ if (doSpawning == PreSpawnStatus.ABORT) {
+ return;
+ }
+ if (doSpawning == PreSpawnStatus.SUCCESS && filter.test(spawnerData.type, mutableBlockPos, chunk)) {
+ // Paper end - PreCreatureSpawnEvent
Mob mobForSpawn = getMobForSpawn(level, spawnerData.type);
+ if (doSpawning == PreSpawnStatus.SUCCESS
+ // Paper end - PreCreatureSpawnEvent
&& filter.test(spawnerData.type(), mutableBlockPos, chunk)) {
Mob mobForSpawn = getMobForSpawn(level, spawnerData.type());
if (mobForSpawn == null) {
return;
@@ -199,10 +245,15 @@ public final class NaturalSpawner {
@@ -200,10 +_,15 @@
spawnGroupData = mobForSpawn.finalizeSpawn(
level, level.getCurrentDifficultyAt(mobForSpawn.blockPosition()), EntitySpawnReason.NATURAL, spawnGroupData
);
@@ -146,8 +137,8 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
if (i >= mobForSpawn.getMaxSpawnClusterSize()) {
return;
}
@@ -225,7 +276,15 @@ public final class NaturalSpawner {
&& (Objects.equals(new ChunkPos(pos), chunk.getPos()) || level.isNaturalSpawningAllowed(pos));
@@ -231,7 +_,15 @@
}
}
- private static boolean isValidSpawnPostitionForType(
@@ -163,16 +154,15 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
ServerLevel level,
MobCategory category,
StructureManager structureManager,
@@ -235,7 +294,20 @@ public final class NaturalSpawner {
@@ -241,7 +_,19 @@
double distance
) {
EntityType<?> entityType = data.type;
EntityType<?> entityType = data.type();
- return entityType.getCategory() != MobCategory.MISC
+
+ // Paper start - PreCreatureSpawnEvent
+ com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
+ io.papermc.paper.util.MCUtil.toLocation(level, pos),
+ org.bukkit.craftbukkit.entity.CraftEntityType.minecraftToBukkit(entityType), SpawnReason.NATURAL
+ io.papermc.paper.util.MCUtil.toLocation(level, pos),
+ org.bukkit.craftbukkit.entity.CraftEntityType.minecraftToBukkit(entityType), SpawnReason.NATURAL
+ );
+ if (!event.callEvent()) {
+ if (event.shouldAbortSpawn()) {
@@ -181,11 +171,11 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
+ return PreSpawnStatus.CANCELLED;
+ }
+ final boolean success = entityType.getCategory() != MobCategory.MISC
+ // Paper end - PreCreatureSpawnEvent
+ // Paper end - PreCreatureSpawnEvent
&& (
entityType.canSpawnFarFromPlayer()
|| !(distance > entityType.getCategory().getDespawnDistance() * entityType.getCategory().getDespawnDistance())
@@ -245,6 +317,7 @@ public final class NaturalSpawner {
@@ -251,6 +_,7 @@
&& SpawnPlacements.isSpawnPositionOk(entityType, level, pos)
&& SpawnPlacements.checkSpawnRules(entityType, level, EntitySpawnReason.NATURAL, pos, level.random)
&& level.noCollision(entityType.getSpawnAABB(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5));
@@ -193,7 +183,7 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
}
@Nullable
@@ -258,6 +331,7 @@ public final class NaturalSpawner {
@@ -263,6 +_,7 @@
LOGGER.warn("Can't spawn entity of type: {}", BuiltInRegistries.ENTITY_TYPE.getKey(entityType));
} catch (Exception var4) {
LOGGER.warn("Failed to create mob", (Throwable)var4);
@@ -201,15 +191,15 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
}
return null;
@@ -364,6 +438,7 @@ public final class NaturalSpawner {
entity = spawnerData.type.create(levelAccessor.getLevel(), EntitySpawnReason.NATURAL);
@@ -369,6 +_,7 @@
entity = spawnerData.type().create(levelAccessor.getLevel(), EntitySpawnReason.NATURAL);
} catch (Exception var27) {
LOGGER.warn("Failed to create mob", (Throwable)var27);
+ com.destroystokyo.paper.exception.ServerInternalException.reportInternalException(var27); // Paper - ServerExceptionEvent
continue;
}
@@ -381,7 +456,7 @@ public final class NaturalSpawner {
@@ -386,7 +_,7 @@
EntitySpawnReason.CHUNK_GENERATION,
spawnGroupData
);
@@ -218,7 +208,7 @@ index 5da70dd2762c9bc8ad968e5b984a623621fe6736..913ea92ace9d610c25bf28f703a3b227
flag = true;
}
}
@@ -501,8 +576,10 @@ public final class NaturalSpawner {
@@ -506,8 +_,10 @@
return this.unmodifiableMobCategoryCounts;
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java
index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03624608ff 100644
--- a/net/minecraft/world/level/ServerExplosion.java
+++ b/net/minecraft/world/level/ServerExplosion.java
@@ -33,6 +33,17 @@ import net.minecraft.world.phys.AABB;
@@ -33,6 +_,17 @@
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
@@ -26,7 +18,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
public class ServerExplosion implements Explosion {
private static final ExplosionDamageCalculator EXPLOSION_DAMAGE_CALCULATOR = new ExplosionDamageCalculator();
private static final int MAX_DROPS_PER_COMBINED_STACK = 16;
@@ -47,6 +58,11 @@ public class ServerExplosion implements Explosion {
@@ -47,6 +_,11 @@
private final DamageSource damageSource;
private final ExplosionDamageCalculator damageCalculator;
private final Map<Player, Vec3> hitPlayers = new HashMap<>();
@@ -38,7 +30,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
public ServerExplosion(
ServerLevel level,
@@ -60,12 +76,13 @@ public class ServerExplosion implements Explosion {
@@ -60,12 +_,13 @@
) {
this.level = level;
this.source = source;
@@ -53,7 +45,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
}
private ExplosionDamageCalculator makeDamageCalculator(@Nullable Entity entity) {
@@ -139,7 +156,8 @@ public class ServerExplosion implements Explosion {
@@ -139,7 +_,8 @@
for (float f1 = 0.3F; f > 0.0F; f -= 0.22500001F) {
BlockPos blockPos = BlockPos.containing(d3, d4, d5);
BlockState blockState = this.level.getBlockState(blockPos);
@@ -63,7 +55,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
if (!this.level.isInWorldBounds(blockPos)) {
break;
}
@@ -152,6 +170,15 @@ public class ServerExplosion implements Explosion {
@@ -152,6 +_,15 @@
if (f > 0.0F && this.damageCalculator.shouldBlockExplode(this, this.level, blockPos, blockState, f)) {
set.add(blockPos);
@@ -79,7 +71,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
}
d3 += d * 0.3F;
@@ -174,8 +201,8 @@ public class ServerExplosion implements Explosion {
@@ -174,8 +_,8 @@
int floor3 = Mth.floor(this.center.y + f + 1.0);
int floor4 = Mth.floor(this.center.z - f - 1.0);
int floor5 = Mth.floor(this.center.z + f + 1.0);
@@ -90,7 +82,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
if (!entity.ignoreExplosion(this)) {
double d = Math.sqrt(entity.distanceToSqr(this.center)) / f;
if (d <= 1.0) {
@@ -189,15 +216,43 @@ public class ServerExplosion implements Explosion {
@@ -189,15 +_,43 @@
d3 /= squareRoot;
boolean shouldDamageEntity = this.damageCalculator.shouldDamageEntity(this, entity);
float knockbackMultiplier = this.damageCalculator.getKnockbackMultiplier(entity);
@@ -137,7 +129,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
} else {
d5 = d4;
}
@@ -206,10 +261,18 @@ public class ServerExplosion implements Explosion {
@@ -206,8 +_,16 @@
d2 *= d5;
d3 *= d5;
Vec3 vec3 = new Vec3(d1, d2, d3);
@@ -150,14 +142,12 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
+ }
+ // CraftBukkit end
entity.push(vec3);
if (entity instanceof Player) {
Player player = (Player)entity;
- if (!player.isSpectator() && (!player.isCreative() || !player.getAbilities().flying)) {
+ if (!player.isSpectator() && (!player.isCreative() || !player.getAbilities().flying) && !level.paperConfig().environment.disableExplosionKnockback) { // Paper - Option to disable explosion knockback
this.hitPlayers.put(player, vec3);
}
- if (entity instanceof Player player && !player.isSpectator() && (!player.isCreative() || !player.getAbilities().flying)) {
+ if (entity instanceof Player player && !player.isSpectator() && (!player.isCreative() || !player.getAbilities().flying) && !level.paperConfig().environment.disableExplosionKnockback) { // Paper - Option to disable explosion knockback
this.hitPlayers.put(player, vec3);
}
@@ -225,7 +288,61 @@ public class ServerExplosion implements Explosion {
@@ -222,7 +_,61 @@
List<ServerExplosion.StackCollector> list = new ArrayList<>();
Util.shuffle(blocks, this.level.random);
@@ -206,7 +196,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
+ // CraftBukkit start - TNTPrimeEvent
+ BlockState iblockdata = this.level.getBlockState(blockPos);
+ Block block = iblockdata.getBlock();
+ if (block instanceof net.minecraft.world.level.block.TntBlock) {
+ if (level.getGameRules().getBoolean(GameRules.RULE_TNT_EXPLODES) && block instanceof net.minecraft.world.level.block.TntBlock) {
+ Entity sourceEntity = this.source == null ? null : this.source;
+ BlockPos sourceBlock = sourceEntity == null ? BlockPos.containing(this.center) : null;
+ if (!CraftEventFactory.callTNTPrimeEvent(this.level, blockPos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.EXPLOSION, sourceEntity, sourceBlock)) {
@@ -219,7 +209,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
this.level
.getBlockState(blockPos)
.onExplosionHit(this.level, blockPos, this, (itemStack, blockPos1) -> addOrAppendStack(list, itemStack, blockPos1));
@@ -239,12 +356,21 @@ public class ServerExplosion implements Explosion {
@@ -236,12 +_,21 @@
private void createFire(List<BlockPos> blocks) {
for (BlockPos blockPos : blocks) {
if (this.level.random.nextInt(3) == 0 && this.level.getBlockState(blockPos).isAir() && this.level.getBlockState(blockPos.below()).isSolidRender()) {
@@ -242,7 +232,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
this.level.gameEvent(this.source, GameEvent.EXPLODE, this.center);
List<BlockPos> list = this.calculateExplodedPositions();
this.hurtEntities();
@@ -261,6 +387,7 @@ public class ServerExplosion implements Explosion {
@@ -258,6 +_,7 @@
}
private static void addOrAppendStack(List<ServerExplosion.StackCollector> stackCollectors, ItemStack stack, BlockPos pos) {
@@ -250,7 +240,7 @@ index 6af7e356b26df59269ccbb8527336cefe8cb7148..155bf7ccff5c1332fceda2598342bb03
for (ServerExplosion.StackCollector stackCollector : stackCollectors) {
stackCollector.tryMerge(stack);
if (stack.isEmpty()) {
@@ -342,4 +469,86 @@ public class ServerExplosion implements Explosion {
@@ -339,4 +_,86 @@
}
}
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/BambooStalkBlock.java b/net/minecraft/world/level/block/BambooStalkBlock.java
index 8b754411fc0fcf3d9f016b006d3f14fd92f80eb1..d824bb7d86fd9063ec8185f6bc74dc7450c2b73a 100644
--- a/net/minecraft/world/level/block/BambooStalkBlock.java
+++ b/net/minecraft/world/level/block/BambooStalkBlock.java
@@ -130,9 +130,9 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
@@ -120,9 +_,9 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (state.getValue(STAGE) == 0) {
@@ -20,7 +12,7 @@ index 8b754411fc0fcf3d9f016b006d3f14fd92f80eb1..d824bb7d86fd9063ec8185f6bc74dc74
this.growBamboo(state, level, pos, random, i);
}
}
@@ -168,7 +168,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
@@ -158,7 +_,7 @@
public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) {
int heightAboveUpToMax = this.getHeightAboveUpToMax(level, pos);
int heightBelowUpToMax = this.getHeightBelowUpToMax(level, pos);
@@ -29,7 +21,7 @@ index 8b754411fc0fcf3d9f016b006d3f14fd92f80eb1..d824bb7d86fd9063ec8185f6bc74dc74
}
@Override
@@ -186,7 +186,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
@@ -176,7 +_,7 @@
for (int i2 = 0; i2 < i1; i2++) {
BlockPos blockPos = pos.above(heightAboveUpToMax);
BlockState blockState = level.getBlockState(blockPos);
@@ -38,7 +30,7 @@ index 8b754411fc0fcf3d9f016b006d3f14fd92f80eb1..d824bb7d86fd9063ec8185f6bc74dc74
return;
}
@@ -206,29 +206,38 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
@@ -191,27 +_,38 @@
BlockPos blockPos = pos.below(2);
BlockState blockState1 = level.getBlockState(blockPos);
BambooLeaves bambooLeaves = BambooLeaves.NONE;
@@ -62,9 +54,7 @@ index 8b754411fc0fcf3d9f016b006d3f14fd92f80eb1..d824bb7d86fd9063ec8185f6bc74dc74
int i = state.getValue(AGE) != 1 && !blockState1.is(Blocks.BAMBOO) ? 0 : 1;
- int i1 = (age < 11 || !(random.nextFloat() < 0.25F)) && age != 15 ? 0 : 1;
- level.setBlock(
- pos.above(), this.defaultBlockState().setValue(AGE, Integer.valueOf(i)).setValue(LEAVES, bambooLeaves).setValue(STAGE, Integer.valueOf(i1)), 3
- );
- level.setBlock(pos.above(), this.defaultBlockState().setValue(AGE, i).setValue(LEAVES, bambooLeaves).setValue(STAGE, i1), 3);
+ int i1 = (age < level.paperConfig().maxGrowthHeight.bamboo.min || random.nextFloat() >= 0.25F) && age != (level.paperConfig().maxGrowthHeight.bamboo.max - 1) ? 0 : 1; // Paper - Configurable cactus/bamboo/reed growth height
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, pos.above(), this.defaultBlockState().setValue(net.minecraft.world.level.block.BambooStalkBlock.AGE, i).setValue(BambooStalkBlock.LEAVES, bambooLeaves).setValue(net.minecraft.world.level.block.BambooStalkBlock.STAGE, i1), 3)) {
@@ -84,7 +74,7 @@ index 8b754411fc0fcf3d9f016b006d3f14fd92f80eb1..d824bb7d86fd9063ec8185f6bc74dc74
i++;
}
@@ -238,7 +247,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
@@ -221,7 +_,7 @@
protected int getHeightBelowUpToMax(BlockGetter level, BlockPos pos) {
int i = 0;
@@ -1,30 +1,22 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/BaseFireBlock.java b/net/minecraft/world/level/block/BaseFireBlock.java
index c1ac5e3d8af3003ec13ce678176363b0633b7a13..45df9f008b74dd0d6d790c91102e9afe1da45633 100644
--- a/net/minecraft/world/level/block/BaseFireBlock.java
+++ b/net/minecraft/world/level/block/BaseFireBlock.java
@@ -12,6 +12,7 @@ import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.Entity;
@@ -14,6 +_,7 @@
import net.minecraft.world.entity.InsideBlockEffectType;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.context.BlockPlaceContext;
+import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockBehaviour;
@@ -128,6 +129,7 @@ public abstract class BaseFireBlock extends Block {
@@ -129,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!entity.fireImmune()) {
if (entity.getRemainingFireTicks() < 0) {
entity.setRemainingFireTicks(entity.getRemainingFireTicks() + 1);
@@ -137,7 +139,18 @@ public abstract class BaseFireBlock extends Block {
effectApplier.apply(InsideBlockEffectType.FIRE_IGNITE);
effectApplier.runAfter(InsideBlockEffectType.FIRE_IGNITE, entity1 -> entity1.hurt(entity1.level().damageSources().inFire(), this.fireDamage));
}
@@ -143,30 +_,41 @@
}
if (entity.getRemainingFireTicks() >= 0) {
@@ -43,8 +35,6 @@ index c1ac5e3d8af3003ec13ce678176363b0633b7a13..45df9f008b74dd0d6d790c91102e9afe
+ // CraftBukkit end
}
}
@@ -146,24 +159,24 @@ public abstract class BaseFireBlock extends Block {
}
@Override
@@ -73,7 +63,7 @@ index c1ac5e3d8af3003ec13ce678176363b0633b7a13..45df9f008b74dd0d6d790c91102e9afe
}
@Override
@@ -208,4 +221,12 @@ public abstract class BaseFireBlock extends Block {
@@ -211,4 +_,12 @@
}
}
}
@@ -1,26 +1,18 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/BasePressurePlateBlock.java b/net/minecraft/world/level/block/BasePressurePlateBlock.java
index 4ee4059c8e49833477bfeb588de96afb4740ea4e..108c1d23bf80777b943edfa0b5585ebb928540a7 100644
--- a/net/minecraft/world/level/block/BasePressurePlateBlock.java
+++ b/net/minecraft/world/level/block/BasePressurePlateBlock.java
@@ -81,6 +81,7 @@ public abstract class BasePressurePlateBlock extends Block {
@@ -82,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!level.isClientSide) {
int signalForState = this.getSignalForState(state);
if (signalForState == 0) {
@@ -93,6 +94,19 @@ public abstract class BasePressurePlateBlock extends Block {
@@ -94,6 +_,19 @@
int signalStrength = this.getSignalStrength(level, pos);
boolean flag = currentSignal > 0;
boolean flag1 = signalStrength > 0;
+
+
+ // CraftBukkit start - Interact Pressure Plate
+ org.bukkit.World bworld = level.getWorld();
+ org.bukkit.plugin.PluginManager manager = level.getCraftServer().getPluginManager();
@@ -36,7 +28,7 @@ index 4ee4059c8e49833477bfeb588de96afb4740ea4e..108c1d23bf80777b943edfa0b5585ebb
if (currentSignal != signalStrength) {
BlockState blockState = this.setSignalForState(state, signalStrength);
level.setBlock(pos, blockState, 2);
@@ -145,7 +159,13 @@ public abstract class BasePressurePlateBlock extends Block {
@@ -142,7 +_,13 @@
}
protected static int getEntityCount(Level level, AABB box, Class<? extends Entity> entityClass) {
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/BedBlock.java b/net/minecraft/world/level/block/BedBlock.java
index c10d50b3a37ac7ceba10c0c9e899b5b5abb829dc..8c21e8aa4922691fa66cd22d631646c554251bdd 100644
--- a/net/minecraft/world/level/block/BedBlock.java
+++ b/net/minecraft/world/level/block/BedBlock.java
@@ -92,7 +92,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
@@ -90,7 +_,7 @@
}
}
@@ -17,7 +9,7 @@ index c10d50b3a37ac7ceba10c0c9e899b5b5abb829dc..8c21e8aa4922691fa66cd22d631646c5
level.removeBlock(pos, false);
BlockPos blockPos = pos.relative(state.getValue(FACING).getOpposite());
if (level.getBlockState(blockPos).is(this)) {
@@ -103,22 +103,56 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
@@ -101,22 +_,56 @@
level.explode(null, level.damageSources().badRespawnPointExplosion(center), null, center, 5.0F, true, Level.ExplosionInteraction.BLOCK);
return InteractionResult.SUCCESS_SERVER;
} else if (state.getValue(OCCUPIED)) {
@@ -75,7 +67,7 @@ index c10d50b3a37ac7ceba10c0c9e899b5b5abb829dc..8c21e8aa4922691fa66cd22d631646c5
public static boolean canSetSpawn(Level level) {
return level.dimensionType().bedWorks();
}
@@ -311,6 +345,11 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
@@ -299,6 +_,11 @@
if (!level.isClientSide) {
BlockPos blockPos = pos.relative(state.getValue(FACING));
level.setBlock(blockPos, state.setValue(PART, BedPart.HEAD), 3);
@@ -84,6 +76,6 @@ index c10d50b3a37ac7ceba10c0c9e899b5b5abb829dc..8c21e8aa4922691fa66cd22d631646c5
+ return;
+ }
+ // CraftBukkit end
level.blockUpdated(pos, Blocks.AIR);
level.updateNeighborsAt(pos, Blocks.AIR);
state.updateNeighbourShapes(level, pos, 3);
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/BigDripleafBlock.java b/net/minecraft/world/level/block/BigDripleafBlock.java
index 253c7c98d6c9da9597752efbb0777da7b9786665..1cc8fd0a273c3a7a75bf1ea522d109bd94718f43 100644
--- a/net/minecraft/world/level/block/BigDripleafBlock.java
+++ b/net/minecraft/world/level/block/BigDripleafBlock.java
@@ -136,7 +136,7 @@ public class BigDripleafBlock extends HorizontalDirectionalBlock implements Bone
@@ -129,7 +_,7 @@
@Override
protected void onProjectileHit(Level level, BlockState state, BlockHitResult hit, Projectile projectile) {
@@ -17,10 +9,10 @@ index 253c7c98d6c9da9597752efbb0777da7b9786665..1cc8fd0a273c3a7a75bf1ea522d109bd
}
@Override
@@ -199,9 +199,23 @@ public class BigDripleafBlock extends HorizontalDirectionalBlock implements Bone
@@ -192,9 +_,23 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!level.isClientSide) {
if (state.getValue(TILT) == Tilt.NONE && canEntityTilt(pos, entity) && !level.hasNeighborSignal(pos)) {
@@ -42,7 +34,7 @@ index 253c7c98d6c9da9597752efbb0777da7b9786665..1cc8fd0a273c3a7a75bf1ea522d109bd
}
}
}
@@ -213,9 +227,9 @@ public class BigDripleafBlock extends HorizontalDirectionalBlock implements Bone
@@ -206,9 +_,9 @@
} else {
Tilt tilt = state.getValue(TILT);
if (tilt == Tilt.UNSTABLE) {
@@ -54,7 +46,7 @@ index 253c7c98d6c9da9597752efbb0777da7b9786665..1cc8fd0a273c3a7a75bf1ea522d109bd
} else if (tilt == Tilt.FULL) {
resetTilt(state, level, pos);
}
@@ -238,8 +252,11 @@ public class BigDripleafBlock extends HorizontalDirectionalBlock implements Bone
@@ -231,8 +_,11 @@
return entity.onGround() && entity.position().y > pos.getY() + 0.6875F;
}
@@ -68,7 +60,7 @@ index 253c7c98d6c9da9597752efbb0777da7b9786665..1cc8fd0a273c3a7a75bf1ea522d109bd
if (sound != null) {
playTiltSound(level, pos, sound);
}
@@ -251,18 +268,26 @@ public class BigDripleafBlock extends HorizontalDirectionalBlock implements Bone
@@ -244,18 +_,26 @@
}
private static void resetTilt(BlockState state, Level level, BlockPos pos) {
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/Block.java b/net/minecraft/world/level/block/Block.java
index 8a027f0b6cfa7a7ad6b333ada5c94974e0ce1957..a4eb9a10b6c1351c7341bc031bb9f819e17ff1e5 100644
--- a/net/minecraft/world/level/block/Block.java
+++ b/net/minecraft/world/level/block/Block.java
@@ -90,6 +90,21 @@ public class Block extends BlockBehaviour implements ItemLike {
@@ -99,6 +_,21 @@
public static final int UPDATE_LIMIT = 512;
protected final StateDefinition<Block, BlockState> stateDefinition;
private BlockState defaultBlockState;
@@ -30,7 +22,7 @@ index 8a027f0b6cfa7a7ad6b333ada5c94974e0ce1957..a4eb9a10b6c1351c7341bc031bb9f819
@Nullable
private Item item;
private static final int CACHE_SIZE = 256;
@@ -272,6 +287,27 @@ public class Block extends BlockBehaviour implements ItemLike {
@@ -318,6 +_,27 @@
return state.getDrops(builder);
}
@@ -57,8 +49,8 @@ index 8a027f0b6cfa7a7ad6b333ada5c94974e0ce1957..a4eb9a10b6c1351c7341bc031bb9f819
+
public static void dropResources(BlockState state, Level level, BlockPos pos) {
if (level instanceof ServerLevel) {
getDrops(state, (ServerLevel)level, pos, null).forEach(itemStack -> popResource(level, pos, itemStack));
@@ -287,9 +323,14 @@ public class Block extends BlockBehaviour implements ItemLike {
getDrops(state, (ServerLevel)level, pos, null).forEach(stack -> popResource(level, pos, stack));
@@ -333,9 +_,14 @@
}
public static void dropResources(BlockState state, Level level, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool) {
@@ -68,13 +60,13 @@ index 8a027f0b6cfa7a7ad6b333ada5c94974e0ce1957..a4eb9a10b6c1351c7341bc031bb9f819
+ public static void dropResources(BlockState state, Level level, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool, boolean dropExperience) {
+ // Paper end - Properly handle xp dropping
if (level instanceof ServerLevel) {
getDrops(state, (ServerLevel)level, pos, blockEntity, entity, tool).forEach(itemStack -> popResource(level, pos, itemStack));
getDrops(state, (ServerLevel)level, pos, blockEntity, entity, tool).forEach(stack -> popResource(level, pos, stack));
- state.spawnAfterBreak((ServerLevel)level, pos, tool, true);
+ state.spawnAfterBreak((ServerLevel) level, pos, tool, dropExperience); // Paper - Properly handle xp dropping
+ state.spawnAfterBreak((ServerLevel)level, pos, tool, true, dropExperience); // Paper - Properly handle xp dropping
}
}
@@ -320,13 +361,24 @@ public class Block extends BlockBehaviour implements ItemLike {
@@ -366,13 +_,24 @@
if (level instanceof ServerLevel serverLevel && !stack.isEmpty() && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS)) {
ItemEntity itemEntity = itemEntitySupplier.get();
itemEntity.setDefaultPickUpDelay();
@@ -101,7 +93,7 @@ index 8a027f0b6cfa7a7ad6b333ada5c94974e0ce1957..a4eb9a10b6c1351c7341bc031bb9f819
}
}
@@ -345,10 +397,18 @@ public class Block extends BlockBehaviour implements ItemLike {
@@ -391,10 +_,18 @@
return this.defaultBlockState();
}
@@ -122,7 +114,7 @@ index 8a027f0b6cfa7a7ad6b333ada5c94974e0ce1957..a4eb9a10b6c1351c7341bc031bb9f819
}
public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) {
@@ -469,12 +529,33 @@ public class Block extends BlockBehaviour implements ItemLike {
@@ -533,12 +_,33 @@
return this.builtInRegistryHolder;
}
@@ -131,6 +123,8 @@ index 8a027f0b6cfa7a7ad6b333ada5c94974e0ce1957..a4eb9a10b6c1351c7341bc031bb9f819
int i = EnchantmentHelper.processBlockExperience(level, heldItem, amount.sample(level.getRandom()));
if (i > 0) {
- this.popExperience(level, pos, i);
- }
- }
+ // CraftBukkit start
+ //this.popExperience(level, pos, i);
+ return i;
@@ -151,9 +145,9 @@ index 8a027f0b6cfa7a7ad6b333ada5c94974e0ce1957..a4eb9a10b6c1351c7341bc031bb9f819
+ }
+ if (value > max) {
+ return max;
}
+ }
+ return value;
}
+ }
+ // Spigot end
record ShapePairKey(VoxelShape first, VoxelShape second) {
@@ -0,0 +1,10 @@
--- a/net/minecraft/world/level/block/BubbleColumnBlock.java
+++ b/net/minecraft/world/level/block/BubbleColumnBlock.java
@@ -49,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
BlockState blockState = level.getBlockState(pos.above());
boolean flag = blockState.getCollisionShape(level, pos).isEmpty() && blockState.getFluidState().isEmpty();
if (flag) {
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/BuddingAmethystBlock.java b/net/minecraft/world/level/block/BuddingAmethystBlock.java
index b3935ac8f2fbc506436e6fc879cecd82e6e2a3e0..f6850d3ab54a6eb4ff718d861f39aac2facd3a88 100644
--- a/net/minecraft/world/level/block/BuddingAmethystBlock.java
+++ b/net/minecraft/world/level/block/BuddingAmethystBlock.java
@@ -44,7 +44,13 @@ public class BuddingAmethystBlock extends AmethystBlock {
@@ -44,7 +_,13 @@
BlockState blockState1 = block.defaultBlockState()
.setValue(AmethystClusterBlock.FACING, direction)
.setValue(AmethystClusterBlock.WATERLOGGED, Boolean.valueOf(blockState.getFluidState().getType() == Fluids.WATER));
.setValue(AmethystClusterBlock.WATERLOGGED, blockState.getFluidState().getType() == Fluids.WATER);
- level.setBlockAndUpdate(blockPos, blockState1);
+ // Paper start - Have Amethyst throw both spread and grow events
+ if (block == Blocks.SMALL_AMETHYST_BUD) {
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/ButtonBlock.java b/net/minecraft/world/level/block/ButtonBlock.java
index ddf423bebd87c93bf66ee8fe23619b9aa4f6243d..4e56021917bd8b34b2d9d308ab70d39f7a0bcd44 100644
--- a/net/minecraft/world/level/block/ButtonBlock.java
+++ b/net/minecraft/world/level/block/ButtonBlock.java
@@ -114,6 +114,19 @@ public class ButtonBlock extends FaceAttachedHorizontalDirectionalBlock {
@@ -89,6 +_,19 @@
if (state.getValue(POWERED)) {
return InteractionResult.CONSUME;
} else {
@@ -28,15 +20,15 @@ index ddf423bebd87c93bf66ee8fe23619b9aa4f6243d..4e56021917bd8b34b2d9d308ab70d39f
this.press(state, level, pos, player);
return InteractionResult.SUCCESS;
}
@@ -179,6 +192,7 @@ public class ButtonBlock extends FaceAttachedHorizontalDirectionalBlock {
@@ -150,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!level.isClientSide && this.type.canButtonBeActivatedByArrows() && !state.getValue(POWERED)) {
this.checkPressed(state, level, pos);
}
@@ -190,7 +204,31 @@ public class ButtonBlock extends FaceAttachedHorizontalDirectionalBlock {
@@ -161,7 +_,31 @@
: null;
boolean flag = abstractArrow != null;
boolean poweredValue = state.getValue(POWERED);
@@ -65,6 +57,6 @@ index ddf423bebd87c93bf66ee8fe23619b9aa4f6243d..4e56021917bd8b34b2d9d308ab70d39f
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(flag)), 3);
level.setBlock(pos, state.setValue(POWERED, flag), 3);
this.updateNeighbours(state, level, pos);
this.playSound(null, level, pos, flag);
@@ -0,0 +1,47 @@
--- a/net/minecraft/world/level/block/CactusBlock.java
+++ b/net/minecraft/world/level/block/CactusBlock.java
@@ -58,7 +_,7 @@
int ageValue = state.getValue(AGE);
while (level.getBlockState(pos.below(i)).is(this)) {
- if (++i == 3 && ageValue == 15) {
+ if (++i == level.paperConfig().maxGrowthHeight.cactus && ageValue == 15) { // Paper - Configurable cactus/bamboo/reed growth height
return;
}
}
@@ -66,17 +_,20 @@
if (ageValue == 8 && this.canSurvive(this.defaultBlockState(), level, pos.above())) {
double d = i >= 3 ? 0.25 : 0.1;
if (random.nextDouble() <= d) {
- level.setBlockAndUpdate(blockPos, Blocks.CACTUS_FLOWER.defaultBlockState());
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, Blocks.CACTUS_FLOWER.defaultBlockState());
}
- } else if (ageValue == 15 && i < 3) {
- level.setBlockAndUpdate(blockPos, this.defaultBlockState());
+ } else if (ageValue == 15 && i < level.paperConfig().maxGrowthHeight.cactus) { // Paper - Configurable cactus/bamboo/reed growth height
BlockState blockState = state.setValue(AGE, 0);
- level.setBlock(pos, blockState, 260);
+ // Paper start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, blockState, 260)) {
+ return;
+ }
+ // Paper end
level.neighborChanged(blockState, blockPos, this, null, false);
}
if (ageValue < 15) {
- level.setBlock(pos, state.setValue(AGE, ageValue + 1), 260);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(AGE, ageValue + 1), 260); // Paper
}
}
}
@@ -124,7 +_,8 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
- entity.hurt(level.damageSources().cactus(), 1.0F);
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
+ entity.hurt(level.damageSources().cactus().eventBlockDamager(level, pos), 1.0F); // CraftBukkit
}
@Override
@@ -1,25 +1,17 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/CampfireBlock.java b/net/minecraft/world/level/block/CampfireBlock.java
index 7e478b462cf99752e1ff3ec57426d5710ea1bc95..0bf42a5fdf2c606062b9be4443a9a22346159ecb 100644
--- a/net/minecraft/world/level/block/CampfireBlock.java
+++ b/net/minecraft/world/level/block/CampfireBlock.java
@@ -112,8 +112,9 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB
@@ -107,8 +_,9 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (state.getValue(LIT) && entity instanceof LivingEntity) {
- entity.hurt(level.damageSources().campfire(), this.fireDamage);
+ entity.hurt(level.damageSources().campfire().eventBlockDamager(level, pos), (float) this.fireDamage); // CraftBukkit
}
super.entityInside(state, level, pos, entity);
@@ -242,6 +243,11 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB
super.entityInside(state, level, pos, entity, effectApplier);
@@ -220,6 +_,11 @@
&& projectile.mayInteract(serverLevel, blockPos)
&& !state.getValue(LIT)
&& !state.getValue(WATERLOGGED)) {
@@ -28,6 +20,6 @@ index 7e478b462cf99752e1ff3ec57426d5710ea1bc95..0bf42a5fdf2c606062b9be4443a9a223
+ return;
+ }
+ // CraftBukkit end
level.setBlock(blockPos, state.setValue(BlockStateProperties.LIT, Boolean.valueOf(true)), 11);
level.setBlock(blockPos, state.setValue(BlockStateProperties.LIT, true), 11);
}
}
@@ -1,26 +1,19 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/CarvedPumpkinBlock.java b/net/minecraft/world/level/block/CarvedPumpkinBlock.java
index 4dc5fae304e5730f49ebad69aa11445e39b1b754..291107e21a858215821b82d184fcfb54abbc0d97 100644
--- a/net/minecraft/world/level/block/CarvedPumpkinBlock.java
+++ b/net/minecraft/world/level/block/CarvedPumpkinBlock.java
@@ -79,9 +79,13 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock {
@@ -79,9 +_,14 @@
}
private static void spawnGolemInWorld(Level level, BlockPattern.BlockPatternMatch patternMatch, Entity golem, BlockPos pos) {
- clearPatternBlocks(level, patternMatch);
+ // clearPatternBlocks(level, patternMatch); // CraftBukkit - moved down
golem.moveTo(pos.getX() + 0.5, pos.getY() + 0.05, pos.getZ() + 0.5, 0.0F, 0.0F);
+ // clearPatternBlocks(level, patternMatch); // Paper - moved down
golem.snapTo(pos.getX() + 0.5, pos.getY() + 0.05, pos.getZ() + 0.5, 0.0F, 0.0F);
- level.addFreshEntity(golem);
+ // Paper start
+ if (!level.addFreshEntity(golem, (golem.getType() == EntityType.SNOW_GOLEM) ? org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BUILD_SNOWMAN : org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BUILD_IRONGOLEM)) {
+ return;
+ }
+ clearPatternBlocks(level, patternMatch); // CraftBukkit - from above
+ // CraftBukkit end
+ // Paper end
+ clearPatternBlocks(level, patternMatch); // Paper - from above
for (ServerPlayer serverPlayer : level.getEntitiesOfClass(ServerPlayer.class, golem.getBoundingBox().inflate(5.0))) {
CriteriaTriggers.SUMMONED_ENTITY.trigger(serverPlayer, golem);
@@ -1,21 +1,14 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/CaveVinesBlock.java b/net/minecraft/world/level/block/CaveVinesBlock.java
index 0690acb7a39c5b525182ea4ccb4951323697cf74..ff445bb33a97e3fd2ef0f8759e59ef762d0a578f 100644
--- a/net/minecraft/world/level/block/CaveVinesBlock.java
+++ b/net/minecraft/world/level/block/CaveVinesBlock.java
@@ -52,8 +52,15 @@ public class CaveVinesBlock extends GrowingPlantHeadBlock implements CaveVines {
@@ -52,8 +_,15 @@
@Override
protected BlockState getGrowIntoState(BlockState state, RandomSource random) {
- return super.getGrowIntoState(state, random).setValue(BERRIES, Boolean.valueOf(random.nextFloat() < 0.11F));
+ // Paper start - Fix Spigot growth modifiers
- return super.getGrowIntoState(state, random).setValue(BERRIES, random.nextFloat() < 0.11F);
- }
+ // Paper start - Fix Spigot growth modifiers
+ return this.getGrowIntoState(state, random, null);
}
+ }
+ @Override
+ protected BlockState getGrowIntoState(BlockState state, RandomSource random, @javax.annotation.Nullable Level level) {
+ final boolean value = random.nextFloat() < (level != null ? (0.11F * (level.spigotConfig.glowBerryModifier / 100.0F)) : 0.11F);
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/CocoaBlock.java b/net/minecraft/world/level/block/CocoaBlock.java
index 4713d74cae208b08458f88db4ff9fbcef1c03d40..6adf26a35a91a539c9cfc0804839f4b45e4ba1ba 100644
--- a/net/minecraft/world/level/block/CocoaBlock.java
+++ b/net/minecraft/world/level/block/CocoaBlock.java
@@ -64,10 +64,10 @@ public class CocoaBlock extends HorizontalDirectionalBlock implements Bonemealab
@@ -50,10 +_,10 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
@@ -16,16 +8,16 @@ index 4713d74cae208b08458f88db4ff9fbcef1c03d40..6adf26a35a91a539c9cfc0804839f4b4
+ if (level.random.nextFloat() < (level.spigotConfig.cocoaModifier / (100.0f * 5))) { // Spigot - SPIGOT-7159: Better modifier resolution
int ageValue = state.getValue(AGE);
if (ageValue < 2) {
- level.setBlock(pos, state.setValue(AGE, Integer.valueOf(ageValue + 1)), 2);
- level.setBlock(pos, state.setValue(AGE, ageValue + 1), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(CocoaBlock.AGE, ageValue + 1), 2); // CraftBukkit
}
}
}
@@ -141,7 +141,7 @@ public class CocoaBlock extends HorizontalDirectionalBlock implements Bonemealab
@@ -116,7 +_,7 @@
@Override
public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
- level.setBlock(pos, state.setValue(AGE, Integer.valueOf(state.getValue(AGE) + 1)), 2);
- level.setBlock(pos, state.setValue(AGE, state.getValue(AGE) + 1), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(CocoaBlock.AGE, state.getValue(CocoaBlock.AGE) + 1), 2); // CraftBukkit
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/ComparatorBlock.java b/net/minecraft/world/level/block/ComparatorBlock.java
index d5f58061833cf3146e7b208b8ee99fea3202ba56..50dcb54dbd20553ed990904c7b99741fff6aa66d 100644
--- a/net/minecraft/world/level/block/ComparatorBlock.java
+++ b/net/minecraft/world/level/block/ComparatorBlock.java
@@ -170,8 +170,18 @@ public class ComparatorBlock extends DiodeBlock implements EntityBlock {
@@ -168,8 +_,18 @@
boolean shouldTurnOn = this.shouldTurnOn(level, pos, state);
boolean poweredValue = state.getValue(POWERED);
if (poweredValue && !shouldTurnOn) {
@@ -17,13 +9,13 @@ index d5f58061833cf3146e7b208b8ee99fea3202ba56..50dcb54dbd20553ed990904c7b99741f
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(false)), 2);
level.setBlock(pos, state.setValue(POWERED, false), 2);
} else if (!poweredValue && shouldTurnOn) {
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, 0, 15).getNewCurrent() != 15) {
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(true)), 2);
level.setBlock(pos, state.setValue(POWERED, true), 2);
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/ComposterBlock.java b/net/minecraft/world/level/block/ComposterBlock.java
index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de2c0450a8 100644
--- a/net/minecraft/world/level/block/ComposterBlock.java
+++ b/net/minecraft/world/level/block/ComposterBlock.java
@@ -243,6 +243,11 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
@@ -252,6 +_,11 @@
if (levelValue < 8 && COMPOSTABLES.containsKey(stack.getItem())) {
if (levelValue < 7 && !level.isClientSide) {
BlockState blockState = addItem(player, state, level, pos, stack);
@@ -20,7 +12,7 @@ index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de
level.levelEvent(1500, pos, state != blockState ? 1 : 0);
player.awardStat(Stats.ITEM_USED.get(stack.getItem()));
stack.consume(1, player);
@@ -268,7 +273,19 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
@@ -277,7 +_,19 @@
public static BlockState insertItem(Entity entity, BlockState state, ServerLevel level, ItemStack stack, BlockPos pos) {
int levelValue = state.getValue(LEVEL);
if (levelValue < 7 && COMPOSTABLES.containsKey(stack.getItem())) {
@@ -41,7 +33,7 @@ index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de
stack.shrink(1);
return blockState;
} else {
@@ -277,6 +294,14 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
@@ -286,6 +_,14 @@
}
public static BlockState extractProduce(Entity entity, BlockState state, Level level, BlockPos pos) {
@@ -56,7 +48,7 @@ index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de
if (!level.isClientSide) {
Vec3 vec3 = Vec3.atLowerCornerWithOffset(pos, 0.5, 1.01, 0.5).offsetRandom(level.random, 0.7F);
ItemEntity itemEntity = new ItemEntity(level, vec3.x(), vec3.y(), vec3.z(), new ItemStack(Items.BONE_MEAL));
@@ -296,14 +321,39 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
@@ -305,14 +_,39 @@
return blockState;
}
@@ -88,7 +80,7 @@ index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de
return state;
} else {
int i = levelValue + 1;
BlockState blockState = state.setValue(LEVEL, Integer.valueOf(i));
BlockState blockState = state.setValue(LEVEL, i);
+ // Paper start - move the EntityChangeBlockEvent here to avoid conflict later for the compost events
+ if (entity != null && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, blockState)) {
+ return null;
@@ -97,7 +89,7 @@ index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de
level.setBlock(pos, blockState, 3);
level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(entity, blockState));
if (i == 7) {
@@ -348,13 +398,14 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
@@ -357,13 +_,14 @@
if (levelValue == 8) {
return new ComposterBlock.OutputContainer(state, level, pos, new ItemStack(Items.BONE_MEAL));
} else {
@@ -114,7 +106,7 @@ index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de
}
@Override
@@ -381,6 +432,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
@@ -390,6 +_,7 @@
public InputContainer(BlockState state, LevelAccessor level, BlockPos pos) {
super(1);
@@ -122,7 +114,7 @@ index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de
this.state = state;
this.level = level;
this.pos = pos;
@@ -412,6 +464,11 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
@@ -421,6 +_,11 @@
if (!item.isEmpty()) {
this.changed = true;
BlockState blockState = ComposterBlock.addItem(null, this.state, this.level, this.pos, item);
@@ -134,7 +126,7 @@ index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de
this.level.levelEvent(1500, this.pos, blockState != this.state ? 1 : 0);
this.removeItemNoUpdate(0);
}
@@ -426,6 +483,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
@@ -435,6 +_,7 @@
public OutputContainer(BlockState state, LevelAccessor level, BlockPos pos, ItemStack stack) {
super(stack);
@@ -142,7 +134,7 @@ index 1abfa95e35fcdd33fae8aa2776096884c2d25ab2..86f9c284f434a16888beb60b89f460de
this.state = state;
this.level = level;
this.pos = pos;
@@ -453,8 +511,15 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder {
@@ -462,8 +_,15 @@
@Override
public void setChanged() {
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/CoralFanBlock.java b/net/minecraft/world/level/block/CoralFanBlock.java
index 85edb4d40498c973ae7574320bbc8e9a71196355..9530fa0793ed0904b17f8972d09f98a97b2cecb0 100644
--- a/net/minecraft/world/level/block/CoralFanBlock.java
+++ b/net/minecraft/world/level/block/CoralFanBlock.java
@@ -38,6 +38,11 @@ public class CoralFanBlock extends BaseCoralFanBlock {
@@ -38,6 +_,11 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (!scanForWater(state, level, pos)) {
@@ -17,6 +9,6 @@ index 85edb4d40498c973ae7574320bbc8e9a71196355..9530fa0793ed0904b17f8972d09f98a9
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, this.deadBlock.defaultBlockState().setValue(WATERLOGGED, Boolean.valueOf(false)), 2);
level.setBlock(pos, this.deadBlock.defaultBlockState().setValue(WATERLOGGED, false), 2);
}
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/CoralPlantBlock.java b/net/minecraft/world/level/block/CoralPlantBlock.java
index 7f21a2e3d90722f43c3c98bb2fa9079d8bb9f5e6..d1a4dd8ef1ad9d7fb8ae434fc096a9d5b9c5b69d 100644
--- a/net/minecraft/world/level/block/CoralPlantBlock.java
+++ b/net/minecraft/world/level/block/CoralPlantBlock.java
@@ -43,6 +43,11 @@ public class CoralPlantBlock extends BaseCoralPlantTypeBlock {
@@ -42,6 +_,11 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (!scanForWater(state, level, pos)) {
@@ -17,6 +9,6 @@ index 7f21a2e3d90722f43c3c98bb2fa9079d8bb9f5e6..d1a4dd8ef1ad9d7fb8ae434fc096a9d5
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, this.deadBlock.defaultBlockState().setValue(WATERLOGGED, Boolean.valueOf(false)), 2);
level.setBlock(pos, this.deadBlock.defaultBlockState().setValue(WATERLOGGED, false), 2);
}
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/CoralWallFanBlock.java b/net/minecraft/world/level/block/CoralWallFanBlock.java
index d4ebc82c73d0cbbd1eb0162e5b3804fa9deac2e9..5f05dcda8c6eb869d3d6f80f60d4addd5f3bb988 100644
--- a/net/minecraft/world/level/block/CoralWallFanBlock.java
+++ b/net/minecraft/world/level/block/CoralWallFanBlock.java
@@ -38,6 +38,11 @@ public class CoralWallFanBlock extends BaseCoralWallFanBlock {
@@ -38,6 +_,11 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (!scanForWater(state, level, pos)) {
@@ -17,6 +9,6 @@ index d4ebc82c73d0cbbd1eb0162e5b3804fa9deac2e9..5f05dcda8c6eb869d3d6f80f60d4addd
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, this.deadBlock.defaultBlockState().setValue(WATERLOGGED, Boolean.valueOf(false)).setValue(FACING, state.getValue(FACING)), 2);
level.setBlock(pos, this.deadBlock.defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, state.getValue(FACING)), 2);
}
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/CropBlock.java b/net/minecraft/world/level/block/CropBlock.java
index cc47de89cf26a75254f68801b293b5ab96463aa8..bc0969f40814094e42a860a72314fccd1a66fabe 100644
--- a/net/minecraft/world/level/block/CropBlock.java
+++ b/net/minecraft/world/level/block/CropBlock.java
@@ -88,8 +88,25 @@ public class CropBlock extends BushBlock implements BonemealableBlock {
@@ -80,8 +_,25 @@
int age = this.getAge(state);
if (age < this.getMaxAge()) {
float growthSpeed = getGrowthSpeed(this, level, pos);
@@ -36,19 +28,19 @@ index cc47de89cf26a75254f68801b293b5ab96463aa8..bc0969f40814094e42a860a72314fccd
}
}
}
@@ -102,7 +119,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock {
i = maxAge;
}
@@ -89,7 +_,7 @@
- level.setBlock(pos, this.getStateForAge(i), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, this.getStateForAge(i), 2); // CraftBukkit
public void growCrops(Level level, BlockPos pos, BlockState state) {
int min = Math.min(this.getMaxAge(), this.getAge(state) + this.getBonemealAgeIncrease(level));
- level.setBlock(pos, this.getStateForAge(min), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, this.getStateForAge(min), 2); // CraftBukkit
}
protected int getBonemealAgeIncrease(Level level) {
@@ -164,7 +181,8 @@ public class CropBlock extends BushBlock implements BonemealableBlock {
@@ -151,7 +_,8 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
- if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
+ if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit
@@ -0,0 +1,10 @@
--- a/net/minecraft/world/level/block/DaylightDetectorBlock.java
+++ b/net/minecraft/world/level/block/DaylightDetectorBlock.java
@@ -70,6 +_,7 @@
i = Mth.clamp(i, 0, 15);
if (state.getValue(POWER) != i) {
+ i = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, state.getValue(DaylightDetectorBlock.POWER), i).getNewCurrent(); // CraftBukkit - Call BlockRedstoneEvent
level.setBlock(pos, state.setValue(POWER, i), 3);
}
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/DecoratedPotBlock.java b/net/minecraft/world/level/block/DecoratedPotBlock.java
index d49bea78ae3a0cac84a9260a3883d5f5b130ece2..b689ac913e7684c625eabef1d8ce440ae9a5822e 100644
--- a/net/minecraft/world/level/block/DecoratedPotBlock.java
+++ b/net/minecraft/world/level/block/DecoratedPotBlock.java
@@ -237,6 +237,11 @@ public class DecoratedPotBlock extends BaseEntityBlock implements SimpleWaterlog
@@ -210,6 +_,11 @@
protected void onProjectileHit(Level level, BlockState state, BlockHitResult hit, Projectile projectile) {
BlockPos blockPos = hit.getBlockPos();
if (level instanceof ServerLevel serverLevel && projectile.mayInteract(serverLevel, blockPos) && projectile.mayBreak(serverLevel)) {
@@ -17,6 +9,6 @@ index d49bea78ae3a0cac84a9260a3883d5f5b130ece2..b689ac913e7684c625eabef1d8ce440a
+ return;
+ }
+ // CraftBukkit end
level.setBlock(blockPos, state.setValue(CRACKED, Boolean.valueOf(true)), 4);
level.setBlock(blockPos, state.setValue(CRACKED, true), 260);
level.destroyBlock(blockPos, true, projectile);
}
@@ -1,22 +1,14 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/DetectorRailBlock.java b/net/minecraft/world/level/block/DetectorRailBlock.java
index a6c2025a56c7b3f529b68d9a39bda43f0aed6858..8f0217f25a2faf23833be10c85c5febc896ae292 100644
--- a/net/minecraft/world/level/block/DetectorRailBlock.java
+++ b/net/minecraft/world/level/block/DetectorRailBlock.java
@@ -54,6 +54,7 @@ public class DetectorRailBlock extends BaseRailBlock {
@@ -49,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!level.isClientSide) {
if (!state.getValue(POWERED)) {
this.checkPressed(level, pos, state);
@@ -84,6 +85,7 @@ public class DetectorRailBlock extends BaseRailBlock {
@@ -79,6 +_,7 @@
private void checkPressed(Level level, BlockPos pos, BlockState state) {
if (this.canSurvive(state, level, pos)) {
@@ -24,7 +16,7 @@ index a6c2025a56c7b3f529b68d9a39bda43f0aed6858..8f0217f25a2faf23833be10c85c5febc
boolean poweredValue = state.getValue(POWERED);
boolean flag = false;
List<AbstractMinecart> interactingMinecartOfType = this.getInteractingMinecartOfType(level, pos, AbstractMinecart.class, entity -> true);
@@ -91,6 +93,16 @@ public class DetectorRailBlock extends BaseRailBlock {
@@ -86,6 +_,16 @@
flag = true;
}
@@ -39,5 +31,5 @@ index a6c2025a56c7b3f529b68d9a39bda43f0aed6858..8f0217f25a2faf23833be10c85c5febc
+ }
+ // CraftBukkit end
if (flag && !poweredValue) {
BlockState blockState = state.setValue(POWERED, Boolean.valueOf(true));
BlockState blockState = state.setValue(POWERED, true);
level.setBlock(pos, blockState, 3);
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/DiodeBlock.java b/net/minecraft/world/level/block/DiodeBlock.java
index 81fae43e1b98b57b898976b4b91bdcb58e49f4c7..ab56acaf54af8dc9e9410437866e61d6ca60af92 100644
--- a/net/minecraft/world/level/block/DiodeBlock.java
+++ b/net/minecraft/world/level/block/DiodeBlock.java
@@ -56,8 +56,18 @@ public abstract class DiodeBlock extends HorizontalDirectionalBlock {
@@ -56,8 +_,18 @@
boolean poweredValue = state.getValue(POWERED);
boolean shouldTurnOn = this.shouldTurnOn(level, pos, state);
if (poweredValue && !shouldTurnOn) {
@@ -17,13 +9,13 @@ index 81fae43e1b98b57b898976b4b91bdcb58e49f4c7..ab56acaf54af8dc9e9410437866e61d6
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(false)), 2);
level.setBlock(pos, state.setValue(POWERED, false), 2);
} else if (!poweredValue) {
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, 0, 15).getNewCurrent() != 15) {
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(true)), 2);
level.setBlock(pos, state.setValue(POWERED, true), 2);
if (!shouldTurnOn) {
level.scheduleTick(pos, this, this.getDelay(state), TickPriority.VERY_HIGH);
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java
index dcdecb244504f47f278fa86a6d59427dd0c67cb3..84a1bd5e40e635962d795506861447851e443eee 100644
--- a/net/minecraft/world/level/block/EndGatewayBlock.java
+++ b/net/minecraft/world/level/block/EndGatewayBlock.java
@@ -89,10 +89,15 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal {
@@ -90,10 +_,15 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (entity.canUsePortal(false)
&& !level.isClientSide
@@ -24,7 +16,7 @@ index dcdecb244504f47f278fa86a6d59427dd0c67cb3..84a1bd5e40e635962d79550686144785
entity.setAsInsidePortal(this, pos);
TheEndGatewayBlockEntity.triggerCooldown(level, pos, state, theEndGatewayBlockEntity);
}
@@ -107,9 +112,9 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal {
@@ -108,9 +_,9 @@
return null;
} else {
return entity instanceof ThrownEnderpearl
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/EndPortalBlock.java b/net/minecraft/world/level/block/EndPortalBlock.java
index 8e86b2da91daf19d234f60e3896a06fe649b28e4..c11366dd69e1c51bdab45c625b07c15ce2e42cb6 100644
--- a/net/minecraft/world/level/block/EndPortalBlock.java
+++ b/net/minecraft/world/level/block/EndPortalBlock.java
@@ -56,8 +56,15 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal {
@@ -57,8 +_,15 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (entity.canUsePortal(false)) {
+ // CraftBukkit start - Entity in portal
@@ -24,7 +16,7 @@ index 8e86b2da91daf19d234f60e3896a06fe649b28e4..c11366dd69e1c51bdab45c625b07c15c
serverPlayer.showEndCredits();
} else {
entity.setAsInsidePortal(this, pos);
@@ -67,7 +74,7 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal {
@@ -68,7 +_,7 @@
@Override
public TeleportTransition getPortalDestination(ServerLevel level, Entity entity, BlockPos pos) {
@@ -33,7 +25,7 @@ index 8e86b2da91daf19d234f60e3896a06fe649b28e4..c11366dd69e1c51bdab45c625b07c15c
ServerLevel level1 = level.getServer().getLevel(resourceKey);
if (level1 == null) {
return null;
@@ -78,7 +85,7 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal {
@@ -79,7 +_,7 @@
float f;
Set<Relative> set;
if (flag) {
@@ -42,7 +34,7 @@ index 8e86b2da91daf19d234f60e3896a06fe649b28e4..c11366dd69e1c51bdab45c625b07c15c
f = Direction.WEST.toYRot();
set = Relative.union(Relative.DELTA, Set.of(Relative.X_ROT));
if (entity instanceof ServerPlayer) {
@@ -88,15 +95,23 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal {
@@ -89,15 +_,23 @@
f = 0.0F;
set = Relative.union(Relative.DELTA, Relative.ROTATION);
if (entity instanceof ServerPlayer serverPlayer) {
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/EyeblossomBlock.java b/net/minecraft/world/level/block/EyeblossomBlock.java
index d3e6899e0932539d2d9a3afd37fd1d384c635b25..349ab10db5a2c3253ce2f8ec0f5f39e1dcc2f0a9 100644
--- a/net/minecraft/world/level/block/EyeblossomBlock.java
+++ b/net/minecraft/world/level/block/EyeblossomBlock.java
@@ -99,6 +99,7 @@ public class EyeblossomBlock extends FlowerBlock {
@@ -100,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!level.isClientSide()
&& level.getDifficulty() != Difficulty.PEACEFUL
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/FarmBlock.java b/net/minecraft/world/level/block/FarmBlock.java
index ece750c7c1b5fa4113a4ec52d1687daa8f60d236..1fdede769b67cb5d2f9159c779f19e3639bb6ff5 100644
--- a/net/minecraft/world/level/block/FarmBlock.java
+++ b/net/minecraft/world/level/block/FarmBlock.java
@@ -95,31 +95,59 @@ public class FarmBlock extends Block {
@@ -95,31 +_,59 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
int moistureValue = state.getValue(MOISTURE);
@@ -16,22 +8,22 @@ index ece750c7c1b5fa4113a4ec52d1687daa8f60d236..1fdede769b67cb5d2f9159c779f19e36
+ if (moistureValue == 0 && level.paperConfig().tickRates.dryFarmland != 1 && (level.paperConfig().tickRates.dryFarmland < 1 || (net.minecraft.server.MinecraftServer.currentTick + pos.hashCode()) % level.paperConfig().tickRates.dryFarmland != 0)) { return; } // Paper - Configurable random tick rates for blocks
if (!isNearWater(level, pos) && !level.isRainingAt(pos.above())) {
if (moistureValue > 0) {
- level.setBlock(pos, state.setValue(MOISTURE, Integer.valueOf(moistureValue - 1)), 2);
- level.setBlock(pos, state.setValue(MOISTURE, moistureValue - 1), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleMoistureChangeEvent(level, pos, state.setValue(FarmBlock.MOISTURE, moistureValue - 1), 2); // CraftBukkit
} else if (!shouldMaintainFarmland(level, pos)) {
turnToDirt(null, state, level, pos);
}
} else if (moistureValue < 7) {
- level.setBlock(pos, state.setValue(MOISTURE, Integer.valueOf(7)), 2);
- level.setBlock(pos, state.setValue(MOISTURE, 7), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleMoistureChangeEvent(level, pos, state.setValue(FarmBlock.MOISTURE, 7), 2); // CraftBukkit
}
}
@Override
public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, double fallDistance) {
+ super.fallOn(level, state, pos, entity, fallDistance); // CraftBukkit - moved here as game rules / events shouldn't affect fall damage.
if (level instanceof ServerLevel serverLevel
&& level.random.nextFloat() < fallDistance - 0.5F
&& level.random.nextFloat() < fallDistance - 0.5
&& entity instanceof LivingEntity
&& (entity instanceof Player || serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))
&& entity.getBbWidth() * entity.getBbWidth() * entity.getBbHeight() > 0.512F) {
@@ -71,7 +63,7 @@ index ece750c7c1b5fa4113a4ec52d1687daa8f60d236..1fdede769b67cb5d2f9159c779f19e36
BlockState blockState = pushEntitiesUp(state, Blocks.DIRT.defaultBlockState(), level, pos);
level.setBlockAndUpdate(pos, blockState);
level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(entity, blockState));
@@ -130,13 +158,27 @@ public class FarmBlock extends Block {
@@ -130,13 +_,27 @@
}
private static boolean isNearWater(LevelReader level, BlockPos pos) {
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/FireBlock.java b/net/minecraft/world/level/block/FireBlock.java
index 495345fc21545d5fefbe56f0a1355bb78f99d7d3..7340c664fdcf991a2549c8f07f6ab093bbe6e4e8 100644
--- a/net/minecraft/world/level/block/FireBlock.java
+++ b/net/minecraft/world/level/block/FireBlock.java
@@ -122,7 +122,25 @@ public class FireBlock extends BaseFireBlock {
@@ -101,7 +_,25 @@
BlockState neighborState,
RandomSource random
) {
@@ -35,74 +27,75 @@ index 495345fc21545d5fefbe56f0a1355bb78f99d7d3..7340c664fdcf991a2549c8f07f6ab093
}
@Override
@@ -162,10 +180,10 @@ public class FireBlock extends BaseFireBlock {
@@ -141,11 +_,11 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
- level.scheduleTick(pos, this, getFireTickDelay(level.random));
+ level.scheduleTick(pos, this, getFireTickDelay(level)); // Paper - Add fire-tick-delay option
if (level.getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) {
if (!state.canSurvive(level, pos)) {
- level.removeBlock(pos, false);
+ this.fireExtinguished(level, pos); // CraftBukkit - invalid place location
}
BlockState blockState = level.getBlockState(pos.below());
@@ -184,26 +202,28 @@ public class FireBlock extends BaseFireBlock {
if (!this.isValidFireLocation(level, pos)) {
BlockPos blockPos = pos.below();
if (!level.getBlockState(blockPos).isFaceSturdy(level, blockPos, Direction.UP) || ageValue > 3) {
- level.removeBlock(pos, false);
+ this.fireExtinguished(level, pos); // CraftBukkit - extinguished by rain
}
return;
}
if (ageValue == 15 && random.nextInt(4) == 0 && !this.canBurn(level.getBlockState(pos.below()))) {
- level.removeBlock(pos, false);
+ this.fireExtinguished(level, pos); // CraftBukkit
return;
}
if (level.getGameRules().getBoolean(GameRules.RULE_ALLOWFIRETICKAWAYFROMPLAYERS) || level.anyPlayerCloseEnoughForSpawning(pos)) {
if (!state.canSurvive(level, pos)) {
- level.removeBlock(pos, false);
+ this.fireExtinguished(level, pos); // CraftBukkit - invalid place location
}
boolean isIncreasedFireBurnout = level.getBiome(pos).is(BiomeTags.INCREASED_FIRE_BURNOUT);
int i = isIncreasedFireBurnout ? -50 : 0;
- this.checkBurnOut(level, pos.east(), 300 + i, random, ageValue);
- this.checkBurnOut(level, pos.west(), 300 + i, random, ageValue);
- this.checkBurnOut(level, pos.below(), 250 + i, random, ageValue);
- this.checkBurnOut(level, pos.above(), 250 + i, random, ageValue);
- this.checkBurnOut(level, pos.north(), 300 + i, random, ageValue);
- this.checkBurnOut(level, pos.south(), 300 + i, random, ageValue);
+ // CraftBukkit start - add source blockposition to burn calls
+ this.checkBurnOut(level, pos.east(), 300 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.west(), 300 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.below(), 250 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.above(), 250 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.north(), 300 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.south(), 300 + i, random, ageValue, pos);
+ // CraftBukkit end
BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
BlockState blockState = level.getBlockState(pos.below());
@@ -164,26 +_,28 @@
if (!this.isValidFireLocation(level, pos)) {
BlockPos blockPos = pos.below();
if (!level.getBlockState(blockPos).isFaceSturdy(level, blockPos, Direction.UP) || ageValue > 3) {
- level.removeBlock(pos, false);
+ this.fireExtinguished(level, pos); // CraftBukkit - extinguished by rain
}
for (int i1 = -1; i1 <= 1; i1++) {
@@ -225,7 +245,15 @@ public class FireBlock extends BaseFireBlock {
return;
}
if (i5 > 0 && random.nextInt(i4) <= i5 && (!level.isRaining() || !this.isNearRain(level, mutableBlockPos))) {
int min1 = Math.min(15, ageValue + random.nextInt(5) / 4);
- level.setBlock(mutableBlockPos, this.getStateWithAge(level, mutableBlockPos, min1), 3);
+ // CraftBukkit start - Call to stop spread of fire
+ if (level.getBlockState(mutableBlockPos).getBlock() != Blocks.FIRE) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(level, mutableBlockPos, pos).isCancelled()) {
+ continue;
+ }
if (ageValue == 15 && random.nextInt(4) == 0 && !this.canBurn(level.getBlockState(pos.below()))) {
- level.removeBlock(pos, false);
+ this.fireExtinguished(level, pos); // CraftBukkit
return;
}
}
boolean isIncreasedFireBurnout = level.getBiome(pos).is(BiomeTags.INCREASED_FIRE_BURNOUT);
int i = isIncreasedFireBurnout ? -50 : 0;
- this.checkBurnOut(level, pos.east(), 300 + i, random, ageValue);
- this.checkBurnOut(level, pos.west(), 300 + i, random, ageValue);
- this.checkBurnOut(level, pos.below(), 250 + i, random, ageValue);
- this.checkBurnOut(level, pos.above(), 250 + i, random, ageValue);
- this.checkBurnOut(level, pos.north(), 300 + i, random, ageValue);
- this.checkBurnOut(level, pos.south(), 300 + i, random, ageValue);
+ // CraftBukkit start - add source blockposition to burn calls
+ this.checkBurnOut(level, pos.east(), 300 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.west(), 300 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.below(), 250 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.above(), 250 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.north(), 300 + i, random, ageValue, pos);
+ this.checkBurnOut(level, pos.south(), 300 + i, random, ageValue, pos);
+ // CraftBukkit end
BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
for (int i1 = -1; i1 <= 1; i1++) {
@@ -205,7 +_,15 @@
if (i5 > 0 && random.nextInt(i4) <= i5 && (!level.isRaining() || !this.isNearRain(level, mutableBlockPos))) {
int min1 = Math.min(15, ageValue + random.nextInt(5) / 4);
- level.setBlock(mutableBlockPos, this.getStateWithAge(level, mutableBlockPos, min1), 3);
+ // CraftBukkit start - Call to stop spread of fire
+ if (level.getBlockState(mutableBlockPos).getBlock() != Blocks.FIRE) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(level, mutableBlockPos, pos).isCancelled()) {
+ continue;
+ }
+
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, mutableBlockPos, this.getStateWithAge(level, mutableBlockPos, min1), 3); // CraftBukkit
+ }
+ // CraftBukkit end
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, mutableBlockPos, this.getStateWithAge(level, mutableBlockPos, min1), 3); // CraftBukkit
+ }
+ // CraftBukkit end
}
}
}
}
@@ -256,19 +284,42 @@ public class FireBlock extends BaseFireBlock {
@@ -237,19 +_,42 @@
: this.igniteOdds.getInt(state.getBlock());
}
@@ -144,10 +137,10 @@ index 495345fc21545d5fefbe56f0a1355bb78f99d7d3..7340c664fdcf991a2549c8f07f6ab093
+ }
+ level.removeBlock(pos, false);
+ // Paper end - TNTPrimeEvent
TntBlock.explode(level, pos);
TntBlock.prime(level, pos);
}
}
@@ -310,13 +361,14 @@ public class FireBlock extends BaseFireBlock {
@@ -291,13 +_,14 @@
}
@Override
@@ -1,22 +1,14 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/FrogspawnBlock.java b/net/minecraft/world/level/block/FrogspawnBlock.java
index ddd7d68afffdb80d60ef17d5668929834feecdce..f365ef8e9b9c0e1adb7bf393c5c802b6ab8b6c7b 100644
--- a/net/minecraft/world/level/block/FrogspawnBlock.java
+++ b/net/minecraft/world/level/block/FrogspawnBlock.java
@@ -89,6 +89,7 @@ public class FrogspawnBlock extends Block {
@@ -90,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (entity.getType().equals(EntityType.FALLING_BLOCK)) {
this.destroyBlock(level, pos);
}
@@ -101,6 +102,11 @@ public class FrogspawnBlock extends Block {
@@ -102,6 +_,11 @@
}
private void hatchFrogspawn(ServerLevel level, BlockPos pos, RandomSource random) {
@@ -28,9 +20,9 @@ index ddd7d68afffdb80d60ef17d5668929834feecdce..f365ef8e9b9c0e1adb7bf393c5c802b6
this.destroyBlock(level, pos);
level.playSound(null, pos, SoundEvents.FROGSPAWN_HATCH, SoundSource.BLOCKS, 1.0F, 1.0F);
this.spawnTadpoles(level, pos, random);
@@ -121,7 +127,7 @@ public class FrogspawnBlock extends Block {
@@ -122,7 +_,7 @@
int randomInt1 = random.nextInt(1, 361);
tadpole.moveTo(d, pos.getY() - 0.5, d1, randomInt1, 0.0F);
tadpole.snapTo(d, pos.getY() - 0.5, d1, randomInt1, 0.0F);
tadpole.setPersistenceRequired();
- level.addFreshEntity(tadpole);
+ level.addFreshEntity(tadpole, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); // Paper - use correct spawn reason
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/HoneyBlock.java b/net/minecraft/world/level/block/HoneyBlock.java
index b98a357242e317ccd1277184ce246efe6e0b40b9..bab3ac2c4be08ea7589752b8472c1e13bcaab76a 100644
--- a/net/minecraft/world/level/block/HoneyBlock.java
+++ b/net/minecraft/world/level/block/HoneyBlock.java
@@ -60,6 +60,7 @@ public class HoneyBlock extends HalfTransparentBlock {
@@ -61,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (this.isSlidingDown(pos, entity)) {
this.maybeDoSlideAchievement(entity, pos);
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/HopperBlock.java b/net/minecraft/world/level/block/HopperBlock.java
index b81008b77ce0a8c8139b73bd07aa4e507ed707d1..8ce44400279511f78a0773a23a2aafc3f887ade3 100644
--- a/net/minecraft/world/level/block/HopperBlock.java
+++ b/net/minecraft/world/level/block/HopperBlock.java
@@ -125,8 +125,7 @@ public class HopperBlock extends BaseEntityBlock {
@@ -106,8 +_,7 @@
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
@@ -18,10 +10,10 @@ index b81008b77ce0a8c8139b73bd07aa4e507ed707d1..8ce44400279511f78a0773a23a2aafc3
player.awardStat(Stats.INSPECT_HOPPER);
}
@@ -178,6 +177,7 @@ public class HopperBlock extends BaseEntityBlock {
@@ -158,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
BlockEntity blockEntity = level.getBlockEntity(pos);
if (blockEntity instanceof HopperBlockEntity) {
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/InfestedBlock.java b/net/minecraft/world/level/block/InfestedBlock.java
index 0ca23b7927ac0ae28a657199700c9cefa0f66853..d74ce0cb40ce659fd93cc9f1839a496118439062 100644
--- a/net/minecraft/world/level/block/InfestedBlock.java
+++ b/net/minecraft/world/level/block/InfestedBlock.java
@@ -52,7 +52,7 @@ public class InfestedBlock extends Block {
@@ -52,7 +_,7 @@
Silverfish silverfish = EntityType.SILVERFISH.create(level, EntitySpawnReason.TRIGGERED);
if (silverfish != null) {
silverfish.moveTo(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, 0.0F, 0.0F);
silverfish.snapTo(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, 0.0F, 0.0F);
- level.addFreshEntity(silverfish);
+ level.addFreshEntity(silverfish, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SILVERFISH_BLOCK); // CraftBukkit - add SpawnReason
silverfish.spawnAnim();
@@ -0,0 +1,10 @@
--- a/net/minecraft/world/level/block/LavaCauldronBlock.java
+++ b/net/minecraft/world/level/block/LavaCauldronBlock.java
@@ -33,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (this.isEntityInsideContent(state, pos, entity)) {
entity.lavaIgnite();
entity.lavaHurt();
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/LayeredCauldronBlock.java b/net/minecraft/world/level/block/LayeredCauldronBlock.java
index 4d7ffb8e15d75532f5c3c0c5bdd4704af396dad4..82142fa784642f45617911aaa7171675fdb5bba5 100644
--- a/net/minecraft/world/level/block/LayeredCauldronBlock.java
+++ b/net/minecraft/world/level/block/LayeredCauldronBlock.java
@@ -61,35 +61,68 @@ public class LayeredCauldronBlock extends AbstractCauldronBlock {
@@ -62,35 +_,67 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (level instanceof ServerLevel serverLevel && entity.isOnFire() && this.isEntityInsideContent(state, pos, entity)) {
- entity.clearFire();
@@ -41,20 +33,18 @@ index 4d7ffb8e15d75532f5c3c0c5bdd4704af396dad4..82142fa784642f45617911aaa7171675
}
public static void lowerFillLevel(BlockState state, Level level, BlockPos pos) {
- int i = state.getValue(LEVEL) - 1;
- BlockState blockState = i == 0 ? Blocks.CAULDRON.defaultBlockState() : state.setValue(LEVEL, Integer.valueOf(i));
+ // Paper start
+ LayeredCauldronBlock.lowerFillLevel(state, level, pos, null, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.UNKNOWN);
+ }
+ public static boolean lowerFillLevel(BlockState state, Level level, BlockPos pos, Entity entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason reason) {
+ // Paper end
int i = state.getValue(LEVEL) - 1;
BlockState blockState = i == 0 ? Blocks.CAULDRON.defaultBlockState() : state.setValue(LEVEL, i);
- level.setBlockAndUpdate(pos, blockState);
- level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(blockState));
+ // CraftBukkit start
+ LayeredCauldronBlock.lowerFillLevel(state, level, pos, null, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.UNKNOWN);
}
+ public static boolean lowerFillLevel(BlockState state, Level level, BlockPos pos, Entity entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason reason) {
+ int i = (Integer) state.getValue(LayeredCauldronBlock.LEVEL) - 1;
+ BlockState iblockdata1 = i == 0 ? Blocks.CAULDRON.defaultBlockState() : (BlockState) state.setValue(LayeredCauldronBlock.LEVEL, i);
+
+ return LayeredCauldronBlock.changeLevel(level, pos, iblockdata1, entity, reason);
+ }
+
- }
+ return LayeredCauldronBlock.changeLevel(level, pos, blockState, entity, reason); // Paper
+ }
+ // CraftBukkit start
+ // Paper start - Call CauldronLevelChangeEvent
+ public static boolean changeLevel(Level level, BlockPos pos, BlockState newBlock, @javax.annotation.Nullable Entity entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason reason) { // Paper - entity is nullable
@@ -63,7 +53,7 @@ index 4d7ffb8e15d75532f5c3c0c5bdd4704af396dad4..82142fa784642f45617911aaa7171675
+
+ public static boolean changeLevel(Level level, BlockPos pos, BlockState newBlock, @javax.annotation.Nullable Entity entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason reason, boolean sendGameEvent) { // Paper - entity is nullable
+ // Paper end - Call CauldronLevelChangeEvent
+ org.bukkit.craftbukkit.block.CraftBlockState newState = org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(level, pos);
+ org.bukkit.craftbukkit.block.CraftBlockState newState = org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(level, pos, 3);
+ newState.setData(newBlock);
+
+ org.bukkit.event.block.CauldronLevelChangeEvent event = new org.bukkit.event.block.CauldronLevelChangeEvent(
@@ -89,10 +79,10 @@ index 4d7ffb8e15d75532f5c3c0c5bdd4704af396dad4..82142fa784642f45617911aaa7171675
}
}
@@ -107,8 +140,11 @@ public class LayeredCauldronBlock extends AbstractCauldronBlock {
@@ -108,8 +_,11 @@
protected void receiveStalactiteDrip(BlockState state, Level level, BlockPos pos, Fluid fluid) {
if (!this.isFull(state)) {
BlockState blockState = state.setValue(LEVEL, Integer.valueOf(state.getValue(LEVEL) + 1));
BlockState blockState = state.setValue(LEVEL, state.getValue(LEVEL) + 1);
- level.setBlockAndUpdate(pos, blockState);
- level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(blockState));
+ // CraftBukkit start
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/LecternBlock.java b/net/minecraft/world/level/block/LecternBlock.java
index 02f28297d68887c5be192a69ecdd5642cee4e6a3..82fcae1f8b4149f13adf5118287718812518f8bf 100644
--- a/net/minecraft/world/level/block/LecternBlock.java
+++ b/net/minecraft/world/level/block/LecternBlock.java
@@ -169,7 +169,24 @@ public class LecternBlock extends BaseEntityBlock {
@@ -136,7 +_,24 @@
private static void placeBook(@Nullable LivingEntity entity, Level level, BlockPos pos, BlockState state, ItemStack stack) {
if (level.getBlockEntity(pos) instanceof LecternBlockEntity lecternBlockEntity) {
@@ -34,7 +26,7 @@ index 02f28297d68887c5be192a69ecdd5642cee4e6a3..82fcae1f8b4149f13adf511828771881
resetBookState(entity, level, pos, state, true);
level.playSound(null, pos, SoundEvents.BOOK_PUT, SoundSource.BLOCKS, 1.0F, 1.0F);
}
@@ -189,6 +206,16 @@ public class LecternBlock extends BaseEntityBlock {
@@ -156,6 +_,16 @@
}
private static void changePowered(Level level, BlockPos pos, BlockState state, boolean powered) {
@@ -48,22 +40,10 @@ index 02f28297d68887c5be192a69ecdd5642cee4e6a3..82fcae1f8b4149f13adf511828771881
+ }
+ }
+ // Paper end - Call BlockRedstoneEvent properly
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(powered)), 3);
level.setBlock(pos, state.setValue(POWERED, powered), 3);
updateBelow(level, pos, state);
}
@@ -218,9 +245,10 @@ public class LecternBlock extends BaseEntityBlock {
}
private void popBook(BlockState state, Level level, BlockPos pos) {
- if (level.getBlockEntity(pos) instanceof LecternBlockEntity lecternBlockEntity) {
+ if (level.getBlockEntity(pos, false) instanceof LecternBlockEntity lecternBlockEntity) { // CraftBukkit - don't validate, type may be changed already
Direction direction = state.getValue(FACING);
ItemStack itemStack = lecternBlockEntity.getBook().copy();
+ if (itemStack.isEmpty()) return; // CraftBukkit - SPIGOT-5500
float f = 0.25F * direction.getStepX();
float f1 = 0.25F * direction.getStepZ();
ItemEntity itemEntity = new ItemEntity(level, pos.getX() + 0.5 + f, pos.getY() + 1, pos.getZ() + 0.5 + f1, itemStack);
@@ -296,8 +324,7 @@ public class LecternBlock extends BaseEntityBlock {
@@ -243,8 +_,7 @@
private void openScreen(Level level, BlockPos pos, Player player) {
BlockEntity blockEntity = level.getBlockEntity(pos);
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/LightningRodBlock.java b/net/minecraft/world/level/block/LightningRodBlock.java
index e24abb0ee69cf99003401cbbbd119c96a6babf52..534de49aec290766d6bc2523bb3975df775b5881 100644
--- a/net/minecraft/world/level/block/LightningRodBlock.java
+++ b/net/minecraft/world/level/block/LightningRodBlock.java
@@ -84,6 +84,18 @@ public class LightningRodBlock extends RodBlock implements SimpleWaterloggedBloc
@@ -82,6 +_,18 @@
}
public void onLightningStrike(BlockState state, Level level, BlockPos pos) {
@@ -24,6 +16,6 @@ index e24abb0ee69cf99003401cbbbd119c96a6babf52..534de49aec290766d6bc2523bb3975df
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(true)), 3);
level.setBlock(pos, state.setValue(POWERED, true), 3);
this.updateNeighbours(state, level, pos);
level.scheduleTick(pos, this, 8);
@@ -1,23 +1,15 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java
index c4b5dad40af344fd711d30597e7e46d8f61a1692..e2eb693b0130513115392cb0cb5a829ede5be8c5 100644
--- a/net/minecraft/world/level/block/NetherPortalBlock.java
+++ b/net/minecraft/world/level/block/NetherPortalBlock.java
@@ -70,7 +70,7 @@ public class NetherPortalBlock extends Block implements Portal {
@@ -70,7 +_,7 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
- if (level.dimensionType().natural()
+ if (level.spigotConfig.enableZombiePigmenPortalSpawns && level.dimensionType().natural() // Spigot
&& level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)
&& random.nextInt(2000) < level.getDifficulty().getId()) {
while (level.getBlockState(pos).is(this)) {
@@ -78,9 +78,13 @@ public class NetherPortalBlock extends Block implements Portal {
&& random.nextInt(2000) < level.getDifficulty().getId()
&& level.anyPlayerCloseEnoughForSpawning(pos)) {
@@ -79,9 +_,13 @@
}
if (level.getBlockState(pos).isValidSpawn(level, pos, EntityType.ZOMBIFIED_PIGLIN)) {
@@ -32,10 +24,10 @@ index c4b5dad40af344fd711d30597e7e46d8f61a1692..e2eb693b0130513115392cb0cb5a829e
Entity vehicle = entity.getVehicle();
if (vehicle != null) {
vehicle.setPortalCooldown();
@@ -111,7 +115,13 @@ public class NetherPortalBlock extends Block implements Portal {
@@ -112,7 +_,13 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (entity.canUsePortal(false)) {
+ // CraftBukkit start - Entity in portal
@@ -46,7 +38,7 @@ index c4b5dad40af344fd711d30597e7e46d8f61a1692..e2eb693b0130513115392cb0cb5a829e
entity.setAsInsidePortal(this, pos);
}
}
@@ -134,22 +144,46 @@ public class NetherPortalBlock extends Block implements Portal {
@@ -135,22 +_,46 @@
@Nullable
@Override
public TeleportTransition getPortalDestination(ServerLevel level, Entity entity, BlockPos pos) {
@@ -98,7 +90,7 @@ index c4b5dad40af344fd711d30597e7e46d8f61a1692..e2eb693b0130513115392cb0cb5a829e
BlockUtil.FoundRectangle largestRectangleAround;
TeleportTransition.PostTeleportTransition postTeleportTransition;
if (optional.isPresent()) {
@@ -164,17 +198,22 @@ public class NetherPortalBlock extends Block implements Portal {
@@ -165,17 +_,22 @@
blockPos1 -> level.getBlockState(blockPos1) == blockState
);
postTeleportTransition = TeleportTransition.PLAY_PORTAL_SOUND.then(entity1 -> entity1.placePortalTicket(blockPos));
@@ -124,7 +116,7 @@ index c4b5dad40af344fd711d30597e7e46d8f61a1692..e2eb693b0130513115392cb0cb5a829e
return getDimensionTransitionFromExit(entity, pos, largestRectangleAround, level, postTeleportTransition);
}
@@ -220,7 +259,7 @@ public class NetherPortalBlock extends Block implements Portal {
@@ -221,7 +_,7 @@
boolean flag = axis1 == Direction.Axis.X;
Vec3 vec3 = new Vec3(blockPos.getX() + (flag ? d2 : d4), blockPos.getY() + d3, blockPos.getZ() + (flag ? d4 : d2));
Vec3 vec31 = PortalShape.findCollisionFreePosition(vec3, level, entity, dimensions);
@@ -1,20 +1,12 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/NetherWartBlock.java b/net/minecraft/world/level/block/NetherWartBlock.java
index 2bd262dab154669804afba875138847b4accd296..52891ddc14ad0e6f46a2f13d044723de9960b42d 100644
--- a/net/minecraft/world/level/block/NetherWartBlock.java
+++ b/net/minecraft/world/level/block/NetherWartBlock.java
@@ -55,9 +55,9 @@ public class NetherWartBlock extends BushBlock {
@@ -50,9 +_,9 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
int ageValue = state.getValue(AGE);
- if (ageValue < 3 && random.nextInt(10) == 0) {
+ if (ageValue < 3 && random.nextFloat() < (level.spigotConfig.wartModifier / (100.0f * 10))) { // Spigot - SPIGOT-7159: Better modifier resolution
state = state.setValue(AGE, Integer.valueOf(ageValue + 1));
state = state.setValue(AGE, ageValue + 1);
- level.setBlock(pos, state, 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state, 2); // CraftBukkit
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/ObserverBlock.java b/net/minecraft/world/level/block/ObserverBlock.java
index 1a9ef0c241dcfc49b885cd1f31b985aab256386e..9ca4ae8cdf9d88b8b6a6ed5d4c0b306bd0539ffe 100644
--- a/net/minecraft/world/level/block/ObserverBlock.java
+++ b/net/minecraft/world/level/block/ObserverBlock.java
@@ -50,8 +50,18 @@ public class ObserverBlock extends DirectionalBlock {
@@ -50,8 +_,18 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (state.getValue(POWERED)) {
@@ -17,13 +9,13 @@ index 1a9ef0c241dcfc49b885cd1f31b985aab256386e..9ca4ae8cdf9d88b8b6a6ed5d4c0b306b
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(false)), 2);
level.setBlock(pos, state.setValue(POWERED, false), 2);
} else {
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, 0, 15).getNewCurrent() != 15) {
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(true)), 2);
level.setBlock(pos, state.setValue(POWERED, true), 2);
level.scheduleTick(pos, this, 2);
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/PointedDripstoneBlock.java b/net/minecraft/world/level/block/PointedDripstoneBlock.java
index 1421c1cb693111a071c65cda8fdc64bfafd2818f..6a3548ee9f7d31e1fb02a47f4d8b9c1ed0bc2bc6 100644
--- a/net/minecraft/world/level/block/PointedDripstoneBlock.java
+++ b/net/minecraft/world/level/block/PointedDripstoneBlock.java
@@ -147,6 +147,11 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate
@@ -143,6 +_,11 @@
&& projectile.mayBreak(serverLevel)
&& projectile instanceof ThrownTrident
&& projectile.getDeltaMovement().length() > 0.6) {
@@ -20,16 +12,16 @@ index 1421c1cb693111a071c65cda8fdc64bfafd2818f..6a3548ee9f7d31e1fb02a47f4d8b9c1e
level.destroyBlock(blockPos, true);
}
}
@@ -155,7 +160,7 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate
@@ -151,7 +_,7 @@
@Override
public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, double fallDistance) {
if (state.getValue(TIP_DIRECTION) == Direction.UP && state.getValue(THICKNESS) == DripstoneThickness.TIP) {
- entity.causeFallDamage(fallDistance + 2.0F, 2.0F, level.damageSources().stalagmite());
+ entity.causeFallDamage(fallDistance + 2.0F, 2.0F, level.damageSources().stalagmite().eventBlockDamager(level, pos)); // CraftBukkit
- entity.causeFallDamage(fallDistance + 2.5, 2.0F, level.damageSources().stalagmite());
+ entity.causeFallDamage(fallDistance + 2.5, 2.0F, level.damageSources().stalagmite().eventBlockDamager(level, pos)); // CraftBukkit
} else {
super.fallOn(level, state, pos, entity, fallDistance);
}
@@ -213,10 +218,11 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate
@@ -209,10 +_,11 @@
if (blockPos != null) {
if (fluidAboveStalactite.get().sourceState.is(Blocks.MUD) && fluid == Fluids.WATER) {
BlockState blockState = Blocks.CLAY.defaultBlockState();
@@ -42,7 +34,7 @@ index 1421c1cb693111a071c65cda8fdc64bfafd2818f..6a3548ee9f7d31e1fb02a47f4d8b9c1e
} else {
BlockPos blockPos1 = findFillableCauldronBelowStalactiteTip(level, blockPos, fluid);
if (blockPos1 != null) {
@@ -380,17 +386,17 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate
@@ -364,17 +_,17 @@
if (isUnmergedTipWithDirection(blockState, direction.getOpposite())) {
createMergedTips(blockState, server, blockPos);
} else if (blockState.isAir() || blockState.is(Blocks.WATER)) {
@@ -57,13 +49,13 @@ index 1421c1cb693111a071c65cda8fdc64bfafd2818f..6a3548ee9f7d31e1fb02a47f4d8b9c1e
.defaultBlockState()
.setValue(TIP_DIRECTION, direction)
.setValue(THICKNESS, thickness)
.setValue(WATERLOGGED, Boolean.valueOf(level.getFluidState(pos).getType() == Fluids.WATER));
.setValue(WATERLOGGED, level.getFluidState(pos).getType() == Fluids.WATER);
- level.setBlock(pos, blockState, 3);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, pos, blockState, 3); // CraftBukkit
}
private static void createMergedTips(BlockState state, LevelAccessor level, BlockPos pos) {
@@ -404,8 +410,8 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate
@@ -388,8 +_,8 @@
blockPos = pos.below();
}
@@ -0,0 +1,25 @@
--- a/net/minecraft/world/level/block/PowderSnowBlock.java
+++ b/net/minecraft/world/level/block/PowderSnowBlock.java
@@ -60,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!(entity instanceof LivingEntity) || entity.getInBlockState().is(this)) {
entity.makeStuckInBlock(state, new Vec3(0.9F, 1.5, 0.9F));
if (level.isClientSide) {
@@ -85,8 +_,13 @@
entity1 -> {
if (level instanceof ServerLevel serverLevel
&& entity1.isOnFire()
- && (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity1 instanceof Player)
+ // CraftBukkit - move down
&& entity1.mayInteract(serverLevel, blockPos)) {
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity instanceof Player))) {
+ return;
+ }
+ // CraftBukkit end
level.destroyBlock(blockPos, false);
}
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/PoweredRailBlock.java b/net/minecraft/world/level/block/PoweredRailBlock.java
index fafeda63f87b5cf46447c135d3662f3f41de25a7..f33b53257a231dccf16740f1e78a3cdfa6e70726 100644
--- a/net/minecraft/world/level/block/PoweredRailBlock.java
+++ b/net/minecraft/world/level/block/PoweredRailBlock.java
@@ -133,6 +133,13 @@ public class PoweredRailBlock extends BaseRailBlock {
@@ -127,6 +_,13 @@
|| this.findPoweredRailSignal(level, pos, state, true, 0)
|| this.findPoweredRailSignal(level, pos, state, false, 0);
if (flag != poweredValue) {
@@ -19,6 +11,6 @@ index fafeda63f87b5cf46447c135d3662f3f41de25a7..f33b53257a231dccf16740f1e78a3cdf
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(flag)), 3);
level.setBlock(pos, state.setValue(POWERED, flag), 3);
level.updateNeighborsAt(pos.below(), this);
if (state.getValue(SHAPE).isSlope()) {
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/RedStoneOreBlock.java b/net/minecraft/world/level/block/RedStoneOreBlock.java
index 25a2fb415320ac13f033b2821420573651f253bf..b0eab490be31a528f59e1ee717611494376ffaa5 100644
--- a/net/minecraft/world/level/block/RedStoneOreBlock.java
+++ b/net/minecraft/world/level/block/RedStoneOreBlock.java
@@ -37,14 +37,27 @@ public class RedStoneOreBlock extends Block {
@@ -37,14 +_,27 @@
@Override
protected void attack(BlockState state, Level level, BlockPos pos, Player player) {
@@ -38,7 +30,7 @@ index 25a2fb415320ac13f033b2821420573651f253bf..b0eab490be31a528f59e1ee717611494
}
super.stepOn(level, pos, state, entity);
@@ -57,7 +70,7 @@ public class RedStoneOreBlock extends Block {
@@ -57,7 +_,7 @@
if (level.isClientSide) {
spawnParticles(level, pos);
} else {
@@ -47,7 +39,7 @@ index 25a2fb415320ac13f033b2821420573651f253bf..b0eab490be31a528f59e1ee717611494
}
return (InteractionResult)(stack.getItem() instanceof BlockItem && new BlockPlaceContext(player, hand, stack, hitResult).canPlace()
@@ -65,9 +78,14 @@ public class RedStoneOreBlock extends Block {
@@ -65,9 +_,14 @@
: InteractionResult.SUCCESS);
}
@@ -60,10 +52,10 @@ index 25a2fb415320ac13f033b2821420573651f253bf..b0eab490be31a528f59e1ee717611494
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(LIT, Boolean.valueOf(true)), 3);
level.setBlock(pos, state.setValue(LIT, true), 3);
}
}
@@ -80,6 +98,11 @@ public class RedStoneOreBlock extends Block {
@@ -80,6 +_,11 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (state.getValue(LIT)) {
@@ -72,10 +64,10 @@ index 25a2fb415320ac13f033b2821420573651f253bf..b0eab490be31a528f59e1ee717611494
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(LIT, Boolean.valueOf(false)), 3);
level.setBlock(pos, state.setValue(LIT, false), 3);
}
}
@@ -87,9 +110,17 @@ public class RedStoneOreBlock extends Block {
@@ -87,9 +_,17 @@
@Override
protected void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropExperience) {
super.spawnAfterBreak(state, level, pos, stack, dropExperience);
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/RedstoneTorchBlock.java b/net/minecraft/world/level/block/RedstoneTorchBlock.java
index 4098a9d60f60f4d06f2c39287fb330bc62e9f934..18420ec1f5776b018010f26e59aba00ae5bd0723 100644
--- a/net/minecraft/world/level/block/RedstoneTorchBlock.java
+++ b/net/minecraft/world/level/block/RedstoneTorchBlock.java
@@ -24,7 +24,7 @@ import net.minecraft.world.level.redstone.Orientation;
@@ -24,7 +_,7 @@
public class RedstoneTorchBlock extends BaseTorchBlock {
public static final MapCodec<RedstoneTorchBlock> CODEC = simpleCodec(RedstoneTorchBlock::new);
public static final BooleanProperty LIT = BlockStateProperties.LIT;
@@ -17,7 +9,7 @@ index 4098a9d60f60f4d06f2c39287fb330bc62e9f934..18420ec1f5776b018010f26e59aba00a
public static final int RECENT_TOGGLE_TIMER = 60;
public static final int MAX_RECENT_TOGGLES = 8;
public static final int RESTART_DELAY = 160;
@@ -72,14 +72,34 @@ public class RedstoneTorchBlock extends BaseTorchBlock {
@@ -72,14 +_,34 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
boolean hasNeighborSignal = this.hasNeighborSignal(level, pos, state);
@@ -33,8 +25,9 @@ index 4098a9d60f60f4d06f2c39287fb330bc62e9f934..18420ec1f5776b018010f26e59aba00a
+ redstoneUpdateInfos.poll();
+ }
}
-
+ // Paper end - Faster redstone torch rapid clock removal
+
+ // CraftBukkit start
+ org.bukkit.plugin.PluginManager manager = level.getCraftServer().getPluginManager();
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
@@ -53,10 +46,10 @@ index 4098a9d60f60f4d06f2c39287fb330bc62e9f934..18420ec1f5776b018010f26e59aba00a
+ }
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(LIT, Boolean.valueOf(false)), 3);
level.setBlock(pos, state.setValue(LIT, false), 3);
if (isToggledTooFrequently(level, pos, true)) {
level.levelEvent(1502, pos, 0);
@@ -87,6 +107,15 @@ public class RedstoneTorchBlock extends BaseTorchBlock {
@@ -87,6 +_,15 @@
}
}
} else if (!hasNeighborSignal && !isToggledTooFrequently(level, pos, false)) {
@@ -69,10 +62,10 @@ index 4098a9d60f60f4d06f2c39287fb330bc62e9f934..18420ec1f5776b018010f26e59aba00a
+ }
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(LIT, Boolean.valueOf(true)), 3);
level.setBlock(pos, state.setValue(LIT, true), 3);
}
}
@@ -124,7 +153,12 @@ public class RedstoneTorchBlock extends BaseTorchBlock {
@@ -124,7 +_,12 @@
}
private static boolean isToggledTooFrequently(Level level, BlockPos pos, boolean logToggle) {
@@ -1,19 +1,11 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/RespawnAnchorBlock.java b/net/minecraft/world/level/block/RespawnAnchorBlock.java
index 04b10126e244547551e454f61e4c2512492d18d1..f90d1b0a9e4b80a42f450ff49a46765da19ce562 100644
--- a/net/minecraft/world/level/block/RespawnAnchorBlock.java
+++ b/net/minecraft/world/level/block/RespawnAnchorBlock.java
@@ -102,11 +102,16 @@ public class RespawnAnchorBlock extends Block {
if (!level.isClientSide) {
ServerPlayer serverPlayer = (ServerPlayer)player;
if (serverPlayer.getRespawnDimension() != level.dimension() || !pos.equals(serverPlayer.getRespawnPosition())) {
- serverPlayer.setRespawnPosition(level.dimension(), pos, 0.0F, false, true);
+ if (serverPlayer.setRespawnPosition(level.dimension(), pos, 0.0F, false, true, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.RESPAWN_ANCHOR)) { // Paper - Add PlayerSetSpawnEvent
@@ -103,11 +_,16 @@
ServerPlayer.RespawnConfig respawnConfig = serverPlayer.getRespawnConfig();
ServerPlayer.RespawnConfig respawnConfig1 = new ServerPlayer.RespawnConfig(level.dimension(), pos, 0.0F, false);
if (respawnConfig == null || !respawnConfig.isSamePosition(respawnConfig1)) {
- serverPlayer.setRespawnPosition(respawnConfig1, true);
+ if (serverPlayer.setRespawnPosition(respawnConfig1, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.RESPAWN_ANCHOR)) { // Paper - Add PlayerSetSpawnEvent
level.playSound(
null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1.0F, 1.0F
);
@@ -26,7 +18,7 @@ index 04b10126e244547551e454f61e4c2512492d18d1..f90d1b0a9e4b80a42f450ff49a46765d
}
}
@@ -140,6 +145,7 @@ public class RespawnAnchorBlock extends Block {
@@ -141,6 +_,7 @@
}
private void explode(BlockState state, Level level, final BlockPos pos2) {
@@ -34,7 +26,7 @@ index 04b10126e244547551e454f61e4c2512492d18d1..f90d1b0a9e4b80a42f450ff49a46765d
level.removeBlock(pos2, false);
boolean flag = Direction.Plane.HORIZONTAL.stream().map(pos2::relative).anyMatch(pos -> isWaterThatWouldFlow(pos, level));
final boolean flag1 = flag || level.getFluidState(pos2.above()).is(FluidTags.WATER);
@@ -153,7 +159,7 @@ public class RespawnAnchorBlock extends Block {
@@ -154,7 +_,7 @@
};
Vec3 center = pos2.getCenter();
level.explode(
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/ScaffoldingBlock.java b/net/minecraft/world/level/block/ScaffoldingBlock.java
index 414b62b2b0b73fe8d5ceccc45f49c286341a4ab0..659579bf10be14a829112cefc657e8dcdab5e039 100644
--- a/net/minecraft/world/level/block/ScaffoldingBlock.java
+++ b/net/minecraft/world/level/block/ScaffoldingBlock.java
@@ -119,7 +119,7 @@ public class ScaffoldingBlock extends Block implements SimpleWaterloggedBlock {
@@ -117,7 +_,7 @@
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
int distance = getDistance(level, pos);
BlockState blockState = state.setValue(DISTANCE, Integer.valueOf(distance)).setValue(BOTTOM, Boolean.valueOf(this.isBottom(level, pos, distance)));
BlockState blockState = state.setValue(DISTANCE, distance).setValue(BOTTOM, this.isBottom(level, pos, distance));
- if (blockState.getValue(DISTANCE) == 7) {
+ if (blockState.getValue(DISTANCE) == 7 && !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(level, pos, blockState.getFluidState().createLegacyBlock()).isCancelled()) { // CraftBukkit - BlockFadeEvent // Paper - fix wrong block state
if (state.getValue(DISTANCE) == 7) {
@@ -1,31 +1,23 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/SculkSpreader.java b/net/minecraft/world/level/block/SculkSpreader.java
index 166d845ac1c3bbd655c189f22556380d7ba36397..54971f1d77a7850988bf5525ad4b383a3f0f2c14 100644
--- a/net/minecraft/world/level/block/SculkSpreader.java
+++ b/net/minecraft/world/level/block/SculkSpreader.java
@@ -50,6 +50,7 @@ public class SculkSpreader {
@@ -45,6 +_,7 @@
private final int chargeDecayRate;
private final int additionalDecayRate;
private List<SculkSpreader.ChargeCursor> cursors = new ArrayList<>();
private static final Logger LOGGER = LogUtils.getLogger();
+ public net.minecraft.world.level.Level level; // CraftBukkit
public SculkSpreader(
boolean isWorldGeneration, TagKey<Block> replaceableBlocks, int growthSpawnCoat, int noGrowthRadius, int chargeDecayRate, int additionalDecayRate
@@ -114,7 +115,7 @@ public class SculkSpreader {
int min = Math.min(list.size(), 32);
@@ -100,7 +_,7 @@
for (int i = 0; i < min; i++) {
- this.addCursor(list.get(i));
+ this.addCursor(list.get(i), false); // Paper - don't fire event for block entity loading
}
}
public void load(CompoundTag tag) {
this.cursors.clear();
- tag.read("cursors", SculkSpreader.ChargeCursor.CODEC.sizeLimitedListOf(32)).orElse(List.of()).forEach(this::addCursor);
+ tag.read("cursors", SculkSpreader.ChargeCursor.CODEC.sizeLimitedListOf(32)).orElse(List.of()).forEach((cursor) -> this.addCursor(cursor, false)); // Paper - don't fire event for block entity loading
}
@@ -130,13 +131,24 @@ public class SculkSpreader {
public void save(CompoundTag tag) {
@@ -110,13 +_,24 @@
public void addCursors(BlockPos pos, int charge) {
while (charge > 0) {
int min = Math.min(charge, 1000);
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/SnifferEggBlock.java b/net/minecraft/world/level/block/SnifferEggBlock.java
index bf1d9e3e28a03da3c9bbc6749bb6bebc28c12cf7..64d359568aad090739218ede70425901d9bdfc1e 100644
--- a/net/minecraft/world/level/block/SnifferEggBlock.java
+++ b/net/minecraft/world/level/block/SnifferEggBlock.java
@@ -61,12 +61,31 @@ public class SnifferEggBlock extends Block {
@@ -61,12 +_,32 @@
return this.getHatchLevel(state) == 2;
}
@@ -30,7 +22,7 @@ index bf1d9e3e28a03da3c9bbc6749bb6bebc28c12cf7..64d359568aad090739218ede70425901
+ }
+ // Paper end
level.playSound(null, pos, SoundEvents.SNIFFER_EGG_CRACK, SoundSource.BLOCKS, 0.7F, 0.9F + random.nextFloat() * 0.2F);
- level.setBlock(pos, state.setValue(HATCH, Integer.valueOf(this.getHatchLevel(state) + 1)), 2);
level.setBlock(pos, state.setValue(HATCH, this.getHatchLevel(state) + 1), 2);
} else {
+ // Paper start - Call BlockFadeEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(level, pos, state.getFluidState().createLegacyBlock()).isCancelled()) {
@@ -41,16 +33,16 @@ index bf1d9e3e28a03da3c9bbc6749bb6bebc28c12cf7..64d359568aad090739218ede70425901
level.playSound(null, pos, SoundEvents.SNIFFER_EGG_HATCH, SoundSource.BLOCKS, 0.7F, 0.9F + random.nextFloat() * 0.2F);
level.destroyBlock(pos, false);
Sniffer sniffer = EntityType.SNIFFER.create(level, EntitySpawnReason.BREEDING);
@@ -74,7 +93,7 @@ public class SnifferEggBlock extends Block {
@@ -74,7 +_,7 @@
Vec3 center = pos.getCenter();
sniffer.setBaby(true);
sniffer.moveTo(center.x(), center.y(), center.z(), Mth.wrapDegrees(level.random.nextFloat() * 360.0F), 0.0F);
sniffer.snapTo(center.x(), center.y(), center.z(), Mth.wrapDegrees(level.random.nextFloat() * 360.0F), 0.0F);
- level.addFreshEntity(sniffer);
+ level.addFreshEntity(sniffer, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); // Paper - use correct spawn reason
}
}
}
@@ -86,7 +105,7 @@ public class SnifferEggBlock extends Block {
@@ -86,7 +_,7 @@
level.levelEvent(3009, pos, 0);
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/SpawnerBlock.java b/net/minecraft/world/level/block/SpawnerBlock.java
index d95b8f028fa3037ed40dd0e3678e9f1a10d892be..635e2608f9148c27d5d632c1618826226eb1d879 100644
--- a/net/minecraft/world/level/block/SpawnerBlock.java
+++ b/net/minecraft/world/level/block/SpawnerBlock.java
@@ -46,11 +46,19 @@ public class SpawnerBlock extends BaseEntityBlock {
@@ -41,9 +_,17 @@
@Override
protected void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropExperience) {
super.spawnAfterBreak(state, level, pos, stack, dropExperience);
@@ -27,6 +19,4 @@ index d95b8f028fa3037ed40dd0e3678e9f1a10d892be..635e2608f9148c27d5d632c161882622
+ return 0;
+ // CraftBukkit end
+ }
@Override
public void appendHoverText(ItemStack stack, Item.TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java b/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java
index cbd1ac1a57281106663de54b2ec210baa996eade..11937aa74efe08bdbd66a619c7a825f91d971afd 100644
--- a/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java
+++ b/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java
@@ -39,7 +39,13 @@ public abstract class SpreadingSnowyDirtBlock extends SnowyDirtBlock {
@@ -39,7 +_,13 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
@@ -22,12 +14,12 @@ index cbd1ac1a57281106663de54b2ec210baa996eade..11937aa74efe08bdbd66a619c7a825f9
level.setBlockAndUpdate(pos, Blocks.DIRT.defaultBlockState());
} else {
if (level.getMaxLocalRawBrightness(pos.above()) >= 9) {
@@ -48,7 +54,7 @@ public abstract class SpreadingSnowyDirtBlock extends SnowyDirtBlock {
@@ -48,7 +_,7 @@
for (int i = 0; i < 4; i++) {
BlockPos blockPos = pos.offset(random.nextInt(3) - 1, random.nextInt(5) - 3, random.nextInt(3) - 1);
if (level.getBlockState(blockPos).is(Blocks.DIRT) && canPropagate(blockState, level, blockPos)) {
- level.setBlockAndUpdate(blockPos, blockState.setValue(SNOWY, Boolean.valueOf(isSnowySetting(level.getBlockState(blockPos.above())))));
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, blockState.setValue(SNOWY, Boolean.valueOf(isSnowySetting(level.getBlockState(blockPos.above()))))); // CraftBukkit
- level.setBlockAndUpdate(blockPos, blockState.setValue(SNOWY, isSnowySetting(level.getBlockState(blockPos.above()))));
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, blockState.setValue(SNOWY, isSnowySetting(level.getBlockState(blockPos.above()))), 3); // CraftBukkit
}
}
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/StemBlock.java b/net/minecraft/world/level/block/StemBlock.java
index 9df36ae3bf64a210a28451bd7065249d079843ae..3dca57dd0c00dc64724cbc7f5a71963da9d12fd5 100644
--- a/net/minecraft/world/level/block/StemBlock.java
+++ b/net/minecraft/world/level/block/StemBlock.java
@@ -80,11 +80,11 @@ public class StemBlock extends BushBlock implements BonemealableBlock {
@@ -70,11 +_,11 @@
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (level.getRawBrightness(pos, 0) >= 9) {
float growthSpeed = CropBlock.getGrowthSpeed(this, level, pos);
@@ -16,13 +8,13 @@ index 9df36ae3bf64a210a28451bd7065249d079843ae..3dca57dd0c00dc64724cbc7f5a71963d
+ if (random.nextFloat() < ((this == Blocks.PUMPKIN_STEM ? level.spigotConfig.pumpkinModifier : level.spigotConfig.melonModifier) / (100.0f * (Math.floor((25.0F / growthSpeed) + 1))))) { // Spigot - SPIGOT-7159: Better modifier resolution
int ageValue = state.getValue(AGE);
if (ageValue < 7) {
state = state.setValue(AGE, Integer.valueOf(ageValue + 1));
state = state.setValue(AGE, ageValue + 1);
- level.setBlock(pos, state, 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state, 2); // CraftBukkit
} else {
Direction randomDirection = Direction.Plane.HORIZONTAL.getRandomDirection(random);
BlockPos blockPos = pos.relative(randomDirection);
@@ -94,7 +94,11 @@ public class StemBlock extends BushBlock implements BonemealableBlock {
@@ -84,7 +_,11 @@
Optional<Block> optional = registry.getOptional(this.fruit);
Optional<Block> optional1 = registry.getOptional(this.attachedStem);
if (optional.isPresent() && optional1.isPresent()) {
@@ -35,10 +27,10 @@ index 9df36ae3bf64a210a28451bd7065249d079843ae..3dca57dd0c00dc64724cbc7f5a71963d
level.setBlockAndUpdate(pos, optional1.get().defaultBlockState().setValue(HorizontalDirectionalBlock.FACING, randomDirection));
}
}
@@ -122,7 +126,7 @@ public class StemBlock extends BushBlock implements BonemealableBlock {
@@ -112,7 +_,7 @@
public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
int min = Math.min(7, state.getValue(AGE) + Mth.nextInt(level.random, 2, 5));
BlockState blockState = state.setValue(AGE, Integer.valueOf(min));
BlockState blockState = state.setValue(AGE, min);
- level.setBlock(pos, blockState, 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, blockState, 2); // CraftBukkit
if (min == 7) {
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/SugarCaneBlock.java b/net/minecraft/world/level/block/SugarCaneBlock.java
index e39ca48d5adc2d3f07ff66cde8732a728ea44794..63d53f9090caca304c7f8c3f9910c57a6bdbb4d5 100644
--- a/net/minecraft/world/level/block/SugarCaneBlock.java
+++ b/net/minecraft/world/level/block/SugarCaneBlock.java
@@ -56,12 +56,13 @@ public class SugarCaneBlock extends Block {
@@ -55,12 +_,13 @@
i++;
}
@@ -20,9 +12,9 @@ index e39ca48d5adc2d3f07ff66cde8732a728ea44794..63d53f9090caca304c7f8c3f9910c57a
+ int modifier = level.spigotConfig.caneModifier; // Spigot - SPIGOT-7159: Better modifier resolution
+ if (ageValue >= 15 || (modifier != 100 && random.nextFloat() < (modifier / (100.0f * 16)))) { // Spigot - SPIGOT-7159: Better modifier resolution
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos.above(), this.defaultBlockState()); // CraftBukkit
level.setBlock(pos, state.setValue(AGE, Integer.valueOf(0)), 4);
level.setBlock(pos, state.setValue(AGE, 0), 260);
- } else {
+ } else if (modifier == 100 || random.nextFloat() < (modifier / (100.0f * 16))) { // Spigot - SPIGOT-7159: Better modifier resolution
level.setBlock(pos, state.setValue(AGE, Integer.valueOf(ageValue + 1)), 4);
level.setBlock(pos, state.setValue(AGE, ageValue + 1), 260);
}
}
@@ -1,20 +1,12 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/SweetBerryBushBlock.java b/net/minecraft/world/level/block/SweetBerryBushBlock.java
index 3c9799402418d22bbc5d6c1390d58558cd954a47..63ec7a5c3b4a0397ce264ca7769ff4adbbab4ef1 100644
--- a/net/minecraft/world/level/block/SweetBerryBushBlock.java
+++ b/net/minecraft/world/level/block/SweetBerryBushBlock.java
@@ -68,15 +68,16 @@ public class SweetBerryBushBlock extends BushBlock implements BonemealableBlock
@@ -70,15 +_,16 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
int ageValue = state.getValue(AGE);
- if (ageValue < 3 && random.nextInt(5) == 0 && level.getRawBrightness(pos.above(), 0) >= 9) {
+ if (ageValue < 3 && random.nextFloat() < (level.spigotConfig.sweetBerryModifier / (100.0f * 5)) && level.getRawBrightness(pos.above(), 0) >= 9) { // Spigot - SPIGOT-7159: Better modifier resolution
BlockState blockState = state.setValue(AGE, Integer.valueOf(ageValue + 1));
BlockState blockState = state.setValue(AGE, ageValue + 1);
- level.setBlock(pos, blockState, 2);
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, blockState, 2)) return; // CraftBukkit
level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(blockState));
@@ -22,12 +14,12 @@ index 3c9799402418d22bbc5d6c1390d58558cd954a47..63ec7a5c3b4a0397ce264ca7769ff4ad
}
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (entity instanceof LivingEntity && entity.getType() != EntityType.FOX && entity.getType() != EntityType.BEE) {
entity.makeStuckInBlock(state, new Vec3(0.8F, 0.75, 0.8F));
if (level instanceof ServerLevel serverLevel && state.getValue(AGE) != 0) {
@@ -85,7 +86,7 @@ public class SweetBerryBushBlock extends BushBlock implements BonemealableBlock
@@ -87,7 +_,7 @@
double abs = Math.abs(vec3.x());
double abs1 = Math.abs(vec3.z());
if (abs >= 0.003F || abs1 >= 0.003F) {
@@ -36,7 +28,7 @@ index 3c9799402418d22bbc5d6c1390d58558cd954a47..63ec7a5c3b4a0397ce264ca7769ff4ad
}
}
}
@@ -109,7 +110,15 @@ public class SweetBerryBushBlock extends BushBlock implements BonemealableBlock
@@ -111,7 +_,15 @@
boolean flag = ageValue == 3;
if (ageValue > 1) {
int i = 1 + level.random.nextInt(2);
@@ -51,5 +43,5 @@ index 3c9799402418d22bbc5d6c1390d58558cd954a47..63ec7a5c3b4a0397ce264ca7769ff4ad
+ }
+ // CraftBukkit end
level.playSound(null, pos, SoundEvents.SWEET_BERRY_BUSH_PICK_BERRIES, SoundSource.BLOCKS, 1.0F, 0.8F + level.random.nextFloat() * 0.4F);
BlockState blockState = state.setValue(AGE, Integer.valueOf(1));
BlockState blockState = state.setValue(AGE, 1);
level.setBlock(pos, blockState, 2);
@@ -0,0 +1,67 @@
--- a/net/minecraft/world/level/block/TntBlock.java
+++ b/net/minecraft/world/level/block/TntBlock.java
@@ -47,7 +_,7 @@
@Override
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
if (!oldState.is(state.getBlock())) {
- if (level.hasNeighborSignal(pos) && prime(level, pos)) {
+ if (level.hasNeighborSignal(pos) && prime(level, pos, () -> org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.REDSTONE, null, null))) { // CraftBukkit - TNTPrimeEvent
level.removeBlock(pos, false);
}
}
@@ -55,7 +_,7 @@
@Override
protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
- if (level.hasNeighborSignal(pos) && prime(level, pos)) {
+ if (level.hasNeighborSignal(pos) && prime(level, pos, () -> org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.REDSTONE, null, null))) { // CraftBukkit - TNTPrimeEvent
level.removeBlock(pos, false);
}
}
@@ -63,7 +_,7 @@
@Override
public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) {
if (!level.isClientSide() && !player.getAbilities().instabuild && state.getValue(UNSTABLE)) {
- prime(level, pos);
+ prime(level, pos, () -> org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.BLOCK_BREAK, player, null)); // CraftBukkit - TNTPrimeEvent
}
return super.playerWillDestroy(level, pos, state, player);
@@ -80,11 +_,16 @@
}
public static boolean prime(Level level, BlockPos pos) {
- return prime(level, pos, null);
+ // Paper start
+ return prime(level, pos, null, () -> true);
+ }
+ public static boolean prime(Level level, BlockPos pos, java.util.function.BooleanSupplier event) {
+ return prime(level, pos, null, event);
+ // Paper end
}
- private static boolean prime(Level level, BlockPos pos, @Nullable LivingEntity entity) {
- if (level instanceof ServerLevel serverLevel && serverLevel.getGameRules().getBoolean(GameRules.RULE_TNT_EXPLODES)) {
+ private static boolean prime(Level level, BlockPos pos, @Nullable LivingEntity entity, java.util.function.BooleanSupplier event) { // Paper
+ if (level instanceof ServerLevel serverLevel && serverLevel.getGameRules().getBoolean(GameRules.RULE_TNT_EXPLODES) && event.getAsBoolean()) { // Paper
PrimedTnt primedTnt = new PrimedTnt(level, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, entity);
level.addFreshEntity(primedTnt);
level.playSound(null, primedTnt.getX(), primedTnt.getY(), primedTnt.getZ(), SoundEvents.TNT_PRIMED, SoundSource.BLOCKS, 1.0F, 1.0F);
@@ -102,7 +_,7 @@
if (!stack.is(Items.FLINT_AND_STEEL) && !stack.is(Items.FIRE_CHARGE)) {
return super.useItemOn(stack, state, level, pos, player, hand, hitResult);
} else {
- if (prime(level, pos, player)) {
+ if (prime(level, pos, player, () -> org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.PLAYER, player, null))) { // Paper
level.setBlock(pos, Blocks.AIR.defaultBlockState(), 11);
Item item = stack.getItem();
if (stack.is(Items.FLINT_AND_STEEL)) {
@@ -128,7 +_,7 @@
Entity owner = projectile.getOwner();
if (projectile.isOnFire()
&& projectile.mayInteract(serverLevel, blockPos)
- && prime(level, blockPos, owner instanceof LivingEntity ? (LivingEntity)owner : null)) {
+ && prime(level, blockPos, owner instanceof LivingEntity ? (LivingEntity)owner : null, () -> org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(projectile, blockPos, state.getFluidState().createLegacyBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, blockPos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.PROJECTILE, projectile, null))) { // Paper
level.removeBlock(blockPos, false);
}
}
@@ -1,19 +1,10 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/TrapDoorBlock.java b/net/minecraft/world/level/block/TrapDoorBlock.java
index 4c749dc54effcec6c3454229b170942e5a61ac97..46c23990e78ce77b188052672778bdef560a0d13 100644
--- a/net/minecraft/world/level/block/TrapDoorBlock.java
+++ b/net/minecraft/world/level/block/TrapDoorBlock.java
@@ -146,7 +146,40 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW
@@ -128,7 +_,39 @@
if (!level.isClientSide) {
boolean hasNeighborSignal = level.hasNeighborSignal(pos);
if (hasNeighborSignal != state.getValue(POWERED)) {
- if (state.getValue(OPEN) != hasNeighborSignal) {
+ // if (state.getValue(OPEN) != hasNeighborSignal) {
+ // CraftBukkit start
+ org.bukkit.World bworld = level.getWorld();
+ org.bukkit.block.Block bblock = bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ());
@@ -46,7 +37,7 @@ index 4c749dc54effcec6c3454229b170942e5a61ac97..46c23990e78ce77b188052672778bdef
+ }
+ }
+ if (open) {
+ // Paper end - break redstone on trapdoors early
state = state.setValue(OPEN, Boolean.valueOf(hasNeighborSignal));
+ // Paper end - break redstone on trapdoors early
state = state.setValue(OPEN, hasNeighborSignal);
this.playSound(null, level, pos, hasNeighborSignal);
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/TripWireBlock.java b/net/minecraft/world/level/block/TripWireBlock.java
index d74db8bf318896ce0a95283b04e495c92344d7ed..e3f3f127907b43a2cef3e1dbff555422b4a551d9 100644
--- a/net/minecraft/world/level/block/TripWireBlock.java
+++ b/net/minecraft/world/level/block/TripWireBlock.java
@@ -72,6 +72,7 @@ public class TripWireBlock extends Block {
@@ -73,6 +_,7 @@
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
@@ -16,15 +8,15 @@ index d74db8bf318896ce0a95283b04e495c92344d7ed..e3f3f127907b43a2cef3e1dbff555422
BlockGetter level = context.getLevel();
BlockPos clickedPos = context.getClickedPos();
return this.defaultBlockState()
@@ -92,6 +93,7 @@ public class TripWireBlock extends Block {
@@ -93,6 +_,7 @@
BlockState neighborState,
RandomSource random
) {
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return state; // Paper - prevent tripwire from updating
return direction.getAxis().isHorizontal()
? state.setValue(PROPERTY_BY_DIRECTION.get(direction), Boolean.valueOf(this.shouldConnectTo(neighborState, direction)))
? state.setValue(PROPERTY_BY_DIRECTION.get(direction), this.shouldConnectTo(neighborState, direction))
: super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random);
@@ -99,6 +101,7 @@ public class TripWireBlock extends Block {
@@ -100,6 +_,7 @@
@Override
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
@@ -32,23 +24,23 @@ index d74db8bf318896ce0a95283b04e495c92344d7ed..e3f3f127907b43a2cef3e1dbff555422
if (!oldState.is(state.getBlock())) {
this.updateSource(level, pos, state);
}
@@ -106,6 +109,7 @@ public class TripWireBlock extends Block {
@@ -107,6 +_,7 @@
@Override
protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) {
protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) {
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating
if (!isMoving && !state.is(newState.getBlock())) {
this.updateSource(level, pos, state.setValue(POWERED, Boolean.valueOf(true)));
if (!movedByPiston) {
this.updateSource(level, pos, state.setValue(POWERED, true));
}
@@ -113,6 +117,7 @@ public class TripWireBlock extends Block {
@@ -114,6 +_,7 @@
@Override
public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) {
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return state; // Paper - prevent disarming tripwires
if (!level.isClientSide && !player.getMainHandItem().isEmpty() && player.getMainHandItem().is(Items.SHEARS)) {
level.setBlock(pos, state.setValue(DISARMED, Boolean.valueOf(true)), 4);
level.setBlock(pos, state.setValue(DISARMED, true), 260);
level.gameEvent(player, GameEvent.SHEAR, pos);
@@ -122,6 +127,7 @@ public class TripWireBlock extends Block {
@@ -123,6 +_,7 @@
}
private void updateSource(Level level, BlockPos pos, BlockState state) {
@@ -56,16 +48,16 @@ index d74db8bf318896ce0a95283b04e495c92344d7ed..e3f3f127907b43a2cef3e1dbff555422
for (Direction direction : new Direction[]{Direction.SOUTH, Direction.WEST}) {
for (int i = 1; i < 42; i++) {
BlockPos blockPos = pos.relative(direction, i);
@@ -147,6 +153,8 @@ public class TripWireBlock extends Block {
@@ -148,6 +_,8 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent tripwires from detecting collision
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!level.isClientSide) {
if (!state.getValue(POWERED)) {
this.checkPressed(level, pos, List.of(entity));
@@ -156,6 +164,7 @@ public class TripWireBlock extends Block {
@@ -157,6 +_,7 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
@@ -73,10 +65,11 @@ index d74db8bf318896ce0a95283b04e495c92344d7ed..e3f3f127907b43a2cef3e1dbff555422
if (level.getBlockState(pos).getValue(POWERED)) {
this.checkPressed(level, pos);
}
@@ -180,6 +189,40 @@ public class TripWireBlock extends Block {
@@ -180,6 +_,40 @@
}
}
}
+
+ // CraftBukkit start - Call interact even when triggering connected tripwire
+ if (poweredValue != flag && flag && blockState.getValue(TripWireBlock.ATTACHED)) {
+ org.bukkit.World bworld = level.getWorld();
@@ -110,7 +103,6 @@ index d74db8bf318896ce0a95283b04e495c92344d7ed..e3f3f127907b43a2cef3e1dbff555422
+ }
+ }
+ // CraftBukkit end
+
if (flag != poweredValue) {
blockState = blockState.setValue(POWERED, Boolean.valueOf(flag));
level.setBlock(pos, blockState, 3);
blockState = blockState.setValue(POWERED, flag);
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/TripWireHookBlock.java b/net/minecraft/world/level/block/TripWireHookBlock.java
index 9c1129693413d4f46e4656ddff83e05db5ce8196..9aace993c6c18f1a50610e4766225485984b8167 100644
--- a/net/minecraft/world/level/block/TripWireHookBlock.java
+++ b/net/minecraft/world/level/block/TripWireHookBlock.java
@@ -127,10 +127,10 @@ public class TripWireHookBlock extends Block {
@@ -113,10 +_,10 @@
if (optionalValue.isPresent()) {
Direction direction = optionalValue.get();
boolean flag = hookState.getOptionalValue(ATTACHED).orElse(false);
@@ -21,10 +13,10 @@ index 9c1129693413d4f46e4656ddff83e05db5ce8196..9aace993c6c18f1a50610e4766225485
int i = 0;
BlockState[] blockStates = new BlockState[42];
@@ -166,21 +166,48 @@ public class TripWireHookBlock extends Block {
@@ -152,21 +_,48 @@
flag2 &= i > 1;
flag3 &= flag2;
BlockState blockState1 = block.defaultBlockState().trySetValue(ATTACHED, Boolean.valueOf(flag2)).trySetValue(POWERED, Boolean.valueOf(flag3));
BlockState blockState1 = block.defaultBlockState().trySetValue(ATTACHED, flag2).trySetValue(POWERED, flag3);
+ boolean cancelledEmitterHook = false, cancelledReceiverHook = false; // Paper - Call BlockRedstoneEvent
+ boolean wasPowered = flag1, willBePowered = flag3; // Paper - OBFHELPER
if (i > 0) {
@@ -44,6 +36,7 @@ index 9c1129693413d4f46e4656ddff83e05db5ce8196..9aace993c6c18f1a50610e4766225485
level.setBlock(blockPosx, blockState1.setValue(FACING, opposite), 3);
notifyNeighbors(block, level, blockPosx, opposite);
emitState(level, blockPosx, flag2, flag3, flag, flag1);
- }
+ } // Paper - Call BlockRedstoneEvent
+ }
+ // Paper start - Call BlockRedstoneEvent
@@ -54,7 +47,7 @@ index 9c1129693413d4f46e4656ddff83e05db5ce8196..9aace993c6c18f1a50610e4766225485
+ );
+ event.callEvent();
+ cancelledEmitterHook = event.getNewCurrent() != newCurrent;
}
+ }
+ // Paper end - Call BlockRedstoneEvent
+ if (!cancelledEmitterHook) { // Paper - Call BlockRedstoneEvent
@@ -70,12 +63,12 @@ index 9c1129693413d4f46e4656ddff83e05db5ce8196..9aace993c6c18f1a50610e4766225485
if (flag != flag2) {
for (int i2 = 1; i2 < i; i2++) {
@@ -189,7 +216,7 @@ public class TripWireHookBlock extends Block {
@@ -175,7 +_,7 @@
if (blockState2 != null) {
BlockState blockState3 = level.getBlockState(blockPos1);
if (blockState3.is(Blocks.TRIPWIRE) || blockState3.is(Blocks.TRIPWIRE_HOOK)) {
- level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, Boolean.valueOf(flag2)), 3);
+ if (!io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates || !blockState3.is(Blocks.TRIPWIRE)) level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, Boolean.valueOf(flag2)), 3); // Paper - prevent tripwire from updating
- level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, flag2), 3);
+ if (!io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates || !blockState3.is(Blocks.TRIPWIRE)) level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, flag2), 3); // Paper - prevent tripwire from updating
}
}
}
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/TurtleEggBlock.java b/net/minecraft/world/level/block/TurtleEggBlock.java
index 6873f22472b37ab57bc4fcdee227e422641036a2..8a09af26bbccdecd19607da84c11029c3cb9a11e 100644
--- a/net/minecraft/world/level/block/TurtleEggBlock.java
+++ b/net/minecraft/world/level/block/TurtleEggBlock.java
@@ -74,6 +74,19 @@ public class TurtleEggBlock extends Block {
@@ -74,6 +_,19 @@
&& level instanceof ServerLevel serverLevel
&& this.canDestroyEgg(serverLevel, entity)
&& level.random.nextInt(chance) == 0) {
@@ -28,7 +20,7 @@ index 6873f22472b37ab57bc4fcdee227e422641036a2..8a09af26bbccdecd19607da84c11029c
this.decreaseEggs(serverLevel, pos, state);
}
}
@@ -95,10 +108,20 @@ public class TurtleEggBlock extends Block {
@@ -95,10 +_,20 @@
if (this.shouldUpdateHatchLevel(level) && onSand(level, pos)) {
int hatchValue = state.getValue(HATCH);
if (hatchValue < 2) {
@@ -38,8 +30,8 @@ index 6873f22472b37ab57bc4fcdee227e422641036a2..8a09af26bbccdecd19607da84c11029c
+ }
+ // CraftBukkit end
level.playSound(null, pos, SoundEvents.TURTLE_EGG_CRACK, SoundSource.BLOCKS, 0.7F, 0.9F + random.nextFloat() * 0.2F);
- level.setBlock(pos, state.setValue(HATCH, Integer.valueOf(hatchValue + 1)), 2);
+ // level.setBlock(pos, state.setValue(HATCH, Integer.valueOf(hatchValue + 1)), 2); // CraftBukkit - handled above
- level.setBlock(pos, state.setValue(HATCH, hatchValue + 1), 2);
+ // level.setBlock(pos, state.setValue(HATCH, hatchValue + 1), 2); // CraftBukkit - handled above
level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(state));
} else {
+ // CraftBukkit start - Call BlockFadeEvent
@@ -50,16 +42,16 @@ index 6873f22472b37ab57bc4fcdee227e422641036a2..8a09af26bbccdecd19607da84c11029c
level.playSound(null, pos, SoundEvents.TURTLE_EGG_HATCH, SoundSource.BLOCKS, 0.7F, 0.9F + random.nextFloat() * 0.2F);
level.removeBlock(pos, false);
level.gameEvent(GameEvent.BLOCK_DESTROY, pos, GameEvent.Context.of(state));
@@ -110,7 +133,7 @@ public class TurtleEggBlock extends Block {
@@ -110,7 +_,7 @@
turtle.setAge(-24000);
turtle.setHomePos(pos);
turtle.moveTo(pos.getX() + 0.3 + i * 0.2, pos.getY(), pos.getZ() + 0.3, 0.0F, 0.0F);
turtle.snapTo(pos.getX() + 0.3 + i * 0.2, pos.getY(), pos.getZ() + 0.3, 0.0F, 0.0F);
- level.addFreshEntity(turtle);
+ level.addFreshEntity(turtle, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); // CraftBukkit
}
}
}
@@ -138,8 +161,8 @@ public class TurtleEggBlock extends Block {
@@ -138,8 +_,8 @@
}
@Override
@@ -0,0 +1,21 @@
--- a/net/minecraft/world/level/block/VegetationBlock.java
+++ b/net/minecraft/world/level/block/VegetationBlock.java
@@ -35,9 +_,15 @@
BlockState neighborState,
RandomSource random
) {
- return !state.canSurvive(level, pos)
- ? Blocks.AIR.defaultBlockState()
- : super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random);
+ // CraftBukkit start
+ if (!state.canSurvive(level, pos)) {
+ // Suppress during worldgen
+ if (!(level instanceof net.minecraft.server.level.ServerLevel serverLevel && serverLevel.hasPhysicsEvent) || !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(serverLevel, pos).isCancelled()) { // Paper
+ return Blocks.AIR.defaultBlockState();
+ }
+ }
+ return super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random);
+ // CraftBukkit end
}
@Override
@@ -1,14 +1,6 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/VineBlock.java b/net/minecraft/world/level/block/VineBlock.java
index 6a2f7eb482931c710a580d3d9d0bb9b4ba6212b5..fc7baf00218cf15be8d63fa2c7fbc622a3c805fc 100644
--- a/net/minecraft/world/level/block/VineBlock.java
+++ b/net/minecraft/world/level/block/VineBlock.java
@@ -191,7 +191,7 @@ public class VineBlock extends Block {
@@ -166,7 +_,7 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (level.getGameRules().getBoolean(GameRules.RULE_DO_VINES_SPREAD)) {
@@ -17,46 +9,46 @@ index 6a2f7eb482931c710a580d3d9d0bb9b4ba6212b5..fc7baf00218cf15be8d63fa2c7fbc622
Direction random1 = Direction.getRandom(random);
BlockPos blockPos = pos.above();
if (random1.getAxis().isHorizontal() && !state.getValue(getPropertyForFace(random1))) {
@@ -205,28 +205,31 @@ public class VineBlock extends Block {
@@ -180,28 +_,31 @@
boolean value1 = state.getValue(getPropertyForFace(counterClockWise));
BlockPos blockPos2 = blockPos1.relative(clockWise);
BlockPos blockPos3 = blockPos1.relative(counterClockWise);
+ // CraftBukkit start - Call BlockSpreadEvent
+ BlockPos source = pos;
if (value && isAcceptableNeighbour(level, blockPos2, clockWise)) {
- level.setBlock(blockPos1, this.defaultBlockState().setValue(getPropertyForFace(clockWise), Boolean.valueOf(true)), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos1, this.defaultBlockState().setValue(getPropertyForFace(clockWise), Boolean.valueOf(true)), 2);
- level.setBlock(blockPos1, this.defaultBlockState().setValue(getPropertyForFace(clockWise), true), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos1, this.defaultBlockState().setValue(getPropertyForFace(clockWise), true), 2);
} else if (value1 && isAcceptableNeighbour(level, blockPos3, counterClockWise)) {
- level.setBlock(blockPos1, this.defaultBlockState().setValue(getPropertyForFace(counterClockWise), Boolean.valueOf(true)), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos1, this.defaultBlockState().setValue(getPropertyForFace(counterClockWise), Boolean.valueOf(true)), 2);
- level.setBlock(blockPos1, this.defaultBlockState().setValue(getPropertyForFace(counterClockWise), true), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos1, this.defaultBlockState().setValue(getPropertyForFace(counterClockWise), true), 2);
} else {
Direction opposite = random1.getOpposite();
if (value && level.isEmptyBlock(blockPos2) && isAcceptableNeighbour(level, pos.relative(clockWise), opposite)) {
- level.setBlock(blockPos2, this.defaultBlockState().setValue(getPropertyForFace(opposite), Boolean.valueOf(true)), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos2, this.defaultBlockState().setValue(getPropertyForFace(opposite), Boolean.valueOf(true)), 2);
- level.setBlock(blockPos2, this.defaultBlockState().setValue(getPropertyForFace(opposite), true), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos2, this.defaultBlockState().setValue(getPropertyForFace(opposite), true), 2);
} else if (value1 && level.isEmptyBlock(blockPos3) && isAcceptableNeighbour(level, pos.relative(counterClockWise), opposite)) {
- level.setBlock(blockPos3, this.defaultBlockState().setValue(getPropertyForFace(opposite), Boolean.valueOf(true)), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos3, this.defaultBlockState().setValue(getPropertyForFace(opposite), Boolean.valueOf(true)), 2);
- level.setBlock(blockPos3, this.defaultBlockState().setValue(getPropertyForFace(opposite), true), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos3, this.defaultBlockState().setValue(getPropertyForFace(opposite), true), 2);
} else if (random.nextFloat() < 0.05 && isAcceptableNeighbour(level, blockPos1.above(), Direction.UP)) {
- level.setBlock(blockPos1, this.defaultBlockState().setValue(UP, Boolean.valueOf(true)), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos1, this.defaultBlockState().setValue(UP, Boolean.valueOf(true)), 2);
- level.setBlock(blockPos1, this.defaultBlockState().setValue(UP, true), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, source, blockPos1, this.defaultBlockState().setValue(UP, true), 2);
}
+ // CraftBukkit end
}
} else if (isAcceptableNeighbour(level, blockPos1, random1)) {
- level.setBlock(pos, state.setValue(getPropertyForFace(random1), Boolean.valueOf(true)), 2);
- level.setBlock(pos, state.setValue(getPropertyForFace(random1), true), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, (BlockState) state.setValue(VineBlock.getPropertyForFace(random1), true), 2); // CraftBukkit
}
}
} else {
if (random1 == Direction.UP && pos.getY() < level.getMaxY()) {
if (this.canSupportAtFace(level, pos, random1)) {
- level.setBlock(pos, state.setValue(UP, Boolean.valueOf(true)), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(UP, Boolean.valueOf(true)), 2); // CraftBukkit
- level.setBlock(pos, state.setValue(UP, true), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(UP, true), 2); // CraftBukkit
return;
}
@@ -244,7 +247,7 @@ public class VineBlock extends Block {
@@ -219,7 +_,7 @@
}
if (this.hasHorizontalConnection(blockState1)) {
@@ -65,7 +57,7 @@ index 6a2f7eb482931c710a580d3d9d0bb9b4ba6212b5..fc7baf00218cf15be8d63fa2c7fbc622
}
return;
@@ -258,7 +261,7 @@ public class VineBlock extends Block {
@@ -233,7 +_,7 @@
BlockState blockState2 = blockState.isAir() ? this.defaultBlockState() : blockState;
BlockState blockState3 = this.copyRandomFaces(state, blockState2, random);
if (blockState2 != blockState3 && this.hasHorizontalConnection(blockState3)) {
@@ -1,19 +1,11 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/WaterlilyBlock.java b/net/minecraft/world/level/block/WaterlilyBlock.java
index e2bf4f35e55a1052e642b25d79741186958c4518..f085671bcef6dd9758240f91dfe7c58ef6212f0b 100644
--- a/net/minecraft/world/level/block/WaterlilyBlock.java
+++ b/net/minecraft/world/level/block/WaterlilyBlock.java
@@ -29,8 +29,14 @@ public class WaterlilyBlock extends BushBlock {
@@ -30,8 +_,14 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
super.entityInside(state, level, pos, entity);
super.entityInside(state, level, pos, entity, effectApplier);
if (level instanceof ServerLevel && entity instanceof AbstractBoat) {
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, state.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/WebBlock.java b/net/minecraft/world/level/block/WebBlock.java
index ae959f63e2f74cc8e7a52b120a369a3a557b683c..e829dc38ff7f3de08d94adecb4a878905c9deb69 100644
--- a/net/minecraft/world/level/block/WebBlock.java
+++ b/net/minecraft/world/level/block/WebBlock.java
@@ -24,6 +24,7 @@ public class WebBlock extends Block {
@@ -25,6 +_,7 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
Vec3 vec3 = new Vec3(0.25, 0.05F, 0.25);
if (entity instanceof LivingEntity livingEntity && livingEntity.hasEffect(MobEffects.WEAVING)) {
@@ -1,17 +1,9 @@
From 3aeeaf31b7a7f888f54e47826e8ec0ddbe65c4bf Mon Sep 17 00:00:00 2001
From: File <noreply+automated@papermc.io>
Date: Sun, 20 Apr 1997 14:37:42 +0100
Subject: [PATCH] paper File Patches
diff --git a/net/minecraft/world/level/block/WitherRoseBlock.java b/net/minecraft/world/level/block/WitherRoseBlock.java
index 17dba36a164c859950c714626420589913f74c6d..969519f357e5a4b88f2f695cf0b1b4903365fc3d 100644
--- a/net/minecraft/world/level/block/WitherRoseBlock.java
+++ b/net/minecraft/world/level/block/WitherRoseBlock.java
@@ -63,11 +63,12 @@ public class WitherRoseBlock extends FlowerBlock {
@@ -64,11 +_,12 @@
@Override
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (level instanceof ServerLevel serverLevel
&& level.getDifficulty() != Difficulty.PEACEFUL
@@ -3,6 +3,7 @@ package org.bukkit.craftbukkit.entity;
import com.google.common.base.Preconditions;
import java.util.Locale;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries;
import net.minecraft.world.entity.monster.Zombie;
import net.minecraft.world.entity.npc.VillagerProfession;
@@ -255,6 +256,14 @@ public class CraftVillager extends CraftAbstractVillager implements Villager {
public static class CraftProfession implements Profession, Handleable<VillagerProfession> {
private static int count = 0;
public static Profession minecraftHolderToBukkit(Holder<VillagerProfession> minecraft) {
return CraftRegistry.minecraftHolderToBukkit(minecraft, Registries.VILLAGER_PROFESSION);
}
public static Holder<VillagerProfession> bukkitToMinecraftHolder(Profession bukkit) {
return CraftRegistry.bukkitToMinecraftHolder(bukkit, Registries.VILLAGER_PROFESSION);
}
public static Profession minecraftToBukkit(VillagerProfession minecraft) {
return CraftRegistry.minecraftToBukkit(minecraft, Registries.VILLAGER_PROFESSION);
}
@@ -1326,11 +1326,10 @@ public class CraftEventFactory {
}
public static boolean handleBlockGrowEvent(Level world, BlockPos pos, net.minecraft.world.level.block.state.BlockState newData, int flag) {
Block block = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
CraftBlockState state = (CraftBlockState) block.getState();
CraftBlockState state = CraftBlockStates.getBlockState(world, pos, flag);
state.setData(newData);
BlockGrowEvent event = new BlockGrowEvent(block, state);
BlockGrowEvent event = new BlockGrowEvent(state.getBlock(), state);
Bukkit.getPluginManager().callEvent(event);
if (!event.isCancelled()) {