Co-authored-by: Bjarne Koll <git@lynxplay.dev>
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
Co-authored-by: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com>
Co-authored-by: MiniDigger | Martin <admin@minidigger.dev>
Co-authored-by: Nassim Jahnke <nassim@njahnke.dev>
Co-authored-by: Noah van der Aa <ndvdaa@gmail.com>
Co-authored-by: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Co-authored-by: Shane Freeder <theboyetronic@gmail.com>
Co-authored-by: Spottedleaf <Spottedleaf@users.noreply.github.com>
Co-authored-by: Tamion <70228790+notTamion@users.noreply.github.com>
Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com>
This commit is contained in:
Nassim Jahnke
2025-04-12 17:26:44 +02:00
parent 0767902699
commit f00727c57e
2092 changed files with 50551 additions and 48729 deletions

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/AbstractCauldronBlock.java
+++ b/net/minecraft/world/level/block/AbstractCauldronBlock.java
@@ -58,7 +_,7 @@
@@ -62,7 +_,7 @@
ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult
) {
CauldronInteraction cauldronInteraction = this.interactions.map().get(stack.getItem());

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/AnvilBlock.java
+++ b/net/minecraft/world/level/block/AnvilBlock.java
@@ -62,8 +_,9 @@
@@ -57,8 +_,9 @@
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
if (!level.isClientSide) {

View File

@@ -1,15 +1,15 @@
--- a/net/minecraft/world/level/block/BambooSaplingBlock.java
+++ b/net/minecraft/world/level/block/BambooSaplingBlock.java
@@ -43,7 +_,7 @@
@@ -38,7 +_,7 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
- if (random.nextInt(3) == 0 && level.isEmptyBlock(pos.above()) && level.getRawBrightness(pos.above(), 0) >= 9) {
+ if (random.nextFloat() < (level.spigotConfig.bambooModifier / (100.0f * 3)) && level.isEmptyBlock(pos.above()) && level.getRawBrightness(pos.above(), 0) >= 9) { // Spigot - SPIGOT-7159: Better modifier resolution
+ if (random.nextFloat() < (level.spigotConfig.bambooModifier / (100.0F * 3)) && level.isEmptyBlock(pos.above()) && level.getRawBrightness(pos.above(), 0) >= 9) { // Spigot - SPIGOT-7159: Better modifier resolution
this.growBamboo(level, pos);
}
}
@@ -99,6 +_,6 @@
@@ -89,6 +_,6 @@
}
protected void growBamboo(Level level, BlockPos state) {

View File

@@ -1,18 +1,18 @@
--- a/net/minecraft/world/level/block/BambooStalkBlock.java
+++ b/net/minecraft/world/level/block/BambooStalkBlock.java
@@ -130,9 +_,9 @@
@@ -120,9 +_,9 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (state.getValue(STAGE) == 0) {
- if (random.nextInt(3) == 0 && level.isEmptyBlock(pos.above()) && level.getRawBrightness(pos.above(), 0) >= 9) {
+ if (random.nextFloat() < (level.spigotConfig.bambooModifier / (100.0f * 3)) && level.isEmptyBlock(pos.above()) && level.getRawBrightness(pos.above(), 0) >= 9) { // Spigot - SPIGOT-7159: Better modifier resolution
+ if (random.nextFloat() < (level.spigotConfig.bambooModifier / (100.0F * 3)) && level.isEmptyBlock(pos.above()) && level.getRawBrightness(pos.above(), 0) >= 9) { // Spigot - SPIGOT-7159: Better modifier resolution
int i = this.getHeightBelowUpToMax(level, pos) + 1;
- if (i < 16) {
+ if (i < level.paperConfig().maxGrowthHeight.bamboo.max) { // Paper - Configurable cactus/bamboo/reed growth height
this.growBamboo(state, level, pos, random, i);
}
}
@@ -168,7 +_,7 @@
@@ -158,7 +_,7 @@
public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) {
int heightAboveUpToMax = this.getHeightAboveUpToMax(level, pos);
int heightBelowUpToMax = this.getHeightBelowUpToMax(level, pos);
@@ -21,7 +21,7 @@
}
@Override
@@ -186,7 +_,7 @@
@@ -176,7 +_,7 @@
for (int i2 = 0; i2 < i1; i2++) {
BlockPos blockPos = pos.above(heightAboveUpToMax);
BlockState blockState = level.getBlockState(blockPos);
@@ -30,7 +30,7 @@
return;
}
@@ -206,29 +_,38 @@
@@ -191,27 +_,38 @@
BlockPos blockPos = pos.below(2);
BlockState blockState1 = level.getBlockState(blockPos);
BambooLeaves bambooLeaves = BambooLeaves.NONE;
@@ -54,12 +54,10 @@
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)) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, pos.above(), this.defaultBlockState().setValue(AGE, i).setValue(LEAVES, bambooLeaves).setValue(STAGE, i1), 3)) {
+ if (shouldUpdateOthers) {
+ level.setBlock(pos.below(), blockState.setValue(BambooStalkBlock.LEAVES, BambooLeaves.SMALL), 3);
+ level.setBlock(blockPos, blockState1.setValue(BambooStalkBlock.LEAVES, BambooLeaves.NONE), 3);
@@ -76,7 +74,7 @@
i++;
}
@@ -238,7 +_,7 @@
@@ -221,7 +_,7 @@
protected int getHeightBelowUpToMax(BlockGetter level, BlockPos pos) {
int i = 0;

View File

@@ -1,29 +1,27 @@
--- a/net/minecraft/world/level/block/BaseFireBlock.java
+++ b/net/minecraft/world/level/block/BaseFireBlock.java
@@ -12,6 +_,7 @@
import net.minecraft.world.entity.Entity;
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 +_,7 @@
@@ -129,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
effectApplier.apply(InsideBlockEffectType.FIRE_IGNITE);
effectApplier.runAfter(InsideBlockEffectType.FIRE_IGNITE, entity1 -> entity1.hurt(entity1.level().damageSources().inFire(), this.fireDamage));
}
- public static void fireIgnite(Entity entity) {
+ public static void fireIgnite(Entity entity, BlockPos pos) { // Paper - track position inside effect was triggered on
if (!entity.fireImmune()) {
if (entity.getRemainingFireTicks() < 0) {
entity.setRemainingFireTicks(entity.getRemainingFireTicks() + 1);
@@ -137,7 +_,18 @@
@@ -143,30 +_,41 @@
}
if (entity.getRemainingFireTicks() >= 0) {
- entity.igniteForSeconds(8.0F);
+ // CraftBukkit start
+ org.bukkit.event.entity.EntityCombustEvent event = new org.bukkit.event.entity.EntityCombustByBlockEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), entity.getBukkitEntity(), 8.0F);
+ level.getCraftServer().getPluginManager().callEvent(event);
+ org.bukkit.event.entity.EntityCombustEvent event = new org.bukkit.event.entity.EntityCombustByBlockEvent(org.bukkit.craftbukkit.block.CraftBlock.at(entity.level(), pos), entity.getBukkitEntity(), 8.0F);
+ entity.level().getCraftServer().getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
+ entity.igniteForSeconds(event.getDuration(), false);
@@ -35,13 +33,11 @@
+ // CraftBukkit end
}
}
@@ -146,24 +_,24 @@
}
@Override
- protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
+ protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving, UseOnContext context) { // CraftBukkit - context
+ protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving, net.minecraft.world.item.context.UseOnContext context) { // CraftBukkit - context
if (!oldState.is(state.getBlock())) {
if (inPortalDimension(level)) {
Optional<PortalShape> optional = PortalShape.findEmptyPortalShape(level, pos, Direction.Axis.X);
@@ -65,7 +61,7 @@
}
@Override
@@ -208,4 +_,12 @@
@@ -211,4 +_,12 @@
}
}
}

View File

