net/minecraft/world/level/levelgen/feature

This commit is contained in:
Noah van der Aa
2024-12-15 00:09:40 +01:00
parent 6a85106951
commit 3fbf7aa159
4 changed files with 62 additions and 82 deletions

View File

@@ -0,0 +1,52 @@
--- a/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java
+++ b/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java
@@ -19,6 +_,12 @@
}
public static void createEndPlatform(ServerLevelAccessor level, BlockPos pos, boolean dropBlocks) {
+ // CraftBukkit start
+ createEndPlatform(level, pos, dropBlocks, null);
+ }
+ public static void createEndPlatform(ServerLevelAccessor level, BlockPos pos, boolean dropBlocks, net.minecraft.world.entity.Entity entity) {
+ org.bukkit.craftbukkit.util.BlockStateListPopulator blockList = new org.bukkit.craftbukkit.util.BlockStateListPopulator(level);
+ // CraftBukkit end
BlockPos.MutableBlockPos mutableBlockPos = pos.mutable();
for (int i = -2; i <= 2; i++) {
@@ -26,15 +_,33 @@
for (int i2 = -1; i2 < 3; i2++) {
BlockPos blockPos = mutableBlockPos.set(pos).move(i1, i2, i);
Block block = i2 == -1 ? Blocks.OBSIDIAN : Blocks.AIR;
- if (!level.getBlockState(blockPos).is(block)) {
+ // CraftBukkit start
+ if (!blockList.getBlockState(blockPos).is(block)) {
if (dropBlocks) {
- level.destroyBlock(blockPos, true, null);
+ blockList.destroyBlock(blockPos, true, null);
}
- level.setBlock(blockPos, block.defaultBlockState(), 3);
+ blockList.setBlock(blockPos, block.defaultBlockState(), 3);
+ // CraftBukkit end
}
}
}
}
+
+ // CraftBukkit start
+ // SPIGOT-7746: Entity will only be null during world generation, which is async, so just generate without event
+ if (entity != null) {
+ org.bukkit.World bworld = level.getLevel().getWorld();
+ org.bukkit.event.world.PortalCreateEvent portalEvent = new org.bukkit.event.world.PortalCreateEvent((java.util.List<org.bukkit.block.BlockState>) (java.util.List) blockList.getList(), bworld, entity.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.END_PLATFORM);
+ level.getLevel().getCraftServer().getPluginManager().callEvent(portalEvent);
+ if (portalEvent.isCancelled()) return;
+ }
+
+ // SPIGOT-7856: End platform not dropping items after replacing blocks
+ if (dropBlocks) {
+ blockList.getList().forEach((state) -> level.destroyBlock(state.getPosition(), true, null));
+ }
+ blockList.updateList();
+ // CraftBukkit end
}
}

View File

@@ -0,0 +1,10 @@
--- a/net/minecraft/world/level/levelgen/feature/SpikeFeature.java
+++ b/net/minecraft/world/level/levelgen/feature/SpikeFeature.java
@@ -113,6 +_,7 @@
endCrystal.setBeamTarget(config.getCrystalBeamTarget());
endCrystal.setInvulnerable(config.isCrystalInvulnerable());
endCrystal.moveTo(spike.getCenterX() + 0.5, spike.getHeight() + 1, spike.getCenterZ() + 0.5, random.nextFloat() * 360.0F, 0.0F);
+ endCrystal.generatedByDragonFight = true; // Paper - Fix invulnerable end crystals
level.addFreshEntity(endCrystal);
BlockPos blockPosx = endCrystal.blockPosition();
this.setBlock(level, blockPosx.below(), Blocks.BEDROCK.defaultBlockState());