53 lines
2.0 KiB
JavaScript
53 lines
2.0 KiB
JavaScript
const Material = Java.type('net.minestom.server.item.Material');
|
|
const Sound = Java.type('net.kyori.adventure.sound.Sound');
|
|
const SoundEvent = Java.type('net.minestom.server.sound.SoundEvent');
|
|
const Entity = Java.type('net.minestom.server.entity.Entity');
|
|
const EntityType = Java.type('net.minestom.server.entity.EntityType');
|
|
const Duration = Java.type('java.time.Duration');
|
|
|
|
server.log("Vanilla Elytra Boost loaded.");
|
|
|
|
server.on('net.minestom.server.event.player.PlayerUseItemEvent', (event) => {
|
|
const player = event.getPlayer();
|
|
const item = event.getItemStack();
|
|
|
|
// 1. Validate Condition
|
|
if (item.material().name() !== "minecraft:firework_rocket") return;
|
|
if (!player.isFlyingWithElytra()) return;
|
|
|
|
// 2. Consume Item (if not creative)
|
|
if (player.getGameMode().name() !== "CREATIVE") {
|
|
player.setItemInHand(event.getHand(), item.withAmount(item.amount() - 1));
|
|
}
|
|
|
|
// 3. Spawn Firework Rocket
|
|
// The entity itself handles the boosting physics in Minestom/Client
|
|
const rocket = new Entity(EntityType.fromKey("minecraft:firework_rocket"));
|
|
const meta = rocket.getEntityMeta();
|
|
|
|
meta.setFireworkInfo(item);
|
|
meta.setShooter(player);
|
|
|
|
// Spawn at player position
|
|
rocket.setInstance(player.getInstance(), player.getPosition());
|
|
|
|
// Set rocket velocity to fly in look direction
|
|
const direction = player.getPosition().direction();
|
|
rocket.setVelocity(direction.mul(1.5)); // Adjust rocket speed if needed
|
|
|
|
// Cleanup: Remove rocket after lifetime (e.g., 1.5s for duration 3)
|
|
// Vanilla duration calculation is roughly (FlightDuration + 1) * 10 + random ticks
|
|
// 1.5s is a safe average for Duration 3
|
|
rocket.scheduleRemove(Duration.ofMillis(1500));
|
|
|
|
// 4. Play Sound
|
|
const launchSound = Sound.sound(
|
|
SoundEvent.fromKey("minecraft:entity.firework_rocket.launch"),
|
|
Sound.Source.PLAYER,
|
|
3.0,
|
|
1.0
|
|
);
|
|
player.getViewers().forEach(v => v.playSound(launchSound, player.getPosition()));
|
|
player.playSound(launchSound);
|
|
});
|