@@ -1,25 +1,22 @@
--- a/net/minecraft/world/level/block/BasePressurePlateBlock.java
+++ b/net/minecraft/world/level/block/BasePressurePlateBlock.java
@@ -81,6 +_,7 @@
@@ -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 +_,19 @@
@@ -94,6 +_,16 @@
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();
+
+ // CraftBukkit start - Interact Pressure Plate
+ if (flag != flag1) {
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), currentSignal, signalStrength);
+ manager.callEvent(eventRedstone);
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), currentSignal, signalStrength);
+ eventRedstone.callEvent();
+
+ flag1 = eventRedstone.getNewCurrent() > 0;
+ signalStrength = eventRedstone.getNewCurrent();
@@ -28,7 +25,7 @@
if (currentSignal != signalStrength) {
BlockState blockState = this.setSignalForState(state, signalStrength);
level.setBlock(pos, blockState, 2);
@@ -145,7 +_,13 @@
@@ -142,7 +_,13 @@
}
protected static int getEntityCount(Level level, AABB box, Class<? extends Entity> entityClass) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/BedBlock.java
+++ b/net/minecraft/world/level/block/BedBlock.java
@@ -92,7 +_,7 @@
@@ -90,7 +_,7 @@
}
}
@@ -9,7 +9,7 @@
level.removeBlock(pos, false);
BlockPos blockPos = pos.relative(state.getValue(FACING).getOpposite());
if (level.getBlockState(blockPos).is(this)) {
@@ -103,22 +_,56 @@
@@ -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)) {
@@ -67,7 +67,7 @@
public static boolean canSetSpawn(Level level) {
return level.dimensionType().bedWorks();
}
@@ -311,6 +_,11 @@
@@ -299,6 +_,11 @@
if (!level.isClientSide) {
BlockPos blockPos = pos.relative(state.getValue(FACING));
level.setBlock(blockPos, state.setValue(PART, BedPart.HEAD), 3);
@@ -76,6 +76,6 @@
+ return;
+ }
+ // CraftBukkit end
level.blockUpdated(pos, Blocks.AIR);
level.updateNeighborsAt(pos, Blocks.AIR);
state.updateNeighbourShapes(level, pos, 3);
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/BeehiveBlock.java
+++ b/net/minecraft/world/level/block/BeehiveBlock.java
@@ -91,8 +_,8 @@
@@ -88,8 +_,8 @@
}
@Override
@@ -11,7 +11,7 @@
if (!level.isClientSide && te instanceof BeehiveBlockEntity beehiveBlockEntity) {
if (!EnchantmentHelper.hasTag(stack, EnchantmentTags.PREVENTS_BEE_SPAWNS_WHEN_MINING)) {
beehiveBlockEntity.emptyAllLivingFromHive(player, state, BeehiveBlockEntity.BeeReleaseStatus.EMERGENCY);
@@ -100,7 +_,7 @@
@@ -97,7 +_,7 @@
this.angerNearbyBees(level, pos);
}
@@ -20,12 +20,12 @@
}
}
@@ -122,14 +_,14 @@
@@ -119,14 +_,14 @@
for (Bee bee : entitiesOfClass) {
if (bee.getTarget() == null) {
Player player = Util.getRandom(entitiesOfClass1, level.random);
- bee.setTarget(player);
+ bee.setTarget(player, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit
+ bee.setTarget(player, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER); // CraftBukkit
}
}
}
@@ -37,7 +37,7 @@
}
@Override
@@ -141,8 +_,19 @@
@@ -138,8 +_,19 @@
if (honeyLevelValue >= 5) {
Item item = stack.getItem();
if (stack.is(Items.SHEARS)) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/BellBlock.java
+++ b/net/minecraft/world/level/block/BellBlock.java
@@ -142,6 +_,11 @@
@@ -137,6 +_,11 @@
direction = level.getBlockState(pos).getValue(FACING);
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/BigDripleafBlock.java
+++ b/net/minecraft/world/level/block/BigDripleafBlock.java
@@ -136,7 +_,7 @@
@@ -129,7 +_,7 @@
@Override
protected void onProjectileHit(Level level, BlockState state, BlockHitResult hit, Projectile projectile) {
@@ -9,10 +9,10 @@
}
@Override
@@ -199,9 +_,23 @@
@@ -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)) {
@@ -22,7 +22,7 @@
+ if (entity instanceof net.minecraft.world.entity.player.Player player) {
+ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(player, org.bukkit.event.block.Action.PHYSICAL, pos, null, null, null);
+ } else {
+ cancellable = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
+ cancellable = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos));
+ level.getCraftServer().getPluginManager().callEvent((org.bukkit.event.entity.EntityInteractEvent) cancellable);
+ }
+
@@ -34,7 +34,7 @@
}
}
}
@@ -213,9 +_,9 @@
@@ -206,9 +_,9 @@
} else {
Tilt tilt = state.getValue(TILT);
if (tilt == Tilt.UNSTABLE) {
@@ -46,7 +46,7 @@
} else if (tilt == Tilt.FULL) {
resetTilt(state, level, pos);
}
@@ -238,8 +_,11 @@
@@ -231,8 +_,11 @@
return entity.onGround() && entity.position().y > pos.getY() + 0.6875F;
}
@@ -60,7 +60,7 @@
if (sound != null) {
playTiltSound(level, pos, sound);
}
@@ -251,18 +_,26 @@
@@ -244,18 +_,26 @@
}
private static void resetTilt(BlockState state, Level level, BlockPos pos) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/Block.java
+++ b/net/minecraft/world/level/block/Block.java
@@ -90,6 +_,21 @@
@@ -99,6 +_,21 @@
public static final int UPDATE_LIMIT = 512;
protected final StateDefinition<Block, BlockState> stateDefinition;
private BlockState defaultBlockState;
@@ -22,7 +22,7 @@
@Nullable
private Item item;
private static final int CACHE_SIZE = 256;
@@ -272,6 +_,27 @@
@@ -318,6 +_,27 @@
return state.getDrops(builder);
}
@@ -49,8 +49,8 @@
+
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 +_,14 @@
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) {
@@ -60,13 +60,13 @@
+ 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, dropExperience); // Paper - Properly handle xp dropping
}
}
@@ -320,13 +_,24 @@
@@ -366,13 +_,25 @@
if (level instanceof ServerLevel serverLevel && !stack.isEmpty() && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS)) {
ItemEntity itemEntity = itemEntitySupplier.get();
itemEntity.setDefaultPickUpDelay();
@@ -85,7 +85,8 @@
+ // Paper start - add entity parameter
+ popExperience(level, pos, amount, null);
+ }
+ public void popExperience(ServerLevel level, BlockPos pos, int amount, net.minecraft.world.entity.Entity entity) {
+
+ public void popExperience(ServerLevel level, BlockPos pos, int amount, @Nullable net.minecraft.world.entity.Entity entity) {
+ // Paper end - add entity parameter
if (level.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS)) {
- ExperienceOrb.award(level, Vec3.atCenterOf(pos), amount);
@@ -93,17 +94,18 @@
}
}
@@ -345,10 +_,18 @@
@@ -391,10 +_,19 @@
return this.defaultBlockState();
}
+ @io.papermc.paper.annotation.DoNotUse @Deprecated // Paper - fix drops not preventing stats/food exhaustion
+ @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper - fix drops not preventing stats/food exhaustion
public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool) {
+ // Paper start - fix drops not preventing stats/food exhaustion
+ // Paper start - fix drops not preventing stats/food exhaustion
+ this.playerDestroy(level, player, pos, state, blockEntity, tool, true, true);
+ }
+
+ public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack tool, boolean includeDrops, boolean dropExp) {
+ // Paper end - fix drops not preventing stats/food exhaustion
+ // Paper end - fix drops not preventing stats/food exhaustion
player.awardStat(Stats.BLOCK_MINED.get(this));
- player.causeFoodExhaustion(0.005F);
- dropResources(state, level, pos, blockEntity, player, tool);
@@ -114,7 +116,7 @@
}
public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) {
@@ -469,12 +_,33 @@
@@ -533,12 +_,20 @@
return this.builtInRegistryHolder;
}
@@ -123,32 +125,18 @@
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;
+ // CraftBukkit end
+ }
+ return 0; // CraftBukkit
}
- }
+ return 0;
+ }
+ // CraftBukkit start
+
+ public int getExpDrop(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropExperience) {
+ return 0;
+ }
+ // CraftBukkit end
+
+ // Spigot start
+ public static float range(float min, float value, float max) {
+ if (value < min) {
+ return min;
+ }
+ if (value > max) {
+ return max;
+ }
+ return value;
+ }
+ // Spigot end
record ShapePairKey(VoxelShape first, VoxelShape second) {
@Override

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/BrewingStandBlock.java
+++ b/net/minecraft/world/level/block/BrewingStandBlock.java
@@ -68,8 +_,7 @@
@@ -63,8 +_,7 @@
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {

View File

@@ -1,10 +1,10 @@
--- a/net/minecraft/world/level/block/BubbleColumnBlock.java
+++ b/net/minecraft/world/level/block/BubbleColumnBlock.java
@@ -48,6 +_,7 @@
@@ -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
BlockState blockState = level.getBlockState(pos.above());
if (blockState.isAir()) {
entity.onAboveBubbleCol(state.getValue(DRAG_DOWN));
boolean flag = blockState.getCollisionShape(level, pos).isEmpty() && blockState.getFluidState().isEmpty();
if (flag) {

View File

@@ -3,13 +3,13 @@
@@ -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) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, blockState1, 3); // CraftBukkit
+ } else {
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, blockPos, blockState1);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, blockPos, blockState1, 3);
+ }
+ // Paper end - Have Amethyst throw both spread and grow events
}

View File

@@ -1,21 +0,0 @@
--- a/net/minecraft/world/level/block/BushBlock.java
+++ b/net/minecraft/world/level/block/BushBlock.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

View File

@@ -1,12 +1,12 @@
--- a/net/minecraft/world/level/block/ButtonBlock.java
+++ b/net/minecraft/world/level/block/ButtonBlock.java
@@ -114,6 +_,19 @@
@@ -89,6 +_,19 @@
if (state.getValue(POWERED)) {
return InteractionResult.CONSUME;
} else {
+ // CraftBukkit start
+ boolean powered = state.getValue(ButtonBlock.POWERED);
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int old = (powered) ? 15 : 0;
+ int current = (!powered) ? 15 : 0;
+
@@ -20,21 +20,21 @@
this.press(state, level, pos, player);
return InteractionResult.SUCCESS;
}
@@ -179,6 +_,7 @@
@@ -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 +_,31 @@
@@ -161,7 +_,31 @@
: null;
boolean flag = abstractArrow != null;
boolean poweredValue = state.getValue(POWERED);
+ // CraftBukkit start - Call interact event when arrows turn on wooden buttons
+ if (poweredValue != flag && flag) {
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(abstractArrow.getBukkitEntity(), block);
+ level.getCraftServer().getPluginManager().callEvent(event);
+
@@ -46,7 +46,7 @@
if (flag != poweredValue) {
+ // CraftBukkit start
+ boolean powered = poweredValue;
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int old = (powered) ? 15 : 0;
+ int current = (!powered) ? 15 : 0;
+
@@ -57,6 +57,6 @@
+ 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);

View File

@@ -1,30 +1,46 @@
--- a/net/minecraft/world/level/block/CactusBlock.java
+++ b/net/minecraft/world/level/block/CactusBlock.java
@@ -56,14 +_,16 @@
i++;
}
@@ -58,25 +_,29 @@
int ageValue = state.getValue(AGE);
- 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);
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;
}
}
@@ -113,7 +_,8 @@
if (ageValue == 8 && this.canSurvive(this.defaultBlockState(), level, pos.above())) {
- double d = i >= 3 ? 0.25 : 0.1;
+ double d = i >= level.paperConfig().maxGrowthHeight.cactus ? 0.25 : 0.1; // Paper - Configurable cactus/bamboo/reed growth height
if (random.nextDouble() <= d) {
- level.setBlockAndUpdate(blockPos, Blocks.CACTUS_FLOWER.defaultBlockState());
- }
- } else if (ageValue == 15 && i < 3) {
- level.setBlockAndUpdate(blockPos, this.defaultBlockState());
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, blockPos, Blocks.CACTUS_FLOWER.defaultBlockState(), 3);
+ }
+ } else if (ageValue == 15 && i < level.paperConfig().maxGrowthHeight.cactus) { // Paper - Configurable cactus/bamboo/reed growth height
+ // Paper start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, blockPos, this.defaultBlockState(), 3)) {
+ return;
+ }
+ // Paper end
BlockState blockState = state.setValue(AGE, 0);
level.setBlock(pos, blockState, 260);
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) {
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

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/CakeBlock.java
+++ b/net/minecraft/world/level/block/CakeBlock.java
@@ -67,6 +_,12 @@
@@ -57,6 +_,12 @@
) {
Item item = stack.getItem();
if (stack.is(ItemTags.CANDLES) && state.getValue(BITES) == 0 && Block.byItem(item) instanceof CandleBlock candleBlock) {
@@ -13,7 +13,7 @@
stack.consume(1, player);
level.playSound(null, pos, SoundEvents.CAKE_ADD_CANDLE, SoundSource.BLOCKS, 1.0F, 1.0F);
level.setBlockAndUpdate(pos, CandleCakeBlock.byCandle(candleBlock));
@@ -97,9 +_,28 @@
@@ -87,9 +_,28 @@
if (!player.canEat(false)) {
return InteractionResult.PASS;
} else {
@@ -43,4 +43,4 @@
+ // Paper - move up
level.gameEvent(player, GameEvent.EAT, pos);
if (bitesValue < 6) {
level.setBlock(pos, state.setValue(BITES, Integer.valueOf(bitesValue + 1)), 3);
level.setBlock(pos, state.setValue(BITES, bitesValue + 1), 3);

View File

@@ -1,17 +1,17 @@
--- a/net/minecraft/world/level/block/CampfireBlock.java
+++ b/net/minecraft/world/level/block/CampfireBlock.java
@@ -112,8 +_,9 @@
@@ -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 +_,11 @@
super.entityInside(state, level, pos, entity, effectApplier);
@@ -220,6 +_,11 @@
&& projectile.mayInteract(serverLevel, blockPos)
&& !state.getValue(LIT)
&& !state.getValue(WATERLOGGED)) {
@@ -20,6 +20,6 @@
+ return;
+ }
+ // CraftBukkit end
level.setBlock(blockPos, state.setValue(BlockStateProperties.LIT, Boolean.valueOf(true)), 11);
level.setBlock(blockPos, state.setValue(BlockStateProperties.LIT, true), 11);
}
}

View File

@@ -1,18 +1,19 @@
--- a/net/minecraft/world/level/block/CarvedPumpkinBlock.java
+++ b/net/minecraft/world/level/block/CarvedPumpkinBlock.java
@@ -79,9 +_,13 @@
@@ -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);

View File

@@ -24,4 +24,4 @@
+ // CraftBukkit end
float f = Mth.randomBetween(level.random, 0.8F, 1.2F);
level.playSound(null, pos, SoundEvents.CAVE_VINES_PICK_BERRIES, SoundSource.BLOCKS, 1.0F, f);
BlockState blockState = state.setValue(BERRIES, Boolean.valueOf(false));
BlockState blockState = state.setValue(BERRIES, false);

View File

