diff --git a/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java b/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java index 1894167..d792727 100644 --- a/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java +++ b/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java @@ -63,6 +63,7 @@ private int intervalCounter = 1; private boolean sentLastTick = false; private int sendIndexCounter; + private boolean sortSendQueueLater; public ChunkSendManager(EntityPlayerMP player) { @@ -76,9 +77,17 @@ private void sortSendQueue() { + sortSendQueueLater = true; + } + + private void doSortSendQueue() + { + if(!sortSendQueueLater) + return; + sortSendQueueLater = false; int cx = MathHelper.floor_double(player.posX) >> 4; int cz = MathHelper.floor_double(player.posZ) >> 4; - toSend.sort(ChunkCoordComparator.get(lastFace = BlockFace.yawToFace(player.rotationYaw), cx, cz)); + toSend.backSort(ChunkCoordComparator.get(lastFace = BlockFace.yawToFace(player.rotationYaw), cx, cz)); } private void checkDistance() @@ -192,11 +201,6 @@ removeFrom(manager); } - public void setWorldDestroyed() - { - sendingQueueSize.set(0); - } - public void update() { if(manager == null) @@ -302,13 +306,14 @@ } } } - + private void sendChunks(int count) { + doSortSendQueue(); count = Math.min(count, toSend.size()); for(int i = 0; i < count; i++) { - int key = toSend.get(i); + int key = toSend.removeAt(toSend.size() - 1); int curID = ++sendIndexCounter; sending.put(key, curID); sendingQueueSize.incrementAndGet(); @@ -316,26 +321,23 @@ int ncz = ChunkHash.keyToZ(key); manager.getWorldServer().theChunkProviderServer.loadAsyncWithRadius(ncx, ncz, 1, new ChunkLoadCallback(curID)); } - toSend.remove(0, count); } public void updatePlayerPertinentChunks() { checkDistance(); - - int cx = MathHelper.floor_double(player.posX) >> 4; - int cz = MathHelper.floor_double(player.posZ) >> 4; + + int view = getViewDistance(); double d0 = player.managedPosX - player.posX; double d1 = player.managedPosZ - player.posZ; double square = d0 * d0 + d1 * d1; - - boolean sorted = false; - if (square >= 64.0D) + if (square >= 4 * view * view) { + int cx = MathHelper.floor_double(player.posX) >> 4; + int cz = MathHelper.floor_double(player.posZ) >> 4; int lastX = MathHelper.floor_double(player.managedPosX) >> 4; int lastZ = MathHelper.floor_double(player.managedPosZ) >> 4; - int view = getViewDistance(); int movX = cx - lastX; int movZ = cz - lastZ; @@ -371,20 +373,13 @@ } sortSendQueue(); - sorted = true; player.managedPosX = player.posX; player.managedPosZ = player.posZ; } } - - if(!sorted) - { - BlockFace face = BlockFace.yawToFace(player.rotationYaw); - if(face != lastFace) - { - sortSendQueue(); - } - } + + if(BlockFace.yawToFace(player.rotationYaw) != lastFace) + sortSendQueue(); } private boolean overlaps(int x, int z, int lastX, int lastZ, int radius) diff --git a/src/main/java/org/ultramine/server/util/TIntArrayListImpl.java b/src/main/java/org/ultramine/server/util/TIntArrayListImpl.java index 2f9f6d5..4781108 100644 --- a/src/main/java/org/ultramine/server/util/TIntArrayListImpl.java +++ b/src/main/java/org/ultramine/server/util/TIntArrayListImpl.java @@ -5,7 +5,6 @@ public class TIntArrayListImpl extends TIntArrayList { - public TIntArrayListImpl() { super(); @@ -40,4 +39,16 @@ { CollectionUtil.sort(_data, 0, _pos, comp); } + + public void backSort(IntComparator comp) + { + sort(new IntComparator() + { + @Override + public int compare(int i1, int i2) + { + return comp.compare(i2, i1); + } + }); + } } diff --git a/src/main/java/org/ultramine/server/world/WorldDescriptor.java b/src/main/java/org/ultramine/server/world/WorldDescriptor.java index 66f2399..f9bee88 100644 --- a/src/main/java/org/ultramine/server/world/WorldDescriptor.java +++ b/src/main/java/org/ultramine/server/world/WorldDescriptor.java @@ -253,7 +253,6 @@ player.isDead = false; world.getEntityTracker().removePlayerFromTrackers(player); world.getPlayerManager().removePlayer(player); - player.getChunkMgr().setWorldDestroyed(); player.setWorld(null); player.theItemInWorldManager.setWorld(null); }