mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-20 11:45:51 +00:00
Merge remote-tracking branch 'refs/remotes/TheBusyBiscuit/master'
This commit is contained in:
commit
5c9943de17
41
.github/CONTRIBUTING.md
vendored
Normal file
41
.github/CONTRIBUTING.md
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Slimefun Community Guidelines
|
||||||
|
|
||||||
|
Slimefun is a community project, everyone is welcome to open Issues, make Pull Requests or make Pull Requests for an opened Issue.
|
||||||
|
Without your help, this project is going to die.
|
||||||
|
|
||||||
|
## General Guidelines
|
||||||
|
|
||||||
|
Rules for all types of posts:
|
||||||
|
|
||||||
|
1. Follow our Templates for Issues and Pull Request, they are designed to tell you what exact Information we need and how you should present it to us.
|
||||||
|
2. Be nice and give constructive critism. Insulting, Harassment, Racism, Sexism or any form of bullying or discrimination is not tolerated.
|
||||||
|
3. Try to engage in conversations by pointing out scenarios to replicate Issues, providing fix approaches or other kind of help.
|
||||||
|
4. Advertisement is inappropriate and will be removed, especially advertisement for Minecraft Servers is completely unaccepted.
|
||||||
|
|
||||||
|
## GitHub Issues
|
||||||
|
|
||||||
|
Rules for posting an Issue on GitHub:
|
||||||
|
|
||||||
|
1. This Issue Section is ONLY for Slimefun-related Issues, Issues about other Plugins or Slimefun Addons should not be posted here.
|
||||||
|
2. Check other Issues before posting to make sure you are not posting a duplicate.
|
||||||
|
3. Do not put any Tags inside your title like [IMPORTANT], [URGENT] or [SUGGESTION]. Try to be professional by making your title as short as possible, we will assign it the required labels if necessary.
|
||||||
|
4. Do not post your Issue more than once, this is considered spam and does not benefit our community in any way. Do not repost your Issue if it was closed either.
|
||||||
|
5. Give us all available information right away, it may be a bit of time-wasting for us to keep asking for more Info. And this includes any Information to reproduce your Issue step-by-step.
|
||||||
|
6. Check whether there are newer versions available than the ones you are using, it might be that your Issue has been fixed already.
|
||||||
|
7. All text logs must be posted via a link to http://pastebin.com or similiar websites.
|
||||||
|
8. Please read the [FAQ Section](#frequently-asked-questions) before posting.
|
||||||
|
|
||||||
|
Your Issue will be CLOSED WITHOUT WARNING if we think you violated these Rules.
|
||||||
|
|
||||||
|
## Pull Requests
|
||||||
|
|
||||||
|
Guidelines for making a Pull Request on GitHub:
|
||||||
|
|
||||||
|
1. Try to be reasonable with your additions. No, a Bacon flavoured unicorn that flies on a rainbow while dancing Gangnam Style is NOT a reasonable addition to this Project.
|
||||||
|
2. Try to make your values configurable in the config.yml / Items.yml or any additional file. This may not be necessary at every instance but it does give the end-users a way to customize their experience.
|
||||||
|
3. If your Pull Request is made in response to an Issue opened on GitHub, comment on that Issue and reference your Pull Request to show that you are proposing a fix for it.
|
||||||
|
|
||||||
|
## Frequently Asked Questions
|
||||||
|
|
||||||
|
### Slimefun does not work!?
|
||||||
|
> Install CS-CoreLib...
|
16
.github/ISSUE_TEMPLATE.md
vendored
Normal file
16
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
## Description
|
||||||
|
Describe your Issue AS DETAILED AS POSSIBLE.
|
||||||
|
|
||||||
|
## Server Log
|
||||||
|
Upload your FULL SERVER LOG (/logs/latest.log) to http://pastebin.com/ and paste your link in here.
|
||||||
|
Without this File, we may not be able to help you at all.
|
||||||
|
|
||||||
|
## Evidence / Proof
|
||||||
|
Attach as many Screenshots or Videos if possible.
|
||||||
|
Anything that helps us understand the Issue better, is gonna get your Issue fixed even faster.
|
||||||
|
|
||||||
|
## Environment
|
||||||
|
We need the EXACT VERSIONS of the Software you are using.
|
||||||
|
This includes your Minecraft Version, your CS-CoreLib version and your Slimefun Version.
|
||||||
|
If you cannot figure out what versions you are running, then please run /sf versions and
|
||||||
|
show us the output of that command.
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/bin/
|
||||||
|
.classpath
|
||||||
|
.project
|
||||||
|
/.settings/
|
@ -6,4 +6,5 @@ This Project was built using the following external Libraries:
|
|||||||
* CraftBukkit 1.10
|
* CraftBukkit 1.10
|
||||||
* WorldEdit v6.1.1
|
* WorldEdit v6.1.1
|
||||||
* CS-CoreLib v1.5.2
|
* CS-CoreLib v1.5.2
|
||||||
* EmeraldEnchants v2.0
|
* EmeraldEnchants v2.0
|
||||||
|
* CoreProtect v2.14.2
|
@ -1,21 +0,0 @@
|
|||||||
!!! BEFORE POSTING !!!
|
|
||||||
|
|
||||||
1. Do not adress Issues that don't regard Slimefun, even Issues about Slimefun Addons are not allowed to be posted here.
|
|
||||||
2. Make sure to check other Issues before posting yours, we do not want any duplicates!
|
|
||||||
3. Please don't put Tags like [IMPORTANT] or [BUG], [QUESTION] or anything similiar in your title.
|
|
||||||
4. Your Issue will be CLOSED WITHOUT WARNING if you do not match the above mentioned criteria.
|
|
||||||
|
|
||||||
## Description
|
|
||||||
Describe your Issue AS DETAILED AS POSSIBLE.
|
|
||||||
|
|
||||||
## Server Log
|
|
||||||
Please upload your FULL SERVER LOG (/logs/latest.log) to http://pastebin.com/ and paste your link in here.
|
|
||||||
Without this File, we may not be able to help you at all.
|
|
||||||
|
|
||||||
## Evidence / Proof
|
|
||||||
Attach as many Screenshots or Videos if possible.
|
|
||||||
Anything that helps us understand the Issue better, is gonna get your Issue fixed even faster.
|
|
||||||
|
|
||||||
## Environment
|
|
||||||
Please state what Version of Minecraft, CS-CoreLib and Slimefun you're using
|
|
||||||
"latest" is not enough, we need the EXACT VERSIONS.
|
|
12
README.md
12
README.md
@ -17,17 +17,7 @@ Check the license for more Info on redistributing and modifying Slimefun 4.
|
|||||||
|
|
||||||
### Contributors
|
### Contributors
|
||||||
|
|
||||||
Here is a list of all people who contributed to Slimefun 4 by submitting Code.
|
[Here is a list of all people who contributed to Slimefun 4 by submitting Code.](https://github.com/TheBusyBiscuit/Slimefun4/graphs/contributors)
|
||||||
I will keep this list updated myself, please don't edit it yourself.
|
|
||||||
|
|
||||||
* TheBusyBiscuit
|
|
||||||
* John000708
|
|
||||||
* st392
|
|
||||||
* DeathlyPanda
|
|
||||||
* BlackBeltPanda
|
|
||||||
* Poslovitch
|
|
||||||
* alekso56
|
|
||||||
* NathanAdhitya
|
|
||||||
|
|
||||||
## Wiki
|
## Wiki
|
||||||
|
|
||||||
|
@ -1,149 +1,152 @@
|
|||||||
package me.mrCookieSlime.CSCoreLibSetup;
|
package me.mrCookieSlime.Slimefun.CSCoreLibSetup;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
|
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
import org.json.simple.JSONValue;
|
import org.json.simple.JSONValue;
|
||||||
|
|
||||||
public class CSCoreLibLoader {
|
public class CSCoreLibLoader {
|
||||||
|
|
||||||
Plugin plugin;
|
Plugin plugin;
|
||||||
URL url;
|
URL url;
|
||||||
URL download;
|
URL download;
|
||||||
File file;
|
File file;
|
||||||
|
|
||||||
public CSCoreLibLoader(Plugin plugin) {
|
public CSCoreLibLoader(Plugin plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
try {
|
try {
|
||||||
this.url = new URL("https://api.curseforge.com/servermods/files?projectIds=88802");
|
this.url = new URL("https://api.curseforge.com/servermods/files?projectIds=88802");
|
||||||
} catch (MalformedURLException e) {
|
} catch (MalformedURLException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean load() {
|
public boolean load() {
|
||||||
if (plugin.getServer().getPluginManager().isPluginEnabled("CS-CoreLib")) return true;
|
if (plugin.getServer().getPluginManager().isPluginEnabled("CS-CoreLib")) return true;
|
||||||
else {
|
else {
|
||||||
System.err.println(" ");
|
System.err.println(" ");
|
||||||
System.err.println("#################### - FATAL ERROR - ####################");
|
System.err.println("#################### - INFO - ####################");
|
||||||
System.err.println(" ");
|
System.err.println(" ");
|
||||||
System.err.println(plugin.getName() + " could not be properly installed!");
|
System.err.println(plugin.getName() + " could not be loaded.");
|
||||||
System.err.println("It appears that you have not installed CS-CoreLib");
|
System.err.println("It appears that you have not installed CS-CoreLib");
|
||||||
System.err.println("And because of that, CS-CoreLib is now going to be");
|
System.err.println("Your Server will now try to download and install");
|
||||||
System.err.println("downloaded and installed.");
|
System.err.println("CS-CoreLib for you.");
|
||||||
System.err.println("But for the time being " + plugin.getName() + " will remain disabled");
|
System.err.println("You will be asked to restart your Server when it's finished.");
|
||||||
System.err.println("After the installation process has finished,");
|
System.err.println("If this somehow fails, please download and install CS-CoreLib manually:");
|
||||||
System.out.println("you will be asked to restart your Server.");
|
System.err.println("https://dev.bukkit.org/projects/cs-corelib");
|
||||||
System.err.println("- mrCookieSlime");
|
System.err.println(" ");
|
||||||
System.err.println(" ");
|
System.err.println("#################### - INFO - ####################");
|
||||||
System.err.println("#################### - FATAL ERROR - ####################");
|
System.err.println(" ");
|
||||||
System.err.println(" ");
|
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
|
|
||||||
|
@Override
|
||||||
@Override
|
public void run() {
|
||||||
public void run() {
|
if (connect()) install();
|
||||||
if (connect()) install();
|
}
|
||||||
}
|
}, 10L);
|
||||||
}, 10L);
|
return false;
|
||||||
return false;
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private boolean connect() {
|
||||||
private boolean connect() {
|
try {
|
||||||
try {
|
final URLConnection connection = this.url.openConnection();
|
||||||
final URLConnection connection = this.url.openConnection();
|
connection.setConnectTimeout(5000);
|
||||||
connection.setConnectTimeout(5000);
|
connection.addRequestProperty("User-Agent", "CS-CoreLib Loader (by mrCookieSlime)");
|
||||||
connection.addRequestProperty("User-Agent", "CS-CoreLib Loader (by mrCookieSlime)");
|
connection.setDoOutput(true);
|
||||||
connection.setDoOutput(true);
|
|
||||||
|
final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||||
final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
final JSONArray array = (JSONArray) JSONValue.parse(reader.readLine());
|
||||||
final JSONArray array = (JSONArray) JSONValue.parse(reader.readLine());
|
download = traceURL(((String) ((JSONObject) array.get(array.size() - 1)).get("downloadUrl")).replace("https:", "http:"));
|
||||||
download = traceURL(((String) ((JSONObject) array.get(array.size() - 1)).get("downloadUrl")).replace("https:", "http:"));
|
file = new File("plugins/" + (String) ((JSONObject) array.get(array.size() - 1)).get("name") + ".jar");
|
||||||
file = new File("plugins/" + (String) ((JSONObject) array.get(array.size() - 1)).get("name") + ".jar");
|
|
||||||
|
return true;
|
||||||
return true;
|
} catch (IOException e) {
|
||||||
} catch (IOException e) {
|
System.err.println(" ");
|
||||||
System.err.println(" ");
|
System.err.println("#################### - WARNING - ####################");
|
||||||
System.err.println("#################### - FATAL ERROR - ####################");
|
System.err.println(" ");
|
||||||
System.err.println(" ");
|
System.err.println("Could not connect to BukkitDev.");
|
||||||
System.err.println("Could not connect to BukkitDev, is it down?");
|
System.err.println("Please download & install CS-CoreLib manually:");
|
||||||
System.err.println(" ");
|
System.err.println("https://dev.bukkit.org/projects/cs-corelib");
|
||||||
System.err.println("#################### - FATAL ERROR - ####################");
|
System.err.println(" ");
|
||||||
System.err.println(" ");
|
System.err.println("#################### - WARNING - ####################");
|
||||||
return false;
|
System.err.println(" ");
|
||||||
}
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
private URL traceURL(String location) throws IOException {
|
|
||||||
HttpURLConnection connection = null;
|
private URL traceURL(String location) throws IOException {
|
||||||
|
HttpURLConnection connection = null;
|
||||||
while (true) {
|
|
||||||
URL url = new URL(location);
|
while (true) {
|
||||||
connection = (HttpURLConnection) url.openConnection();
|
URL url = new URL(location);
|
||||||
|
connection = (HttpURLConnection) url.openConnection();
|
||||||
connection.setInstanceFollowRedirects(false);
|
|
||||||
connection.setConnectTimeout(5000);
|
connection.setInstanceFollowRedirects(false);
|
||||||
connection.addRequestProperty("User-Agent", "Auto Updater (by mrCookieSlime)");
|
connection.setConnectTimeout(5000);
|
||||||
|
connection.addRequestProperty("User-Agent", "Auto Updater (by mrCookieSlime)");
|
||||||
switch (connection.getResponseCode()) {
|
|
||||||
case HttpURLConnection.HTTP_MOVED_PERM:
|
switch (connection.getResponseCode()) {
|
||||||
case HttpURLConnection.HTTP_MOVED_TEMP:
|
case HttpURLConnection.HTTP_MOVED_PERM:
|
||||||
String loc = connection.getHeaderField("Location");
|
case HttpURLConnection.HTTP_MOVED_TEMP:
|
||||||
location = new URL(new URL(location), loc).toExternalForm();
|
String loc = connection.getHeaderField("Location");
|
||||||
continue;
|
location = new URL(new URL(location), loc).toExternalForm();
|
||||||
}
|
continue;
|
||||||
break;
|
}
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
return connection.getURL();
|
|
||||||
}
|
return new URL(connection.getURL().toString().replaceAll(" ", "%20"));
|
||||||
|
}
|
||||||
private void install() {
|
|
||||||
BufferedInputStream input = null;
|
private void install() {
|
||||||
FileOutputStream output = null;
|
BufferedInputStream input = null;
|
||||||
try {
|
FileOutputStream output = null;
|
||||||
input = new BufferedInputStream(download.openStream());
|
try {
|
||||||
output = new FileOutputStream(file);
|
input = new BufferedInputStream(download.openStream());
|
||||||
|
output = new FileOutputStream(file);
|
||||||
final byte[] data = new byte[1024];
|
|
||||||
int read;
|
final byte[] data = new byte[1024];
|
||||||
while ((read = input.read(data, 0, 1024)) != -1) {
|
int read;
|
||||||
output.write(data, 0, read);
|
while ((read = input.read(data, 0, 1024)) != -1) {
|
||||||
}
|
output.write(data, 0, read);
|
||||||
} catch (Exception ex) {
|
}
|
||||||
System.err.println(" ");
|
} catch (Exception ex) {
|
||||||
System.err.println("#################### - FATAL ERROR - ####################");
|
System.err.println(" ");
|
||||||
System.err.println(" ");
|
System.err.println("#################### - WARNING - ####################");
|
||||||
System.err.println("Could not download CS-CoreLib");
|
System.err.println(" ");
|
||||||
System.err.println(" ");
|
System.err.println("Failed to download CS-CoreLib");
|
||||||
System.err.println("#################### - FATAL ERROR - ####################");
|
System.err.println("Please download & install CS-CoreLib manually:");
|
||||||
System.err.println(" ");
|
System.err.println("https://dev.bukkit.org/projects/cs-corelib");
|
||||||
} finally {
|
System.err.println(" ");
|
||||||
try {
|
System.err.println("#################### - WARNING - ####################");
|
||||||
if (input != null) input.close();
|
System.err.println(" ");
|
||||||
if (output != null) output.close();
|
} finally {
|
||||||
System.err.println(" ");
|
try {
|
||||||
System.err.println("#################### - WARNING - ####################");
|
if (input != null) input.close();
|
||||||
System.err.println(" ");
|
if (output != null) output.close();
|
||||||
System.err.println("Please restart your Server to finish the Installation");
|
System.err.println(" ");
|
||||||
System.err.println("of " + plugin.getName() + " and CS-CoreLib");
|
System.err.println("#################### - INFO - ####################");
|
||||||
System.err.println(" ");
|
System.err.println(" ");
|
||||||
System.err.println("#################### - WARNING - ####################");
|
System.err.println("Please restart your Server to finish the Installation");
|
||||||
System.err.println(" ");
|
System.err.println("of " + plugin.getName() + " and CS-CoreLib");
|
||||||
} catch (IOException e) {
|
System.err.println(" ");
|
||||||
e.printStackTrace();
|
System.err.println("#################### - INFO - ####################");
|
||||||
}
|
System.err.println(" ");
|
||||||
}
|
} catch (IOException e) {
|
||||||
}
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -18,9 +18,11 @@ import org.bukkit.event.Listener;
|
|||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable;
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.CommandHelp;
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.CommandHelp;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Player.Players;
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Player.Players;
|
||||||
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Reflection.ReflectionUtils;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder;
|
import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder;
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder.TitleType;
|
import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder.TitleType;
|
||||||
import me.mrCookieSlime.Slimefun.SlimefunGuide;
|
import me.mrCookieSlime.Slimefun.SlimefunGuide;
|
||||||
@ -152,21 +154,34 @@ public class SlimefunCommand implements CommandExecutor, Listener {
|
|||||||
}
|
}
|
||||||
else if (args[0].equalsIgnoreCase("versions")) {
|
else if (args[0].equalsIgnoreCase("versions")) {
|
||||||
if (sender.hasPermission("slimefun.command.versions")|| sender instanceof ConsoleCommandSender) {
|
if (sender.hasPermission("slimefun.command.versions")|| sender instanceof ConsoleCommandSender) {
|
||||||
|
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a" + Bukkit.getName() + " &2" + ReflectionUtils.getVersion()));
|
||||||
|
sender.sendMessage("");
|
||||||
|
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&aCS-CoreLib &2v" + CSCoreLib.getLib().getDescription().getVersion()));
|
||||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&aSlimefun &2v" + plugin.getDescription().getVersion()));
|
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&aSlimefun &2v" + plugin.getDescription().getVersion()));
|
||||||
sender.sendMessage("");
|
sender.sendMessage("");
|
||||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7&oInstalled Addons:"));
|
|
||||||
|
List<String> addons = new ArrayList<String>();
|
||||||
|
|
||||||
for (Plugin plugin: Bukkit.getPluginManager().getPlugins()) {
|
for (Plugin plugin: Bukkit.getPluginManager().getPlugins()) {
|
||||||
if (plugin.getDescription().getDepend().contains("Slimefun") || plugin.getDescription().getSoftDepend().contains("Slimefun")) {
|
if (plugin.getDescription().getDepend().contains("Slimefun") || plugin.getDescription().getSoftDepend().contains("Slimefun")) {
|
||||||
if (Bukkit.getPluginManager().isPluginEnabled(plugin)) {
|
if (Bukkit.getPluginManager().isPluginEnabled(plugin)) {
|
||||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', " &a" + plugin.getName() + " &2v" + plugin.getDescription().getVersion()));
|
addons.add(ChatColor.translateAlternateColorCodes('&', " &a" + plugin.getName() + " &2v" + plugin.getDescription().getVersion()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', " &c" + plugin.getName() + " &4v" + plugin.getDescription().getVersion()));
|
addons.add(ChatColor.translateAlternateColorCodes('&', " &c" + plugin.getName() + " &4v" + plugin.getDescription().getVersion()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7Installed Addons &8(" + addons.size() + ")"));
|
||||||
|
|
||||||
|
for (String addon: addons) {
|
||||||
|
sender.sendMessage(addon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Messages.local.sendTranslation(sender, "messages.no-permission", true);
|
||||||
}
|
}
|
||||||
else Messages.local.sendTranslation(sender, "messages.no-permission", true);
|
|
||||||
}
|
}
|
||||||
else if (args[0].equalsIgnoreCase("give")) {
|
else if (args[0].equalsIgnoreCase("give")) {
|
||||||
if (args.length == 3) {
|
if (args.length == 3) {
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
|
|
||||||
|
public class SlimefunBackpack extends SlimefunItem {
|
||||||
|
|
||||||
|
public int size;
|
||||||
|
|
||||||
|
public SlimefunBackpack(int size, Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) {
|
||||||
|
super(category, item, name, recipeType, recipe);
|
||||||
|
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -59,6 +59,7 @@ public class SlimefunItem {
|
|||||||
Set<ItemHandler> itemhandlers;
|
Set<ItemHandler> itemhandlers;
|
||||||
URID urid;
|
URID urid;
|
||||||
boolean ticking = false;
|
boolean ticking = false;
|
||||||
|
boolean addon = false;
|
||||||
BlockTicker ticker;
|
BlockTicker ticker;
|
||||||
EnergyTicker energy;
|
EnergyTicker energy;
|
||||||
|
|
||||||
@ -173,6 +174,7 @@ public class SlimefunItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void register(boolean slimefun) {
|
public void register(boolean slimefun) {
|
||||||
|
addon = !slimefun;
|
||||||
try {
|
try {
|
||||||
if (recipe.length < 9) recipe = new ItemStack[] {null, null, null, null, null, null, null, null, null};
|
if (recipe.length < 9) recipe = new ItemStack[] {null, null, null, null, null, null, null, null, null};
|
||||||
all.add(this);
|
all.add(this);
|
||||||
@ -251,6 +253,7 @@ public class SlimefunItem {
|
|||||||
if (sfi instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
if (sfi instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
||||||
else if (sfi instanceof DamagableChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
else if (sfi instanceof DamagableChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
||||||
else if (sfi instanceof ChargedItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
else if (sfi instanceof ChargedItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
||||||
|
else if (sfi instanceof SlimefunBackpack && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
||||||
else if (SlimefunManager.isItemSimiliar(item, sfi.getItem(), true)) return sfi;
|
else if (SlimefunManager.isItemSimiliar(item, sfi.getItem(), true)) return sfi;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -469,4 +472,8 @@ public class SlimefunItem {
|
|||||||
public void addWikipage(String page) {
|
public void addWikipage(String page) {
|
||||||
Slimefun.addWikiPage(this.getName(), "https://github.com/mrCookieSlime/Slimefun4/wiki/" + page);
|
Slimefun.addWikiPage(this.getName(), "https://github.com/mrCookieSlime/Slimefun4/wiki/" + page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isAddonItem() {
|
||||||
|
return this.addon;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
|
||||||
|
|
||||||
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
public class SoulboundBackpack extends SlimefunBackpack {
|
||||||
|
|
||||||
|
public SoulboundBackpack(int size, Category category, ItemStack item, String name, ItemStack[] recipe) {
|
||||||
|
super(size, category, item, name, RecipeType.MAGIC_WORKBENCH, recipe);
|
||||||
|
}
|
||||||
|
public SoulboundBackpack(int size, Category category, ItemStack item, String name, RecipeType type, ItemStack[] recipe) {
|
||||||
|
super(size, category, item, name, type, recipe);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
|
||||||
|
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
|
|
||||||
|
public class VanillaItem extends SlimefunItem {
|
||||||
|
|
||||||
|
public VanillaItem(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) {
|
||||||
|
super(category, item, name, recipeType, recipe);
|
||||||
|
}
|
||||||
|
}
|
@ -6,17 +6,18 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
|
||||||
import me.mrCookieSlime.Slimefun.SlimefunStartup;
|
import me.mrCookieSlime.Slimefun.SlimefunStartup;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.Categories;
|
import me.mrCookieSlime.Slimefun.Lists.Categories;
|
||||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.VanillaItem;
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.EntityType;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.potion.PotionEffect;
|
|
||||||
|
|
||||||
public class SlimefunManager {
|
public class SlimefunManager {
|
||||||
|
|
||||||
@ -38,7 +39,7 @@ public class SlimefunManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void registerArmorSet(ItemStack baseComponent, ItemStack[] items, String idSyntax, boolean slimefun) {
|
public static void registerArmorSet(ItemStack baseComponent, ItemStack[] items, String idSyntax, boolean slimefun, boolean vanilla) {
|
||||||
String[] components = new String[] {"_HELMET", "_CHESTPLATE", "_LEGGINGS", "_BOOTS"};
|
String[] components = new String[] {"_HELMET", "_CHESTPLATE", "_LEGGINGS", "_BOOTS"};
|
||||||
Category cat = Categories.ARMOR;
|
Category cat = Categories.ARMOR;
|
||||||
List<ItemStack[]> recipes = new ArrayList<ItemStack[]>();
|
List<ItemStack[]> recipes = new ArrayList<ItemStack[]>();
|
||||||
@ -47,7 +48,11 @@ public class SlimefunManager {
|
|||||||
recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
|
recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
|
||||||
recipes.add(new ItemStack[] {null, null, null, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
|
recipes.add(new ItemStack[] {null, null, null, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
new SlimefunItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun);
|
if (vanilla) {
|
||||||
|
new VanillaItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun);
|
||||||
|
} else {
|
||||||
|
new SlimefunItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,19 +1,23 @@
|
|||||||
package me.mrCookieSlime.Slimefun.Setup;
|
package me.mrCookieSlime.Slimefun.Setup;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.*;
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Effect;
|
import org.bukkit.Effect;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.block.*;
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.Chest;
|
||||||
|
import org.bukkit.block.CreatureSpawner;
|
||||||
|
import org.bukkit.block.Dispenser;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
import org.bukkit.entity.ArmorStand;
|
import org.bukkit.entity.ArmorStand;
|
||||||
import org.bukkit.entity.Arrow;
|
import org.bukkit.entity.Arrow;
|
||||||
@ -81,14 +85,17 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.MultiTool;
|
|||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ReplacingAlloy;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ReplacingAlloy;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ReplacingItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ReplacingItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBackpack;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBow;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBow;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SolarHelmet;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SolarHelmet;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SoulboundBackpack;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SoulboundItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SoulboundItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Talisman;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Talisman;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.VanillaItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor;
|
||||||
@ -101,7 +108,38 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker;
|
|||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BowShootHandler;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BowShootHandler;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemInteractionHandler;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemInteractionHandler;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.MultiBlockInteractionHandler;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.MultiBlockInteractionHandler;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AdvancedCargoOutputNode;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AnimalGrowthAccelerator;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoAnvil;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoBreeder;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoDisenchanter;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoEnchanter;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutomatedCraftingChamber;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.CarbonPress;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.CargoInputNode;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.CargoOutputNode;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ChargingBench;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.CropGrowthAccelerator;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricDustWasher;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricFurnace;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricGoldPan;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricIngotFactory;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricSmeltery;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectrifiedCrucible;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.FluidPump;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.FoodComposter;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.FoodFabricator;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.Freezer;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.HeatedPressureChamber;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.NetherDrill;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.OilPump;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ReactorAccessPort;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.Refinery;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.TrashCan;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.WitherAssembler;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.XPCollector;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.tasks.RainbowTicker;
|
import me.mrCookieSlime.Slimefun.Objects.tasks.RainbowTicker;
|
||||||
|
import me.mrCookieSlime.Slimefun.api.Backpacks;
|
||||||
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.energy.ChargableBlock;
|
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
|
||||||
@ -167,18 +205,84 @@ public class SlimefunSetup {
|
|||||||
boolean craft = true;
|
boolean craft = true;
|
||||||
for (int j = 0; j < inv.getContents().length; j++) {
|
for (int j = 0; j < inv.getContents().length; j++) {
|
||||||
if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], true)) {
|
if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], true)) {
|
||||||
craft = false;
|
if (SlimefunItem.getByItem(inputs.get(i)[j]) instanceof SlimefunBackpack) {
|
||||||
break;
|
if (!SlimefunManager.isItemSimiliar(inv.getContents()[j], inputs.get(i)[j], false)) {
|
||||||
|
craft = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
craft = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (craft) {
|
if (craft) {
|
||||||
final ItemStack adding = RecipeType.getRecipeOutputList(machine, inputs.get(i));
|
final ItemStack adding = RecipeType.getRecipeOutputList(machine, inputs.get(i)).clone();
|
||||||
if (Slimefun.hasUnlocked(p, adding, true)) {
|
if (Slimefun.hasUnlocked(p, adding, true)) {
|
||||||
Inventory inv2 = Bukkit.createInventory(null, 9, "test");
|
Inventory inv2 = Bukkit.createInventory(null, 9, "test");
|
||||||
for (int j = 0; j < inv.getContents().length; j++) {
|
for (int j = 0; j < inv.getContents().length; j++) {
|
||||||
inv2.setItem(j, inv.getContents()[j] != null ? (inv.getContents()[j].getAmount() > 1 ? new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1): null): null);
|
inv2.setItem(j, inv.getContents()[j] != null ? (inv.getContents()[j].getAmount() > 1 ? new CustomItem(inv.getContents()[j], inv.getContents()[j].getAmount() - 1): null): null);
|
||||||
}
|
}
|
||||||
if (InvUtils.fits(inv2, adding)) {
|
if (InvUtils.fits(inv2, adding)) {
|
||||||
|
SlimefunItem sfItem = SlimefunItem.getByItem(adding);
|
||||||
|
|
||||||
|
if (sfItem instanceof SlimefunBackpack) {
|
||||||
|
ItemStack backpack = null;
|
||||||
|
|
||||||
|
for (int j = 0; j < 9; j++) {
|
||||||
|
if (inv.getContents()[j] != null) {
|
||||||
|
if (inv.getContents()[j].getType() != Material.AIR) {
|
||||||
|
if (SlimefunItem.getByItem(inv.getContents()[j]) instanceof SlimefunBackpack) {
|
||||||
|
backpack = inv.getContents()[j];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String id = "";
|
||||||
|
int size = ((SlimefunBackpack) sfItem).size;
|
||||||
|
|
||||||
|
if (backpack != null) {
|
||||||
|
for (String line: backpack.getItemMeta().getLore()) {
|
||||||
|
if (line.startsWith(ChatColor.translateAlternateColorCodes('&', "&7ID: ")) && line.contains("#")) {
|
||||||
|
id = line.replace(ChatColor.translateAlternateColorCodes('&', "&7ID: "), "");
|
||||||
|
Config cfg = new Config(new File("data-storage/Slimefun/Players/" + id.split("#")[0] + ".yml"));
|
||||||
|
cfg.setValue("backpacks." + id.split("#")[1] + ".size", size);
|
||||||
|
cfg.save();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id.equals("")) {
|
||||||
|
for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) {
|
||||||
|
if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: <ID>"))) {
|
||||||
|
ItemMeta im = adding.getItemMeta();
|
||||||
|
List<String> lore = im.getLore();
|
||||||
|
lore.set(line, lore.get(line).replace("<ID>", Backpacks.createBackpack(p, size)));
|
||||||
|
im.setLore(lore);
|
||||||
|
adding.setItemMeta(im);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) {
|
||||||
|
if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: <ID>"))) {
|
||||||
|
ItemMeta im = adding.getItemMeta();
|
||||||
|
List<String> lore = im.getLore();
|
||||||
|
lore.set(line, lore.get(line).replace("<ID>", id));
|
||||||
|
im.setLore(lore);
|
||||||
|
adding.setItemMeta(im);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int j = 0; j < 9; j++) {
|
for (int j = 0; j < 9; j++) {
|
||||||
if (inv.getContents()[j] != null) {
|
if (inv.getContents()[j] != null) {
|
||||||
if (inv.getContents()[j].getType() != Material.AIR) {
|
if (inv.getContents()[j].getType() != Material.AIR) {
|
||||||
@ -189,6 +293,7 @@ public class SlimefunSetup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
p.getWorld().playSound(b.getLocation(), Sound.BLOCK_WOOD_BUTTON_CLICK_ON, 1, 1);
|
p.getWorld().playSound(b.getLocation(), Sound.BLOCK_WOOD_BUTTON_CLICK_ON, 1, 1);
|
||||||
|
|
||||||
inv.addItem(adding);
|
inv.addItem(adding);
|
||||||
}
|
}
|
||||||
else Messages.local.sendTranslation(p, "machines.full-inventory", true);
|
else Messages.local.sendTranslation(p, "machines.full-inventory", true);
|
||||||
@ -735,11 +840,11 @@ public class SlimefunSetup {
|
|||||||
SlimefunManager.registerArmorSet(new ItemStack(Material.GLOWSTONE), new ItemStack[] {SlimefunItems.GLOWSTONE_HELMET, SlimefunItems.GLOWSTONE_CHESTPLATE, SlimefunItems.GLOWSTONE_LEGGINGS, SlimefunItems.GLOWSTONE_BOOTS}, "GLOWSTONE",
|
SlimefunManager.registerArmorSet(new ItemStack(Material.GLOWSTONE), new ItemStack[] {SlimefunItems.GLOWSTONE_HELMET, SlimefunItems.GLOWSTONE_CHESTPLATE, SlimefunItems.GLOWSTONE_LEGGINGS, SlimefunItems.GLOWSTONE_BOOTS}, "GLOWSTONE",
|
||||||
new PotionEffect[][] {new PotionEffect[] {new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 0)}, new PotionEffect[] {new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 0)}, new PotionEffect[] {new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 0)}, new PotionEffect[] {new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 0)}}, true, true);
|
new PotionEffect[][] {new PotionEffect[] {new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 0)}, new PotionEffect[] {new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 0)}, new PotionEffect[] {new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 0)}, new PotionEffect[] {new PotionEffect(PotionEffectType.NIGHT_VISION, 600, 0)}}, true, true);
|
||||||
|
|
||||||
SlimefunManager.registerArmorSet(SlimefunItems.DAMASCUS_STEEL_INGOT, new ItemStack[] {SlimefunItems.DAMASCUS_STEEL_HELMET, SlimefunItems.DAMASCUS_STEEL_CHESTPLATE, SlimefunItems.DAMASCUS_STEEL_LEGGINGS, SlimefunItems.DAMASCUS_STEEL_BOOTS}, "DAMASCUS_STEEL", true);
|
SlimefunManager.registerArmorSet(SlimefunItems.DAMASCUS_STEEL_INGOT, new ItemStack[] {SlimefunItems.DAMASCUS_STEEL_HELMET, SlimefunItems.DAMASCUS_STEEL_CHESTPLATE, SlimefunItems.DAMASCUS_STEEL_LEGGINGS, SlimefunItems.DAMASCUS_STEEL_BOOTS}, "DAMASCUS_STEEL", true, false);
|
||||||
|
|
||||||
SlimefunManager.registerArmorSet(SlimefunItems.REINFORCED_ALLOY_INGOT, new ItemStack[] {SlimefunItems.REINFORCED_ALLOY_HELMET, SlimefunItems.REINFORCED_ALLOY_CHESTPLATE, SlimefunItems.REINFORCED_ALLOY_LEGGINGS, SlimefunItems.REINFORCED_ALLOY_BOOTS}, "REINFORCED_ALLOY", true);
|
SlimefunManager.registerArmorSet(SlimefunItems.REINFORCED_ALLOY_INGOT, new ItemStack[] {SlimefunItems.REINFORCED_ALLOY_HELMET, SlimefunItems.REINFORCED_ALLOY_CHESTPLATE, SlimefunItems.REINFORCED_ALLOY_LEGGINGS, SlimefunItems.REINFORCED_ALLOY_BOOTS}, "REINFORCED_ALLOY", true, false);
|
||||||
|
|
||||||
SlimefunManager.registerArmorSet(new ItemStack(Material.CACTUS), new ItemStack[] {SlimefunItems.CACTUS_HELMET, SlimefunItems.CACTUS_CHESTPLATE, SlimefunItems.CACTUS_LEGGINGS, SlimefunItems.CACTUS_BOOTS}, "CACTUS", true);
|
SlimefunManager.registerArmorSet(new ItemStack(Material.CACTUS), new ItemStack[] {SlimefunItems.CACTUS_HELMET, SlimefunItems.CACTUS_CHESTPLATE, SlimefunItems.CACTUS_LEGGINGS, SlimefunItems.CACTUS_BOOTS}, "CACTUS", true, false);
|
||||||
|
|
||||||
new Alloy(SlimefunItems.REINFORCED_ALLOY_INGOT, "REINFORCED_ALLOY_INGOT",
|
new Alloy(SlimefunItems.REINFORCED_ALLOY_INGOT, "REINFORCED_ALLOY_INGOT",
|
||||||
new ItemStack[] {SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.CORINTHIAN_BRONZE_INGOT, SlimefunItems.SOLDER_INGOT, SlimefunItems.BILLON_INGOT, SlimefunItems.GOLD_24K, null, null, null})
|
new ItemStack[] {SlimefunItems.DAMASCUS_STEEL_INGOT, SlimefunItems.HARDENED_METAL_INGOT, SlimefunItems.CORINTHIAN_BRONZE_INGOT, SlimefunItems.SOLDER_INGOT, SlimefunItems.BILLON_INGOT, SlimefunItems.GOLD_24K, null, null, null})
|
||||||
@ -1411,7 +1516,7 @@ public class SlimefunSetup {
|
|||||||
new ItemStack[] {SlimefunItems.SYNTHETIC_SAPPHIRE, SlimefunItems.ALUMINUM_DUST, SlimefunItems.ALUMINUM_INGOT, new ItemStack(Material.THIN_GLASS), null, null, null, null, null})
|
new ItemStack[] {SlimefunItems.SYNTHETIC_SAPPHIRE, SlimefunItems.ALUMINUM_DUST, SlimefunItems.ALUMINUM_INGOT, new ItemStack(Material.THIN_GLASS), null, null, null, null, null})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
SlimefunManager.registerArmorSet(SlimefunItems.CHAIN, new ItemStack[] {new ItemStack(Material.CHAINMAIL_HELMET), new ItemStack(Material.CHAINMAIL_CHESTPLATE), new ItemStack(Material.CHAINMAIL_LEGGINGS), new ItemStack(Material.CHAINMAIL_BOOTS)}, "CHAIN", true);
|
SlimefunManager.registerArmorSet(SlimefunItems.CHAIN, new ItemStack[] {new ItemStack(Material.CHAINMAIL_HELMET), new ItemStack(Material.CHAINMAIL_CHESTPLATE), new ItemStack(Material.CHAINMAIL_LEGGINGS), new ItemStack(Material.CHAINMAIL_BOOTS)}, "CHAIN", true, true);
|
||||||
|
|
||||||
new Talisman(SlimefunItems.TALISMAN_WHIRLWIND, "WHIRLWIND_TALISMAN",
|
new Talisman(SlimefunItems.TALISMAN_WHIRLWIND, "WHIRLWIND_TALISMAN",
|
||||||
new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.STAFF_WIND, SlimefunItems.TALISMAN_TRAVELLER, SlimefunItems.STAFF_WIND, SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3}
|
new ItemStack[] {SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3, SlimefunItems.STAFF_WIND, SlimefunItems.TALISMAN_TRAVELLER, SlimefunItems.STAFF_WIND, SlimefunItems.MAGIC_LUMP_3, null, SlimefunItems.MAGIC_LUMP_3}
|
||||||
@ -1467,7 +1572,7 @@ public class SlimefunSetup {
|
|||||||
new ItemStack[] {SlimefunItems.HEAVY_CREAM, SlimefunItems.SALT, null, null, null, null, null, null, null})
|
new ItemStack[] {SlimefunItems.HEAVY_CREAM, SlimefunItems.SALT, null, null, null, null, null, null, null})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
SlimefunManager.registerArmorSet(SlimefunItems.GILDED_IRON, new ItemStack[] {SlimefunItems.GILDED_IRON_HELMET, SlimefunItems.GILDED_IRON_CHESTPLATE, SlimefunItems.GILDED_IRON_LEGGINGS, SlimefunItems.GILDED_IRON_BOOTS}, "GILDED_IRON", true);
|
SlimefunManager.registerArmorSet(SlimefunItems.GILDED_IRON, new ItemStack[] {SlimefunItems.GILDED_IRON_HELMET, SlimefunItems.GILDED_IRON_CHESTPLATE, SlimefunItems.GILDED_IRON_LEGGINGS, SlimefunItems.GILDED_IRON_BOOTS}, "GILDED_IRON", true, false);
|
||||||
|
|
||||||
new SlimefunArmorPiece(Categories.ARMOR, SlimefunItems.SCUBA_HELMET, "SCUBA_HELMET", RecipeType.ARMOR_FORGE,
|
new SlimefunArmorPiece(Categories.ARMOR, SlimefunItems.SCUBA_HELMET, "SCUBA_HELMET", RecipeType.ARMOR_FORGE,
|
||||||
new ItemStack[] {new MaterialData(Material.WOOL, (byte) 1).toItemStack(1), new MaterialData(Material.WOOL, (byte) 1).toItemStack(1), new MaterialData(Material.WOOL, (byte) 1).toItemStack(1), new MaterialData(Material.WOOL, (byte) 15).toItemStack(1), new ItemStack(Material.THIN_GLASS), new MaterialData(Material.WOOL, (byte) 15).toItemStack(1), null, null, null},
|
new ItemStack[] {new MaterialData(Material.WOOL, (byte) 1).toItemStack(1), new MaterialData(Material.WOOL, (byte) 1).toItemStack(1), new MaterialData(Material.WOOL, (byte) 1).toItemStack(1), new MaterialData(Material.WOOL, (byte) 15).toItemStack(1), new ItemStack(Material.THIN_GLASS), new MaterialData(Material.WOOL, (byte) 15).toItemStack(1), null, null, null},
|
||||||
@ -1515,7 +1620,7 @@ public class SlimefunSetup {
|
|||||||
new ItemStack[] {new ItemStack(Material.REDSTONE), new ItemStack(Material.REDSTONE_BLOCK), SlimefunItems.FERROSILICON, SlimefunItems.HARDENED_METAL_INGOT, null, null, null, null, null})
|
new ItemStack[] {new ItemStack(Material.REDSTONE), new ItemStack(Material.REDSTONE_BLOCK), SlimefunItems.FERROSILICON, SlimefunItems.HARDENED_METAL_INGOT, null, null, null, null, null})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
SlimefunManager.registerArmorSet(SlimefunItems.GOLD_12K, new ItemStack[] {SlimefunItems.GOLD_HELMET, SlimefunItems.GOLD_CHESTPLATE, SlimefunItems.GOLD_LEGGINGS, SlimefunItems.GOLD_BOOTS}, "GOLD_12K", true);
|
SlimefunManager.registerArmorSet(SlimefunItems.GOLD_12K, new ItemStack[] {SlimefunItems.GOLD_HELMET, SlimefunItems.GOLD_CHESTPLATE, SlimefunItems.GOLD_LEGGINGS, SlimefunItems.GOLD_BOOTS}, "GOLD_12K", true, false);
|
||||||
|
|
||||||
new SlimefunItem(Categories.MISC, SlimefunItems.CLOTH, "CLOTH", RecipeType.ENHANCED_CRAFTING_TABLE,
|
new SlimefunItem(Categories.MISC, SlimefunItems.CLOTH, "CLOTH", RecipeType.ENHANCED_CRAFTING_TABLE,
|
||||||
new ItemStack[] {new ItemStack(Material.WOOL), null, null, null, null, null, null, null, null}, new CustomItem(SlimefunItems.CLOTH, 8))
|
new ItemStack[] {new ItemStack(Material.WOOL), null, null, null, null, null, null, null, null}, new CustomItem(SlimefunItems.CLOTH, 8))
|
||||||
@ -2161,19 +2266,19 @@ public class SlimefunSetup {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
new SlimefunItem(Categories.PORTABLE, SlimefunItems.BACKPACK_SMALL, "SMALL_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
new SlimefunBackpack(9, Categories.PORTABLE, SlimefunItems.BACKPACK_SMALL, "SMALL_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
||||||
new ItemStack[] {new ItemStack(Material.LEATHER), null, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_6K, new ItemStack(Material.CHEST), SlimefunItems.GOLD_6K, new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER)})
|
new ItemStack[] {new ItemStack(Material.LEATHER), null, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_6K, new ItemStack(Material.CHEST), SlimefunItems.GOLD_6K, new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER)})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
new SlimefunItem(Categories.PORTABLE, SlimefunItems.BACKPACK_MEDIUM, "MEDIUM_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
new SlimefunBackpack(18, Categories.PORTABLE, SlimefunItems.BACKPACK_MEDIUM, "MEDIUM_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
||||||
new ItemStack[] {new ItemStack(Material.LEATHER), null, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_10K, SlimefunItems.BACKPACK_SMALL, SlimefunItems.GOLD_10K, new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER)})
|
new ItemStack[] {new ItemStack(Material.LEATHER), null, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_10K, SlimefunItems.BACKPACK_SMALL, SlimefunItems.GOLD_10K, new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER)})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
new SlimefunItem(Categories.PORTABLE, SlimefunItems.BACKPACK_LARGE, "LARGE_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
new SlimefunBackpack(27, Categories.PORTABLE, SlimefunItems.BACKPACK_LARGE, "LARGE_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
||||||
new ItemStack[] {new ItemStack(Material.LEATHER), null, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_14K, SlimefunItems.BACKPACK_MEDIUM, SlimefunItems.GOLD_14K, new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER)})
|
new ItemStack[] {new ItemStack(Material.LEATHER), null, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_14K, SlimefunItems.BACKPACK_MEDIUM, SlimefunItems.GOLD_14K, new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER), new ItemStack(Material.LEATHER)})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
new SlimefunItem(Categories.PORTABLE, SlimefunItems.WOVEN_BACKPACK, "WOVEN_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
new SlimefunBackpack(36, Categories.PORTABLE, SlimefunItems.WOVEN_BACKPACK, "WOVEN_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
||||||
new ItemStack[] {SlimefunItems.CLOTH, null, SlimefunItems.CLOTH, SlimefunItems.GOLD_16K, SlimefunItems.BACKPACK_LARGE, SlimefunItems.GOLD_16K, SlimefunItems.CLOTH, SlimefunItems.CLOTH, SlimefunItems.CLOTH})
|
new ItemStack[] {SlimefunItems.CLOTH, null, SlimefunItems.CLOTH, SlimefunItems.GOLD_16K, SlimefunItems.BACKPACK_LARGE, SlimefunItems.GOLD_16K, SlimefunItems.CLOTH, SlimefunItems.CLOTH, SlimefunItems.CLOTH})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
@ -2336,7 +2441,7 @@ public class SlimefunSetup {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
new SlimefunItem(Categories.PORTABLE, SlimefunItems.GILDED_BACKPACK, "GILDED_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
new SlimefunBackpack(45, Categories.PORTABLE, SlimefunItems.GILDED_BACKPACK, "GILDED_BACKPACK", RecipeType.ENHANCED_CRAFTING_TABLE,
|
||||||
new ItemStack[] {SlimefunItems.GOLD_22K, null, SlimefunItems.GOLD_22K, new ItemStack(Material.LEATHER), SlimefunItems.WOVEN_BACKPACK, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_22K, null, SlimefunItems.GOLD_22K})
|
new ItemStack[] {SlimefunItems.GOLD_22K, null, SlimefunItems.GOLD_22K, new ItemStack(Material.LEATHER), SlimefunItems.WOVEN_BACKPACK, new ItemStack(Material.LEATHER), SlimefunItems.GOLD_22K, null, SlimefunItems.GOLD_22K})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
@ -2360,7 +2465,7 @@ public class SlimefunSetup {
|
|||||||
new ItemStack[] {SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_AIR, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_EARTH, SlimefunItems.NECROTIC_SKULL, SlimefunItems.RUNE_FIRE, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_WATER, SlimefunItems.ENDER_LUMP_3})
|
new ItemStack[] {SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_AIR, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_EARTH, SlimefunItems.NECROTIC_SKULL, SlimefunItems.RUNE_FIRE, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_WATER, SlimefunItems.ENDER_LUMP_3})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
new SoulboundItem(Categories.PORTABLE, SlimefunItems.BOUND_BACKPACK, "BOUND_BACKPACK",
|
new SoulboundBackpack(36, Categories.PORTABLE, SlimefunItems.BOUND_BACKPACK, "BOUND_BACKPACK",
|
||||||
new ItemStack[] {SlimefunItems.ENDER_LUMP_2, null, SlimefunItems.ENDER_LUMP_2, SlimefunItems.ESSENCE_OF_AFTERLIFE, SlimefunItems.GILDED_BACKPACK, SlimefunItems.ESSENCE_OF_AFTERLIFE, SlimefunItems.ENDER_LUMP_2, null, SlimefunItems.ENDER_LUMP_2})
|
new ItemStack[] {SlimefunItems.ENDER_LUMP_2, null, SlimefunItems.ENDER_LUMP_2, SlimefunItems.ESSENCE_OF_AFTERLIFE, SlimefunItems.GILDED_BACKPACK, SlimefunItems.ESSENCE_OF_AFTERLIFE, SlimefunItems.ENDER_LUMP_2, null, SlimefunItems.ENDER_LUMP_2})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
@ -2375,12 +2480,12 @@ public class SlimefunSetup {
|
|||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
new JetBoots(SlimefunItems.BILLON_JETBOOTS, "BILLON_JETBOOTS",
|
new JetBoots(SlimefunItems.BILLON_JETBOOTS, "BILLON_JETBOOTS",
|
||||||
new ItemStack[] {null, null, SlimefunItems.BILLON_INGOT, null, SlimefunItems.POWER_CRYSTAL, SlimefunItems.BILLON_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER},
|
new ItemStack[] {null, null, null, SlimefunItems.BILLON_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.BILLON_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER},
|
||||||
0.45)
|
0.45)
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
new JetBoots(SlimefunItems.STEEL_JETBOOTS, "STEEL_JETBOOTS",
|
new JetBoots(SlimefunItems.STEEL_JETBOOTS, "STEEL_JETBOOTS",
|
||||||
new ItemStack[] {null, null, SlimefunItems.STEEL_INGOT, null, SlimefunItems.POWER_CRYSTAL, SlimefunItems.STEEL_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER},
|
new ItemStack[] {null, null, null, SlimefunItems.STEEL_INGOT, SlimefunItems.POWER_CRYSTAL, SlimefunItems.STEEL_INGOT, SlimefunItems.STEEL_THRUSTER, SlimefunItems.SMALL_CAPACITOR, SlimefunItems.STEEL_THRUSTER},
|
||||||
0.5)
|
0.5)
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
@ -2477,7 +2582,7 @@ public class SlimefunSetup {
|
|||||||
Block b = block.getBlock();
|
Block b = block.getBlock();
|
||||||
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
|
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
|
||||||
for (ItemStack drop: b.getDrops()) {
|
for (ItemStack drop: b.getDrops()) {
|
||||||
b.getWorld().dropItemNaturally(b.getLocation(), b.getType().toString().endsWith("_ORE") ? new CustomItem(drop, fortune): drop);
|
b.getWorld().dropItemNaturally(b.getLocation(), (!drop.getType().isBlock()) ? new CustomItem(drop, fortune): drop);
|
||||||
}
|
}
|
||||||
b.setType(Material.AIR);
|
b.setType(Material.AIR);
|
||||||
}
|
}
|
||||||
@ -4242,7 +4347,7 @@ public class SlimefunSetup {
|
|||||||
new ItemStack[] {SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_AIR, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_ENDER, new ItemStack(Material.FEATHER), SlimefunItems.RUNE_ENDER, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_AIR, SlimefunItems.ENDER_LUMP_3})
|
new ItemStack[] {SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_AIR, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_ENDER, new ItemStack(Material.FEATHER), SlimefunItems.RUNE_ENDER, SlimefunItems.ENDER_LUMP_3, SlimefunItems.RUNE_AIR, SlimefunItems.ENDER_LUMP_3})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
new SlimefunItem(Categories.MAGIC, SlimefunItems.ELYTRA, "ELYTRA", RecipeType.ANCIENT_ALTAR,
|
new VanillaItem(Categories.MAGIC, SlimefunItems.ELYTRA, "ELYTRA", RecipeType.ANCIENT_ALTAR,
|
||||||
new ItemStack[] {SlimefunItems.ELYTRA_SCALE, SlimefunItems.RUNE_AIR, SlimefunItems.ELYTRA_SCALE, SlimefunItems.RUNE_AIR, new ItemStack(Material.LEATHER_CHESTPLATE), SlimefunItems.RUNE_AIR, SlimefunItems.ELYTRA_SCALE, SlimefunItems.RUNE_AIR, SlimefunItems.ELYTRA_SCALE})
|
new ItemStack[] {SlimefunItems.ELYTRA_SCALE, SlimefunItems.RUNE_AIR, SlimefunItems.ELYTRA_SCALE, SlimefunItems.RUNE_AIR, new ItemStack(Material.LEATHER_CHESTPLATE), SlimefunItems.RUNE_AIR, SlimefunItems.ELYTRA_SCALE, SlimefunItems.RUNE_AIR, SlimefunItems.ELYTRA_SCALE})
|
||||||
.register(true);
|
.register(true);
|
||||||
|
|
||||||
|
@ -218,6 +218,15 @@ public class WikiSetup {
|
|||||||
Slimefun.addOfficialWikiPage("SOLAR_GENERATOR_4", "Solar-Generator");
|
Slimefun.addOfficialWikiPage("SOLAR_GENERATOR_4", "Solar-Generator");
|
||||||
Slimefun.addOfficialWikiPage("AUTO_ENCHANTER", "Auto-Enchanter");
|
Slimefun.addOfficialWikiPage("AUTO_ENCHANTER", "Auto-Enchanter");
|
||||||
Slimefun.addOfficialWikiPage("AUTO_DISENCHANTER", "Auto-Disenchanter");
|
Slimefun.addOfficialWikiPage("AUTO_DISENCHANTER", "Auto-Disenchanter");
|
||||||
|
|
||||||
|
//Cargo Management
|
||||||
|
Slimefun.addOfficialWikiPage("CARGO_MOTOR", "Cargo-Motor");
|
||||||
|
Slimefun.addOfficialWikiPage("CARGO_MANAGER", "Cargo-Manager");
|
||||||
|
Slimefun.addOfficialWikiPage("CARGO_NODE", "Cargo-Nodes");
|
||||||
|
Slimefun.addOfficialWikiPage("CARGO_INPUT", "Cargo-Nodes");
|
||||||
|
Slimefun.addOfficialWikiPage("CARGO_OUTPUT", "Cargo-Nodes");
|
||||||
|
Slimefun.addOfficialWikiPage("CARGO_OUTPUT_ADVANCED", "Cargo-Nodes");
|
||||||
|
Slimefun.addOfficialWikiPage("TRASH_CAN", "Trash-Can");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -861,7 +861,7 @@ public class SlimefunGuide {
|
|||||||
if (survival && !Slimefun.hasUnlocked(p, sfitem.getItem(), false) && sfitem.getResearch() != null) {
|
if (survival && !Slimefun.hasUnlocked(p, sfitem.getItem(), false) && sfitem.getResearch() != null) {
|
||||||
if (Slimefun.hasPermission(p, sfitem, false)) {
|
if (Slimefun.hasPermission(p, sfitem, false)) {
|
||||||
final int cost = SlimefunStartup.getResearchCfg().getInt(sfitem.getResearch().getID() + ".cost");
|
final int cost = SlimefunStartup.getResearchCfg().getInt(sfitem.getResearch().getID() + ".cost");
|
||||||
menu.addItem(index, new CustomItem(Material.BARRIER, StringUtils.formatItemName(sfitem.getItem(), false), 0, new String[] {"&4&lLOCKED", "", "&a> Click to unlock", "", "&7Cost: &b" + cost + " Level"}));
|
menu.addItem(index, new CustomItem(Material.BARRIER, "&r" + StringUtils.formatItemName(sfitem.getItem(), false), 0, new String[] {"&4&lLOCKED", "", "&a> Click to unlock", "", "&7Cost: &b" + cost + " Level"}));
|
||||||
menu.addMenuClickHandler(index, new MenuClickHandler() {
|
menu.addMenuClickHandler(index, new MenuClickHandler() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,26 +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 me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoEnchanter;
|
|
||||||
import net.coreprotect.CoreProtect;
|
|
||||||
import net.coreprotect.CoreProtectAPI;
|
|
||||||
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;
|
||||||
@ -37,10 +20,9 @@ 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.CSCoreLibSetup.CSCoreLibLoader;
|
|
||||||
import me.mrCookieSlime.Slimefun.AncientAltar.Pedestals;
|
import me.mrCookieSlime.Slimefun.AncientAltar.Pedestals;
|
||||||
|
import me.mrCookieSlime.Slimefun.CSCoreLibSetup.CSCoreLibLoader;
|
||||||
import me.mrCookieSlime.Slimefun.Commands.SlimefunCommand;
|
import me.mrCookieSlime.Slimefun.Commands.SlimefunCommand;
|
||||||
import me.mrCookieSlime.Slimefun.Commands.SlimefunTabCompleter;
|
import me.mrCookieSlime.Slimefun.Commands.SlimefunTabCompleter;
|
||||||
import me.mrCookieSlime.Slimefun.GEO.OreGenSystem;
|
import me.mrCookieSlime.Slimefun.GEO.OreGenSystem;
|
||||||
@ -55,6 +37,7 @@ import me.mrCookieSlime.Slimefun.Objects.Research;
|
|||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunArmorPiece;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutoEnchanter;
|
||||||
import me.mrCookieSlime.Slimefun.Setup.Files;
|
import me.mrCookieSlime.Slimefun.Setup.Files;
|
||||||
import me.mrCookieSlime.Slimefun.Setup.Messages;
|
import me.mrCookieSlime.Slimefun.Setup.Messages;
|
||||||
import me.mrCookieSlime.Slimefun.Setup.MiscSetup;
|
import me.mrCookieSlime.Slimefun.Setup.MiscSetup;
|
||||||
@ -66,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;
|
||||||
@ -89,6 +73,8 @@ import me.mrCookieSlime.Slimefun.listeners.ItemListener;
|
|||||||
import me.mrCookieSlime.Slimefun.listeners.TalismanListener;
|
import me.mrCookieSlime.Slimefun.listeners.TalismanListener;
|
||||||
import me.mrCookieSlime.Slimefun.listeners.TeleporterListener;
|
import me.mrCookieSlime.Slimefun.listeners.TeleporterListener;
|
||||||
import me.mrCookieSlime.Slimefun.listeners.ToolListener;
|
import me.mrCookieSlime.Slimefun.listeners.ToolListener;
|
||||||
|
import net.coreprotect.CoreProtect;
|
||||||
|
import net.coreprotect.CoreProtectAPI;
|
||||||
|
|
||||||
public class SlimefunStartup extends JavaPlugin {
|
public class SlimefunStartup extends JavaPlugin {
|
||||||
|
|
||||||
@ -170,6 +156,7 @@ public class SlimefunStartup extends JavaPlugin {
|
|||||||
if (!new File("data-storage/Slimefun/blocks").exists()) new File("data-storage/Slimefun/blocks").mkdirs();
|
if (!new File("data-storage/Slimefun/blocks").exists()) new File("data-storage/Slimefun/blocks").mkdirs();
|
||||||
if (!new File("data-storage/Slimefun/stored-blocks").exists()) new File("data-storage/Slimefun/stored-blocks").mkdirs();
|
if (!new File("data-storage/Slimefun/stored-blocks").exists()) new File("data-storage/Slimefun/stored-blocks").mkdirs();
|
||||||
if (!new File("data-storage/Slimefun/stored-inventories").exists()) new File("data-storage/Slimefun/stored-inventories").mkdirs();
|
if (!new File("data-storage/Slimefun/stored-inventories").exists()) new File("data-storage/Slimefun/stored-inventories").mkdirs();
|
||||||
|
if (!new File("data-storage/Slimefun/stored-chunks").exists()) new File("data-storage/Slimefun/stored-chunks").mkdirs();
|
||||||
if (!new File("data-storage/Slimefun/universal-inventories").exists()) new File("data-storage/Slimefun/universal-inventories").mkdirs();
|
if (!new File("data-storage/Slimefun/universal-inventories").exists()) new File("data-storage/Slimefun/universal-inventories").mkdirs();
|
||||||
if (!new File("data-storage/Slimefun/waypoints").exists()) new File("data-storage/Slimefun/waypoints").mkdirs();
|
if (!new File("data-storage/Slimefun/waypoints").exists()) new File("data-storage/Slimefun/waypoints").mkdirs();
|
||||||
if (!new File("data-storage/Slimefun/block-backups").exists()) new File("data-storage/Slimefun/block-backups").mkdirs();
|
if (!new File("data-storage/Slimefun/block-backups").exists()) new File("data-storage/Slimefun/block-backups").mkdirs();
|
||||||
@ -374,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!");
|
||||||
@ -407,110 +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();
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,15 +303,6 @@ public class BlockStorage {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (json != null && json.length() > 2) {
|
|
||||||
String[] entries = json.substring(2, json.length() - 2).split("\",\"");
|
|
||||||
|
|
||||||
for (String entry: entries) {
|
|
||||||
String[] components = entry.split("\":\"");
|
|
||||||
map.put(components[0], components[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,17 +6,18 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||||
import me.mrCookieSlime.Slimefun.SlimefunStartup;
|
import me.mrCookieSlime.Slimefun.SlimefunStartup;
|
||||||
import me.mrCookieSlime.Slimefun.GPS.GPSNetwork;
|
import me.mrCookieSlime.Slimefun.GPS.GPSNetwork;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Research;
|
import me.mrCookieSlime.Slimefun.Objects.Research;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||||
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.VanillaItem;
|
||||||
import me.mrCookieSlime.Slimefun.Setup.Messages;
|
import me.mrCookieSlime.Slimefun.Setup.Messages;
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
|
|
||||||
public class Slimefun {
|
public class Slimefun {
|
||||||
|
|
||||||
public static Map<Integer, List<GuideHandler>> guide_handlers = new HashMap<Integer, List<GuideHandler>>();
|
public static Map<Integer, List<GuideHandler>> guide_handlers = new HashMap<Integer, List<GuideHandler>>();
|
||||||
@ -61,7 +62,7 @@ public class Slimefun {
|
|||||||
SlimefunItem sfItem = SlimefunItem.getByItem(item);
|
SlimefunItem sfItem = SlimefunItem.getByItem(item);
|
||||||
if (sfItem == null) {
|
if (sfItem == null) {
|
||||||
if (SlimefunItem.isDisabled(item)) {
|
if (SlimefunItem.isDisabled(item)) {
|
||||||
if (message) Messages.local.sendTranslation(p, "messages.disabled-item", true);
|
if (message && !(sfItem instanceof VanillaItem)) Messages.local.sendTranslation(p, "messages.disabled-item", true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else return true;
|
else return true;
|
||||||
@ -70,7 +71,7 @@ public class Slimefun {
|
|||||||
if (sfItem.getResearch() == null) return true;
|
if (sfItem.getResearch() == null) return true;
|
||||||
else if (sfItem.getResearch().hasUnlocked(p)) return true;
|
else if (sfItem.getResearch().hasUnlocked(p)) return true;
|
||||||
else {
|
else {
|
||||||
if (message) Messages.local.sendTranslation(p, "messages.not-researched", true);
|
if (message && !(sfItem instanceof VanillaItem)) Messages.local.sendTranslation(p, "messages.not-researched", true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -82,7 +83,7 @@ public class Slimefun {
|
|||||||
if (sfItem.getResearch() == null) return true;
|
if (sfItem.getResearch() == null) return true;
|
||||||
else if (sfItem.getResearch().hasUnlocked(p)) return true;
|
else if (sfItem.getResearch().hasUnlocked(p)) return true;
|
||||||
else {
|
else {
|
||||||
if (message) Messages.local.sendTranslation(p, "messages.not-researched", true);
|
if (message && !(sfItem instanceof VanillaItem)) Messages.local.sendTranslation(p, "messages.not-researched", true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
119
src/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java
Normal file
119
src/me/mrCookieSlime/Slimefun/api/SlimefunBackup.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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));
|
||||||
|
@ -3,15 +3,15 @@ package me.mrCookieSlime.Slimefun.api.inventory;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
|
||||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu;
|
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.entity.HumanEntity;
|
import org.bukkit.entity.HumanEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||||
|
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu;
|
||||||
|
|
||||||
public class BlockMenu extends ChestMenu {
|
public class BlockMenu extends ChestMenu {
|
||||||
|
|
||||||
BlockMenuPreset preset;
|
BlockMenuPreset preset;
|
||||||
@ -59,7 +59,10 @@ public class BlockMenu extends ChestMenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void save(Location l) {
|
public void save(Location l) {
|
||||||
if (changes == 0) return;
|
if (changes == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// To force CS-CoreLib to build the Inventory
|
// To force CS-CoreLib to build the Inventory
|
||||||
this.getContents();
|
this.getContents();
|
||||||
|
|
||||||
@ -117,6 +120,16 @@ public class BlockMenu extends ChestMenu {
|
|||||||
changes++;
|
changes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChestMenu addMenuOpeningHandler(MenuOpeningHandler handler) {
|
||||||
|
if (handler instanceof SaveHandler) {
|
||||||
|
return super.addMenuOpeningHandler(new SaveHandler(this, ((SaveHandler) handler).handler));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return super.addMenuOpeningHandler(new SaveHandler(this, handler));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void close() {
|
public void close() {
|
||||||
Iterator<HumanEntity> iterator = toInventory().getViewers().iterator();
|
Iterator<HumanEntity> iterator = toInventory().getViewers().iterator();
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
@ -125,4 +138,21 @@ public class BlockMenu extends ChestMenu {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class SaveHandler implements MenuOpeningHandler {
|
||||||
|
|
||||||
|
BlockMenu menu;
|
||||||
|
MenuOpeningHandler handler;
|
||||||
|
|
||||||
|
public SaveHandler(BlockMenu menu, MenuOpeningHandler handler) {
|
||||||
|
this.handler = handler;
|
||||||
|
this.menu = menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onOpen(Player p) {
|
||||||
|
handler.onOpen(p);
|
||||||
|
menu.changes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -260,7 +260,7 @@ public class CargoNet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int c_index = round_robin.get(entry.getKey());
|
int c_index = round_robin.get(entry.getKey());
|
||||||
|
|
||||||
if (c_index < outputlist.size()) {
|
if (c_index < outputlist.size()) {
|
||||||
for (int i = 0; i < c_index; i++) {
|
for (int i = 0; i < c_index; i++) {
|
||||||
final Location temp = outputlist.get(0);
|
final Location temp = outputlist.get(0);
|
||||||
@ -269,7 +269,7 @@ public class CargoNet {
|
|||||||
}
|
}
|
||||||
c_index++;
|
c_index++;
|
||||||
}
|
}
|
||||||
else c_index = 0;
|
else c_index = 1;
|
||||||
|
|
||||||
round_robin.put(entry.getKey(), c_index);
|
round_robin.put(entry.getKey(), c_index);
|
||||||
}
|
}
|
||||||
@ -513,15 +513,15 @@ public class CargoNet {
|
|||||||
if (!blocks.contains(l)) {
|
if (!blocks.contains(l)) {
|
||||||
String id = BlockStorage.checkID(l);
|
String id = BlockStorage.checkID(l);
|
||||||
if (id == null) return true;
|
if (id == null) return true;
|
||||||
if (id.equals("CARGO_MANAGER")) return false;
|
else if (id.equals("CARGO_MANAGER")) return false;
|
||||||
if (id.equals("CARGO_NODE")) {
|
else if (id.equals("CARGO_NODE")) {
|
||||||
blocks.add(l);
|
blocks.add(l);
|
||||||
l1.add(source);
|
l1.add(source);
|
||||||
l2.add(l);
|
l2.add(l);
|
||||||
scan(l, blocks, l1, l2, axis, input, output, terminals, providers, destinations, imports, exports);
|
scan(l, blocks, l1, l2, axis, input, output, terminals, providers, destinations, imports, exports);
|
||||||
if (blocks.isEmpty()) return false;
|
if (blocks.isEmpty()) return false;
|
||||||
}
|
}
|
||||||
if (id.equals("CARGO_NODE_INPUT")) {
|
else if (id.equals("CARGO_NODE_INPUT")) {
|
||||||
blocks.add(l);
|
blocks.add(l);
|
||||||
l1.add(source);
|
l1.add(source);
|
||||||
l2.add(l);
|
l2.add(l);
|
||||||
@ -529,25 +529,25 @@ public class CargoNet {
|
|||||||
if (freq == 16) providers.add(l);
|
if (freq == 16) providers.add(l);
|
||||||
else input.put(l, freq);
|
else input.put(l, freq);
|
||||||
}
|
}
|
||||||
if (id.equals("CHEST_TERMINAL")) {
|
else if (id.equals("CHEST_TERMINAL")) {
|
||||||
blocks.add(l);
|
blocks.add(l);
|
||||||
l1.add(source);
|
l1.add(source);
|
||||||
l2.add(l);
|
l2.add(l);
|
||||||
terminals.add(l);
|
terminals.add(l);
|
||||||
}
|
}
|
||||||
if (id.equals("CT_IMPORT_BUS")) {
|
else if (id.equals("CT_IMPORT_BUS")) {
|
||||||
blocks.add(l);
|
blocks.add(l);
|
||||||
l1.add(source);
|
l1.add(source);
|
||||||
l2.add(l);
|
l2.add(l);
|
||||||
imports.add(l);
|
imports.add(l);
|
||||||
}
|
}
|
||||||
if (id.equals("CT_EXPORT_BUS")) {
|
else if (id.equals("CT_EXPORT_BUS")) {
|
||||||
blocks.add(l);
|
blocks.add(l);
|
||||||
l1.add(source);
|
l1.add(source);
|
||||||
l2.add(l);
|
l2.add(l);
|
||||||
exports.add(l);
|
exports.add(l);
|
||||||
}
|
}
|
||||||
if (id.equals("CARGO_NODE_OUTPUT")) {
|
else if (id.equals("CARGO_NODE_OUTPUT")) {
|
||||||
blocks.add(l);
|
blocks.add(l);
|
||||||
l1.add(source);
|
l1.add(source);
|
||||||
l2.add(l);
|
l2.add(l);
|
||||||
@ -560,7 +560,7 @@ public class CargoNet {
|
|||||||
output.put(freq, list);
|
output.put(freq, list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (id.equals("CARGO_NODE_OUTPUT_ADVANCED")) {
|
else if (id.equals("CARGO_NODE_OUTPUT_ADVANCED")) {
|
||||||
blocks.add(l);
|
blocks.add(l);
|
||||||
l1.add(source);
|
l1.add(source);
|
||||||
l2.add(l);
|
l2.add(l);
|
||||||
@ -645,8 +645,8 @@ public class CargoNet {
|
|||||||
if (!sources.contains(l)) {
|
if (!sources.contains(l)) {
|
||||||
String id = BlockStorage.checkID(l);
|
String id = BlockStorage.checkID(l);
|
||||||
if (id == null) return false;
|
if (id == null) return false;
|
||||||
if (id.equals("CARGO_MANAGER")) return true;
|
else if (id.equals("CARGO_MANAGER")) return true;
|
||||||
if (id.equals("CARGO_NODE")) return passiveScan(l, axis, sources);
|
else if (id.equals("CARGO_NODE")) return passiveScan(l, axis, sources);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,9 @@ public class TalismanListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onItemBreak(PlayerItemBreakEvent e) {
|
public void onItemBreak(PlayerItemBreakEvent e) {
|
||||||
if (Talisman.checkFor(e, SlimefunItem.getByName("ANVIL_TALISMAN"))) e.getBrokenItem().setAmount(1);
|
if (Talisman.checkFor(e, SlimefunItem.getByName("ANVIL_TALISMAN")))
|
||||||
|
e.getBrokenItem().setDurability((short)0);
|
||||||
|
e.getPlayer().getInventory().addItem(e.getBrokenItem());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
name: Slimefun
|
name: Slimefun
|
||||||
version: 4.1.3
|
version: 4.1.6
|
||||||
authors: [mrCookieSlime, John000708, st392, DeathlyPanda, BlackBeltPanda]
|
authors: [mrCookieSlime, John000708, st392, DeathlyPanda, BlackBeltPanda]
|
||||||
description: Slimefun basically turns your entire Server into a FTB modpack without installing a single mod
|
description: Slimefun basically turns your entire Server into a FTB modpack without installing a single mod
|
||||||
website: http://TheBusyBiscuit.github.io/
|
website: http://TheBusyBiscuit.github.io/
|
||||||
|
Loading…
Reference in New Issue
Block a user