From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Max Lee <max@themoep.de>
Date: Thu, 27 May 2021 14:52:30 -0700
Subject: [PATCH] Fix invulnerable end crystals

MC-108513

diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -0,0 +0,0 @@ public class PaperWorldConfig {
     private void fixItemsMergingThroughWalls() {
         fixItemsMergingThroughWalls = getBoolean("fix-items-merging-through-walls", fixItemsMergingThroughWalls);
     }
+
+    public boolean fixInvulnerableEndCrystalExploit = true;
+    private void fixInvulnerableEndCrystalExploit() {
+        fixInvulnerableEndCrystalExploit = getBoolean("unsupported-settings.fix-invulnerable-end-crystal-exploit", fixInvulnerableEndCrystalExploit);
+    }
 }
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java
@@ -0,0 +0,0 @@ public class EntityEnderCrystal extends Entity {
     private static final DataWatcherObject<Optional<BlockPosition>> c = DataWatcher.a(EntityEnderCrystal.class, DataWatcherRegistry.m);
     private static final DataWatcherObject<Boolean> d = DataWatcher.a(EntityEnderCrystal.class, DataWatcherRegistry.i);
     public int b;
+    public boolean generatedByDragonFight = false; // Paper - Fix invulnerable end crystals
 
     public EntityEnderCrystal(EntityTypes<? extends EntityEnderCrystal> entitytypes, World world) {
         super(entitytypes, world);
@@ -0,0 +0,0 @@ public class EntityEnderCrystal extends Entity {
                 }
                 // CraftBukkit end
             }
+            // Paper start - Fix invulnerable end crystals
+            if (this.world.paperConfig.fixInvulnerableEndCrystalExploit && this.generatedByDragonFight && this.isInvulnerable()) {
+                if ((this.origin.getWorld() != null && !((WorldServer) this.world).uuid.equals(this.origin.getWorld().getUID()))
+                    || ((WorldServer) this.world).getDragonBattle() == null
+                    || ((WorldServer) this.world).getDragonBattle().respawnPhase == null
+                    || ((WorldServer) this.world).getDragonBattle().respawnPhase.ordinal() > net.minecraft.world.level.dimension.end.EnumDragonRespawn.SUMMONING_DRAGON.ordinal()) {
+                    this.setInvulnerable(false);
+                    this.setBeamTarget(null);
+                }
+            }
+            // Paper end
         }
 
     }
@@ -0,0 +0,0 @@ public class EntityEnderCrystal extends Entity {
         }
 
         nbttagcompound.setBoolean("ShowBottom", this.isShowingBottom());
+        if (this.generatedByDragonFight) nbttagcompound.setBoolean("Paper.GeneratedByDragonFight", this.generatedByDragonFight); // Paper - Fix invulnerable end crystals
     }
 
     @Override
@@ -0,0 +0,0 @@ public class EntityEnderCrystal extends Entity {
         if (nbttagcompound.hasKeyOfType("ShowBottom", 1)) {
             this.setShowingBottom(nbttagcompound.getBoolean("ShowBottom"));
         }
+        if (nbttagcompound.hasKeyOfType("Paper.GeneratedByDragonFight", 1)) this.generatedByDragonFight = nbttagcompound.getBoolean("Paper.GeneratedByDragonFight"); // Paper - Fix invulnerable end crystals
 
     }
 
diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/WorldGenEnder.java b/src/main/java/net/minecraft/world/level/levelgen/feature/WorldGenEnder.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/level/levelgen/feature/WorldGenEnder.java
+++ b/src/main/java/net/minecraft/world/level/levelgen/feature/WorldGenEnder.java
@@ -0,0 +0,0 @@ public class WorldGenEnder extends WorldGenerator<WorldGenFeatureEndSpikeConfigu
         return (List) WorldGenEnder.a.getUnchecked(i);
     }
 
-    public boolean a(GeneratorAccessSeed generatoraccessseed, ChunkGenerator chunkgenerator, Random random, BlockPosition blockposition, WorldGenFeatureEndSpikeConfiguration worldgenfeatureendspikeconfiguration) {
+    public boolean generate(GeneratorAccessSeed generatoraccessseed, ChunkGenerator chunkgenerator, Random random, BlockPosition blockposition, WorldGenFeatureEndSpikeConfiguration worldgenfeatureendspikeconfiguration) { // Paper - decompile fix
         List<WorldGenEnder.Spike> list = worldgenfeatureendspikeconfiguration.c();
 
         if (list.isEmpty()) {
@@ -0,0 +0,0 @@ public class WorldGenEnder extends WorldGenerator<WorldGenFeatureEndSpikeConfigu
         entityendercrystal.setBeamTarget(worldgenfeatureendspikeconfiguration.d());
         entityendercrystal.setInvulnerable(worldgenfeatureendspikeconfiguration.b());
         entityendercrystal.setPositionRotation((double) worldgenender_spike.a() + 0.5D, (double) (worldgenender_spike.d() + 1), (double) worldgenender_spike.b() + 0.5D, random.nextFloat() * 360.0F, 0.0F);
+        entityendercrystal.generatedByDragonFight = true;
         worldaccess.addEntity(entityendercrystal);
         this.a(worldaccess, new BlockPosition(worldgenender_spike.a(), worldgenender_spike.d(), worldgenender_spike.b()), Blocks.BEDROCK.getBlockData());
     }