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