mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-26 12:35:15 +01:00
fixes #39
This commit is contained in:
parent
a9c78e491e
commit
20cfa053e5
@ -59,6 +59,7 @@ import com.intellectualcrafters.plot.events.PlotDeleteEvent;
|
|||||||
import com.intellectualcrafters.plot.generator.DefaultPlotManager;
|
import com.intellectualcrafters.plot.generator.DefaultPlotManager;
|
||||||
import com.intellectualcrafters.plot.generator.DefaultPlotWorld;
|
import com.intellectualcrafters.plot.generator.DefaultPlotWorld;
|
||||||
import com.intellectualcrafters.plot.generator.WorldGenerator;
|
import com.intellectualcrafters.plot.generator.WorldGenerator;
|
||||||
|
import com.intellectualcrafters.plot.listeners.EntityListener;
|
||||||
import com.intellectualcrafters.plot.listeners.ForceFieldListener;
|
import com.intellectualcrafters.plot.listeners.ForceFieldListener;
|
||||||
import com.intellectualcrafters.plot.listeners.PlayerEvents;
|
import com.intellectualcrafters.plot.listeners.PlayerEvents;
|
||||||
import com.intellectualcrafters.plot.listeners.PlotListener;
|
import com.intellectualcrafters.plot.listeners.PlotListener;
|
||||||
@ -611,7 +612,7 @@ public class PlotMain extends JavaPlugin {
|
|||||||
if (Settings.KILL_ROAD_MOBS) {
|
if (Settings.KILL_ROAD_MOBS) {
|
||||||
killAllEntities();
|
killAllEntities();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enabled<3
|
// Enabled<3
|
||||||
if (C.ENABLED.s().length() > 0) {
|
if (C.ENABLED.s().length() > 0) {
|
||||||
Broadcast(C.ENABLED);
|
Broadcast(C.ENABLED);
|
||||||
@ -723,6 +724,9 @@ public class PlotMain extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
// getCommand("plots").setTabCompleter(command);
|
// getCommand("plots").setTabCompleter(command);
|
||||||
|
if (Settings.MOB_CAP_ENABLED) {
|
||||||
|
getServer().getPluginManager().registerEvents(new EntityListener(), this);
|
||||||
|
}
|
||||||
getServer().getPluginManager().registerEvents(new PlayerEvents(), this);
|
getServer().getPluginManager().registerEvents(new PlayerEvents(), this);
|
||||||
PlotPlusListener.startRunnable(this);
|
PlotPlusListener.startRunnable(this);
|
||||||
getServer().getPluginManager().registerEvents(new PlotPlusListener(), this);
|
getServer().getPluginManager().registerEvents(new PlotPlusListener(), this);
|
||||||
@ -1124,6 +1128,9 @@ public class PlotMain extends JavaPlugin {
|
|||||||
options.put("api.location", Settings.API_URL);
|
options.put("api.location", Settings.API_URL);
|
||||||
options.put("api.custom", Settings.CUSTOM_API);
|
options.put("api.custom", Settings.CUSTOM_API);
|
||||||
options.put("titles", Settings.TITLES);
|
options.put("titles", Settings.TITLES);
|
||||||
|
|
||||||
|
options.put("perm-based-mob-cap.enabled", Settings.MOB_CAP_ENABLED);
|
||||||
|
options.put("perm-based-mob-cap.max", Settings.MOB_CAP);
|
||||||
|
|
||||||
for (final Entry<String, Object> node : options.entrySet()) {
|
for (final Entry<String, Object> node : options.entrySet()) {
|
||||||
if (!config.contains(node.getKey())) {
|
if (!config.contains(node.getKey())) {
|
||||||
@ -1141,6 +1148,8 @@ public class PlotMain extends JavaPlugin {
|
|||||||
Settings.AUTO_CLEAR_DAYS = config.getInt("clear.auto.days");
|
Settings.AUTO_CLEAR_DAYS = config.getInt("clear.auto.days");
|
||||||
Settings.AUTO_CLEAR = config.getBoolean("clear.auto.enabled");
|
Settings.AUTO_CLEAR = config.getBoolean("clear.auto.enabled");
|
||||||
Settings.TITLES = config.getBoolean("titles");
|
Settings.TITLES = config.getBoolean("titles");
|
||||||
|
Settings.MOB_CAP_ENABLED = config.getBoolean("perm-based-mob-cap.enabled");
|
||||||
|
Settings.MOB_CAP = config.getInt("perm-based-mob-cap.max");
|
||||||
Settings.MAX_PLOTS = config.getInt("max_plots");
|
Settings.MAX_PLOTS = config.getInt("max_plots");
|
||||||
Settings.SCHEMATIC_SAVE_PATH = config.getString("schematics.save_path");
|
Settings.SCHEMATIC_SAVE_PATH = config.getString("schematics.save_path");
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,10 @@ package com.intellectualcrafters.plot;
|
|||||||
* @author Empire92
|
* @author Empire92
|
||||||
*/
|
*/
|
||||||
public class Settings {
|
public class Settings {
|
||||||
|
|
||||||
|
public static boolean MOB_CAP_ENABLED = false;
|
||||||
|
public static int MOB_CAP = 20;
|
||||||
|
|
||||||
public static boolean TITLES = true;
|
public static boolean TITLES = true;
|
||||||
/**
|
/**
|
||||||
* Schematic Save Path
|
* Schematic Save Path
|
||||||
|
@ -249,7 +249,6 @@ public class PlotMeConverter {
|
|||||||
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mw create " + worldname + " plugin:PlotSquared");
|
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mw create " + worldname + " plugin:PlotSquared");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
System.out.print("LOADED WORLD");
|
|
||||||
Bukkit.getServer().unloadWorld(world, true);
|
Bukkit.getServer().unloadWorld(world, true);
|
||||||
final World myworld = WorldCreator.name(worldname).generator(new WorldGenerator(worldname)).createWorld();
|
final World myworld = WorldCreator.name(worldname).generator(new WorldGenerator(worldname)).createWorld();
|
||||||
myworld.save();
|
myworld.save();
|
||||||
|
@ -0,0 +1,216 @@
|
|||||||
|
package com.intellectualcrafters.plot.listeners;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Chunk;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||||
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEntityEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.event.world.ChunkLoadEvent;
|
||||||
|
import org.bukkit.event.world.ChunkUnloadEvent;
|
||||||
|
import org.bukkit.scheduler.BukkitScheduler;
|
||||||
|
|
||||||
|
import com.intellectualcrafters.plot.C;
|
||||||
|
import com.intellectualcrafters.plot.PlayerFunctions;
|
||||||
|
import com.intellectualcrafters.plot.Plot;
|
||||||
|
import com.intellectualcrafters.plot.PlotHelper;
|
||||||
|
import com.intellectualcrafters.plot.PlotMain;
|
||||||
|
import com.intellectualcrafters.plot.Settings;
|
||||||
|
|
||||||
|
public class EntityListener implements Listener {
|
||||||
|
|
||||||
|
public static HashMap<String, HashMap<Plot, HashSet<Integer>>> entityMap = new HashMap<String, HashMap<Plot, HashSet<Integer>>>();
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||||
|
public static void onPlayerInteract(final PlayerInteractEvent e) {
|
||||||
|
if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||||
|
final Player p = e.getPlayer();
|
||||||
|
World w = p.getWorld();
|
||||||
|
String n = w.getName();
|
||||||
|
if (e.getMaterial() == Material.MONSTER_EGG || e.getMaterial() == Material.MONSTER_EGGS) {
|
||||||
|
if (entityMap.containsKey(n)) {
|
||||||
|
Location l = e.getClickedBlock().getLocation();
|
||||||
|
Plot plot = PlotHelper.getCurrentPlot(l);
|
||||||
|
if (plot!=null && plot.hasRights(p)) {
|
||||||
|
int mobs;
|
||||||
|
if (entityMap.get(n).containsKey(plot)) {
|
||||||
|
mobs = entityMap.get(n).get(plot).size();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mobs = 0;
|
||||||
|
}
|
||||||
|
if (!(PlotMain.hasPermissionRange(p, "plots.mobcap", Settings.MOB_CAP)>mobs)) {
|
||||||
|
PlayerFunctions.sendMessage(p, C.NO_PLOTS, "plots.mobcap."+(mobs+1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public static void onCreatureSpawn(CreatureSpawnEvent e) {
|
||||||
|
Location l = e.getLocation();
|
||||||
|
String w = l.getWorld().getName();
|
||||||
|
if (PlotMain.isPlotWorld(w)) {
|
||||||
|
Plot plot = PlotHelper.getCurrentPlot(l);
|
||||||
|
if (plot!=null && plot.hasOwner()) {
|
||||||
|
addEntity(e.getEntity(), plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntityListener() {
|
||||||
|
BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
|
||||||
|
scheduler.scheduleSyncRepeatingTask(PlotMain.getMain(), new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Iterator<Entry<String, HashMap<Plot, HashSet<Integer>>>> worldIt = entityMap.entrySet().iterator();
|
||||||
|
|
||||||
|
Set<Plot> plots = PlotMain.getPlots();
|
||||||
|
|
||||||
|
while (worldIt.hasNext()) {
|
||||||
|
Entry<String, HashMap<Plot, HashSet<Integer>>> entry = worldIt.next();
|
||||||
|
String worldname = entry.getKey();
|
||||||
|
if (!PlotMain.isPlotWorld(worldname)) {
|
||||||
|
worldIt.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
World world = Bukkit.getWorld(worldname);
|
||||||
|
if (world == null || entry.getValue().size() == 0) {
|
||||||
|
worldIt.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Iterator<Entry<Plot, HashSet<Integer>>> it = entry.getValue().entrySet().iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
Entry<Plot, HashSet<Integer>> plotEntry = it.next();
|
||||||
|
Plot plot = plotEntry.getKey();
|
||||||
|
if (!plots.contains(plot)) {
|
||||||
|
it.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean loaded = false;
|
||||||
|
|
||||||
|
final Location pos1 = PlotHelper.getPlotBottomLoc(world, plot.id).add(1, 0, 1);
|
||||||
|
final Location pos2 = PlotHelper.getPlotTopLoc(world, plot.id);
|
||||||
|
try {
|
||||||
|
loops:
|
||||||
|
for (int i = (pos1.getBlockX() / 16) * 16; i < (16 + ((pos2.getBlockX() / 16) * 16)); i += 16) {
|
||||||
|
for (int j = (pos1.getBlockZ() / 16) * 16; j < (16 + ((pos2.getBlockZ() / 16) * 16)); j += 16) {
|
||||||
|
final Chunk chunk = world.getChunkAt(i, j);
|
||||||
|
if (chunk.isLoaded()) {
|
||||||
|
loaded = true;
|
||||||
|
break loops;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
it.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!loaded) {
|
||||||
|
it.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 24000L, 48000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public static void onChunkLoad(final ChunkLoadEvent e) {
|
||||||
|
if (PlotMain.isPlotWorld(e.getWorld())) {
|
||||||
|
for (Entity entity : e.getChunk().getEntities()) {
|
||||||
|
if (entity instanceof LivingEntity) {
|
||||||
|
if (!(entity instanceof Player)) {
|
||||||
|
Plot plot = PlotHelper.getCurrentPlot(entity.getLocation());
|
||||||
|
if (plot!=null) {
|
||||||
|
if (plot.hasOwner()) {
|
||||||
|
addEntity(entity, plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addEntity(Entity entity, Plot plot) {
|
||||||
|
if (!entityMap.containsKey(plot.world)) {
|
||||||
|
entityMap.put(plot.world, new HashMap<Plot, HashSet<Integer>>());
|
||||||
|
}
|
||||||
|
HashMap<Plot, HashSet<Integer>> section = entityMap.get(plot.world);
|
||||||
|
if (section.containsKey(plot)) {
|
||||||
|
section.put(plot, new HashSet<Integer>());
|
||||||
|
}
|
||||||
|
section.get(plot).add(entity.getEntityId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public static void onEntityDeath(EntityDeathEvent e) {
|
||||||
|
Entity entity = e.getEntity();
|
||||||
|
Location l = entity.getLocation();
|
||||||
|
String w = l.getWorld().getName();
|
||||||
|
if (entityMap.containsKey(w)) {
|
||||||
|
int id = entity.getEntityId();
|
||||||
|
Plot plot = PlotHelper.getCurrentPlot(entity.getLocation());
|
||||||
|
if (plot!=null) {
|
||||||
|
if (entityMap.get(w).containsKey(plot)) {
|
||||||
|
entityMap.get(w).get(plot).remove(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Iterator<Entry<Plot, HashSet<Integer>>> it = entityMap.get(w).entrySet().iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
Entry<Plot, HashSet<Integer>> n = it.next();
|
||||||
|
n.getValue().remove(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public static void onChunkDespawn(final ChunkUnloadEvent e) {
|
||||||
|
String w = e.getWorld().getName();
|
||||||
|
if (entityMap.containsKey(w)) {
|
||||||
|
for (Entity entity : e.getChunk().getEntities()) {
|
||||||
|
if (entity instanceof LivingEntity) {
|
||||||
|
if (!(entity instanceof Player)) {
|
||||||
|
Plot plot = PlotHelper.getCurrentPlot(entity.getLocation());
|
||||||
|
if (plot!=null) {
|
||||||
|
if (plot.hasOwner()) {
|
||||||
|
if (entityMap.get(w).containsKey(plot)) {
|
||||||
|
if (entityMap.get(w).get(plot).size()==1) {
|
||||||
|
entityMap.get(w).remove(plot);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
entityMap.get(w).get(plot).remove(entity.getEntityId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user