This commit is contained in:
Jake Potrebic 2024-05-01 00:11:53 +08:00 committed by GitHub
commit 5f9f3aeffa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 76 additions and 0 deletions

View File

@ -0,0 +1,23 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Sun, 23 May 2021 18:32:26 -0700
Subject: [PATCH] Add ender dragon boss spawn reason
diff --git a/src/main/java/org/bukkit/event/entity/CreatureSpawnEvent.java b/src/main/java/org/bukkit/event/entity/CreatureSpawnEvent.java
index 6d5c81824c7cb36f0c76baf532434fb7bf233da6..38d6f20714403b3fc9ee1c3d3bfc8aff9cecac75 100644
--- a/src/main/java/org/bukkit/event/entity/CreatureSpawnEvent.java
+++ b/src/main/java/org/bukkit/event/entity/CreatureSpawnEvent.java
@@ -177,6 +177,12 @@ public class CreatureSpawnEvent extends EntitySpawnEvent {
* When a piglin is converted to a zombified piglin.
*/
PIGLIN_ZOMBIFIED,
+ // Paper start
+ /**
+ * When an ender dragon is spawned as part of a boss battle.
+ */
+ ENDER_DRAGON_BOSS,
+ // Paper end
/**
* When an entity is created by a cast spell.
*/

View File

@ -0,0 +1,53 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Sun, 23 May 2021 18:32:38 -0700
Subject: [PATCH] Fix cancelling ender dragon spawn
Previously, the boss bar and fog would still show up if the dragon spawn
had been cancelled.
diff --git a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
index f8d846345c1cc3c78f9ac14635b26f2affc77190..7ea2f23a90c74b82dc11aa18d8b369f26c037bee 100644
--- a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
+++ b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java
@@ -250,7 +250,12 @@ public class EndDragonFight {
if (spawnState == DragonRespawnAnimation.END) {
this.respawnStage = null;
this.dragonKilled = false;
- EnderDragon enderDragon = this.createNewDragon();
+ // Paper start - handle cancelled CreatureSpawnEvent
+ EnderDragon enderDragon = this.createNewDragon(true);
+ if (enderDragon == null) {
+ return;
+ }
+ // Paper end
for(ServerPlayer serverPlayer : this.dragonEvent.getPlayers()) {
CriteriaTriggers.SUMMONED_ENTITY.trigger(serverPlayer, enderDragon);
@@ -422,11 +427,25 @@ public class EndDragonFight {
}
private EnderDragon createNewDragon() {
+ // Paper start
+ return this.createNewDragon(false);
+ }
+ private @Nullable EnderDragon createNewDragon(boolean respawn) {
+ // Paper end
this.level.getChunkAt(new BlockPos(0, 128, 0));
EnderDragon enderDragon = EntityType.ENDER_DRAGON.create(this.level);
enderDragon.getPhaseManager().setPhase(EnderDragonPhase.HOLDING_PATTERN);
enderDragon.moveTo(0.0D, 128.0D, 0.0D, this.level.random.nextFloat() * 360.0F, 0.0F);
- this.level.addFreshEntity(enderDragon);
+ // Paper start - handle cancelled CreatureSpawnEvent
+ if (!this.level.addFreshEntity(enderDragon, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.ENDER_DRAGON_BOSS)) {
+ this.dragonKilled = true;
+ this.dragonEvent.setVisible(false);
+ if (respawn) {
+ this.spawnExitPortal(true); // revert to lit portal
+ }
+ return null;
+ }
+ // Paper end
this.dragonUUID = enderDragon.getUUID();
this.resetSpikeCrystals(); // Paper
return enderDragon;