@@ -4,9 +4,9 @@
@Override
protected BlockState getGrowIntoState(BlockState state, RandomSource random) {
- return super.getGrowIntoState(state, random).setValue(BERRIES, Boolean.valueOf(random.nextFloat() < 0.11F));
- return super.getGrowIntoState(state, random).setValue(BERRIES, random.nextFloat() < 0.11F);
- }
+ // Paper start - Fix Spigot growth modifiers
+ // Paper start - Fix Spigot growth modifiers
+ return this.getGrowIntoState(state, random, null);
+ }
+ @Override

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/CeilingHangingSignBlock.java
+++ b/net/minecraft/world/level/block/CeilingHangingSignBlock.java
@@ -184,6 +_,6 @@
@@ -166,6 +_,6 @@
@Nullable
@Override
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> blockEntityType) {

View File

@@ -5,7 +5,7 @@
float f = 0.05688889F;
if (random.nextFloat() < 0.05688889F) {
- this.getNextState(state, level, pos, random).ifPresent(blockState -> level.setBlockAndUpdate(pos, blockState));
+ this.getNextState(state, level, pos, random).ifPresent(blockState -> org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, blockState)); // CraftBukkit
+ this.getNextState(state, level, pos, random).ifPresent(blockState -> org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, blockState, 3)); // CraftBukkit
}
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/ChestBlock.java
+++ b/net/minecraft/world/level/block/ChestBlock.java
@@ -85,7 +_,7 @@
@@ -82,7 +_,7 @@
@Override
public Optional<MenuProvider> acceptDouble(final ChestBlockEntity first, final ChestBlockEntity second) {
final Container container = new CompoundContainer(first, second);
@@ -9,7 +9,7 @@
@Nullable
@Override
public AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) {
@@ -103,10 +_,10 @@
@@ -100,10 +_,10 @@
if (first.hasCustomName()) {
return first.getDisplayName();
} else {
@@ -22,7 +22,7 @@
}
@Override
@@ -120,6 +_,34 @@
@@ -117,6 +_,34 @@
}
};
@@ -57,7 +57,7 @@
@Override
public MapCodec<? extends ChestBlock> codec() {
return CODEC;
@@ -245,8 +_,7 @@
@@ -225,8 +_,7 @@
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
if (level instanceof ServerLevel serverLevel) {
MenuProvider menuProvider = this.getMenuProvider(state, level, pos);
@@ -67,7 +67,7 @@
player.awardStat(this.getOpenChestStat());
PiglinAi.angerNearbyPiglins(serverLevel, player, true);
}
@@ -285,7 +_,14 @@
@@ -265,7 +_,14 @@
@Nullable
@Override
public MenuProvider getMenuProvider(BlockState state, Level level, BlockPos pos) {
@@ -83,7 +83,7 @@
}
public static DoubleBlockCombiner.Combiner<ChestBlockEntity, Float2FloatFunction> opennessCombiner(final LidBlockEntity lid) {
@@ -328,6 +_,11 @@
@@ -308,6 +_,11 @@
}
private static boolean isCatSittingOnChest(LevelAccessor level, BlockPos pos) {

View File

@@ -4,18 +4,18 @@
}
if (flag && allNeighborsEmpty(level, blockPos, null) && level.isEmptyBlock(pos.above(2))) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, this.defaultBlockState().setValue(ChorusFlowerBlock.AGE, ageValue), 2)) { // CraftBukkit - add event
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, this.defaultBlockState().setValue(AGE, ageValue), 2)) { // CraftBukkit - add event
level.setBlock(pos, ChorusPlantBlock.getStateWithConnections(level, pos, this.plant.defaultBlockState()), 2);
this.placeGrownFlower(level, blockPos, ageValue);
+ } // CraftBukkit
} else if (ageValue < 4) {
int i = random.nextInt(4);
if (flag1) {
@@ -112,18 +_,28 @@
@@ -112,30 +_,40 @@
if (level.isEmptyBlock(blockPos1)
&& level.isEmptyBlock(blockPos1.below())
&& allNeighborsEmpty(level, blockPos1, randomDirection.getOpposite())) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos1, this.defaultBlockState().setValue(ChorusFlowerBlock.AGE, ageValue + 1), 2)) { // CraftBukkit - add event
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos1, this.defaultBlockState().setValue(AGE, ageValue + 1), 2)) { // CraftBukkit - add event
this.placeGrownFlower(level, blockPos1, ageValue + 1);
flag2 = true;
+ } // CraftBukkit
@@ -26,20 +26,34 @@
level.setBlock(pos, ChorusPlantBlock.getStateWithConnections(level, pos, this.plant.defaultBlockState()), 2);
} else {
+ // CraftBukkit start - add event
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, this.defaultBlockState().setValue(ChorusFlowerBlock.AGE, Integer.valueOf(5)), 2)) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, this.defaultBlockState().setValue(AGE, 5), 2)) {
this.placeDeadFlower(level, pos);
+ }
+ // CraftBukkit end
}
} else {
+ // CraftBukkit start - add event
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, this.defaultBlockState().setValue(ChorusFlowerBlock.AGE, Integer.valueOf(5)), 2)) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, this.defaultBlockState().setValue(AGE, 5), 2)) {
this.placeDeadFlower(level, pos);
+ }
+ // CraftBukkit end
}
}
}
}
private void placeGrownFlower(Level level, BlockPos pos, int age) {
- level.setBlock(pos, this.defaultBlockState().setValue(AGE, age), 2);
+ // level.setBlock(pos, this.defaultBlockState().setValue(AGE, age), 2); // Paper - already done above in the event call
level.levelEvent(1033, pos, 0);
}
private void placeDeadFlower(Level level, BlockPos pos) {
- level.setBlock(pos, this.defaultBlockState().setValue(AGE, 5), 2);
+ // level.setBlock(pos, this.defaultBlockState().setValue(AGE, 5), 2); // Paper - already done above in the event call
level.levelEvent(1034, pos, 0);
}
@@ -261,6 +_,11 @@
protected void onProjectileHit(Level level, BlockState state, BlockHitResult hit, Projectile projectile) {
BlockPos blockPos = hit.getBlockPos();

View File

@@ -1,24 +1,24 @@
--- a/net/minecraft/world/level/block/CocoaBlock.java
+++ b/net/minecraft/world/level/block/CocoaBlock.java
@@ -64,10 +_,10 @@
@@ -50,10 +_,10 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
- if (level.random.nextInt(5) == 0) {
+ if (level.random.nextFloat() < (level.spigotConfig.cocoaModifier / (100.0f * 5))) { // Spigot - SPIGOT-7159: Better modifier resolution
+ 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);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(CocoaBlock.AGE, ageValue + 1), 2); // CraftBukkit
- level.setBlock(pos, state.setValue(AGE, ageValue + 1), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(AGE, ageValue + 1), 2); // CraftBukkit
}
}
}
@@ -141,7 +_,7 @@
@@ -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);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(CocoaBlock.AGE, state.getValue(CocoaBlock.AGE) + 1), 2); // CraftBukkit
- level.setBlock(pos, state.setValue(AGE, state.getValue(AGE) + 1), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(AGE, state.getValue(AGE) + 1), 2); // CraftBukkit
}
@Override

View File

@@ -5,7 +5,7 @@
private void setPoweredAndUpdate(Level level, BlockPos pos, CommandBlockEntity blockEntity, boolean powered) {
boolean isPowered = blockEntity.isPowered();
+ // CraftBukkit start
+ org.bukkit.block.Block bukkitBlock = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ org.bukkit.block.Block bukkitBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int old = isPowered ? 15 : 0;
+ int current = powered ? 15 : 0;
+

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/ComparatorBlock.java
+++ b/net/minecraft/world/level/block/ComparatorBlock.java
@@ -170,8 +_,18 @@
@@ -168,8 +_,18 @@
boolean shouldTurnOn = this.shouldTurnOn(level, pos, state);
boolean poweredValue = state.getValue(POWERED);
if (poweredValue && !shouldTurnOn) {
@@ -9,13 +9,13 @@
+ 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);
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/ComposterBlock.java
+++ b/net/minecraft/world/level/block/ComposterBlock.java
@@ -243,6 +_,11 @@
@@ -252,6 +_,11 @@
if (levelValue < 8 && COMPOSTABLES.containsKey(stack.getItem())) {
if (levelValue < 7 && !level.isClientSide) {
BlockState blockState = addItem(player, state, level, pos, stack);
@@ -12,7 +12,7 @@
level.levelEvent(1500, pos, state != blockState ? 1 : 0);
player.awardStat(Stats.ITEM_USED.get(stack.getItem()));
stack.consume(1, player);
@@ -268,7 +_,19 @@
@@ -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())) {
@@ -33,7 +33,7 @@
stack.shrink(1);
return blockState;
} else {
@@ -277,6 +_,14 @@
@@ -286,6 +_,14 @@
}
public static BlockState extractProduce(Entity entity, BlockState state, Level level, BlockPos pos) {
@@ -48,7 +48,7 @@
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 +_,39 @@
@@ -305,14 +_,39 @@
return blockState;
}
@@ -80,7 +80,7 @@
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;
@@ -89,7 +89,7 @@
level.setBlock(pos, blockState, 3);
level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(entity, blockState));
if (i == 7) {
@@ -348,13 +_,14 @@
@@ -357,13 +_,14 @@
if (levelValue == 8) {
return new ComposterBlock.OutputContainer(state, level, pos, new ItemStack(Items.BONE_MEAL));
} else {
@@ -106,7 +106,7 @@
}
@Override
@@ -381,6 +_,7 @@
@@ -390,6 +_,7 @@
public InputContainer(BlockState state, LevelAccessor level, BlockPos pos) {
super(1);
@@ -114,7 +114,7 @@
this.state = state;
this.level = level;
this.pos = pos;
@@ -412,6 +_,11 @@
@@ -421,6 +_,11 @@
if (!item.isEmpty()) {
this.changed = true;
BlockState blockState = ComposterBlock.addItem(null, this.state, this.level, this.pos, item);
@@ -126,7 +126,7 @@
this.level.levelEvent(1500, this.pos, blockState != this.state ? 1 : 0);
this.removeItemNoUpdate(0);
}
@@ -426,6 +_,7 @@
@@ -435,6 +_,7 @@
public OutputContainer(BlockState state, LevelAccessor level, BlockPos pos, ItemStack stack) {
super(stack);
@@ -134,7 +134,7 @@
this.state = state;
this.level = level;
this.pos = pos;
@@ -453,8 +_,15 @@
@@ -462,8 +_,15 @@
@Override
public void setChanged() {

View File

@@ -9,6 +9,6 @@
+ 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);
}
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/CoralPlantBlock.java
+++ b/net/minecraft/world/level/block/CoralPlantBlock.java
@@ -43,6 +_,11 @@
@@ -42,6 +_,11 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (!scanForWater(state, level, pos)) {
@@ -9,6 +9,6 @@
+ 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);
}
}

View File

@@ -9,6 +9,6 @@
+ 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);
}
}

View File

@@ -1,19 +1,11 @@
--- a/net/minecraft/world/level/block/CrafterBlock.java
+++ b/net/minecraft/world/level/block/CrafterBlock.java
@@ -11,6 +_,7 @@
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.RandomSource;
+import net.minecraft.world.CompoundContainer;
import net.minecraft.world.Container;
import net.minecraft.world.Containers;
import net.minecraft.world.InteractionResult;
@@ -159,6 +_,13 @@
@@ -152,6 +_,13 @@
} else {
RecipeHolder<CraftingRecipe> recipeHolder = potentialResults.get();
ItemStack itemStack = recipeHolder.value().assemble(var11, level.registryAccess());
+ // CraftBukkit start
+ org.bukkit.event.block.CrafterCraftEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callCrafterCraftEvent(pos, level, crafterBlockEntity, itemStack, recipeHolder);
+ org.bukkit.event.block.CrafterCraftEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callCrafterCraftEvent(pos, level, itemStack, recipeHolder);
+ if (event.isCancelled()) {
+ return;
+ }
@@ -22,7 +14,7 @@
if (itemStack.isEmpty()) {
level.levelEvent(1050, pos, 0);
} else {
@@ -193,7 +_,25 @@
@@ -186,7 +_,25 @@
Container containerAt = HopperBlockEntity.getContainerAt(level, pos.relative(direction));
ItemStack itemStack = stack.copy();
if (containerAt != null && (containerAt instanceof CrafterBlockEntity || stack.getCount() > containerAt.getMaxStackSize(stack))) {
@@ -31,7 +23,7 @@
+
+ org.bukkit.inventory.Inventory destinationInventory;
+ // Have to special case large chests as they work oddly
+ if (containerAt instanceof CompoundContainer compoundContainer) {
+ if (containerAt instanceof net.minecraft.world.CompoundContainer compoundContainer) {
+ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest(compoundContainer);
+ } else {
+ destinationInventory = containerAt.getOwner().getInventory();
@@ -48,7 +40,7 @@
ItemStack itemStack1 = itemStack.copyWithCount(1);
ItemStack itemStack2 = HopperBlockEntity.addItem(crafter, containerAt, itemStack1, direction.getOpposite());
if (!itemStack2.isEmpty()) {
@@ -203,7 +_,25 @@
@@ -196,7 +_,25 @@
itemStack.shrink(1);
}
} else if (containerAt != null) {
@@ -57,7 +49,7 @@
+
+ org.bukkit.inventory.Inventory destinationInventory;
+ // Have to special case large chests as they work oddly
+ if (containerAt instanceof CompoundContainer compoundContainer) {
+ if (containerAt instanceof net.minecraft.world.CompoundContainer compoundContainer) {
+ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest(compoundContainer);
+ } else {
+ destinationInventory = containerAt.getOwner().getInventory();

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/CropBlock.java
+++ b/net/minecraft/world/level/block/CropBlock.java
@@ -88,8 +_,25 @@
@@ -80,8 +_,25 @@
int age = this.getAge(state);
if (age < this.getMaxAge()) {
float growthSpeed = getGrowthSpeed(this, level, pos);
@@ -22,25 +22,25 @@
+ modifier = level.spigotConfig.wheatModifier;
+ }
+
+ if (random.nextFloat() < (modifier / (100.0f * (Math.floor((25.0F / growthSpeed) + 1))))) { // Spigot - SPIGOT-7159: Better modifier resolution
+ if (random.nextFloat() < (modifier / (100.0F * (Math.floor((25.0F / growthSpeed) + 1))))) { // Spigot - SPIGOT-7159: Better modifier resolution
+ // Spigot end
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, this.getStateForAge(age + 1), 2); // CraftBukkit
}
}
}
@@ -102,7 +_,7 @@
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 +_,8 @@
@@ -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

View File

@@ -5,6 +5,6 @@
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);
level.setBlock(pos, state.setValue(POWER, i), 3);
}
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/DecoratedPotBlock.java
+++ b/net/minecraft/world/level/block/DecoratedPotBlock.java
@@ -237,6 +_,11 @@
@@ -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)) {
@@ -9,6 +9,6 @@
+ 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);
}

