QuickShop/src/main/java/org/maxgamer/quickshop/Listeners/WorldListener.java

79 lines
2.7 KiB
Java

package org.maxgamer.quickshop.Listeners;
import java.util.HashMap;
import java.util.Map.Entry;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.event.world.WorldUnloadEvent;
import org.maxgamer.quickshop.QuickShop;
import org.maxgamer.quickshop.Shop.Shop;
import org.maxgamer.quickshop.Shop.ShopChunk;
public class WorldListener implements Listener {
QuickShop plugin;
public WorldListener(QuickShop plugin) {
this.plugin = plugin;
}
@EventHandler
public void onWorldLoad(WorldLoadEvent e) {
/* *************************************
* This listener fixes any broken world references. Such as hashmap
* lookups will fail, because the World reference is different, but the
* world value is the same. ************************************
*/
World world = e.getWorld();
// New world data
HashMap<ShopChunk, HashMap<Location, Shop>> inWorld = new HashMap<ShopChunk, HashMap<Location, Shop>>(1);
// Old world data
HashMap<ShopChunk, HashMap<Location, Shop>> oldInWorld = plugin.getShopManager().getShops(world.getName());
// Nothing in the old world, therefore we don't care. No locations to
// update.
if (oldInWorld == null)
return;
for (Entry<ShopChunk, HashMap<Location, Shop>> oldInChunk : oldInWorld.entrySet()) {
HashMap<Location, Shop> inChunk = new HashMap<Location, Shop>(1);
// Put the new chunk were the old chunk was
inWorld.put(oldInChunk.getKey(), inChunk);
for (Entry<Location, Shop> entry : oldInChunk.getValue().entrySet()) {
Shop shop = entry.getValue();
shop.getLocation().setWorld(world);
inChunk.put(shop.getLocation(), shop);
}
}
// Done - Now we can store the new world dataz!
plugin.getShopManager().getShops().put(world.getName(), inWorld);
// This is a workaround, because I don't get parsed chunk events when a
// world first loads....
// So manually tell all of these shops they're loaded.
for (Chunk chunk : world.getLoadedChunks()) {
HashMap<Location, Shop> inChunk = plugin.getShopManager().getShops(chunk);
if (inChunk == null)
continue;
for (Shop shop : inChunk.values()) {
shop.onLoad();
}
}
}
@EventHandler
public void onWorldUnload(WorldUnloadEvent e) {
// This is a workaround, because I don't get parsed chunk events when a
// world unloads, I think...
// So manually tell all of these shops they're unloaded.
for (Chunk chunk : e.getWorld().getLoadedChunks()) {
HashMap<Location, Shop> inChunk = plugin.getShopManager().getShops(chunk);
if (inChunk == null)
continue;
for (Shop shop : inChunk.values()) {
shop.onUnload();
}
}
}
}