From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Mystiflow Date: Fri, 6 Jul 2018 13:21:30 +0100 Subject: [PATCH] Send nearby packets from world player list not server list diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java index 7a2b219c6..41c187084 100644 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ b/src/main/java/net/minecraft/server/PlayerList.java @@ -0,0 +0,0 @@ public abstract class PlayerList { } public void sendPacketNearby(@Nullable EntityHuman entityhuman, double d0, double d1, double d2, double d3, int i, Packet packet) { - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); + // Paper start - Use world list instead of server list where preferable + sendPacketNearby(entityhuman, d0, d1, d2, d3, i, null, packet); // Retained for compatibility + } + + public void sendPacketNearby(@Nullable EntityHuman entityhuman, double d0, double d1, double d2, double d3, WorldServer world, Packet packet) { + sendPacketNearby(entityhuman, d0, d1, d2, d3, world.dimension, world, packet); + } + + public void sendPacketNearby(@Nullable EntityHuman entityhuman, double d0, double d1, double d2, double d3, int i, @Nullable WorldServer world, Packet packet) { + if (world == null && entityhuman != null && entityhuman.world instanceof WorldServer) { + world = (WorldServer) entityhuman.world; + } + + List players1 = world == null ? players : world.players; + for (int j = 0; j < players1.size(); ++j) { + EntityHuman entity = players1.get(j); + if (!(entity instanceof EntityPlayer)) continue; + EntityPlayer entityplayer = (EntityPlayer) players1.get(j); + // Paper end // CraftBukkit start - Test if player receiving packet can see the source of the packet if (entityhuman != null && entityhuman instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer) entityhuman).getBukkitEntity())) { @@ -0,0 +0,0 @@ public abstract class PlayerList { } // CraftBukkit end - if (entityplayer != entityhuman && entityplayer.dimension == i) { + if (entityplayer != entityhuman && (world != null || entityplayer.dimension == i)) { // Paper double d4 = d0 - entityplayer.locX; double d5 = d1 - entityplayer.locY; double d6 = d2 - entityplayer.locZ; diff --git a/src/main/java/net/minecraft/server/WorldManager.java b/src/main/java/net/minecraft/server/WorldManager.java index e26405d34..23f390c22 100644 --- a/src/main/java/net/minecraft/server/WorldManager.java +++ b/src/main/java/net/minecraft/server/WorldManager.java @@ -0,0 +0,0 @@ public class WorldManager implements IWorldAccess { } public void a(@Nullable EntityHuman entityhuman, SoundEffect soundeffect, SoundCategory soundcategory, double d0, double d1, double d2, float f, float f1) { - // CraftBukkit - this.world.dimension - this.a.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(soundeffect, soundcategory, d0, d1, d2, f, f1)); + // CraftBukkit - this.world.dimension, // Paper - this.world.dimension -> this.world + this.a.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world, new PacketPlayOutNamedSoundEffect(soundeffect, soundcategory, d0, d1, d2, f, f1)); } public void a(int i, int j, int k, int l, int i1, int j1) {} @@ -0,0 +0,0 @@ public class WorldManager implements IWorldAccess { public void a(EntityHuman entityhuman, int i, BlockPosition blockposition, int j) { // CraftBukkit - this.world.dimension - this.a.getPlayerList().sendPacketNearby(entityhuman, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), 64.0D, this.world.dimension, new PacketPlayOutWorldEvent(i, blockposition, j, false)); + this.a.getPlayerList().sendPacketNearby(entityhuman, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), 64.0D, this.world, new PacketPlayOutWorldEvent(i, blockposition, j, false)); } public void a(int i, BlockPosition blockposition, int j) { @@ -0,0 +0,0 @@ public class WorldManager implements IWorldAccess { } public void b(int i, BlockPosition blockposition, int j) { - Iterator iterator = this.a.getPlayerList().v().iterator(); + // Iterator iterator = this.a.getPlayerList().v().iterator(); // Paper // CraftBukkit start EntityHuman entityhuman = null; @@ -0,0 +0,0 @@ public class WorldManager implements IWorldAccess { if (entity instanceof EntityHuman) entityhuman = (EntityHuman) entity; // CraftBukkit end + // Paper start + java.util.List list = entity != null ? entity.world.players : this.a.getPlayerList().v(); + Iterator iterator = list.iterator(); while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); + EntityHuman human = iterator.next(); + if (!(human instanceof EntityPlayer)) continue; + EntityPlayer entityplayer = (EntityPlayer) human; + // Paper end if (entityplayer != null && entityplayer.world == this.world && entityplayer.getId() != i) { double d0 = (double) blockposition.getX() - entityplayer.locX; diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java index f5911fbf0..377831cdf 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java @@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { } // CraftBukkit end if (super.strikeLightning(entity)) { - this.server.getPlayerList().sendPacketNearby((EntityHuman) null, entity.locX, entity.locY, entity.locZ, 512.0D, dimension, new PacketPlayOutSpawnEntityWeather(entity)); // CraftBukkit - Use dimension + this.server.getPlayerList().sendPacketNearby((EntityHuman) null, entity.locX, entity.locY, entity.locZ, 512.0D, this, new PacketPlayOutSpawnEntityWeather(entity)); // CraftBukkit - Use dimension, // Paper - use world instead of dimension return true; } else { return false; @@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { BlockActionData blockactiondata = (BlockActionData) this.d.removeFirst(); if (this.a(blockactiondata)) { - // CraftBukkit - this.worldProvider.dimension -> this.dimension - this.server.getPlayerList().sendPacketNearby((EntityHuman) null, (double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, dimension, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.b(), blockactiondata.c(), blockactiondata.d())); + // CraftBukkit - this.worldProvider.dimension -> this.dimension, // Paper - dimension -> world + this.server.getPlayerList().sendPacketNearby((EntityHuman) null, (double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, this, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.b(), blockactiondata.c(), blockactiondata.d())); } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index b09f0353a..aa0b1f5fa 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -0,0 +0,0 @@ public class CraftWorld implements World { double z = loc.getZ(); PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(new MinecraftKey(sound), SoundCategory.valueOf(category.name()), new Vec3D(x, y, z), volume, pitch); - world.getMinecraftServer().getPlayerList().sendPacketNearby(null, x, y, z, volume > 1.0F ? 16.0F * volume : 16.0D, this.world.dimension, packet); + world.getMinecraftServer().getPlayerList().sendPacketNearby(null, x, y, z, volume > 1.0F ? 16.0F * volume : 16.0D, this.world, packet); // Paper - this.world.dimension -> this.world } public String getGameRuleValue(String rule) { --