package com.mengcraft.protect.manager; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.CreatureSpawnEvent; public class EntityManager { private final static EntityManager MANAGER = new EntityManager(); public Map<String, Integer> getEntityInfo(World world) { Map<String, Integer> map = new HashMap<>(); for (Entity entity : world.getEntities()) { addCount(map, entity.getType().name()); } return map; } private void addCount(Map<String, Integer> map, String name) { if (map.containsKey(name)) { map.put(name, map.get(name) + 1); } else { map.put(name, 1); } } public Map<String, Integer> getEntityInfo(List<World> worlds) { Map<String, Integer> map = new HashMap<>(); for (World world : worlds) { addCount(map, getEntityInfo(world)); } return map; } private void addCount(Map<String, Integer> map, Map<String, Integer> info) { for (Entry<String, Integer> entry : info.entrySet()) { String key = entry.getKey(); if (map.containsKey(key)) { map.put(key, map.get(key) + entry.getValue()); } else { map.put(key, entry.getValue()); } } } public int purgeEntity(List<World> worlds, String type, int limit) { int count = 0; for (World world : worlds) { count += purgeEntity(world, type, limit); } return count; } public int purgeEntity(World world, String type, int limit) { int count = 0; for (Entity entity : world.getEntities()) { if (entity instanceof Player) { // Do not purge any player! } else if (type.equals("ALL")) { count += checkPurge(entity, limit); } else if (entity.getType().name().toUpperCase().equals(type)) { count += checkPurge(entity, limit); } } return count; } private int checkPurge(Entity entity, int limit) { if (check(entity, limit) > 0) { entity.remove(); return 1; } return 0; } public int check(Entity entity, int limit) { List<Entity> entities = entity.getNearbyEntities(16, 16, 16); CheckBox box = new CheckBox(entity.getType().name().toUpperCase()); for (Entity e : entities) { box.check(e); } if (box.getResult() > limit) { return 1; } return 0; } public static EntityManager getManager() { return MANAGER; } public Events getEvents(int limit) { return new Events(limit); } private class Events implements Listener { private final int limit; public Events(int limit) { this.limit = limit; } @EventHandler public void onCreatureSpawn(CreatureSpawnEvent event) { int i = check(event.getEntity(), this.limit); if (i > 0) { event.setCancelled(true); } } } private class CheckBox { private final String type; private int result = 0; public void check(Entity entity) { if (entity.getType().name().toUpperCase().equals(this.type)) { this.result++; } } public CheckBox(String name) { this.type = name; } public int getResult() { return this.result; } } }