View File

@@ -1,14 +1,14 @@
--- a/net/minecraft/world/level/block/DetectorRailBlock.java
+++ b/net/minecraft/world/level/block/DetectorRailBlock.java
@@ -54,6 +_,7 @@
@@ -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 +_,7 @@
@@ -79,6 +_,7 @@
private void checkPressed(Level level, BlockPos pos, BlockState state) {
if (this.canSurvive(state, level, pos)) {
@@ -16,13 +16,13 @@
boolean poweredValue = state.getValue(POWERED);
boolean flag = false;
List<AbstractMinecart> interactingMinecartOfType = this.getInteractingMinecartOfType(level, pos, AbstractMinecart.class, entity -> true);
@@ -91,6 +_,16 @@
@@ -86,6 +_,16 @@
flag = true;
}
+ // CraftBukkit start
+ if (poweredValue != flag) {
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(block, flag ? 15 : 0, flag ? 15 : 0);
+ level.getCraftServer().getPluginManager().callEvent(eventRedstone);
@@ -31,5 +31,5 @@
+ }
+ // CraftBukkit end
if (flag && !poweredValue) {
BlockState blockState = state.setValue(POWERED, Boolean.valueOf(true));
BlockState blockState = state.setValue(POWERED, true);
level.setBlock(pos, blockState, 3);

View File

@@ -9,13 +9,13 @@
+ 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);

View File

@@ -1,13 +1,5 @@
--- a/net/minecraft/world/level/block/DispenserBlock.java
+++ b/net/minecraft/world/level/block/DispenserBlock.java
@@ -50,6 +_,7 @@
private static final DefaultDispenseItemBehavior DEFAULT_BEHAVIOR = new DefaultDispenseItemBehavior();
public static final Map<Item, DispenseItemBehavior> DISPENSER_REGISTRY = new IdentityHashMap<>();
private static final int TRIGGER_DURATION = 4;
+ public static boolean eventFired = false; // CraftBukkit
@Override
public MapCodec<? extends DispenserBlock> codec() {
@@ -71,8 +_,7 @@
@Override
@@ -18,7 +10,7 @@
player.awardStat(dispenserBlockEntity instanceof DropperBlockEntity ? Stats.INSPECT_DROPPER : Stats.INSPECT_DISPENSER);
}
@@ -87,18 +_,27 @@
@@ -87,17 +_,26 @@
BlockSource blockSource = new BlockSource(level, pos, state, dispenserBlockEntity);
int randomSlot = dispenserBlockEntity.getRandomSlot(level.random);
if (randomSlot < 0) {
@@ -31,18 +23,17 @@
DispenseItemBehavior dispenseMethod = this.getDispenseMethod(level, item);
if (dispenseMethod != DispenseItemBehavior.NOOP) {
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockPreDispenseEvent(level, pos, item, randomSlot)) return; // Paper - Add BlockPreDispenseEvent
+ DispenserBlock.eventFired = false; // CraftBukkit - reset event status
dispenserBlockEntity.setItem(randomSlot, dispenseMethod.dispense(blockSource, item));
}
}
}
}
+
+ // Paper start - Fix NPE with equippable and items without behavior
+ public static DispenseItemBehavior getDispenseBehavior(BlockSource pointer, ItemStack stack) {
+ return ((DispenserBlock) pointer.state().getBlock()).getDispenseMethod(pointer.level(), stack);
+ }
+ // Paper end - Fix NPE with equippable and items without behavior
protected DispenseItemBehavior getDispenseMethod(Level level, ItemStack item) {
if (!item.isItemEnabled(level.enabledFeatures())) {
return DEFAULT_BEHAVIOR;

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/DoorBlock.java
+++ b/net/minecraft/world/level/block/DoorBlock.java
@@ -229,9 +_,22 @@
@@ -222,9 +_,22 @@
@Override
protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/DoublePlantBlock.java
+++ b/net/minecraft/world/level/block/DoublePlantBlock.java
@@ -112,11 +_,16 @@
@@ -110,11 +_,16 @@
}
@Override

View File

@@ -1,22 +1,5 @@
--- a/net/minecraft/world/level/block/DropperBlock.java
+++ b/net/minecraft/world/level/block/DropperBlock.java
@@ -8,6 +_,7 @@
import net.minecraft.core.dispenser.DefaultDispenseItemBehavior;
import net.minecraft.core.dispenser.DispenseItemBehavior;
import net.minecraft.server.level.ServerLevel;
+import net.minecraft.world.CompoundContainer;
import net.minecraft.world.Container;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
@@ -23,7 +_,7 @@
public class DropperBlock extends DispenserBlock {
private static final Logger LOGGER = LogUtils.getLogger();
public static final MapCodec<DropperBlock> CODEC = simpleCodec(DropperBlock::new);
- private static final DispenseItemBehavior DISPENSE_BEHAVIOUR = new DefaultDispenseItemBehavior();
+ private static final DispenseItemBehavior DISPENSE_BEHAVIOUR = new DefaultDispenseItemBehavior(true); // CraftBukkit
@Override
public MapCodec<DropperBlock> codec() {
@@ -53,6 +_,7 @@
BlockSource blockSource = new BlockSource(level, pos, state, dispenserBlockEntity);
int randomSlot = dispenserBlockEntity.getRandomSlot(level.random);
@@ -39,7 +22,7 @@
+
+ org.bukkit.inventory.Inventory destinationInventory;
+ // Have to special case large chests as they work oddly
+ if (containerAt instanceof CompoundContainer compoundContainer) {
+ if (containerAt instanceof net.minecraft.world.CompoundContainer compoundContainer) {
+ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest(compoundContainer);
+ } else {
+ destinationInventory = containerAt.getOwner().getInventory();

View File

@@ -1,22 +1,22 @@
--- a/net/minecraft/world/level/block/EndGatewayBlock.java
+++ b/net/minecraft/world/level/block/EndGatewayBlock.java
@@ -89,10 +_,15 @@
@@ -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
&& level.getBlockEntity(pos) instanceof TheEndGatewayBlockEntity theEndGatewayBlockEntity
&& !theEndGatewayBlockEntity.isCoolingDown()) {
+ // Paper start - call EntityPortalEnterEvent
+ org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(level.getWorld(), pos.getX(), pos.getY(), pos.getZ()), org.bukkit.PortalType.END_GATEWAY); // Paper - add portal type
+ org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.END_GATEWAY); // Paper - add portal type
+ if (!event.callEvent()) return;
+ // Paper end - call EntityPortalEnterEvent
entity.setAsInsidePortal(this, pos);
TheEndGatewayBlockEntity.triggerCooldown(level, pos, state, theEndGatewayBlockEntity);
}
@@ -107,9 +_,9 @@
@@ -108,9 +_,9 @@
return null;
} else {
return entity instanceof ThrownEnderpearl

View File

@@ -1,13 +1,13 @@
--- a/net/minecraft/world/level/block/EndPortalBlock.java
+++ b/net/minecraft/world/level/block/EndPortalBlock.java
@@ -56,8 +_,15 @@
@@ -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
+ org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(level.getWorld(), pos.getX(), pos.getY(), pos.getZ()), org.bukkit.PortalType.ENDER); // Paper - add portal type
+ org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.ENDER); // Paper - add portal type
+ level.getCraftServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) return; // Paper - make cancellable
+ // CraftBukkit end
@@ -16,7 +16,7 @@
serverPlayer.showEndCredits();
} else {
entity.setAsInsidePortal(this, pos);
@@ -67,7 +_,7 @@
@@ -68,7 +_,7 @@
@Override
public TeleportTransition getPortalDestination(ServerLevel level, Entity entity, BlockPos pos) {
@@ -25,7 +25,7 @@
ServerLevel level1 = level.getServer().getLevel(resourceKey);
if (level1 == null) {
return null;
@@ -78,7 +_,7 @@
@@ -79,7 +_,7 @@
float f;
Set<Relative> set;
if (flag) {
@@ -34,7 +34,7 @@
f = Direction.WEST.toYRot();
set = Relative.union(Relative.DELTA, Set.of(Relative.X_ROT));
if (entity instanceof ServerPlayer) {
@@ -88,15 +_,23 @@
@@ -89,15 +_,23 @@
f = 0.0F;
set = Relative.union(Relative.DELTA, Relative.ROTATION);
if (entity instanceof ServerPlayer serverPlayer) {
@@ -57,7 +57,7 @@
+ }
+ org.bukkit.Location to = event.getTo();
+
+ return new TeleportTransition(((org.bukkit.craftbukkit.CraftWorld) to.getWorld()).getHandle(), org.bukkit.craftbukkit.util.CraftLocation.toVec3D(to), Vec3.ZERO, to.getYaw(), to.getPitch(), set, TeleportTransition.PLAY_PORTAL_SOUND.then(TeleportTransition.PLACE_PORTAL_TICKET), org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_PORTAL);
+ return new TeleportTransition(((org.bukkit.craftbukkit.CraftWorld) to.getWorld()).getHandle(), org.bukkit.craftbukkit.util.CraftLocation.toVec3(to), Vec3.ZERO, to.getYaw(), to.getPitch(), set, TeleportTransition.PLAY_PORTAL_SOUND.then(TeleportTransition.PLACE_PORTAL_TICKET), org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_PORTAL);
+ // CraftBukkit end
}
}

View File

@@ -1,9 +1,9 @@
--- a/net/minecraft/world/level/block/EyeblossomBlock.java
+++ b/net/minecraft/world/level/block/EyeblossomBlock.java
@@ -99,6 +_,7 @@
@@ -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

View File

@@ -8,22 +8,22 @@
+ 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);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleMoistureChangeEvent(level, pos, state.setValue(FarmBlock.MOISTURE, moistureValue - 1), 2); // CraftBukkit
- level.setBlock(pos, state.setValue(MOISTURE, moistureValue - 1), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleMoistureChangeEvent(level, pos, state.setValue(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);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleMoistureChangeEvent(level, pos, state.setValue(FarmBlock.MOISTURE, 7), 2); // CraftBukkit
- level.setBlock(pos, state.setValue(MOISTURE, 7), 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleMoistureChangeEvent(level, pos, state.setValue(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) {
@@ -32,7 +32,7 @@
+ if (entity instanceof Player) {
+ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((Player) entity, org.bukkit.event.block.Action.PHYSICAL, pos, null, null, null);
+ } else {
+ cancellable = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
+ cancellable = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos));
+ level.getCraftServer().getPluginManager().callEvent((org.bukkit.event.entity.EntityInteractEvent) cancellable);
+ }
+

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/FenceGateBlock.java
+++ b/net/minecraft/world/level/block/FenceGateBlock.java
@@ -213,6 +_,17 @@
@@ -199,6 +_,17 @@
protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
if (!level.isClientSide) {
boolean hasNeighborSignal = level.hasNeighborSignal(pos);
@@ -16,5 +16,5 @@
+ }
+ // CraftBukkit end
if (state.getValue(POWERED) != hasNeighborSignal) {
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(hasNeighborSignal)).setValue(OPEN, Boolean.valueOf(hasNeighborSignal)), 2);
level.setBlock(pos, state.setValue(POWERED, hasNeighborSignal).setValue(OPEN, hasNeighborSignal), 2);
if (state.getValue(OPEN) != hasNeighborSignal) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/FireBlock.java
+++ b/net/minecraft/world/level/block/FireBlock.java
@@ -122,7 +_,25 @@
@@ -101,7 +_,25 @@
BlockState neighborState,
RandomSource random
) {
@@ -27,95 +27,94 @@
}
@Override
@@ -162,10 +_,10 @@
@@ -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 +_,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
}
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 +_,15 @@
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 blockPos 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).is(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 +_,42 @@
@@ -237,19 +_,40 @@
: this.igniteOdds.getInt(state.getBlock());
}
- private void checkBurnOut(Level level, BlockPos pos, int chance, RandomSource random, int age) {
+ private void checkBurnOut(Level level, BlockPos pos, int chance, RandomSource random, int age, BlockPos sourceposition) { // CraftBukkit add sourceposition
+ private void checkBurnOut(Level level, BlockPos pos, int chance, RandomSource random, int age, BlockPos sourcePos) { // CraftBukkit add sourcePos
int burnOdds = this.getBurnOdds(level.getBlockState(pos));
if (random.nextInt(chance) < burnOdds) {
BlockState blockState = level.getBlockState(pos);
+
+ // CraftBukkit start
+ org.bukkit.block.Block theBlock = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ org.bukkit.block.Block sourceBlock = level.getWorld().getBlockAt(sourceposition.getX(), sourceposition.getY(), sourceposition.getZ());
+ org.bukkit.block.Block burnBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.block.Block sourceBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, sourcePos);
+
+ org.bukkit.event.block.BlockBurnEvent event = new org.bukkit.event.block.BlockBurnEvent(theBlock, sourceBlock);
+ level.getCraftServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
+ org.bukkit.event.block.BlockBurnEvent event = new org.bukkit.event.block.BlockBurnEvent(burnBlock, sourceBlock);
+ if (!event.callEvent()) {
+ return;
+ }
+
+ if (blockState.getBlock() instanceof TntBlock && !org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.FIRE, null, sourceposition)) {
+ if (blockState.getBlock() instanceof TntBlock && !org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.FIRE, null, sourcePos)) {
+ return;
+ }
+ // CraftBukkit end
@@ -136,10 +135,10 @@
+ }
+ level.removeBlock(pos, false);
+ // Paper end - TNTPrimeEvent
TntBlock.explode(level, pos);
TntBlock.prime(level, pos);
}
}
@@ -310,13 +_,14 @@
@@ -291,13 +_,14 @@
}
@Override

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/FlowerPotBlock.java
+++ b/net/minecraft/world/level/block/FlowerPotBlock.java
@@ -67,6 +_,18 @@
@@ -66,6 +_,18 @@
} else if (!this.isEmpty()) {
return InteractionResult.CONSUME;
} else {
@@ -19,7 +19,7 @@
level.setBlock(pos, blockState, 3);
level.gameEvent(player, GameEvent.BLOCK_CHANGE, pos);
player.awardStat(Stats.POT_FLOWER);
@@ -81,6 +_,18 @@
@@ -80,6 +_,18 @@
return InteractionResult.CONSUME;
} else {
ItemStack itemStack = new ItemStack(this.potted);

View File

@@ -1,14 +1,14 @@
--- a/net/minecraft/world/level/block/FrogspawnBlock.java
+++ b/net/minecraft/world/level/block/FrogspawnBlock.java
@@ -89,6 +_,7 @@
@@ -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 +_,11 @@
@@ -102,6 +_,11 @@
}
private void hatchFrogspawn(ServerLevel level, BlockPos pos, RandomSource random) {
@@ -20,9 +20,9 @@
this.destroyBlock(level, pos);
level.playSound(null, pos, SoundEvents.FROGSPAWN_HATCH, SoundSource.BLOCKS, 1.0F, 1.0F);
this.spawnTadpoles(level, pos, random);
@@ -121,7 +_,7 @@
@@ -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

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/GrindstoneBlock.java
+++ b/net/minecraft/world/level/block/GrindstoneBlock.java
@@ -151,8 +_,7 @@
@@ -72,8 +_,7 @@
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {

View File

@@ -21,7 +21,7 @@
BlockPos blockPos = pos.relative(this.growthDirection);
if (this.canGrowInto(level.getBlockState(blockPos))) {
- level.setBlockAndUpdate(blockPos, this.getGrowIntoState(state, level.random));
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, this.getGrowIntoState(state, level.random, level)); // CraftBukkit // Paper - Fix Spigot growth modifiers
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, blockPos, this.getGrowIntoState(state, level.random, level), 3); // CraftBukkit // Paper - Fix Spigot growth modifiers
}
}
}

