package net.minecraft.world.level.dimension.end; import com.google.common.collect.ImmutableList; import java.util.List; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import net.minecraft.world.level.Level; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.SpikeFeature; import net.minecraft.world.level.levelgen.feature.configurations.SpikeConfiguration; public enum DragonRespawnAnimation { START { @Override public void tick(ServerLevel p_64017_, EndDragonFight p_64018_, List p_64019_, int p_64020_, BlockPos p_64021_) { BlockPos blockpos = new BlockPos(0, 128, 0); for (EndCrystal endcrystal : p_64019_) { endcrystal.setBeamTarget(blockpos); } p_64018_.setRespawnStage(PREPARING_TO_SUMMON_PILLARS); } }, PREPARING_TO_SUMMON_PILLARS { @Override public void tick(ServerLevel p_64026_, EndDragonFight p_64027_, List p_64028_, int p_64029_, BlockPos p_64030_) { if (p_64029_ < 100) { if (p_64029_ == 0 || p_64029_ == 50 || p_64029_ == 51 || p_64029_ == 52 || p_64029_ >= 95) { p_64026_.levelEvent(3001, new BlockPos(0, 128, 0), 0); } } else { p_64027_.setRespawnStage(SUMMONING_PILLARS); } } }, SUMMONING_PILLARS { @Override public void tick(ServerLevel p_64035_, EndDragonFight p_64036_, List p_64037_, int p_64038_, BlockPos p_64039_) { int i = 40; boolean flag = p_64038_ % 40 == 0; boolean flag1 = p_64038_ % 40 == 39; if (flag || flag1) { List list = SpikeFeature.getSpikesForLevel(p_64035_); int j = p_64038_ / 40; if (j < list.size()) { SpikeFeature.EndSpike spikefeature$endspike = list.get(j); if (flag) { for (EndCrystal endcrystal : p_64037_) { endcrystal.setBeamTarget( new BlockPos(spikefeature$endspike.getCenterX(), spikefeature$endspike.getHeight() + 1, spikefeature$endspike.getCenterZ()) ); } } else { int k = 10; for (BlockPos blockpos : BlockPos.betweenClosed( new BlockPos(spikefeature$endspike.getCenterX() - 10, spikefeature$endspike.getHeight() - 10, spikefeature$endspike.getCenterZ() - 10), new BlockPos(spikefeature$endspike.getCenterX() + 10, spikefeature$endspike.getHeight() + 10, spikefeature$endspike.getCenterZ() + 10) )) { p_64035_.removeBlock(blockpos, false); } p_64035_.explode( null, spikefeature$endspike.getCenterX() + 0.5F, spikefeature$endspike.getHeight(), spikefeature$endspike.getCenterZ() + 0.5F, 5.0F, Level.ExplosionInteraction.BLOCK ); SpikeConfiguration spikeconfiguration = new SpikeConfiguration(true, ImmutableList.of(spikefeature$endspike), new BlockPos(0, 128, 0)); Feature.END_SPIKE .place( spikeconfiguration, p_64035_, p_64035_.getChunkSource().getGenerator(), RandomSource.create(), new BlockPos(spikefeature$endspike.getCenterX(), 45, spikefeature$endspike.getCenterZ()) ); } } else if (flag) { p_64036_.setRespawnStage(SUMMONING_DRAGON); } } } }, SUMMONING_DRAGON { @Override public void tick(ServerLevel p_64044_, EndDragonFight p_64045_, List p_64046_, int p_64047_, BlockPos p_64048_) { if (p_64047_ >= 100) { p_64045_.setRespawnStage(END); p_64045_.resetSpikeCrystals(); for (EndCrystal endcrystal : p_64046_) { endcrystal.setBeamTarget(null); p_64044_.explode(endcrystal, endcrystal.getX(), endcrystal.getY(), endcrystal.getZ(), 6.0F, Level.ExplosionInteraction.NONE); endcrystal.discard(); } } else if (p_64047_ >= 80) { p_64044_.levelEvent(3001, new BlockPos(0, 128, 0), 0); } else if (p_64047_ == 0) { for (EndCrystal endcrystal1 : p_64046_) { endcrystal1.setBeamTarget(new BlockPos(0, 128, 0)); } } else if (p_64047_ < 5) { p_64044_.levelEvent(3001, new BlockPos(0, 128, 0), 0); } } }, END { @Override public void tick(ServerLevel p_64053_, EndDragonFight p_64054_, List p_64055_, int p_64056_, BlockPos p_64057_) { } }; public abstract void tick(ServerLevel p_64005_, EndDragonFight p_64006_, List p_64007_, int p_64008_, BlockPos p_64009_); }