From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: lexikiq Date: Sat, 19 Jun 2021 16:30:39 -0400 Subject: [PATCH] Add SoundEvent diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java index cebaf0fb8187335ca303621a2cb412bb22584e23..429eb67fb264a0d8ec7900c02c1abdfac0c9bd7d 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -1489,12 +1489,12 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public void playSound(@Nullable Player player, double x, double y, double z, SoundEvent sound, SoundSource category, float volume, float pitch) { - this.server.getPlayerList().broadcast(player, x, y, z, volume > 1.0F ? (double) (16.0F * volume) : 16.0D, this.dimension(), new ClientboundSoundPacket(sound, category, x, y, z, volume, pitch)); + CraftEventFactory.playSoundEvent(new me.lexikiq.event.sound.LocationNamedSoundEvent(player == null ? null : player.getBukkitEntity(), getWorld(), new org.bukkit.util.Vector(x, y, z), org.bukkit.craftbukkit.CraftSound.getBukkit(sound), org.bukkit.SoundCategory.valueOf(category.name()), volume, pitch), this.server, volume > 1.0F ? (double) (16.0F * volume) : 16.0D); // Parchment } @Override public void playSound(@Nullable Player player, Entity entity, SoundEvent sound, SoundSource category, float volume, float pitch) { - this.server.getPlayerList().broadcast(player, entity.getX(), entity.getY(), entity.getZ(), volume > 1.0F ? (double) (16.0F * volume) : 16.0D, this.dimension(), new ClientboundSoundEntityPacket(sound, category, entity, volume, pitch)); + CraftEventFactory.playSoundEvent(new me.lexikiq.event.sound.EntitySoundEvent(player == null ? null : player.getBukkitEntity(), entity.getBukkitEntity(), org.bukkit.craftbukkit.CraftSound.getBukkit(sound), org.bukkit.SoundCategory.valueOf(category.name()), volume, pitch), this.server, volume > 1.0F ? (double) (16.0F * volume) : 16.0D); // Parchment } @Override diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java index 483df59a805d2724551042aa4470bc439fc2e7e9..f7fbd53b371598789e2450d59cc948d1940c6f0c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -2176,7 +2176,7 @@ public class ServerPlayer extends Player { @Override public void playNotifySound(SoundEvent event, SoundSource category, float volume, float pitch) { - this.connection.send(new ClientboundSoundPacket(event, category, this.getX(), this.getY(), this.getZ(), volume, pitch)); + CraftEventFactory.playSoundEvent(new me.lexikiq.event.sound.LocationNamedSoundEvent(getBukkitEntity(), org.bukkit.craftbukkit.CraftSound.getBukkit(event), org.bukkit.SoundCategory.valueOf(category.name()), volume, pitch), this); // Parchment } @Override diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java index ad9fb50791779a5fe7d22268b71bd10d9c9ff3f0..4032f499fd533e8d35d050758ea2358ad6878b94 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -964,7 +964,7 @@ public abstract class PlayerList { if (flag2 && !isLocAltered) { BlockState data = worldserver1.getBlockState(blockposition); worldserver1.setBlock(blockposition, data.setValue(RespawnAnchorBlock.CHARGE, data.getValue(RespawnAnchorBlock.CHARGE) - 1), 3); - entityplayer1.connection.send(new ClientboundSoundPacket(SoundEvents.RESPAWN_ANCHOR_DEPLETE, SoundSource.BLOCKS, (double) location.getX(), (double) location.getY(), (double) location.getZ(), 1.0F, 1.0F)); + entityplayer1.playNotifySound(SoundEvents.RESPAWN_ANCHOR_DEPLETE, SoundSource.BLOCKS, 1.0F, 1.0F); // Parchment // Paper end } // Added from changeDimension diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java index cea92f1dc663bf0648b2bd877d86ca380a517bc9..266d676118e17af48e21370211c015898eba9691 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -1832,7 +1832,7 @@ public abstract class Player extends LivingEntity { private static void sendSoundEffect(Player fromEntity, double x, double y, double z, SoundEvent soundEffect, SoundSource soundCategory, float volume, float pitch) { fromEntity.level.playSound(fromEntity, x, y, z, soundEffect, soundCategory, volume, pitch); // This will not send the effect to the entity himself if (fromEntity instanceof ServerPlayer) { - ((ServerPlayer) fromEntity).connection.send(new ClientboundSoundPacket(soundEffect, soundCategory, x, y, z, volume, pitch)); + CraftEventFactory.playSoundEvent(new me.lexikiq.event.sound.LocationNamedSoundEvent(fromEntity.getBukkitEntity(), new org.bukkit.util.Vector(x, y, z), org.bukkit.craftbukkit.CraftSound.getBukkit(soundEffect), org.bukkit.SoundCategory.valueOf(soundCategory.name()), volume, pitch), (ServerPlayer) fromEntity); // Parchment } } // Paper end diff --git a/src/main/java/net/minecraft/world/entity/raid/Raid.java b/src/main/java/net/minecraft/world/entity/raid/Raid.java index a79ba23ecf887ecbb6e095140f019ebb6fd0a6f7..5112edc5e68a386e9bb16ac0ec9d998e7df06f3c 100644 --- a/src/main/java/net/minecraft/world/entity/raid/Raid.java +++ b/src/main/java/net/minecraft/world/entity/raid/Raid.java @@ -27,7 +27,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.network.protocol.game.ClientboundSoundPacket; +//import net.minecraft.network.protocol.game.ClientboundSoundPacket; // Parchment import net.minecraft.server.level.ServerBossEvent; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -537,7 +537,7 @@ public class Raid { double d2 = vec3d.z + 13.0D / d0 * (vec3d1.z - vec3d.z); if (d0 <= 64.0D || collection.contains(entityplayer)) { - entityplayer.connection.send(new ClientboundSoundPacket(SoundEvents.RAID_HORN, SoundSource.NEUTRAL, d1, entityplayer.getY(), d2, 64.0F, 1.0F)); + entityplayer.playNotifySound(SoundEvents.RAID_HORN, SoundSource.NEUTRAL, 64.0F, 1.0F); // Parchment } } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index db6c0917824b9127abd9f9250dc195a9f1d56f4f..edaebb2566a414718d0910d4306c3b53e061814c 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1858,4 +1858,77 @@ public class CraftEventFactory { return event.callEvent(); } // Paper end + + // Parchment start + private static net.minecraft.network.protocol.Packet handleSoundEvent(me.lexikiq.event.sound.SoundEvent _event) { + if (!_event.callEvent()) { + return null; + } else { + float volume = _event.getVolume(); + float pitch = _event.getPitch(); + net.minecraft.sounds.SoundSource source = net.minecraft.sounds.SoundSource.valueOf(_event.getCategory().name()); + + if (_event instanceof me.lexikiq.event.sound.NamedSoundEvent namedSoundEvent) { + net.minecraft.sounds.SoundEvent sound = org.bukkit.craftbukkit.CraftSound.getSoundEffect(namedSoundEvent.getSound()); + + if (_event instanceof me.lexikiq.event.sound.LocationNamedSoundEvent event) { + org.bukkit.util.Vector pos = event.getVector(); + return new net.minecraft.network.protocol.game.ClientboundSoundPacket(sound, source, pos.getX(), pos.getY(), pos.getZ(), volume, pitch); + } else { + me.lexikiq.event.sound.EntitySoundEvent event = (me.lexikiq.event.sound.EntitySoundEvent) _event; + return new net.minecraft.network.protocol.game.ClientboundSoundEntityPacket(sound, source, ((CraftEntity) event.getOrigin()).getHandle(), volume, pitch); + } + } else { + me.lexikiq.event.sound.LocationCustomSoundEvent event = (me.lexikiq.event.sound.LocationCustomSoundEvent) _event; + org.bukkit.util.Vector pos = event.getVector(); + return new net.minecraft.network.protocol.game.ClientboundCustomSoundPacket(CraftNamespacedKey.toMinecraft(event.getKey()), source, org.bukkit.craftbukkit.util.CraftVector.toNMS(pos), volume, pitch); + } + } + } + + public static void playSoundEvent(me.lexikiq.event.sound.SoundEvent event, java.util.function.Consumer> soundPlayer) { + org.apache.commons.lang3.Validate.notNull(event, "event"); + org.apache.commons.lang3.Validate.notNull(soundPlayer, "soundPlayer"); + if (!(event instanceof me.lexikiq.event.sound.LocationNamedSoundEvent || event instanceof me.lexikiq.event.sound.LocationCustomSoundEvent || event instanceof me.lexikiq.event.sound.EntitySoundEvent)) { + throw new IllegalArgumentException("Unknown sound event: " + event.getClass().getName()); + } + java.util.concurrent.CompletableFuture.supplyAsync(() -> handleSoundEvent(event), net.minecraft.server.MCUtil.asyncExecutor).thenAcceptAsync(packet -> { + if (packet != null) + soundPlayer.accept(packet); + }, net.minecraft.server.MCUtil.asyncExecutor); + } + + public static void playSoundEvent(me.lexikiq.event.sound.SoundEvent event, CraftPlayer sendTo) { + playSoundEvent(event, sendTo.getHandle()); + } + + public static void playSoundEvent(me.lexikiq.event.sound.SoundEvent event, ServerPlayer sendTo) { + playSoundEvent(event, sendTo.connection); + } + + public static void playSoundEvent(me.lexikiq.event.sound.SoundEvent event, net.minecraft.server.network.ServerPlayerConnection sendTo) { + playSoundEvent(event, sendTo::send); + } + + public static void playSoundEvent(me.lexikiq.event.sound.SoundEvent event, net.minecraft.server.MinecraftServer server, double radius) { + playSoundEvent(event, server.getPlayerList(), radius); + } + + public static void playSoundEvent(me.lexikiq.event.sound.SoundEvent event, net.minecraft.server.players.PlayerList playerList, double radius) { + final net.minecraft.world.entity.player.Player player = event.getPlayer() == null ? null : ((org.bukkit.craftbukkit.entity.CraftHumanEntity) event.getPlayer()).getHandle(); + final net.minecraft.resources.ResourceKey world = ((CraftWorld) event.getWorld()).getHandle().dimension(); + final org.bukkit.util.Vector pos; + if (event instanceof me.lexikiq.HasLocation hasLoc) { + pos = hasLoc.getLocation().toVector(); + } else if (event instanceof me.lexikiq.event.sound.EntitySoundEvent entityEvent) { + pos = entityEvent.getOrigin().getLocation().toVector(); + } else { + throw new IllegalArgumentException("Could not determine location of sound event"); + } + final double posX = pos.getX(); + final double posY = pos.getY(); + final double posZ = pos.getZ(); + playSoundEvent(event, packet -> playerList.broadcast(player, posX, posY, posZ, radius, world, packet)); + } + // Parchment end }