1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 03:35:51 +00:00

Merge pull request #1 from TheBusyBiscuit/master

Update remote repo
This commit is contained in:
dniym 2019-08-26 10:39:49 -04:00 committed by GitHub
commit 46357b1c5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
56 changed files with 1101 additions and 875 deletions

22
pom.xml
View File

@ -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>

View File

@ -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());
});

View File

@ -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) {

View File

@ -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"));

View File

@ -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

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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;

View File

@ -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;
}
}
}

View File

@ -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;

View File

@ -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));
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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();

View File

@ -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});

View File

@ -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";
}
}

View File

@ -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("");

View File

@ -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));

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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"));

View File

@ -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();

View File

@ -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<>();

View 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();
}
}

View File

@ -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();
}
}
}

View File

@ -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(){

View File

@ -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 {

View 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;
}
}

View 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;
}
}
}

View File

@ -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;

View File

@ -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) {

View File

@ -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"
+ "}";
}
}

View File

@ -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");

View File

@ -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++;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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() {

View File

@ -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);

View 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)!");
}
}
}

View File

@ -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")) {

View File

@ -1,4 +1,4 @@
package me.mrCookieSlime.Slimefun.Commands;
package me.mrCookieSlime.Slimefun.commands;
import java.util.ArrayList;
import java.util.List;

View 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;
}
}

View File

@ -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);
}

View File

@ -1,4 +1,4 @@
package me.mrCookieSlime.Slimefun.GitHub;
package me.mrCookieSlime.Slimefun.hooks.github;
import java.util.HashMap;
import java.util.Map;

View File

@ -1,4 +1,4 @@
package me.mrCookieSlime.Slimefun.GitHub;
package me.mrCookieSlime.Slimefun.hooks.github;
import java.io.BufferedReader;
import java.io.File;

View File

@ -1,4 +1,4 @@
package me.mrCookieSlime.Slimefun.GitHub;
package me.mrCookieSlime.Slimefun.hooks.github;
import java.io.IOException;
import java.io.InputStreamReader;

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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();

View File

@ -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;
}
}

View File

@ -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);
}
}
}

View File

@ -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()) {

View File

@ -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();
}
}
}

View File

@ -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);
}
}
}

View File

@ -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