diff --git a/pom.xml b/pom.xml index 6a1fd09d5..6274bb7e6 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,10 @@ CodeMC https://repo.codemc.org/repository/maven-public + + placeholderapi-repo + http://repo.extendedclip.com/content/repositories/placeholderapi/ + @@ -109,12 +113,6 @@ 1.14.2-R0.1-SNAPSHOT provided - - com.sk89q.worldedit - worldedit-bukkit - 7.0.1 - provided - com.github.TheBusyBiscuit CS-CoreLib @@ -133,6 +131,18 @@ 1.5 compile + + com.sk89q.worldedit + worldedit-bukkit + 7.0.1 + provided + + + me.clip + placeholderapi + 2.10.3 + provided + me.minebuilders clearlag-core diff --git a/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java b/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java index 56803e9ab..7edd12b1e 100644 --- a/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java +++ b/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java @@ -41,7 +41,7 @@ public class RitualAnimation implements Runnable { this.output = output; this.pedestals = pedestals; this.items = items; - this.particles = new ArrayList(); + this.particles = new ArrayList<>(); this.running = true; this.stage = 0; @@ -54,26 +54,31 @@ public class RitualAnimation implements Runnable { @Override public void run() { idle(); + if(!checkLockedItems()) { abort(); return; } + if(this.stage == 36) { finish(); return; } + if(this.stage > 0 && this.stage % 4 == 0) { checkPedestal(pedestals.get(this.stage / 4 - 1)); } + this.stage += 1; SlimefunStartup.instance.getServer().getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, this, 8); } private boolean checkLockedItems() { - - for(Item itm:this.itemLock.keySet()) - if(itm.getLocation().distance(this.itemLock.get(itm)) > 0.3) + for (Item item : this.itemLock.keySet()) { + if (item.getLocation().distance(this.itemLock.get(item)) > 0.3) { return false; + } + } return true; } @@ -82,6 +87,7 @@ public class RitualAnimation implements Runnable { try { l.getWorld().spawnParticle(Particle.SPELL_WITCH, l,16, 1.2F, 0F, 1.2F); l.getWorld().spawnParticle(Particle.FIREWORKS_SPARK,l,8, 0.2F, 0F, 0.2F); + for (Location l2: particles) { l.getWorld().spawnParticle(Particle.ENCHANTMENT_TABLE, l2,16, 0.3F, 0.2F, 0.3F); l.getWorld().spawnParticle(Particle.CRIT_MAGIC,l2,8, 0.3F, 0.2F, 0.3F); @@ -94,11 +100,9 @@ public class RitualAnimation implements Runnable { private void checkPedestal(Block pedestal) { Item item = AncientAltarListener.findItem(pedestal); - if(item == null || itemLock.remove(item) == null) { abort(); } - else { particles.add(pedestal.getLocation().add(0.5, 1.5, 0.5)); items.add(AncientAltarListener.fixItemStack(item.getItemStack(), item.getCustomName())); @@ -121,7 +125,7 @@ public class RitualAnimation implements Runnable { private void abort() { running = false; - pedestals.forEach((pblock)->{ + pedestals.forEach((pblock)-> { Variables.altarinuse.remove(pblock.getLocation()); }); diff --git a/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java b/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java index 10eb7ad2d..99771fec1 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java +++ b/src/me/mrCookieSlime/Slimefun/Android/ProgrammableAndroid.java @@ -7,7 +7,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -48,7 +48,7 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; import me.mrCookieSlime.ExoticGarden.ExoticGarden; import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Android.ScriptComparators.ScriptReputationSorter; +import me.mrCookieSlime.Slimefun.Android.comparators.ScriptReputationSorter; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; @@ -249,7 +249,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { if (BlockStorage.getLocationInfo(b.getLocation(), "paused").equals("false")) { float fuel = Float.parseFloat(BlockStorage.getLocationInfo(b.getLocation(), "fuel")); - if (fuel == 0) { + if (fuel < 0.001) { ItemStack item = BlockStorage.getInventory(b).getItemInSlot(43); if (item != null) { for (MachineFuel recipe: recipes) { @@ -381,13 +381,13 @@ public abstract class ProgrammableAndroid extends SlimefunItem { for (int slot: getOutputSlots()) { ItemStack stack = BlockStorage.getInventory(b).getItemInSlot(slot); if (stack != null) { - Map items = d.getInventory().addItem(stack); - if (items.isEmpty()) BlockStorage.getInventory(b).replaceExistingItem(slot, null); + Optional optional = d.getInventory().addItem(stack).values().stream().findFirst(); + + if (optional.isPresent()) { + BlockStorage.getInventory(b).replaceExistingItem(slot, optional.get()); + } else { - for (Map.Entry entry: items.entrySet()) { - BlockStorage.getInventory(b).replaceExistingItem(slot, entry.getValue()); - break; - } + BlockStorage.getInventory(b).replaceExistingItem(slot, null); } } } @@ -1257,7 +1257,7 @@ public abstract class ProgrammableAndroid extends SlimefunItem { public float getScriptRating(Config script) { int positive = getScriptRating(script, true) + 1; int negative = getScriptRating(script, false); - return Math.round((positive / (positive + negative)) * 100.0f) / 100.0f; + return Math.round((positive / (double) (positive + negative)) * 100.0f) / 100.0f; } private int getScriptRating(Config script, boolean positive) { diff --git a/src/me/mrCookieSlime/Slimefun/Android/ScriptComparators/ScriptDownloadSorter.java b/src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptDownloadSorter.java similarity index 51% rename from src/me/mrCookieSlime/Slimefun/Android/ScriptComparators/ScriptDownloadSorter.java rename to src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptDownloadSorter.java index 69ffb69a0..a2b133ee0 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/ScriptComparators/ScriptDownloadSorter.java +++ b/src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptDownloadSorter.java @@ -1,18 +1,11 @@ -package me.mrCookieSlime.Slimefun.Android.ScriptComparators; +package me.mrCookieSlime.Slimefun.Android.comparators; import java.util.Comparator; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.Slimefun.Android.ProgrammableAndroid; public class ScriptDownloadSorter implements Comparator { - ProgrammableAndroid android; - - public ScriptDownloadSorter(ProgrammableAndroid programmableAndroid) { - this.android = programmableAndroid; - } - @Override public int compare(Config c1, Config c2) { return (int) (c2.getInt("downloads") - c1.getInt("downloads")); diff --git a/src/me/mrCookieSlime/Slimefun/Android/ScriptComparators/ScriptReputationSorter.java b/src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptReputationSorter.java similarity index 64% rename from src/me/mrCookieSlime/Slimefun/Android/ScriptComparators/ScriptReputationSorter.java rename to src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptReputationSorter.java index 64746f171..082feeb0b 100644 --- a/src/me/mrCookieSlime/Slimefun/Android/ScriptComparators/ScriptReputationSorter.java +++ b/src/me/mrCookieSlime/Slimefun/Android/comparators/ScriptReputationSorter.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Android.ScriptComparators; +package me.mrCookieSlime.Slimefun.Android.comparators; import java.util.Comparator; @@ -7,10 +7,10 @@ import me.mrCookieSlime.Slimefun.Android.ProgrammableAndroid; public class ScriptReputationSorter implements Comparator { - ProgrammableAndroid android; + private ProgrammableAndroid android; - public ScriptReputationSorter(ProgrammableAndroid programmableAndroid) { - this.android = programmableAndroid; + public ScriptReputationSorter(ProgrammableAndroid android) { + this.android = android; } @Override diff --git a/src/me/mrCookieSlime/Slimefun/Hashing/ItemHash.java b/src/me/mrCookieSlime/Slimefun/Hashing/ItemHash.java deleted file mode 100644 index 5c88c7046..000000000 --- a/src/me/mrCookieSlime/Slimefun/Hashing/ItemHash.java +++ /dev/null @@ -1,70 +0,0 @@ -package me.mrCookieSlime.Slimefun.Hashing; - -import java.math.BigInteger; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.HashMap; -import java.util.Map; - -import org.bukkit.Bukkit; - -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; - -public class ItemHash { - - public static MessageDigest digest; - public static int LENGTH; - public static Map map = new HashMap<>(); - - static { - try { - digest = MessageDigest.getInstance("SHA"); - LENGTH = hash("The Busy Biscuit").length(); - } catch (NoSuchAlgorithmException e) { - System.out.println("FATAL Security ERROR - Slimefun was disabled."); - Bukkit.getPluginManager().disablePlugin(SlimefunStartup.instance); - e.printStackTrace(); - } - } - - public static String hash(String input) { - digest.update(input.getBytes()); - byte[] hash = digest.digest(); - return new BigInteger(1, hash).toString(16); - } - - public static String toString(SlimefunItem item) { - StringBuilder builder = new StringBuilder(LENGTH * 2); - - for (char c: item.getHash().toCharArray()) { - builder.append('\u00a7'); - builder.append(c); - } - - return builder.toString(); - } - public static SlimefunItem fromString(String input) { - if (input == null || input.length() != LENGTH * 2) return null; - - String hex = input.replaceAll("ยง", ""); - - if (hex.length() != LENGTH || !map.containsKey(hex)) return null; - - return map.get(hex); - } - - public static void register(SlimefunItem item) { - String hash = hash(item.getID()); - - if (map.containsKey(hash) && !item.getID().equals(map.get(hash).getHash())) { - System.out.println("FATAL Security ERROR - Slimefun was disabled."); - Bukkit.getPluginManager().disablePlugin(SlimefunStartup.instance); - throw new IllegalStateException("Hash Collision: " + hash); - } - - item.setHash(hash); - map.put(hash, item); - } - -} diff --git a/src/me/mrCookieSlime/Slimefun/Misc/PostSlimefunLoadingHandler.java b/src/me/mrCookieSlime/Slimefun/Misc/PostSlimefunLoadingHandler.java index 1e4f39672..e75244127 100644 --- a/src/me/mrCookieSlime/Slimefun/Misc/PostSlimefunLoadingHandler.java +++ b/src/me/mrCookieSlime/Slimefun/Misc/PostSlimefunLoadingHandler.java @@ -4,6 +4,7 @@ import java.util.List; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +@FunctionalInterface public interface PostSlimefunLoadingHandler { public void run(List preloaded, List loaded, List postloaded); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/Charge.java b/src/me/mrCookieSlime/Slimefun/Objects/Charge.java index edf8090b0..b7287aa5d 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/Charge.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/Charge.java @@ -2,7 +2,8 @@ package me.mrCookieSlime.Slimefun.Objects; public class Charge { - double charge, capacity; + private double charge; + private double capacity; public Charge(double charge, double capacity) { this.charge = charge; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/LockedCategory.java b/src/me/mrCookieSlime/Slimefun/Objects/LockedCategory.java index 5f0932150..2e2703c52 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/LockedCategory.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/LockedCategory.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.List; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; import org.bukkit.entity.Player; @@ -111,11 +112,13 @@ public class LockedCategory extends Category { * @since 4.0 */ public boolean hasUnlocked(Player p) { + PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); + for (Category category: parents) { for (SlimefunItem item: category.getItems()) { if (Slimefun.isEnabled(p, item.getItem(), false) && Slimefun.hasPermission(p, item, false)) { if (item.getResearch() != null) { - if (!item.getResearch().hasUnlocked(p)) return false; + if (!profile.hasUnlocked(item.getResearch())) return false; } } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/MultiBlock.java b/src/me/mrCookieSlime/Slimefun/Objects/MultiBlock.java index a5490d9d5..a4854f297 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/MultiBlock.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/MultiBlock.java @@ -11,7 +11,7 @@ import org.bukkit.Material; public class MultiBlock { - public static List list = new ArrayList(); + public static List list = new ArrayList<>(); Material[] blocks; Material trigger; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/Research.java b/src/me/mrCookieSlime/Slimefun/Objects/Research.java index 670d9aef6..3eb997786 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/Research.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/Research.java @@ -1,21 +1,13 @@ package me.mrCookieSlime.Slimefun.Objects; -import java.io.File; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; +import java.util.Set; import java.util.UUID; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable; -import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.FireworkShow; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Events.ResearchUnlockEvent; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Setup.Messages; -import me.mrCookieSlime.Slimefun.Setup.ResearchSetup; -import me.mrCookieSlime.Slimefun.api.Slimefun; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; @@ -23,6 +15,16 @@ import org.bukkit.Sound; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable; +import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.FireworkShow; +import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.Events.ResearchUnlockEvent; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.ResearchSetup; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; +import me.mrCookieSlime.Slimefun.api.Slimefun; + /** * Statically handles researches. Represents a research, which is bound to one * {@link SlimefunItem} or more and require XP levels to unlock this/these item(s). @@ -42,18 +44,26 @@ public class Research { * Whether researching is enabled or not; * @since 4.0 */ - public static boolean enabled; + public static boolean enableResearching; + /** * Contains all the registered researches; * @since 4.0 * @see ResearchSetup */ - public static List list = new ArrayList<>(); + public static List list = new LinkedList<>(); + + /** + * Contains all Research Titles + */ + public static List titles; + /** * Contains all the players (UUIDs) that are currently unlocking a research. * @since 4.0 */ - public static List researching = new ArrayList<>(); + public static Set researching = new HashSet<>(); + /** * Whether researching in creative is free. * @since 4.0 @@ -64,6 +74,7 @@ public class Research { private String name; private List items; private int cost; + private boolean enabled; /** * The constructor for a Research. @@ -88,6 +99,11 @@ public class Research { this.name = name; this.cost = cost; this.items = new ArrayList<>(); + this.enabled = true; + } + + public boolean isEnabled() { + return enableResearching && enabled; } /** @@ -179,7 +195,7 @@ public class Research { * * @since 4.0 */ - public List getEffectedItems() { + public List getAffectedItems() { return items; } @@ -192,6 +208,7 @@ public class Research { * @since 4.0 * @see #hasUnlocked(UUID) */ + @Deprecated public boolean hasUnlocked(Player p) { return hasUnlocked(p.getUniqueId()); } @@ -205,10 +222,9 @@ public class Research { * @since 4.0 * @see #hasUnlocked(Player) */ + @Deprecated public boolean hasUnlocked(UUID uuid) { - if (!enabled) return true; - if (!SlimefunStartup.getResearchCfg().getBoolean(this.id + ".enabled")) return true; - return new Config(new File("data-storage/Slimefun/Players/" + uuid.toString() + ".yml")).contains("researches." + this.id); + return PlayerProfile.fromUUID(uuid).hasUnlocked(this); } /** @@ -220,8 +236,7 @@ public class Research { * @since 4.1.10 */ public boolean canUnlock(Player p) { - if (!enabled) return true; - if (!SlimefunStartup.getResearchCfg().getBoolean(this.id + ".enabled")) return true; + if (!isEnabled()) return true; return (p.getGameMode() == GameMode.CREATIVE && creative_research) || p.getLevel() >= this.cost; } @@ -232,10 +247,9 @@ public class Research { * * @since 4.0 */ + @Deprecated public void lock(Player p) { - Config cfg = new Config(new File("data-storage/Slimefun/Players/" + p.getUniqueId() + ".yml")); - cfg.setValue("researches." + id, null); - cfg.save(); + PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, false); Messages.local.sendTranslation(p, "commands.research.reset-target", true); } @@ -251,34 +265,39 @@ public class Research { if (!hasUnlocked(p)) { ResearchUnlockEvent event = new ResearchUnlockEvent(p, this); Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) { - final int research = this.id; if (instant) { - Config cfg = new Config(new File("data-storage/Slimefun/Players/" + p.getUniqueId() + ".yml")); - cfg.setValue("researches." + research, true); - cfg.save(); + PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true); + Messages.local.sendTranslation(p, "messages.unlocked", true, new Variable("%research%", getName())); - if (SlimefunStartup.getCfg().getBoolean("options.research-give-fireworks")) + if (SlimefunStartup.getCfg().getBoolean("options.research-give-fireworks")) { FireworkShow.launchRandom(p, 1); - } else if (!researching.contains(p.getUniqueId())){ + } + } + else if (!researching.contains(p.getUniqueId())){ researching.add(p.getUniqueId()); Messages.local.sendTranslation(p, "messages.research.start", true, new Variable("%research%", getName())); + for (int i = 1; i < research_progress.length + 1; i++) { int j = i; + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { p.playSound(p.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 1F); Messages.local.sendTranslation(p, "messages.research.progress", true, new Variable("%research%", getName()), new Variable("%progress%", research_progress[j - 1] + "%")); - }, i*20L); + }, i * 20L); } + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - Config cfg = new Config(new File("data-storage/Slimefun/Players/" + p.getUniqueId() + ".yml")); - cfg.setValue("researches." + research, true); - cfg.save(); + PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true); Messages.local.sendTranslation(p, "messages.unlocked", true, new Variable("%research%", getName())); - if (SlimefunStartup.getCfg().getBoolean("options.research-unlock-fireworks")) + + if (SlimefunStartup.getCfg().getBoolean("options.research-unlock-fireworks")) { FireworkShow.launchRandom(p, 1); + } + researching.remove(p.getUniqueId()); - }, (research_progress.length + 1)*20L); + }, (research_progress.length + 1) * 20L); } } } @@ -308,6 +327,7 @@ public class Research { this.name = SlimefunStartup.getResearchCfg().getString(this.getID() + ".name"); this.cost = SlimefunStartup.getResearchCfg().getInt(this.getID() + ".cost"); + this.enabled = SlimefunStartup.getResearchCfg().getBoolean(this.getID() + ".enabled"); list.add(this); if (SlimefunStartup.getCfg().getBoolean("options.print-out-loading")) System.out.println("[Slimefun] Loaded Research \"" + this.getName() + "\""); @@ -346,15 +366,12 @@ public class Research { * @since 4.0 * @see #getTitle(Player, List) */ + @Deprecated public static void sendStats(CommandSender sender, Player p) { - List researched = new ArrayList(); - int levels = 0; - for (Research r: list()) { - if (r.hasUnlocked(p)) { - researched.add(r); - levels = levels + r.getLevel(); - } - } + PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); + Set researched = profile.getResearches(); + int levels = researched.stream().mapToInt(r -> r.getCost()).sum(); + String progress = String.valueOf(Math.round(((researched.size() * 100.0f) / list().size()) * 100.0f) / 100.0f); if (Float.parseFloat(progress) < 16.0F) progress = "&4" + progress + " &r% "; else if (Float.parseFloat(progress) < 32.0F) progress = "&c" + progress + " &r% "; @@ -381,10 +398,11 @@ public class Research { * @since 4.0 * @see #sendStats(CommandSender, Player) */ - public static String getTitle(Player p, List researched) { - int index = Math.round(Float.valueOf(String.valueOf(Math.round(((researched.size() * 100.0f) / list().size()) * 100.0f) / 100.0f)) / 100.0F) * SlimefunStartup.getCfg().getStringList("research-ranks").size(); + @Deprecated + public static String getTitle(Player p, Set researched) { + int index = Math.round(Float.valueOf(String.valueOf(Math.round(((researched.size() * 100.0f) / list().size()) * 100.0f) / 100.0f)) / 100.0F) * titles.size(); if (index > 0) index--; - return SlimefunStartup.getCfg().getStringList("research-ranks").get(index); + return titles.get(index); } /** @@ -411,8 +429,9 @@ public class Research { * @since 4.0 * @see #getResearches(String) */ + @Deprecated public static List getResearches(UUID uuid) { - List researched = new ArrayList(); + List researched = new ArrayList<>(); for (Research r: list()) { if (r.hasUnlocked(uuid)) researched.add(r); } @@ -429,6 +448,7 @@ public class Research { * @since 4.0 * @see #getResearches(UUID) */ + @Deprecated public static List getResearches(String uuid) { return getResearches(UUID.fromString(uuid)); } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java index 271067f56..873e25f21 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java @@ -274,7 +274,7 @@ public class SlimefunItem { } public void bindToResearch(Research r) { - if (r != null) r.getEffectedItems().add(this); + if (r != null) r.getAffectedItems().add(this); this.research = r; } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Talisman.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Talisman.java index 937ec2921..78bbfd972 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Talisman.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/Talisman.java @@ -89,7 +89,7 @@ public class Talisman extends SlimefunItem { } Player p = getPlayerByEventType(e); - if (!pass(p, talisman)) { + if (p == null || !pass(p, talisman)) { return false; } @@ -97,13 +97,17 @@ public class Talisman extends SlimefunItem { if (Slimefun.hasUnlocked(p, talisman.getItem(), true)) { executeTalismanAttributes(e,p,talisman); return true; - } else return false; - } else if (p.getEnderChest().containsAtLeast(talisman.upgrade(), 1)) { + } + else return false; + } + else if (p.getEnderChest().containsAtLeast(talisman.upgrade(), 1)) { if (Slimefun.hasUnlocked(p, talisman.upgrade(), true)) { executeTalismanAttributes(e,p,talisman); return true; - } else return false; - } else return false; + } + else return false; + } + else return false; } @@ -173,6 +177,7 @@ public class Talisman extends SlimefunItem { else if (e instanceof PlayerEvent) return ((PlayerEvent) e).getPlayer(); else if (e instanceof EntityEvent) return (Player) ((EntityEvent) e).getEntity(); else if (e instanceof EnchantItemEvent) return ((EnchantItemEvent) e).getEnchanter(); + return null; } @@ -180,6 +185,7 @@ public class Talisman extends SlimefunItem { for (PotionEffect effect : ((Talisman) talisman).getEffects()) { if (effect != null && p.hasPotionEffect(effect.getType())) return false; } + return true; } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java index 7621e48de..f6bb02d69 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import org.bukkit.Bukkit; @@ -41,8 +42,8 @@ import me.mrCookieSlime.Slimefun.holograms.ReactorHologram; public abstract class AReactor extends SlimefunItem { - public static Map processing = new HashMap(); - public static Map progress = new HashMap(); + public static Map processing = new HashMap<>(); + public static Map progress = new HashMap<>(); private static final BlockFace[] cooling = { @@ -56,7 +57,7 @@ public abstract class AReactor extends SlimefunItem { BlockFace.NORTH_WEST }; - private Set recipes = new HashSet(); + private Set recipes = new HashSet<>(); private static final int[] border = {0, 1, 2, 3, 5, 6, 7, 8, 12, 13, 14, 21, 23}; private static final int[] border_1 = {9, 10, 11, 18, 20, 27, 29, 36, 38, 45, 46, 47}; @@ -446,17 +447,14 @@ public abstract class AReactor extends SlimefunItem { public ItemStack pushItems(Location l, ItemStack item, int[] slots) { Inventory inv = inject(l, slots); - Map map = inv.addItem(item); + Optional optional = inv.addItem(item).values().stream().findFirst(); for (int slot : slots) { BlockStorage.getInventory(l).replaceExistingItem(slot, inv.getItem(slot)); } - for (Map.Entry entry : map.entrySet()) { - return entry.getValue(); - } - - return null; + if (optional.isPresent()) return optional.get(); + else return null; } public abstract ItemStack getProgressBar(); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ChargingBench.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ChargingBench.java index 9350e623c..7098faf85 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ChargingBench.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ChargingBench.java @@ -72,7 +72,7 @@ public class ChargingBench extends AContainer { if (ItemEnergy.getStoredEnergy(stack) < ItemEnergy.getMaxEnergy(stack)) { ChargableBlock.addCharge(b, -getEnergyConsumption()); - float rest = ItemEnergy.addStoredEnergy(stack, getEnergyConsumption() / 2); + float rest = ItemEnergy.addStoredEnergy(stack, getEnergyConsumption() / 2F); if (rest > 0F) { if (fits(b, new ItemStack[] {stack})) { pushItems(b, new ItemStack[] {stack}); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricFurnace.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricFurnace.java index 0db649992..12b736ab1 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricFurnace.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/ElectricFurnace.java @@ -1,36 +1,42 @@ -package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; - -import java.util.Iterator; - -import org.bukkit.Bukkit; -import org.bukkit.inventory.FurnaceRecipe; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.Recipe; - -import me.mrCookieSlime.Slimefun.Lists.RecipeType; -import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; - -public abstract class ElectricFurnace extends AContainer { - - public ElectricFurnace(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { - super(category, item, name, recipeType, recipe); - } - - @Override - public void registerDefaultRecipes() { - Iterator iterator = Bukkit.recipeIterator(); - while (iterator.hasNext()) { - Recipe r = iterator.next(); - if (r instanceof FurnaceRecipe) { - registerRecipe(4, new ItemStack[] {((FurnaceRecipe) r).getInput()}, new ItemStack[] {r.getResult()}); - } - } - } - - @Override - public String getMachineIdentifier() { - return "ELECTRIC_FURNACE"; - } - -} +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; + +import java.util.Iterator; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Tag; +import org.bukkit.inventory.FurnaceRecipe; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Recipe; + +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer; + +public abstract class ElectricFurnace extends AContainer { + + public ElectricFurnace(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, name, recipeType, recipe); + } + + @Override + public void registerDefaultRecipes() { + Iterator iterator = Bukkit.recipeIterator(); + while (iterator.hasNext()) { + Recipe r = iterator.next(); + if (r instanceof FurnaceRecipe) { + registerRecipe(4, new ItemStack[] {((FurnaceRecipe) r).getInput()}, new ItemStack[] {r.getResult()}); + } + } + + //Bukkit Recipe Iterator does not seem to include _LOG's of any type for charcoal... Manually adding them all. + for(Material mat:Tag.LOGS.getValues()) + registerRecipe(4, new ItemStack[] {new ItemStack(mat,1)}, new ItemStack[] {new ItemStack(Material.CHARCOAL, 1)}); + } + + @Override + public String getMachineIdentifier() { + return "ELECTRIC_FURNACE"; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HeatedPressureChamber.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HeatedPressureChamber.java index a0b28f6c5..2d0e051e1 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HeatedPressureChamber.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/HeatedPressureChamber.java @@ -10,6 +10,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; @@ -139,15 +140,14 @@ public abstract class HeatedPressureChamber extends AContainer { super.register(slimefun); } - @SuppressWarnings("deprecation") protected void tick(Block b) { if (isProcessing(b)) { int timeleft = progress.get(b); if (timeleft > 0) { ItemStack item = getProgressBar().clone(); - item.setDurability(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); ItemMeta im = item.getItemMeta(); im.setDisplayName(" "); + ((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks())); List lore = new ArrayList(); lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks())); lore.add(""); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/WitherAssembler.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/WitherAssembler.java index a67255a43..828e6decd 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/WitherAssembler.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/WitherAssembler.java @@ -21,7 +21,6 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; -import me.mrCookieSlime.Slimefun.Setup.SlimefunManager.DataType; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; @@ -194,7 +193,7 @@ public class WitherAssembler extends SlimefunItem { int skulls = 0; for (int slot : getSoulSandSlots()) { - if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true, DataType.ALWAYS)) { + if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true)) { soulsand = soulsand + BlockStorage.getInventory(b).getItemInSlot(slot).getAmount(); if (soulsand > 3) { soulsand = 4; @@ -204,7 +203,7 @@ public class WitherAssembler extends SlimefunItem { } for (int slot : getWitherSkullSlots()) { - if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true, DataType.ALWAYS)) { + if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true)) { skulls = skulls + BlockStorage.getInventory(b).getItemInSlot(slot).getAmount(); if (skulls > 2) { skulls = 3; @@ -215,7 +214,7 @@ public class WitherAssembler extends SlimefunItem { if (soulsand > 3 && skulls > 2) { for (int slot : getSoulSandSlots()) { - if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true, DataType.ALWAYS)) { + if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true)) { final int amount = BlockStorage.getInventory(b).getItemInSlot(slot).getAmount(); if (amount >= soulsand) { BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), soulsand)); @@ -229,7 +228,7 @@ public class WitherAssembler extends SlimefunItem { } for (int slot : getWitherSkullSlots()) { - if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true, DataType.ALWAYS)) { + if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true)) { final int amount = BlockStorage.getInventory(b).getItemInSlot(slot).getAmount(); if (amount >= skulls) { BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), skulls)); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/tasks/MagnetTask.java b/src/me/mrCookieSlime/Slimefun/Objects/tasks/MagnetTask.java index 2fe73ddfd..a99ab1ac7 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/tasks/MagnetTask.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/tasks/MagnetTask.java @@ -1,6 +1,7 @@ package me.mrCookieSlime.Slimefun.Objects.tasks; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Sound; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; @@ -23,5 +24,10 @@ public class MagnetTask extends SlimefunTask { } } } + + @Override + protected boolean cancelTask() { + return super.cancelTask() ? true: p.getGameMode() != GameMode.SPECTATOR; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/tasks/SlimefunTask.java b/src/me/mrCookieSlime/Slimefun/Objects/tasks/SlimefunTask.java index 18f03eb08..2a4f157e4 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/tasks/SlimefunTask.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/tasks/SlimefunTask.java @@ -6,21 +6,23 @@ import org.bukkit.entity.Player; import java.util.UUID; public abstract class SlimefunTask implements Runnable { + protected UUID uuid; protected int id; + protected Player p; - public SlimefunTask(Player p){ + public SlimefunTask(Player p) { + this.p = p; this.uuid = p.getUniqueId(); } - public void setID(int id){ + public void setID(int id) { this.id = id; } @Override public void run() { - if(cancelTask()) - return; + if(cancelTask()) return; executeTask(); } @@ -28,7 +30,7 @@ public abstract class SlimefunTask implements Runnable { * * @return True if task was cancelled. */ - private boolean cancelTask(){ + protected boolean cancelTask(){ if(Bukkit.getPlayer(uuid) == null || Bukkit.getPlayer(uuid).isDead() || !Bukkit.getPlayer(uuid).isSneaking()) { Bukkit.getScheduler().cancelTask(id); return true; diff --git a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java index 6dbc12e1b..41c158646 100644 --- a/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java +++ b/src/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java @@ -1,10 +1,10 @@ package me.mrCookieSlime.Slimefun.Setup; -import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.UUID; import org.bukkit.Bukkit; @@ -22,7 +22,6 @@ import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Dispenser; import org.bukkit.block.Hopper; import org.bukkit.block.data.Ageable; -import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Levelled; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.ArmorStand; @@ -145,8 +144,8 @@ 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.api.Backpacks; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.EnergyNet; @@ -266,9 +265,7 @@ public class SlimefunSetup { 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(); + PlayerProfile.fromUUID(UUID.fromString(id.split("#")[0])).getBackpack(Integer.parseInt(id.split("#")[1])).setSize(size); break; } } @@ -277,9 +274,11 @@ public class SlimefunSetup { if (id.equals("")) { for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { + int backpackID = PlayerProfile.fromUUID(p.getUniqueId()).createBackpack(size).getID(); + ItemMeta im = adding.getItemMeta(); List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, size))); + lore.set(line, lore.get(line).replace("", p.getUniqueId() + "#" + backpackID)); im.setLore(lore); adding.setItemMeta(im); break; @@ -1217,9 +1216,7 @@ public class SlimefunSetup { 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(); + PlayerProfile.fromUUID(UUID.fromString(id.split("#")[0])).getBackpack(Integer.parseInt(id.split("#")[1])).setSize(size); break; } } @@ -1228,9 +1225,11 @@ public class SlimefunSetup { if (id.equals("")) { for (int line = 0; line < adding.getItemMeta().getLore().size(); line++) { if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { + int backpackID = PlayerProfile.fromUUID(p.getUniqueId()).createBackpack(size).getID(); + ItemMeta im = adding.getItemMeta(); List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, size))); + lore.set(line, lore.get(line).replace("", p.getUniqueId() + "#" + backpackID)); im.setLore(lore); adding.setItemMeta(im); break; @@ -1840,9 +1839,11 @@ public class SlimefunSetup { public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PICKAXE_OF_CONTAINMENT, true)) { Block b = e.getBlock(); // Refactored it into this so we don't need to call e.getBlock() all the time. - if (b.getType() != Material.SPAWNER || BlockStorage.hasBlockInfo(b)) return true; + if (b.getType() != Material.SPAWNER) return true; // If the spawner's BlockStorage has BlockInfo, then it's not a vanilla spawner and shouldn't give a broken spawner. ItemStack spawner = SlimefunItems.BROKEN_SPAWNER.clone(); + if(BlockStorage.hasBlockInfo(b)) + spawner = SlimefunItems.REPAIRED_SPAWNER.clone(); ItemMeta im = spawner.getItemMeta(); List lore = im.getLore(); for (int i = 0; i < lore.size(); i++) { @@ -1852,9 +1853,13 @@ public class SlimefunSetup { spawner.setItemMeta(im); b.getLocation().getWorld().dropItemNaturally(b.getLocation(), spawner); e.setExpToDrop(0); + e.setDropItems(false); return true; } - else return false; + else { + if (e.getBlock().getType() == Material.SPAWNER) e.setDropItems(false); + return false; + } } }); @@ -2702,19 +2707,6 @@ public class SlimefunSetup { } else return false; } - }, new BlockBreakHandler() { - - @Override - public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List drops) { - SlimefunItem spawner = BlockStorage.check(e.getBlock()); - if (spawner != null && SlimefunManager.isItemSimiliar(spawner.getItem(), SlimefunItems.REPAIRED_SPAWNER, false)) { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PICKAXE_OF_CONTAINMENT, true)) - return false; - BlockStorage.clearBlockInfo(e.getBlock()); - return true; - } - else return false; - } }); new EnhancedFurnace(1, 1, 1, SlimefunItems.ENHANCED_FURNACE, "ENHANCED_FURNACE", @@ -2909,10 +2901,10 @@ public class SlimefunSetup { return true; } else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.TOME_OF_KNOWLEDGE_SHARING, false)) { - List researches = Research.getResearches(ChatColor.stripColor(item.getItemMeta().getLore().get(1))); - for (Research research: researches) { - research.unlock(p, true); - } + PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); + Set researches = PlayerProfile.fromUUID(UUID.fromString(ChatColor.stripColor(item.getItemMeta().getLore().get(1)))).getResearches(); + researches.forEach((research) -> profile.setResearched(research, true)); + PlayerInventory.consumeItemInHand(p); return true; } diff --git a/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java b/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java index be5b3955e..479d46b5d 100644 --- a/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java +++ b/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java @@ -8,6 +8,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -32,8 +33,6 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; -import me.mrCookieSlime.Slimefun.GitHub.Contributor; -import me.mrCookieSlime.Slimefun.GitHub.IntegerFormat; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Misc.BookDesign; import me.mrCookieSlime.Slimefun.Objects.Category; @@ -49,14 +48,17 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineFuel; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.GuideHandler; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.hooks.github.Contributor; +import me.mrCookieSlime.Slimefun.hooks.github.IntegerFormat; public class SlimefunGuide { public static Map> history = new HashMap<>(); public static int month = 0; - public static List contributors = new ArrayList(); + public static List contributors = new ArrayList<>(); public static int issues = 0; public static int forks = 0; /** @@ -67,7 +69,7 @@ public class SlimefunGuide { public static int code_bytes = 0; public static Date last_update = new Date(); - static boolean all_recipes = true; + protected static boolean all_recipes = true; private static final int category_size = 36; @Deprecated @@ -77,15 +79,12 @@ public class SlimefunGuide { public static ItemStack getItem(BookDesign design) { switch (design) { - case BOOK: { + case BOOK: return new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&aSlimefun Guide &7(Book GUI)", "", "&eRight Click &8\u21E8 &7Browse Items", "&eShift + Right Click &8\u21E8 &7Open Settings / Credits"); - } - case CHEAT_SHEET: { + case CHEAT_SHEET: return new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&cSlimefun Guide &4(Cheat Sheet)", "", "&4&lOnly openable by Admins", "", "&eRight Click &8\u21E8 &7Browse Items", "&eShift + Right Click &8\u21E8 &7Open Settings / Credits"); - } - case CHEST: { + case CHEST: return new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&aSlimefun Guide &7(Chest GUI)", "", "&eRight Click &8\u21E8 &7Browse Items", "&eShift + Right Click &8\u21E8 &7Open Settings / Credits"); - } default: return null; } @@ -423,7 +422,7 @@ public class SlimefunGuide { ); List categories = Slimefun.current_categories; - List handlers = Slimefun.guide_handlers2; + List handlers = Slimefun.guide_handlers.values().stream().flatMap(list -> list.stream()).collect(Collectors.toList()); int index = 9; int pages = 1; @@ -562,12 +561,16 @@ public class SlimefunGuide { texts.add(ChatColor.translateAlternateColorCodes('&', shorten("&7", StringUtils.formatItemName(item.getItem(), false)))); tooltips.add(ChatColor.translateAlternateColorCodes('&', StringUtils.formatItemName(item.getItem(), false) + "\n&c&lLOCKED\n\n&7Cost: " + (p.getLevel() >= research.getCost() ? "&b": "&4") + research.getCost() + " Levels\n\n&a> Click to unlock")); actions.add(new PlayerRunnable(2) { + @Override public void run(final Player p) { if (!Research.isResearching(p)) { if (research.canUnlock(p)) { - if (research.hasUnlocked(p)) + PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); + + if (profile.hasUnlocked(research)) { openCategory(p, category, true, selected_page, book); + } else { if (!(p.getGameMode() == GameMode.CREATIVE && Research.creative_research)) { p.setLevel(p.getLevel() - research.getCost()); @@ -575,11 +578,14 @@ public class SlimefunGuide { if (p.getGameMode() == GameMode.CREATIVE) { research.unlock(p, true); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { openCategory(p, category, survival, selected_page, book); }, 1L); - } else { + } + else { research.unlock(p, false); + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { openCategory(p, category, survival, selected_page, book); }, 103L); @@ -713,8 +719,11 @@ public class SlimefunGuide { menu.addMenuClickHandler(index, (pl, slot, item, action) -> { if (!Research.isResearching(pl)) { if (research.canUnlock(pl)) { - if (research.hasUnlocked(pl)) - openCategory(pl, category, true, selected_page, book); + PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); + + if (profile.hasUnlocked(research)) { + openCategory(p, category, true, selected_page, book); + } else { if (!(pl.getGameMode() == GameMode.CREATIVE && Research.creative_research)) { pl.setLevel(pl.getLevel() - research.getCost()); @@ -723,7 +732,8 @@ public class SlimefunGuide { if (pl.getGameMode() == GameMode.CREATIVE) { research.unlock(pl, Research.creative_research); openCategory(pl, category, survival, selected_page, book); - } else { + } + else { research.unlock(pl, false); Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { openCategory(pl, category, survival, selected_page, book); @@ -738,9 +748,7 @@ public class SlimefunGuide { } else { menu.addItem(index, new CustomItem(Material.BARRIER, StringUtils.formatItemName(sfitem.getItem(), false), new String[] {"", "&rYou do not have Permission", "&rto access this Item"})); - menu.addMenuClickHandler(index, - (pl, slot, item, action) -> false - ); + menu.addMenuClickHandler(index, (pl, slot, item, action) -> false); index++; } } @@ -774,12 +782,15 @@ public class SlimefunGuide { private static Object getLastEntry(Player p, boolean remove) { List list = new ArrayList<>(); if (history.containsKey(p.getUniqueId())) list = history.get(p.getUniqueId()); + if (remove && list.size() >= 1) { Object obj = list.get(list.size() - 1); list.remove(obj); } + if (list.isEmpty()) history.remove(p.getUniqueId()); else history.put(p.getUniqueId(), list); + return list.isEmpty() ? null: list.get(list.size() - 1); } @@ -787,6 +798,7 @@ public class SlimefunGuide { if (item == null || item.getType() == Material.AIR) return; final SlimefunItem sfItem = SlimefunItem.getByItem(item); + if (sfItem == null) { if (!all_recipes) return; } @@ -798,9 +810,7 @@ public class SlimefunGuide { ChestMenu menu = new ChestMenu("Slimefun Guide"); menu.setEmptySlotsClickable(false); - menu.addMenuOpeningHandler( - pl -> pl.playSound(pl.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 0.7F) - ); + menu.addMenuOpeningHandler(pl -> pl.playSound(pl.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 0.7F)); if (sfItem != null) { recipe = sfItem.getRecipe(); @@ -808,7 +818,7 @@ public class SlimefunGuide { recipeOutput = sfItem.getRecipeOutput() != null ? sfItem.getRecipeOutput(): sfItem.getItem(); } else { - List recipes = new ArrayList(); + List recipes = new ArrayList<>(); Iterator iterator = Bukkit.recipeIterator(); while (iterator.hasNext()) { Recipe r = iterator.next(); @@ -816,44 +826,42 @@ public class SlimefunGuide { } if (recipes.isEmpty()) return; - Recipe r = recipes.get(page); + Recipe r = recipes.get(page); - if (recipes.size() > page + 1) { - menu.addItem(1, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7Next \u21E8", "", "&e&l! &rThere are multiple recipes for this Item")); - menu.addMenuClickHandler(1, (pl, slot, itemstack, action) -> { - displayItem(pl, itemstack, false, book, page + 1); - return false; - }); - } - - if (r instanceof ShapedRecipe) { - String[] shape = ((ShapedRecipe) r).getShape(); - for (int i = 0; i < shape.length; i++) { - for (int j = 0; j < shape[i].length(); j++) { - recipe[i * 3 + j] = ((ShapedRecipe) r).getIngredientMap().get(shape[i].charAt(j)); - } - } - recipeType = RecipeType.SHAPED_RECIPE.toItem(); - recipeOutput = r.getResult(); - } - else if (r instanceof ShapelessRecipe) { - List ingredients = ((ShapelessRecipe) r).getIngredientList(); - for (int i = 0; i < ingredients.size(); i++) { - recipe[i] = ingredients.get(i); - } - recipeType = RecipeType.SHAPELESS_RECIPE.toItem(); - recipeOutput = r.getResult(); - } - else if (r instanceof FurnaceRecipe) { - recipe[4] = ((FurnaceRecipe) r).getInput(); - - recipeType = RecipeType.FURNACE.toItem(); - recipeOutput = r.getResult(); - } + if (recipes.size() > page + 1) { + menu.addItem(1, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7Next \u21E8", "", "&e&l! &rThere are multiple recipes for this Item")); + menu.addMenuClickHandler(1, (pl, slot, itemstack, action) -> { + displayItem(pl, itemstack, false, book, page + 1); + return false; + }); + } + + if (r instanceof ShapedRecipe) { + String[] shape = ((ShapedRecipe) r).getShape(); + for (int i = 0; i < shape.length; i++) { + for (int j = 0; j < shape[i].length(); j++) { + recipe[i * 3 + j] = ((ShapedRecipe) r).getIngredientMap().get(shape[i].charAt(j)); + } + } + recipeType = RecipeType.SHAPED_RECIPE.toItem(); + recipeOutput = r.getResult(); + } + else if (r instanceof ShapelessRecipe) { + List ingredients = ((ShapelessRecipe) r).getIngredientList(); + for (int i = 0; i < ingredients.size(); i++) { + recipe[i] = ingredients.get(i); + } + recipeType = RecipeType.SHAPELESS_RECIPE.toItem(); + recipeOutput = r.getResult(); + } + else if (r instanceof FurnaceRecipe) { + recipe[4] = ((FurnaceRecipe) r).getInput(); + + recipeType = RecipeType.FURNACE.toItem(); + recipeOutput = r.getResult(); + } } - - if (addToHistory) addToHistory(p, sfItem != null ? sfItem: item); if (history.containsKey(p.getUniqueId()) && history.get(p.getUniqueId()).size() > 1) { @@ -911,6 +919,7 @@ public class SlimefunGuide { e.printStackTrace(); } } + if (Slimefun.getItemConfig().contains(sfItem.getID() + ".youtube")) { try { menu.addItem(7, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjQzNTNmZDBmODYzMTQzNTM4NzY1ODYwNzViOWJkZjBjNDg0YWFiMDMzMWI4NzJkZjExYmQ1NjRmY2IwMjllZCJ9fX0="), "&rDemonstration Video &7(Youtube)", "", "&7\u21E8 Click to watch")); @@ -928,9 +937,7 @@ public class SlimefunGuide { } menu.addItem(10, recipeType); - menu.addMenuClickHandler(10, - (pl, slot, itemstack, action) -> false - ); + menu.addMenuClickHandler(10, (pl, slot, itemstack, action) -> false); menu.addItem(12, Slimefun.hasUnlocked(p, recipe[3], false) ? recipe[3]: new CustomItem(Material.BARRIER, StringUtils.formatItemName(recipe[3], false), "&4&lLOCKED", "", Slimefun.hasPermission(p, SlimefunItem.getByItem(recipe[3]), false) ? "&rNeeds to be unlocked elsewhere" : "&rNo Permission")); menu.addMenuClickHandler(12, (pl, slot, itemstack, action) -> { @@ -951,9 +958,7 @@ public class SlimefunGuide { }); menu.addItem(16, recipeOutput); - menu.addMenuClickHandler(16, - (pl, slot, itemstack, action) -> false - ); + menu.addMenuClickHandler(16, (pl, slot, itemstack, action) -> false); menu.addItem(21, Slimefun.hasUnlocked(p, recipe[6], false) ? recipe[6]: new CustomItem(Material.BARRIER, StringUtils.formatItemName(recipe[6], false), "&4&lLOCKED", "", Slimefun.hasPermission(p, SlimefunItem.getByItem(recipe[6]), false) ? "&rNeeds to be unlocked elsewhere" : "&rNo Permission")); menu.addMenuClickHandler(21, (pl, slot, itemstack, action) -> { @@ -1010,7 +1015,7 @@ public class SlimefunGuide { if (slot >= 54) break; ItemStack fItem = fuel.getInput().clone(); ItemMeta im = fItem.getItemMeta(); - List lore = new ArrayList(); + List lore = new ArrayList<>(); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &7Lasts " + getTimeLeft(fuel.getTicks() / 2))); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + (((AGenerator) sfItem).getEnergyProduction() * 2) + " J/s")); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble(fuel.getTicks() * ((AGenerator) sfItem).getEnergyProduction()) + " J in total")); @@ -1029,7 +1034,7 @@ public class SlimefunGuide { if (slot >= 54) break; ItemStack fItem = fuel.getInput().clone(); ItemMeta im = fItem.getItemMeta(); - List lore = new ArrayList(); + List lore = new ArrayList<>(); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &7Lasts " + getTimeLeft(fuel.getTicks() / 2))); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + (((AReactor) sfItem).getEnergyProduction() * 2) + " J/s")); lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble(fuel.getTicks() * ((AReactor) sfItem).getEnergyProduction()) + " J in total")); diff --git a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java b/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java index e121d64b3..be4d316eb 100644 --- a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java +++ b/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java @@ -20,16 +20,10 @@ import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Reflection.ReflectionUtils; import me.mrCookieSlime.Slimefun.AncientAltar.Pedestals; import me.mrCookieSlime.Slimefun.CSCoreLibSetup.CSCoreLibLoader; -import me.mrCookieSlime.Slimefun.Commands.SlimefunCommand; -import me.mrCookieSlime.Slimefun.Commands.SlimefunTabCompleter; import me.mrCookieSlime.Slimefun.GEO.OreGenSystem; import me.mrCookieSlime.Slimefun.GEO.Resources.NetherIceResource; import me.mrCookieSlime.Slimefun.GEO.Resources.OilResource; import me.mrCookieSlime.Slimefun.GPS.Elevator; -import me.mrCookieSlime.Slimefun.GitHub.Contributor; -import me.mrCookieSlime.Slimefun.GitHub.GitHubConnector; -import me.mrCookieSlime.Slimefun.GitHub.GitHubSetup; -import me.mrCookieSlime.Slimefun.Hashing.ItemHash; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.MultiBlock; import me.mrCookieSlime.Slimefun.Objects.Research; @@ -44,9 +38,8 @@ import me.mrCookieSlime.Slimefun.Setup.MiscSetup; import me.mrCookieSlime.Slimefun.Setup.ResearchSetup; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.Setup.SlimefunSetup; -import me.mrCookieSlime.Slimefun.WorldEdit.WESlimefunManager; -import me.mrCookieSlime.Slimefun.api.AutoSavingTask; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.SlimefunBackup; import me.mrCookieSlime.Slimefun.api.TickerTask; @@ -57,6 +50,15 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; import me.mrCookieSlime.Slimefun.api.item_transport.ChestManipulator; +import me.mrCookieSlime.Slimefun.autosave.BlockAutoSaver; +import me.mrCookieSlime.Slimefun.autosave.PlayerAutoSaver; +import me.mrCookieSlime.Slimefun.commands.SlimefunCommand; +import me.mrCookieSlime.Slimefun.commands.SlimefunTabCompleter; +import me.mrCookieSlime.Slimefun.hooks.PlaceholderAPIHook; +import me.mrCookieSlime.Slimefun.hooks.WorldEditHook; +import me.mrCookieSlime.Slimefun.hooks.github.Contributor; +import me.mrCookieSlime.Slimefun.hooks.github.GitHubConnector; +import me.mrCookieSlime.Slimefun.hooks.github.GitHubSetup; import me.mrCookieSlime.Slimefun.listeners.AncientAltarListener; import me.mrCookieSlime.Slimefun.listeners.AndroidKillingListener; import me.mrCookieSlime.Slimefun.listeners.ArmorListener; @@ -190,6 +192,7 @@ public class SlimefunStartup extends JavaPlugin { System.out.println("[Slimefun] Loading Items..."); MiscSetup.setupItemSettings(); + try { SlimefunSetup.setupItems(); } catch (Exception e1) { @@ -198,7 +201,7 @@ public class SlimefunStartup extends JavaPlugin { MiscSetup.loadDescriptions(); System.out.println("[Slimefun] Loading Researches..."); - Research.enabled = getResearchCfg().getBoolean("enable-researching"); + Research.enableResearching = getResearchCfg().getBoolean("enable-researching"); ResearchSetup.setupResearches(); MiscSetup.setupMisc(); @@ -261,13 +264,17 @@ public class SlimefunStartup extends JavaPlugin { if (getServer().getPluginManager().isPluginEnabled("WorldEdit")) { try { Class.forName("com.sk89q.worldedit.extent.Extent"); - new WESlimefunManager(); + new WorldEditHook(); System.out.println("[Slimefun] Successfully hooked into WorldEdit!"); } catch (Exception x) { System.err.println("[Slimefun] Failed to hook into WorldEdit!"); System.err.println("[Slimefun] Maybe consider updating WorldEdit or Slimefun?"); } } + + if (getServer().getPluginManager().isPluginEnabled("PlaceholderAPI")) { + new PlaceholderAPIHook().register(); + } getCommand("slimefun").setExecutor(new SlimefunCommand(this)); getCommand("slimefun").setTabCompleter(new SlimefunTabCompleter()); @@ -326,8 +333,10 @@ public class SlimefunStartup extends JavaPlugin { ticker = new TickerTask(); + getServer().getScheduler().runTaskTimer(this, new PlayerAutoSaver(), 2000L, config.getInt("options.auto-save-delay-in-minutes") * 60L * 20L); + // Starting all ASYNC Tasks - getServer().getScheduler().runTaskTimerAsynchronously(this, new AutoSavingTask(), 1200L, config.getInt("options.auto-save-delay-in-minutes") * 60L * 20L); + getServer().getScheduler().runTaskTimerAsynchronously(this, new BlockAutoSaver(), 2000L, config.getInt("options.auto-save-delay-in-minutes") * 60L * 20L); getServer().getScheduler().runTaskTimerAsynchronously(this, ticker, 100L, config.getInt("URID.custom-ticker-delay")); getServer().getScheduler().runTaskTimerAsynchronously(this, () -> { @@ -340,7 +349,6 @@ public class SlimefunStartup extends JavaPlugin { System.out.println("[Slimefun] Finished!"); clearlag = getServer().getPluginManager().isPluginEnabled("ClearLag"); - coreProtect = getServer().getPluginManager().isPluginEnabled("CoreProtect"); getServer().getScheduler().runTaskLater(this, () -> { @@ -352,7 +360,8 @@ public class SlimefunStartup extends JavaPlugin { if (coreProtect) coreProtectAPI = ((CoreProtect) getServer().getPluginManager().getPlugin("CoreProtect")).getAPI(); Research.creative_research = config.getBoolean("options.allow-free-creative-research"); - + Research.titles = config.getStringList("research-ranks"); + AutoEnchanter.max_emerald_enchantments = config.getInt("options.emerald-enchantment-limit"); SlimefunSetup.legacy_ore_washer = config.getBoolean("options.legacy-ore-washer"); @@ -373,6 +382,10 @@ public class SlimefunStartup extends JavaPlugin { ticker.run(); } + PlayerProfile.iterator().forEachRemaining((profile) -> { + if (profile.isDirty()) profile.save(); + }); + for (World world: Bukkit.getWorlds()) { try { BlockStorage storage = BlockStorage.getStorage(world); @@ -452,8 +465,7 @@ public class SlimefunStartup extends JavaPlugin { GitHubConnector.connectors = null; Contributor.textures = null; ChestManipulator.listeners = null; - ItemHash.digest = null; - ItemHash.map = null; + PlayerProfile.profiles = null; for (Player p: Bukkit.getOnlinePlayers()) { p.closeInventory(); diff --git a/src/me/mrCookieSlime/Slimefun/Variables.java b/src/me/mrCookieSlime/Slimefun/Variables.java index a90440fc7..f6839c089 100644 --- a/src/me/mrCookieSlime/Slimefun/Variables.java +++ b/src/me/mrCookieSlime/Slimefun/Variables.java @@ -12,6 +12,7 @@ import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.inventory.ItemStack; +@Deprecated public class Variables { public static Map jump_state = new HashMap<>(); diff --git a/src/me/mrCookieSlime/Slimefun/api/BackpackInventory.java b/src/me/mrCookieSlime/Slimefun/api/BackpackInventory.java new file mode 100644 index 000000000..d1d277641 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/api/BackpackInventory.java @@ -0,0 +1,77 @@ +package me.mrCookieSlime.Slimefun.api; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; + +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; + +public class BackpackInventory { + + private int id; + private int size; + private PlayerProfile profile; + private Config cfg; + private Inventory inventory; + + /** + * This constructor loads an existing Backpack + */ + protected BackpackInventory(PlayerProfile profile, int id) { + this(profile, id, profile.getConfig().getInt("backpacks." + id + ".size")); + + for (int i = 0; i < size; i++) { + inventory.setItem(i, cfg.getItem("backpacks." + id + ".contents." + i)); + } + } + + /** + * This constructor creates a new Backpack + */ + protected BackpackInventory(PlayerProfile profile, int id, int size) { + this.profile = profile; + this.id = id; + this.cfg = profile.getConfig(); + this.size = size; + + cfg.setValue("backpacks." + id + ".size", size); + profile.markDirty(); + + inventory = Bukkit.createInventory(null, size, "Backpack [" + size + " Slots]"); + } + + public int getID() { + return id; + } + + public int getSize() { + return size; + } + + public Inventory getInventory() { + return inventory; + } + + public void open(Player... players) { + for (Player p: players) { + p.openInventory(inventory); + } + } + + public void setSize(int size) { + this.size = size; + cfg.setValue("backpacks." + id + ".size", size); + markDirty(); + } + + public void save() { + for (int i = 0; i < size; i++) { + cfg.setValue("backpacks." + id + ".contents." + i, inventory.getItem(i)); + } + } + + public void markDirty() { + profile.markDirty(); + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/api/Backpacks.java b/src/me/mrCookieSlime/Slimefun/api/Backpacks.java deleted file mode 100644 index 7dd5e9ab7..000000000 --- a/src/me/mrCookieSlime/Slimefun/api/Backpacks.java +++ /dev/null @@ -1,85 +0,0 @@ -package me.mrCookieSlime.Slimefun.api; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -public class Backpacks { - - public static String createBackpack(Player p, int size) { - List ids = new ArrayList<>(); - Config cfg = new Config(new File("data-storage/Slimefun/Players/" + p.getUniqueId() + ".yml")); - for (int i = 0; i < 1000; i++) { - if (cfg.contains("backpacks." + i + ".size")) ids.add(i); - else break; - } - int id = ids.isEmpty() ? 0: ids.get(ids.size() - 1) + 1; - ids.add(id); - - cfg.setValue("backpacks." + id + ".size", size); - cfg.save(); - return p.getUniqueId() + "#" + id; - } - - public static void openBackpack(Player p, ItemStack item) { - Inventory inv = getInventory(p, item); - if (inv != null) p.openInventory(inv); - } - - public static Inventory getInventory(Player p, ItemStack item) { - if (item == null || !item.hasItemMeta() || !item.getItemMeta().hasLore()) return null; - int id = -1; - String uuid = ""; - for (String line: item.getItemMeta().getLore()) { - if (line.startsWith(ChatColor.translateAlternateColorCodes('&', "&7ID: ")) && line.contains("#")) { - try { - id = Integer.parseInt(line.split("#")[1]); - uuid = line.split("#")[0].replace(ChatColor.translateAlternateColorCodes('&', "&7ID: "), ""); - } catch(NumberFormatException x) { - } - } - } - - if (id >= 0) { - Config cfg = new Config(new File("data-storage/Slimefun/Players/" + uuid + ".yml")); - int size = cfg.getInt("backpacks." + id + ".size"); - Inventory inv = Bukkit.createInventory(null, size, "Backpack [" + size + " Slots]"); - for (int i = 0; i < size; i++) { - inv.setItem(i, cfg.getItem("backpacks." + id + ".contents." + i)); - } - return inv; - } - else return null; - } - - public static void saveBackpack(Inventory inv, ItemStack item) { - int id = -1; - String uuid = ""; - for (String line: item.getItemMeta().getLore()) { - if (line.startsWith(ChatColor.translateAlternateColorCodes('&', "&7ID: ")) && line.contains("#")) { - try { - id = Integer.parseInt(line.split("#")[1]); - uuid = line.split("#")[0].replace(ChatColor.translateAlternateColorCodes('&', "&7ID: "), ""); - } catch(NumberFormatException x) { - } - } - } - - if (id >= 0) { - Config cfg = new Config(new File("data-storage/Slimefun/Players/" + uuid + ".yml")); - for (int i = 0; i < inv.getContents().length; i++) { - cfg.setValue("backpacks." + id + ".contents." + i, inv.getContents()[i]); - } - cfg.save(); - } - } - -} diff --git a/src/me/mrCookieSlime/Slimefun/api/BlockInfoConfig.java b/src/me/mrCookieSlime/Slimefun/api/BlockInfoConfig.java index 9bc743bcf..5425375c8 100644 --- a/src/me/mrCookieSlime/Slimefun/api/BlockInfoConfig.java +++ b/src/me/mrCookieSlime/Slimefun/api/BlockInfoConfig.java @@ -19,8 +19,8 @@ public class BlockInfoConfig extends Config { } public BlockInfoConfig(Map data) { - super((File)null,(FileConfiguration)null); - this.data=data; + super(null, null); + this.data = data; } public Map getMap(){ diff --git a/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java b/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java index 81518e04d..7b91d54a8 100644 --- a/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java +++ b/src/me/mrCookieSlime/Slimefun/api/BlockStorage.java @@ -204,12 +204,12 @@ public class BlockStorage { Map inventories2 = new HashMap<>(inventories); for (Map.Entry entry: inventories2.entrySet()) { - changes += entry.getValue().changes; + changes += entry.getValue().getUnsavedChanges(); } Map universal_inventories2 = new HashMap<>(universal_inventories); for (Map.Entry entry: universal_inventories2.entrySet()) { - changes += entry.getValue().changes; + changes += entry.getValue().getUnsavedChanges(); } } @@ -235,7 +235,8 @@ public class BlockStorage { Config cfg = entry.getValue(); if (cfg.getKeys().isEmpty()) { cfg.getFile().delete(); - } else { + } + else { File tmpFile = new File(cfg.getFile().getParentFile(), cfg.getFile().getName() + ".tmp"); cfg.save(tmpFile); try { diff --git a/src/me/mrCookieSlime/Slimefun/api/ErrorReport.java b/src/me/mrCookieSlime/Slimefun/api/ErrorReport.java new file mode 100644 index 000000000..ae48ee3a6 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/api/ErrorReport.java @@ -0,0 +1,104 @@ +package me.mrCookieSlime.Slimefun.api; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.plugin.Plugin; + +import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; +import me.mrCookieSlime.CSCoreLibPlugin.general.Clock; +import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; + +public class ErrorReport { + + private File file; + + public ErrorReport(TickerTask task, Location l, SlimefunItem item, Exception x) { + int try_count = 1; + file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + ".err"); + + while (file.exists()) { + try_count += 1; + file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(" + try_count + ").err"); + } + + PrintStream stream = null; + + try { + stream = new PrintStream(file); + stream.println(); + stream.println("Java Environment:"); + stream.println(" Operating System: " + System.getProperty("os.name")); + stream.println(" Java Version: " + System.getProperty("java.version")); + stream.println(); + stream.println("Server Software: " + Bukkit.getName()); + stream.println(" Build: " + Bukkit.getVersion()); + stream.println(" Minecraft: " + Bukkit.getBukkitVersion()); + stream.println(); + stream.println("Slimefun Environment:"); + stream.println(" CS-CoreLib v" + CSCoreLib.getLib().getDescription().getVersion()); + stream.println(" Slimefun v" + SlimefunStartup.instance.getDescription().getVersion()); + stream.println(); + + List plugins = new ArrayList<>(); + List addons = new ArrayList<>(); + for (Plugin p: Bukkit.getPluginManager().getPlugins()) { + if (Bukkit.getPluginManager().isPluginEnabled(p)) { + plugins.add(" + " + p.getName() + " " + p.getDescription().getVersion()); + if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun")) + addons.add(" + " + p.getName() + " " + p.getDescription().getVersion()); + } + else { + plugins.add(" - " + p.getName() + " " + p.getDescription().getVersion()); + if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun")) + addons.add(" - " + p.getName() + " " + p.getDescription().getVersion()); + } + } + + stream.println("Installed Addons (" + addons.size() + ")"); + addons.forEach(stream::println); + + stream.println(); + + stream.println("Installed Plugins (" + plugins.size() + "):"); + plugins.forEach(stream::println); + + stream.println(); + stream.println("Block Info:"); + stream.println(" World: " + l.getWorld().getName()); + stream.println(" X: " + l.getBlockX()); + stream.println(" Y: " + l.getBlockY()); + stream.println(" Z: " + l.getBlockZ()); + stream.println(" Material: " + l.getBlock().getType()); + stream.println(" State: " + l.getBlock().getState().getClass().getName()); + stream.println(); + stream.println("Ticker-Info:"); + stream.println(" Type: " + (item.getBlockTicker().isSynchronized() ? "Synchronized": "Asynchronous")); + stream.println(" Object Dump: " + task.toString()); + stream.println(); + stream.println("Slimefun Data:"); + stream.println(" ID: " + item.getID()); + 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); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } finally { + if (stream != null) stream.close(); + } + } + + public File getFile() { + return file; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/api/PlayerProfile.java b/src/me/mrCookieSlime/Slimefun/api/PlayerProfile.java new file mode 100644 index 000000000..adfaa447d --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/api/PlayerProfile.java @@ -0,0 +1,213 @@ +package me.mrCookieSlime.Slimefun.api; + +import java.io.File; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.stream.IntStream; + +import org.bukkit.ChatColor; +import org.bukkit.inventory.ItemStack; + +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; +import me.mrCookieSlime.Slimefun.Objects.Research; + +/** + * A class that can store a Player's Research Profile for caching + * + * @author TheBusyBiscuit + * + */ +public class PlayerProfile { + + public static Map profiles = new HashMap<>(); + + private UUID uuid; + private Config cfg; + private boolean dirty = false; + private boolean markedForDeletion = false; + + private Set researches = new HashSet<>(); + private Map backpacks = new HashMap<>(); + + private PlayerProfile(UUID uuid) { + this.uuid = uuid; + cfg = new Config(new File("data-storage/Slimefun/Players/" + uuid.toString() + ".yml")); + + for (Research research: Research.list()) { + if (cfg.contains("researches." + research.getID())) researches.add(research); + } + } + + protected Config getConfig() { + return cfg; + } + + public UUID getUUID() { + return uuid; + } + + /** + * This method returns whether the Player has logged off. + * If this is true, then the Profile can be removed from RAM. + * + * @return Whether the Profile is marked for deletion + */ + public boolean isMarkedForDeletion() { + return markedForDeletion; + } + + /** + * This method returns whether the Profile has unsaved changes + * + * @return Whether there are unsaved changes + */ + public boolean isDirty() { + return dirty; + } + + /** + * This method will save the Player's Researches and Backpacks to the hard drive + */ + public void save() { + for (BackpackInventory backpack: backpacks.values()) { + backpack.save(); + } + + cfg.save(); + dirty = false; + } + + /** + * This method sets the Player's "researched" status for this Research. + * Use the boolean to unlock or lock the Research + * + * @param research The Research that should be unlocked or locked + * @param unlock Whether the Research should be unlocked or locked + */ + public void setResearched(Research research, boolean unlock) { + dirty = true; + + if (unlock) { + cfg.setValue("researches." + research.getID(), true); + researches.add(research); + } + else { + cfg.setValue("researches." + research.getID(), null); + researches.remove(research); + } + } + + /** + * This method returns whether the Player has unlocked the given Research + * + * @param research The Research that is being queried + * @return Whether this Research has been unlocked + */ + public boolean hasUnlocked(Research research) { + return !research.isEnabled() || researches.contains(research); + } + + /** + * This Method will return all Researches that this Player has unlocked + * + * @return A Hashset of all Researches this Player has unlocked + */ + public Set getResearches() { + return researches; + } + + /** + * Call this method if the Player has left. + * The profile can then be removed from RAM. + */ + public void markForDeletion() { + this.markedForDeletion = true; + } + + /** + * Call this method if this Profile has unsaved changes. + */ + public void markDirty() { + this.dirty = true; + } + + public BackpackInventory createBackpack(int size) { + IntStream stream = IntStream.iterate(0, i -> i + 1).filter(i -> !cfg.contains("backpacks." + i + ".size")); + int id = stream.findFirst().getAsInt(); + + BackpackInventory backpack = new BackpackInventory(this, id, size); + backpacks.put(id, backpack); + + return backpack; + } + + public BackpackInventory getBackpack(int id) { + BackpackInventory backpack = backpacks.get(id); + + if (backpack != null) return backpack; + else { + backpack = new BackpackInventory(this, id); + backpacks.put(id, backpack); + return backpack; + } + } + + public String getTitle() { + int index = Math.round(Float.valueOf(String.valueOf(Math.round(((researches.size() * 100.0f) / Research.titles.size()))))); + if (index > 0) index--; + return Research.titles.get(index); + } + + public static PlayerProfile fromUUID(UUID uuid) { + PlayerProfile profile = profiles.get(uuid); + + if (profile == null) { + profile = new PlayerProfile(uuid); + profiles.put(uuid, profile); + } + else { + profile.markedForDeletion = false; + } + + return profile; + } + + public static boolean isLoaded(UUID uuid) { + return profiles.containsKey(uuid); + } + + public static Iterator iterator() { + return profiles.values().iterator(); + } + + public static BackpackInventory getBackpack(ItemStack item) { + if (item == null || !item.hasItemMeta() || !item.getItemMeta().hasLore()) return null; + + Optional id = Optional.empty(); + String uuid = ""; + + for (String line: item.getItemMeta().getLore()) { + if (line.startsWith(ChatColor.translateAlternateColorCodes('&', "&7ID: ")) && line.contains("#")) { + try { + id = Optional.of(Integer.parseInt(line.split("#")[1])); + uuid = line.split("#")[0].replace(ChatColor.translateAlternateColorCodes('&', "&7ID: "), ""); + } catch(NumberFormatException x) { + return null; + } + } + } + + if (id.isPresent()) { + return PlayerProfile.fromUUID(UUID.fromString(uuid)).getBackpack(id.get()); + } + else { + return null; + } + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/api/Slimefun.java b/src/me/mrCookieSlime/Slimefun/api/Slimefun.java index db502c500..b11f58920 100644 --- a/src/me/mrCookieSlime/Slimefun/api/Slimefun.java +++ b/src/me/mrCookieSlime/Slimefun/api/Slimefun.java @@ -26,28 +26,28 @@ import me.mrCookieSlime.Slimefun.Setup.Messages; */ public class Slimefun { - public static Map> guide_handlers = new HashMap>(); - public static List guide_handlers2 = new ArrayList(); + public static Map> guide_handlers = new HashMap<>(); /** * Instance of the GPSNetwork. */ private static GPSNetwork gps = new GPSNetwork(); + /** * Whether EmeraldEnchants is enabled or not. */ public static boolean emeraldenchants = false; + /** * Lists all the registered categories. */ - public static List current_categories = new ArrayList(); + public static List current_categories = new ArrayList<>(); public static void registerGuideHandler(GuideHandler handler) { - List handlers = new ArrayList(); + List handlers = new ArrayList<>(); if (guide_handlers.containsKey(handler.getTier())) handlers = guide_handlers.get(handler.getTier()); handlers.add(handler); guide_handlers.put(handler.getTier(), handlers); - guide_handlers2.add(handler); } /** @@ -142,7 +142,7 @@ public class Slimefun { } else if (isEnabled(p, item, message) && hasPermission(p, sfItem, message)) { if (sfItem.getResearch() == null) return true; - else if (sfItem.getResearch().hasUnlocked(p)) return true; + else if (PlayerProfile.fromUUID(p.getUniqueId()).hasUnlocked(sfItem.getResearch())) return true; else { if (message && !(sfItem instanceof VanillaItem)) Messages.local.sendTranslation(p, "messages.not-researched", true); return false; @@ -164,7 +164,7 @@ public class Slimefun { public static boolean hasUnlocked(Player p, SlimefunItem sfItem, boolean message) { if (isEnabled(p, sfItem, message) && hasPermission(p, sfItem, message)) { if (sfItem.getResearch() == null) return true; - else if (sfItem.getResearch().hasUnlocked(p)) return true; + else if (PlayerProfile.fromUUID(p.getUniqueId()).hasUnlocked(sfItem.getResearch())) return true; else { if (message && !(sfItem instanceof VanillaItem)) Messages.local.sendTranslation(p, "messages.not-researched", true); return false; diff --git a/src/me/mrCookieSlime/Slimefun/api/Soul.java b/src/me/mrCookieSlime/Slimefun/api/Soul.java index 4ac3cb68c..ad5589808 100644 --- a/src/me/mrCookieSlime/Slimefun/api/Soul.java +++ b/src/me/mrCookieSlime/Slimefun/api/Soul.java @@ -9,6 +9,7 @@ import me.mrCookieSlime.Slimefun.Variables; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +@Deprecated public class Soul { public static void storeItem(UUID uuid, ItemStack drop) { diff --git a/src/me/mrCookieSlime/Slimefun/api/TickerTask.java b/src/me/mrCookieSlime/Slimefun/api/TickerTask.java index e0e8994a2..40fbf9c91 100644 --- a/src/me/mrCookieSlime/Slimefun/api/TickerTask.java +++ b/src/me/mrCookieSlime/Slimefun/api/TickerTask.java @@ -1,18 +1,20 @@ package me.mrCookieSlime.Slimefun.api; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.PrintStream; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; -import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; -import org.bukkit.*; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import me.mrCookieSlime.CSCoreLibPlugin.general.Clock; import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage; import me.mrCookieSlime.CSCoreLibPlugin.general.Chat.TellRawMessage.HoverAction; import me.mrCookieSlime.Slimefun.SlimefunStartup; @@ -75,19 +77,26 @@ public class TickerTask implements Runnable { if (l.getWorld().isChunkLoaded(l.getBlockX() >> 4, l.getBlockZ() >> 4)) { final Block b = l.getBlock(); final SlimefunItem item = BlockStorage.check(l); - if (item != null) { + + if (item != null && item.getBlockTicker() != null) { machines++; + try { item.getBlockTicker().update(); + if (item.getBlockTicker().isSynchronized()) { Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { try { long timestamp3 = System.currentTimeMillis(); item.getBlockTicker().tick(b, item, BlockStorage.getLocationInfo(l)); - map_machinetime.put(item.getID(), (map_machinetime.containsKey(item.getID()) ? map_machinetime.get(item.getID()): 0) + (System.currentTimeMillis() - timestamp3)); - map_chunk.put(c, (map_chunk.containsKey(c) ? map_chunk.get(c): 0) + 1); - map_machine.put(item.getID(), (map_machine.containsKey(item.getID()) ? map_machine.get(item.getID()): 0) + 1); + Long machinetime = map_machinetime.get(item.getID()); + Integer chunk = map_chunk.get(c); + Integer machine = map_machine.get(item.getID()); + + map_machinetime.put(item.getID(), (machinetime != null ? machinetime: 0) + (System.currentTimeMillis() - timestamp3)); + map_chunk.put(c, (chunk != null ? chunk: 0) + 1); + map_machine.put(item.getID(), (machine != null ? machine: 0) + 1); block_timings.put(l, System.currentTimeMillis() - timestamp3); } catch (Exception x) { int errors = 0; @@ -95,73 +104,13 @@ public class TickerTask implements Runnable { errors++; if (errors == 1) { - int try_count = 1; - File file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + ".err"); - while (file.exists()) { - try_count += 1; - file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(" + try_count + ").err"); - } - try { - PrintStream stream = new PrintStream(file); - stream.println(); - stream.println("Server Software: " + Bukkit.getName()); - stream.println(" Build: " + Bukkit.getVersion()); - stream.println(" Minecraft: " + Bukkit.getBukkitVersion()); - stream.println(); - stream.println("Slimefun Environment:"); - stream.println(" CS-CoreLib v" + CSCoreLib.getLib().getDescription().getVersion()); - stream.println(" Slimefun v" + SlimefunStartup.instance.getDescription().getVersion()); - stream.println(); - - List plugins = new ArrayList<>(); - List addons = new ArrayList<>(); - for (Plugin p: Bukkit.getPluginManager().getPlugins()) { - if (Bukkit.getPluginManager().isPluginEnabled(p)) { - plugins.add(" + " + p.getName() + " " + p.getDescription().getVersion()); - if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun")) - addons.add(" + " + p.getName() + " " + p.getDescription().getVersion()); - } - else { - plugins.add(" - " + p.getName() + " " + p.getDescription().getVersion()); - if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun")) - addons.add(" - " + p.getName() + " " + p.getDescription().getVersion()); - } - } - - stream.println(" Installed Addons (" + addons.size() + ")"); - for (String addon : addons) { - stream.println(addon); - } - stream.println(); - stream.println("Installed Plugins (" + plugins.size() + "):"); - for (String plugin : plugins) { - stream.println(plugin); - } - 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.getID()); - 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(); - } + // Generate a new Error-Report + ErrorReport report = new ErrorReport(this, l, item, x); 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()); System.err.println("[Slimefun] Saved as: "); - System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + file.getName()); + System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + report.getFile().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] "); @@ -196,60 +145,18 @@ public class TickerTask implements Runnable { } tickers.add(item.getBlockTicker()); } 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()) { - for (int i = 2; i < 11; i++) { - file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + " (" + i + ").err"); - if (!file.exists()) break; - } - } - try { - PrintStream stream = new PrintStream(file); - stream.println(); - stream.println("Server Software: " + Bukkit.getName()); - stream.println(" Build: " + Bukkit.getVersion()); - stream.println(" Minecraft: " + Bukkit.getBukkitVersion()); - stream.println(); - stream.println("Installed Plugins (" + Bukkit.getPluginManager().getPlugins().length + ")"); - for (Plugin p: Bukkit.getPluginManager().getPlugins()) { - if (Bukkit.getPluginManager().isPluginEnabled(p)) { - stream.println(" + " + p.getName() + " " + p.getDescription().getVersion()); - } - else { - 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.getID()); - 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(); - } + // Generate a new Error-Report + ErrorReport report = new ErrorReport(this, l, item, x); 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()); System.err.println("[Slimefun] Saved as: "); - System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + file.getName()); + System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + report.getFile().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] "); @@ -291,13 +198,18 @@ public class TickerTask implements Runnable { } move.clear(); - for (BlockTicker ticker: tickers) { - ticker.unique = true; + Iterator iterator = tickers.iterator(); + while (iterator.hasNext()) { + iterator.next().unique = true; + iterator.remove(); } - tickers.clear(); time = System.currentTimeMillis() - timestamp; } + + public long getTime() { + return time; + } public void info(CommandSender sender) { sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&2== &aSlimefun Diagnostic Tool &2==")); @@ -309,6 +221,7 @@ public class TickerTask implements Runnable { sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Skipped Machines: &e" + skipped)); sender.sendMessage(""); sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticking Machines:")); + if (sender instanceof Player) { TellRawMessage tellraw = new TellRawMessage(); tellraw.addText(" &7&oHover for more Info"); @@ -334,8 +247,10 @@ public class TickerTask implements Runnable { } sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&c+ &4" + hidden + " Hidden")); } + sender.sendMessage(""); sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&6Ticking Chunks:")); + if (sender instanceof Player) { TellRawMessage tellraw = new TellRawMessage(); tellraw.addText(" &7&oHover for more Info"); @@ -379,5 +294,20 @@ public class TickerTask implements Runnable { public long getTimings(Chunk c) { return map_chunktime.containsKey(c.toString()) ? map_chunktime.get(c.toString()): 0L; } + + @Override + public String toString() { + return "TickerTask {\n" + + " HALTED = " + HALTED + "\n" + + " tickers = " + tickers + "\n" + + " move = " + move + "\n" + + " delete = " + delete + "\n" + + " chunks = " + map_chunk + "\n" + + " machines = " + map_machine + "\n" + + " machinetime = " + map_machinetime + "\n" + + " chunktime = " + map_chunktime + "\n" + + " skipped = " + skipped_chunks + "\n" + + "}"; + } } diff --git a/src/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java b/src/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java index aca1094df..b00ddd62d 100644 --- a/src/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java +++ b/src/me/mrCookieSlime/Slimefun/api/energy/ItemEnergy.java @@ -48,7 +48,7 @@ public class ItemEnergy { float rest = 0F; float capacity = getMaxEnergy(item); - if (capacity == 0F) { + if ((int) capacity == 0) { return rest; } @@ -76,7 +76,7 @@ public class ItemEnergy { } } - BigDecimal decimal = new BigDecimal(stored).setScale(2, BigDecimal.ROUND_HALF_UP); + BigDecimal decimal = BigDecimal.valueOf(stored).setScale(2, BigDecimal.ROUND_HALF_UP); lore.set(index, ChatColor.translateAlternateColorCodes('&', "&c&o&8\u21E8 &e\u26A1 &7") + decimal.floatValue() + " / " + capacity + " J"); diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java index e3ad752f7..471b42150 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java @@ -10,14 +10,11 @@ import org.bukkit.entity.Player; 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 DirtyChestMenu { - BlockMenuPreset preset; - Location l; - - public int changes = 0; + private BlockMenuPreset preset; + private Location l; private ItemManipulationEvent event; @@ -59,7 +56,7 @@ public class BlockMenu extends ChestMenu { } public void save(Location l) { - if (changes == 0) { + if (!isDirty()) { return; } @@ -121,41 +118,12 @@ public class BlockMenu extends ChestMenu { item = this.event.onEvent(slot, previous, item); } super.replaceExistingItem(slot, item); - - 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)); - } + markDirty(); } public void close() { - for(HumanEntity human: new ArrayList<>(toInventory().getViewers())) { + for (HumanEntity human: new ArrayList<>(toInventory().getViewers())) { human.closeInventory(); } } - - 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++; - } - - } } diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/DirtyChestMenu.java b/src/me/mrCookieSlime/Slimefun/api/inventory/DirtyChestMenu.java new file mode 100644 index 000000000..789c326a5 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/DirtyChestMenu.java @@ -0,0 +1,59 @@ +package me.mrCookieSlime.Slimefun.api.inventory; + +import org.bukkit.entity.Player; + +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; + +public class DirtyChestMenu extends ChestMenu { + + protected int changes = 0; + + public DirtyChestMenu(String title) { + super(title); + } + + public void markDirty() { + changes++; + } + + public boolean isDirty() { + return changes > 0; + } + + public int getUnsavedChanges() { + return changes; + } + + @Override + public ChestMenu addMenuOpeningHandler(MenuOpeningHandler handler) { + if (handler instanceof SaveHandler) { + return super.addMenuOpeningHandler(new SaveHandler(this, ((SaveHandler) handler).getOpeningHandler())); + } + else { + return super.addMenuOpeningHandler(new SaveHandler(this, handler)); + } + } + + public static class SaveHandler implements MenuOpeningHandler { + + private DirtyChestMenu menu; + private MenuOpeningHandler handler; + + public SaveHandler(DirtyChestMenu menu, MenuOpeningHandler handler) { + this.menu = menu; + this.handler = handler; + } + + @Override + public void onOpen(Player p) { + handler.onOpen(p); + menu.markDirty(); + } + + public MenuOpeningHandler getOpeningHandler() { + return handler; + } + + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java b/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java index 7e322ba07..e2a982d9f 100644 --- a/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java +++ b/src/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java @@ -3,21 +3,18 @@ package me.mrCookieSlime.Slimefun.api.inventory; import java.io.File; import java.util.ArrayList; -import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; - import org.bukkit.block.Block; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -public class UniversalBlockMenu extends ChestMenu { +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; + +public class UniversalBlockMenu extends DirtyChestMenu { BlockMenuPreset preset; ItemManipulationEvent event; - public int changes = 0; - public UniversalBlockMenu(BlockMenuPreset preset) { super(preset.getTitle()); this.preset = preset; @@ -50,7 +47,7 @@ public class UniversalBlockMenu extends ChestMenu { } public void save() { - if (changes == 0) return; + if (!isDirty()) return; // To force CS-CoreLib to build the Inventory this.getContents(); @@ -85,8 +82,7 @@ public class UniversalBlockMenu extends ChestMenu { item = this.event.onEvent(slot, previous, item); } super.replaceExistingItem(slot, item); - - changes++; + markDirty(); } public void close() { diff --git a/src/me/mrCookieSlime/Slimefun/api/AutoSavingTask.java b/src/me/mrCookieSlime/Slimefun/autosave/BlockAutoSaver.java similarity index 67% rename from src/me/mrCookieSlime/Slimefun/api/AutoSavingTask.java rename to src/me/mrCookieSlime/Slimefun/autosave/BlockAutoSaver.java index e2a2eab78..db39f8bbf 100644 --- a/src/me/mrCookieSlime/Slimefun/api/AutoSavingTask.java +++ b/src/me/mrCookieSlime/Slimefun/autosave/BlockAutoSaver.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.api; +package me.mrCookieSlime.Slimefun.autosave; import java.util.HashSet; import java.util.Set; @@ -7,8 +7,9 @@ import org.bukkit.Bukkit; import org.bukkit.World; import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.api.BlockStorage; -public class AutoSavingTask implements Runnable { +public class BlockAutoSaver implements Runnable { @Override public void run() { @@ -26,7 +27,7 @@ public class AutoSavingTask implements Runnable { } if (!worlds.isEmpty()) { - System.out.println("[Slimefun] Auto-Saving Data... (Next Auto-Save: " + SlimefunStartup.getCfg().getInt("options.auto-save-delay-in-minutes") + "m)"); + System.out.println("[Slimefun] Auto-Saving Block Data... (Next Auto-Save: " + SlimefunStartup.getCfg().getInt("options.auto-save-delay-in-minutes") + "m)"); for (BlockStorage storage: worlds) { storage.save(false); diff --git a/src/me/mrCookieSlime/Slimefun/autosave/PlayerAutoSaver.java b/src/me/mrCookieSlime/Slimefun/autosave/PlayerAutoSaver.java new file mode 100644 index 000000000..3ccc999e6 --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/autosave/PlayerAutoSaver.java @@ -0,0 +1,30 @@ +package me.mrCookieSlime.Slimefun.autosave; + +import java.util.Iterator; + +import me.mrCookieSlime.Slimefun.api.PlayerProfile; + +public class PlayerAutoSaver implements Runnable { + + @Override + public void run() { + Iterator iterator = PlayerProfile.iterator(); + int players = 0; + + while (iterator.hasNext()) { + PlayerProfile profile = iterator.next(); + + if (profile.isDirty()) { + players++; + profile.save(); + } + + if (profile.isMarkedForDeletion()) iterator.remove(); + } + + if (players > 0) { + System.out.println("[Slimefun] Auto-Saved Player Data for " + players + " Player(s)!"); + } + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/Commands/SlimefunCommand.java b/src/me/mrCookieSlime/Slimefun/commands/SlimefunCommand.java similarity index 99% rename from src/me/mrCookieSlime/Slimefun/Commands/SlimefunCommand.java rename to src/me/mrCookieSlime/Slimefun/commands/SlimefunCommand.java index c48105150..9fe6a7546 100644 --- a/src/me/mrCookieSlime/Slimefun/Commands/SlimefunCommand.java +++ b/src/me/mrCookieSlime/Slimefun/commands/SlimefunCommand.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Commands; +package me.mrCookieSlime.Slimefun.commands; import java.util.ArrayList; import java.util.List; @@ -173,7 +173,7 @@ public class SlimefunCommand implements CommandExecutor, Listener { sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&aSlimefun &2v" + plugin.getDescription().getVersion())); sender.sendMessage(""); - List addons = new ArrayList(); + List addons = new ArrayList<>(); for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) { if (plugin.getDescription().getDepend().contains("Slimefun") || plugin.getDescription().getSoftDepend().contains("Slimefun")) { diff --git a/src/me/mrCookieSlime/Slimefun/Commands/SlimefunTabCompleter.java b/src/me/mrCookieSlime/Slimefun/commands/SlimefunTabCompleter.java similarity index 97% rename from src/me/mrCookieSlime/Slimefun/Commands/SlimefunTabCompleter.java rename to src/me/mrCookieSlime/Slimefun/commands/SlimefunTabCompleter.java index 7d32452ef..ca644427c 100644 --- a/src/me/mrCookieSlime/Slimefun/Commands/SlimefunTabCompleter.java +++ b/src/me/mrCookieSlime/Slimefun/commands/SlimefunTabCompleter.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.Commands; +package me.mrCookieSlime.Slimefun.commands; import java.util.ArrayList; import java.util.List; diff --git a/src/me/mrCookieSlime/Slimefun/hooks/PlaceholderAPIHook.java b/src/me/mrCookieSlime/Slimefun/hooks/PlaceholderAPIHook.java new file mode 100644 index 000000000..c8dc2042b --- /dev/null +++ b/src/me/mrCookieSlime/Slimefun/hooks/PlaceholderAPIHook.java @@ -0,0 +1,77 @@ +package me.mrCookieSlime.Slimefun.hooks; + +import java.util.Set; +import java.util.stream.Stream; + +import org.bukkit.OfflinePlayer; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.Objects.Research; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; +import me.mrCookieSlime.Slimefun.api.Slimefun; + +public class PlaceholderAPIHook extends PlaceholderExpansion { + + @Override + public String getAuthor() { + return SlimefunStartup.instance.getDescription().getAuthors().toString(); + } + + @Override + public String getIdentifier() { + return "slimefun"; + } + + @Override + public String getVersion() { + return SlimefunStartup.instance.getDescription().getVersion(); + } + + @Override + public boolean persist() { + return true; + } + + @Override + public boolean canRegister() { + return true; + } + + @Override + public String onRequest(OfflinePlayer p, String params) { + if (params.equals("researches_total_xp_levels_spent")) { + Stream stream = PlayerProfile.fromUUID(p.getUniqueId()).getResearches().stream(); + return String.valueOf(stream.mapToInt(r -> r.getCost()).sum()); + } + + if (params.equals("researches_total_researches_unlocked")) { + Set set = PlayerProfile.fromUUID(p.getUniqueId()).getResearches(); + return String.valueOf(set.size()); + } + + if (params.equals("researches_total_researches")) { + return String.valueOf(Research.list()); + } + + if (params.equals("researches_percentage_researches_unlocked")) { + Set set = PlayerProfile.fromUUID(p.getUniqueId()).getResearches(); + return String.valueOf(Math.round(((set.size() * 100.0f) / Research.list().size()) * 100.0f) / 100.0f); + } + + if (params.equals("researches_title")) { + return PlayerProfile.fromUUID(p.getUniqueId()).getTitle(); + } + + if (params.equals("gps_complexity")) { + return String.valueOf(Slimefun.getGPSNetwork().getNetworkComplexity(p.getUniqueId())); + } + + if (params.equals("timings_lag")) { + return SlimefunStartup.ticker.getTime() + "ms"; + } + + return null; + } + +} diff --git a/src/me/mrCookieSlime/Slimefun/WorldEdit/WESlimefunManager.java b/src/me/mrCookieSlime/Slimefun/hooks/WorldEditHook.java similarity index 91% rename from src/me/mrCookieSlime/Slimefun/WorldEdit/WESlimefunManager.java rename to src/me/mrCookieSlime/Slimefun/hooks/WorldEditHook.java index 7941d0a36..7d82d6b8a 100644 --- a/src/me/mrCookieSlime/Slimefun/WorldEdit/WESlimefunManager.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/WorldEditHook.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.WorldEdit; +package me.mrCookieSlime.Slimefun.hooks; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -14,9 +14,9 @@ import com.sk89q.worldedit.world.block.BlockStateHolder; import me.mrCookieSlime.Slimefun.api.BlockStorage; -public class WESlimefunManager { +public class WorldEditHook { - public WESlimefunManager() { + public WorldEditHook() { WorldEdit.getInstance().getEventBus().register(this); } diff --git a/src/me/mrCookieSlime/Slimefun/GitHub/Contributor.java b/src/me/mrCookieSlime/Slimefun/hooks/github/Contributor.java similarity index 97% rename from src/me/mrCookieSlime/Slimefun/GitHub/Contributor.java rename to src/me/mrCookieSlime/Slimefun/hooks/github/Contributor.java index 7638b4df2..a16211c91 100644 --- a/src/me/mrCookieSlime/Slimefun/GitHub/Contributor.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/github/Contributor.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.GitHub; +package me.mrCookieSlime.Slimefun.hooks.github; import java.util.HashMap; import java.util.Map; diff --git a/src/me/mrCookieSlime/Slimefun/GitHub/GitHubConnector.java b/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubConnector.java similarity index 98% rename from src/me/mrCookieSlime/Slimefun/GitHub/GitHubConnector.java rename to src/me/mrCookieSlime/Slimefun/hooks/github/GitHubConnector.java index bb949a7c6..450fb4691 100644 --- a/src/me/mrCookieSlime/Slimefun/GitHub/GitHubConnector.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubConnector.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.GitHub; +package me.mrCookieSlime.Slimefun.hooks.github; import java.io.BufferedReader; import java.io.File; diff --git a/src/me/mrCookieSlime/Slimefun/GitHub/GitHubSetup.java b/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubSetup.java similarity index 99% rename from src/me/mrCookieSlime/Slimefun/GitHub/GitHubSetup.java rename to src/me/mrCookieSlime/Slimefun/hooks/github/GitHubSetup.java index 43bc92cf5..bef92fced 100644 --- a/src/me/mrCookieSlime/Slimefun/GitHub/GitHubSetup.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/github/GitHubSetup.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.GitHub; +package me.mrCookieSlime.Slimefun.hooks.github; import java.io.IOException; import java.io.InputStreamReader; diff --git a/src/me/mrCookieSlime/Slimefun/GitHub/IntegerFormat.java b/src/me/mrCookieSlime/Slimefun/hooks/github/IntegerFormat.java similarity index 86% rename from src/me/mrCookieSlime/Slimefun/GitHub/IntegerFormat.java rename to src/me/mrCookieSlime/Slimefun/hooks/github/IntegerFormat.java index 5b190e78d..3b4d1cf82 100644 --- a/src/me/mrCookieSlime/Slimefun/GitHub/IntegerFormat.java +++ b/src/me/mrCookieSlime/Slimefun/hooks/github/IntegerFormat.java @@ -1,4 +1,4 @@ -package me.mrCookieSlime.Slimefun.GitHub; +package me.mrCookieSlime.Slimefun.hooks.github; import java.text.NumberFormat; import java.text.ParseException; @@ -8,7 +8,7 @@ import java.util.Locale; public class IntegerFormat { - private static SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private static final SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static String formatBigNumber(int i) { return NumberFormat.getNumberInstance(Locale.US).format(i); diff --git a/src/me/mrCookieSlime/Slimefun/listeners/AndroidKillingListener.java b/src/me/mrCookieSlime/Slimefun/listeners/AndroidKillingListener.java index 89399091c..46f042e97 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/AndroidKillingListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/AndroidKillingListener.java @@ -14,7 +14,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.metadata.MetadataValue; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.Slimefun.SlimefunStartup; @@ -29,40 +28,38 @@ public class AndroidKillingListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onDeath(final EntityDeathEvent e) { if (e.getEntity().hasMetadata("android_killer")) { - for (MetadataValue value: e.getEntity().getMetadata("android_killer")) { - final AndroidObject obj = (AndroidObject) value.value(); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { - List items = new ArrayList(); - for (Entity n : e.getEntity().getNearbyEntities(0.5D, 0.5D, 0.5D)) { - if (n instanceof Item && !n.hasMetadata("no_pickup")) { - items.add(((Item) n).getItemStack()); - n.remove(); - } - } + final AndroidObject obj = (AndroidObject) e.getEntity().getMetadata("android_killer").get(0).value(); - switch (e.getEntityType()) { - case BLAZE: { - items.add(new ItemStack(Material.BLAZE_ROD, 1 + CSCoreLib.randomizer().nextInt(2))); - break; - } - case PIG_ZOMBIE: { - items.add(new ItemStack(Material.GOLD_NUGGET, 1 + CSCoreLib.randomizer().nextInt(3))); - break; - } - case WITHER_SKELETON: { - if (CSCoreLib.randomizer().nextInt(250) < 2) items.add(new ItemStack(Material.WITHER_SKELETON_SKULL)); - break; - } - default: - break; + Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { + List items = new ArrayList<>(); + for (Entity n : e.getEntity().getNearbyEntities(0.5D, 0.5D, 0.5D)) { + if (n instanceof Item && !n.hasMetadata("no_pickup")) { + items.add(((Item) n).getItemStack()); + n.remove(); } - - obj.getAndroid().addItems(obj.getBlock(), items.toArray(new ItemStack[items.size()])); - ExperienceOrb exp = (ExperienceOrb) e.getEntity().getWorld().spawnEntity(e.getEntity().getLocation(), EntityType.EXPERIENCE_ORB); - exp.setExperience(1 + CSCoreLib.randomizer().nextInt(6)); - }, 1L); - return; - } + } + + switch (e.getEntityType()) { + case BLAZE: { + items.add(new ItemStack(Material.BLAZE_ROD, 1 + CSCoreLib.randomizer().nextInt(2))); + break; + } + case PIG_ZOMBIE: { + items.add(new ItemStack(Material.GOLD_NUGGET, 1 + CSCoreLib.randomizer().nextInt(3))); + break; + } + case WITHER_SKELETON: { + if (CSCoreLib.randomizer().nextInt(250) < 2) items.add(new ItemStack(Material.WITHER_SKELETON_SKULL)); + break; + } + default: + break; + } + + obj.getAndroid().addItems(obj.getBlock(), items.toArray(new ItemStack[items.size()])); + ExperienceOrb exp = (ExperienceOrb) e.getEntity().getWorld().spawnEntity(e.getEntity().getLocation(), EntityType.EXPERIENCE_ORB); + exp.setExperience(1 + CSCoreLib.randomizer().nextInt(6)); + }, 1L); } } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/BackpackListener.java b/src/me/mrCookieSlime/Slimefun/listeners/BackpackListener.java index f5680c5fc..5838f3bd9 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/BackpackListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/BackpackListener.java @@ -2,20 +2,9 @@ package me.mrCookieSlime.Slimefun.listeners; import java.util.List; -import me.mrCookieSlime.Slimefun.Variables; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Juice; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBackpack; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Setup.Messages; -import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; -import me.mrCookieSlime.Slimefun.api.Backpacks; -import me.mrCookieSlime.Slimefun.api.Slimefun; - import org.bukkit.ChatColor; -import org.bukkit.Sound; import org.bukkit.Material; +import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -28,6 +17,18 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.Variables; +import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Juice; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunBackpack; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Setup.Messages; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BackpackInventory; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; +import me.mrCookieSlime.Slimefun.api.Slimefun; + public class BackpackListener implements Listener { public BackpackListener(SlimefunStartup plugin) { @@ -37,9 +38,10 @@ public class BackpackListener implements Listener { @EventHandler public void onClose(InventoryCloseEvent e) { if (Variables.enchanting.containsKey(e.getPlayer().getUniqueId())) Variables.enchanting.remove(e.getPlayer().getUniqueId()); + if (Variables.backpack.containsKey(e.getPlayer().getUniqueId())) { ((Player) e.getPlayer()).playSound(e.getPlayer().getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Backpacks.saveBackpack(e.getInventory(), Variables.backpack.get(e.getPlayer().getUniqueId())); + PlayerProfile.getBackpack(Variables.backpack.get(e.getPlayer().getUniqueId())).markDirty(); Variables.backpack.remove(e.getPlayer().getUniqueId()); } } @@ -71,11 +73,6 @@ public class BackpackListener implements Listener { } else if (e.getCurrentItem() != null && e.getCurrentItem().getType().toString().contains("SHULKER_BOX")) e.setCancelled(true); else if (sfItem instanceof SlimefunBackpack) e.setCancelled(true); - else if (SlimefunManager.isItemSimiliar(e.getCurrentItem(), SlimefunItems.VOIDBAG_SMALL, false)) e.setCancelled(true); - else if (SlimefunManager.isItemSimiliar(e.getCurrentItem(), SlimefunItems.VOIDBAG_MEDIUM, false)) e.setCancelled(true); - else if (SlimefunManager.isItemSimiliar(e.getCurrentItem(), SlimefunItems.VOIDBAG_BIG, false)) e.setCancelled(true); - else if (SlimefunManager.isItemSimiliar(e.getCurrentItem(), SlimefunItems.VOIDBAG_LARGE, false)) e.setCancelled(true); - else if (SlimefunManager.isItemSimiliar(e.getCurrentItem(), SlimefunItems.BOUND_VOIDBAG, false)) e.setCancelled(true); } } } @@ -85,207 +82,63 @@ public class BackpackListener implements Listener { if (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) { ItemStack item = e.getItem(); Player p = e.getPlayer(); + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_SMALL, false)) { - e.setCancelled(true); - if (Slimefun.hasUnlocked(p, SlimefunItems.BACKPACK_SMALL, true)) { - if (item.getAmount() == 1) { - for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { - if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = item.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, 9))); - im.setLore(lore); - item.setItemMeta(im); - break; - } - } - if(!Variables.backpack.containsValue(item)) - { - Backpacks.openBackpack(p, item); - p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Variables.backpack.put(p.getUniqueId(), item); - } - else Messages.local.sendTranslation(p, "backpack.already-open", true); - } - else Messages.local.sendTranslation(p, "backpack.no-stack", true); - } + openBackpack(SlimefunItems.BACKPACK_SMALL, 9, e, p, item); } else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_MEDIUM, false)) { - e.setCancelled(true); - if (Slimefun.hasUnlocked(p, SlimefunItems.BACKPACK_MEDIUM, true)) { - if (item.getAmount() == 1) { - for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { - if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = item.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, 18))); - im.setLore(lore); - item.setItemMeta(im); - break; - } - } - if(!Variables.backpack.containsValue(item)) - { - Backpacks.openBackpack(p, item); - p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Variables.backpack.put(p.getUniqueId(), item); - } - else Messages.local.sendTranslation(p, "backpack.already-open", true); - } - else Messages.local.sendTranslation(p, "backpack.no-stack", true); - } + openBackpack(SlimefunItems.BACKPACK_MEDIUM, 18, e, p, item); } else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_LARGE, false)) { - e.setCancelled(true); - if (Slimefun.hasUnlocked(p, SlimefunItems.BACKPACK_LARGE, true)) { - if (item.getAmount() == 1) { - for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { - if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = item.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, 27))); - im.setLore(lore); - item.setItemMeta(im); - break; - } - } - if(!Variables.backpack.containsValue(item)) - { - Backpacks.openBackpack(p, item); - p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Variables.backpack.put(p.getUniqueId(), item); - } - else Messages.local.sendTranslation(p, "backpack.already-open", true); - } - else Messages.local.sendTranslation(p, "backpack.no-stack", true); - } + openBackpack(SlimefunItems.BACKPACK_LARGE, 27, e, p, item); } else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.WOVEN_BACKPACK, false)) { - e.setCancelled(true); - if (Slimefun.hasUnlocked(p, SlimefunItems.WOVEN_BACKPACK, true)) { - if (item.getAmount() == 1) { - for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { - if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = item.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, 36))); - im.setLore(lore); - item.setItemMeta(im); - break; - } - } - if(!Variables.backpack.containsValue(item)) - { - Backpacks.openBackpack(p, item); - p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Variables.backpack.put(p.getUniqueId(), item); - } - else Messages.local.sendTranslation(p, "backpack.already-open", true); - } - else Messages.local.sendTranslation(p, "backpack.no-stack", true); - } + openBackpack(SlimefunItems.WOVEN_BACKPACK, 36, e, p, item); } else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GILDED_BACKPACK, false)) { - e.setCancelled(true); - if (Slimefun.hasUnlocked(p, SlimefunItems.GILDED_BACKPACK, true)) { - if (item.getAmount() == 1) { - for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { - if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = item.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, 45))); - im.setLore(lore); - item.setItemMeta(im); - break; - } - } - if(!Variables.backpack.containsValue(item)) - { - Backpacks.openBackpack(p, item); - p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Variables.backpack.put(p.getUniqueId(), item); - } - else Messages.local.sendTranslation(p, "backpack.already-open", true); - } - else Messages.local.sendTranslation(p, "backpack.no-stack", true); - } + openBackpack(SlimefunItems.GILDED_BACKPACK, 45, e, p, item); } else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.RADIANT_BACKPACK, false)) { - e.setCancelled(true); - if (Slimefun.hasUnlocked(p, SlimefunItems.RADIANT_BACKPACK, true)) { - if (item.getAmount() == 1) { - for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { - if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = item.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, 54))); - im.setLore(lore); - item.setItemMeta(im); - break; - } - } - if(!Variables.backpack.containsValue(item)) - { - Backpacks.openBackpack(p, item); - p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Variables.backpack.put(p.getUniqueId(), item); - } - else Messages.local.sendTranslation(p, "backpack.already-open", true); - } - else Messages.local.sendTranslation(p, "backpack.no-stack", true); - } + openBackpack(SlimefunItems.RADIANT_BACKPACK, 54, e, p, item); } else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) { - e.setCancelled(true); - if (Slimefun.hasUnlocked(p, SlimefunItems.BOUND_BACKPACK, true)) { - if (item.getAmount() == 1) { - for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { - if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = item.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, 36))); - im.setLore(lore); - item.setItemMeta(im); - break; - } - } - if(!Variables.backpack.containsValue(item)) - { - Backpacks.openBackpack(p, item); - p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Variables.backpack.put(p.getUniqueId(), item); - } - else Messages.local.sendTranslation(p, "backpack.already-open", true); - } - else Messages.local.sendTranslation(p, "backpack.no-stack", true); - } + openBackpack(SlimefunItems.BOUND_BACKPACK, 36, e, p, item); } else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.COOLER, false)) { - e.setCancelled(true); - if (Slimefun.hasUnlocked(p, SlimefunItems.COOLER, true)) { - if (item.getAmount() == 1) { - for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { - if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { - ItemMeta im = item.getItemMeta(); - List lore = im.getLore(); - lore.set(line, lore.get(line).replace("", Backpacks.createBackpack(p, 27))); - im.setLore(lore); - item.setItemMeta(im); - break; - } - } - if(!Variables.backpack.containsValue(item)) - { - Backpacks.openBackpack(p, item); - p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); - Variables.backpack.put(p.getUniqueId(), item); - } - else Messages.local.sendTranslation(p, "backpack.already-open", true); - } - else Messages.local.sendTranslation(p, "backpack.no-stack", true); - } + openBackpack(SlimefunItems.COOLER, 27, e, p, item); } } } + private void openBackpack(ItemStack sfItem, int size, PlayerInteractEvent e, Player p, ItemStack item) { + e.setCancelled(true); + + if (item.getAmount() == 1) { + if (Slimefun.hasUnlocked(p, sfItem, true)) { + PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); + + for (int line = 0; line < item.getItemMeta().getLore().size(); line++) { + if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: "))) { + BackpackInventory backpack = profile.createBackpack(size); + + ItemMeta im = item.getItemMeta(); + List lore = im.getLore(); + lore.set(line, lore.get(line).replace("", p.getUniqueId() + "#" + backpack.getID())); + im.setLore(lore); + item.setItemMeta(im); + break; + } + } + + if(!Variables.backpack.containsValue(item)) { + PlayerProfile.getBackpack(item).open(p); + p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F); + Variables.backpack.put(p.getUniqueId(), item); + } + else Messages.local.sendTranslation(p, "backpack.already-open", true); + } + } + else Messages.local.sendTranslation(p, "backpack.no-stack", true); + } + } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/BlockListener.java b/src/me/mrCookieSlime/Slimefun/listeners/BlockListener.java index f09d60504..7d48511c1 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/BlockListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/BlockListener.java @@ -54,7 +54,7 @@ public class BlockListener implements Listener { e.setCancelled(true); return; } - else if(b.getRelative(e.getDirection()) == null && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) { + else if (b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) { e.setCancelled(true); return; } @@ -69,7 +69,7 @@ public class BlockListener implements Listener { e.setCancelled(true); return; } - else if(b.getRelative(e.getDirection()) == null && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) { + else if (b.getRelative(e.getDirection()).getType() == Material.AIR && BlockStorage.hasBlockInfo(b.getRelative(e.getDirection()))) { e.setCancelled(true); return; } @@ -83,7 +83,7 @@ public class BlockListener implements Listener { if (!e.getHand().equals(EquipmentSlot.HAND)) return; Player p = e.getPlayer(); Block b = e.getClickedBlock(); - List multiblocks = new ArrayList(); + List multiblocks = new ArrayList<>(); for (MultiBlock mb: MultiBlock.list()) { if (mb.getTriggerBlock() == b.getType()) { Material[] blocks = mb.getBuild(); diff --git a/src/me/mrCookieSlime/Slimefun/listeners/CoolerListener.java b/src/me/mrCookieSlime/Slimefun/listeners/CoolerListener.java index f9096726d..47cb0b4c9 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/CoolerListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/CoolerListener.java @@ -1,10 +1,5 @@ package me.mrCookieSlime.Slimefun.listeners; -import me.mrCookieSlime.Slimefun.SlimefunStartup; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; -import me.mrCookieSlime.Slimefun.api.Backpacks; - import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; @@ -16,6 +11,12 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionEffect; +import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; +import me.mrCookieSlime.Slimefun.api.BackpackInventory; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; + public class CoolerListener implements Listener { public CoolerListener(SlimefunStartup plugin) { @@ -28,9 +29,11 @@ public class CoolerListener implements Listener { Player p = (Player) e.getEntity(); for (ItemStack item: p.getInventory().getContents()) { if (SlimefunManager.isItemSimiliar(item, SlimefunItem.getItem("COOLER"), false)) { - Inventory inv = Backpacks.getInventory(p, item); - if (inv != null) { + BackpackInventory backpack = PlayerProfile.getBackpack(item); + if (backpack != null) { + Inventory inv = backpack.getInventory(); ItemStack drink = null; + for (ItemStack i: inv.getContents()) { if (i != null && i.getType() == Material.POTION && i.hasItemMeta()) { drink = i; @@ -45,7 +48,7 @@ public class CoolerListener implements Listener { p.setSaturation(6F); p.playSound(p.getLocation(), Sound.ENTITY_GENERIC_DRINK, 1F, 1F); inv.removeItem(drink); - Backpacks.saveBackpack(inv, item); + backpack.markDirty(); break; } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/DamageListener.java b/src/me/mrCookieSlime/Slimefun/listeners/DamageListener.java index 04b6fc752..ebb266e4c 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/DamageListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/DamageListener.java @@ -2,12 +2,10 @@ package me.mrCookieSlime.Slimefun.listeners; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.Iterator; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.ChestedHorse; @@ -23,8 +21,9 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.SkullItem; import me.mrCookieSlime.EmeraldEnchants.EmeraldEnchants; import me.mrCookieSlime.EmeraldEnchants.ItemEnchantment; import me.mrCookieSlime.Slimefun.SlimefunStartup; @@ -88,19 +87,28 @@ public class DamageListener implements Listener { if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.ZOMBIE"))) { e.getDrops().add(new ItemStack(Material.ZOMBIE_HEAD)); } - }else if (e.getEntity() instanceof WitherSkeleton) { + } + else if (e.getEntity() instanceof WitherSkeleton) { if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.WITHER_SKELETON"))) e.getDrops().add(new ItemStack(Material.WITHER_SKELETON_SKULL)); - } else if (e.getEntity() instanceof Skeleton) { + } + else if (e.getEntity() instanceof Skeleton) { if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.SKELETON"))) e.getDrops().add(new ItemStack(Material.SKELETON_SKULL)); - } else if (e.getEntity() instanceof Creeper) { + } + else if (e.getEntity() instanceof Creeper) { if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.CREEPER"))) { e.getDrops().add(new ItemStack(Material.CREEPER_HEAD)); } - } else if (e.getEntity() instanceof Player) { + } + else if (e.getEntity() instanceof Player) { if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.PLAYER"))) { - e.getDrops().add(new SkullItem(((Player) e.getEntity()).getName())); + ItemStack skull = new ItemStack(Material.PLAYER_HEAD); + ItemMeta meta = skull.getItemMeta(); + ((SkullMeta) meta).setOwningPlayer((Player) e.getEntity()); + skull.setItemMeta(meta); + + e.getDrops().add(skull); } } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/ItemListener.java b/src/me/mrCookieSlime/Slimefun/listeners/ItemListener.java index 2cfe25cb6..d2c2c75f8 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/ItemListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/ItemListener.java @@ -102,6 +102,7 @@ public class ItemListener implements Listener { public void debug(PlayerInteractEvent e) { if (e.getAction().equals(Action.PHYSICAL) || !e.getHand().equals(EquipmentSlot.HAND)) return; Player p = e.getPlayer(); + if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), SlimefunItems.DEBUG_FISH, true) || SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInOffHand(), SlimefunItems.DEBUG_FISH, true)) { e.setCancelled(true); if (p.isOp()) { diff --git a/src/me/mrCookieSlime/Slimefun/listeners/PlayerQuitListener.java b/src/me/mrCookieSlime/Slimefun/listeners/PlayerQuitListener.java index 5876dd3d2..8c5a25a26 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/PlayerQuitListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/PlayerQuitListener.java @@ -6,6 +6,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import me.mrCookieSlime.Slimefun.SlimefunGuide; import me.mrCookieSlime.Slimefun.SlimefunStartup; +import me.mrCookieSlime.Slimefun.api.PlayerProfile; public class PlayerQuitListener implements Listener { @@ -16,6 +17,10 @@ public class PlayerQuitListener implements Listener { @EventHandler public void onDisconnect(PlayerQuitEvent e) { SlimefunGuide.history.remove(e.getPlayer().getUniqueId()); + + if (PlayerProfile.isLoaded(e.getPlayer().getUniqueId())) { + PlayerProfile.fromUUID(e.getPlayer().getUniqueId()).markForDeletion(); + } } } diff --git a/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java b/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java index 54bb8878b..29f7b1471 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/ToolListener.java @@ -5,8 +5,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.bukkit.Material; import org.bukkit.Tag; @@ -252,11 +250,11 @@ public class ToolListener implements Listener { if (!drops.isEmpty()) { e.getBlock().setType(Material.AIR); - - for (ItemStack drop : drops) { - if (drop != null) { - e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation(), drop); - } + if(e.isDropItems()) + for (ItemStack drop : drops) { + if (drop != null) + e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation(), drop); + } } } diff --git a/src/plugin.yml b/src/plugin.yml index 23797f09b..4ed59644c 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -5,7 +5,7 @@ description: Slimefun basically turns your entire Server into a FTB modpack with website: http://TheBusyBiscuit.github.io/ main: me.mrCookieSlime.Slimefun.SlimefunStartup -softdepend: [CS-CoreLib, ClearLag, WorldEdit] +softdepend: [CS-CoreLib, ClearLag, WorldEdit, PlaceholderAPI] api-version: 1.14