From 64eb95b4e363a1e8b733110a93dffbd2f8196e73 Mon Sep 17 00:00:00 2001 From: Breno S Date: Wed, 30 Mar 2022 17:14:58 -0400 Subject: [PATCH] Vanish extensions This patch aims to improve upon CraftBukkit's vanish functionalities. Whenever a projectile is shot, those who cannot see the shooter will be unable to hear, see or interact with the shot entity. --- patches/server/0003-Vanish-Extensions.patch | 365 ++++++++++++++++++++ 1 file changed, 365 insertions(+) create mode 100644 patches/server/0003-Vanish-Extensions.patch diff --git a/patches/server/0003-Vanish-Extensions.patch b/patches/server/0003-Vanish-Extensions.patch new file mode 100644 index 0000000..013af9f --- /dev/null +++ b/patches/server/0003-Vanish-Extensions.patch @@ -0,0 +1,365 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Breno Santos +Date: Wed, 30 Mar 2022 17:09:22 -0400 +Subject: [PATCH] Vanish-Extensions + + +diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java +index 6ce27675103d4b691216c6b701b6ceb821af528f..3f761acf0b7056232c76a73c7d111cc003f3f111 100644 +--- a/src/main/java/net/minecraft/server/level/ChunkMap.java ++++ b/src/main/java/net/minecraft/server/level/ChunkMap.java +@@ -84,6 +84,7 @@ import net.minecraft.world.entity.EntityType; + import net.minecraft.world.entity.Mob; + import net.minecraft.world.entity.ai.village.poi.PoiManager; + import net.minecraft.world.entity.boss.EnderDragonPart; ++import net.minecraft.world.entity.projectile.Projectile; // SparklyPaper + import net.minecraft.world.level.ChunkPos; + import net.minecraft.world.level.GameRules; + import net.minecraft.world.level.chunk.ChunkAccess; +@@ -2340,6 +2341,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + flag = false; + } + // CraftBukkit end ++ ++ // SparklyPaper start ++ if (this.entity instanceof Projectile projectile) { ++ if (projectile.getOwner() instanceof ServerPlayer shooter) { ++ if (!player.getBukkitEntity().canSee(shooter.getBukkitEntity())) { ++ flag = false; ++ } ++ } ++ } ++ // SparklyPaper end ++ + if (flag) { + if (this.seenBy.add(player.connection)) { + this.serverEntity.addPairing(player); +diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +index 53d0024daf6963ac4dab575666b0d6a74a39a958..c17e554fa59975adac8a1d2e4b1c9c0d0348f693 100644 +--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java ++++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +@@ -567,6 +567,8 @@ public abstract class AbstractArrow extends Projectile { + @Override + public void playerTouch(Player player) { + if (!this.level.isClientSide && (this.inGround || this.isNoPhysics()) && this.shakeTime <= 0) { ++ if (!canPickup(player)) return; // SparklyPaper ++ + // CraftBukkit start + ItemStack itemstack = this.getPickupItem(); + if (this.pickup == Pickup.ALLOWED && !itemstack.isEmpty() && player.getInventory().canHold(itemstack) > 0) { +diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +index ccaa97956e40c6a79371d813719f65687991ec5b..5846b901779c51ac4f24cb6998cdeeb38d258640 100644 +--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java ++++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +@@ -9,6 +9,10 @@ import net.minecraft.nbt.CompoundTag; + import net.minecraft.network.protocol.Packet; + import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; + import net.minecraft.server.level.ServerLevel; ++// SparklyPaper start ++import net.minecraft.server.level.ServerPlayer; ++import net.minecraft.sounds.SoundEvent; ++// SparklyPaper end + import net.minecraft.util.Mth; + import net.minecraft.world.entity.Entity; + import net.minecraft.world.entity.EntityType; +@@ -234,6 +238,21 @@ public abstract class Projectile extends Entity { + } + } + ++ // SparklyPaper start ++ @Override ++ public void playSound(SoundEvent sound, float volume, float pitch) { ++ ServerPlayer entityplayer = this.cachedOwner instanceof ServerPlayer player ? player : null; ++ this.level.playSound(entityplayer, this.getX(), this.getY(), this.getZ(), sound, this.getSoundSource(), volume, pitch); ++ } ++ ++ protected boolean canPickup(Player player) { ++ if (player instanceof ServerPlayer serverplayer && this.tracker != null) { ++ return this.tracker.seenBy.contains(serverplayer.connection); ++ } ++ return true; ++ } ++ // SparklyPaper end ++ + protected void updateRotation() { + Vec3 vec3d = this.getDeltaMovement(); + double d0 = vec3d.horizontalDistance(); +diff --git a/src/main/java/net/minecraft/world/item/BowItem.java b/src/main/java/net/minecraft/world/item/BowItem.java +index 08d597db1a5345a343777a01427655e6bf2c926b..43268e461446458649c146debbd23693ed26db09 100644 +--- a/src/main/java/net/minecraft/world/item/BowItem.java ++++ b/src/main/java/net/minecraft/world/item/BowItem.java +@@ -1,6 +1,8 @@ + package net.minecraft.world.item; + + import java.util.function.Predicate; ++ ++import net.minecraft.server.level.ServerPlayer; // SparklyPaper + import net.minecraft.sounds.SoundEvents; + import net.minecraft.sounds.SoundSource; + import net.minecraft.stats.Stats; +@@ -92,7 +94,10 @@ public class BowItem extends ProjectileWeaponItem implements Vanishable { + // CraftBukkit end + } + +- world.playSound((Player) null, entityhuman.getX(), entityhuman.getY(), entityhuman.getZ(), SoundEvents.ARROW_SHOOT, SoundSource.PLAYERS, 1.0F, 1.0F / (world.getRandom().nextFloat() * 0.4F + 1.2F) + f * 0.5F); ++ // SparklyPaper start ++ ServerPlayer shooter = entityhuman instanceof ServerPlayer serverplayer ? serverplayer : null; ++ world.playSound(shooter, entityhuman.getX(), entityhuman.getY(), entityhuman.getZ(), SoundEvents.ARROW_SHOOT, SoundSource.PLAYERS, 1.0F, 1.0F / (world.getRandom().nextFloat() * 0.4F + 1.2F) + f * 0.5F); ++ // SparklyPaper end + if (!flag1 && !entityhuman.getAbilities().instabuild) { + itemstack1.shrink(1); + if (itemstack1.isEmpty()) { +diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java +index c0c211c7227f4ce5d1e0e433419425e6bb13046f..20986be1c9f1fe1993f343600c832c9a6cd40952 100644 +--- a/src/main/java/net/minecraft/world/item/CrossbowItem.java ++++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java +@@ -101,7 +101,10 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { + CrossbowItem.setCharged(stack, true); + SoundSource soundcategory = user instanceof Player ? SoundSource.PLAYERS : SoundSource.HOSTILE; + +- world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.CROSSBOW_LOADING_END, soundcategory, 1.0F, 1.0F / (world.getRandom().nextFloat() * 0.5F + 1.0F) + 0.2F); ++ // SparklyPaper start ++ ServerPlayer shooter = user instanceof ServerPlayer serverplayer ? serverplayer : null; ++ world.playSound(shooter, user.getX(), user.getY(), user.getZ(), SoundEvents.CROSSBOW_LOADING_END, soundcategory, 1.0F, 1.0F / (world.getRandom().nextFloat() * 0.5F + 1.0F) + 0.2F); ++ // SparklyPaper end + } + + } +@@ -276,7 +279,11 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { + } + } + // CraftBukkit end +- world.playSound((Player) null, shooter.getX(), shooter.getY(), shooter.getZ(), SoundEvents.CROSSBOW_SHOOT, SoundSource.PLAYERS, 1.0F, soundPitch); ++ ++ // SparklyPaper start ++ ServerPlayer servershooter = (shooter instanceof ServerPlayer serverplayer) ? serverplayer : null; ++ world.playSound(servershooter, shooter.getX(), shooter.getY(), shooter.getZ(), SoundEvents.CROSSBOW_SHOOT, SoundSource.PLAYERS, 1.0F, soundPitch); ++ // SparklyPaper end + } + } + +@@ -354,6 +361,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { + SoundEvent soundeffect = this.getStartSound(j); + SoundEvent soundeffect1 = j == 0 ? SoundEvents.CROSSBOW_LOADING_MIDDLE : null; + float f = (float) (stack.getUseDuration() - remainingUseTicks) / (float) CrossbowItem.getChargeDuration(stack); ++ ServerPlayer shooter = (user instanceof ServerPlayer serverplayer) ? serverplayer : null; // SparklyPaper + + if (f < 0.2F) { + this.startSoundPlayed = false; +@@ -362,12 +370,12 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { + + if (f >= 0.2F && !this.startSoundPlayed) { + this.startSoundPlayed = true; +- world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), soundeffect, SoundSource.PLAYERS, 0.5F, 1.0F); ++ world.playSound(shooter, user.getX(), user.getY(), user.getZ(), soundeffect, SoundSource.PLAYERS, 0.5F, 1.0F); // SparklyPaper + } + + if (f >= 0.5F && soundeffect1 != null && !this.midLoadSoundPlayed) { + this.midLoadSoundPlayed = true; +- world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), soundeffect1, SoundSource.PLAYERS, 0.5F, 1.0F); ++ world.playSound(shooter, user.getX(), user.getY(), user.getZ(), soundeffect1, SoundSource.PLAYERS, 0.5F, 1.0F); // SparklyPaper + } + } + +diff --git a/src/main/java/net/minecraft/world/item/EggItem.java b/src/main/java/net/minecraft/world/item/EggItem.java +index 58cb992c5defec2f092755cbde661ff10f38bf9d..41db96663de508c67f6843f1c2217b727dce65dd 100644 +--- a/src/main/java/net/minecraft/world/item/EggItem.java ++++ b/src/main/java/net/minecraft/world/item/EggItem.java +@@ -1,5 +1,6 @@ + package net.minecraft.world.item; + ++import net.minecraft.server.level.ServerPlayer; // SparklyPaper + import net.minecraft.sounds.SoundEvents; + import net.minecraft.sounds.SoundSource; + import net.minecraft.stats.Stats; +@@ -18,6 +19,7 @@ public class EggItem extends Item { + @Override + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + ItemStack itemstack = user.getItemInHand(hand); ++ ServerPlayer thrower = user instanceof ServerPlayer serverplayer ? serverplayer : null; // SparklyPaper + + // world.playSound((EntityHuman) null, entityhuman.getX(), entityhuman.getY(), entityhuman.getZ(), SoundEffects.EGG_THROW, SoundCategory.PLAYERS, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); // CraftBukkit - moved down + if (!world.isClientSide) { +@@ -34,7 +36,7 @@ public class EggItem extends Item { + ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory(); + } + +- world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), net.minecraft.sounds.SoundEvents.EGG_THROW, net.minecraft.sounds.SoundSource.PLAYERS, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F)); ++ world.playSound(thrower, user.getX(), user.getY(), user.getZ(), net.minecraft.sounds.SoundEvents.EGG_THROW, net.minecraft.sounds.SoundSource.PLAYERS, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F)); // SparklyPaper + user.awardStat(Stats.ITEM_USED.get(this)); + } else { + if (user instanceof net.minecraft.server.level.ServerPlayer) { +@@ -44,7 +46,7 @@ public class EggItem extends Item { + } + // Paper end + } +- world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.EGG_THROW, SoundSource.PLAYERS, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); ++ world.playSound(thrower, user.getX(), user.getY(), user.getZ(), SoundEvents.EGG_THROW, SoundSource.PLAYERS, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); // SparklyPaper + + /* // Paper start - moved up + user.awardStat(Stats.ITEM_USED.get(this)); +diff --git a/src/main/java/net/minecraft/world/item/EnderEyeItem.java b/src/main/java/net/minecraft/world/item/EnderEyeItem.java +index c624a2cb0f4c9d7e12387ece574c1f9f74528b0c..623917563b789c035e754046554afaa21b959624 100644 +--- a/src/main/java/net/minecraft/world/item/EnderEyeItem.java ++++ b/src/main/java/net/minecraft/world/item/EnderEyeItem.java +@@ -114,7 +114,10 @@ public class EnderEyeItem extends Item { + CriteriaTriggers.USED_ENDER_EYE.trigger((ServerPlayer) user, blockposition); + } + +- world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_EYE_LAUNCH, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); ++ // SparklyPaper start ++ ServerPlayer thrower = user instanceof ServerPlayer serverplayer ? serverplayer : null; ++ world.playSound(thrower, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_EYE_LAUNCH, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); ++ // SparklyPaper end + world.levelEvent((Player) null, 1003, user.blockPosition(), 0); + if (!user.getAbilities().instabuild) { + itemstack.shrink(1); +diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java +index 749ab72edc0d2e9c6f1161415ab8d59d3d6ca976..9fc54fb6b97a3f413506de0c8bd9e3650000fd4d 100644 +--- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java ++++ b/src/main/java/net/minecraft/world/item/EnderpearlItem.java +@@ -1,5 +1,6 @@ + package net.minecraft.world.item; + ++import net.minecraft.server.level.ServerPlayer; // SparklyPaper + import net.minecraft.sounds.SoundEvents; + import net.minecraft.sounds.SoundSource; + import net.minecraft.stats.Stats; +@@ -34,7 +35,10 @@ public class EnderpearlItem extends Item { + ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory(); + } + +- world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F)); ++ // SparklyPaper start ++ ServerPlayer thrower = user instanceof ServerPlayer serverplayer ? serverplayer : null; ++ world.playSound(thrower, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F)); ++ // SparklyPaper end + user.awardStat(Stats.ITEM_USED.get(this)); + user.getCooldowns().addCooldown(this, 20); + } else { +diff --git a/src/main/java/net/minecraft/world/item/FishingRodItem.java b/src/main/java/net/minecraft/world/item/FishingRodItem.java +index 7a4ae2d69f530182f44a31eebd1c2e44ada5e44b..ecf8bdb2b8760049e30ebe35e6d43d85dd39bac8 100644 +--- a/src/main/java/net/minecraft/world/item/FishingRodItem.java ++++ b/src/main/java/net/minecraft/world/item/FishingRodItem.java +@@ -1,5 +1,6 @@ + package net.minecraft.world.item; + ++import net.minecraft.server.level.ServerPlayer; // SparklyPaper + import net.minecraft.sounds.SoundEvents; + import net.minecraft.sounds.SoundSource; + import net.minecraft.stats.Stats; +@@ -22,6 +23,7 @@ public class FishingRodItem extends Item implements Vanishable { + + @Override + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { ++ ServerPlayer angler = user instanceof ServerPlayer serverplayer ? serverplayer : null; // SparklyPaper + ItemStack itemstack = user.getItemInHand(hand); + int i; + +@@ -33,7 +35,7 @@ public class FishingRodItem extends Item implements Vanishable { + }); + } + +- world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.FISHING_BOBBER_RETRIEVE, SoundSource.NEUTRAL, 1.0F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); ++ world.playSound(angler, user.getX(), user.getY(), user.getZ(), SoundEvents.FISHING_BOBBER_RETRIEVE, SoundSource.NEUTRAL, 1.0F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); // SparklyPaper + world.gameEvent(user, GameEvent.FISHING_ROD_REEL_IN, (Entity) user); + } else { + // world.playSound((EntityHuman) null, entityhuman.getX(), entityhuman.getY(), entityhuman.getZ(), SoundEffects.FISHING_BOBBER_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); +@@ -50,7 +52,7 @@ public class FishingRodItem extends Item implements Vanishable { + user.fishing = null; + return InteractionResultHolder.pass(itemstack); + } +- world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.FISHING_BOBBER_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); ++ world.playSound(angler, user.getX(), user.getY(), user.getZ(), SoundEvents.FISHING_BOBBER_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); // SparklyPaper + world.addFreshEntity(entityfishinghook); + // CraftBukkit end + } +diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java +index 998758be827efbcb7693ed36ab1dffc0ef0369bf..5ea01e9d85c9ed490c902d20c902546bab8b6e90 100644 +--- a/src/main/java/net/minecraft/world/item/TridentItem.java ++++ b/src/main/java/net/minecraft/world/item/TridentItem.java +@@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableMultimap; + import com.google.common.collect.ImmutableMultimap.Builder; + import com.google.common.collect.Multimap; + import net.minecraft.core.BlockPos; ++import net.minecraft.server.level.ServerPlayer; // SparklyPaper + import net.minecraft.sounds.SoundEvent; + import net.minecraft.sounds.SoundEvents; + import net.minecraft.sounds.SoundSource; +@@ -61,6 +62,7 @@ public class TridentItem extends Item implements Vanishable { + public void releaseUsing(ItemStack stack, Level world, LivingEntity user, int remainingUseTicks) { + if (user instanceof Player) { + Player entityhuman = (Player) user; ++ ServerPlayer thrower = user instanceof ServerPlayer serverplayer ? serverplayer : null; // SparklyPaper + int j = this.getUseDuration(stack) - remainingUseTicks; + + if (j >= 10) { +@@ -96,7 +98,7 @@ public class TridentItem extends Item implements Vanishable { + entitythrowntrident.tridentItem = stack.copy(); // SPIGOT-4511 update since damage call moved + // CraftBukkit end + +- world.playSound((Player) null, (Entity) entitythrowntrident, SoundEvents.TRIDENT_THROW, SoundSource.PLAYERS, 1.0F, 1.0F); ++ world.playSound(thrower, (Entity) entitythrowntrident, SoundEvents.TRIDENT_THROW, SoundSource.PLAYERS, 1.0F, 1.0F); // SparklyPaper + if (!entityhuman.getAbilities().instabuild) { + entityhuman.getInventory().removeItem(stack); + } +@@ -144,7 +146,7 @@ public class TridentItem extends Item implements Vanishable { + soundeffect = SoundEvents.TRIDENT_RIPTIDE_1; + } + +- world.playSound((Player) null, (Entity) entityhuman, soundeffect, SoundSource.PLAYERS, 1.0F, 1.0F); ++ world.playSound(thrower, (Entity) entityhuman, soundeffect, SoundSource.PLAYERS, 1.0F, 1.0F); // SparklyPaper + } + + } +diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java +index 160c0f37aa3aaf7598f852acf9bd444f79444c97..e2179c94b08edfb578c31111689ee3cda0193487 100644 +--- a/src/main/java/net/minecraft/world/level/Level.java ++++ b/src/main/java/net/minecraft/world/level/Level.java +@@ -27,12 +27,14 @@ import net.minecraft.core.SectionPos; + import net.minecraft.core.particles.ParticleOptions; + import net.minecraft.nbt.CompoundTag; + import net.minecraft.network.protocol.Packet; ++import net.minecraft.network.protocol.game.*; // SparklyPaper + import net.minecraft.resources.ResourceKey; + import net.minecraft.resources.ResourceLocation; + import net.minecraft.server.MCUtil; + import net.minecraft.server.MinecraftServer; + import net.minecraft.server.level.ChunkHolder; + import net.minecraft.server.level.ServerLevel; ++import net.minecraft.server.level.ServerPlayer; // SparklyPaper + import net.minecraft.sounds.SoundEvent; + import net.minecraft.sounds.SoundSource; + import net.minecraft.util.Mth; +@@ -82,11 +84,7 @@ import net.minecraft.world.scores.Scoreboard; + // CraftBukkit start + import java.util.HashMap; + import java.util.Map; +-import net.minecraft.network.protocol.game.ClientboundSetBorderCenterPacket; +-import net.minecraft.network.protocol.game.ClientboundSetBorderLerpSizePacket; +-import net.minecraft.network.protocol.game.ClientboundSetBorderSizePacket; +-import net.minecraft.network.protocol.game.ClientboundSetBorderWarningDelayPacket; +-import net.minecraft.network.protocol.game.ClientboundSetBorderWarningDistancePacket; ++ + import org.bukkit.Bukkit; + import org.bukkit.Location; + import org.bukkit.craftbukkit.CraftServer; +@@ -849,6 +847,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + return !this.dimensionType().hasFixedTime() && !this.isDay(); + } + ++ // SparklyPaper start ++ public void playSound(@Nullable ServerPlayer player, double x, double y, double z, SoundEvent sound, SoundSource category, float volume, float pitch) { ++ Packet packet = new ClientboundSoundPacket(sound, category, x, y, z, volume, pitch); ++ if (player != null) player.connection.send(packet); ++ MinecraftServer.getServer().getPlayerList().broadcast(player, x, y, z, volume > 1.0F ? (double) (16.0F * volume) : 16.0D, this.dimension(), packet); ++ } ++ ++ public void playSound(@Nullable ServerPlayer player, Entity entity, SoundEvent sound, SoundSource category, float volume, float pitch) { ++ playSound(player, entity.getX(), entity.getY(), entity.getZ(), sound, category, volume, pitch); ++ } ++ // SparklyPaper end ++ + @Override + public void playSound(@Nullable Player player, BlockPos pos, SoundEvent sound, SoundSource category, float volume, float pitch) { + this.playSound(player, (double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, sound, category, volume, pitch);