nageyqma·git
HTTPS https://git.nageyqma.icu/nageyqma/blade-addons-next.git SSH git@git.nageyqma.icu:nageyqma/blade-addons-next.git

HTTPS 链接可直接 git clone;推送代码请使用 SSH。

3.0 KB · 100 行raw
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
package blade.addon.features.dungeon.f7.dragons;

import blade.addon.utils.Misc;
import blade.addon.utils.config.values.Floor7;
import blade.addon.utils.debug.Debug;
import blade.addon.utils.events.Events;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket;
import net.minecraft.sounds.SoundEvents;

public class DragonSpawn {

    public enum Team {
        ARCHER_TEAM("Archer team"), BERS_TEAM("Bers team");

        private final String label;

        Team(String label) {
            this.label = label;
        }

        @Override
        public String toString() {
            return label;
        }
    }

    private static final int SPAWN_DURATION = 100;

    static Dragon currentDragon = Dragon.NONE;
    static boolean hasDoneSplit = false;
    private static int tick = 0;

    public static void init() {
        Events.ON_PARTICLE.register(packet -> {
            if (!validParticle(packet)) return false;
            Dragon dragon = Dragon.getDragon(packet.x(), packet.y(), packet.z());
            testDragon(dragon);
            return false;
        });

        Events.ON_SERVER_TICK.register(() -> {
            tick = Math.max(tick - 1, 0);

            if (tick == 0 && currentDragon != Dragon.NONE) {
                currentDragon = Dragon.NONE;
            }
            return false;
        });

        Events.ON_LOCATION_CHANGE.register(_ -> {
            resetInfo();
            return false;
        });
    }

    private static void testDragon(Dragon dragon) {
        if (dragon == Dragon.NONE) return;

        if (currentDragon == Dragon.NONE) {
            Debug.sendDebugMessage(Component.literal("Drag: " + currentDragon.name()));
            currentDragon = dragon;
            tick = SPAWN_DURATION;

            if (Floor7.sendSoundOnDragSpawn) {
                Misc.sendSound(SoundEvents.NOTE_BLOCK_PLING.value(), 0.75f, 1);
            }

        } else if (currentDragon != dragon && !hasDoneSplit) {
            Debug.sendDebugMessage(Component.literal("comparing: " + currentDragon.name() + " and " +  dragon.name()));
            currentDragon = Dragon.getPrio(dragon, currentDragon);
            hasDoneSplit = true;
        }
    }

    private static boolean validParticle(ClientboundLevelParticlesPacket packet) {
        // 26.3 turned ClientboundLevelParticlesPacket into a record: getters are now record accessors.
        if (packet.count() != 20) return false;
        if (packet.y() != 19) return false;
        if (packet.particle().getType() != ParticleTypes.FLAME) return false;
        if (packet.xDist() != 2) return false;
        if (packet.yDist() != 3) return false;
        if (packet.zDist() != 2) return false;
        if (packet.x() % 1 != 0) return false;
        if (packet.z() % 1 != 0) return false;
        return true;
    }

    private static void resetInfo() {
        hasDoneSplit = false;
        currentDragon = Dragon.NONE;
        tick = 0;
    }

    public static int getTick() {
        return tick;
    }
}