1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 03:35:51 +00:00

Maybe made the Block Storage stuff safer, idk

This commit is contained in:
TheBusyBiscuit 2017-03-31 14:47:43 +02:00
parent c5f69d81ac
commit af6ec415b0
3 changed files with 343 additions and 320 deletions

View File

@ -1,23 +1,9 @@
package me.mrCookieSlime.Slimefun; package me.mrCookieSlime.Slimefun;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -34,7 +20,6 @@ import org.bukkit.scheduler.BukkitRunnable;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.PluginUtils; import me.mrCookieSlime.CSCoreLibPlugin.PluginUtils;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
import me.mrCookieSlime.CSCoreLibPlugin.general.Clock;
import me.mrCookieSlime.CSCoreLibPlugin.general.Reflection.ReflectionUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Reflection.ReflectionUtils;
import me.mrCookieSlime.Slimefun.AncientAltar.Pedestals; import me.mrCookieSlime.Slimefun.AncientAltar.Pedestals;
import me.mrCookieSlime.Slimefun.CSCoreLibSetup.CSCoreLibLoader; import me.mrCookieSlime.Slimefun.CSCoreLibSetup.CSCoreLibLoader;
@ -64,6 +49,7 @@ import me.mrCookieSlime.Slimefun.URID.URID;
import me.mrCookieSlime.Slimefun.WorldEdit.WESlimefunManager; import me.mrCookieSlime.Slimefun.WorldEdit.WESlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.api.SlimefunBackup;
import me.mrCookieSlime.Slimefun.api.TickerTask; import me.mrCookieSlime.Slimefun.api.TickerTask;
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
import me.mrCookieSlime.Slimefun.api.energy.EnergyNet; import me.mrCookieSlime.Slimefun.api.energy.EnergyNet;
@ -375,7 +361,7 @@ public class SlimefunStartup extends JavaPlugin {
connector.pullFile(); connector.pullFile();
} }
} }
}, 60L, 20 * 60 * 20L); }, 80L, 60 * 60 * 20L);
// Hooray! // Hooray!
System.out.println("[Slimefun] Finished!"); System.out.println("[Slimefun] Finished!");
@ -408,112 +394,23 @@ public class SlimefunStartup extends JavaPlugin {
@Override @Override
public void onDisable() { public void onDisable() {
Bukkit.getScheduler().cancelTasks(this); Bukkit.getScheduler().cancelTasks(this);
// Finishes all started movements/removals of block data
ticker.HALTED = true;
ticker.run();
try { try {
for (Map.Entry<Block, Block> entry: ticker.move.entrySet()) {
BlockStorage._integrated_moveBlockInfo(entry.getKey(), entry.getValue());
}
ticker.move.clear();
for (World world: Bukkit.getWorlds()) { for (World world: Bukkit.getWorlds()) {
BlockStorage storage = BlockStorage.getStorage(world); BlockStorage storage = BlockStorage.getStorage(world);
if (storage != null) storage.save(true); if (storage != null) {
else System.err.println("[Slimefun] Could not save Slimefun Blocks for World \"" + world.getName() + "\""); storage.save(true);
} }
else {
File folder = new File("data-storage/Slimefun/block-backups"); System.err.println("[Slimefun] Could not save Slimefun Blocks for World \"" + world.getName() + "\"");
List<File> backups = Arrays.asList(folder.listFiles());
if (backups.size() > 20) {
Collections.sort(backups, new Comparator<File>() {
@Override
public int compare(File f1, File f2) {
try {
return (int) (new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(f1.getName().replace(".zip", "")).getTime() - new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(f2.getName().replace(".zip", "")).getTime());
} catch (ParseException e) {
return 0;
}
}
});
for (int i = backups.size() - 20; i > 0; i--) {
backups.get(i).delete();
} }
} }
File file = new File("data-storage/Slimefun/block-backups/" + Clock.format(new Date()) + ".zip"); SlimefunBackup.start();
byte[] buffer = new byte[1024];
if (file.exists()) file.delete();
try {
file.createNewFile();
ZipOutputStream output = new ZipOutputStream(new FileOutputStream(file));
for (File f1: new File("data-storage/Slimefun/stored-blocks/").listFiles()) {
for (File f: f1.listFiles()) {
ZipEntry entry = new ZipEntry("stored-blocks/" + f1.getName() + "/" + f.getName());
output.putNextEntry(entry);
FileInputStream input = new FileInputStream(f);
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
input.close();
output.closeEntry();
}
}
for (File f: new File("data-storage/Slimefun/universal-inventories/").listFiles()) {
ZipEntry entry = new ZipEntry("universal-inventories/" + f.getName());
output.putNextEntry(entry);
FileInputStream input = new FileInputStream(f);
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
input.close();
output.closeEntry();
}
for (File f: new File("data-storage/Slimefun/stored-inventories/").listFiles()) {
ZipEntry entry = new ZipEntry("stored-inventories/" + f.getName());
output.putNextEntry(entry);
FileInputStream input = new FileInputStream(f);
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
input.close();
output.closeEntry();
}
if (new File("data-storage/Slimefun/stored-chunks/chunks.sfc").exists()) {
ZipEntry entry = new ZipEntry("stored-chunks/chunks.sfc");
output.putNextEntry(entry);
FileInputStream input = new FileInputStream(new File("data-storage/Slimefun/stored-chunks/chunks.sfc"));
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
input.close();
output.closeEntry();
}
output.close();
System.out.println("[Slimfun] Backed up Blocks to " + file.getName());
} catch(IOException e) {
e.printStackTrace();
}
} catch(Exception x) { } catch(Exception x) {
} }

View File

@ -0,0 +1,119 @@
package me.mrCookieSlime.Slimefun.api;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import me.mrCookieSlime.CSCoreLibPlugin.general.Clock;
public class SlimefunBackup {
public static void start() {
File folder = new File("data-storage/Slimefun/block-backups");
List<File> backups = Arrays.asList(folder.listFiles());
if (backups.size() > 20) {
Collections.sort(backups, new Comparator<File>() {
@Override
public int compare(File f1, File f2) {
try {
return (int) (new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(f1.getName().replace(".zip", "")).getTime() - new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(f2.getName().replace(".zip", "")).getTime());
} catch (ParseException e) {
return 0;
}
}
});
for (int i = backups.size() - 20; i > 0; i--) {
backups.get(i).delete();
}
}
File file = new File("data-storage/Slimefun/block-backups/" + Clock.format(new Date()) + ".zip");
byte[] buffer = new byte[1024];
if (file.exists()) {
file.delete();
}
try {
file.createNewFile();
ZipOutputStream output = new ZipOutputStream(new FileOutputStream(file));
for (File f1: new File("data-storage/Slimefun/stored-blocks/").listFiles()) {
for (File f: f1.listFiles()) {
ZipEntry entry = new ZipEntry("stored-blocks/" + f1.getName() + "/" + f.getName());
output.putNextEntry(entry);
FileInputStream input = new FileInputStream(f);
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
input.close();
output.closeEntry();
}
}
for (File f: new File("data-storage/Slimefun/universal-inventories/").listFiles()) {
ZipEntry entry = new ZipEntry("universal-inventories/" + f.getName());
output.putNextEntry(entry);
FileInputStream input = new FileInputStream(f);
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
input.close();
output.closeEntry();
}
for (File f: new File("data-storage/Slimefun/stored-inventories/").listFiles()) {
ZipEntry entry = new ZipEntry("stored-inventories/" + f.getName());
output.putNextEntry(entry);
FileInputStream input = new FileInputStream(f);
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
input.close();
output.closeEntry();
}
if (new File("data-storage/Slimefun/stored-chunks/chunks.sfc").exists()) {
ZipEntry entry = new ZipEntry("stored-chunks/chunks.sfc");
output.putNextEntry(entry);
FileInputStream input = new FileInputStream(new File("data-storage/Slimefun/stored-chunks/chunks.sfc"));
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
input.close();
output.closeEntry();
}
output.close();
System.out.println("[Slimfun] Backed up Blocks to " + file.getName());
} catch(IOException e) {
e.printStackTrace();
}
}
}

View File

@ -23,6 +23,8 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker;
public class TickerTask implements Runnable { public class TickerTask implements Runnable {
public boolean HALTED = false;
public Map<Block, Block> move = new HashMap<Block, Block>(); public Map<Block, Block> move = new HashMap<Block, Block>();
public Map<Location, Boolean> delete = new HashMap<Location, Boolean>(); public Map<Location, Boolean> delete = new HashMap<Location, Boolean>();
@ -42,6 +44,7 @@ public class TickerTask implements Runnable {
@Override @Override
public void run() { public void run() {
long timestamp = System.currentTimeMillis(); long timestamp = System.currentTimeMillis();
skipped = 0; skipped = 0;
@ -65,57 +68,59 @@ public class TickerTask implements Runnable {
delete.remove(entry.getKey()); delete.remove(entry.getKey());
} }
for (final String c: BlockStorage.getTickingChunks()) { if (!HALTED) {
long timestamp2 = System.currentTimeMillis(); for (final String c: BlockStorage.getTickingChunks()) {
chunks++; long timestamp2 = System.currentTimeMillis();
chunks++;
blocks:
for (final Block b: BlockStorage.getTickingBlocks(c)) { blocks:
if (b.getChunk().isLoaded()) { for (final Block b: BlockStorage.getTickingBlocks(c)) {
final Location l = b.getLocation(); if (b.getChunk().isLoaded()) {
final SlimefunItem item = BlockStorage.check(l); final Location l = b.getLocation();
if (item != null) { final SlimefunItem item = BlockStorage.check(l);
machines++; if (item != null) {
try { machines++;
item.getTicker().update(); try {
if (item.getTicker().isSynchronized()) { item.getTicker().update();
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() { if (item.getTicker().isSynchronized()) {
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {
@Override
public void run() { @Override
try { public void run() {
long timestamp3 = System.currentTimeMillis(); try {
item.getTicker().tick(b, item, BlockStorage.getBlockInfo(l)); long timestamp3 = System.currentTimeMillis();
item.getTicker().tick(b, item, BlockStorage.getBlockInfo(l));
map_machinetime.put(item.getName(), (map_machinetime.containsKey(item.getName()) ? map_machinetime.get(item.getName()): 0) + (System.currentTimeMillis() - timestamp3));
map_chunk.put(c, (map_chunk.containsKey(c) ? map_chunk.get(c): 0) + 1); map_machinetime.put(item.getName(), (map_machinetime.containsKey(item.getName()) ? map_machinetime.get(item.getName()): 0) + (System.currentTimeMillis() - timestamp3));
map_machine.put(item.getName(), (map_machine.containsKey(item.getName()) ? map_machine.get(item.getName()): 0) + 1); map_chunk.put(c, (map_chunk.containsKey(c) ? map_chunk.get(c): 0) + 1);
block_timings.put(l, System.currentTimeMillis() - timestamp3); map_machine.put(item.getName(), (map_machine.containsKey(item.getName()) ? map_machine.get(item.getName()): 0) + 1);
} catch(Exception x) { block_timings.put(l, System.currentTimeMillis() - timestamp3);
int errors = 0; } catch(Exception x) {
if (bugged.containsKey(l)) errors = bugged.get(l); int errors = 0;
errors++; if (bugged.containsKey(l)) errors = bugged.get(l);
errors++;
if (errors == 1) {
File file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + ".err"); if (errors == 1) {
if (file.exists()) { File file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + ".err");
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(2).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(3).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(2).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(4).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(3).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(5).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(4).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(6).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(5).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(7).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(6).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(8).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(7).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(9).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(8).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(10).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(9).err");
if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(10).err");
}
} }
} }
} }
@ -124,113 +129,113 @@ public class TickerTask implements Runnable {
} }
} }
} }
} try {
try { PrintStream stream = new PrintStream(file);
PrintStream stream = new PrintStream(file); stream.println();
stream.println(); stream.println("Server Software: " + Bukkit.getName());
stream.println("Server Software: " + Bukkit.getName()); stream.println(" Build: " + Bukkit.getVersion());
stream.println(" Build: " + Bukkit.getVersion()); stream.println(" Minecraft: " + Bukkit.getBukkitVersion());
stream.println(" Minecraft: " + Bukkit.getBukkitVersion()); stream.println();
stream.println(); stream.println("Installed Plugins (" + Bukkit.getPluginManager().getPlugins().length + ")");
stream.println("Installed Plugins (" + Bukkit.getPluginManager().getPlugins().length + ")"); for (Plugin p: Bukkit.getPluginManager().getPlugins()) {
for (Plugin p: Bukkit.getPluginManager().getPlugins()) { if (Bukkit.getPluginManager().isPluginEnabled(p)) {
if (Bukkit.getPluginManager().isPluginEnabled(p)) { stream.println(" + " + p.getName() + " " + p.getDescription().getVersion());
stream.println(" + " + p.getName() + " " + p.getDescription().getVersion()); }
} else {
else { stream.println(" - " + p.getName() + " " + p.getDescription().getVersion());
stream.println(" - " + p.getName() + " " + p.getDescription().getVersion()); }
} }
stream.println();
stream.println("Ticked Block:");
stream.println(" World: " + l.getWorld().getName());
stream.println(" X: " + l.getBlockX());
stream.println(" Y: " + l.getBlockY());
stream.println(" Z: " + l.getBlockZ());
stream.println();
stream.println("Slimefun Data:");
stream.println(" ID: " + item.getName());
stream.println(" Inventory: " + BlockStorage.getStorage(l.getWorld()).hasInventory(l));
stream.println(" Data: " + BlockStorage.getBlockInfoAsJson(l));
stream.println();
stream.println("Stacktrace:");
stream.println();
x.printStackTrace(stream);
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} }
stream.println();
stream.println("Ticked Block:");
stream.println(" World: " + l.getWorld().getName());
stream.println(" X: " + l.getBlockX());
stream.println(" Y: " + l.getBlockY());
stream.println(" Z: " + l.getBlockZ());
stream.println();
stream.println("Slimefun Data:");
stream.println(" ID: " + item.getName());
stream.println(" Inventory: " + BlockStorage.getStorage(l.getWorld()).hasInventory(l));
stream.println(" Data: " + BlockStorage.getBlockInfoAsJson(l));
stream.println();
stream.println("Stacktrace:");
stream.println();
x.printStackTrace(stream);
stream.close(); System.err.println("[Slimefun] Exception caught while ticking a Block:" + x.getClass().getName());
} catch (FileNotFoundException e) { System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ());
e.printStackTrace(); System.err.println("[Slimefun] Saved as: ");
System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + file.getName());
System.err.println("[Slimefun] Please consider sending this File to the developer(s) of Slimefun, sending this Error won't get you any help though.");
System.err.println("[Slimefun] ");
bugged_blocks.put(l, errors);
} }
else if (errors == 4) {
System.err.println("[Slimefun] Exception caught while ticking a Block:" + x.getClass().getName()); System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ() + "(" + item.getName() + ")");
System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ()); System.err.println("[Slimefun] has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated.");
System.err.println("[Slimefun] Saved as: "); System.err.println("[Slimefun] Check your /plugins/Slimefun/error-reports/ folder for details.");
System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + file.getName()); System.err.println("[Slimefun] ");
System.err.println("[Slimefun] Please consider sending this File to the developer(s) of Slimefun, sending this Error won't get you any help though.");
System.err.println("[Slimefun] "); BlockStorage._integrated_removeBlockInfo(l, true);
bugged_blocks.put(l, errors); Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {
}
else if (errors == 4) {
System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ() + "(" + item.getName() + ")");
System.err.println("[Slimefun] has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated.");
System.err.println("[Slimefun] Check your /plugins/Slimefun/error-reports/ folder for details.");
System.err.println("[Slimefun] ");
BlockStorage._integrated_removeBlockInfo(l, true);
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {
@Override @Override
public void run() { public void run() {
l.getBlock().setType(Material.AIR); l.getBlock().setType(Material.AIR);
} }
}); });
} }
else { else {
bugged_blocks.put(l, errors); bugged_blocks.put(l, errors);
}
} }
} }
} });
}); }
} else {
else { long timestamp3 = System.currentTimeMillis();
long timestamp3 = System.currentTimeMillis(); item.getTicker().tick(b, item, BlockStorage.getBlockInfo(l));
item.getTicker().tick(b, item, BlockStorage.getBlockInfo(l));
map_machinetime.put(item.getName(), (map_machinetime.containsKey(item.getName()) ? map_machinetime.get(item.getName()): 0) + (System.currentTimeMillis() - timestamp3));
map_chunk.put(c, (map_chunk.containsKey(c) ? map_chunk.get(c): 0) + 1);
map_machine.put(item.getName(), (map_machine.containsKey(item.getName()) ? map_machine.get(item.getName()): 0) + 1);
block_timings.put(l, System.currentTimeMillis() - timestamp3);
}
tickers.add(item.getTicker());
} catch(Exception x) {
map_machinetime.put(item.getName(), (map_machinetime.containsKey(item.getName()) ? map_machinetime.get(item.getName()): 0) + (System.currentTimeMillis() - timestamp3)); int errors = 0;
map_chunk.put(c, (map_chunk.containsKey(c) ? map_chunk.get(c): 0) + 1); if (bugged.containsKey(l)) errors = bugged.get(l);
map_machine.put(item.getName(), (map_machine.containsKey(item.getName()) ? map_machine.get(item.getName()): 0) + 1); errors++;
block_timings.put(l, System.currentTimeMillis() - timestamp3);
} if (errors == 1) {
tickers.add(item.getTicker()); File file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + ".err");
} catch(Exception x) {
int errors = 0;
if (bugged.containsKey(l)) errors = bugged.get(l);
errors++;
if (errors == 1) {
File file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + ".err");
if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(2).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(3).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(2).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(4).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(3).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(5).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(4).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(6).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(5).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(7).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(6).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(8).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(7).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(9).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(8).err");
if (file.exists()) { if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(10).err"); file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(9).err");
if (file.exists()) {
file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(10).err");
}
} }
} }
} }
@ -239,86 +244,86 @@ public class TickerTask implements Runnable {
} }
} }
} }
} try {
try { PrintStream stream = new PrintStream(file);
PrintStream stream = new PrintStream(file); stream.println();
stream.println(); stream.println("Server Software: " + Bukkit.getName());
stream.println("Server Software: " + Bukkit.getName()); stream.println(" Build: " + Bukkit.getVersion());
stream.println(" Build: " + Bukkit.getVersion()); stream.println(" Minecraft: " + Bukkit.getBukkitVersion());
stream.println(" Minecraft: " + Bukkit.getBukkitVersion()); stream.println();
stream.println(); stream.println("Installed Plugins (" + Bukkit.getPluginManager().getPlugins().length + ")");
stream.println("Installed Plugins (" + Bukkit.getPluginManager().getPlugins().length + ")"); for (Plugin p: Bukkit.getPluginManager().getPlugins()) {
for (Plugin p: Bukkit.getPluginManager().getPlugins()) { if (Bukkit.getPluginManager().isPluginEnabled(p)) {
if (Bukkit.getPluginManager().isPluginEnabled(p)) { stream.println(" + " + p.getName() + " " + p.getDescription().getVersion());
stream.println(" + " + p.getName() + " " + p.getDescription().getVersion()); }
} else {
else { stream.println(" - " + p.getName() + " " + p.getDescription().getVersion());
stream.println(" - " + p.getName() + " " + p.getDescription().getVersion()); }
} }
stream.println();
stream.println("Ticked Block:");
stream.println(" World: " + l.getWorld().getName());
stream.println(" X: " + l.getBlockX());
stream.println(" Y: " + l.getBlockY());
stream.println(" Z: " + l.getBlockZ());
stream.println();
stream.println("Slimefun Data:");
stream.println(" ID: " + item.getName());
stream.println(" Inventory: " + BlockStorage.getStorage(l.getWorld()).hasInventory(l));
stream.println(" Data: " + BlockStorage.getBlockInfoAsJson(l));
stream.println();
stream.println("Stacktrace:");
stream.println();
x.printStackTrace(stream);
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} }
stream.println();
stream.println("Ticked Block:");
stream.println(" World: " + l.getWorld().getName());
stream.println(" X: " + l.getBlockX());
stream.println(" Y: " + l.getBlockY());
stream.println(" Z: " + l.getBlockZ());
stream.println();
stream.println("Slimefun Data:");
stream.println(" ID: " + item.getName());
stream.println(" Inventory: " + BlockStorage.getStorage(l.getWorld()).hasInventory(l));
stream.println(" Data: " + BlockStorage.getBlockInfoAsJson(l));
stream.println();
stream.println("Stacktrace:");
stream.println();
x.printStackTrace(stream);
stream.close(); System.err.println("[Slimefun] Exception caught while ticking a Block:" + x.getClass().getName());
} catch (FileNotFoundException e) { System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ());
e.printStackTrace(); System.err.println("[Slimefun] Saved as: ");
System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + file.getName());
System.err.println("[Slimefun] Please consider sending this File to the developer(s) of Slimefun, sending this Error won't get you any help though.");
System.err.println("[Slimefun] ");
bugged_blocks.put(l, errors);
} }
else if (errors == 4) {
System.err.println("[Slimefun] Exception caught while ticking a Block:" + x.getClass().getName()); System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ() + "(" + item.getName() + ")");
System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ()); System.err.println("[Slimefun] has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated.");
System.err.println("[Slimefun] Saved as: "); System.err.println("[Slimefun] Check your /plugins/Slimefun/error-reports/ folder for details.");
System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + file.getName()); System.err.println("[Slimefun] ");
System.err.println("[Slimefun] Please consider sending this File to the developer(s) of Slimefun, sending this Error won't get you any help though.");
System.err.println("[Slimefun] "); BlockStorage._integrated_removeBlockInfo(l, true);
bugged_blocks.put(l, errors); Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {
}
else if (errors == 4) {
System.err.println("[Slimefun] X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ() + "(" + item.getName() + ")");
System.err.println("[Slimefun] has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated.");
System.err.println("[Slimefun] Check your /plugins/Slimefun/error-reports/ folder for details.");
System.err.println("[Slimefun] ");
BlockStorage._integrated_removeBlockInfo(l, true);
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {
@Override @Override
public void run() { public void run() {
l.getBlock().setType(Material.AIR); l.getBlock().setType(Material.AIR);
} }
}); });
} }
else { else {
bugged_blocks.put(l, errors); bugged_blocks.put(l, errors);
}
} }
} }
else skipped++;
}
else {
skipped += BlockStorage.getTickingBlocks(c).size();
skipped_chunks.add(c);
chunks--;
break blocks;
} }
else skipped++;
}
else {
skipped += BlockStorage.getTickingBlocks(c).size();
skipped_chunks.add(c);
chunks--;
break blocks;
} }
map_chunktime.put(c, System.currentTimeMillis() - timestamp2);
} }
map_chunktime.put(c, System.currentTimeMillis() - timestamp2);
} }
for (Map.Entry<Block, Block> entry: move.entrySet()) { for (Map.Entry<Block, Block> entry: move.entrySet()) {
@ -336,6 +341,8 @@ public class TickerTask implements Runnable {
public void info(CommandSender sender) { public void info(CommandSender sender) {
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&2== &aSlimefun Diagnostic Tool &2==")); sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&2== &aSlimefun Diagnostic Tool &2=="));
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Halted: &e&l" + String.valueOf(HALTED).toUpperCase()));
sender.sendMessage("");
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Impact: &e" + time + "ms / 50-750ms")); sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Impact: &e" + time + "ms / 50-750ms"));
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Chunks: &e" + chunks)); sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Chunks: &e" + chunks));
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Machines: &e" + machines)); sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Machines: &e" + machines));