View File

@@ -1,9 +1,9 @@
--- a/net/minecraft/world/level/block/HoneyBlock.java
+++ b/net/minecraft/world/level/block/HoneyBlock.java
@@ -60,6 +_,7 @@
@@ -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);

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/HopperBlock.java
+++ b/net/minecraft/world/level/block/HopperBlock.java
@@ -125,8 +_,7 @@
@@ -106,8 +_,7 @@
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
@@ -10,10 +10,10 @@
player.awardStat(Stats.INSPECT_HOPPER);
}
@@ -178,6 +_,7 @@
@@ -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) {

View File

@@ -14,7 +14,7 @@
) {
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableMushroomBlockUpdates) return state; // Paper - add option to disable block updates
return neighborState.is(this)
? state.setValue(PROPERTY_BY_DIRECTION.get(direction), Boolean.valueOf(false))
? state.setValue(PROPERTY_BY_DIRECTION.get(direction), false)
: super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random);
@@ -74,6 +_,7 @@

View File

@@ -3,7 +3,7 @@
@@ -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();

View File

@@ -1,10 +1,15 @@
--- a/net/minecraft/world/level/block/LavaCauldronBlock.java
+++ b/net/minecraft/world/level/block/LavaCauldronBlock.java
@@ -32,6 +_,7 @@
@@ -33,9 +_,10 @@
@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.isEntityInsideContent(state, pos, entity)) {
entity.lavaHurt();
- entity.lavaIgnite();
- entity.lavaHurt();
+ entity.lavaIgnite(pos); // Paper - track lava contact
+ entity.lavaHurt(pos); // Paper - track lava contact
}
}

View File

@@ -1,9 +1,9 @@
--- a/net/minecraft/world/level/block/LayeredCauldronBlock.java
+++ b/net/minecraft/world/level/block/LayeredCauldronBlock.java
@@ -61,35 +_,68 @@
@@ -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();
@@ -22,32 +22,29 @@
- private void handleEntityOnFireInside(BlockState state, Level level, BlockPos pos) {
+ // CraftBukkit start
+ private boolean handleEntityOnFireInside(BlockState state, Level level, BlockPos pos, Entity entity) {
+ private boolean handleEntityOnFireInside(BlockState state, Level level, BlockPos pos, @javax.annotation.Nullable Entity entity) {
if (this.precipitationType == Biome.Precipitation.SNOW) {
- lowerFillLevel(Blocks.WATER_CAULDRON.defaultBlockState().setValue(LEVEL, state.getValue(LEVEL)), level, pos);
+ return LayeredCauldronBlock.lowerFillLevel((BlockState) Blocks.WATER_CAULDRON.defaultBlockState().setValue(LayeredCauldronBlock.LEVEL, (Integer) state.getValue(LayeredCauldronBlock.LEVEL)), level, pos, entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.EXTINGUISH); // CraftBukkit
+ return lowerFillLevel(Blocks.WATER_CAULDRON.defaultBlockState().setValue(LEVEL, state.getValue(LEVEL)), level, pos, entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.EXTINGUISH); // CraftBukkit
} else {
- lowerFillLevel(state, level, pos);
+ return LayeredCauldronBlock.lowerFillLevel(state, level, pos, entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.EXTINGUISH); // CraftBukkit
+ return lowerFillLevel(state, level, pos, entity, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.EXTINGUISH); // CraftBukkit
}
}
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
+ lowerFillLevel(state, level, pos, null, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.UNKNOWN);
+ }
+ public static boolean lowerFillLevel(BlockState state, Level level, BlockPos pos, @javax.annotation.Nullable 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);
+ return changeLevel(level, pos, blockState, entity, reason); // Paper
+ }
+ 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);
+ }
+
+ // 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
@@ -66,7 +63,7 @@
+ if (!event.callEvent()) {
+ return false;
+ }
+ newState.update(true);
+ newState.place(3);
+ if (sendGameEvent) level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(newBlock)); // Paper - Call CauldronLevelChangeEvent
+ return true;
+ }
@@ -78,18 +75,18 @@
BlockState blockState = state.cycle(LEVEL);
- level.setBlockAndUpdate(pos, blockState);
- level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(blockState));
+ LayeredCauldronBlock.changeLevel(level, pos, blockState, null, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.NATURAL_FILL); // CraftBukkit
+ changeLevel(level, pos, blockState, null, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.NATURAL_FILL); // CraftBukkit
}
}
@@ -107,8 +_,11 @@
@@ -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
+ if (!LayeredCauldronBlock.changeLevel(level, pos, blockState, null, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.NATURAL_FILL)) {
+ if (!changeLevel(level, pos, blockState, null, org.bukkit.event.block.CauldronLevelChangeEvent.ChangeReason.NATURAL_FILL)) {
+ return;
+ }
+ // CraftBukkit end

View File

@@ -1,14 +1,14 @@
--- a/net/minecraft/world/level/block/LeavesBlock.java
+++ b/net/minecraft/world/level/block/LeavesBlock.java
@@ -63,6 +_,14 @@
@@ -56,6 +_,14 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (this.decaying(state)) {
+ // CraftBukkit start
+ org.bukkit.event.block.LeavesDecayEvent event = new org.bukkit.event.block.LeavesDecayEvent(level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
+ org.bukkit.event.block.LeavesDecayEvent event = new org.bukkit.event.block.LeavesDecayEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos));
+ level.getCraftServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled() || level.getBlockState(pos).getBlock() != this) {
+ if (event.isCancelled() || !level.getBlockState(pos).is(this)) {
+ return;
+ }
+ // CraftBukkit end

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/LecternBlock.java
+++ b/net/minecraft/world/level/block/LecternBlock.java
@@ -169,7 +_,24 @@
@@ -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) {
@@ -26,7 +26,7 @@
resetBookState(entity, level, pos, state, true);
level.playSound(null, pos, SoundEvents.BOOK_PUT, SoundSource.BLOCKS, 1.0F, 1.0F);
}
@@ -189,6 +_,16 @@
@@ -156,6 +_,16 @@
}
private static void changePowered(Level level, BlockPos pos, BlockState state, boolean powered) {
@@ -40,22 +40,10 @@
+ }
+ }
+ // 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 +_,10 @@
}
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 +_,7 @@
@@ -243,8 +_,7 @@
private void openScreen(Level level, BlockPos pos, Player player) {
BlockEntity blockEntity = level.getBlockEntity(pos);

View File

@@ -1,12 +1,12 @@
--- a/net/minecraft/world/level/block/LeverBlock.java
+++ b/net/minecraft/world/level/block/LeverBlock.java
@@ -100,6 +_,19 @@
@@ -68,6 +_,19 @@
makeParticle(blockState, level, pos, 1.0F);
}
} else {
+ // CraftBukkit start - Interact Lever
+ boolean powered = state.getValue(LeverBlock.POWERED); // Old powered state
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int old = (powered) ? 15 : 0;
+ int current = (!powered) ? 15 : 0;
+

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/LightningRodBlock.java
+++ b/net/minecraft/world/level/block/LightningRodBlock.java
@@ -84,6 +_,18 @@
@@ -82,6 +_,18 @@
}
public void onLightningStrike(BlockState state, Level level, BlockPos pos) {
@@ -16,6 +16,6 @@
+ 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);

View File

