diff --git a/bukkit18/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue18R3.java b/bukkit18/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue18R3.java index db10602c..c2193b3d 100644 --- a/bukkit18/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue18R3.java +++ b/bukkit18/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue18R3.java @@ -2,18 +2,16 @@ package com.boydti.fawe.bukkit.v1_8; import com.boydti.fawe.Fawe; import com.boydti.fawe.FaweCache; -import com.boydti.fawe.bukkit.BukkitPlayer; import com.boydti.fawe.bukkit.v0.BukkitQueue_0; import com.boydti.fawe.example.CharFaweChunk; import com.boydti.fawe.object.BytePair; import com.boydti.fawe.object.FaweChunk; -import com.boydti.fawe.object.FaweLocation; -import com.boydti.fawe.object.FawePlayer; import com.boydti.fawe.object.PseudoRandom; import com.boydti.fawe.object.RunnableVal; import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.MathMan; import com.boydti.fawe.util.ReflectionUtils; +import com.boydti.fawe.util.TaskManager; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.ListTag; import com.sk89q.jnbt.StringTag; @@ -24,6 +22,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -32,18 +31,22 @@ import net.minecraft.server.v1_8_R3.ChunkCoordIntPair; import net.minecraft.server.v1_8_R3.ChunkSection; import net.minecraft.server.v1_8_R3.Entity; import net.minecraft.server.v1_8_R3.EntityPlayer; +import net.minecraft.server.v1_8_R3.EntityTracker; +import net.minecraft.server.v1_8_R3.EntityTrackerEntry; import net.minecraft.server.v1_8_R3.EntityTypes; +import net.minecraft.server.v1_8_R3.LongHashMap; import net.minecraft.server.v1_8_R3.NBTTagCompound; import net.minecraft.server.v1_8_R3.NibbleArray; +import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy; import net.minecraft.server.v1_8_R3.PacketPlayOutMapChunk; -import net.minecraft.server.v1_8_R3.PlayerConnection; +import net.minecraft.server.v1_8_R3.PlayerChunkMap; import net.minecraft.server.v1_8_R3.TileEntity; +import net.minecraft.server.v1_8_R3.WorldServer; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.craftbukkit.v1_8_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.event.entity.CreatureSpawnEvent; public class BukkitQueue18R3 extends BukkitQueue_0 { @@ -390,27 +393,86 @@ public class BukkitQueue18R3 extends BukkitQueue_0> 4; - int pz = loc.z >> 4; - int dx = Math.abs(cx - (px)); - int dz = Math.abs(cz - (pz)); - if ((dx > view) || (dz > view)) { - continue; + HashSet set = new HashSet(); + EntityTracker tracker = w.getTracker(); + // Get players + + Field fieldChunkMap = chunkMap.getClass().getDeclaredField("d"); + fieldChunkMap.setAccessible(true); + LongHashMap map = (LongHashMap) fieldChunkMap.get(chunkMap); + long pair = (long) x + 2147483647L | (long) z + 2147483647L << 32; + Object playerChunk = map.getEntry(pair); + Field fieldPlayers = playerChunk.getClass().getDeclaredField("b"); + fieldPlayers.setAccessible(true); + HashSet players = new HashSet<>((Collection)fieldPlayers.get(playerChunk)); + if (players.size() == 0) { + return; } - PlayerConnection con = nmsPlayer.playerConnection; - con.sendPacket(new PacketPlayOutMapChunk(nmsChunk, false, 65535)); + HashSet entities = new HashSet<>(); + List[] entitieSlices = nmsChunk.getEntitySlices(); + for (List slice : entitieSlices) { + if (slice == null) { + continue; + } + for (Entity ent : slice) { + EntityTrackerEntry entry = tracker.trackedEntities.get(ent.getId()); + if (entry == null) { + continue; + } + entities.add(entry); + PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy(ent.getId()); + for (EntityPlayer player : players) { + player.playerConnection.sendPacket(packet); + } + } + } + for (EntityPlayer player : players) { + player.playerConnection.networkManager.a(); + } + // Send chunks + PacketPlayOutMapChunk packet = new PacketPlayOutMapChunk(nmsChunk, false, 65535); + for (EntityPlayer player : players) { + player.playerConnection.sendPacket(packet); + } + // send ents + for (List slice : entitieSlices) { + if (slice == null) { + continue; + } + for (Entity ent : slice) { + EntityTrackerEntry entry = tracker.trackedEntities.get(ent.getId()); + if (entry == null) { + continue; + } + try { + TaskManager.IMP.later(new Runnable() { + @Override + public void run() { + for (EntityPlayer player : players) { + boolean result = entry.trackedPlayers.remove(player); + if (result && ent != player) { + entry.updatePlayer(player); + } + } + } + }, 2); + } catch (Throwable e) { + MainUtil.handleError(e); + } + } + } + } catch (Throwable e) { + MainUtil.handleError(e); } } diff --git a/bukkit19/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java b/bukkit19/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java index 6115bdb8..13399247 100644 --- a/bukkit19/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java +++ b/bukkit19/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java @@ -20,7 +20,6 @@ import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.internal.Constants; import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -47,7 +46,6 @@ import net.minecraft.server.v1_9_R2.EntityTypes; import net.minecraft.server.v1_9_R2.IBlockData; import net.minecraft.server.v1_9_R2.NBTTagCompound; import net.minecraft.server.v1_9_R2.NibbleArray; -import net.minecraft.server.v1_9_R2.Packet; import net.minecraft.server.v1_9_R2.PacketPlayOutEntityDestroy; import net.minecraft.server.v1_9_R2.PacketPlayOutMapChunk; import net.minecraft.server.v1_9_R2.PlayerChunk; @@ -154,7 +152,7 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0