Skip to content

DragonBattle API #14183

Description

@davight

Expected behavior

  • Calling DragonBattle#initiateRespawn() or the other one with Collection arg, should start the dragon respawn sequence, advancing getRespawnPhase() as the vanilla animation runs
  • Calling resetCrystals() should reset the crystals on the obsidian pillars

Observed/Actual behavior

  • Calling initiateRespawn(List.of()) reports phase START for a moment, then immediately goes back to NONE on the next check. (it only tries to respawn torches for some reason)
  • Calling initiateRespawn() (no-arg) never shows anything other than NONE.
  • resetCrystals() does nothing at all
  • No exceptions or warnings are printed to console in any case.

Steps/models to reproduce

  1. Kill the dragon
  2. Try calling any of these methods
  3. Observe

Plugin and Datapack List

> plugins
[12:54:33 INFO]: ℹ Server Plugins (1):
[12:54:33 INFO]: Bukkit Plugins:
[12:54:33 INFO]:  - TestPlugin
> datapack list
[12:54:36 INFO]: There are 3 data pack(s) enabled: [vanilla (built-in)], [file/bukkit (world)], [paper (built-in)]
[12:54:36 INFO]: There are no more data packs available
> 

Paper version

> version
[12:55:38 INFO]: This server is running Paper version 26.2-112-main@c9e894d (2026-08-11T05:18:39Z) (Implementing API version 26.2.build.112-stable)
You are running the latest version
Previous version: 26.2-87-a95ae8d (MC: 26.2)

Other

My minimal test command

public class DragonBattleCommand {

    public static LiteralCommandNode<CommandSourceStack> command() {
        return Commands.literal("dragonbattle")
                .then(Commands.literal("start_print")
                        .executes(context -> {
                            Player player = getPlayer(context.getSource());
                            DragonBattle battle = getBattle(player);
                            Bukkit.getServer().getScheduler().runTaskTimer(TestPlugin.instance, () -> {
                                sendPhaseInfo(player, battle);
                            }, 0, 20);
                        return Command.SINGLE_SUCCESS;
                }))
                .then(Commands.literal("initiate")
                    .executes(context -> {
                        Player player = getPlayer(context.getSource());
                        DragonBattle battle = getBattle(player);

                        sendPhaseInfo(player, battle);
                        battle.initiateRespawn();
                        player.sendMessage("Initiated respawn");
                        sendPhaseInfo(player, battle);
                        return Command.SINGLE_SUCCESS;
                }))
                .then(Commands.literal("initiate_empty")
                    .executes(context -> {
                        Player player = getPlayer(context.getSource());
                        DragonBattle battle = getBattle(player);

                        sendPhaseInfo(player, battle);
                        battle.initiateRespawn(List.of());
                        sendPhaseInfo(player, battle);
                        return Command.SINGLE_SUCCESS;
                }))
                .then(Commands.literal("reset_crystals")
                    .executes(context -> {
                        Player player = getPlayer(context.getSource());
                        DragonBattle battle = getBattle(player);

                        sendPhaseInfo(player, battle);
                        battle.resetCrystals();
                        sendPhaseInfo(player, battle);
                        return Command.SINGLE_SUCCESS;
                }))
                .build();
    }

    private static void sendPhaseInfo(Player player, DragonBattle battle) {
         player.sendMessage("Respawn phase now: " + battle.getRespawnPhase().name());
    }

    private static Player getPlayer(CommandSourceStack source) {
        return (Player) source.getExecutor();
    }

    private static DragonBattle getBattle(Player player) {
        return player.getWorld().getEnderDragonBattle();
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: acceptedDisputed bug is accepted as valid or Feature accepted as desired to be added.version: 26.2

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions