Fixes #418 Fixes #417 Fixes #408

This commit is contained in:
boy0001 2015-07-18 21:18:45 +10:00
parent ec204bb4c4
commit 31eee609a6
8 changed files with 33 additions and 228 deletions

View File

@ -8,7 +8,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<artifactId>PlotSquared</artifactId> <artifactId>PlotSquared</artifactId>
<version>2.12.11</version> <version>2.12.12</version>
<name>PlotSquared</name> <name>PlotSquared</name>
<packaging>jar</packaging> <packaging>jar</packaging>
<build> <build>

View File

@ -5,8 +5,12 @@ import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.nio.file.Files;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Stack; import java.util.Stack;
@ -133,18 +137,6 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
} else { } else {
log("&dUsing metrics will allow us to improve the plugin, please consider it :)"); log("&dUsing metrics will allow us to improve the plugin, please consider it :)");
} }
// File file = new File(this.getDirectory() + File.separator + "disabled.yml");
// if (file.exists()) {
// file.delete();
// try {
// String[] split = new String(Files.readAllBytes(file.toPath())).split(",");
// for (String plugin : split) {
// loadPlugin(plugin);
// }
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
List<World> worlds = Bukkit.getWorlds(); List<World> worlds = Bukkit.getWorlds();
if (worlds.size() > 0) { if (worlds.size() > 0) {
UUIDHandler.cacheAll(worlds.get(0).getName()); UUIDHandler.cacheAll(worlds.get(0).getName());
@ -162,12 +154,6 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
@Override @Override
public void onDisable() { public void onDisable() {
PS.get().disable(); PS.get().disable();
try {
unloadRecursively(this);
}
catch (Exception e) {
e.printStackTrace();
};
THIS = null; THIS = null;
} }
@ -192,8 +178,10 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
@Override @Override
public void disable() { public void disable() {
if (THIS != null) {
onDisable(); onDisable();
} }
}
@Override @Override
public String getVersion() { public String getVersion() {
@ -420,163 +408,6 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
}, 20); }, 20);
} }
public boolean unloadPlugin(Plugin plugin) {
try {
plugin.getClass().getClassLoader().getResources("*");
} catch (IOException e1) {
e1.printStackTrace();
}
PluginManager pm = Bukkit.getServer().getPluginManager();
Map<String, Plugin> ln;
List<Plugin> pl;
try {
Field lnF = pm.getClass().getDeclaredField("lookupNames");
lnF.setAccessible(true);
ln = (Map) lnF.get(pm);
Field plF = pm.getClass().getDeclaredField("plugins");
plF.setAccessible(true);
pl = (List) plF.get(pm);
} catch (Exception e) {
e.printStackTrace();
return false;
}
pm.disablePlugin(plugin);
synchronized (pm) {
ln.remove(plugin.getName());
pl.remove(plugin);
}
JavaPluginLoader jpl = (JavaPluginLoader) plugin.getPluginLoader();
Field loadersF = null;
try {
loadersF = jpl.getClass().getDeclaredField("loaders");
loadersF.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
try {
Map<String, ?> loaderMap = (Map) loadersF.get(jpl);
loaderMap.remove(plugin.getDescription().getName());
} catch (Exception e) {
e.printStackTrace();
}
closeClassLoader(plugin);
System.gc();
System.gc();
return true;
}
public boolean closeClassLoader(Plugin plugin) {
try {
((URLClassLoader) plugin.getClass().getClassLoader()).close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public boolean unloadRecursively(Plugin plugin) {
try {
Stack<String> pluginFiles = unloadRecursively(plugin.getName(), plugin, new Stack());
File file = new File(this.getDirectory() + File.separator + "disabled.yml");
file.createNewFile();
String prefix = "";
String all = "";
while (pluginFiles.size() > 0) {
String pop = pluginFiles.pop();
all += prefix + pop.substring(0, pop.length() - 4);
prefix = ",";
}
if (all.length() != 0) {
PrintWriter out = new PrintWriter(this.getDirectory() + File.separator + "disabled.yml");
out.write(all);
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
@Override
public void loadPlugin(String name) {
try {
PluginManager manager = Bukkit.getServer().getPluginManager();
Plugin plugin = manager.getPlugin(name);
if (plugin != null) {
manager.enablePlugin(plugin);
return;
}
plugin = manager.loadPlugin(new File("plugins" + File.separator + name + (name.endsWith(".jar") ? "" : ".jar")));
plugin.onLoad();
manager.enablePlugin(plugin);
} catch (Exception e) {}
}
@Override
public File getFile() {
return getFile(this);
}
public File getFile(JavaPlugin p) {
try {
Field f = JavaPlugin.class.getDeclaredField("file");
f.setAccessible(true);
return (File) f.get(p);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public Stack<String> unloadRecursively(String doNotLoad, Plugin plugin, Stack<String> pluginFiles) {
if (!plugin.getName().equals(doNotLoad)) {
File file = getFile((JavaPlugin) plugin);
pluginFiles.push(file.getName());
}
PluginManager pm = Bukkit.getPluginManager();
for (Plugin p : pm.getPlugins()) {
List<String> depend = p.getDescription().getDepend();
if (depend != null) {
for (String s : depend) {
if (s.equals(plugin.getName())) {
unloadRecursively(doNotLoad, p, pluginFiles);
}
}
}
List<String> softDepend = p.getDescription().getSoftDepend();
if (softDepend != null) {
for (String s : softDepend) {
if (s.equals(plugin.getName())) {
unloadRecursively(doNotLoad, p, pluginFiles);
}
}
}
}
if (unloadPlugin(plugin)) {
List<String> depend = plugin.getDescription().getDepend();
if (depend != null) {
for (String s : depend) {
Plugin p = pm.getPlugin(s);
if (p != null) {
unloadRecursively(doNotLoad, p, pluginFiles);
}
}
}
List<String> softDepend = plugin.getDescription().getSoftDepend();
if (softDepend != null) {
for (String s : softDepend) {
Plugin p = pm.getPlugin(s);
if (p != null) {
unloadRecursively(doNotLoad, p, pluginFiles);
}
}
}
}
return pluginFiles;
}
@Override @Override
final public ChunkGenerator getDefaultWorldGenerator(final String world, final String id) { final public ChunkGenerator getDefaultWorldGenerator(final String world, final String id) {
WorldEvents.lastWorld = world; WorldEvents.lastWorld = world;

View File

@ -24,8 +24,6 @@ public interface IPlotMain {
public File getDirectory(); public File getDirectory();
public File getFile();
public void disable(); public void disable();
public String getVersion(); public String getVersion();
@ -81,6 +79,4 @@ public interface IPlotMain {
public PlayerManager initPlayerManager(); public PlayerManager initPlayerManager();
public boolean checkVersion(int major, int minor, int minor2); public boolean checkVersion(int major, int minor, int minor2);
public void loadPlugin(String plugin);
} }

View File

@ -10,7 +10,6 @@ import java.io.InputStreamReader;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DatabaseMetaData; import java.sql.DatabaseMetaData;
import java.sql.SQLException; import java.sql.SQLException;
@ -32,8 +31,6 @@ import java.util.regex.Pattern;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import org.bukkit.Bukkit;
import com.intellectualcrafters.configuration.file.YamlConfiguration; import com.intellectualcrafters.configuration.file.YamlConfiguration;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.config.Configuration; import com.intellectualcrafters.plot.config.Configuration;
@ -919,15 +916,14 @@ public class PS {
} }
} }
public boolean update(URL url) { public boolean update(PlotPlayer sender, URL url) {
if (url == null) { if (url == null) {
return false; return false;
} }
try { try {
File jar = PS.get().IMP.getFile();
File newJar = new File("plugins/update/PlotSquared.jar"); File newJar = new File("plugins/update/PlotSquared.jar");
PS.log("&6Downloading from provided URL: &7" + url); MainUtil.sendMessage(sender, "$1Downloading from provided URL: &7" + url);
PS.log("&7 - User-Agent: " + "Mozilla/4.0"); MainUtil.sendMessage(sender, "$2 - User-Agent: " + "Mozilla/4.0");
URLConnection con = url.openConnection(); URLConnection con = url.openConnection();
con.addRequestProperty("User-Agent", "Mozilla/4.0"); con.addRequestProperty("User-Agent", "Mozilla/4.0");
InputStream stream = con.getInputStream(); InputStream stream = con.getInputStream();
@ -935,31 +931,16 @@ public class PS {
if (!parent.exists()) { if (!parent.exists()) {
parent.mkdirs(); parent.mkdirs();
} }
PS.log("&7 - Output: " + newJar); MainUtil.sendMessage(sender, "$2 - Output: " + newJar);
newJar.delete(); newJar.delete();
Files.copy(stream, newJar.toPath()); Files.copy(stream, newJar.toPath());
stream.close(); stream.close();
PS.log("&6Disabling PlotSquared"); MainUtil.sendMessage(sender, "$1The update will take effect when the server is restarted next");
PS.get().IMP.disable();
System.out.println("Deleting file: " + jar);
jar.delete();
System.out.println("Copying: " + jar + " >> " + newJar);
try {
Files.move(newJar.toPath(), jar.toPath(), StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
System.out.println("Failed to reload PlotSquared");
System.out.println(" - Restart the server manually");
System.out.println("============ Stacktrace ============");
e.printStackTrace();
System.out.println("====================================");
return false;
}
Bukkit.reload();
return true; return true;
} }
catch (Exception e) { catch (Exception e) {
System.out.println("Failed to update PlotSquared"); MainUtil.sendMessage(sender, "Failed to update PlotSquared");
System.out.println(" - Please update manually"); MainUtil.sendMessage(sender, " - Please update manually");
System.out.println("============ Stacktrace ============"); System.out.println("============ Stacktrace ============");
e.printStackTrace(); e.printStackTrace();
System.out.println("===================================="); System.out.println("====================================");
@ -1114,7 +1095,6 @@ public class PS {
for (final String flag : intFlags) { for (final String flag : intFlags) {
FlagManager.addFlag(new AbstractFlag(flag, new FlagValue.UnsignedIntegerValue())); FlagManager.addFlag(new AbstractFlag(flag, new FlagValue.UnsignedIntegerValue()));
} }
FlagManager.addFlag(new AbstractFlag("modified-blocks", new FlagValue.IntegerValue()), true);
FlagManager.addFlag(new AbstractFlag("analysis", new FlagValue.IntegerListValue()), true); FlagManager.addFlag(new AbstractFlag("analysis", new FlagValue.IntegerListValue()), true);
FlagManager.addFlag(new AbstractFlag("disable-physics", new FlagValue.BooleanValue())); FlagManager.addFlag(new AbstractFlag("disable-physics", new FlagValue.BooleanValue()));
FlagManager.addFlag(new AbstractFlag("fly", new FlagValue.BooleanValue())); FlagManager.addFlag(new AbstractFlag("fly", new FlagValue.BooleanValue()));
@ -1277,6 +1257,7 @@ public class PS {
options.put("chunk-processor.enabled", Settings.CHUNK_PROCESSOR); options.put("chunk-processor.enabled", Settings.CHUNK_PROCESSOR);
options.put("chunk-processor.max-blockstates", Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES); options.put("chunk-processor.max-blockstates", Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES);
options.put("chunk-processor.max-entities", Settings.CHUNK_PROCESSOR_MAX_ENTITIES); options.put("chunk-processor.max-entities", Settings.CHUNK_PROCESSOR_MAX_ENTITIES);
options.put("chunk-processor.disable-physics", Settings.CHUNK_PROCESSOR_DISABLE_PHYSICS);
// Comments // Comments
options.put("comments.notifications.enabled", Settings.COMMENT_NOTIFICATIONS); options.put("comments.notifications.enabled", Settings.COMMENT_NOTIFICATIONS);
@ -1379,6 +1360,7 @@ public class PS {
Settings.CHUNK_PROCESSOR = config.getBoolean("chunk-processor.enabled"); Settings.CHUNK_PROCESSOR = config.getBoolean("chunk-processor.enabled");
Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES = config.getInt("chunk-processor.max-blockstates"); Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES = config.getInt("chunk-processor.max-blockstates");
Settings.CHUNK_PROCESSOR_MAX_ENTITIES = config.getInt("chunk-processor.max-entities"); Settings.CHUNK_PROCESSOR_MAX_ENTITIES = config.getInt("chunk-processor.max-entities");
Settings.CHUNK_PROCESSOR_DISABLE_PHYSICS = config.getBoolean("chunk-processor.disable-physics");
// Comments // Comments
Settings.COMMENT_NOTIFICATIONS = config.getBoolean("comments.notifications.enabled"); Settings.COMMENT_NOTIFICATIONS = config.getBoolean("comments.notifications.enabled");

View File

@ -51,10 +51,6 @@ public class Update extends SubCommand {
@Override @Override
public boolean execute(final PlotPlayer plr, final String... args) { public boolean execute(final PlotPlayer plr, final String... args) {
if (plr != null) {
MainUtil.sendMessage(plr, C.NOT_CONSOLE);
return false;
}
URL url; URL url;
if (args.length == 0) { if (args.length == 0) {
url = PS.get().update; url = PS.get().update;
@ -77,7 +73,9 @@ public class Update extends SubCommand {
MainUtil.sendMessage(plr, "&cTo manually specify an update URL: /plot update <url>"); MainUtil.sendMessage(plr, "&cTo manually specify an update URL: /plot update <url>");
return false; return false;
} }
PS.get().update(url); if (PS.get().update(plr, url) && url == PS.get().update) {
PS.get().update = null;
}
return true; return true;
} }
} }

View File

@ -65,6 +65,7 @@ public class Settings {
public static boolean CHUNK_PROCESSOR = false; public static boolean CHUNK_PROCESSOR = false;
public static int CHUNK_PROCESSOR_MAX_BLOCKSTATES = 4096; public static int CHUNK_PROCESSOR_MAX_BLOCKSTATES = 4096;
public static int CHUNK_PROCESSOR_MAX_ENTITIES = 512; public static int CHUNK_PROCESSOR_MAX_ENTITIES = 512;
public static boolean CHUNK_PROCESSOR_DISABLE_PHYSICS = false;
/** /**
* TNT listener * TNT listener
*/ */

View File

@ -62,19 +62,11 @@ public class ChunkListener implements Listener {
} }
} }
@EventHandler(priority=EventPriority.LOWEST) @EventHandler(priority=EventPriority.HIGHEST, ignoreCancelled=true)
public void onBlockPhysics(BlockPhysicsEvent event) { public void onBlockPhysics(BlockPhysicsEvent event) {
long now = System.currentTimeMillis(); if (Settings.CHUNK_PROCESSOR_DISABLE_PHYSICS) {
if (now - last < 20) {
if (count > Settings.CHUNK_PROCESSOR_MAX_ENTITIES) {
event.setCancelled(true); event.setCancelled(true);
} }
count++;
}
else {
count = 0;
}
last = now;
} }
@EventHandler(priority=EventPriority.LOWEST) @EventHandler(priority=EventPriority.LOWEST)

View File

@ -292,7 +292,7 @@ public class PlayerEvents extends com.intellectualcrafters.plot.listeners.PlotLi
if (cmd != null) { if (cmd != null) {
return; return;
} }
if (split[0].equals("plotme") || split[0].equals("ap")) { if (split[0].equals("plotme") || split[0].equals("ap") || split[0].equals("plotz")) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
if (Settings.USE_PLOTME_ALIAS) { if (Settings.USE_PLOTME_ALIAS) {
player.performCommand("plots " + StringUtils.join(Arrays.copyOfRange(split, 1, split.length), " ")); player.performCommand("plots " + StringUtils.join(Arrays.copyOfRange(split, 1, split.length), " "));
@ -317,7 +317,7 @@ public class PlayerEvents extends com.intellectualcrafters.plot.listeners.PlotLi
} }
} }
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onJoin(final PlayerJoinEvent event) { public void onJoin(final PlayerJoinEvent event) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
BukkitUtil.removePlayer(player.getName()); BukkitUtil.removePlayer(player.getName());
@ -336,8 +336,13 @@ public class PlayerEvents extends com.intellectualcrafters.plot.listeners.PlotLi
} }
} }
if (PS.get().update != null && pp.hasPermission("plots.admin")) { if (PS.get().update != null && pp.hasPermission("plots.admin")) {
TaskManager.runTaskLater(new Runnable() {
@Override
public void run() {
MainUtil.sendMessage(pp, "&6An update for PlotSquared is available: &7/plot update"); MainUtil.sendMessage(pp, "&6An update for PlotSquared is available: &7/plot update");
} }
}, 20);
}
final Location loc = BukkitUtil.getLocation(player.getLocation()); final Location loc = BukkitUtil.getLocation(player.getLocation());
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null) { if (plot == null) {