From 7a8ef4f6a424e907095ac5402cf903e388ad80f8 Mon Sep 17 00:00:00 2001 From: EvilSeph Date: Tue, 6 Mar 2012 19:59:15 -0500 Subject: [PATCH] Extremely hackish fix for the entity interactivity issue. Fixes BUKKIT-960 --- .../net/minecraft/server/NetLoginHandler.java | 3 +- .../minecraft/server/NetServerHandler.java | 88 ++++++++++++++++++- .../server/ServerConfigurationManager.java | 83 +++++++++++++++++ 3 files changed, 172 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/NetLoginHandler.java b/src/main/java/net/minecraft/server/NetLoginHandler.java index 9f5e6e00ae..83f0afb95e 100644 --- a/src/main/java/net/minecraft/server/NetLoginHandler.java +++ b/src/main/java/net/minecraft/server/NetLoginHandler.java @@ -119,7 +119,8 @@ public class NetLoginHandler extends NetHandler { this.server.serverConfigurationManager.a(entityplayer, worldserver); // this.server.serverConfigurationManager.sendAll(new Packet3Chat("\u00A7e" + entityplayer.name + " joined the game.")); // CraftBukkit - message moved to join event this.server.serverConfigurationManager.c(entityplayer); - netserverhandler.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); + // CraftBukkit - temporary initial join teleport function, houses hacky entity fix. + netserverhandler.initialJoin(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); this.server.networkListenThread.a(netserverhandler); netserverhandler.sendPacket(new Packet4UpdateTime(entityplayer.getPlayerTime())); // CraftBukkit - add support for player specific time Iterator iterator = entityplayer.getEffects().iterator(); diff --git a/src/main/java/net/minecraft/server/NetServerHandler.java b/src/main/java/net/minecraft/server/NetServerHandler.java index b6e41be883..50f2658c9f 100644 --- a/src/main/java/net/minecraft/server/NetServerHandler.java +++ b/src/main/java/net/minecraft/server/NetServerHandler.java @@ -9,6 +9,8 @@ import java.io.UnsupportedEncodingException; import java.util.logging.Level; import java.util.Arrays; import java.util.HashSet; +import java.util.Timer; +import java.util.TimerTask; import org.bukkit.ChatColor; import org.bukkit.craftbukkit.ChunkCompressionThread; @@ -262,7 +264,7 @@ public class NetServerHandler extends NetHandler implements ICommandListener { if (packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) { // CraftBukkit start - if (packet10flying.x > 1 || packet10flying.z > 1) { + if (Math.abs(packet10flying.x) > 1 || Math.abs(packet10flying.z) > 1) { System.err.println(player.getName() + " was caught trying to crash the server with an invalid position."); player.kickPlayer("Nope!"); return; @@ -415,6 +417,90 @@ public class NetServerHandler extends NetHandler implements ICommandListener { } } + // CraftBukkit start - temporary initial join teleport function, houses hacky entity fix. + public void initialJoin(double d0, double d1, double d2, float f, float f1) { + Location to = new Location(this.getPlayer().getWorld(), d0, d1, d2, f, f1); + + this.teleport(to); + + Timer timer = new Timer(); + final ArrayList nearby = new ArrayList(); + // Start inline nearby entities + AxisAlignedBB axisalignedbb = player.boundingBox.grow(100, 100, 100); + int i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D); + int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D); + int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D); + int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D); + + for (int i1 = i; i1 <= j; ++i1) { + for (int j1 = k; j1 <= l; ++j1) { + if (player.world.chunkProvider.isChunkLoaded(i1, j1)) { + player.world.getChunkAt(i1, j1).a(player, axisalignedbb, nearby); + } + } + } + // End inline nearby entities + for (Object entity : nearby) { + if (entity instanceof EntityLiving || entity instanceof EntityMinecart || entity instanceof EntityBoat || entity instanceof IAnimal || entity instanceof EntityPainting) { + player.netServerHandler.sendPacket(new Packet29DestroyEntity(((Entity) entity).id)); + } + } + + timer.schedule(new TimerTask(){ + public void run() { + // Start inline nearby entities + nearby.clear(); + AxisAlignedBB axisalignedbb = player.boundingBox.grow(100, 100, 100); + int i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D); + int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D); + int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D); + int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D); + + for (int i1 = i; i1 <= j; ++i1) { + for (int j1 = k; j1 <= l; ++j1) { + if (player.world.chunkProvider.isChunkLoaded(i1, j1)) { + player.world.getChunkAt(i1, j1).a(player, axisalignedbb, nearby); + } + } + } + // End inline nearby entities + for (Object entityObject2 : nearby) { + try { + Entity entity = (Entity) entityObject2; + + if (entity instanceof EntityPlayer) { + player.netServerHandler.sendPacket(new Packet20NamedEntitySpawn((EntityHuman) entity)); + } else if (entity instanceof EntityMinecart) { + EntityMinecart entityminecart = (EntityMinecart) entity; + + if (entityminecart.type == 0) { + player.netServerHandler.sendPacket(new Packet23VehicleSpawn(entity, 10)); + } + + if (entityminecart.type == 1) { + player.netServerHandler.sendPacket(new Packet23VehicleSpawn(entity, 11)); + } + + if (entityminecart.type == 2) { + player.netServerHandler.sendPacket(new Packet23VehicleSpawn(entity, 12)); + } + } else if (entity instanceof EntityBoat) { + player.netServerHandler.sendPacket(new Packet23VehicleSpawn(entity, 1)); + } else if (entity instanceof IAnimal) { + player.netServerHandler.sendPacket(new Packet24MobSpawn((EntityLiving) entity)); + } else if (entity instanceof EntityEnderDragon) { + player.netServerHandler.sendPacket(new Packet24MobSpawn((EntityLiving) entity)); + } else if (entity instanceof EntityPainting) { + player.netServerHandler.sendPacket(new Packet25EntityPainting((EntityPainting) entity)); + } + } catch (ClassCastException e) { + } + } + } + }, 5000); + } + // CraftBukkit end + public void a(double d0, double d1, double d2, float f, float f1) { // CraftBukkit start - Delegate to teleport(Location) Player player = this.getPlayer(); diff --git a/src/main/java/net/minecraft/server/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/ServerConfigurationManager.java index 282e220c7d..da9f6d94f0 100644 --- a/src/main/java/net/minecraft/server/ServerConfigurationManager.java +++ b/src/main/java/net/minecraft/server/ServerConfigurationManager.java @@ -13,6 +13,9 @@ import java.util.Set; import java.util.logging.Logger; // CraftBukkit start +import java.util.Timer; +import java.util.TimerTask; + import org.bukkit.Location; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; @@ -322,6 +325,86 @@ public class ServerConfigurationManager { Bukkit.getServer().getPluginManager().callEvent(event); } // CraftBukkit end + + // CraftBukkit start - temporary hacky entity fix. + Timer timer = new Timer(); + final ArrayList nearby = new ArrayList(); + final EntityPlayer nmsEntity = entityplayer1; + // Start inline nearby entities + AxisAlignedBB axisalignedbb = nmsEntity.boundingBox.grow(100, 100, 100); + i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D); + int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D); + int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D); + int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D); + + for (int i1 = i; i1 <= j; ++i1) { + for (int j1 = k; j1 <= l; ++j1) { + if (nmsEntity.world.chunkProvider.isChunkLoaded(i1, j1)) { + nmsEntity.world.getChunkAt(i1, j1).a(nmsEntity, axisalignedbb, nearby); + } + } + } + // End inline nearby entities + for (Object entity : nearby) { + if (entity instanceof EntityLiving || entity instanceof EntityMinecart || entity instanceof EntityBoat || entity instanceof IAnimal || entity instanceof EntityPainting) { + nmsEntity.netServerHandler.sendPacket(new Packet29DestroyEntity(((Entity) entity).id)); + } + } + + timer.schedule(new TimerTask(){ + public void run() { + // Start inline nearby entities + nearby.clear(); + AxisAlignedBB axisalignedbb = nmsEntity.boundingBox.grow(100, 100, 100); + int i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D); + int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D); + int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D); + int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D); + + for (int i1 = i; i1 <= j; ++i1) { + for (int j1 = k; j1 <= l; ++j1) { + if (nmsEntity.world.chunkProvider.isChunkLoaded(i1, j1)) { + nmsEntity.world.getChunkAt(i1, j1).a(nmsEntity, axisalignedbb, nearby); + } + } + } + // End inline nearby entities + for (Object entityObject2 : nearby) { + try { + Entity entity = (Entity) entityObject2; + + if (entity instanceof EntityPlayer) { + nmsEntity.netServerHandler.sendPacket(new Packet20NamedEntitySpawn((EntityHuman) entity)); + } else if (entity instanceof EntityMinecart) { + EntityMinecart entityminecart = (EntityMinecart) entity; + + if (entityminecart.type == 0) { + nmsEntity.netServerHandler.sendPacket(new Packet23VehicleSpawn(entity, 10)); + } + + if (entityminecart.type == 1) { + nmsEntity.netServerHandler.sendPacket(new Packet23VehicleSpawn(entity, 11)); + } + + if (entityminecart.type == 2) { + nmsEntity.netServerHandler.sendPacket(new Packet23VehicleSpawn(entity, 12)); + } + } else if (entity instanceof EntityBoat) { + nmsEntity.netServerHandler.sendPacket(new Packet23VehicleSpawn(entity, 1)); + } else if (entity instanceof IAnimal) { + nmsEntity.netServerHandler.sendPacket(new Packet24MobSpawn((EntityLiving) entity)); + } else if (entity instanceof EntityEnderDragon) { + nmsEntity.netServerHandler.sendPacket(new Packet24MobSpawn((EntityLiving) entity)); + } else if (entity instanceof EntityPainting) { + nmsEntity.netServerHandler.sendPacket(new Packet25EntityPainting((EntityPainting) entity)); + } + } catch (ClassCastException e) { + } + } + } + }, 5000); + // CraftBukkit end + return entityplayer1; }