// priority: 9
'use strict';

onEvent('ponder.registry', (event) => {
    event
        .create('enigmatica:respawn_ender_dragon', [
            'minecraft:end_crystal',
            'minecraft:dragon_egg',
            'minecraft:dragon_head'
        ])

        .scene(
            'respawn_ender_dragon',
            'Ender Dragon Respawning - when you need to make an omlet',
            'enigmatica:enigmatica/ender_dragon/end_portal',
            (scene, util) => {
                scene.showBasePlate();

                scene.idle(20);

                scene
                    .overlay()
                    .showText(60)
                    .colored(PonderPalette.WHITE)
                    .text(`So, you've killed the Ender Dragon and activated the end portal - congrats!`)
                    .independent(60);

                scene.idle(30);

                scene.addKeyframe();

                scene.world().showSection(util.select().layersFrom(1), Facing.south);

                scene.idle(40);

                scene
                    .overlay()
                    .showText(60)
                    .colored(PonderPalette.WHITE)
                    .text(`But now you need to summon it again - maybe you need another dragon egg or head.`)
                    .independent(180);

                scene.idle(10);
                scene
                    .world()
                    .setBlocks(util.select().position(4, 5, 4), util.getDefaultState('minecraft:air'), true);
                scene
                    .world()
                    .setBlocks(util.select().position(4, 4, 3), util.getDefaultState('minecraft:air'), true);
                scene.idle(60);

                scene
                    .overlay()
                    .showText(60)
                    .colored(PonderPalette.WHITE)
                    .text(`Place End Crystals on the four sides of the portal frame, like this.`)
                    .independent(90);

                scene.idle(10);

                let crystal1 = scene.world().createEntity('minecraft:end_crystal', [1.5, 2, 4.5]);
                scene.world().modifyEntity(crystal1, { ShowBottom: '0b' });
                scene.world().modifyEntity(crystal1, (e) => {
                    let NBT = e.getFullNBT();
                    NBT.ShowBottom = false;
                    e.setFullNBT(NBT);
                });
                scene.idle(20);
                let crystal2 = scene.world().createEntity('minecraft:end_crystal', [4.5, 2, 1.5]);
                scene.world().modifyEntity(crystal2, (e) => {
                    let NBT = e.getFullNBT();
                    NBT.ShowBottom = false;
                    e.setFullNBT(NBT);
                });
                scene.idle(20);
                let crystal3 = scene.world().createEntity('minecraft:end_crystal', [7.5, 2, 4.5]);
                scene.world().modifyEntity(crystal3, (e) => {
                    let NBT = e.getFullNBT();
                    NBT.ShowBottom = false;
                    e.setFullNBT(NBT);
                });
                scene.idle(20);

                scene
                    .overlay()
                    .showText(60)
                    .colored(PonderPalette.WHITE)
                    .text(`Placing the last one will shut off the End Portal, and resummon the Ender Dragon.`)
                    .independent(0);

                let crystal4 = scene.world().createEntity('minecraft:end_crystal', [4.5, 2, 7.5]);
                scene.world().modifyEntity(crystal4, (e) => {
                    let NBT = e.getFullNBT();
                    NBT.ShowBottom = false;
                    e.setFullNBT(NBT);
                });
                scene.idle(10);

                scene.world().modifyEntity(crystal1, (e) => {
                    let NBT = e.getFullNBT();
                    NBT.BeamTarget = { X: 4.5, Y: 5, Z: 4.5 };
                    e.setFullNBT(NBT);
                });
                scene.world().modifyEntity(crystal2, (e) => {
                    let NBT = e.getFullNBT();
                    NBT.BeamTarget = { X: 4.5, Y: 5, Z: 4.5 };
                    e.setFullNBT(NBT);
                });
                scene.world().modifyEntity(crystal3, (e) => {
                    let NBT = e.getFullNBT();
                    NBT.BeamTarget = { X: 4.5, Y: 5, Z: 4.5 };
                    e.setFullNBT(NBT);
                });
                scene.world().modifyEntity(crystal4, (e) => {
                    let NBT = e.getFullNBT();
                    NBT.BeamTarget = { X: 4.5, Y: 5, Z: 4.5 };
                    e.setFullNBT(NBT);
                });
                scene.idle(60);

                let dragon = scene.world().createEntity('minecraft:ender_dragon', [4.5, 5.5, 4.5]);

                scene.idle(10);

                scene.world().modifyEntity(crystal1, (e) => {
                    e.kill();
                });
                scene.world().modifyEntity(crystal2, (e) => {
                    e.kill();
                });
                scene.world().modifyEntity(crystal3, (e) => {
                    e.kill();
                });
                scene.world().modifyEntity(crystal4, (e) => {
                    e.kill();
                });

                scene
                    .world()
                    .setBlocks(
                        util.select().fromTo(2, 1, 3, 3, 1, 5),
                        util.getDefaultState('minecraft:air'),
                        true
                    );
                scene
                    .world()
                    .setBlocks(
                        util.select().fromTo(3, 1, 2, 5, 1, 3),
                        util.getDefaultState('minecraft:air'),
                        true
                    );
                scene
                    .world()
                    .setBlocks(
                        util.select().fromTo(3, 1, 5, 5, 1, 6),
                        util.getDefaultState('minecraft:air'),
                        true
                    );
                scene
                    .world()
                    .setBlocks(
                        util.select().fromTo(5, 1, 3, 6, 1, 5),
                        util.getDefaultState('minecraft:air'),
                        true
                    );

                scene.idle(100);
            }
        );
});
