SPIGOT-7063, #1071: Add DragonBattle#initiateRespawn with custom EnderCrystals

By: Doc <nachito94@msn.com>
This commit is contained in:
CraftBukkit/Spigot
2023-08-05 09:24:52 +10:00
parent fa4400a9a0
commit 2a8121eac7
2 changed files with 98 additions and 1 deletions

View File

@@ -1,14 +1,22 @@
package org.bukkit.craftbukkit.boss;
import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.stream.Collectors;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.state.pattern.ShapeDetector;
import net.minecraft.world.level.dimension.end.EnderDragonBattle;
import net.minecraft.world.level.dimension.end.EnumDragonRespawn;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.boss.BossBar;
import org.bukkit.boss.DragonBattle;
import org.bukkit.boss.DragonBattle.RespawnPhase;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.entity.CraftEnderCrystal;
import org.bukkit.craftbukkit.util.CraftLocation;
import org.bukkit.entity.EnderCrystal;
import org.bukkit.entity.EnderDragon;
public class CraftDragonBattle implements DragonBattle {
@@ -59,6 +67,32 @@ public class CraftDragonBattle implements DragonBattle {
this.handle.tryRespawn();
}
@Override
public boolean initiateRespawn(Collection<EnderCrystal> list) {
if (hasBeenPreviouslyKilled() && getRespawnPhase() == RespawnPhase.NONE) {
// Copy from EnderDragonBattle#tryRespawn for generate exit portal if not exists
if (this.handle.portalLocation == null) {
ShapeDetector.ShapeDetectorCollection shapedetector_shapedetectorcollection = this.handle.findExitPortal();
if (shapedetector_shapedetectorcollection == null) {
this.handle.spawnExitPortal(true);
}
}
list = (list != null) ? new ArrayList<>(list) : Collections.emptyList();
list.removeIf(enderCrystal -> {
if (enderCrystal == null) {
return true;
}
World world = enderCrystal.getWorld();
return !((CraftWorld) world).getHandle().equals(handle.level);
});
return this.handle.respawnDragon(list.stream().map(enderCrystal -> ((CraftEnderCrystal) enderCrystal).getHandle()).collect(Collectors.toList()));
}
return false;
}
@Override
public RespawnPhase getRespawnPhase() {
return toBukkitRespawnPhase(handle.respawnStage);