From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Max Lee 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/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> DATA_BEAM_TARGET = SynchedEntityData.defineId(EndCrystal.class, EntityDataSerializers.OPTIONAL_BLOCK_POS); private static final EntityDataAccessor DATA_SHOW_BOTTOM = SynchedEntityData.defineId(EndCrystal.class, EntityDataSerializers.BOOLEAN); public int time; + public boolean generatedByDragonFight = false; // Paper - Fix invulnerable end crystals public EndCrystal(EntityType 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.fixInvulnerableEndCrystalExploit && this.generatedByDragonFight && this.isInvulnerable()) { + if ((this.origin.getWorld() != null && !((ServerLevel) this.level).uuid.equals(this.origin.getWorld().getUID())) + || ((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 { } tag.putBoolean("ShowBottom", this.showsBottom()); + if (this.generatedByDragonFight) tag.putBoolean("Paper.GeneratedByDragonFight", this.generatedByDragonFight); // Paper - Fix invulnerable end crystals } @Override @@ -0,0 +0,0 @@ public class EndCrystal extends Entity { if (tag.contains("ShowBottom", 1)) { this.setShowBottom(tag.getBoolean("ShowBottom")); } + if (tag.contains("Paper.GeneratedByDragonFight", 1)) this.generatedByDragonFight = tag.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 { return (List) SpikeFeature.SPIKE_CACHE.getUnchecked(i); } - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, SpikeConfiguration config) { - List list = config.getSpikes(); + public boolean generate(WorldGenLevel generatoraccessseed, ChunkGenerator chunkgenerator, Random random, BlockPos blockposition, SpikeConfiguration worldgenfeatureendspikeconfiguration) { // Paper - decompile fix + List list = worldgenfeatureendspikeconfiguration.getSpikes(); if (list.isEmpty()) { - list = getSpikesForLevel(world); + list = getSpikesForLevel(generatoraccessseed); } Iterator iterator = list.iterator(); @@ -0,0 +0,0 @@ public class SpikeFeature extends Feature { while (iterator.hasNext()) { SpikeFeature.EndSpike worldgenender_spike = (SpikeFeature.EndSpike) iterator.next(); - if (worldgenender_spike.isCenterWithinChunk(pos)) { - this.placeSpike(world, random, config, worldgenender_spike); + if (worldgenender_spike.isCenterWithinChunk(blockposition)) { + this.placeSpike(generatoraccessseed, random, worldgenfeatureendspikeconfiguration, worldgenender_spike); } } @@ -0,0 +0,0 @@ public class SpikeFeature extends Feature { entityendercrystal.setBeamTarget(config.getCrystalBeamTarget()); entityendercrystal.setInvulnerable(config.isCrystalInvulnerable()); entityendercrystal.moveTo((double) spike.getCenterX() + 0.5D, (double) (spike.getHeight() + 1), (double) spike.getCenterZ() + 0.5D, random.nextFloat() * 360.0F, 0.0F); + entityendercrystal.generatedByDragonFight = true; world.addFreshEntity(entityendercrystal); this.setBlock(world, new BlockPos(spike.getCenterX(), spike.getHeight(), spike.getCenterZ()), Blocks.BEDROCK.defaultBlockState()); }