mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-20 03:35:51 +00:00
commit
46357b1c5f
22
pom.xml
22
pom.xml
@ -34,6 +34,10 @@
|
||||
<id>CodeMC</id>
|
||||
<url>https://repo.codemc.org/repository/maven-public</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>placeholderapi-repo</id>
|
||||
<url>http://repo.extendedclip.com/content/repositories/placeholderapi/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<build>
|
||||
@ -109,12 +113,6 @@
|
||||
<version>1.14.2-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sk89q.worldedit</groupId>
|
||||
<artifactId>worldedit-bukkit</artifactId>
|
||||
<version>7.0.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.TheBusyBiscuit</groupId>
|
||||
<artifactId>CS-CoreLib</artifactId>
|
||||
@ -133,6 +131,18 @@
|
||||
<version>1.5</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sk89q.worldedit</groupId>
|
||||
<artifactId>worldedit-bukkit</artifactId>
|
||||
<version>7.0.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.clip</groupId>
|
||||
<artifactId>placeholderapi</artifactId>
|
||||
<version>2.10.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.minebuilders</groupId>
|
||||
<artifactId>clearlag-core</artifactId>
|
||||
|
@ -41,7 +41,7 @@ public class RitualAnimation implements Runnable {
|
||||
this.output = output;
|
||||
this.pedestals = pedestals;
|
||||
this.items = items;
|
||||
this.particles = new ArrayList<Location>();
|
||||
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());
|
||||
});
|
||||
|
||||
|
@ -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<Integer, ItemStack> items = d.getInventory().addItem(stack);
|
||||
if (items.isEmpty()) BlockStorage.getInventory(b).replaceExistingItem(slot, null);
|
||||
Optional<ItemStack> optional = d.getInventory().addItem(stack).values().stream().findFirst();
|
||||
|
||||
if (optional.isPresent()) {
|
||||
BlockStorage.getInventory(b).replaceExistingItem(slot, optional.get());
|
||||
}
|
||||
else {
|
||||
for (Map.Entry<Integer, ItemStack> 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) {
|
||||
|
@ -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<Config> {
|
||||
|
||||
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"));
|
@ -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<Config> {
|
||||
|
||||
ProgrammableAndroid android;
|
||||
private ProgrammableAndroid android;
|
||||
|
||||
public ScriptReputationSorter(ProgrammableAndroid programmableAndroid) {
|
||||
this.android = programmableAndroid;
|
||||
public ScriptReputationSorter(ProgrammableAndroid android) {
|
||||
this.android = android;
|
||||
}
|
||||
|
||||
@Override
|
@ -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<String, SlimefunItem> 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);
|
||||
}
|
||||
|
||||
}
|
@ -4,6 +4,7 @@ import java.util.List;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface PostSlimefunLoadingHandler {
|
||||
|
||||
public void run(List<SlimefunItem> preloaded, List<SlimefunItem> loaded, List<SlimefunItem> postloaded);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ import org.bukkit.Material;
|
||||
|
||||
public class MultiBlock {
|
||||
|
||||
public static List<MultiBlock> list = new ArrayList<MultiBlock>();
|
||||
public static List<MultiBlock> list = new ArrayList<>();
|
||||
|
||||
Material[] blocks;
|
||||
Material trigger;
|
||||
|
@ -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<Research> list = new ArrayList<>();
|
||||
public static List<Research> list = new LinkedList<>();
|
||||
|
||||
/**
|
||||
* Contains all Research Titles
|
||||
*/
|
||||
public static List<String> titles;
|
||||
|
||||
/**
|
||||
* Contains all the players (UUIDs) that are currently unlocking a research.
|
||||
* @since 4.0
|
||||
*/
|
||||
public static List<UUID> researching = new ArrayList<>();
|
||||
public static Set<UUID> researching = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Whether researching in creative is free.
|
||||
* @since 4.0
|
||||
@ -64,6 +74,7 @@ public class Research {
|
||||
private String name;
|
||||
private List<SlimefunItem> 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<SlimefunItem> getEffectedItems() {
|
||||
public List<SlimefunItem> 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<Research> researched = new ArrayList<Research>();
|
||||
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<Research> 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<Research> 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<Research> 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<Research> getResearches(UUID uuid) {
|
||||
List<Research> researched = new ArrayList<Research>();
|
||||
List<Research> 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<Research> getResearches(String uuid) {
|
||||
return getResearches(UUID.fromString(uuid));
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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<Location, MachineFuel> processing = new HashMap<Location, MachineFuel>();
|
||||
public static Map<Location, Integer> progress = new HashMap<Location, Integer>();
|
||||
public static Map<Location, MachineFuel> processing = new HashMap<>();
|
||||
public static Map<Location, Integer> progress = new HashMap<>();
|
||||
|
||||
private static final BlockFace[] cooling =
|
||||
{
|
||||
@ -56,7 +57,7 @@ public abstract class AReactor extends SlimefunItem {
|
||||
BlockFace.NORTH_WEST
|
||||
};
|
||||
|
||||
private Set<MachineFuel> recipes = new HashSet<MachineFuel>();
|
||||
private Set<MachineFuel> 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<Integer, ItemStack> map = inv.addItem(item);
|
||||
Optional<ItemStack> optional = inv.addItem(item).values().stream().findFirst();
|
||||
|
||||
for (int slot : slots) {
|
||||
BlockStorage.getInventory(l).replaceExistingItem(slot, inv.getItem(slot));
|
||||
}
|
||||
|
||||
for (Map.Entry<Integer, ItemStack> entry : map.entrySet()) {
|
||||
return entry.getValue();
|
||||
}
|
||||
|
||||
return null;
|
||||
if (optional.isPresent()) return optional.get();
|
||||
else return null;
|
||||
}
|
||||
|
||||
public abstract ItemStack getProgressBar();
|
||||
|
@ -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});
|
||||
|
@ -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<Recipe> 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<Recipe> 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";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<String> lore = new ArrayList<String>();
|
||||
lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks()));
|
||||
lore.add("");
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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: <ID>"))) {
|
||||
int backpackID = PlayerProfile.fromUUID(p.getUniqueId()).createBackpack(size).getID();
|
||||
|
||||
ItemMeta im = adding.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", Backpacks.createBackpack(p, size)));
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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: <ID>"))) {
|
||||
int backpackID = PlayerProfile.fromUUID(p.getUniqueId()).createBackpack(size).getID();
|
||||
|
||||
ItemMeta im = adding.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", Backpacks.createBackpack(p, size)));
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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<ItemStack> 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<String> 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<ItemStack> 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<Research> 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<Research> 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;
|
||||
}
|
||||
|
@ -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<UUID, List<Object>> history = new HashMap<>();
|
||||
public static int month = 0;
|
||||
|
||||
public static List<Contributor> contributors = new ArrayList<Contributor>();
|
||||
public static List<Contributor> 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<Category> categories = Slimefun.current_categories;
|
||||
List<GuideHandler> handlers = Slimefun.guide_handlers2;
|
||||
List<GuideHandler> 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<Object> 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<Recipe> recipes = new ArrayList<Recipe>();
|
||||
List<Recipe> recipes = new ArrayList<>();
|
||||
Iterator<Recipe> 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<ItemStack> 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<ItemStack> 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<String> lore = new ArrayList<String>();
|
||||
List<String> 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<String> lore = new ArrayList<String>();
|
||||
List<String> 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"));
|
||||
|
@ -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();
|
||||
|
@ -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<UUID, Boolean> jump_state = new HashMap<>();
|
||||
|
77
src/me/mrCookieSlime/Slimefun/api/BackpackInventory.java
Normal file
77
src/me/mrCookieSlime/Slimefun/api/BackpackInventory.java
Normal file
@ -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();
|
||||
}
|
||||
|
||||
}
|
@ -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<Integer> 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -19,8 +19,8 @@ public class BlockInfoConfig extends Config {
|
||||
}
|
||||
|
||||
public BlockInfoConfig(Map<String, String> data) {
|
||||
super((File)null,(FileConfiguration)null);
|
||||
this.data=data;
|
||||
super(null, null);
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public Map<String, String> getMap(){
|
||||
|
@ -204,12 +204,12 @@ public class BlockStorage {
|
||||
|
||||
Map<Location, BlockMenu> inventories2 = new HashMap<>(inventories);
|
||||
for (Map.Entry<Location, BlockMenu> entry: inventories2.entrySet()) {
|
||||
changes += entry.getValue().changes;
|
||||
changes += entry.getValue().getUnsavedChanges();
|
||||
}
|
||||
|
||||
Map<String, UniversalBlockMenu> universal_inventories2 = new HashMap<>(universal_inventories);
|
||||
for (Map.Entry<String, UniversalBlockMenu> 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 {
|
||||
|
104
src/me/mrCookieSlime/Slimefun/api/ErrorReport.java
Normal file
104
src/me/mrCookieSlime/Slimefun/api/ErrorReport.java
Normal file
@ -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<String> plugins = new ArrayList<>();
|
||||
List<String> 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;
|
||||
}
|
||||
|
||||
}
|
213
src/me/mrCookieSlime/Slimefun/api/PlayerProfile.java
Normal file
213
src/me/mrCookieSlime/Slimefun/api/PlayerProfile.java
Normal file
@ -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<UUID, PlayerProfile> profiles = new HashMap<>();
|
||||
|
||||
private UUID uuid;
|
||||
private Config cfg;
|
||||
private boolean dirty = false;
|
||||
private boolean markedForDeletion = false;
|
||||
|
||||
private Set<Research> researches = new HashSet<>();
|
||||
private Map<Integer, BackpackInventory> 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<Research> of all Researches this Player has unlocked
|
||||
*/
|
||||
public Set<Research> 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<PlayerProfile> iterator() {
|
||||
return profiles.values().iterator();
|
||||
}
|
||||
|
||||
public static BackpackInventory getBackpack(ItemStack item) {
|
||||
if (item == null || !item.hasItemMeta() || !item.getItemMeta().hasLore()) return null;
|
||||
|
||||
Optional<Integer> 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -26,28 +26,28 @@ import me.mrCookieSlime.Slimefun.Setup.Messages;
|
||||
*/
|
||||
public class Slimefun {
|
||||
|
||||
public static Map<Integer, List<GuideHandler>> guide_handlers = new HashMap<Integer, List<GuideHandler>>();
|
||||
public static List<GuideHandler> guide_handlers2 = new ArrayList<GuideHandler>();
|
||||
public static Map<Integer, List<GuideHandler>> 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<Category> current_categories = new ArrayList<Category>();
|
||||
public static List<Category> current_categories = new ArrayList<>();
|
||||
|
||||
public static void registerGuideHandler(GuideHandler handler) {
|
||||
List<GuideHandler> handlers = new ArrayList<GuideHandler>();
|
||||
List<GuideHandler> 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;
|
||||
|
@ -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) {
|
||||
|
@ -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<String> plugins = new ArrayList<>();
|
||||
List<String> 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<BlockTicker> 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"
|
||||
+ "}";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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++;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -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() {
|
||||
|
@ -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);
|
30
src/me/mrCookieSlime/Slimefun/autosave/PlayerAutoSaver.java
Normal file
30
src/me/mrCookieSlime/Slimefun/autosave/PlayerAutoSaver.java
Normal file
@ -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<PlayerProfile> 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)!");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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<String> addons = new ArrayList<String>();
|
||||
List<String> addons = new ArrayList<>();
|
||||
|
||||
for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
|
||||
if (plugin.getDescription().getDepend().contains("Slimefun") || plugin.getDescription().getSoftDepend().contains("Slimefun")) {
|
@ -1,4 +1,4 @@
|
||||
package me.mrCookieSlime.Slimefun.Commands;
|
||||
package me.mrCookieSlime.Slimefun.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
77
src/me/mrCookieSlime/Slimefun/hooks/PlaceholderAPIHook.java
Normal file
77
src/me/mrCookieSlime/Slimefun/hooks/PlaceholderAPIHook.java
Normal file
@ -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<Research> stream = PlayerProfile.fromUUID(p.getUniqueId()).getResearches().stream();
|
||||
return String.valueOf(stream.mapToInt(r -> r.getCost()).sum());
|
||||
}
|
||||
|
||||
if (params.equals("researches_total_researches_unlocked")) {
|
||||
Set<Research> 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<Research> 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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package me.mrCookieSlime.Slimefun.GitHub;
|
||||
package me.mrCookieSlime.Slimefun.hooks.github;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
@ -1,4 +1,4 @@
|
||||
package me.mrCookieSlime.Slimefun.GitHub;
|
||||
package me.mrCookieSlime.Slimefun.hooks.github;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
@ -1,4 +1,4 @@
|
||||
package me.mrCookieSlime.Slimefun.GitHub;
|
||||
package me.mrCookieSlime.Slimefun.hooks.github;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
@ -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);
|
@ -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<ItemStack> items = new ArrayList<ItemStack>();
|
||||
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<ItemStack> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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: <ID>"))) {
|
||||
ItemMeta im = item.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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: <ID>"))) {
|
||||
ItemMeta im = item.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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: <ID>"))) {
|
||||
ItemMeta im = item.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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: <ID>"))) {
|
||||
ItemMeta im = item.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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: <ID>"))) {
|
||||
ItemMeta im = item.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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: <ID>"))) {
|
||||
ItemMeta im = item.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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: <ID>"))) {
|
||||
ItemMeta im = item.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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: <ID>"))) {
|
||||
ItemMeta im = item.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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: <ID>"))) {
|
||||
BackpackInventory backpack = profile.createBackpack(size);
|
||||
|
||||
ItemMeta im = item.getItemMeta();
|
||||
List<String> lore = im.getLore();
|
||||
lore.set(line, lore.get(line).replace("<ID>", 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<MultiBlock> multiblocks = new ArrayList<MultiBlock>();
|
||||
List<MultiBlock> multiblocks = new ArrayList<>();
|
||||
for (MultiBlock mb: MultiBlock.list()) {
|
||||
if (mb.getTriggerBlock() == b.getType()) {
|
||||
Material[] blocks = mb.getBuild();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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()) {
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user