diff --git a/src/main/java/net/minecraft/server/ServerConfigurationManagerAbstract.java b/src/main/java/net/minecraft/server/ServerConfigurationManagerAbstract.java index aa9c317a53..c3aa44a1e7 100644 --- a/src/main/java/net/minecraft/server/ServerConfigurationManagerAbstract.java +++ b/src/main/java/net/minecraft/server/ServerConfigurationManagerAbstract.java @@ -601,12 +601,27 @@ public abstract class ServerConfigurationManagerAbstract { this.sendPacketNearby((EntityHuman) null, d0, d1, d2, d3, i, packet); } + // CraftBukkit start - Add support for entity who caused the packet public void sendPacketNearby(EntityHuman entityhuman, double d0, double d1, double d2, double d3, int i, Packet packet) { + this.sendPacketNearby(entityhuman, d0, d1, d2, d3, i, packet, null); + } + + public void sendPacketNearby(double d0, double d1, double d2, double d3, int i, Packet packet, Entity sourceentity) { + this.sendPacketNearby(null, d0, d1, d2, d3, i, packet, sourceentity); + } + // CraftBukkit end + + public void sendPacketNearby(EntityHuman entityhuman, double d0, double d1, double d2, double d3, int i, Packet packet, Entity sourceentity) { // CraftBukkit - added sourceentity Iterator iterator = this.players.iterator(); while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); + // CraftBukkit start - Test if player receiving packet can see the source of the packet + if (sourceentity != null && sourceentity instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer)sourceentity).getBukkitEntity())) { + continue; + } + // CraftBukkit end if (entityplayer != entityhuman && entityplayer.dimension == i) { double d4 = d0 - entityplayer.locX; double d5 = d1 - entityplayer.locY; diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index cee4d42c09..7b97740c12 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -766,7 +766,7 @@ public abstract class World implements IBlockAccess { while (iterator.hasNext()) { IWorldAccess iworldaccess = (IWorldAccess) iterator.next(); - iworldaccess.a(s, entity.locX, entity.locY - (double) entity.height, entity.locZ, f, f1); + ((WorldManager) iworldaccess).a(s, entity.locX, entity.locY - (double) entity.height, entity.locZ, f, f1, entity); // CraftBukkit - Cast to WorldManager, add sourceentity } } } diff --git a/src/main/java/net/minecraft/server/WorldManager.java b/src/main/java/net/minecraft/server/WorldManager.java index e70e5abb0f..ba67e77db9 100644 --- a/src/main/java/net/minecraft/server/WorldManager.java +++ b/src/main/java/net/minecraft/server/WorldManager.java @@ -22,6 +22,12 @@ public class WorldManager implements IWorldAccess { this.world.getTracker().untrackEntity(entity); } + // CraftBukkit start - Add source entity for a sound. + public void a(String s, double d0, double d1, double d2, float f, float f1, Entity sourceentity) { + this.server.getServerConfigurationManager().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new Packet62NamedSoundEffect(s, d0, d1, d2, f, f1), sourceentity); + } + // CraftBukkit end + public void a(String s, double d0, double d1, double d2, float f, float f1) { // CraftBukkit - this.world.dimension this.server.getServerConfigurationManager().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new Packet62NamedSoundEffect(s, d0, d1, d2, f, f1));