@@ -48,7 +48,7 @@
- level.setBlockAndUpdate(pos, block.defaultBlockState());
- this.fizz(level, pos);
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, block.defaultBlockState())) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, block.defaultBlockState(), 3)) {
+ this.fizz(level, pos);
+ }
+ // CraftBukkit end
@@ -59,7 +59,7 @@
- level.setBlockAndUpdate(pos, Blocks.BASALT.defaultBlockState());
- this.fizz(level, pos);
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, Blocks.BASALT.defaultBlockState())) {
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, Blocks.BASALT.defaultBlockState(), 3)) {
+ this.fizz(level, pos);
+ }
+ // CraftBukkit end

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/MangrovePropaguleBlock.java
+++ b/net/minecraft/world/level/block/MangrovePropaguleBlock.java
@@ -123,7 +_,7 @@
@@ -103,7 +_,7 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (!isHanging(state)) {

View File

@@ -5,7 +5,7 @@
}
- return level.setBlock(pos.pos(), stateForPlacement, 2);
+ return org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos.source(), pos.pos(), stateForPlacement, 2); // CraftBukkit
+ return org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos.source(), pos.pos(), stateForPlacement, 2, true); // CraftBukkit
} else {
return false;
}

View File

@@ -1,15 +1,15 @@
--- a/net/minecraft/world/level/block/MushroomBlock.java
+++ b/net/minecraft/world/level/block/MushroomBlock.java
@@ -47,7 +_,7 @@
@@ -46,7 +_,7 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
- if (random.nextInt(25) == 0) {
+ if (random.nextFloat() < (level.spigotConfig.mushroomModifier / (100.0f * 25))) { // Spigot - SPIGOT-7159: Better modifier resolution
+ if (random.nextFloat() < (level.spigotConfig.mushroomModifier / (100.0F * 25))) { // Spigot - SPIGOT-7159: Better modifier resolution
int i = 5;
int i1 = 4;
@@ -60,6 +_,7 @@
@@ -59,6 +_,7 @@
}
BlockPos blockPos1 = pos.offset(random.nextInt(3) - 1, random.nextInt(2) - random.nextInt(2), random.nextInt(3) - 1);
@@ -17,7 +17,7 @@
for (int i2 = 0; i2 < 4; i2++) {
if (level.isEmptyBlock(blockPos1) && state.canSurvive(level, blockPos1)) {
@@ -70,7 +_,7 @@
@@ -69,7 +_,7 @@
}
if (level.isEmptyBlock(blockPos1) && state.canSurvive(level, blockPos1)) {
@@ -26,7 +26,7 @@
}
}
}
@@ -93,6 +_,7 @@
@@ -92,6 +_,7 @@
return false;
} else {
level.removeBlock(pos, false);

View File

@@ -7,9 +7,9 @@
- 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 +_,13 @@
&& random.nextInt(2000) < level.getDifficulty().getId()
&& level.anyPlayerCloseEnoughForSpawning(pos)) {
@@ -79,9 +_,13 @@
}
if (level.getBlockState(pos).isValidSpawn(level, pos, EntityType.ZOMBIFIED_PIGLIN)) {
@@ -24,21 +24,21 @@
Entity vehicle = entity.getVehicle();
if (vehicle != null) {
vehicle.setPortalCooldown();
@@ -111,7 +_,13 @@
@@ -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
+ org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(level.getWorld(), pos.getX(), pos.getY(), pos.getZ()), org.bukkit.PortalType.NETHER); // Paper - add portal type
+ org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.NETHER); // Paper - add portal type
+ level.getCraftServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) return; // Paper - make cancellable
+ // CraftBukkit end
entity.setAsInsidePortal(this, pos);
}
}
@@ -134,22 +_,46 @@
@@ -135,22 +_,46 @@
@Nullable
@Override
public TeleportTransition getPortalDestination(ServerLevel level, Entity entity, BlockPos pos) {
@@ -90,7 +90,7 @@
BlockUtil.FoundRectangle largestRectangleAround;
TeleportTransition.PostTeleportTransition postTeleportTransition;
if (optional.isPresent()) {
@@ -164,17 +_,22 @@
@@ -165,17 +_,22 @@
blockPos1 -> level.getBlockState(blockPos1) == blockState
);
postTeleportTransition = TeleportTransition.PLAY_PORTAL_SOUND.then(entity1 -> entity1.placePortalTicket(blockPos));
@@ -116,7 +116,7 @@
return getDimensionTransitionFromExit(entity, pos, largestRectangleAround, level, postTeleportTransition);
}
@@ -220,7 +_,7 @@
@@ -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);

View File

@@ -1,12 +1,12 @@
--- a/net/minecraft/world/level/block/NetherWartBlock.java
+++ b/net/minecraft/world/level/block/NetherWartBlock.java
@@ -55,9 +_,9 @@
@@ -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));
+ if (ageValue < 3 && random.nextFloat() < (level.spigotConfig.wartModifier / (100.0F * 10))) { // Spigot - SPIGOT-7159: Better modifier resolution
state = state.setValue(AGE, ageValue + 1);
- level.setBlock(pos, state, 2);
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state, 2); // CraftBukkit
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/NoteBlock.java
+++ b/net/minecraft/world/level/block/NoteBlock.java
@@ -70,6 +_,7 @@
@@ -64,6 +_,7 @@
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
@@ -8,7 +8,7 @@
return this.setInstrument(context.getLevel(), context.getClickedPos(), this.defaultBlockState());
}
@@ -84,6 +_,7 @@
@@ -78,6 +_,7 @@
BlockState neighborState,
RandomSource random
) {
@@ -16,7 +16,7 @@
boolean flag = direction.getAxis() == Direction.Axis.Y;
return flag
? this.setInstrument(level, pos, state)
@@ -92,10 +_,12 @@
@@ -86,10 +_,12 @@
@Override
protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
@@ -28,8 +28,8 @@
+ state = level.getBlockState(pos); // CraftBukkit - SPIGOT-5617: update in case changed in event
}
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(hasNeighborSignal)), 3);
@@ -121,7 +_,7 @@
level.setBlock(pos, state.setValue(POWERED, hasNeighborSignal), 3);
@@ -115,7 +_,7 @@
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
if (!level.isClientSide) {
@@ -38,7 +38,7 @@
level.setBlock(pos, state, 3);
this.playNote(player, state, level, pos);
player.awardStat(Stats.TUNE_NOTEBLOCK);
@@ -145,9 +_,13 @@
@@ -139,9 +_,13 @@
@Override
protected boolean triggerEvent(BlockState state, Level level, BlockPos pos, int id, int param) {
NoteBlockInstrument noteBlockInstrument = state.getValue(INSTRUMENT);
@@ -53,7 +53,7 @@
pitchFromNote = getPitchFromNote(noteValue);
level.addParticle(ParticleTypes.NOTE, pos.getX() + 0.5, pos.getY() + 1.2, pos.getZ() + 0.5, noteValue / 24.0, 0.0, 0.0);
} else {
@@ -163,7 +_,7 @@
@@ -157,7 +_,7 @@
holder = Holder.direct(SoundEvent.createVariableRangeEvent(customSoundId));
} else {

View File

@@ -9,13 +9,13 @@
+ 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);
}

View File

@@ -1,14 +1,14 @@
--- a/net/minecraft/world/level/block/PitcherCropBlock.java
+++ b/net/minecraft/world/level/block/PitcherCropBlock.java
@@ -107,6 +_,7 @@
@@ -118,6 +_,7 @@
@Override
public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) {
public 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 instanceof Ravager && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
serverLevel.destroyBlock(pos, true, entity);
}
@@ -131,7 +_,7 @@
@@ -140,7 +_,7 @@
@Override
public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
float growthSpeed = CropBlock.getGrowthSpeed(this, level, pos);
@@ -17,10 +17,10 @@
if (flag) {
this.grow(level, state, pos, 1);
}
@@ -141,7 +_,7 @@
@@ -150,7 +_,7 @@
int min = Math.min(state.getValue(AGE) + ageIncrement, 4);
if (this.canGrow(level, pos, state, min)) {
BlockState blockState = state.setValue(AGE, Integer.valueOf(min));
BlockState blockState = state.setValue(AGE, min);
- level.setBlock(pos, blockState, 2);
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, blockState, 2)) return; // Paper
if (isDouble(min)) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/PointedDripstoneBlock.java
+++ b/net/minecraft/world/level/block/PointedDripstoneBlock.java
@@ -147,6 +_,11 @@
@@ -143,6 +_,11 @@
&& projectile.mayBreak(serverLevel)
&& projectile instanceof ThrownTrident
&& projectile.getDeltaMovement().length() > 0.6) {
@@ -12,21 +12,21 @@
level.destroyBlock(blockPos, true);
}
}
@@ -155,7 +_,7 @@
@@ -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 +_,11 @@
@@ -209,10 +_,11 @@
if (blockPos != null) {
if (fluidAboveStalactite.get().sourceState.is(Blocks.MUD) && fluid == Fluids.WATER) {
BlockState blockState = Blocks.CLAY.defaultBlockState();
- level.setBlockAndUpdate(fluidAboveStalactite.get().pos, blockState);
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, fluidAboveStalactite.get().pos, blockState)) { // Paper - Call BlockFormEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, fluidAboveStalactite.get().pos, blockState, 3)) { // Paper - Call BlockFormEvent
Block.pushEntitiesUp(fluidAboveStalactite.get().sourceState, blockState, level, fluidAboveStalactite.get().pos);
level.gameEvent(GameEvent.BLOCK_CHANGE, fluidAboveStalactite.get().pos, GameEvent.Context.of(blockState));
level.levelEvent(1504, blockPos, 0);
@@ -34,7 +34,7 @@
} else {
BlockPos blockPos1 = findFillableCauldronBelowStalactiteTip(level, blockPos, fluid);
if (blockPos1 != null) {
@@ -380,17 +_,17 @@
@@ -364,17 +_,17 @@
if (isUnmergedTipWithDirection(blockState, direction.getOpposite())) {
createMergedTips(blockState, server, blockPos);
} else if (blockState.isAir() || blockState.is(Blocks.WATER)) {
@@ -49,13 +49,13 @@
.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 +_,8 @@
@@ -388,8 +_,8 @@
blockPos = pos.below();
}

View File

@@ -1,25 +1,25 @@
--- a/net/minecraft/world/level/block/PowderSnowBlock.java
+++ b/net/minecraft/world/level/block/PowderSnowBlock.java
@@ -58,6 +_,7 @@
@@ -60,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 instanceof LivingEntity) || entity.getInBlockState().is(this)) {
entity.makeStuckInBlock(state, new Vec3(0.9F, 1.5, 0.9F));
if (level.isClientSide) {
@@ -80,8 +_,13 @@
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);
@@ -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(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity1 instanceof Player))) {
+ return;
+ }
+ // CraftBukkit end
level.destroyBlock(blockPos, false);
}
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/PoweredRailBlock.java
+++ b/net/minecraft/world/level/block/PoweredRailBlock.java
@@ -133,6 +_,13 @@
@@ -127,6 +_,13 @@
|| this.findPoweredRailSignal(level, pos, state, true, 0)
|| this.findPoweredRailSignal(level, pos, state, false, 0);
if (flag != poweredValue) {
@@ -11,6 +11,6 @@
+ 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()) {

View File

@@ -1,14 +1,6 @@
--- a/net/minecraft/world/level/block/PressurePlateBlock.java
+++ b/net/minecraft/world/level/block/PressurePlateBlock.java
@@ -5,6 +_,7 @@
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
@@ -46,7 +_,31 @@
@@ -46,7 +_,29 @@
case EVERYTHING -> Entity.class;
case MOBS -> LivingEntity.class;
};
@@ -16,15 +8,13 @@
+ // CraftBukkit start - Call interact event when turning on a pressure plate
+ for (Entity entity : getEntities(level, PressurePlateBlock.TOUCH_AABB.move(pos), clazz)) {
+ if (this.getSignalForState(level.getBlockState(pos)) == 0) {
+ org.bukkit.World bworld = level.getWorld();
+ org.bukkit.plugin.PluginManager manager = level.getCraftServer().getPluginManager();
+ org.bukkit.event.Cancellable cancellable;
+
+ if (entity instanceof Player player) {
+ if (entity instanceof net.minecraft.world.entity.player.Player player) {
+ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(player, org.bukkit.event.block.Action.PHYSICAL, pos, null, null, null);
+ } else {
+ cancellable = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
+ manager.callEvent((org.bukkit.event.entity.EntityInteractEvent) cancellable);
+ cancellable = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos));
+ level.getCraftServer().getPluginManager().callEvent((org.bukkit.event.entity.EntityInteractEvent) cancellable);
+ }
+
+ // We only want to block turning the plate on if all events are cancelled

View File

@@ -20,7 +20,7 @@
+ RedStoneOreBlock.interact(level.getBlockState(pos), level, pos, entity); // add entity
+ }
+ } else {
+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos));
+ level.getCraftServer().getPluginManager().callEvent(event);
+ if (!event.isCancelled()) {
+ RedStoneOreBlock.interact(level.getBlockState(pos), level, pos, entity); // add entity
@@ -52,7 +52,7 @@
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(LIT, Boolean.valueOf(true)), 3);
level.setBlock(pos, state.setValue(LIT, true), 3);
}
}
@@ -80,6 +_,11 @@
@@ -64,7 +64,7 @@
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(LIT, Boolean.valueOf(false)), 3);
level.setBlock(pos, state.setValue(LIT, false), 3);
}
}
@@ -87,9 +_,17 @@

