aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0625-Fix-invulnerable-end-crystals.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0625-Fix-invulnerable-end-crystals.patch')
-rw-r--r--patches/server/0625-Fix-invulnerable-end-crystals.patch65
1 files changed, 65 insertions, 0 deletions
diff --git a/patches/server/0625-Fix-invulnerable-end-crystals.patch b/patches/server/0625-Fix-invulnerable-end-crystals.patch
new file mode 100644
index 0000000000..b023697625
--- /dev/null
+++ b/patches/server/0625-Fix-invulnerable-end-crystals.patch
@@ -0,0 +1,65 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Max Lee <[email protected]>
+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 e6d137cd6d89ac8cca76105edbab75c506c966d6..5465711d486e5f265a26042031e895fb09e30608 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
+@@ -29,6 +29,7 @@ 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);
+@@ -65,6 +66,17 @@ 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()).getDragonFight() == null
++ || ((ServerLevel) this.level()).getDragonFight().respawnStage == null
++ || ((ServerLevel) this.level()).getDragonFight().respawnStage.ordinal() > net.minecraft.world.level.dimension.end.DragonRespawnAnimation.SUMMONING_DRAGON.ordinal()) {
++ this.setInvulnerable(false);
++ this.setBeamTarget(null);
++ }
++ }
++ // Paper end
+ }
+
+ }
+@@ -76,6 +88,7 @@ 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
+@@ -87,6 +100,7 @@ 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 32903759e94e43328de38a985cc121252c81f481..570c0646e245a1527b3a569f2c8a6fae5b18b373 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
+@@ -100,6 +100,7 @@ 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());
+ }