From 57d1cd5f6305d7dcad431d9876e0f9c4ed9fc2d3 Mon Sep 17 00:00:00 2001 From: Glitchfinder Date: Sun, 20 Jan 2013 15:46:53 -0800 Subject: [PATCH 1/3] Further alleviating the time it takes to load chunks. --- .../nossr50/listeners/WorldListener.java | 16 +++++- .../blockmeta/chunkmeta/HashChunkManager.java | 51 ++++++++++--------- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java index c9149496a..e532966f6 100644 --- a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java @@ -2,11 +2,16 @@ package com.gmail.nossr50.listeners; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.bukkit.Chunk; import org.bukkit.TreeType; import org.bukkit.World; import org.bukkit.block.BlockState; +import org.bukkit.entity.Entity; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.LivingEntity; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -76,8 +81,17 @@ public class WorldListener implements Listener { @EventHandler public void onChunkLoad(ChunkLoadEvent event) { Chunk chunk = event.getChunk(); - if (chunk.getEntities().length > 0) { + List chunkMobs = new ArrayList(Arrays.asList(chunk.getEntities())); + + if (chunkMobs.isEmpty()) + return; + + for(Entity entity : chunkMobs) { + if(!(entity instanceof LivingEntity) && !(entity instanceof FallingBlock)) + continue; + mcMMO.placeStore.loadChunk(chunk.getX(), chunk.getZ(), event.getWorld()); + return; } } } diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java index 5e255bd91..494853e18 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java @@ -8,6 +8,7 @@ import java.io.ObjectOutputStream; import java.lang.Boolean; import java.lang.Integer; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -161,12 +162,13 @@ public class HashChunkManager implements ChunkManager { UUID key = world.getUID(); boolean oldDataHasKey = oldData.containsKey(key); + boolean converted = false; if (!oldDataHasKey) { oldData.put(key, (new File(world.getWorldFolder(), "mcmmo_data")).exists()); } else if (oldData.get(key)) { - convertChunk(new File(world.getWorldFolder(), "mcmmo_data"), cx, cz, world, true); + converted = convertChunk(new File(world.getWorldFolder(), "mcmmo_data"), cx, cz, world, true); } try { @@ -174,31 +176,32 @@ public class HashChunkManager implements ChunkManager { } catch(Exception e) {} - if (in != null) { - store.put(world.getName() + "," + cx + "," + cz, in); + if (in == null || converted) + return; - List mobs = in.getSpawnedMobs(); + store.put(world.getName() + "," + cx + "," + cz, in); - if (mobs.isEmpty()) - return; + List mobs = in.getSpawnedMobs(); - iteratingMobs = true; + if (mobs.isEmpty()) + return; - for (LivingEntity entity : world.getLivingEntities()) { - if (mobs.contains(entity.getUniqueId())) - addSpawnedMob(entity); - } + iteratingMobs = true; - for(FallingBlock entity: world.getEntitiesByClass(FallingBlock.class)) { - if (mobs.contains(entity.getUniqueId())) - addSpawnedMob(entity); - } + List chunkMobs = new ArrayList(Arrays.asList(world.getChunkAt(cx, cz).getEntities())); - if(safeToRemoveMobs) - iteratingMobs = false; + for (Entity entity : chunkMobs) { + if(!(entity instanceof LivingEntity) && !(entity instanceof FallingBlock)) + continue; - in.clearSpawnedMobs(); + if (mobs.contains(entity.getUniqueId())) + addSpawnedMob(entity); } + + if(safeToRemoveMobs) + iteratingMobs = false; + + in.clearSpawnedMobs(); } @Override @@ -546,14 +549,14 @@ public class HashChunkManager implements ChunkManager { convertChunk(dataDir, cx, cz, world, false); } - public synchronized void convertChunk(File dataDir, int cx, int cz, World world, boolean actually) { + public synchronized boolean convertChunk(File dataDir, int cx, int cz, World world, boolean actually) { if (!actually) - return; - if (!dataDir.exists()) return; + return false; + if (!dataDir.exists()) return false; File cxDir = new File(dataDir, "" + cx); - if (!cxDir.exists()) return; + if (!cxDir.exists()) return false; File czDir = new File(cxDir, "" + cz); - if (!czDir.exists()) return; + if (!czDir.exists()) return false; boolean conversionSet = false; @@ -574,6 +577,8 @@ public class HashChunkManager implements ChunkManager { converter.start(world, cxDir, czDir); converters.add(converter); } + + return true; } public boolean isSpawnedMob(Entity entity) { From 9a6ebb0b9a94a04234a5665bc388a9c1787cd456 Mon Sep 17 00:00:00 2001 From: Glitchfinder Date: Sun, 20 Jan 2013 15:52:00 -0800 Subject: [PATCH 2/3] Slightly reducing the processing required to unload chunks. --- .../nossr50/util/blockmeta/chunkmeta/HashChunkManager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java index 494853e18..95e85cb2f 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.UUID; import org.bukkit.Bukkit; +import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Entity; @@ -289,10 +290,12 @@ public class HashChunkManager implements ChunkManager { if (entity == null || world == null) return false; - if (entity.getLocation().getChunk().getX() != cx) + Chunk chunk = entity.getLocation().getChunk(); + + if (chunk.getX() != cx) return false; - if (entity.getLocation().getChunk().getZ() != cz) + if (chunk.getZ() != cz) return false; if (entity.getWorld() != world) From 77ffc9c3c22723d421ba95ced0deb1b8fcfff3b6 Mon Sep 17 00:00:00 2001 From: Glitchfinder Date: Sun, 20 Jan 2013 15:59:57 -0800 Subject: [PATCH 3/3] Removing unnecessary ArrayLists --- .../java/com/gmail/nossr50/listeners/WorldListener.java | 6 ++---- .../nossr50/util/blockmeta/chunkmeta/HashChunkManager.java | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java index e532966f6..9783c0086 100644 --- a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java @@ -2,8 +2,6 @@ package com.gmail.nossr50.listeners; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import org.bukkit.Chunk; import org.bukkit.TreeType; @@ -81,9 +79,9 @@ public class WorldListener implements Listener { @EventHandler public void onChunkLoad(ChunkLoadEvent event) { Chunk chunk = event.getChunk(); - List chunkMobs = new ArrayList(Arrays.asList(chunk.getEntities())); + Entity[] chunkMobs = chunk.getEntities(); - if (chunkMobs.isEmpty()) + if (chunkMobs.length <= 0) return; for(Entity entity : chunkMobs) { diff --git a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java index 95e85cb2f..7de158767 100755 --- a/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java +++ b/src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java @@ -8,7 +8,6 @@ import java.io.ObjectOutputStream; import java.lang.Boolean; import java.lang.Integer; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -189,7 +188,7 @@ public class HashChunkManager implements ChunkManager { iteratingMobs = true; - List chunkMobs = new ArrayList(Arrays.asList(world.getChunkAt(cx, cz).getEntities())); + Entity[] chunkMobs = world.getChunkAt(cx, cz).getEntities(); for (Entity entity : chunkMobs) { if(!(entity instanceof LivingEntity) && !(entity instanceof FallingBlock))