View File

@@ -30,8 +30,8 @@
+
+ // CraftBukkit start
+ org.bukkit.plugin.PluginManager manager = level.getCraftServer().getPluginManager();
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ int oldCurrent = ((Boolean) state.getValue(RedstoneTorchBlock.LIT)).booleanValue() ? 15 : 0;
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int oldCurrent = state.getValue(LIT) ? 15 : 0;
+
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, oldCurrent, oldCurrent);
+ // CraftBukkit end
@@ -46,7 +46,7 @@
+ }
+ }
+ // 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 +_,15 @@
@@ -62,7 +62,7 @@
+ }
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(LIT, Boolean.valueOf(true)), 3);
level.setBlock(pos, state.setValue(LIT, true), 3);
}
}
@@ -124,7 +_,12 @@

View File

@@ -1,11 +1,11 @@
--- a/net/minecraft/world/level/block/RespawnAnchorBlock.java
+++ b/net/minecraft/world/level/block/RespawnAnchorBlock.java
@@ -102,11 +_,16 @@
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, true, 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
);
@@ -18,7 +18,7 @@
}
}
@@ -140,6 +_,7 @@
@@ -141,6 +_,7 @@
}
private void explode(BlockState state, Level level, final BlockPos pos2) {
@@ -26,7 +26,7 @@
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 +_,7 @@
@@ -154,7 +_,7 @@
};
Vec3 center = pos2.getCenter();
level.explode(

View File

@@ -5,7 +5,7 @@
@Override
public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) {
- level.setBlockAndUpdate(pos.below(), Blocks.HANGING_ROOTS.defaultBlockState());
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, pos.below(), Blocks.HANGING_ROOTS.defaultBlockState()); // CraftBukkit
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(level, pos, pos.below(), Blocks.HANGING_ROOTS.defaultBlockState(), 3); // CraftBukkit
}
@Override

View File

@@ -1,25 +1,25 @@
--- a/net/minecraft/world/level/block/SaplingBlock.java
+++ b/net/minecraft/world/level/block/SaplingBlock.java
@@ -26,6 +_,7 @@
protected static final float AABB_OFFSET = 6.0F;
protected static final VoxelShape SHAPE = Block.box(2.0, 0.0, 2.0, 14.0, 12.0, 14.0);
@@ -25,6 +_,7 @@
public static final IntegerProperty STAGE = BlockStateProperties.STAGE;
private static final VoxelShape SHAPE = Block.column(12.0, 0.0, 12.0);
protected final TreeGrower treeGrower;
+ public static org.bukkit.TreeType treeType; // CraftBukkit
+ public static @javax.annotation.Nullable org.bukkit.TreeType treeType; // CraftBukkit
@Override
public MapCodec<? extends SaplingBlock> codec() {
@@ -45,7 +_,7 @@
@@ -44,7 +_,7 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
- if (level.getMaxLocalRawBrightness(pos.above()) >= 9 && random.nextInt(7) == 0) {
+ if (level.getMaxLocalRawBrightness(pos.above()) >= 9 && random.nextFloat() < (level.spigotConfig.saplingModifier / (100.0f * 7))) { // Spigot - SPIGOT-7159: Better modifier resolution
+ if (level.getMaxLocalRawBrightness(pos.above()) >= 9 && random.nextFloat() < (level.spigotConfig.saplingModifier / (100.0F * 7))) { // Spigot - SPIGOT-7159: Better modifier resolution
this.advanceTree(level, pos, state, random);
}
}
@@ -54,7 +_,33 @@
@@ -53,7 +_,34 @@
if (state.getValue(STAGE) == 0) {
level.setBlock(pos, state.cycle(STAGE), 4);
level.setBlock(pos, state.cycle(STAGE), 260);
} else {
- this.treeGrower.growTree(level, level.getChunkSource().getGenerator(), pos, state, random);
+ // CraftBukkit start
@@ -42,8 +42,9 @@
+ }
+ if (event == null || !event.isCancelled()) {
+ for (org.bukkit.block.BlockState blockstate : blocks) {
+ org.bukkit.craftbukkit.block.CapturedBlockState.setBlockState(blockstate);
+ level.checkCapturedTreeStateForObserverNotify(pos, (org.bukkit.craftbukkit.block.CraftBlockState) blockstate); // Paper - notify observers even if grow failed
+ org.bukkit.craftbukkit.block.CraftBlockState craftBlockState = (org.bukkit.craftbukkit.block.CraftBlockState) blockstate;
+ craftBlockState.place(craftBlockState.getFlags());
+ level.checkCapturedTreeStateForObserverNotify(pos, craftBlockState); // Paper - notify observers even if grow failed
+ }
+ }
+ }

View File

@@ -1,9 +1,9 @@
--- a/net/minecraft/world/level/block/ScaffoldingBlock.java
+++ b/net/minecraft/world/level/block/ScaffoldingBlock.java
@@ -119,7 +_,7 @@
@@ -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) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/SculkSensorBlock.java
+++ b/net/minecraft/world/level/block/SculkSensorBlock.java
@@ -108,6 +_,18 @@
@@ -102,6 +_,18 @@
&& level.getBlockEntity(pos) instanceof SculkSensorBlockEntity sculkSensorBlockEntity
&& level instanceof ServerLevel serverLevel
&& sculkSensorBlockEntity.getVibrationUser().canReceiveVibration(serverLevel, pos, GameEvent.STEP, GameEvent.Context.of(state))) {
@@ -9,7 +9,7 @@
+ if (entity instanceof net.minecraft.world.entity.player.Player player) {
+ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(player, org.bukkit.event.block.Action.PHYSICAL, pos, null, null, null);
+ } else {
+ cancellable = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
+ cancellable = new org.bukkit.event.entity.EntityInteractEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos));
+ level.getCraftServer().getPluginManager().callEvent((org.bukkit.event.entity.EntityInteractEvent) cancellable);
+ }
+ if (cancellable.isCancelled()) {
@@ -19,7 +19,7 @@
sculkSensorBlockEntity.getListener().forceScheduleVibration(serverLevel, GameEvent.STEP, GameEvent.Context.of(entity), entity.position());
}
@@ -200,10 +_,19 @@
@@ -191,10 +_,19 @@
}
public static boolean canActivate(BlockState state) {
@@ -37,10 +37,10 @@
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(PHASE, SculkSensorPhase.COOLDOWN).setValue(POWER, Integer.valueOf(0)), 3);
level.setBlock(pos, state.setValue(PHASE, SculkSensorPhase.COOLDOWN).setValue(POWER, 0), 3);
level.scheduleTick(pos, state.getBlock(), 10);
updateNeighbours(level, pos, state);
@@ -215,6 +_,15 @@
@@ -206,6 +_,15 @@
}
public void activate(@Nullable Entity entity, Level level, BlockPos pos, BlockState state, int power, int frequency) {
@@ -53,10 +53,10 @@
+ }
+ power = eventRedstone.getNewCurrent();
+ // CraftBukkit end
level.setBlock(pos, state.setValue(PHASE, SculkSensorPhase.ACTIVE).setValue(POWER, Integer.valueOf(power)), 3);
level.setBlock(pos, state.setValue(PHASE, SculkSensorPhase.ACTIVE).setValue(POWER, power), 3);
level.scheduleTick(pos, state.getBlock(), this.getActiveTicks());
updateNeighbours(level, pos, state);
@@ -292,8 +_,16 @@
@@ -283,8 +_,16 @@
@Override
protected void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropExperience) {
super.spawnAfterBreak(state, level, pos, stack, dropExperience);
@@ -69,9 +69,8 @@
- this.tryDropExperience(level, pos, stack, ConstantInt.of(5));
+ return this.tryDropExperience(level, pos, stack, ConstantInt.of(5));
}
- }
+
+ return 0;
+ // CraftBukkit end
+ }
}
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/SculkShriekerBlock.java
+++ b/net/minecraft/world/level/block/SculkShriekerBlock.java
@@ -66,6 +_,7 @@
@@ -60,6 +_,7 @@
if (level instanceof ServerLevel serverLevel) {
ServerPlayer serverPlayer = SculkShriekerBlockEntity.tryGetPlayer(entity);
if (serverPlayer != null) {
@@ -8,7 +8,7 @@
serverLevel.getBlockEntity(pos, BlockEntityType.SCULK_SHRIEKER).ifPresent(sculkShrieker -> sculkShrieker.tryShriek(serverLevel, serverPlayer));
}
}
@@ -144,9 +_,16 @@
@@ -128,9 +_,16 @@
@Override
protected void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropExperience) {
super.spawnAfterBreak(state, level, pos, stack, dropExperience);

View File

@@ -1,23 +1,23 @@
--- a/net/minecraft/world/level/block/SculkSpreader.java
+++ b/net/minecraft/world/level/block/SculkSpreader.java
@@ -50,6 +_,7 @@
@@ -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 +_,7 @@
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 +_,24 @@
public void save(CompoundTag tag) {
@@ -110,13 +_,24 @@
public void addCursors(BlockPos pos, int charge) {
while (charge > 0) {
int min = Math.min(charge, 1000);

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/ShulkerBoxBlock.java
+++ b/net/minecraft/world/level/block/ShulkerBoxBlock.java
@@ -100,8 +_,8 @@
@@ -78,8 +_,8 @@
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
if (level instanceof ServerLevel serverLevel
&& level.getBlockEntity(pos) instanceof ShulkerBoxBlockEntity shulkerBoxBlockEntity
@@ -11,7 +11,7 @@
player.awardStat(Stats.OPEN_SHULKER_BOX);
PiglinAi.angerNearbyPiglins(serverLevel, player, true);
}
@@ -139,7 +_,7 @@
@@ -117,7 +_,7 @@
itemEntity.setDefaultPickUpDelay();
level.addFreshEntity(itemEntity);
} else {
@@ -20,7 +20,7 @@
}
}
@@ -149,7 +_,15 @@
@@ -127,7 +_,15 @@
@Override
protected List<ItemStack> getDrops(BlockState state, LootParams.Builder params) {
BlockEntity blockEntity = params.getOptionalParameter(LootContextParams.BLOCK_ENTITY);
@@ -36,7 +36,7 @@
params = params.withDynamicDrop(CONTENTS, output -> {
for (int i = 0; i < shulkerBoxBlockEntity.getContainerSize(); i++) {
output.accept(shulkerBoxBlockEntity.getItem(i));
@@ -157,7 +_,13 @@
@@ -135,7 +_,13 @@
});
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/SignBlock.java
+++ b/net/minecraft/world/level/block/SignBlock.java
@@ -134,7 +_,7 @@
@@ -133,7 +_,7 @@
} else if (!this.otherPlayerIsEditingSign(player, signBlockEntity)
&& player.mayBuild()
&& this.hasEditableText(player, signBlockEntity, isFacingFrontText)) {
@@ -9,15 +9,16 @@
return InteractionResult.SUCCESS_SERVER;
} else {
return InteractionResult.PASS;
@@ -176,7 +_,33 @@
@@ -175,7 +_,34 @@
return woodType;
}
+ @io.papermc.paper.annotation.DoNotUse @Deprecated // Paper - Add PlayerOpenSignEvent
+ @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper - Add PlayerOpenSignEvent
public void openTextEdit(Player player, SignBlockEntity signEntity, boolean isFrontText) {
+ // Paper start - Add PlayerOpenSignEvent
+ this.openTextEdit(player, signEntity, isFrontText, io.papermc.paper.event.player.PlayerOpenSignEvent.Cause.UNKNOWN);
+ }
+
+ public void openTextEdit(Player player, SignBlockEntity signEntity, boolean isFrontText, io.papermc.paper.event.player.PlayerOpenSignEvent.Cause cause) {
+ org.bukkit.entity.Player bukkitPlayer = (org.bukkit.entity.Player) player.getBukkitEntity();
+ org.bukkit.block.Block bukkitBlock = org.bukkit.craftbukkit.block.CraftBlock.at(signEntity.getLevel(), signEntity.getBlockPos());
@@ -43,7 +44,7 @@
signEntity.setAllowedPlayerEditor(player.getUUID());
player.openTextEdit(signEntity, isFrontText);
}
@@ -189,6 +_,6 @@
@@ -188,6 +_,6 @@
@Nullable
@Override
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> blockEntityType) {

View File

@@ -16,13 +16,13 @@
public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (!this.isReadyToHatch(state)) {
+ // Paper start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(HATCH, Integer.valueOf(this.getHatchLevel(state) + 1)), 2)) {
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(HATCH, this.getHatchLevel(state) + 1), 2)) {
+ this.rescheduleTick(level, pos);
+ return;
+ }
+ // 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()) {
@@ -36,7 +36,7 @@
@@ -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
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/SnowLayerBlock.java
+++ b/net/minecraft/world/level/block/SnowLayerBlock.java
@@ -123,6 +_,11 @@
@@ -103,6 +_,11 @@
@Override
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (level.getBrightness(LightLayer.BLOCK, pos) > 11) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/SpawnerBlock.java
+++ b/net/minecraft/world/level/block/SpawnerBlock.java
@@ -46,11 +_,19 @@
@@ -41,9 +_,17 @@
@Override
protected void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropExperience) {
super.spawnAfterBreak(state, level, pos, stack, dropExperience);
@@ -19,6 +19,4 @@
+ return 0;
+ // CraftBukkit end
+ }
@Override
public void appendHoverText(ItemStack stack, Item.TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
}

View File

@@ -56,17 +56,17 @@
- > 1;
+ );
+ // CraftBukkit start
+ java.util.List<org.bukkit.craftbukkit.block.CraftBlockState> blocks = blockList.getList(); // Is a clone
+ if (!blocks.isEmpty()) {
+ java.util.List<org.bukkit.craftbukkit.block.CraftBlockState> snapshots = blockList.getSnapshotBlocks(); // Is a clone
+ if (!snapshots.isEmpty()) {
+ final org.bukkit.block.Block sponge = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+
+ org.bukkit.event.block.SpongeAbsorbEvent event = new org.bukkit.event.block.SpongeAbsorbEvent(sponge, (java.util.List<org.bukkit.block.BlockState>) (java.util.List) blocks);
+ org.bukkit.event.block.SpongeAbsorbEvent event = new org.bukkit.event.block.SpongeAbsorbEvent(sponge, (java.util.List<org.bukkit.block.BlockState>) (java.util.List) snapshots);
+ if (!event.callEvent()) {
+ return false;
+ }
+
+ for (org.bukkit.craftbukkit.block.CraftBlockState block : blocks) {
+ BlockPos blockPos = block.getPosition();
+ for (org.bukkit.craftbukkit.block.CraftBlockState snapshot : snapshots) {
+ BlockPos blockPos = snapshot.getPosition();
+ BlockState state = level.getBlockState(blockPos);
+ FluidState fluid = level.getFluidState(blockPos);
+
@@ -79,13 +79,13 @@
+ BlockEntity blockEntity = state.hasBlockEntity() ? level.getBlockEntity(blockPos) : null;
+
+ // Paper start - Fix SpongeAbsortEvent handling
+ if (block.getHandle().isAir()) {
+ if (snapshot.getHandle().isAir()) {
+ dropResources(state, level, blockPos, blockEntity);
+ }
+ // Paper end - Fix SpongeAbsortEvent handling
+ }
+ }
+ level.setBlock(blockPos, block.getHandle(), block.getFlag());
+ snapshot.place(snapshot.getFlags());
+ }
+
+ return true;

View File

@@ -18,8 +18,8 @@
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
}
}
}

