diff --git a/CHANGELOG.md b/CHANGELOG.md index b85e29389..b9609cab8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ * Added "Snow blocks to Ice" recipe to the Freezer * You can now use Cooked Salmon in an Auto Drier to craft Fish Jerky * The Lumber Axe can now strip logs too +* The Slimefun Guide can now remember what page of a Category or Minecraft Item you were on #### Changes * Removed some deprecated parts of the API @@ -75,6 +76,8 @@ * Fixed #1711 * Fixed Slimefun Guide showing shaped recipes incorrectly * Fixed #1719 +* Fixed death waypoints not having the correct texture +* Fixed Androids having no texture when moving ## Release Candidate 9 (07 Mar 2020) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/ErrorReport.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/ErrorReport.java index 1e3e0951f..ea2c307b7 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/ErrorReport.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/ErrorReport.java @@ -86,7 +86,7 @@ public class ErrorReport { Slimefun.getLogger().log(Level.WARNING, ""); } catch (FileNotFoundException x) { - Slimefun.getLogger().log(Level.SEVERE, "An Error occured while saving an Error-Report for Slimefun " + SlimefunPlugin.getVersion(), x); + Slimefun.getLogger().log(Level.SEVERE, x, () -> "An Error occured while saving an Error-Report for Slimefun " + SlimefunPlugin.getVersion()); } }); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java index d01d42ca2..ffbe10be5 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/GPSNetwork.java @@ -122,7 +122,7 @@ public class GPSNetwork { public ItemStack getIcon(Map.Entry entry) { Location l = entry.getValue(); - if (entry.getKey().startsWith("&4Deathpoint")) { + if (entry.getKey().startsWith("player:death ")) { return deathpointIcon; } else if (l.getWorld().getEnvironment() == Environment.NETHER) { @@ -164,7 +164,7 @@ public class GPSNetwork { Location l = entry.getValue(); ItemStack globe = getIcon(entry); - menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &cClick to delete")); + menu.addItem(slot, new CustomItem(globe, entry.getKey().replace("player:death ", ""), "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &cClick to delete")); menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> { String id = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', entry.getKey())).toUpperCase().replace(' ', '_'); Config cfg = new Config(WAYPOINTS_DIRECTORY + pl.getUniqueId().toString() + ".yml"); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java index d52dc129c..cb12f0600 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/gps/TeleportationManager.java @@ -65,7 +65,7 @@ public final class TeleportationManager { Location l = entry.getValue(); ItemStack globe = network.getIcon(entry); - menu.addItem(slot, new CustomItem(globe, entry.getKey(), "", "&8\u21E8 &7" + SlimefunPlugin.getLocal().getResourceString(p, "tooltips.world") + ": &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "&8\u21E8 &7" + SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.gui.time") + ": &r" + DoubleHandler.fixDouble(0.5 * getTeleportationTime(complexity, source, l)) + "s", "", "&8\u21E8 &c" + SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.gui.tooltip"))); + menu.addItem(slot, new CustomItem(globe, entry.getKey().replace("player:death ", ""), "", "&8\u21E8 &7" + SlimefunPlugin.getLocal().getResourceString(p, "tooltips.world") + ": &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "&8\u21E8 &7" + SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.gui.time") + ": &r" + DoubleHandler.fixDouble(0.5 * getTeleportationTime(complexity, source, l)) + "s", "", "&8\u21E8 &c" + SlimefunPlugin.getLocal().getMessage(p, "machines.TELEPORTER.gui.tooltip"))); menu.addMenuClickHandler(slot, (pl, s, item, action) -> { pl.closeInventory(); teleport(pl.getUniqueId(), complexity, source, l, false); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/network/NetworkManager.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/network/NetworkManager.java index 122a06497..582fbafdb 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/network/NetworkManager.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/network/NetworkManager.java @@ -21,7 +21,6 @@ import io.github.thebusybiscuit.slimefun4.implementation.listeners.NetworkListen public final class NetworkManager { private final int maxNodes; - private boolean isChestTerminalInstalled = false; private final List networks = new LinkedList<>(); public NetworkManager(int capacity) { @@ -32,14 +31,6 @@ public final class NetworkManager { return maxNodes; } - public boolean isChestTerminalInstalled() { - return isChestTerminalInstalled; - } - - public void setChestTerminalInstalled(boolean installed) { - isChestTerminalInstalled = installed; - } - public List getNetworkList() { return networks; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerBackpack.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerBackpack.java index ce44b8977..84f008e25 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerBackpack.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerBackpack.java @@ -16,7 +16,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.listeners.BackpackListe * be opened. * * It holds an actual {@link Inventory} and represents the backpack on the - * level of an individual{@link ItemStack} as opposed to the class {@link SlimefunBackpack}. + * level of an individual {@link ItemStack} as opposed to the class {@link SlimefunBackpack}. * * @author TheBusyBiscuit * diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerProfile.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerProfile.java index c5c057f3a..9b908fee1 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerProfile.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerProfile.java @@ -4,7 +4,6 @@ import java.io.File; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -22,6 +21,7 @@ import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.cscorelib2.config.Config; import io.github.thebusybiscuit.slimefun4.api.items.HashedArmorpiece; +import io.github.thebusybiscuit.slimefun4.core.guide.GuideHistory; import io.github.thebusybiscuit.slimefun4.utils.PatternUtils; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.Research; @@ -47,7 +47,7 @@ public final class PlayerProfile { private final Set researches = new HashSet<>(); private final Map backpacks = new HashMap<>(); - private final LinkedList guideHistory = new LinkedList<>(); + private final GuideHistory guideHistory = new GuideHistory(this); private final HashedArmorpiece[] armor = { new HashedArmorpiece(), new HashedArmorpiece(), new HashedArmorpiece(), new HashedArmorpiece() }; @@ -222,7 +222,7 @@ public final class PlayerProfile { return Bukkit.getPlayer(getUUID()); } - public LinkedList getGuideHistory() { + public GuideHistory getGuideHistory() { return guideHistory; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GiveCommand.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GiveCommand.java index 269fa8c10..239850316 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GiveCommand.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/commands/subcommands/GiveCommand.java @@ -43,7 +43,7 @@ class GiveCommand extends SubCommand { SlimefunItem sfItem = SlimefunItem.getByID(args[2].toUpperCase()); if (sfItem != null) { - int amount = parseAmount(sender, args); + int amount = parseAmount(args); if (amount > 0) { SlimefunPlugin.getLocal().sendMessage(p, "messages.given-item", true, msg -> msg.replace(PLACEHOLDER_ITEM, sfItem.getItemName()).replace(PLACEHOLDER_AMOUNT, String.valueOf(amount))); @@ -61,7 +61,7 @@ class GiveCommand extends SubCommand { else SlimefunPlugin.getLocal().sendMessage(sender, "messages.no-permission", true); } - private int parseAmount(CommandSender sender, String[] args) { + private int parseAmount(String[] args) { int amount = 1; if (args.length == 4) { diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/GuideEntry.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/GuideEntry.java new file mode 100644 index 000000000..b521e8680 --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/GuideEntry.java @@ -0,0 +1,25 @@ +package io.github.thebusybiscuit.slimefun4.core.guide; + +class GuideEntry { + + private final T object; + private int page; + + GuideEntry(T object, int page) { + this.object = object; + this.page = page; + } + + public T getIndexedObject() { + return object; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + +} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/GuideHistory.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/GuideHistory.java new file mode 100644 index 000000000..a2f00a076 --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/GuideHistory.java @@ -0,0 +1,111 @@ +package io.github.thebusybiscuit.slimefun4.core.guide; + +import java.util.Deque; +import java.util.LinkedList; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; + +/** + * {@link GuideHistory} represents the browsing history of a {@link Player} through the + * {@link SlimefunGuide}. + * + * @author TheBusyBiscuit + * + * @see SlimefunGuide + * @see PlayerProfile + * + */ +public class GuideHistory { + + private final PlayerProfile profile; + private final Deque> queue = new LinkedList<>(); + + public GuideHistory(PlayerProfile profile) { + this.profile = profile; + } + + public void clear() { + queue.clear(); + } + + public void add(Category category, int page) { + refresh(category, page); + } + + public void add(ItemStack item, int page) { + refresh(item, page); + } + + public void add(SlimefunItem item) { + queue.add(new GuideEntry<>(item, 0)); + } + + public void add(String searchTerm) { + queue.add(new GuideEntry<>(searchTerm, 0)); + } + + private void refresh(T object, int page) { + GuideEntry lastEntry = getLastEntry(false); + + if (lastEntry != null && lastEntry.getIndexedObject() == object) { + lastEntry.setPage(page); + } + else { + queue.add(new GuideEntry<>(object, page)); + } + } + + public int size() { + return queue.size(); + } + + /** + * Retrieves the last page in the {@link SlimefunGuide} that was visited by a {@link Player}. + * Optionally also rewinds the history back to that entry. + * + * @param remove + * Whether to remove the current entry so it moves back to the entry returned. + * @return The last Guide Entry that was saved to the given Players guide history. + */ + private GuideEntry getLastEntry(boolean remove) { + if (remove && !queue.isEmpty()) { + queue.removeLast(); + } + + return queue.isEmpty() ? null : queue.getLast(); + } + + public void openLastEntry(SlimefunGuideImplementation guide, boolean survival) { + GuideEntry entry = getLastEntry(false); + open(guide, entry, survival); + } + + public void goBack(SlimefunGuideImplementation guide, boolean survival) { + GuideEntry entry = getLastEntry(true); + open(guide, entry, survival); + } + + private void open(SlimefunGuideImplementation guide, GuideEntry entry, boolean survival) { + if (entry == null) { + guide.openMainMenu(profile, survival, 1); + } + else if (entry.getIndexedObject() instanceof Category) { + guide.openCategory(profile, (Category) entry.getIndexedObject(), survival, entry.getPage()); + } + else if (entry.getIndexedObject() instanceof SlimefunItem) { + guide.displayItem(profile, (SlimefunItem) entry.getIndexedObject(), false); + } + else if (entry.getIndexedObject() instanceof String) { + guide.openSearch(profile, (String) entry.getIndexedObject(), survival, false); + } + else if (entry.getIndexedObject() instanceof ItemStack) { + guide.displayItem(profile, (ItemStack) entry.getIndexedObject(), entry.getPage(), false); + } + } + +} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java index f81f29f60..8ff3cfa98 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java @@ -87,13 +87,12 @@ public final class SlimefunGuide { if (!SlimefunPlugin.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled")) return; if (!SlimefunPlugin.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled-items.SLIMEFUN_GUIDE")) return; - SlimefunGuideImplementation guide = SlimefunPlugin.getRegistry().getGuideLayout(layout); - Object last = null; - - Optional profile = PlayerProfile.find(p); - if (profile.isPresent()) { - last = guide.getLastEntry(profile.get(), false); - guide.openEntry(profile.get(), last, true); + Optional optional = PlayerProfile.find(p); + + if (optional.isPresent()) { + PlayerProfile profile = optional.get(); + SlimefunGuideImplementation guide = SlimefunPlugin.getRegistry().getGuideLayout(layout); + profile.getGuideHistory().openLastEntry(guide, true); } else { openMainMenuAsync(p, true, layout, 1); @@ -120,7 +119,7 @@ public final class SlimefunGuide { } public static void displayItem(PlayerProfile profile, ItemStack item, boolean addToHistory) { - SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideLayout.CHEST).displayItem(profile, item, addToHistory); + SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideLayout.CHEST).displayItem(profile, item, 0, addToHistory); } public static void displayItem(PlayerProfile profile, SlimefunItem item, boolean addToHistory) { diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuideImplementation.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuideImplementation.java index b1053b242..7a26e2542 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuideImplementation.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuideImplementation.java @@ -1,8 +1,5 @@ package io.github.thebusybiscuit.slimefun4.core.guide; -import java.util.LinkedList; - -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile; @@ -10,7 +7,6 @@ import io.github.thebusybiscuit.slimefun4.implementation.guide.BookSlimefunGuide import io.github.thebusybiscuit.slimefun4.implementation.guide.ChestSlimefunGuide; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.api.GuideHandler; /** * This interface is used for the different implementations that add behaviour @@ -48,46 +44,8 @@ public interface SlimefunGuideImplementation { void openSearch(PlayerProfile profile, String input, boolean survival, boolean addToHistory); - void displayItem(PlayerProfile profile, ItemStack item, boolean addToHistory); + void displayItem(PlayerProfile profile, ItemStack item, int index, boolean addToHistory); void displayItem(PlayerProfile profile, SlimefunItem item, boolean addToHistory); - /** - * Retrieves the last page in the {@link SlimefunGuide} that was visited by a {@link Player}. - * Optionally also rewinds the history back to that entry. - * - * @param profile - * The {@link PlayerProfile} of the {@link Player} you are querying - * @param remove - * Whether to remove the current entry so it moves back to the entry returned. - * @return The last Guide Entry that was saved to the given Players guide history. - */ - default Object getLastEntry(PlayerProfile profile, boolean remove) { - LinkedList history = profile.getGuideHistory(); - - if (remove && !history.isEmpty()) { - history.removeLast(); - } - - return history.isEmpty() ? null : history.getLast(); - } - - /** - * Opens the given Guide Entry to the {@link Player} of the specified {@link PlayerProfile}. - * - * @param profile - * The {@link PlayerProfile} of the {@link Player} we are opening this to - * @param entry - * The Guide Entry to open - * @param survival - * Whether this is the survival-version of the guide or cheat sheet version - */ - default void openEntry(PlayerProfile profile, Object entry, boolean survival) { - if (entry == null) openMainMenu(profile, survival, 1); - else if (entry instanceof Category) openCategory(profile, (Category) entry, survival, 1); - else if (entry instanceof SlimefunItem) displayItem(profile, (SlimefunItem) entry, false); - else if (entry instanceof GuideHandler) ((GuideHandler) entry).run(profile.getPlayer(), survival, getLayout() == SlimefunGuideLayout.BOOK); - else if (entry instanceof String) openSearch(profile, (String) entry, survival, false); - else displayItem(profile, (ItemStack) entry, false); - } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/BackupService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/BackupService.java index 55f54d650..6eff4bc50 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/BackupService.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/BackupService.java @@ -53,7 +53,7 @@ public class BackupService implements Runnable { } } catch (IOException x) { - Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a backup for Slimefun " + SlimefunPlugin.getVersion(), x); + Slimefun.getLogger().log(Level.SEVERE, x, () -> "An Error occured while creating a backup for Slimefun " + SlimefunPlugin.getVersion()); } } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java index 4aa29d97d..c7dbfb5e9 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/LocalizationService.java @@ -143,7 +143,7 @@ public class LocalizationService extends SlimefunLocalization { getConfig().getConfiguration().setDefaults(config); } catch (IOException e) { - Slimefun.getLogger().log(Level.SEVERE, "Failed to load language file: \"" + path + "\"", e); + Slimefun.getLogger().log(Level.SEVERE, e, () -> "Failed to load language file: \"" + path + "\""); } save(); @@ -207,7 +207,7 @@ public class LocalizationService extends SlimefunLocalization { return config; } catch (IOException e) { - Slimefun.getLogger().log(Level.SEVERE, "Failed to load language file into memory: \"" + path + "\"", e); + Slimefun.getLogger().log(Level.SEVERE, e, () -> "Failed to load language file into memory: \"" + path + "\""); return null; } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubConnector.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubConnector.java index 4c62dd27f..a740808db 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubConnector.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubConnector.java @@ -95,7 +95,7 @@ abstract class GitHubConnector { onSuccess(element); } catch (IOException x) { - Slimefun.getLogger().log(Level.SEVERE, "An Error occured while parsing GitHub-Data for Slimefun " + SlimefunPlugin.getVersion(), x); + Slimefun.getLogger().log(Level.SEVERE, x, () -> "An Error occured while parsing GitHub-Data for Slimefun " + SlimefunPlugin.getVersion()); onFailure(); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/ThirdPartyPluginService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/ThirdPartyPluginService.java index b138125de..54ec314fc 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/ThirdPartyPluginService.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/ThirdPartyPluginService.java @@ -24,6 +24,7 @@ public class ThirdPartyPluginService { private final SlimefunPlugin plugin; private boolean isExoticGardenInstalled = false; + private boolean isChestTerminalInstalled = false; private boolean isEmeraldEnchantsInstalled = false; private boolean isCoreProtectInstalled = false; private boolean isPlaceholderAPIInstalled = false; @@ -49,10 +50,9 @@ public class ThirdPartyPluginService { } isExoticGardenInstalled = isPluginInstalled("ExoticGarden"); + isChestTerminalInstalled = isPluginInstalled("ChestTerminal"); isEmeraldEnchantsInstalled = isPluginInstalled("EmeraldEnchants"); - SlimefunPlugin.getNetworkManager().setChestTerminalInstalled(isPluginInstalled("ChestTerminal")); - // WorldEdit Hook to clear Slimefun Data upon //set 0 //cut or any other equivalent if (isPluginInstalled("WorldEdit")) { try { @@ -60,8 +60,10 @@ public class ThirdPartyPluginService { new WorldEditHook(); } catch (Exception x) { - Slimefun.getLogger().log(Level.WARNING, "Failed to hook into WorldEdit!"); + String version = plugin.getServer().getPluginManager().getPlugin("WorldEdit").getDescription().getVersion(); + Slimefun.getLogger().log(Level.WARNING, "Maybe consider updating WorldEdit or Slimefun?"); + Slimefun.getLogger().log(Level.WARNING, "Failed to hook into WorldEdit v" + version, x); } } }); @@ -81,6 +83,10 @@ public class ThirdPartyPluginService { return isExoticGardenInstalled; } + public boolean isChestTerminalInstalled() { + return isChestTerminalInstalled; + } + public boolean isEmeraldEnchantsInstalled() { return isEmeraldEnchantsInstalled; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/WorldEditHook.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/WorldEditHook.java index be5b69da4..f90f0663b 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/WorldEditHook.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/plugins/WorldEditHook.java @@ -21,7 +21,7 @@ class WorldEditHook { } @Subscribe - public void wrapForLogging(final EditSessionEvent event) { + public void wrapForLogging(EditSessionEvent event) { event.setExtent(new AbstractDelegateExtent(event.getExtent()) { @Override @@ -37,6 +37,7 @@ class WorldEditHook { } } } + return getExtent().setBlock(pos, block); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/BookSlimefunGuide.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/BookSlimefunGuide.java index 413e6f59b..63fd79351 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/BookSlimefunGuide.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/BookSlimefunGuide.java @@ -177,7 +177,7 @@ public class BookSlimefunGuide implements SlimefunGuideImplementation { if (category.getItems().size() < 250) { if (survival) { - profile.getGuideHistory().add(category); + profile.getGuideHistory().add(category, page); } List pages = new ArrayList<>(); @@ -293,7 +293,7 @@ public class BookSlimefunGuide implements SlimefunGuideImplementation { } @Override - public void displayItem(PlayerProfile profile, ItemStack item, boolean addToHistory) { + public void displayItem(PlayerProfile profile, ItemStack item, int index, boolean addToHistory) { SlimefunGuide.displayItem(profile, item, addToHistory); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/ChestSlimefunGuide.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/ChestSlimefunGuide.java index c0868af63..1ea09a229 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/ChestSlimefunGuide.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/ChestSlimefunGuide.java @@ -2,7 +2,6 @@ package io.github.thebusybiscuit.slimefun4.implementation.guide; import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -26,6 +25,7 @@ import io.github.thebusybiscuit.cscorelib2.recipes.MinecraftRecipe; import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile; import io.github.thebusybiscuit.slimefun4.core.MultiBlock; import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem; +import io.github.thebusybiscuit.slimefun4.core.guide.GuideHistory; import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide; import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideImplementation; import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout; @@ -172,7 +172,7 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { if (p == null) return; if (survival) { - profile.getGuideHistory().add(category); + profile.getGuideHistory().add(category, page); } ChestMenu menu = create(p); @@ -336,7 +336,7 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { } @Override - public void displayItem(PlayerProfile profile, ItemStack item, boolean addToHistory) { + public void displayItem(PlayerProfile profile, ItemStack item, int index, boolean addToHistory) { Player p = profile.getPlayer(); if (p == null) return; @@ -359,7 +359,7 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { return; } - showMinecraftRecipe(recipes, 0, item, profile, p, addToHistory); + showMinecraftRecipe(recipes, index, item, profile, p, addToHistory); } private void showMinecraftRecipe(Recipe[] recipes, int index, ItemStack item, PlayerProfile profile, Player p, boolean addToHistory) { @@ -404,6 +404,11 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { } ChestMenu menu = create(p); + + if (addToHistory) { + profile.getGuideHistory().add(item, index); + } + displayItem(menu, profile, p, item, result, recipeType, recipeItems, task, addToHistory); if (recipes.length > 1) { @@ -413,14 +418,14 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { menu.addItem(28, ChestMenuUtils.getPreviousButton(p, index + 1, recipes.length), (pl, slot, action, stack) -> { if (index > 0) { - showMinecraftRecipe(recipes, index - 1, item, profile, p, false); + showMinecraftRecipe(recipes, index - 1, item, profile, p, true); } return false; }); menu.addItem(34, ChestMenuUtils.getNextButton(p, index + 1, recipes.length), (pl, slot, action, stack) -> { if (index < recipes.length - 1) { - showMinecraftRecipe(recipes, index + 1, item, profile, p, false); + showMinecraftRecipe(recipes, index + 1, item, profile, p, true); } return false; }); @@ -455,6 +460,10 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { RecipeChoiceTask task = new RecipeChoiceTask(); + if (addToHistory) { + profile.getGuideHistory().add(item); + } + displayItem(menu, profile, p, item, result, recipeType, recipe, task, addToHistory); if (item instanceof RecipeDisplayItem) { @@ -468,18 +477,13 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { } } - private void displayItem(ChestMenu menu, PlayerProfile profile, Player p, Object obj, ItemStack output, RecipeType recipeType, ItemStack[] recipe, RecipeChoiceTask task, boolean addToHistory) { - LinkedList history = profile.getGuideHistory(); - boolean isSlimefunRecipe = obj instanceof SlimefunItem; - - if (addToHistory) { - history.add(obj); - } + private void displayItem(ChestMenu menu, PlayerProfile profile, Player p, Object item, ItemStack output, RecipeType recipeType, ItemStack[] recipe, RecipeChoiceTask task, boolean addToHistory) { + boolean isSlimefunRecipe = item instanceof SlimefunItem; addBackButton(menu, 0, p, profile, true); MenuClickHandler clickHandler = (pl, slot, itemstack, action) -> { - displayItem(profile, itemstack, true); + displayItem(profile, itemstack, 0, true); return false; }; @@ -487,7 +491,7 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { ItemStack recipeItem = getDisplayItem(p, isSlimefunRecipe, recipe[i]); menu.addItem(recipeSlots[i], recipeItem, clickHandler); - if (recipeItem != null && obj instanceof MultiBlockMachine) { + if (recipeItem != null && item instanceof MultiBlockMachine) { for (Tag tag : MultiBlock.SUPPORTED_TAGS) { if (tag.isTagged(recipeItem.getType())) { task.add(recipeSlots[i], tag); @@ -530,9 +534,9 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { } private void addBackButton(ChestMenu menu, int slot, Player p, PlayerProfile profile, boolean survival) { - List playerHistory = profile.getGuideHistory(); + GuideHistory history = profile.getGuideHistory(); - if (survival && playerHistory.size() > 1) { + if (survival && history.size() > 1) { menu.addItem(slot, new CustomItem(ChestMenuUtils.getBackButton(p, "", "&rLeft Click: &7Go back to previous Page", "&rShift + left Click: &7Go back to Main Menu"))); menu.addMenuClickHandler(slot, (pl, s, is, action) -> { @@ -540,8 +544,7 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { openMainMenu(profile, survival, 1); } else { - Object last = getLastEntry(profile, true); - openEntry(profile, last, survival); + history.goBack(this, survival); } return false; }); @@ -626,7 +629,7 @@ public class ChestSlimefunGuide implements SlimefunGuideImplementation { if (page == 0) { menu.addMenuClickHandler(slot, (pl, s, itemstack, action) -> { - displayItem(profile, itemstack, true); + displayItem(profile, itemstack, 0, true); return false; }); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java index c45310111..7ce7ee04d 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/ProgrammableAndroid.java @@ -17,6 +17,7 @@ import org.bukkit.entity.Animals; import org.bukkit.entity.Monster; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -59,7 +60,7 @@ public abstract class ProgrammableAndroid extends Android implements InventoryBl public ProgrammableAndroid(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { super(category, item, recipeType, recipe); - this.texture = item.getBase64Texture().orElse(null); + this.texture = item.getSkullTexture().orElse(null); registerDefaultFuelTypes(); new BlockMenuPreset(getID(), "Programmable Android") { @@ -399,28 +400,32 @@ public abstract class ProgrammableAndroid extends Android implements InventoryBl ItemStack item = d.getInventory().getItem(slot); if (item != null) { - ItemStack currentFuel = menu.getItemInSlot(43); - - if (currentFuel == null) { - menu.replaceExistingItem(43, item); - d.getInventory().setItem(slot, null); - break; - } - else if (SlimefunManager.isItemSimilar(item, currentFuel, true)) { - int rest = item.getType().getMaxStackSize() - currentFuel.getAmount(); - - if (rest > 0) { - int amount = item.getAmount() > rest ? rest : item.getAmount(); - menu.replaceExistingItem(43, new CustomItem(item, currentFuel.getAmount() + amount)); - ItemUtils.consumeItem(item, amount, false); - } - break; - } + insertFuel(menu, d.getInventory(), slot, menu.getItemInSlot(43), item); } } } } + private boolean insertFuel(BlockMenu menu, Inventory dispenser, int slot, ItemStack currentFuel, ItemStack newFuel) { + if (currentFuel == null) { + menu.replaceExistingItem(43, item); + dispenser.setItem(slot, null); + return true; + } + else if (SlimefunManager.isItemSimilar(item, currentFuel, true)) { + int rest = item.getType().getMaxStackSize() - currentFuel.getAmount(); + + if (rest > 0) { + int amount = item.getAmount() > rest ? rest : item.getAmount(); + menu.replaceExistingItem(43, new CustomItem(item, currentFuel.getAmount() + amount)); + ItemUtils.consumeItem(item, amount, false); + } + return true; + } + + return false; + } + protected void move(Block b, BlockFace face, Block block) { if (block.getY() > 0 && block.getY() < block.getWorld().getMaxHeight() && (block.getType() == Material.AIR || block.getType() == Material.CAVE_AIR)) { block.setType(Material.PLAYER_HEAD); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AdvancedCargoOutputNode.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AdvancedCargoOutputNode.java index 21a984a1a..9b96c2c2e 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AdvancedCargoOutputNode.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AdvancedCargoOutputNode.java @@ -99,7 +99,7 @@ public class AdvancedCargoOutputNode extends SlimefunItem { menu.addMenuClickHandler(41, (p, slot, item, action) -> { int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; if (channel < 0) { - if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) channel = 16; + if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) channel = 16; else channel = 15; } BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); @@ -122,7 +122,7 @@ public class AdvancedCargoOutputNode extends SlimefunItem { menu.addMenuClickHandler(43, (p, slot, item, action) -> { int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; - if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) { + if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) { if (channeln > 16) channeln = 0; } else { diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoInputNode.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoInputNode.java index 6977b8b61..338959394 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoInputNode.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoInputNode.java @@ -117,7 +117,7 @@ public class CargoInputNode extends SlimefunItem { menu.addMenuClickHandler(41, (p, slot, item, action) -> { int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; if (channel < 0) { - if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) channel = 16; + if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) channel = 16; else channel = 15; } BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); @@ -140,7 +140,7 @@ public class CargoInputNode extends SlimefunItem { menu.addMenuClickHandler(43, (p, slot, item, action) -> { int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; - if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) { + if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) { if (channeln > 16) channeln = 0; } else { diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoOutputNode.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoOutputNode.java index 5799acb07..ad0a0e13f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoOutputNode.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoOutputNode.java @@ -43,7 +43,7 @@ public class CargoOutputNode extends SlimefunItem { int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; if (channel < 0) { - if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) channel = 16; + if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) channel = 16; else channel = 15; } @@ -67,7 +67,7 @@ public class CargoOutputNode extends SlimefunItem { menu.addMenuClickHandler(14, (p, slot, item, action) -> { int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; - if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) { + if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) { if (channeln > 16) channeln = 0; } else { diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/generators/SolarGenerator.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/generators/SolarGenerator.java index 4f2baaad2..3ebef8a14 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/generators/SolarGenerator.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/generators/SolarGenerator.java @@ -83,7 +83,8 @@ public abstract class SolarGenerator extends SimpleSlimefunItem super.preRegister(); // This prevents Players from toggling the Daylight sensor - addItemHandler((BlockUseHandler) PlayerRightClickEvent::cancel); + BlockUseHandler handler = PlayerRightClickEvent::cancel; + addItemHandler(handler); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricDustWasher.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricDustWasher.java index 5f0395563..d541aa9d4 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricDustWasher.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricDustWasher.java @@ -79,39 +79,56 @@ public abstract class ElectricDustWasher extends AContainer { } else { for (int slot : getInputSlots()) { - if (SlimefunManager.isItemSimilar(menu.getItemInSlot(slot), SlimefunItems.SIFTED_ORE, true)) { - if (!legacyMode) { - boolean emptySlot = false; - - for (int outputSlot : getOutputSlots()) { - if (menu.getItemInSlot(outputSlot) == null) { - emptySlot = true; - break; - } - } - if (!emptySlot) return; - } - - ItemStack adding = oreWasher.getRandomDust(); - MachineRecipe r = new MachineRecipe(4 / getSpeed(), new ItemStack[0], new ItemStack[] { adding }); - if (legacyMode && !menu.fits(r.getOutput()[0], getOutputSlots())) return; - menu.consumeItem(slot); - processing.put(b, r); - progress.put(b, r.getTicks()); - break; - } - else if (SlimefunManager.isItemSimilar(menu.getItemInSlot(slot), SlimefunItems.PULVERIZED_ORE, true)) { - MachineRecipe r = new MachineRecipe(4 / getSpeed(), new ItemStack[0], new ItemStack[] { SlimefunItems.PURE_ORE_CLUSTER }); - if (!menu.fits(r.getOutput()[0], getOutputSlots())) return; - menu.consumeItem(slot); - processing.put(b, r); - progress.put(b, r.getTicks()); + if (process(b, menu, slot)) { break; } } } } + private boolean process(Block b, BlockMenu menu, int slot) { + if (SlimefunManager.isItemSimilar(menu.getItemInSlot(slot), SlimefunItems.SIFTED_ORE, true)) { + if (!legacyMode) { + boolean emptySlot = false; + + for (int outputSlot : getOutputSlots()) { + if (menu.getItemInSlot(outputSlot) == null) { + emptySlot = true; + break; + } + } + + if (!emptySlot) { + return true; + } + } + + ItemStack adding = oreWasher.getRandomDust(); + MachineRecipe r = new MachineRecipe(4 / getSpeed(), new ItemStack[0], new ItemStack[] { adding }); + + if (!legacyMode || menu.fits(r.getOutput()[0], getOutputSlots())) { + menu.consumeItem(slot); + processing.put(b, r); + progress.put(b, r.getTicks()); + } + + return true; + } + else if (SlimefunManager.isItemSimilar(menu.getItemInSlot(slot), SlimefunItems.PULVERIZED_ORE, true)) { + MachineRecipe r = new MachineRecipe(4 / getSpeed(), new ItemStack[0], new ItemStack[] { SlimefunItems.PURE_ORE_CLUSTER }); + + if (menu.fits(r.getOutput()[0], getOutputSlots())) { + menu.consumeItem(slot); + processing.put(b, r); + progress.put(b, r.getTicks()); + } + + return true; + } + + return false; + } + @Override public String getMachineIdentifier() { return "ELECTRIC_DUST_WASHER"; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricGoldPan.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricGoldPan.java index 5c2d99516..bf73bdd96 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricGoldPan.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/machines/ElectricGoldPan.java @@ -117,33 +117,45 @@ public abstract class ElectricGoldPan extends AContainer implements RecipeDispla } else { for (int slot : getInputSlots()) { - if (SlimefunManager.isItemSimilar(menu.getItemInSlot(slot), new ItemStack(Material.GRAVEL), true)) { - ItemStack output = randomizer.getRandom(); - - MachineRecipe r = new MachineRecipe(3 / getSpeed(), new ItemStack[0], new ItemStack[] {output}); - if (!menu.fits(output, getOutputSlots())) return; - - menu.consumeItem(slot); - processing.put(b, r); - progress.put(b, r.getTicks()); - break; - } - else if (SlimefunManager.isItemSimilar(menu.getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true)) { - ItemStack output = randomizerNether.getRandom(); - - MachineRecipe r = new MachineRecipe(4 / getSpeed(), new ItemStack[0], new ItemStack[] {output}); - if (!menu.fits(output, getOutputSlots())) return; - - menu.consumeItem(slot); - processing.put(b, r); - progress.put(b, r.getTicks()); - break; + if (process(b, menu, slot)) { + break; } } } } - @Override + private boolean process(Block b, BlockMenu menu, int slot) { + if (SlimefunManager.isItemSimilar(menu.getItemInSlot(slot), new ItemStack(Material.GRAVEL), true)) { + ItemStack output = randomizer.getRandom(); + + MachineRecipe r = new MachineRecipe(3 / getSpeed(), new ItemStack[0], new ItemStack[] {output}); + + if (menu.fits(output, getOutputSlots())) { + menu.consumeItem(slot); + processing.put(b, r); + progress.put(b, r.getTicks()); + } + + return true; + } + else if (SlimefunManager.isItemSimilar(menu.getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true)) { + ItemStack output = randomizerNether.getRandom(); + + MachineRecipe r = new MachineRecipe(4 / getSpeed(), new ItemStack[0], new ItemStack[] {output}); + + if (menu.fits(output, getOutputSlots())) { + menu.consumeItem(slot); + processing.put(b, r); + progress.put(b, r.getTicks()); + } + + return true; + } + + return false; + } + + @Override public String getMachineIdentifier() { return "ELECTRIC_GOLD_PAN"; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/Compressor.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/Compressor.java index 74fd3a176..18f01bc7a 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/Compressor.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/Compressor.java @@ -58,7 +58,7 @@ public class Compressor extends MultiBlockMachine { removing.setAmount(recipeInput.getAmount()); inv.removeItem(removing); - craft(p, output, inv, outputInv); + craft(p, output, outputInv); } else { SlimefunPlugin.getLocal().sendMessage(p, "machines.full-inventory", true); @@ -72,7 +72,7 @@ public class Compressor extends MultiBlockMachine { SlimefunPlugin.getLocal().sendMessage(p, "machines.unknown-material", true); } - private void craft(Player p, ItemStack output, Inventory inv, Inventory outputInv) { + private void craft(Player p, ItemStack output, Inventory outputInv) { for (int i = 0; i < 4; i++) { int j = i; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DeathpointListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DeathpointListener.java index 4f72e443a..5e891b83f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DeathpointListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DeathpointListener.java @@ -21,12 +21,12 @@ public class DeathpointListener implements Listener { } @EventHandler - public void onDamage(EntityDeathEvent e) { + public void onDeath(EntityDeathEvent e) { if (e.getEntity().getType() == EntityType.PLAYER) { Player p = (Player) e.getEntity(); if (p.getInventory().containsAtLeast(SlimefunItems.GPS_EMERGENCY_TRANSMITTER, 1)) { - SlimefunPlugin.getGPSNetwork().addWaypoint(p, SlimefunPlugin.getLocal().getMessage(p, "gps.deathpoint").replace("%date%", format.format(new Date())), p.getLocation().getBlock().getLocation()); + SlimefunPlugin.getGPSNetwork().addWaypoint(p, "player:death " + SlimefunPlugin.getLocal().getMessage(p, "gps.deathpoint").replace("%date%", format.format(new Date())), p.getLocation().getBlock().getLocation()); } } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DispenserListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DispenserListener.java index c7a5f99ff..da40c1cc3 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DispenserListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/DispenserListener.java @@ -28,10 +28,12 @@ public class DispenserListener implements Listener { SlimefunItem machine = BlockStorage.check(b); if (machine != null) { - Dispenser dispenser = (Dispenser) b.getState(); - BlockFace face = ((Directional) b.getBlockData()).getFacing(); - Block block = b.getRelative(face); - machine.callItemHandler(BlockDispenseHandler.class, handler -> handler.onBlockDispense(e, dispenser, block, machine)); + machine.callItemHandler(BlockDispenseHandler.class, handler -> { + Dispenser dispenser = (Dispenser) b.getState(); + BlockFace face = ((Directional) b.getBlockData()).getFacing(); + Block block = b.getRelative(face); + handler.onBlockDispense(e, dispenser, block, machine); + }); } } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/EnhancedFurnaceListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/EnhancedFurnaceListener.java index 2766ca9ba..bbbc4b484 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/EnhancedFurnaceListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/EnhancedFurnaceListener.java @@ -32,7 +32,7 @@ public class EnhancedFurnaceListener implements Listener { } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onBurn(FurnaceBurnEvent e) { + public void onFuelBurn(FurnaceBurnEvent e) { SlimefunItem furnace = BlockStorage.check(e.getBlock()); if (furnace instanceof EnhancedFurnace && ((EnhancedFurnace) furnace).getFuelEfficiency() > 0) { @@ -41,7 +41,7 @@ public class EnhancedFurnaceListener implements Listener { } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onSmelt(FurnaceSmeltEvent e) { + public void onItemSmelt(FurnaceSmeltEvent e) { SlimefunItem sfItem = BlockStorage.check(e.getBlock()); if (sfItem instanceof EnhancedFurnace) { diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ItemPickupListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ItemPickupListener.java index fa7b624b0..aab28e4de 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ItemPickupListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/ItemPickupListener.java @@ -23,7 +23,7 @@ public class ItemPickupListener implements Listener { } @EventHandler - public void onPickup(EntityPickupItemEvent e) { + public void onEntityPickup(EntityPickupItemEvent e) { if (e.getItem().hasMetadata(METADATA_JEY)) { e.setCancelled(true); } @@ -34,7 +34,7 @@ public class ItemPickupListener implements Listener { } @EventHandler - public void onMinecartPickup(InventoryPickupItemEvent e) { + public void onHopperPickup(InventoryPickupItemEvent e) { if (e.getItem().hasMetadata(METADATA_JEY)) { e.setCancelled(true); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/TalismanListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/TalismanListener.java index 094603333..a18735217 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/TalismanListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/TalismanListener.java @@ -164,12 +164,6 @@ public class TalismanListener implements Listener { } } - /** - * - * @param e - * BlockBreakEvent - * @since 4.2.0 - */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent e) { ItemStack item = e.getPlayer().getInventory().getItemInMainHand(); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/WorldListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/WorldListener.java index 40c9300a2..8fdc770a3 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/WorldListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/WorldListener.java @@ -34,7 +34,7 @@ public class WorldListener implements Listener { storage.save(true); } else { - Slimefun.getLogger().log(Level.SEVERE, "Could not save Slimefun Blocks for World \"" + e.getWorld().getName() + "\""); + Slimefun.getLogger().log(Level.SEVERE, "Could not save Slimefun Blocks for World \"{0}\"", e.getWorld().getName()); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/TickerTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/TickerTask.java index 449a9039b..b627810d4 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/TickerTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/TickerTask.java @@ -36,328 +36,301 @@ import me.mrCookieSlime.Slimefun.api.Slimefun; public class TickerTask implements Runnable { - private final DecimalFormat decimalFormat = new DecimalFormat("#.###"); - private final ConcurrentMap move = new ConcurrentHashMap<>(); - private final ConcurrentMap delete = new ConcurrentHashMap<>(); - private final ConcurrentMap blockTimings = new ConcurrentHashMap<>(); - private final ConcurrentMap chunkItemCount = new ConcurrentHashMap<>(); - private final ConcurrentMap machineCount = new ConcurrentHashMap<>(); - private final ConcurrentMap machineTimings = new ConcurrentHashMap<>(); - private final ConcurrentMap chunkTimings = new ConcurrentHashMap<>(); - private final ConcurrentMap buggedBlocks = new ConcurrentHashMap<>(); - private final Set chunksSkipped = new HashSet<>(); - - private final Set tickers = new HashSet<>(); - - private boolean halted = false; - - private int skipped = 0; - private int chunks = 0; - private int machines = 0; - private long time = 0; - - private boolean running = false; - - public void abortTick() { - running = false; - } - - @Override - public void run() { - if (running) return; - - running = true; - long timestamp = System.nanoTime(); - - skipped = 0; - chunks = 0; - machines = 0; - chunkItemCount.clear(); - machineCount.clear(); - time = 0; - chunkTimings.clear(); - chunksSkipped.clear(); - machineTimings.clear(); - blockTimings.clear(); + private final DecimalFormat decimalFormat = new DecimalFormat("#.###"); + private final ConcurrentMap move = new ConcurrentHashMap<>(); + private final ConcurrentMap delete = new ConcurrentHashMap<>(); + private final ConcurrentMap blockTimings = new ConcurrentHashMap<>(); + private final ConcurrentMap chunkItemCount = new ConcurrentHashMap<>(); + private final ConcurrentMap machineCount = new ConcurrentHashMap<>(); + private final ConcurrentMap machineTimings = new ConcurrentHashMap<>(); + private final ConcurrentMap chunkTimings = new ConcurrentHashMap<>(); + private final ConcurrentMap buggedBlocks = new ConcurrentHashMap<>(); + private final Set chunksSkipped = new HashSet<>(); - Map bugged = new HashMap<>(buggedBlocks); - buggedBlocks.clear(); - - Map remove = new HashMap<>(delete); + private final Set tickers = new HashSet<>(); - for (Map.Entry entry : remove.entrySet()) { - BlockStorage._integrated_removeBlockInfo(entry.getKey(), entry.getValue()); - delete.remove(entry.getKey()); - } - - if (!halted) { - for (String tickedChunk : BlockStorage.getTickingChunks()) { - long timestamp2 = System.nanoTime(); - chunks++; - - for (Location l : BlockStorage.getTickingLocations(tickedChunk)) { - if (l.getWorld().isChunkLoaded(l.getBlockX() >> 4, l.getBlockZ() >> 4)) { - Block b = l.getBlock(); - SlimefunItem item = BlockStorage.check(l); - - if (item != null && item.getBlockTicker() != null) { - machines++; - - try { - item.getBlockTicker().update(); - - if (item.getBlockTicker().isSynchronized()) { - Slimefun.runSync(() -> { - try { - long timestamp3 = System.nanoTime(); - item.getBlockTicker().tick(b, item, BlockStorage.getLocationInfo(l)); - - Long machinetime = machineTimings.get(item.getID()); - Integer chunk = chunkItemCount.get(tickedChunk); - Integer machine = machineCount.get(item.getID()); - - machineTimings.put(item.getID(), (machinetime != null ? machinetime: 0) + (System.nanoTime() - timestamp3)); - chunkItemCount.put(tickedChunk, (chunk != null ? chunk: 0) + 1); - machineCount.put(item.getID(), (machine != null ? machine: 0) + 1); - blockTimings.put(l, System.nanoTime() - timestamp3); - } catch (Exception x) { - int errors = bugged.getOrDefault(l, 0); - reportErrors(l, item, x, errors); - } - }); - } - else { - long timestamp3 = System.nanoTime(); - item.getBlockTicker().tick(b, item, BlockStorage.getLocationInfo(l)); + private boolean halted = false; - machineTimings.merge(item.getID(), (System.nanoTime() - timestamp3), Long::sum); - chunkItemCount.merge(tickedChunk, 1, Integer::sum); - machineCount.merge(item.getID(), 1, Integer::sum); - blockTimings.put(l, System.nanoTime() - timestamp3); - } - - tickers.add(item.getBlockTicker()); - } catch (Exception x) { - int errors = bugged.getOrDefault(l, 0); - reportErrors(l, item, x, errors); - } - } - else skipped++; - } - else { - skipped += BlockStorage.getTickingLocations(tickedChunk).size(); - chunksSkipped.add(tickedChunk); - chunks--; - break; - } - } - - chunkTimings.put(tickedChunk, System.nanoTime() - timestamp2); - } - } + private int skipped = 0; + private int chunks = 0; + private int machines = 0; + private long time = 0; - for (Map.Entry entry : move.entrySet()) { - BlockStorage._integrated_moveLocationInfo(entry.getKey(), entry.getValue()); - } - move.clear(); - - Iterator iterator = tickers.iterator(); - while (iterator.hasNext()) { - iterator.next().startNewTick(); - iterator.remove(); - } - - time = System.nanoTime() - timestamp; - running = false; - } + private boolean running = false; - private void reportErrors(Location l, SlimefunItem item, Exception x, int errors) { - errors++; + public void abortTick() { + running = false; + } - if (errors == 1) { - // Generate a new Error-Report - new ErrorReport(x, l, item); + @Override + public void run() { + if (running) return; - buggedBlocks.put(l, errors); - } - else if (errors == 4) { - Slimefun.getLogger().log(Level.SEVERE, "X: " + l.getBlockX() + " Y: " + l.getBlockY() + " Z: " + l.getBlockZ() + '(' + item.getID() + ")"); - Slimefun.getLogger().log(Level.SEVERE, "has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated."); - Slimefun.getLogger().log(Level.SEVERE, "Check your /plugins/Slimefun/error-reports/ folder for details."); - Slimefun.getLogger().log(Level.SEVERE, " "); + running = true; + long timestamp = System.nanoTime(); - BlockStorage._integrated_removeBlockInfo(l, true); + skipped = 0; + chunks = 0; + machines = 0; + chunkItemCount.clear(); + machineCount.clear(); + time = 0; + chunkTimings.clear(); + chunksSkipped.clear(); + machineTimings.clear(); + blockTimings.clear(); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> l.getBlock().setType(Material.AIR)); - } - else { - buggedBlocks.put(l, errors); - } - } + Map bugged = new HashMap<>(buggedBlocks); + buggedBlocks.clear(); - public String getTime() { - return toMillis(time); - } + Map remove = new HashMap<>(delete); - public void info(CommandSender sender) { - 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" + toMillis(time))); - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Chunks: &e" + chunks)); - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Machines: &e" + machines)); - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Skipped Machines: &e" + skipped)); - sender.sendMessage(""); - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticking Machines:")); + for (Map.Entry entry : remove.entrySet()) { + BlockStorage._integrated_removeBlockInfo(entry.getKey(), entry.getValue()); + delete.remove(entry.getKey()); + } - List> timings = machineCount.keySet().stream() - .map(key -> new AbstractMap.SimpleEntry<>(key, machineTimings.getOrDefault(key, 0L))) - .sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())) - .collect(Collectors.toList()); + if (!halted) { + for (String tickedChunk : BlockStorage.getTickingChunks()) { + long timestamp2 = System.nanoTime(); + chunks++; - if (sender instanceof Player) { - ChatComponent component = new ChatComponent(ChatColors.color(" &7&oHover for more Info")); - StringBuilder builder = new StringBuilder(); - int hidden = 0; + for (Location l : BlockStorage.getTickingLocations(tickedChunk)) { + if (l.getWorld().isChunkLoaded(l.getBlockX() >> 4, l.getBlockZ() >> 4)) { + Block b = l.getBlock(); + SlimefunItem item = BlockStorage.check(l); - for (Map.Entry entry : timings) { - int count = machineCount.get(entry.getKey()); - - if (entry.getValue() > 500_000) { - builder.append("\n&c") - .append(entry.getKey()) - .append(" - ") - .append(count) - .append("x &7(") - .append(toMillis(entry.getValue())) - .append(", ") - .append(toMillis(entry.getValue() / count)) - .append(" avg/machine)"); - } - else hidden++; - } + if (item != null && item.getBlockTicker() != null) { + machines++; - builder.append("\n\n&c+ &4").append(hidden).append(" Hidden"); - component.setHoverEvent(new HoverEvent(ChatColors.color(builder.toString()))); + try { + item.getBlockTicker().update(); - component.sendMessage((Player) sender); - } - else { - int hidden = 0; + if (item.getBlockTicker().isSynchronized()) { + Slimefun.runSync(() -> { + try { + long timestamp3 = System.nanoTime(); + item.getBlockTicker().tick(b, item, BlockStorage.getLocationInfo(l)); - for (Map.Entry entry : timings) { - int count = machineCount.get(entry.getKey()); - if (entry.getValue() > 500_000) { - sender.sendMessage(" " + entry.getKey() + " - " + count + "x (" + toMillis(entry.getValue()) + ", " + toMillis(entry.getValue() / count) + " avg/machine)"); - } - else hidden++; - } + Long machinetime = machineTimings.get(item.getID()); + Integer chunk = chunkItemCount.get(tickedChunk); + Integer machine = machineCount.get(item.getID()); - sender.sendMessage("+ " + hidden + " Hidden"); - } - - sender.sendMessage(""); - sender.sendMessage(ChatColors.color("&6Ticking Chunks:")); + machineTimings.put(item.getID(), (machinetime != null ? machinetime : 0) + (System.nanoTime() - timestamp3)); + chunkItemCount.put(tickedChunk, (chunk != null ? chunk : 0) + 1); + machineCount.put(item.getID(), (machine != null ? machine : 0) + 1); + blockTimings.put(l, System.nanoTime() - timestamp3); + } + catch (Exception x) { + int errors = bugged.getOrDefault(l, 0); + reportErrors(l, item, x, errors); + } + }); + } + else { + long timestamp3 = System.nanoTime(); + item.getBlockTicker().tick(b, item, BlockStorage.getLocationInfo(l)); - timings = chunkTimings.entrySet().stream() - .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) - .collect(Collectors.toList()); + machineTimings.merge(item.getID(), (System.nanoTime() - timestamp3), Long::sum); + chunkItemCount.merge(tickedChunk, 1, Integer::sum); + machineCount.merge(item.getID(), 1, Integer::sum); + blockTimings.put(l, System.nanoTime() - timestamp3); + } - if (sender instanceof Player) { - ChatComponent component = new ChatComponent(ChatColors.color(" &7&oHover for more Info")); - StringBuilder builder = new StringBuilder(); - int hidden = 0; + tickers.add(item.getBlockTicker()); + } + catch (Exception x) { + int errors = bugged.getOrDefault(l, 0); + reportErrors(l, item, x, errors); + } + } + else skipped++; + } + else { + skipped += BlockStorage.getTickingLocations(tickedChunk).size(); + chunksSkipped.add(tickedChunk); + chunks--; + break; + } + } - for (Map.Entry entry : timings) { - if (!chunksSkipped.contains(entry.getKey())) { - if (entry.getValue() > 0) { - builder.append("\n&c") - .append(formatChunk(entry.getKey())) - .append(" - ") - .append(chunkItemCount.getOrDefault(entry.getKey(), 0)) - .append("x &7(") - .append(toMillis(entry.getValue())) - .append(')'); - } - else hidden++; - } - } - - builder.append("\n\n&c+ &4").append(hidden).append(" Hidden"); - component.setHoverEvent(new HoverEvent(ChatColors.color(builder.toString()))); - - component.sendMessage((Player) sender); - } - else { - int hidden = 0; - - for (Map.Entry entry : timings) { - if (!chunksSkipped.contains(entry.getKey())) { - if (entry.getValue() > 0) { - sender.sendMessage(" " + formatChunk(entry.getKey()) + " - " + (chunkItemCount.getOrDefault(entry.getKey(), 0)) + "x (" + toMillis(entry.getValue()) + ")"); - } - else hidden++; - } - } - - sender.sendMessage(ChatColors.color("&c+ &4" + hidden + " Hidden")); - } - } - - private String formatChunk(String chunk) { - String[] components = PatternUtils.SEMICOLON.split(chunk); - return components[0] + " [" + components[2] + ',' + components[3] + ']'; - } - - public long getTimings(Block b) { - return blockTimings.getOrDefault(b.getLocation(), 0L); - } - - public long getTimings(String item) { - return machineTimings.getOrDefault(item, 0L); - } - - public long getTimings(Chunk c) { - return chunkTimings.getOrDefault(c.toString(), 0L); - } + chunkTimings.put(tickedChunk, System.nanoTime() - timestamp2); + } + } - public void addBlockTimings(Location l, long time) { - blockTimings.put(l, time); - } - - public boolean isHalted() { - return halted; - } - - public void halt() { - halted = true; - } + for (Map.Entry entry : move.entrySet()) { + BlockStorage._integrated_moveLocationInfo(entry.getKey(), entry.getValue()); + } + move.clear(); - private String toMillis(long time) { - return decimalFormat.format(time / 1000000F) + "ms"; - } - - @Override - public String toString() { - return "TickerTask {\n" - + " HALTED = " + halted + "\n" - + " tickers = " + tickers + "\n" - + " move = " + move + "\n" - + " delete = " + delete + "\n" - + " chunks = " + chunkItemCount + "\n" - + " machines = " + machineCount + "\n" - + " machinetime = " + machineTimings + "\n" - + " chunktime = " + chunkTimings + "\n" - + " skipped = " + chunksSkipped + "\n" - + "}"; - } + Iterator iterator = tickers.iterator(); + while (iterator.hasNext()) { + iterator.next().startNewTick(); + iterator.remove(); + } - public void queueMove(Location from, Location to) { - move.put(from, to); - } + time = System.nanoTime() - timestamp; + running = false; + } - public void queueDelete(Location l, boolean destroy) { - delete.put(l, destroy); - } + private void reportErrors(Location l, SlimefunItem item, Exception x, int errors) { + errors++; + + if (errors == 1) { + // Generate a new Error-Report + new ErrorReport(x, l, item); + + buggedBlocks.put(l, errors); + } + else if (errors == 4) { + Slimefun.getLogger().log(Level.SEVERE, "X: {0} Y: {1} Z: {2} ({3})", new Object[] { l.getBlockX(), l.getBlockY(), l.getBlockZ(), item.getID() }); + Slimefun.getLogger().log(Level.SEVERE, "has thrown 4 Exceptions in the last 4 Ticks, the Block has been terminated."); + Slimefun.getLogger().log(Level.SEVERE, "Check your /plugins/Slimefun/error-reports/ folder for details."); + Slimefun.getLogger().log(Level.SEVERE, " "); + + BlockStorage._integrated_removeBlockInfo(l, true); + + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> l.getBlock().setType(Material.AIR)); + } + else { + buggedBlocks.put(l, errors); + } + } + + public String getTime() { + return toMillis(time); + } + + public void info(CommandSender sender) { + 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" + toMillis(time))); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Chunks: &e" + chunks)); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticked Machines: &e" + machines)); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Skipped Machines: &e" + skipped)); + sender.sendMessage(""); + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticking Machines:")); + + List> timings = machineCount.keySet().stream().map(key -> new AbstractMap.SimpleEntry<>(key, machineTimings.getOrDefault(key, 0L))).sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())).collect(Collectors.toList()); + + if (sender instanceof Player) { + ChatComponent component = new ChatComponent(ChatColors.color(" &7&oHover for more Info")); + StringBuilder builder = new StringBuilder(); + int hidden = 0; + + for (Map.Entry entry : timings) { + int count = machineCount.get(entry.getKey()); + + if (entry.getValue() > 500_000) { + builder.append("\n&c").append(entry.getKey()).append(" - ").append(count).append("x &7(").append(toMillis(entry.getValue())).append(", ").append(toMillis(entry.getValue() / count)).append(" avg/machine)"); + } + else hidden++; + } + + builder.append("\n\n&c+ &4").append(hidden).append(" Hidden"); + component.setHoverEvent(new HoverEvent(ChatColors.color(builder.toString()))); + + component.sendMessage((Player) sender); + } + else { + int hidden = 0; + + for (Map.Entry entry : timings) { + int count = machineCount.get(entry.getKey()); + if (entry.getValue() > 500_000) { + sender.sendMessage(" " + entry.getKey() + " - " + count + "x (" + toMillis(entry.getValue()) + ", " + toMillis(entry.getValue() / count) + " avg/machine)"); + } + else hidden++; + } + + sender.sendMessage("+ " + hidden + " Hidden"); + } + + sender.sendMessage(""); + sender.sendMessage(ChatColors.color("&6Ticking Chunks:")); + + timings = chunkTimings.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).collect(Collectors.toList()); + + if (sender instanceof Player) { + ChatComponent component = new ChatComponent(ChatColors.color(" &7&oHover for more Info")); + StringBuilder builder = new StringBuilder(); + int hidden = 0; + + for (Map.Entry entry : timings) { + if (!chunksSkipped.contains(entry.getKey())) { + if (entry.getValue() > 0) { + builder.append("\n&c").append(formatChunk(entry.getKey())).append(" - ").append(chunkItemCount.getOrDefault(entry.getKey(), 0)).append("x &7(").append(toMillis(entry.getValue())).append(')'); + } + else hidden++; + } + } + + builder.append("\n\n&c+ &4").append(hidden).append(" Hidden"); + component.setHoverEvent(new HoverEvent(ChatColors.color(builder.toString()))); + + component.sendMessage((Player) sender); + } + else { + int hidden = 0; + + for (Map.Entry entry : timings) { + if (!chunksSkipped.contains(entry.getKey())) { + if (entry.getValue() > 0) { + sender.sendMessage(" " + formatChunk(entry.getKey()) + " - " + (chunkItemCount.getOrDefault(entry.getKey(), 0)) + "x (" + toMillis(entry.getValue()) + ")"); + } + else hidden++; + } + } + + sender.sendMessage(ChatColors.color("&c+ &4" + hidden + " Hidden")); + } + } + + private String formatChunk(String chunk) { + String[] components = PatternUtils.SEMICOLON.split(chunk); + return components[0] + " [" + components[2] + ',' + components[3] + ']'; + } + + public long getTimings(Block b) { + return blockTimings.getOrDefault(b.getLocation(), 0L); + } + + public long getTimings(String item) { + return machineTimings.getOrDefault(item, 0L); + } + + public long getTimings(Chunk c) { + return chunkTimings.getOrDefault(c.toString(), 0L); + } + + public void addBlockTimings(Location l, long time) { + blockTimings.put(l, time); + } + + public boolean isHalted() { + return halted; + } + + public void halt() { + halted = true; + } + + private String toMillis(long time) { + return decimalFormat.format(time / 1000000F) + "ms"; + } + + @Override + public String toString() { + return "TickerTask {\n" + " HALTED = " + halted + "\n" + " tickers = " + tickers + "\n" + " move = " + move + "\n" + " delete = " + delete + "\n" + " chunks = " + chunkItemCount + "\n" + " machines = " + machineCount + "\n" + " machinetime = " + machineTimings + "\n" + " chunktime = " + chunkTimings + "\n" + " skipped = " + chunksSkipped + "\n" + "}"; + } + + public void queueMove(Location from, Location to) { + move.put(from, to); + } + + public void queueDelete(Location l, boolean destroy) { + delete.put(l, destroy); + } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java index dbc5ef605..585d320d1 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/NumberUtils.java @@ -25,7 +25,7 @@ public final class NumberUtils { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date.replace('T', ' ').replace("Z", "")); } catch (ParseException x) { - Slimefun.getLogger().log(Level.SEVERE, "An Error occured while parsing a GitHub-Date for Slimefun " + SlimefunPlugin.getVersion(), x); + Slimefun.getLogger().log(Level.SEVERE, x, () -> "An Error occured while parsing a GitHub-Date for Slimefun " + SlimefunPlugin.getVersion()); return null; } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Lists/RecipeType.java b/src/main/java/me/mrCookieSlime/Slimefun/Lists/RecipeType.java index 0a4ad3bd2..7e8f0bc7a 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Lists/RecipeType.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Lists/RecipeType.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.Locale; import java.util.Set; import java.util.function.BiConsumer; -import java.util.logging.Level; import org.bukkit.ChatColor; import org.bukkit.Keyed; @@ -25,7 +24,6 @@ import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.MultiBlockMachine; -import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; public class RecipeType implements Keyed { @@ -153,18 +151,11 @@ public class RecipeType implements Keyed { } private static void registerMobDrop(ItemStack[] recipe, ItemStack output) { - String mob = null; - - try { - mob = ChatColor.stripColor(recipe[4].getItemMeta().getDisplayName()).toUpperCase().replace(' ', '_'); - EntityType entity = EntityType.valueOf(mob); - Set dropping = SlimefunPlugin.getRegistry().getMobDrops().getOrDefault(entity, new HashSet<>()); - dropping.add(output); - SlimefunPlugin.getRegistry().getMobDrops().put(entity, dropping); - } - catch (Exception x) { - Slimefun.getLogger().log(Level.WARNING, "An Exception occured when setting a Drop for the Mob Type: \"" + mob + "\"", x); - } + String mob = ChatColor.stripColor(recipe[4].getItemMeta().getDisplayName()).toUpperCase().replace(' ', '_'); + EntityType entity = EntityType.valueOf(mob); + Set dropping = SlimefunPlugin.getRegistry().getMobDrops().getOrDefault(entity, new HashSet<>()); + dropping.add(output); + SlimefunPlugin.getRegistry().getMobDrops().put(entity, dropping); } public static List getRecipeInputs(SlimefunMachine machine) { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunMachine.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunMachine.java index 262bf7784..0581f9a42 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunMachine.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunMachine.java @@ -2,7 +2,6 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.List; import org.bukkit.Material; diff --git a/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java b/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java index c285ca498..f172f050d 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/SlimefunPlugin.java @@ -188,7 +188,7 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { SlimefunItemSetup.setup(this); } catch (Throwable x) { - getLogger().log(Level.SEVERE, "An Error occured while initializing SlimefunItems for Slimefun " + getVersion(), x); + getLogger().log(Level.SEVERE, x, () -> "An Error occured while initializing SlimefunItems for Slimefun " + getVersion()); } getLogger().log(Level.INFO, "Loading Researches..."); @@ -197,7 +197,7 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { ResearchSetup.setupResearches(); } catch (Throwable x) { - getLogger().log(Level.SEVERE, "An Error occured while initializing Slimefun Researches for Slimefun " + getVersion(), x); + getLogger().log(Level.SEVERE, x, () -> "An Error occured while initializing Slimefun Researches for Slimefun " + getVersion()); } registry.setResearchingEnabled(getResearchCfg().getBoolean("enable-researching")); @@ -313,8 +313,8 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { try { ticker.run(); } - catch (Exception x) { - getLogger().log(Level.SEVERE, "An Exception was caught while ticking the Block Tickers Task for Slimefun v" + getVersion(), x); + catch (Throwable x) { + getLogger().log(Level.SEVERE, x, () -> "An Exception was caught while ticking the Block Tickers Task for Slimefun v" + getVersion()); ticker.abortTick(); } }, 100L, config.getInt("URID.custom-ticker-delay")); @@ -370,8 +370,8 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { getLogger().log(Level.SEVERE, "### Slimefun was not installed correctly!"); getLogger().log(Level.SEVERE, "### You are using the wrong version of Minecraft!"); getLogger().log(Level.SEVERE, "###"); - getLogger().log(Level.SEVERE, "### You are using Minecraft " + ReflectionUtils.getVersion()); - getLogger().log(Level.SEVERE, "### but Slimefun v" + getDescription().getVersion() + " requires you to be using"); + getLogger().log(Level.SEVERE, "### You are using Minecraft {0}", ReflectionUtils.getVersion()); + getLogger().log(Level.SEVERE, "### but Slimefun v{0} requires you to be using", getDescription().getVersion()); getLogger().log(Level.SEVERE, "### Minecraft {0}", String.join(" / ", MinecraftVersion.getSupportedVersions())); return true; } @@ -409,11 +409,11 @@ public final class SlimefunPlugin extends JavaPlugin implements SlimefunAddon { storage.save(true); } else { - getLogger().log(Level.SEVERE, "Could not save Slimefun Blocks for World \"" + world.getName() + "\""); + getLogger().log(Level.SEVERE, "Could not save Slimefun Blocks for World \"{0}\"", world.getName()); } } catch (Exception x) { - getLogger().log(Level.SEVERE, "An Error occured while saving Slimefun-Blocks in World '" + world.getName() + "' for Slimefun " + getVersion(), x); + getLogger().log(Level.SEVERE, x, () -> "An Error occured while saving Slimefun-Blocks in World '" + world.getName() + "' for Slimefun " + getVersion()); } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/GuideHandler.java b/src/main/java/me/mrCookieSlime/Slimefun/api/GuideHandler.java index eec0c725e..211ee1570 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/GuideHandler.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/GuideHandler.java @@ -4,30 +4,28 @@ import java.util.List; import org.bukkit.entity.Player; -import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile; import me.mrCookieSlime.CSCoreLibPlugin.PlayerRunnable; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; @Deprecated public interface GuideHandler { - - public abstract void addEntry(List texts, List tooltips); - public abstract PlayerRunnable getRunnable(); - public abstract int getTier(); - public abstract boolean trackHistory(); - public abstract int next(Player p, int index, ChestMenu menu); + public abstract void addEntry(List texts, List tooltips); - default PlayerRunnable getRunnable(boolean book) { - return this.getRunnable(); - } - - default void run(Player p, boolean survival, boolean book) { - this.getRunnable(book).run(p); - - if (survival && this.trackHistory()) { - PlayerProfile.get(p, profile -> profile.getGuideHistory().add(this)); - } - } + public abstract PlayerRunnable getRunnable(); + + public abstract int getTier(); + + public abstract boolean trackHistory(); + + public abstract int next(Player p, int index, ChestMenu menu); + + default PlayerRunnable getRunnable(boolean book) { + return this.getRunnable(); + } + + default void run(Player p, boolean survival, boolean book) { + this.getRunnable(book).run(p); + } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/SlimefunItemStack.java b/src/main/java/me/mrCookieSlime/Slimefun/api/SlimefunItemStack.java index 9c1b37413..f560640f8 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/SlimefunItemStack.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/SlimefunItemStack.java @@ -19,26 +19,24 @@ import org.bukkit.potion.PotionEffectType; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; import io.github.thebusybiscuit.cscorelib2.item.ImmutableItemMeta; import io.github.thebusybiscuit.cscorelib2.skull.SkullItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; public class SlimefunItemStack extends CustomItem { private String id; private ImmutableItemMeta immutableMeta; - private final String texture; + private String texture = null; public SlimefunItemStack(String id, Material type, String name, String... lore) { super(type, name, lore); - texture = null; setID(id); } public SlimefunItemStack(String id, Material type, Color color, String name, String... lore) { super(new ItemStack(type), color, name, lore); - texture = null; setID(id); } @@ -69,28 +67,23 @@ public class SlimefunItemStack extends CustomItem { } }); - texture = null; - setID(id); } public SlimefunItemStack(String id, ItemStack item, String name, String... lore) { super(item, name, lore); - texture = null; setID(id); } public SlimefunItemStack(String id, ItemStack item) { super(item); - texture = null; setID(id); } public SlimefunItemStack(String id, ItemStack item, Consumer consumer) { super(item, consumer); - texture = null; setID(id); } @@ -104,13 +97,12 @@ public class SlimefunItemStack extends CustomItem { consumer.accept(meta); }); - texture = null; setID(id); } public SlimefunItemStack(String id, String texture, String name, String... lore) { super(getSkull(texture), name, lore); - this.texture = texture; + this.texture = getTexture(texture); setID(id); } @@ -124,14 +116,14 @@ public class SlimefunItemStack extends CustomItem { consumer.accept(meta); }); - this.texture = texture; + this.texture = getTexture(texture); setID(id); } public SlimefunItemStack(String id, String texture, Consumer consumer) { super(getSkull(texture), consumer); - this.texture = texture; + this.texture = getTexture(texture); setID(id); } @@ -178,11 +170,15 @@ public class SlimefunItemStack extends CustomItem { return item; } - public Optional getBase64Texture() { + public Optional getSkullTexture() { return Optional.ofNullable(texture); } private static ItemStack getSkull(String texture) { + return SkullItem.fromBase64(getTexture(texture)); + } + + private static String getTexture(String texture) { String base64 = texture; // At this point we can be sure it's not a base64 encoded texture @@ -190,7 +186,7 @@ public class SlimefunItemStack extends CustomItem { base64 = Base64.getEncoder().encodeToString(("{\"textures\":{\"SKIN\":{\"url\":\"http://textures.minecraft.net/texture/" + texture + "\"}}}").getBytes()); } - return SkullItem.fromBase64(base64); + return base64; } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java b/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java index f4386ffa7..806be8009 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java @@ -195,14 +195,14 @@ public class CargoNet extends Network { Slimefun.runSync(() -> run(b, providers, destinations, output)); } } - + private void run(Block b, Set providers, Set destinations, Map> output) { if (BlockStorage.getLocationInfo(b.getLocation(), "visualizer") == null) { display(); } // Chest Terminal Code - if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) { + if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) { for (Location bus : imports) { BlockMenu menu = BlockStorage.getInventory(bus); @@ -408,7 +408,7 @@ public class CargoNet extends Network { } // Chest Terminal Code - if (SlimefunPlugin.getNetworkManager().isChestTerminalInstalled()) { + if (SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled()) { List items = new ArrayList<>(); for (Location l : providers) {