HTTPS
https://git.nageyqma.icu/nageyqma/blade-addons-next.git
SSH
git@git.nageyqma.icu:nageyqma/blade-addons-next.git
HTTPS 链接可直接 git clone;推送代码请使用 SSH。
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;
}
}