View File

@@ -1,36 +1,36 @@
--- a/net/minecraft/world/level/block/StemBlock.java
+++ b/net/minecraft/world/level/block/StemBlock.java
@@ -80,11 +_,11 @@
@@ -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);
- if (random.nextInt((int)(25.0F / growthSpeed) + 1) == 0) {
+ 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
+ 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 +_,11 @@
@@ -84,7 +_,11 @@
Optional<Block> optional = registry.getOptional(this.fruit);
Optional<Block> optional1 = registry.getOptional(this.attachedStem);
if (optional.isPresent() && optional1.isPresent()) {
- level.setBlockAndUpdate(blockPos, optional.get().defaultBlockState());
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, blockPos, optional.get().defaultBlockState())) {
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, blockPos, optional.get().defaultBlockState(), 3)) {
+ return;
+ }
+ // CraftBukkit end
level.setBlockAndUpdate(pos, optional1.get().defaultBlockState().setValue(HorizontalDirectionalBlock.FACING, randomDirection));
}
}
@@ -122,7 +_,7 @@
@@ -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) {

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/SugarCaneBlock.java
+++ b/net/minecraft/world/level/block/SugarCaneBlock.java
@@ -56,12 +_,13 @@
@@ -55,12 +_,13 @@
i++;
}
@@ -10,11 +10,11 @@
- if (ageValue == 15) {
- level.setBlockAndUpdate(pos.above(), this.defaultBlockState());
+ 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);
+ 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(), 3); // CraftBukkit
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);
+ } else if (modifier == 100 || random.nextFloat() < (modifier / (100.0F * 16))) { // Spigot - SPIGOT-7159: Better modifier resolution
level.setBlock(pos, state.setValue(AGE, ageValue + 1), 260);
}
}

View File

@@ -1,12 +1,12 @@
--- a/net/minecraft/world/level/block/SweetBerryBushBlock.java
+++ b/net/minecraft/world/level/block/SweetBerryBushBlock.java
@@ -68,15 +_,16 @@
@@ -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));
+ 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, 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));
@@ -14,12 +14,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 (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 +_,7 @@
@@ -87,7 +_,7 @@
double abs = Math.abs(vec3.x());
double abs1 = Math.abs(vec3.z());
if (abs >= 0.003F || abs1 >= 0.003F) {
@@ -28,7 +28,7 @@
}
}
}
@@ -109,7 +_,15 @@
@@ -111,7 +_,15 @@
boolean flag = ageValue == 3;
if (ageValue > 1) {
int i = 1 + level.random.nextInt(2);
@@ -43,5 +43,5 @@
+ }
+ // 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);

View File

@@ -1,91 +1,67 @@
--- a/net/minecraft/world/level/block/TntBlock.java
+++ b/net/minecraft/world/level/block/TntBlock.java
@@ -45,7 +_,13 @@
@@ -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)) {
+ 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);
- 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);
}
@@ -54,7 +_,13 @@
}
@@ -55,7 +_,7 @@
@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);
- 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);
}
@@ -62,7 +_,7 @@
}
@@ -63,7 +_,7 @@
@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);
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
}
@@ -71,6 +_,13 @@
return super.playerWillDestroy(level, pos, state, player);
@@ -80,11 +_,16 @@
}
@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 +_,17 @@
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 {
+ // 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 +_,17 @@
BlockPos blockPos = hit.getBlockPos();
- 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)) {
+ // 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);
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);
}
}

View File

@@ -1,15 +1,12 @@
--- a/net/minecraft/world/level/block/TrapDoorBlock.java
+++ b/net/minecraft/world/level/block/TrapDoorBlock.java
@@ -146,7 +_,40 @@
@@ -128,7 +_,37 @@
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());
+
+ org.bukkit.block.Block bblock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int power = bblock.getBlockPower();
+ int oldPower = state.getValue(TrapDoorBlock.OPEN) ? 15 : 0;
+
@@ -21,7 +18,7 @@
+ // CraftBukkit end
+ // Paper start - break redstone on trapdoors early
+ boolean open = state.getValue(TrapDoorBlock.OPEN) != hasNeighborSignal;
+ // note: this must run before any state for this block/its neighborus are written to the world
+ // note: this must run before any state for this block/its neighbours are written to the world
+ // we allow the redstone event to fire so that plugins can block
+ if (hasNeighborSignal && open) { // if we are now powered and it caused the trap door to open
+ // in this case, first check for the redstone on top first
@@ -38,7 +35,7 @@
+ }
+ }
+ 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);
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/TripWireBlock.java
+++ b/net/minecraft/world/level/block/TripWireBlock.java
@@ -72,6 +_,7 @@
@@ -73,6 +_,7 @@
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
@@ -8,15 +8,15 @@
BlockGetter level = context.getLevel();
BlockPos clickedPos = context.getClickedPos();
return this.defaultBlockState()
@@ -92,6 +_,7 @@
@@ -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 +_,7 @@
@@ -100,6 +_,7 @@
@Override
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
@@ -24,23 +24,23 @@
if (!oldState.is(state.getBlock())) {
this.updateSource(level, pos, state);
}
@@ -106,6 +_,7 @@
@@ -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 +_,7 @@
@@ -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 +_,7 @@
@@ -123,6 +_,7 @@
}
private void updateSource(Level level, BlockPos pos, BlockState state) {
@@ -48,16 +48,16 @@
for (Direction direction : new Direction[]{Direction.SOUTH, Direction.WEST}) {
for (int i = 1; i < 42; i++) {
BlockPos blockPos = pos.relative(direction, i);
@@ -147,6 +_,8 @@
@@ -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 +_,7 @@
@@ -157,6 +_,7 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
@@ -65,16 +65,15 @@
if (level.getBlockState(pos).getValue(POWERED)) {
this.checkPressed(level, pos);
}
@@ -179,6 +_,40 @@
@@ -180,6 +_,39 @@
}
}
}
+
+ // CraftBukkit start - Call interact even when triggering connected tripwire
+ if (poweredValue != flag && flag && blockState.getValue(TripWireBlock.ATTACHED)) {
+ org.bukkit.World bworld = level.getWorld();
+ org.bukkit.plugin.PluginManager manager = level.getCraftServer().getPluginManager();
+ org.bukkit.block.Block block = bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ boolean allowed = false;
+
+ // If all the events are cancelled block the tripwire trigger, else allow
@@ -105,4 +104,4 @@
+ // CraftBukkit end
if (flag != poweredValue) {
blockState = blockState.setValue(POWERED, Boolean.valueOf(flag));
blockState = blockState.setValue(POWERED, flag);

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/level/block/TripWireHookBlock.java
+++ b/net/minecraft/world/level/block/TripWireHookBlock.java
@@ -127,10 +_,10 @@
@@ -113,10 +_,10 @@
if (optionalValue.isPresent()) {
Direction direction = optionalValue.get();
boolean flag = hookState.getOptionalValue(ATTACHED).orElse(false);
@@ -13,10 +13,10 @@
int i = 0;
BlockState[] blockStates = new BlockState[42];
@@ -166,21 +_,48 @@
@@ -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) {
@@ -63,12 +63,12 @@
if (flag != flag2) {
for (int i2 = 1; i2 < i; i2++) {
@@ -189,7 +_,7 @@
@@ -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
}
}
}

View File

@@ -20,18 +20,17 @@
this.decreaseEggs(serverLevel, pos, state);
}
}
@@ -95,10 +_,20 @@
@@ -95,10 +_,19 @@
if (this.shouldUpdateHatchLevel(level) && onSand(level, pos)) {
int hatchValue = state.getValue(HATCH);
if (hatchValue < 2) {
+ // CraftBukkit start - Call BlockGrowEvent
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(TurtleEggBlock.HATCH, hatchValue + 1), 2)) {
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(level, pos, state.setValue(HATCH, hatchValue + 1), 2)) {
+ return;
+ }
+ // 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.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(state));
} else {
+ // CraftBukkit start - Call BlockFadeEvent
@@ -45,7 +44,7 @@
@@ -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
}

Some files were not shown because too many files have changed in this diff Show More