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
No known key found for this signature in database
GPG key ID: 547D90BC6FF753CF
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());

View file

@ -1,72 +0,0 @@
--- a/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java
+++ b/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java
@@ -7,6 +7,11 @@
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
+// CraftBukkit start
+import java.util.List;
+import org.bukkit.block.BlockState;
+import org.bukkit.event.world.PortalCreateEvent;
+// CraftBukkit end
public class EndPlatformFeature extends Feature<NoneFeatureConfiguration> {
@@ -21,24 +26,51 @@
}
public static void createEndPlatform(ServerLevelAccessor world, BlockPos pos, boolean breakBlocks) {
- BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable();
+ EndPlatformFeature.createEndPlatform(world, pos, breakBlocks, null);
+ // CraftBukkit start
+ }
+ public static void createEndPlatform(ServerLevelAccessor worldaccess, BlockPos blockposition, boolean flag, Entity entity) {
+ org.bukkit.craftbukkit.util.BlockStateListPopulator blockList = new org.bukkit.craftbukkit.util.BlockStateListPopulator(worldaccess);
+ // CraftBukkit end
+ BlockPos.MutableBlockPos blockposition_mutableblockposition = blockposition.mutable();
+
for (int i = -2; i <= 2; ++i) {
for (int j = -2; j <= 2; ++j) {
for (int k = -1; k < 3; ++k) {
- BlockPos.MutableBlockPos blockposition_mutableblockposition1 = blockposition_mutableblockposition.set(pos).move(j, k, i);
+ BlockPos.MutableBlockPos blockposition_mutableblockposition1 = blockposition_mutableblockposition.set(blockposition).move(j, k, i);
Block block = k == -1 ? Blocks.OBSIDIAN : Blocks.AIR;
- if (!world.getBlockState(blockposition_mutableblockposition1).is(block)) {
- if (breakBlocks) {
- world.destroyBlock(blockposition_mutableblockposition1, true, (Entity) null);
+ // CraftBukkit start
+ if (!blockList.getBlockState(blockposition_mutableblockposition1).is(block)) {
+ if (flag) {
+ blockList.destroyBlock(blockposition_mutableblockposition1, true, (Entity) null);
}
- world.setBlock(blockposition_mutableblockposition1, block.defaultBlockState(), 3);
+ blockList.setBlock(blockposition_mutableblockposition1, 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 = worldaccess.getLevel().getWorld();
+ PortalCreateEvent portalEvent = new PortalCreateEvent((List<BlockState>) (List) blockList.getList(), bworld, entity.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.END_PLATFORM);
+ worldaccess.getLevel().getCraftServer().getPluginManager().callEvent(portalEvent);
+ if (portalEvent.isCancelled()) {
+ return;
+ }
+ }
+
+ // SPIGOT-7856: End platform not dropping items after replacing blocks
+ if (flag) {
+ blockList.getList().forEach((state) -> worldaccess.destroyBlock(state.getPosition(), true, null));
+ }
+ blockList.updateList();
+ // CraftBukkit end
+
}
}

View file

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