mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-02 04:56:50 +01:00
89d51d5f29
Because this exploit has been widely known for years and has not been fixed by Mojang, we decided that it was worth allowing people to toggle it on/off due to how easy it is to make it configurable. It should be noted that this decision does not promise all future exploits will be configurable.
65 lines
3.9 KiB
Diff
65 lines
3.9 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 e7e01effab5f727d9b84a0575d165127e3dfe4c9..036640d49a5e891e9a0f767abe33f1f51d6d4cde 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
|
|
@@ -30,6 +30,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);
|
|
@@ -66,6 +67,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 - Fix invulnerable end crystals
|
|
}
|
|
|
|
}
|
|
@@ -77,6 +89,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
|
|
@@ -88,6 +101,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 4b685e185ebac8553f1f81d1a5a04be8166a6ca4..3b36caafde83c87c823277e2085ee82ae497b9be 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
|
|
@@ -101,6 +101,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 - Fix invulnerable end crystals
|
|
world.addFreshEntity(endCrystal);
|
|
BlockPos blockPos2 = endCrystal.blockPosition();
|
|
this.setBlock(world, blockPos2.below(), Blocks.BEDROCK.defaultBlockState());
|