65 lines
		
	
	
	
		
			3.8 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
	
		
			3.8 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
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/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
 | 
						|
@@ -0,0 +0,0 @@ public class EndCrystal extends Entity {
 | 
						|
     private static final EntityDataAccessor<Optional<BlockPos>> DATA_BEAM_TARGET = SynchedEntityData.defineId(EndCrystal.class, EntityDataSerializers.OPTIONAL_BLOCK_POS);
 | 
						|
     private static final EntityDataAccessor<Boolean> DATA_SHOW_BOTTOM = SynchedEntityData.defineId(EndCrystal.class, EntityDataSerializers.BOOLEAN);
 | 
						|
     public int time;
 | 
						|
+    public boolean generatedByDragonFight = false; // Paper - Fix invulnerable end crystals
 | 
						|
 
 | 
						|
     public EndCrystal(EntityType<? extends EndCrystal> type, Level world) {
 | 
						|
         super(type, world);
 | 
						|
@@ -0,0 +0,0 @@ public class EndCrystal extends Entity {
 | 
						|
                 }
 | 
						|
                 // CraftBukkit end
 | 
						|
             }
 | 
						|
+            // Paper start - Fix invulnerable end crystals
 | 
						|
+            if (this.level.paperConfig().unsupportedSettings.fixInvulnerableEndCrystalExploit && this.generatedByDragonFight && this.isInvulnerable()) {
 | 
						|
+                if (!java.util.Objects.equals(((ServerLevel) this.level).uuid, this.getOriginWorld())
 | 
						|
+                    || ((ServerLevel) this.level).dragonFight() == null
 | 
						|
+                    || ((ServerLevel) this.level).dragonFight().respawnStage == null
 | 
						|
+                    || ((ServerLevel) this.level).dragonFight().respawnStage.ordinal() > net.minecraft.world.level.dimension.end.DragonRespawnAnimation.SUMMONING_DRAGON.ordinal()) {
 | 
						|
+                    this.setInvulnerable(false);
 | 
						|
+                    this.setBeamTarget(null);
 | 
						|
+                }
 | 
						|
+            }
 | 
						|
+            // Paper end
 | 
						|
         }
 | 
						|
 
 | 
						|
     }
 | 
						|
@@ -0,0 +0,0 @@ public class EndCrystal extends Entity {
 | 
						|
         }
 | 
						|
 
 | 
						|
         nbt.putBoolean("ShowBottom", this.showsBottom());
 | 
						|
+        if (this.generatedByDragonFight) nbt.putBoolean("Paper.GeneratedByDragonFight", this.generatedByDragonFight); // Paper - Fix invulnerable end crystals
 | 
						|
     }
 | 
						|
 
 | 
						|
     @Override
 | 
						|
@@ -0,0 +0,0 @@ public class EndCrystal extends Entity {
 | 
						|
         if (nbt.contains("ShowBottom", 1)) {
 | 
						|
             this.setShowBottom(nbt.getBoolean("ShowBottom"));
 | 
						|
         }
 | 
						|
+        if (nbt.contains("Paper.GeneratedByDragonFight", 1)) this.generatedByDragonFight = nbt.getBoolean("Paper.GeneratedByDragonFight"); // Paper - Fix invulnerable end crystals
 | 
						|
 
 | 
						|
     }
 | 
						|
 
 | 
						|
diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/SpikeFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/SpikeFeature.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/world/level/levelgen/feature/SpikeFeature.java
 | 
						|
+++ b/src/main/java/net/minecraft/world/level/levelgen/feature/SpikeFeature.java
 | 
						|
@@ -0,0 +0,0 @@ public class SpikeFeature extends Feature<SpikeConfiguration> {
 | 
						|
         endCrystal.setBeamTarget(config.getCrystalBeamTarget());
 | 
						|
         endCrystal.setInvulnerable(config.isCrystalInvulnerable());
 | 
						|
         endCrystal.moveTo((double)spike.getCenterX() + 0.5D, (double)(spike.getHeight() + 1), (double)spike.getCenterZ() + 0.5D, random.nextFloat() * 360.0F, 0.0F);
 | 
						|
+        endCrystal.generatedByDragonFight = true; // Paper
 | 
						|
         world.addFreshEntity(endCrystal);
 | 
						|
         this.setBlock(world, new BlockPos(spike.getCenterX(), spike.getHeight(), spike.getCenterZ()), Blocks.BEDROCK.defaultBlockState());
 | 
						|
     }
 |