From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Trigary <trigary0@gmail.com>
Date: Mon, 25 Jan 2021 14:53:57 +0100
Subject: [PATCH] add DragonEggFormEvent


diff --git a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
+++ b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
@@ -0,0 +0,0 @@ import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfigur
 import net.minecraft.world.phys.AABB;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import io.papermc.paper.event.block.DragonEggFormEvent; // Paper - DragonEggFormEvent
 
 public class EndDragonFight {
 
@@ -0,0 +0,0 @@ public class EndDragonFight {
             this.dragonEvent.setVisible(false);
             this.spawnExitPortal(true);
             this.spawnNewGateway();
+            // Paper start - DragonEggFormEvent
+            BlockPos eggPosition = this.level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, EndPodiumFeature.getPosition());
+            org.bukkit.craftbukkit.block.CraftBlock eggBlock = org.bukkit.craftbukkit.block.CraftBlock.at(this.level, eggPosition);
+            org.bukkit.craftbukkit.block.CraftBlockState eggState = new org.bukkit.craftbukkit.block.CraftBlockState(eggBlock);
+            eggState.setData(Blocks.DRAGON_EGG.defaultBlockState());
+            DragonEggFormEvent eggEvent = new DragonEggFormEvent(eggBlock, eggState,
+                    new org.bukkit.craftbukkit.boss.CraftDragonBattle(this));
+            // Paper end - DragonEggFormEvent
             if (this.level.paperConfig.enderDragonsDeathAlwaysPlacesDragonEgg || !this.previouslyKilled) { // Paper - always place dragon egg
-                this.level.setBlockAndUpdate(this.level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, EndPodiumFeature.END_PODIUM_LOCATION), Blocks.DRAGON_EGG.defaultBlockState());
+                // Paper start - DragonEggFormEvent
+                //this.world.setTypeUpdate(this.world.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING, WorldGenEndTrophy.a), Blocks.DRAGON_EGG.getBlockData());
+            } else {
+                eggEvent.setCancelled(true);
+            }
+            if (eggEvent.callEvent()) {
+                eggEvent.getNewState().update(true);
             }
+            // Paper end - DragonEggFormEvent
 
             this.previouslyKilled = true;
             this.dragonKilled = true;
diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/EndPodiumFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/EndPodiumFeature.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/level/levelgen/feature/EndPodiumFeature.java
+++ b/src/main/java/net/minecraft/world/level/levelgen/feature/EndPodiumFeature.java
@@ -0,0 +0,0 @@ import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConf
 
 public class EndPodiumFeature extends Feature<NoneFeatureConfiguration> {
 
-    public static final BlockPos END_PODIUM_LOCATION = BlockPos.ZERO;
+    public static final BlockPos END_PODIUM_LOCATION = BlockPos.ZERO; public static BlockPos getPosition() { return END_PODIUM_LOCATION; } // Paper - OBFHELPER
     private final boolean active;
 
     public EndPodiumFeature(boolean open) {
@@ -0,0 +0,0 @@ public class EndPodiumFeature extends Feature<NoneFeatureConfiguration> {
         this.active = open;
     }
 
-    public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) {
-        Iterator iterator = BlockPos.betweenClosed(new BlockPos(pos.getX() - 4, pos.getY() - 1, pos.getZ() - 4), new BlockPos(pos.getX() + 4, pos.getY() + 32, pos.getZ() + 4)).iterator();
+    public boolean generate(WorldGenLevel generatoraccessseed, ChunkGenerator chunkgenerator, Random random, BlockPos blockposition, NoneFeatureConfiguration worldgenfeatureemptyconfiguration) { // Paper - decompile fix
+        Iterator iterator = BlockPos.betweenClosed(new BlockPos(blockposition.getX() - 4, blockposition.getY() - 1, blockposition.getZ() - 4), new BlockPos(blockposition.getX() + 4, blockposition.getY() + 32, blockposition.getZ() + 4)).iterator();
 
         while (iterator.hasNext()) {
             BlockPos blockposition1 = (BlockPos) iterator.next();
-            boolean flag = blockposition1.closerThan((Vec3i) pos, 2.5D);
+            boolean flag = blockposition1.closerThan((Vec3i) blockposition, 2.5D);
 
-            if (flag || blockposition1.closerThan((Vec3i) pos, 3.5D)) {
-                if (blockposition1.getY() < pos.getY()) {
+            if (flag || blockposition1.closerThan((Vec3i) blockposition, 3.5D)) {
+                if (blockposition1.getY() < blockposition.getY()) {
                     if (flag) {
-                        this.setBlock(world, blockposition1, Blocks.BEDROCK.defaultBlockState());
-                    } else if (blockposition1.getY() < pos.getY()) {
-                        this.setBlock(world, blockposition1, Blocks.END_STONE.defaultBlockState());
+                        this.setBlock(generatoraccessseed, blockposition1, Blocks.BEDROCK.defaultBlockState());
+                    } else if (blockposition1.getY() < blockposition.getY()) {
+                        this.setBlock(generatoraccessseed, blockposition1, Blocks.END_STONE.defaultBlockState());
                     }
-                } else if (blockposition1.getY() > pos.getY()) {
-                    this.setBlock(world, blockposition1, Blocks.AIR.defaultBlockState());
+                } else if (blockposition1.getY() > blockposition.getY()) {
+                    this.setBlock(generatoraccessseed, blockposition1, Blocks.AIR.defaultBlockState());
                 } else if (!flag) {
-                    this.setBlock(world, blockposition1, Blocks.BEDROCK.defaultBlockState());
+                    this.setBlock(generatoraccessseed, blockposition1, Blocks.BEDROCK.defaultBlockState());
                 } else if (this.active) {
-                    this.setBlock(world, new BlockPos(blockposition1), Blocks.END_PORTAL.defaultBlockState());
+                    this.setBlock(generatoraccessseed, new BlockPos(blockposition1), Blocks.END_PORTAL.defaultBlockState());
                 } else {
-                    this.setBlock(world, new BlockPos(blockposition1), Blocks.AIR.defaultBlockState());
+                    this.setBlock(generatoraccessseed, new BlockPos(blockposition1), Blocks.AIR.defaultBlockState());
                 }
             }
         }
 
         for (int i = 0; i < 4; ++i) {
-            this.setBlock(world, pos.above(i), Blocks.BEDROCK.defaultBlockState());
+            this.setBlock(generatoraccessseed, blockposition.above(i), Blocks.BEDROCK.defaultBlockState());
         }
 
-        BlockPos blockposition2 = pos.above(2);
+        BlockPos blockposition2 = blockposition.above(2);
         Iterator iterator1 = Direction.Plane.HORIZONTAL.iterator();
 
         while (iterator1.hasNext()) {
             Direction enumdirection = (Direction) iterator1.next();
 
-            this.setBlock(world, blockposition2.relative(enumdirection), (BlockState) Blocks.WALL_TORCH.defaultBlockState().setValue(WallTorchBlock.FACING, enumdirection));
+            this.setBlock(generatoraccessseed, blockposition2.relative(enumdirection), (BlockState) Blocks.WALL_TORCH.defaultBlockState().setValue(WallTorchBlock.FACING, enumdirection));
         }
 
         return true;