From 57d1cd5f6305d7dcad431d9876e0f9c4ed9fc2d3 Mon Sep 17 00:00:00 2001 From: Glitchfinder Date: Sun, 20 Jan 2013 15:46:53 -0800 Subject: [PATCH] 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) {