1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-21 12:15:50 +00:00

Merge pull request #3 from TheBusyBiscuit/master

updating fork
This commit is contained in:
dniym 2019-09-04 17:05:47 -04:00 committed by GitHub
commit 428bfcc575
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
263 changed files with 10327 additions and 9309 deletions

14
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,14 @@
## Description
<!-- Please explain your changes -->
## Changes
<!-- Please list all the changes you have made -->
## Related Issues
<!-- Please tag any Issues related to your Pull Request -->
<!-- Syntax: "Resolves #000" -->
## Testability
<!-- Check the boxes below if - and only if - you tested your changes thoroughly -->
- [ ] I have fully tested the proposed changes and promise that they will not break everything into chaos.
- [ ] I have also tested the proposed changes in combination with various popular addons and can confirm my changes do not break them.

View File

@ -0,0 +1,18 @@
## Description
<!-- Please explain your changes -->
## Changes
<!-- Please list all the changes you have made -->
## How this benefits Slimefun
<!-- Please explain why you think this should be added to Slimefun -->
<!-- In other words: Why did you not make an Addon? -->
## Related Issues (Optional)
<!-- Please tag any Issues related to your Pull Request -->
<!-- Syntax: "Resolves #000" -->
## Testability
<!-- Check the boxes below if - and only if - you tested your changes thoroughly -->
* [ ] I have fully tested the proposed changes and promise that they will not break everything into chaos.
* [ ] I have also tested the proposed changes in combination with various popular addons and can confirm my changes do not break them.

14
.github/PULL_REQUEST_TEMPLATE/fix.md vendored Normal file
View File

@ -0,0 +1,14 @@
## Description
<!-- Please explain your changes -->
## Changes
<!-- Please list all the changes you have made -->
## Related Issues
<!-- Please tag any Issues related to your Pull Request -->
<!-- Syntax: "Fixes #000" -->
## Testability
<!-- Check the boxes below if - and only if - you tested your changes thoroughly -->
* [ ] I have fully tested the proposed changes and promise that they will not break everything into chaos.
* [ ] I have also tested the proposed changes in combination with various popular addons and can confirm my changes do not break them.

View File

@ -24,6 +24,9 @@ Release Candidates or "stable" builds will have a proper Version such as "4.1.18
</a> </a>
</p> </p>
You can also find the most recent development builds for all my other Plugins (including Slimefun Addons) on here:
https://thebusybiscuit.github.io/builds/
## Discord ## Discord
You can find Slimefun's community on Discord! You can find Slimefun's community on Discord!
Click the badge to join it for Suggestions/Questions or other discussions about this plugin. Click the badge to join it for Suggestions/Questions or other discussions about this plugin.

View File

@ -67,6 +67,8 @@
<artifact>com.github.thebusybiscuit:CS-CoreLib2</artifact> <artifact>com.github.thebusybiscuit:CS-CoreLib2</artifact>
<includes> <includes>
<include>**/cscorelib2/updater/**</include> <include>**/cscorelib2/updater/**</include>
<include>**/cscorelib2/materials/**</include>
<include>**/cscorelib2/protection/**</include>
</includes> </includes>
</filter> </filter>
</filters> </filters>
@ -122,7 +124,7 @@
<dependency> <dependency>
<groupId>com.github.thebusybiscuit</groupId> <groupId>com.github.thebusybiscuit</groupId>
<artifactId>CS-CoreLib2</artifactId> <artifactId>CS-CoreLib2</artifactId>
<version>0.3.7</version> <version>0.4.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -14,6 +14,7 @@ options:
research-give-fireworks: true research-give-fireworks: true
legacy-ore-washer: false legacy-ore-washer: false
legacy-dust-washer: false legacy-dust-washer: false
legacy-ore-grinder: true
guide: guide:
default-view-book: false default-view-book: false
URID: URID:

File diff suppressed because it is too large Load Diff

View File

@ -1,151 +0,0 @@
package me.mrCookieSlime.Slimefun.CSCoreLibSetup;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.bukkit.plugin.Plugin;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class CSCoreLibLoader {
Plugin plugin;
URL url;
URL download;
File file;
public CSCoreLibLoader(Plugin plugin) {
this.plugin = plugin;
try {
this.url = new URL("https://api.curseforge.com/servermods/files?projectIds=88802");
} catch (MalformedURLException e) {
}
}
public boolean load() {
if (plugin.getServer().getPluginManager().isPluginEnabled("CS-CoreLib")) return true;
else {
System.err.println(" ");
System.err.println("#################### - INFO - ####################");
System.err.println(" ");
System.err.println(plugin.getName() + " could not be loaded.");
System.err.println("It appears that you have not installed CS-CoreLib");
System.err.println("Your Server will now try to download and install");
System.err.println("CS-CoreLib for you.");
System.err.println("You will be asked to restart your Server when it's finished.");
System.err.println("If this somehow fails, please download and install CS-CoreLib manually:");
System.err.println("https://dev.bukkit.org/projects/cs-corelib");
System.err.println(" ");
System.err.println("#################### - INFO - ####################");
System.err.println(" ");
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> {
if (connect()) install();
}, 10L);
return false;
}
}
private boolean connect() {
try {
final URLConnection connection = this.url.openConnection();
connection.setConnectTimeout(5000);
connection.addRequestProperty("User-Agent", "CS-CoreLib Loader (by mrCookieSlime)");
connection.setDoOutput(true);
final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
final JsonArray array = new JsonParser().parse(reader).getAsJsonArray();
final JsonObject json = array.get(array.size() - 1).getAsJsonObject();
download = traceURL(json.get("downloadUrl").getAsString().replace("https:", "http:"));
file = new File("plugins/" + json.get("name").getAsString() + ".jar");
return true;
} catch (IOException e) {
System.err.println(" ");
System.err.println("#################### - WARNING - ####################");
System.err.println(" ");
System.err.println("Could not connect to BukkitDev.");
System.err.println("Please download & install CS-CoreLib manually:");
System.err.println("https://dev.bukkit.org/projects/cs-corelib");
System.err.println(" ");
System.err.println("#################### - WARNING - ####################");
System.err.println(" ");
return false;
}
}
private URL traceURL(String location) throws IOException {
HttpURLConnection connection = null;
while (true) {
URL url = new URL(location);
connection = (HttpURLConnection) url.openConnection();
connection.setInstanceFollowRedirects(false);
connection.setConnectTimeout(5000);
connection.addRequestProperty("User-Agent", "Auto Updater (by mrCookieSlime)");
switch (connection.getResponseCode()) {
case HttpURLConnection.HTTP_MOVED_PERM:
case HttpURLConnection.HTTP_MOVED_TEMP:
String loc = connection.getHeaderField("Location");
location = new URL(new URL(location), loc).toExternalForm();
continue;
}
break;
}
return new URL(connection.getURL().toString().replaceAll(" ", "%20"));
}
private void install() {
BufferedInputStream input = null;
FileOutputStream output = null;
try {
input = new BufferedInputStream(download.openStream());
output = new FileOutputStream(file);
final byte[] data = new byte[1024];
int read;
while ((read = input.read(data, 0, 1024)) != -1) {
output.write(data, 0, read);
}
} catch (Exception ex) {
System.err.println(" ");
System.err.println("#################### - WARNING - ####################");
System.err.println(" ");
System.err.println("Failed to download CS-CoreLib");
System.err.println("Please download & install CS-CoreLib manually:");
System.err.println("https://dev.bukkit.org/projects/cs-corelib");
System.err.println(" ");
System.err.println("#################### - WARNING - ####################");
System.err.println(" ");
} finally {
try {
if (input != null) input.close();
if (output != null) output.close();
System.err.println(" ");
System.err.println("#################### - INFO - ####################");
System.err.println(" ");
System.err.println("Please restart your Server to finish the Installation");
System.err.println("of " + plugin.getName() + " and CS-CoreLib");
System.err.println(" ");
System.err.println("#################### - INFO - ####################");
System.err.println(" ");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

View File

@ -12,10 +12,10 @@ public class MultiBlockInteractEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
Player p; private Player p;
MultiBlock mb; private MultiBlock mb;
Block b; private Block b;
boolean cancelled; private boolean cancelled;
public HandlerList getHandlers() { public HandlerList getHandlers() {
return handlers; return handlers;

View File

@ -11,9 +11,9 @@ public class ResearchUnlockEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
Player p; private Player p;
Research r; private Research r;
boolean cancelled; private boolean cancelled;
public HandlerList getHandlers() { public HandlerList getHandlers() {
return handlers; return handlers;

View File

@ -5,16 +5,24 @@ import org.bukkit.inventory.ItemStack;
public interface OreGenResource { public interface OreGenResource {
// Returns the default supply of this resource in that biome /**
public int getDefaultSupply(Biome biome); * Returns the default supply of this resource in that biome
*/
int getDefaultSupply(Biome biome);
// Name/ID e.g. "Oil" /**
public String getName(); * Name/ID e.g. "Oil"
*/
String getName();
// For the GEO-Scanner /**
public ItemStack getIcon(); * For the GEO-Scanner
*/
ItemStack getIcon();
// Measurement Unit e.g. "Buckets" /**
public String getMeasurementUnit(); * Measurement Unit e.g. "Buckets"
*/
String getMeasurementUnit();
} }

View File

@ -1,26 +1,27 @@
package me.mrCookieSlime.Slimefun.GEO; package me.mrCookieSlime.Slimefun.GEO;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.logging.Level;
import java.util.Map;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class OreGenSystem { public final class OreGenSystem {
public static Map<String, OreGenResource> map = new HashMap<>(); private OreGenSystem() {}
public static Collection<OreGenResource> listResources() { public static Collection<OreGenResource> listResources() {
return map.values(); return SlimefunPlugin.getUtilities().resources.values();
} }
public static void registerResource(OreGenResource resource) { public static void registerResource(OreGenResource resource) {
map.put(resource.getName(), resource); SlimefunPlugin.getUtilities().resources.put(resource.getName(), resource);
System.out.println("[Slimefun - GEO] Registering Ore Gen: " + resource.getName()); Slimefun.getLogger().log(Level.INFO, "Registering Ore Gen: " + resource.getName());
Config cfg = new Config("plugins/Slimefun/generators/" + resource.getName() + ".cfg"); Config cfg = new Config("plugins/Slimefun/generators/" + resource.getName() + ".cfg");
for (Biome biome: Biome.values()) { for (Biome biome: Biome.values()) {
@ -30,7 +31,7 @@ public class OreGenSystem {
} }
public static OreGenResource getResource(String name) { public static OreGenResource getResource(String name) {
return map.get(name); return SlimefunPlugin.getUtilities().resources.get(name);
} }
private static int getDefault(OreGenResource resource, Biome biome) { private static int getDefault(OreGenResource resource, Biome biome) {

View File

@ -1,4 +1,4 @@
package me.mrCookieSlime.Slimefun.GEO.Resources; package me.mrCookieSlime.Slimefun.GEO.resources;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -10,14 +10,7 @@ public class NetherIceResource implements OreGenResource {
@Override @Override
public int getDefaultSupply(Biome biome) { public int getDefaultSupply(Biome biome) {
switch (biome) { return biome == Biome.NETHER ? 32: 0;
case NETHER: {
return 32;
}
default: {
return 0;
}
}
} }
@Override @Override

View File

@ -1,4 +1,4 @@
package me.mrCookieSlime.Slimefun.GEO.Resources; package me.mrCookieSlime.Slimefun.GEO.resources;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -14,35 +14,30 @@ public class OilResource implements OreGenResource {
switch (biome) { switch (biome) {
case SNOWY_BEACH: case SNOWY_BEACH:
case STONE_SHORE: case STONE_SHORE:
case BEACH: { case BEACH:
return CSCoreLib.randomizer().nextInt(6) + 2; return CSCoreLib.randomizer().nextInt(6) + 2;
}
case DESERT: case DESERT:
case DESERT_HILLS: case DESERT_HILLS:
case DESERT_LAKES: { case DESERT_LAKES:
return CSCoreLib.randomizer().nextInt(40) + 19; return CSCoreLib.randomizer().nextInt(40) + 19;
}
case MOUNTAINS: case MOUNTAINS:
case GRAVELLY_MOUNTAINS: case GRAVELLY_MOUNTAINS:
case MOUNTAIN_EDGE: case MOUNTAIN_EDGE:
case RIVER: { case RIVER:
return CSCoreLib.randomizer().nextInt(14) + 13; return CSCoreLib.randomizer().nextInt(14) + 13;
}
case SNOWY_MOUNTAINS: case SNOWY_MOUNTAINS:
case SNOWY_TUNDRA: case SNOWY_TUNDRA:
case ICE_SPIKES: case ICE_SPIKES:
case FROZEN_OCEAN: case FROZEN_OCEAN:
case FROZEN_RIVER: { case FROZEN_RIVER:
return CSCoreLib.randomizer().nextInt(11) + 3; return CSCoreLib.randomizer().nextInt(11) + 3;
}
case THE_END: case THE_END:
case NETHER: { case NETHER:
return 0; return 0;
}
case BADLANDS: case BADLANDS:
@ -52,25 +47,21 @@ public class OilResource implements OreGenResource {
case MODIFIED_BADLANDS_PLATEAU: case MODIFIED_BADLANDS_PLATEAU:
case MODIFIED_WOODED_BADLANDS_PLATEAU: case MODIFIED_WOODED_BADLANDS_PLATEAU:
case MUSHROOM_FIELDS: case MUSHROOM_FIELDS:
case MUSHROOM_FIELD_SHORE: { case MUSHROOM_FIELD_SHORE:
return CSCoreLib.randomizer().nextInt(24) + 14; return CSCoreLib.randomizer().nextInt(24) + 14;
}
case DEEP_OCEAN: case DEEP_OCEAN:
case OCEAN: { case OCEAN:
return CSCoreLib.randomizer().nextInt(62) + 24; return CSCoreLib.randomizer().nextInt(62) + 24;
}
case SWAMP: case SWAMP:
case SWAMP_HILLS: { case SWAMP_HILLS:
return CSCoreLib.randomizer().nextInt(20) + 4; return CSCoreLib.randomizer().nextInt(20) + 4;
}
default: { default:
return CSCoreLib.randomizer().nextInt(10) + 6; return CSCoreLib.randomizer().nextInt(10) + 6;
} }
} }
}
@Override @Override
public String getName() { public String getName() {

View File

@ -1,7 +1,6 @@
package me.mrCookieSlime.Slimefun.GPS; package me.mrCookieSlime.Slimefun.GPS;
import java.util.ArrayList; import java.util.Set;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -16,12 +15,13 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.CustomBookOverlay; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.CustomBookOverlay;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.MenuHelper; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.MenuHelper;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
public class Elevator { public final class Elevator {
public static List<UUID> ignored = new ArrayList<>(); private Elevator() {}
public static void openEditor(Player p, final Block b) { public static void openEditor(Player p, final Block b) {
ChestMenu menu = new ChestMenu("Elevator Settings"); ChestMenu menu = new ChestMenu("Elevator Settings");
@ -35,7 +35,7 @@ public class Elevator {
pl.sendMessage(""); pl.sendMessage("");
MenuHelper.awaitChatInput(pl, (player, message) -> { MenuHelper.awaitChatInput(pl, (player, message) -> {
BlockStorage.addBlockInfo(b, "floor", message.replaceAll("&", "&")); BlockStorage.addBlockInfo(b, "floor", message.replace(ChatColor.COLOR_CHAR, '&'));
player.sendMessage(""); player.sendMessage("");
player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &eSuccessfully named this Floor:")); player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &eSuccessfully named this Floor:"));
@ -53,8 +53,10 @@ public class Elevator {
} }
public static void openDialogue(Player p, Block b) { public static void openDialogue(Player p, Block b) {
if (ignored.contains(p.getUniqueId())) { Set<UUID> elevatorUsers = SlimefunPlugin.getUtilities().elevatorUsers;
ignored.remove(p.getUniqueId());
if (elevatorUsers.contains(p.getUniqueId())) {
elevatorUsers.remove(p.getUniqueId());
return; return;
} }

View File

@ -5,6 +5,7 @@ import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -24,6 +25,7 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.MenuHelper;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler;
import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.GEO.OreGenResource; import me.mrCookieSlime.Slimefun.GEO.OreGenResource;
import me.mrCookieSlime.Slimefun.GEO.OreGenSystem; import me.mrCookieSlime.Slimefun.GEO.OreGenSystem;
import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.Messages;
@ -35,17 +37,21 @@ public class GPSNetwork {
private int[] border = new int[] {0, 1, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}; private int[] border = new int[] {0, 1, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53};
private int[] inventory = new int[] {19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43}; private int[] inventory = new int[] {19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43};
public void updateTransmitter(Block b, UUID uuid, NetworkStatus status) { private static final int[] teleporter_border = new int[] {0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53};
private static final int[] teleporter_inventory = new int[] {19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43};
public void updateTransmitter(Location l, UUID uuid, NetworkStatus status) {
Set<Location> set = new HashSet<>(); Set<Location> set = new HashSet<>();
if (transmitters.containsKey(uuid)) set = transmitters.get(uuid); if (transmitters.containsKey(uuid)) set = transmitters.get(uuid);
if (status.equals(NetworkStatus.ONLINE)) {
if (!set.contains(b.getLocation())) { if (status == NetworkStatus.ONLINE) {
set.add(b.getLocation()); if (!set.contains(l)) {
set.add(l);
transmitters.put(uuid, set); transmitters.put(uuid, set);
} }
} }
else { else {
set.remove(b.getLocation()); set.remove(l);
transmitters.put(uuid, set); transmitters.put(uuid, set);
} }
} }
@ -64,7 +70,7 @@ public class GPSNetwork {
else return transmitters.get(uuid).size(); else return transmitters.get(uuid).size();
} }
public void openTransmitterControlPanel(Player p) throws Exception { public void openTransmitterControlPanel(Player p) {
ChestMenu menu = new ChestMenu("&9Control Panel"); ChestMenu menu = new ChestMenu("&9Control Panel");
for (int slot : border) { for (int slot : border) {
@ -73,6 +79,7 @@ public class GPSNetwork {
); );
} }
try {
menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &e(Selected)")); menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &e(Selected)"));
menu.addMenuClickHandler(2, menu.addMenuClickHandler(2,
(pl, slot, item, action) -> false (pl, slot, item, action) -> false
@ -85,11 +92,7 @@ public class GPSNetwork {
menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &r(Select)")); menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &r(Select)"));
menu.addMenuClickHandler(6, (pl, slot, item, action) -> { menu.addMenuClickHandler(6, (pl, slot, item, action) -> {
try {
openWaypointControlPanel(pl); openWaypointControlPanel(pl);
} catch (Exception e) {
e.printStackTrace();
}
return false; return false;
}); });
@ -99,12 +102,13 @@ public class GPSNetwork {
int slot = inventory[index]; int slot = inventory[index];
menu.addItem(slot, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&bGPS Transmitter", "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &7Signal Strength: &r" + l.getBlockY(), "&8\u21E8 &7Ping: &r" + DoubleHandler.fixDouble(1000D / l.getY()) + "ms")); menu.addItem(slot, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&bGPS Transmitter", "&8\u21E8 &7World: &r" + l.getWorld().getName(), "&8\u21E8 &7X: &r" + l.getX(), "&8\u21E8 &7Y: &r" + l.getY(), "&8\u21E8 &7Z: &r" + l.getZ(), "", "&8\u21E8 &7Signal Strength: &r" + l.getBlockY(), "&8\u21E8 &7Ping: &r" + DoubleHandler.fixDouble(1000D / l.getY()) + "ms"));
menu.addMenuClickHandler(slot, menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> false);
(pl, slotn, item, action) -> false
);
index++; index++;
} }
} catch(Exception x) {
Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the GPS Transmitter Panel for Slimefun " + Slimefun.getVersion(), x);
}
menu.open(p); menu.open(p);
} }
@ -115,10 +119,10 @@ public class GPSNetwork {
if (entry.getKey().startsWith("&4Deathpoint")) { if (entry.getKey().startsWith("&4Deathpoint")) {
return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWFlMzg1NWY5NTJjZDRhMDNjMTQ4YTk0NmUzZjgxMmE1OTU1YWQzNWNiY2I1MjYyN2VhNGFjZDQ3ZDMwODEifX19"); return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWFlMzg1NWY5NTJjZDRhMDNjMTQ4YTk0NmUzZjgxMmE1OTU1YWQzNWNiY2I1MjYyN2VhNGFjZDQ3ZDMwODEifX19");
} }
else if (l.getWorld().getEnvironment().equals(Environment.NETHER)) { else if (l.getWorld().getEnvironment() == Environment.NETHER) {
return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDgzNTcxZmY1ODlmMWE1OWJiMDJiODA4MDBmYzczNjExNmUyN2MzZGNmOWVmZWJlZGU4Y2YxZmRkZSJ9fX0="); return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDgzNTcxZmY1ODlmMWE1OWJiMDJiODA4MDBmYzczNjExNmUyN2MzZGNmOWVmZWJlZGU4Y2YxZmRkZSJ9fX0=");
} }
else if (l.getWorld().getEnvironment().equals(Environment.THE_END)) { else if (l.getWorld().getEnvironment() == Environment.THE_END) {
return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzZjYWM1OWIyYWFlNDg5YWEwNjg3YjVkODAyYjI1NTVlYjE0YTQwYmQ2MmIyMWViMTE2ZmE1NjljZGI3NTYifX19"); return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzZjYWM1OWIyYWFlNDg5YWEwNjg3YjVkODAyYjI1NTVlYjE0YTQwYmQ2MmIyMWViMTE2ZmE1NjljZGI3NTYifX19");
} }
else { else {
@ -126,34 +130,25 @@ public class GPSNetwork {
} }
} }
public void openWaypointControlPanel(Player p) throws Exception { public void openWaypointControlPanel(Player p) {
ChestMenu menu = new ChestMenu("&9Control Panel"); ChestMenu menu = new ChestMenu("&9Control Panel");
for (int slot: border) { for (int slot: border) {
menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (pl, slotn, item, action) -> false);
(pl, slotn, item, action) -> false
);
} }
try {
menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &r(Select)")); menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &r(Select)"));
menu.addMenuClickHandler(2, (pl, slot, item, action) -> { menu.addMenuClickHandler(2, (pl, slot, item, action) -> {
try {
openTransmitterControlPanel(pl); openTransmitterControlPanel(pl);
} catch (Exception e) {
e.printStackTrace();
}
return false; return false;
}); });
menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGRjZmJhNThmYWYxZjY0ODQ3ODg0MTExODIyYjY0YWZhMjFkN2ZjNjJkNDQ4MWYxNGYzZjNiY2I2MzMwIn19fQ=="), "&7Network Info", "", "&8\u21E8 &7Status: " + (getNetworkComplexity(p.getUniqueId()) > 0 ? "&2&lONLINE": "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &r" + getNetworkComplexity(p.getUniqueId()))); menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGRjZmJhNThmYWYxZjY0ODQ3ODg0MTExODIyYjY0YWZhMjFkN2ZjNjJkNDQ4MWYxNGYzZjNiY2I2MzMwIn19fQ=="), "&7Network Info", "", "&8\u21E8 &7Status: " + (getNetworkComplexity(p.getUniqueId()) > 0 ? "&2&lONLINE": "&4&lOFFLINE"), "&8\u21E8 &7Complexity: &r" + getNetworkComplexity(p.getUniqueId())));
menu.addMenuClickHandler(4, menu.addMenuClickHandler(4, (pl, slot, item, action) -> false);
(pl, slot, item, action) -> false
);
menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Selected)")); menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Selected)"));
menu.addMenuClickHandler(6, menu.addMenuClickHandler(6, (pl, slot, item, action) -> false);
(pl, slot, item, action) -> false
);
int index = 0; int index = 0;
for (final Map.Entry<String, Location> entry : getWaypoints(p.getUniqueId()).entrySet()) { for (final Map.Entry<String, Location> entry : getWaypoints(p.getUniqueId()).entrySet()) {
@ -170,16 +165,17 @@ public class GPSNetwork {
cfg.setValue(id, null); cfg.setValue(id, null);
cfg.save(); cfg.save();
pl.playSound(pl.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F); pl.playSound(pl.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F);
try {
openWaypointControlPanel(pl); openWaypointControlPanel(pl);
} catch (Exception e) {
e.printStackTrace();
}
return false; return false;
}); });
index++; index++;
} }
}
catch(Exception x) {
Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the GPS Waypoint Panel for Slimefun " + Slimefun.getVersion(), x);
}
menu.open(p); menu.open(p);
} }
@ -223,7 +219,7 @@ public class GPSNetwork {
} }
public Set<Location> getTransmitters(UUID uuid) { public Set<Location> getTransmitters(UUID uuid) {
return transmitters.containsKey(uuid) ? transmitters.get(uuid): new HashSet<Location>(); return transmitters.containsKey(uuid) ? transmitters.get(uuid): new HashSet<>();
} }
public void scanChunk(Player p, Chunk chunk) { public void scanChunk(Player p, Chunk chunk) {
@ -238,29 +234,22 @@ public class GPSNetwork {
for (OreGenResource resource: OreGenSystem.listResources()) { for (OreGenResource resource: OreGenSystem.listResources()) {
int supply = OreGenSystem.getSupplies(resource, chunk, true); int supply = OreGenSystem.getSupplies(resource, chunk, true);
menu.addItem(index, new CustomItem(resource.getIcon(), "&7Resource: &e" + resource.getName(), "", "&7Scanned Chunk:", "&8\u21E8 &7X: " + chunk.getX() + " Z: " + chunk.getZ(), "", "&7Result: &e" + supply + " " + resource.getMeasurementUnit()), menu.addItem(index, new CustomItem(resource.getIcon(), "&7Resource: &e" + resource.getName(), "", "&7Scanned Chunk:", "&8\u21E8 &7X: " + chunk.getX() + " Z: " + chunk.getZ(), "", "&7Result: &e" + supply + " " + resource.getMeasurementUnit()), (pl, slot, item, action) -> false);
(pl, slot, item, action) -> false
);
index++; index++;
} }
menu.open(p); menu.open(p);
} }
private final static int[] teleporter_border = new int[] {0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 26, 27, 35, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53}; public static void openTeleporterGUI(Player p, UUID uuid, Block b, final int complexity) {
private final static int[] teleporter_inventory = new int[] {19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43}; if (SlimefunPlugin.getUtilities().teleporterUsers.contains(p.getUniqueId())) return;
public static void openTeleporterGUI(Player p, UUID uuid, Block b, final int complexity) throws Exception {
if (TeleportationSequence.players.contains(p.getUniqueId())) return;
p.playSound(p.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F); p.playSound(p.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F);
TeleportationSequence.players.add(p.getUniqueId()); SlimefunPlugin.getUtilities().teleporterUsers.add(p.getUniqueId());
ChestMenu menu = new ChestMenu("&3Teleporter"); ChestMenu menu = new ChestMenu("&3Teleporter");
menu.addMenuCloseHandler( menu.addMenuCloseHandler(pl -> SlimefunPlugin.getUtilities().teleporterUsers.remove(pl.getUniqueId()));
pl -> TeleportationSequence.players.remove(pl.getUniqueId())
);
for (int slot : teleporter_border) { for (int slot : teleporter_border) {
menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "),
@ -268,10 +257,9 @@ public class GPSNetwork {
); );
} }
try {
menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Select a Destination)")); menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Select a Destination)"));
menu.addMenuClickHandler(4, menu.addMenuClickHandler(4, (pl, slot, item, action) -> false);
(pl, slot, item, action) -> false
);
final Location source = new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + 2D, b.getZ() + 0.5D); final Location source = new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + 2D, b.getZ() + 0.5D);
int index = 0; int index = 0;
@ -291,6 +279,10 @@ public class GPSNetwork {
index++; index++;
} }
}
catch (Exception x) {
Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a Teleporter Menu for Slimefun " + Slimefun.getVersion(), x);
}
menu.open(p); menu.open(p);
} }

View File

@ -1,8 +1,7 @@
package me.mrCookieSlime.Slimefun.GPS; package me.mrCookieSlime.Slimefun.GPS;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -15,14 +14,15 @@ import org.bukkit.potion.PotionEffectType;
import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder; import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder;
import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder.TitleType; import me.mrCookieSlime.CSCoreLibPlugin.general.World.TitleBuilder.TitleType;
import me.mrCookieSlime.Slimefun.SlimefunStartup; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class TeleportationSequence { public final class TeleportationSequence {
public static Set<UUID> players = new HashSet<>(); private TeleportationSequence() {}
public static void start(UUID uuid, int complexity, Location source, Location destination, boolean resistance) { public static void start(UUID uuid, int complexity, Location source, Location destination, boolean resistance) {
players.add(uuid); SlimefunPlugin.getUtilities().teleporterUsers.add(uuid);
updateProgress(uuid, getSpeed(complexity, source, destination), 1, source, destination, resistance); updateProgress(uuid, getSpeed(complexity, source, destination), 1, source, destination, resistance);
} }
@ -50,7 +50,8 @@ public class TeleportationSequence {
} }
private static void cancel(UUID uuid, Player p) { private static void cancel(UUID uuid, Player p) {
players.remove(uuid); SlimefunPlugin.getUtilities().teleporterUsers.remove(uuid);
if (p != null) { if (p != null) {
try { try {
TitleBuilder title = (TitleBuilder) new TitleBuilder(20, 60, 20).addText(ChatColor.translateAlternateColorCodes('&', "&4Teleportation cancelled")); TitleBuilder title = (TitleBuilder) new TitleBuilder(20, 60, 20).addText(ChatColor.translateAlternateColorCodes('&', "&4Teleportation cancelled"));
@ -59,7 +60,7 @@ public class TeleportationSequence {
title.send(TitleType.TITLE, p); title.send(TitleType.TITLE, p);
subtitle.send(TitleType.SUBTITLE, p); subtitle.send(TitleType.SUBTITLE, p);
} catch(Exception x) { } catch(Exception x) {
x.printStackTrace(); Slimefun.getLogger().log(Level.SEVERE, "An Error occured while cancelling a Teleportation Sequence for Slimefun " + Slimefun.getVersion(), x);
} }
} }
} }
@ -84,7 +85,7 @@ public class TeleportationSequence {
destination.getWorld().spawnParticle(Particle.PORTAL,new Location(destination.getWorld(), destination.getX(), destination.getY() + 1, destination.getZ()),progress * 2, 0.2F, 0.8F, 0.2F ); destination.getWorld().spawnParticle(Particle.PORTAL,new Location(destination.getWorld(), destination.getX(), destination.getY() + 1, destination.getZ()),progress * 2, 0.2F, 0.8F, 0.2F );
destination.getWorld().playSound(destination, Sound.ENTITY_BLAZE_DEATH, 2F, 1.4F); destination.getWorld().playSound(destination, Sound.ENTITY_BLAZE_DEATH, 2F, 1.4F);
players.remove(uuid); SlimefunPlugin.getUtilities().teleporterUsers.remove(uuid);
} }
else { else {
TitleBuilder title = (TitleBuilder) new TitleBuilder(0, 60, 0).addText(ChatColor.translateAlternateColorCodes('&', "&3Teleporting...")); TitleBuilder title = (TitleBuilder) new TitleBuilder(0, 60, 0).addText(ChatColor.translateAlternateColorCodes('&', "&3Teleporting..."));
@ -96,12 +97,10 @@ public class TeleportationSequence {
source.getWorld().spawnParticle(Particle.PORTAL, source, progress * 2, 0.2F, 0.8F, 0.2F); source.getWorld().spawnParticle(Particle.PORTAL, source, progress * 2, 0.2F, 0.8F, 0.2F);
source.getWorld().playSound(source, Sound.UI_BUTTON_CLICK, 1.7F, 0.6F); source.getWorld().playSound(source, Sound.UI_BUTTON_CLICK, 1.7F, 0.6F);
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> updateProgress(uuid, speed, progress + speed, source, destination, resistance), 10L);
updateProgress(uuid, speed, progress + speed, source, destination, resistance);
}, 10l);
} }
} catch (Exception e) { } catch (Exception x) {
e.printStackTrace(); Slimefun.getLogger().log(Level.SEVERE, "An Error occured during a Teleportation Sequence for Slimefun " + Slimefun.getVersion(), x);
} }
} }
else cancel(uuid, p); else cancel(uuid, p);

View File

@ -1,16 +1,13 @@
package me.mrCookieSlime.Slimefun.Lists; package me.mrCookieSlime.Slimefun.Lists;
import org.bukkit.Color;
import org.bukkit.Material;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomArmor; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomArmor;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.MenuItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.LockedCategory; import me.mrCookieSlime.Slimefun.Objects.LockedCategory;
import me.mrCookieSlime.Slimefun.Objects.SeasonCategory; import me.mrCookieSlime.Slimefun.Objects.SeasonalCategory;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.Material;
/** /**
* Built-in categories. * Built-in categories.
@ -19,42 +16,35 @@ import org.bukkit.Material;
* @since 4.0 * @since 4.0
* @see Category * @see Category
*/ */
public class Categories { public final class Categories {
public static Category WEAPONS = new Category(new MenuItem(Material.GOLDEN_SWORD, "&7Weapons", 0, "open"), 1); private Categories() {}
public static Category PORTABLE = null;
public static Category FOOD = new Category(new MenuItem(Material.APPLE, "&7Food", 0, "open"), 2); private static final String LORE = "&a> Click to open";
public static Category MACHINES_1 = null;
public static LockedCategory ELECTRICITY = null; public static final Category WEAPONS = new Category(new CustomItem(Material.GOLDEN_SWORD, "&7Weapons", "", LORE), 1);
public static LockedCategory GPS = null; public static final Category PORTABLE = new Category(new CustomItem(SlimefunItems.BACKPACK_MEDIUM, "&7Items", "", LORE), 1);
public static Category ARMOR = new Category(new MenuItem(Material.IRON_CHESTPLATE, "&7Armor", 0, "open"), 2); public static final Category FOOD = new Category(new CustomItem(Material.APPLE, "&7Food", "", LORE), 2);
public static Category LUMPS_AND_MAGIC = new Category(new MenuItem(Material.FIRE_CHARGE, "&7Magical Items", 0, "open"), 2); public static final Category MACHINES_1 = new Category(new CustomItem(Material.SMITHING_TABLE, "&7Basic Machines", "", LORE), 1);
public static Category MAGIC = new Category(new MenuItem(Material.BLAZE_POWDER, "&7Magical Gadgets", 0, "open"), 3); public static final LockedCategory ELECTRICITY = new LockedCategory(new CustomItem(SlimefunItems.NUCLEAR_REACTOR, "&bEnergy and Electricity", "", LORE), 4, MACHINES_1);
public static Category MISC = null; public static final LockedCategory GPS = new LockedCategory(new CustomItem(SlimefunItems.GPS_TRANSMITTER, "&bGPS-based Machines", "", LORE), 4, MACHINES_1);
public static Category TECH = new Category(new CustomArmor(new MenuItem(Material.LEATHER_CHESTPLATE, "&7Technical Gadgets", 0, "open"), Color.SILVER), 3); public static final Category ARMOR = new Category(new CustomItem(Material.IRON_CHESTPLATE, "&7Armor", "", LORE), 2);
public static Category RESOURCES = null; public static final Category LUMPS_AND_MAGIC = new Category(new CustomItem(SlimefunItems.RUNE_ENDER, "&7Magical Items", "", LORE), 2);
public static Category CARGO = null; public static final Category MAGIC = new Category(new CustomItem(Material.ELYTRA, "&7Magical Gadgets", "", LORE), 3);
public static Category TECH_MISC = new Category(new MenuItem(Material.COMPARATOR, "&7Technical Components", 0, "open"), 2); public static final Category MISC = new Category(new CustomItem(SlimefunItems.CAN, "&7Miscellaneous", "", LORE), 2);
public static Category MAGIC_ARMOR = new Category(new MenuItem(Material.GOLDEN_CHESTPLATE, "&7Magical Armor", 0, "open"), 2); public static final Category TECH = new Category(new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&7Technical Gadgets", "", LORE), Color.SILVER), 3);
public static Category TALISMANS_1 = new Category(new MenuItem(Material.EMERALD, "&7Talismans - &aTier I", 0, "open"), 2); public static final Category RESOURCES = new Category(new CustomItem(SlimefunItems.SYNTHETIC_SAPPHIRE, "&7Resources", "", LORE), 1);
public static LockedCategory TALISMANS_2 = new LockedCategory(new MenuItem(Material.EMERALD, "&7Talismans - &aTier II", 0, "open"), 3, TALISMANS_1); public static final Category CARGO = new LockedCategory(new CustomItem(SlimefunItems.CARGO_MANAGER, "&cCargo Management", "", LORE), 4, MACHINES_1);
public static Category TOOLS = new Category(new MenuItem(Material.GOLDEN_PICKAXE, "&7Tools", 0, "open"), 1); public static final Category TECH_MISC = new Category(new CustomItem(SlimefunItems.HEATING_COIL, "&7Technical Components", "", LORE), 2);
public static SeasonCategory CHRISTMAS = new SeasonCategory(12, 1, new MenuItem(Material.NETHER_STAR, "&aC&ch&ar&ci&as&ct&am&ca&as", 0, ChatColor.translateAlternateColorCodes('&', "&chelp &aSanta"))); public static final Category MAGIC_ARMOR = new Category(new CustomItem(SlimefunItems.ENDER_HELMET, "&7Magical Armor", "", LORE), 2);
public static SeasonCategory VALENTINES_DAY = new SeasonCategory(2, 2, new MenuItem(Material.POPPY, "&dValentine's Day", 0, ChatColor.translateAlternateColorCodes('&', "&dcelebrate Love"))); public static final Category TALISMANS_1 = new Category(new CustomItem(Material.EMERALD, "&7Talismans - &aTier I", "", LORE), 2);
public static SeasonCategory EASTER = new SeasonCategory(4, 2, new MenuItem(Material.EGG, "&6Easter", 0, ChatColor.translateAlternateColorCodes('&', "&apaint some Eggs"))); public static final LockedCategory TALISMANS_2 = new LockedCategory(new CustomItem(Material.EMERALD, "&7Talismans - &aTier II", "", LORE), 3, TALISMANS_1);
public static SeasonCategory BIRTHDAY = new SeasonCategory(10, 1, new MenuItem(Material.FIREWORK_ROCKET, "&a&lTheBusyBiscuit's Birthday &7(26th October)", 0, ChatColor.translateAlternateColorCodes('&', "&acelebrate with me"))); public static final Category TOOLS = new Category(new CustomItem(Material.GOLDEN_PICKAXE, "&7Tools", "", LORE), 1);
// Seasonal Categories
public static final SeasonalCategory CHRISTMAS = new SeasonalCategory(12, 1, new CustomItem(Material.NETHER_STAR, "&aC&ch&ar&ci&as&ct&am&ca&as", "", "&c> Click to help &aSanta"));
public static final SeasonalCategory VALENTINES_DAY = new SeasonalCategory(2, 2, new CustomItem(Material.POPPY, "&dValentine's Day", "", "&d> Click to celebrate Love"));
public static final SeasonalCategory EASTER = new SeasonalCategory(4, 2, new CustomItem(Material.EGG, "&6Easter", "", "&a> Click to paint some Eggs"));
public static final SeasonalCategory BIRTHDAY = new SeasonalCategory(10, 1, new CustomItem(Material.FIREWORK_ROCKET, "&a&lTheBusyBiscuit's Birthday &7(26th October)", "", "&a> Click to celebrate with me"));
static {
try {
MISC = new Category(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTRkYTk3ZjA4MGUzOTViODQyYzRjYzgyYTg0MDgyM2Q0ZGJkOGNhNjg4YTIwNjg1M2U1NzgzZTRiZmRjMDEyIn19fQ=="), "&7Miscellaneous", "", "&a> Click to open"), 2);
PORTABLE = new Category(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDBjYjFlNjdiNTEyYWIyZDRiZjNkN2FjZTBlYWFmNjFjMzJjZDQ2ODFkZGMzOTg3Y2ViMzI2NzA2YTMzZmEifX19"), "&7Items", "", "&a> Click to open"), 1);
MACHINES_1 = new Category(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&7Basic Machines", "", "&a> Click to open"), 1);
ELECTRICITY = new LockedCategory(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTU4NDQzMmFmNmYzODIxNjcxMjAyNThkMWVlZThjODdjNmU3NWQ5ZTQ3OWU3YjBkNGM3YjZhZDQ4Y2ZlZWYifX19"), "&bEnergy and Electricity", "", "&a> Click to open"), 4, MACHINES_1);
GPS = new LockedCategory(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&bGPS-based Machines", "", "&a> Click to open"), 4, MACHINES_1);
RESOURCES = new Category(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2U4ZjVhZGIxNGQ2YzlmNmI4MTBkMDI3NTQzZjFhOGMxZjQxN2UyZmVkOTkzYzk3YmNkODljNzRmNWUyZTgifX19"), "&7Resources", "", "&a> Click to open"), 1);
CARGO = new LockedCategory(new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTUxMGJjODUzNjJhMTMwYTZmZjlkOTFmZjExZDZmYTQ2ZDdkMTkxMmEzNDMxZjc1MTU1OGVmM2M0ZDljMiJ9fX0="), "&cCargo Management", "", "&a> Click to open"), 4, MACHINES_1);
} catch (Exception e) {
e.printStackTrace();
}
}
} }

View File

@ -14,26 +14,26 @@ import org.bukkit.inventory.ItemStack;
public class RecipeType { public class RecipeType {
public static final RecipeType MULTIBLOCK = new RecipeType(new CustomItem(Material.BRICK, "&bMultiBlock", 0, new String[] {"", "&a&oBuild it in the World"})); public static final RecipeType MULTIBLOCK = new RecipeType(new CustomItem(Material.BRICK, "&bMultiBlock", "", "&a&oBuild it in the World"));
public static final RecipeType ARMOR_FORGE = new RecipeType(new CustomItem(Material.ANVIL, "&bArmor Forge", 0, new String[] {"", "&a&oCraft it in an Armor Forge"}), "ARMOR_FORGE"); public static final RecipeType ARMOR_FORGE = new RecipeType(new CustomItem(Material.ANVIL, "&bArmor Forge", "", "&a&oCraft it in an Armor Forge"), "ARMOR_FORGE");
public static final RecipeType GRIND_STONE = new RecipeType(new CustomItem(Material.DISPENSER, "&bGrind Stone", 0, new String[] {"", "&a&oGrind it using the Grind Stone"}), "GRIND_STONE"); public static final RecipeType GRIND_STONE = new RecipeType(new CustomItem(Material.DISPENSER, "&bGrind Stone", "", "&a&oGrind it using the Grind Stone"), "GRIND_STONE");
public static final RecipeType MOB_DROP = new RecipeType(new CustomItem(Material.IRON_SWORD, "&bMob Drop", 0, new String[] {"", "&a&oKill the specified Mob to obtain this Item"})); public static final RecipeType MOB_DROP = new RecipeType(new CustomItem(Material.IRON_SWORD, "&bMob Drop", "", "&a&oKill the specified Mob to obtain this Item"));
public static final RecipeType SMELTERY = new RecipeType(new CustomItem(Material.FURNACE, "&6Smeltery", 0, new String[] {"", "&a&oSmelt it using a Smeltery"}), "SMELTERY"); public static final RecipeType SMELTERY = new RecipeType(new CustomItem(Material.FURNACE, "&6Smeltery", "", "&a&oSmelt it using a Smeltery"), "SMELTERY");
public static final RecipeType ORE_CRUSHER = new RecipeType(new CustomItem(Material.DISPENSER, "&bOre Crusher", 0, new String[] {"", "&a&oCrush it using the Ore Crusher"}), "ORE_CRUSHER"); public static final RecipeType ORE_CRUSHER = new RecipeType(new CustomItem(Material.DISPENSER, "&bOre Crusher", "", "&a&oCrush it using the Ore Crusher"), "ORE_CRUSHER");
public static final RecipeType GOLD_PAN = new RecipeType(new CustomItem(Material.BOWL, "&bGold Pan", 0, new String[] {"", "&a&oUse a Gold Pan on Gravel to obtain this Item"})); public static final RecipeType GOLD_PAN = new RecipeType(new CustomItem(Material.BOWL, "&bGold Pan", "", "&a&oUse a Gold Pan on Gravel to obtain this Item"));
public static final RecipeType COMPRESSOR = new RecipeType(new CustomItem(Material.PISTON, "&bCompressor", 0, new String[] {"", "&a&oCompress it using the Compressor"}), "COMPRESSOR"); public static final RecipeType COMPRESSOR = new RecipeType(new CustomItem(Material.PISTON, "&bCompressor", "", "&a&oCompress it using the Compressor"), "COMPRESSOR");
public static final RecipeType PRESSURE_CHAMBER = new RecipeType(new CustomItem(Material.GLASS, "&bPressure Chamber", 0, new String[] {"", "&a&oCompress it using the Pressure Chamber"}), "PRESSURE_CHAMBER"); public static final RecipeType PRESSURE_CHAMBER = new RecipeType(new CustomItem(Material.GLASS, "&bPressure Chamber", "", "&a&oCompress it using the Pressure Chamber"), "PRESSURE_CHAMBER");
public static final RecipeType OVEN = new RecipeType(new CustomItem(Material.FURNACE, "&bOven", 0, new String[] {"", "&a&oSmelt it in an Oven"}), "OVEN"); public static final RecipeType OVEN = new RecipeType(new CustomItem(Material.FURNACE, "&bOven", "", "&a&oSmelt it in an Oven"), "OVEN");
public static final RecipeType MAGIC_WORKBENCH = new RecipeType(new CustomItem(Material.BOOKSHELF, "&6Magic Workbench", 0, new String[] {"", "&a&oCraft it in a Magic Workbench"}), "MAGIC_WORKBENCH"); public static final RecipeType MAGIC_WORKBENCH = new RecipeType(new CustomItem(Material.BOOKSHELF, "&6Magic Workbench", "", "&a&oCraft it in a Magic Workbench"), "MAGIC_WORKBENCH");
public static final RecipeType ORE_WASHER = new RecipeType(new CustomItem(Material.CAULDRON, "&6Ore Washer", 0, new String[] {"", "&a&oWash it in an Ore Washer"}), "ORE_WASHER"); public static final RecipeType ORE_WASHER = new RecipeType(new CustomItem(Material.CAULDRON, "&6Ore Washer", "", "&a&oWash it in an Ore Washer"), "ORE_WASHER");
public static final RecipeType ENHANCED_CRAFTING_TABLE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eEnhanced Crafting Table", 0, new String[] {"", "&a&oA regular Crafting Table cannot", "&a&ohold this massive Amount of Power..."}), "ENHANCED_CRAFTING_TABLE"); public static final RecipeType ENHANCED_CRAFTING_TABLE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eEnhanced Crafting Table", "", "&a&oA regular Crafting Table cannot", "&a&ohold this massive Amount of Power..."), "ENHANCED_CRAFTING_TABLE");
public static final RecipeType JUICER = new RecipeType(new CustomItem(Material.GLASS_BOTTLE, "&eJuicer", 0, new String[] {"", "&a&oUsed for Juice Creation"}), "JUICER"); public static final RecipeType JUICER = new RecipeType(new CustomItem(Material.GLASS_BOTTLE, "&eJuicer", "", "&a&oUsed for Juice Creation"), "JUICER");
public static final RecipeType ANCIENT_ALTAR = new RecipeType(new CustomItem(Material.ENCHANTING_TABLE, "&4Ancient Altar", 0, new String[] {"", "&dYou will need to craft this Item", "&dby performing an Ancient Altar Ritual"})); public static final RecipeType ANCIENT_ALTAR = new RecipeType(new CustomItem(Material.ENCHANTING_TABLE, "&4Ancient Altar", "", "&dYou will need to craft this Item", "&dby performing an Ancient Altar Ritual"));
public static final RecipeType HEATED_PRESSURE_CHAMBER = new RecipeType(new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS), "&cHeated Pressure Chamber", "", "&a&oCraft this Item in a", "&a&oHeated Pressure Chamber"), "HEATED_PRESSURE_CHAMBER"); public static final RecipeType HEATED_PRESSURE_CHAMBER = new RecipeType(new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS), "&cHeated Pressure Chamber", "", "&a&oCraft this Item in a", "&a&oHeated Pressure Chamber"), "HEATED_PRESSURE_CHAMBER");
public static final RecipeType SHAPED_RECIPE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eShaped Recipe", 0, new String[] {"", "&a&oJust a standard Recipe in the Workbench..."})); public static final RecipeType SHAPED_RECIPE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eShaped Recipe", "", "&a&oJust a standard Recipe in the Workbench..."));
public static final RecipeType SHAPELESS_RECIPE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eShapeless Recipe", 0, new String[] {"", "&a&oJust a standard Recipe in the Workbench..."})); public static final RecipeType SHAPELESS_RECIPE = new RecipeType(new CustomItem(Material.CRAFTING_TABLE, "&eShapeless Recipe", "", "&a&oJust a standard Recipe in the Workbench..."));
public static final RecipeType FURNACE = new RecipeType(new CustomItem(Material.FURNACE, "&eFurnace Recipe", 0, new String[] {"", "&a&oJust smelt it in a regular Furnace"})); public static final RecipeType FURNACE = new RecipeType(new CustomItem(Material.FURNACE, "&eFurnace Recipe", "", "&a&oJust smelt it in a regular Furnace"));
public static final RecipeType NULL = new RecipeType(null); public static final RecipeType NULL = new RecipeType(null);
private ItemStack item; private ItemStack item;

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +0,0 @@
package me.mrCookieSlime.Slimefun.Misc;
public enum BookDesign {
BOOK,
CHEST,
CHEAT_SHEET;
}

View File

@ -2,14 +2,15 @@ package me.mrCookieSlime.Slimefun.Objects;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.Categories; import me.mrCookieSlime.Slimefun.Lists.Categories;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.api.Slimefun;
/** /**
* Statically handles categories. * Statically handles categories.
@ -20,15 +21,9 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
* @since 4.0 * @since 4.0
* *
* @see LockedCategory * @see LockedCategory
* @see SeasonCategory * @see SeasonalCategory
*/ */
public class Category { public class Category {
/**
* List of the registered Categories.
* @since 4.0
* @see Categories
*/
public static List<Category> list = new ArrayList<>();
private ItemStack item; private ItemStack item;
private List<SlimefunItem> items; private List<SlimefunItem> items;
@ -44,6 +39,11 @@ public class Category {
*/ */
public Category(ItemStack item) { public Category(ItemStack item) {
this.item = item; this.item = item;
ItemMeta meta = item.getItemMeta();
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
this.item.setItemMeta(meta);
this.items = new ArrayList<>(); this.items = new ArrayList<>();
this.tier = 3; this.tier = 3;
} }
@ -72,14 +72,19 @@ public class Category {
* @since 4.0 * @since 4.0
*/ */
public void register() { public void register() {
list.add(this); SlimefunPlugin.getUtilities().allCategories.add(this);
Collections.sort(list, new CategorySorter()); Collections.sort(list(), SlimefunPlugin.getUtilities().categorySorter);
if (this instanceof SeasonCategory) { if (this instanceof SeasonalCategory) {
if (((SeasonCategory) this).isUnlocked()) Slimefun.current_categories.add(this); if (((SeasonalCategory) this).isUnlocked()) {
SlimefunPlugin.getUtilities().enabledCategories.add(this);
} }
else Slimefun.current_categories.add(this); }
Collections.sort(Slimefun.current_categories, new CategorySorter()); else {
SlimefunPlugin.getUtilities().enabledCategories.add(this);
}
Collections.sort(SlimefunPlugin.getUtilities().enabledCategories, SlimefunPlugin.getUtilities().categorySorter);
} }
/** /**
@ -91,7 +96,7 @@ public class Category {
* @see Categories * @see Categories
*/ */
public static List<Category> list() { public static List<Category> list() {
return list; return SlimefunPlugin.getUtilities().allCategories;
} }
/** /**
@ -135,8 +140,9 @@ public class Category {
* *
* @since 4.0 * @since 4.0
*/ */
@Deprecated
public static Category getByItem(ItemStack item) { public static Category getByItem(ItemStack item) {
for (Category c: list) { for (Category c: list()) {
if (c.getItem().isSimilar(item)) return c; if (c.getItem().isSimilar(item)) return c;
} }
return null; return null;
@ -153,19 +159,4 @@ public class Category {
return tier; return tier;
} }
/**
* @since 4.0
*/
class CategorySorter implements Comparator<Category> {
/**
* @since 4.0
*/
@Override
public int compare(Category c1, Category c2) {
return Integer.compare(c1.getTier(), c2.getTier());
}
}
} }

View File

@ -1,21 +0,0 @@
package me.mrCookieSlime.Slimefun.Objects;
public class Charge {
private double charge;
private double capacity;
public Charge(double charge, double capacity) {
this.charge = charge;
this.capacity = capacity;
}
public double getStoredEnergy() {
return charge;
}
public double getCapacity() {
return capacity;
}
}

View File

@ -20,7 +20,7 @@ import org.bukkit.inventory.ItemStack;
* @since 4.0 * @since 4.0
* *
* @see Category * @see Category
* @see SeasonCategory * @see SeasonalCategory
*/ */
public class LockedCategory extends Category { public class LockedCategory extends Category {
@ -116,11 +116,7 @@ public class LockedCategory extends Category {
for (Category category: parents) { for (Category category: parents) {
for (SlimefunItem item: category.getItems()) { for (SlimefunItem item: category.getItems()) {
if (Slimefun.isEnabled(p, item.getItem(), false) && Slimefun.hasPermission(p, item, false)) { if (Slimefun.isEnabled(p, item.getItem(), false) && Slimefun.hasPermission(p, item, false) && item.getResearch() != null && !profile.hasUnlocked(item.getResearch())) return false;
if (item.getResearch() != null) {
if (!profile.hasUnlocked(item.getResearch())) return false;
}
}
} }
} }
return true; return true;

View File

@ -1,20 +1,18 @@
package me.mrCookieSlime.Slimefun.Objects; package me.mrCookieSlime.Slimefun.Objects;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine;
import org.bukkit.Material; import org.bukkit.Material;
import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine;
public class MultiBlock { public class MultiBlock {
public static List<MultiBlock> list = new ArrayList<>(); private Material[] blocks;
private Material trigger;
Material[] blocks;
Material trigger;
public MultiBlock(Material[] build, Material trigger) { public MultiBlock(Material[] build, Material trigger) {
this.blocks = build; this.blocks = build;
@ -30,48 +28,46 @@ public class MultiBlock {
} }
public void register() { public void register() {
list.add(this); SlimefunPlugin.getUtilities().allMultiblocks.add(this);
} }
public static List<MultiBlock> list() { public static List<MultiBlock> list() {
return list; return SlimefunPlugin.getUtilities().allMultiblocks;
} }
public boolean isMultiBlock(SlimefunItem machine) { public boolean isMultiBlock(SlimefunItem machine) {
if (machine == null) return false; if (machine instanceof SlimefunMachine) {
else if (!(machine instanceof SlimefunMachine)) return false; return isMultiBlock(((SlimefunMachine) machine).toMultiBlock());
else if (machine instanceof SlimefunMachine) {
MultiBlock mb = ((SlimefunMachine) machine).toMultiBlock();
if (trigger == mb.getTriggerBlock()) {
for (int i = 0; i < mb.getBuild().length; i++) {
if (mb.getBuild()[i] != null) {
if (MaterialHelper.isLog( mb.getBuild()[i])) {
if (!MaterialHelper.isLog(blocks[i])) return false;
}
else if (mb.getBuild()[i] != blocks[i]) return false;
}
}
return true;
}
else return false;
} }
else return false; else return false;
} }
public boolean isMultiBlock(MultiBlock mb) { public boolean isMultiBlock(MultiBlock mb) {
if (mb == null) return false; if (mb == null) return false;
else if (trigger == mb.getTriggerBlock()) {
if (trigger == mb.getTriggerBlock()) {
for (int i = 0; i < mb.getBuild().length; i++) { for (int i = 0; i < mb.getBuild().length; i++) {
if (mb.getBuild()[i] != null) { if (!compareBlocks(blocks[i], mb.getBuild()[i])) return false;
if (MaterialHelper.isLog(mb.getBuild()[i])) {
if (!MaterialHelper.isLog(blocks[i])) return false;
}
else if (mb.getBuild()[i] != blocks[i]) return false;
}
} }
return true; return true;
} }
else return false;
return false;
}
private boolean compareBlocks(Material a, Material b) {
if (b != null) {
if (MaterialHelper.isLog(b)) {
return MaterialHelper.isLog(a);
}
if (b != a) {
return false;
}
}
return true;
} }
} }

View File

@ -1,12 +1,12 @@
package me.mrCookieSlime.Slimefun.Objects; package me.mrCookieSlime.Slimefun.Objects;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -17,7 +17,7 @@ import org.bukkit.entity.Player;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable;
import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.FireworkShow; import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.FireworkShow;
import me.mrCookieSlime.Slimefun.SlimefunStartup; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Events.ResearchUnlockEvent; import me.mrCookieSlime.Slimefun.Events.ResearchUnlockEvent;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.Messages;
@ -40,36 +40,6 @@ public class Research {
private static final int[] research_progress = {23, 44, 57, 92}; private static final int[] research_progress = {23, 44, 57, 92};
/**
* Whether researching is enabled or not;
* @since 4.0
*/
public static boolean enableResearching;
/**
* Contains all the registered researches;
* @since 4.0
* @see ResearchSetup
*/
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 Set<UUID> researching = new HashSet<>();
/**
* Whether researching in creative is free.
* @since 4.0
*/
public static boolean creative_research = true;
private int id; private int id;
private String name; private String name;
private List<SlimefunItem> items; private List<SlimefunItem> items;
@ -103,7 +73,7 @@ public class Research {
} }
public boolean isEnabled() { public boolean isEnabled() {
return enableResearching && enabled; return SlimefunPlugin.getSettings().researchesEnabled && enabled;
} }
/** /**
@ -138,7 +108,7 @@ public class Research {
*/ */
@Deprecated @Deprecated
public int getLevel() { public int getLevel() {
return cost; return getCost();
} }
/** /**
@ -151,7 +121,7 @@ public class Research {
*/ */
@Deprecated @Deprecated
public void setLevel(int level) { public void setLevel(int level) {
this.cost = level; setCost(level);
} }
/** /**
@ -237,7 +207,7 @@ public class Research {
*/ */
public boolean canUnlock(Player p) { public boolean canUnlock(Player p) {
if (!isEnabled()) return true; if (!isEnabled()) return true;
return (p.getGameMode() == GameMode.CREATIVE && creative_research) || p.getLevel() >= this.cost; return (p.getGameMode() == GameMode.CREATIVE && SlimefunPlugin.getSettings().researchesFreeInCreative) || p.getLevel() >= this.cost;
} }
/** /**
@ -266,37 +236,33 @@ public class Research {
ResearchUnlockEvent event = new ResearchUnlockEvent(p, this); ResearchUnlockEvent event = new ResearchUnlockEvent(p, this);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
if (!event.isCancelled()) { Runnable runnable = () -> {
if (instant) {
PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true); PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true);
Messages.local.sendTranslation(p, "messages.unlocked", true, new Variable("%research%", getName())); Messages.local.sendTranslation(p, "messages.unlocked", true, new Variable("%research%", getName()));
if (SlimefunStartup.getCfg().getBoolean("options.research-give-fireworks")) {
if (SlimefunPlugin.getCfg().getBoolean("options.research-unlock-fireworks")) {
FireworkShow.launchRandom(p, 1); FireworkShow.launchRandom(p, 1);
} }
} };
else if (!researching.contains(p.getUniqueId())){
researching.add(p.getUniqueId()); if (!event.isCancelled()) {
if (instant) runnable.run();
else if (!SlimefunPlugin.getUtilities().researching.contains(p.getUniqueId())){
SlimefunPlugin.getUtilities().researching.add(p.getUniqueId());
Messages.local.sendTranslation(p, "messages.research.start", true, new Variable("%research%", getName())); Messages.local.sendTranslation(p, "messages.research.start", true, new Variable("%research%", getName()));
for (int i = 1; i < research_progress.length + 1; i++) { for (int i = 1; i < research_progress.length + 1; i++) {
int j = i; int j = i;
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
p.playSound(p.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 1F); 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] + "%")); 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, () -> { Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true); runnable.run();
Messages.local.sendTranslation(p, "messages.unlocked", true, new Variable("%research%", getName())); SlimefunPlugin.getUtilities().researching.remove(p.getUniqueId());
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);
} }
} }
@ -309,9 +275,9 @@ public class Research {
* @since 4.0 * @since 4.0
*/ */
public void register() { public void register() {
SlimefunStartup.getResearchCfg().setDefaultValue("enable-researching", true); SlimefunPlugin.getResearchCfg().setDefaultValue("enable-researching", true);
if (SlimefunStartup.getResearchCfg().contains(this.getID() + ".enabled") && !SlimefunStartup.getResearchCfg().getBoolean(this.getID() + ".enabled")) { if (SlimefunPlugin.getResearchCfg().contains(this.getID() + ".enabled") && !SlimefunPlugin.getResearchCfg().getBoolean(this.getID() + ".enabled")) {
Iterator<SlimefunItem> iterator = items.iterator(); Iterator<SlimefunItem> iterator = items.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
SlimefunItem item = iterator.next(); SlimefunItem item = iterator.next();
@ -321,16 +287,18 @@ public class Research {
return; return;
} }
SlimefunStartup.getResearchCfg().setDefaultValue(this.getID() + ".name", this.getName()); SlimefunPlugin.getResearchCfg().setDefaultValue(this.getID() + ".name", this.getName());
SlimefunStartup.getResearchCfg().setDefaultValue(this.getID() + ".cost", this.getCost()); SlimefunPlugin.getResearchCfg().setDefaultValue(this.getID() + ".cost", this.getCost());
SlimefunStartup.getResearchCfg().setDefaultValue(this.getID() + ".enabled", true); SlimefunPlugin.getResearchCfg().setDefaultValue(this.getID() + ".enabled", true);
this.name = SlimefunStartup.getResearchCfg().getString(this.getID() + ".name"); this.name = SlimefunPlugin.getResearchCfg().getString(this.getID() + ".name");
this.cost = SlimefunStartup.getResearchCfg().getInt(this.getID() + ".cost"); this.cost = SlimefunPlugin.getResearchCfg().getInt(this.getID() + ".cost");
this.enabled = SlimefunStartup.getResearchCfg().getBoolean(this.getID() + ".enabled"); this.enabled = SlimefunPlugin.getResearchCfg().getBoolean(this.getID() + ".enabled");
list.add(this); SlimefunPlugin.getUtilities().allResearches.add(this);
if (SlimefunStartup.getCfg().getBoolean("options.print-out-loading")) System.out.println("[Slimefun] Loaded Research \"" + this.getName() + "\""); if (SlimefunPlugin.getSettings().printOutLoading) {
Slimefun.getLogger().log(Level.INFO, "Loaded Research \"" + this.getName() + "\"");
}
} }
/** /**
@ -342,7 +310,7 @@ public class Research {
* @see ResearchSetup * @see ResearchSetup
*/ */
public static List<Research> list() { public static List<Research> list() {
return list; return SlimefunPlugin.getUtilities().allResearches;
} }
/** /**
@ -354,7 +322,7 @@ public class Research {
* @since 4.0 * @since 4.0
*/ */
public static boolean isResearching(Player p) { public static boolean isResearching(Player p) {
return researching.contains(p.getUniqueId()); return SlimefunPlugin.getUtilities().researching.contains(p.getUniqueId());
} }
/** /**
@ -370,9 +338,9 @@ public class Research {
public static void sendStats(CommandSender sender, Player p) { public static void sendStats(CommandSender sender, Player p) {
PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId()); PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId());
Set<Research> researched = profile.getResearches(); Set<Research> researched = profile.getResearches();
int levels = researched.stream().mapToInt(r -> r.getCost()).sum(); int levels = researched.stream().mapToInt(Research::getCost).sum();
String progress = String.valueOf(Math.round(((researched.size() * 100.0f) / list().size()) * 100.0f) / 100.0f); 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% "; if (Float.parseFloat(progress) < 16.0F) progress = "&4" + progress + " &r% ";
else if (Float.parseFloat(progress) < 32.0F) progress = "&c" + progress + " &r% "; else if (Float.parseFloat(progress) < 32.0F) progress = "&c" + progress + " &r% ";
else if (Float.parseFloat(progress) < 48.0F) progress = "&6" + progress + " &r% "; else if (Float.parseFloat(progress) < 48.0F) progress = "&6" + progress + " &r% ";
@ -399,10 +367,8 @@ public class Research {
* @see #sendStats(CommandSender, Player) * @see #sendStats(CommandSender, Player)
*/ */
@Deprecated @Deprecated
public static String getTitle(Player p, Set<Research> researched) { public static String getTitle(Player p, Collection<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(); return PlayerProfile.fromUUID(p.getUniqueId()).getTitle();
if (index > 0) index--;
return titles.get(index);
} }
/** /**
@ -414,7 +380,7 @@ public class Research {
* @since 4.0 * @since 4.0
*/ */
public static Research getByID(int id) { public static Research getByID(int id) {
for (Research research: list) { for (Research research: list()) {
if (research.getID() == id) return research; if (research.getID() == id) return research;
} }
return null; return null;
@ -452,4 +418,9 @@ public class Research {
public static List<Research> getResearches(String uuid) { public static List<Research> getResearches(String uuid) {
return getResearches(UUID.fromString(uuid)); return getResearches(UUID.fromString(uuid));
} }
@Override
public String toString() {
return "Research {" + id + "," + name + "}";
}
} }

View File

@ -16,7 +16,7 @@ import org.bukkit.inventory.ItemStack;
* @see Category * @see Category
* @see LockedCategory * @see LockedCategory
*/ */
public class SeasonCategory extends Category { public class SeasonalCategory extends Category {
private int month = -1; private int month = -1;
@ -32,7 +32,7 @@ public class SeasonCategory extends Category {
* *
* @since 4.0 * @since 4.0
*/ */
public SeasonCategory(int month, int tier, ItemStack item) { public SeasonalCategory(int month, int tier, ItemStack item) {
super(item, tier); super(item, tier);
this.month = month - 1; this.month = month - 1;
} }

View File

@ -6,9 +6,30 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@FunctionalInterface
public interface SlimefunBlockHandler { public interface SlimefunBlockHandler {
void onPlace(Player p, Block b, SlimefunItem item); /**
* This method gets called when the Block is placed.
* Use this method to initialize block data.
*
* @param p The Player who placed it
* @param b The Block that was placed
* @param item The Item that will be stored inside the Block
*/
default void onPlace(Player p, Block b, SlimefunItem item) {
// This method can optionally be implemented by classes implementing it.
}
/**
* This method gets called when the Block is broken
* p is nullable if the Block is exploded
*
* @param p The Player who broke the Block
* @param b The Block that was broken
* @param item The SlimefunItem that was stored in that block
* @param reason The reason for the Block breaking
* @return Whether the Event should be cancelled
*/
boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason); boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason);
} }

View File

@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack;
public class ChargableItem extends SlimefunItem { public class ChargableItem extends SlimefunItem {
String chargeType; private String chargeType;
public ChargableItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) { public ChargableItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) {
super(category, item, id, recipeType, recipe); super(category, item, id, recipeType, recipe);
@ -19,6 +19,8 @@ public class ChargableItem extends SlimefunItem {
this.chargeType = chargeType; this.chargeType = chargeType;
} }
public String getChargeType() { return this.chargeType; } public String getChargeType() {
return chargeType;
}
} }

View File

@ -1,13 +1,13 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import org.bukkit.inventory.ItemStack;
public class ChargedItem extends SlimefunItem { public class ChargedItem extends SlimefunItem {
String chargeType; private String chargeType;
public ChargedItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) { public ChargedItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) {
super(category, item, id, recipeType, recipe); super(category, item, id, recipeType, recipe);
@ -19,6 +19,8 @@ public class ChargedItem extends SlimefunItem {
this.chargeType = chargeType; this.chargeType = chargeType;
} }
public String getChargeType() { return this.chargeType; } public String getChargeType() {
return chargeType;
}
} }

View File

@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack;
public class DamagableChargableItem extends SlimefunItem { public class DamagableChargableItem extends SlimefunItem {
String chargeType; private String chargeType;
public DamagableChargableItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) { public DamagableChargableItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) {
super(category, item, id, recipeType, recipe); super(category, item, id, recipeType, recipe);
@ -19,6 +19,8 @@ public class DamagableChargableItem extends SlimefunItem {
this.chargeType = chargeType; this.chargeType = chargeType;
} }
public String getChargeType() { return this.chargeType; } public String getChargeType() {
return this.chargeType;
}
} }

View File

@ -1,36 +1,42 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
import me.mrCookieSlime.Slimefun.Lists.Categories;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import me.mrCookieSlime.Slimefun.Lists.Categories;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.api.Slimefun;
/** /**
* @since 4.0 * @since 4.0
*/ */
public class EnderTalisman extends SlimefunItem { public class EnderTalisman extends Talisman {
private String suffix;
private boolean consumable;
private boolean cancel;
private PotionEffect[] effects;
private int chance;
public EnderTalisman(Talisman parent) { public EnderTalisman(Talisman parent) {
super(Categories.TALISMANS_2, parent.upgrade(), "ENDER_" + parent.getID(), RecipeType.MAGIC_WORKBENCH, new ItemStack[] {SlimefunItem.getItem("ENDER_LUMP_3"), null, SlimefunItem.getItem("ENDER_LUMP_3"), null, parent.getItem(), null, SlimefunItem.getItem("ENDER_LUMP_3"), null, SlimefunItem.getItem("ENDER_LUMP_3")}, parent.upgrade()); super(Categories.TALISMANS_2, parent.upgrade(), "ENDER_" + parent.getID(), new ItemStack[] {SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3, null, parent.getItem(), null, SlimefunItems.ENDER_LUMP_3, null, SlimefunItems.ENDER_LUMP_3});
this.consumable = parent.isConsumable();
this.cancel = parent.isEventCancelled(); consumable = parent.isConsumable();
this.suffix = parent.getSuffix(); cancel = parent.isEventCancelled();
this.effects = parent.getEffects(); suffix = parent.getSuffix();
this.chance = parent.getChance(); effects = parent.getEffects();
chance = parent.getChance();
Slimefun.addHint("ENDER_" + parent.getID(), "&eEnder Talismans have the advantage", "&eof still working while they", "&eare in your Ender Chest"); Slimefun.addHint("ENDER_" + parent.getID(), "&eEnder Talismans have the advantage", "&eof still working while they", "&eare in your Ender Chest");
} }
public String getSuffix() { return this.suffix; } @Override
public boolean isConsumable() { return this.consumable; } public ItemStack upgrade() {
public boolean isEventCancelled() { return this.cancel; } throw new UnsupportedOperationException();
public PotionEffect[] getEffects() { return this.effects; } }
public int getChance() { return this.chance; }
@Override
public void install() {
// Let's override that, otherwise we would be creating Ender Talismans
// for every Ender Talisman
}
@Override
public void create() {
// Let's override that, otherwise we would be creating Ender Talismans
// for every Ender Talisman
}
} }

View File

@ -1,18 +1,22 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import java.util.Random;
import me.mrCookieSlime.Slimefun.SlimefunStartup;
import me.mrCookieSlime.Slimefun.Lists.Categories;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.Furnace; import org.bukkit.block.Furnace;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class EnhancedFurnace extends SlimefunItem { import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
import me.mrCookieSlime.Slimefun.Lists.Categories;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
int speed, efficiency, fortune; public class EnhancedFurnace extends SimpleSlimefunItem<BlockTicker> {
private int speed;
private int efficiency;
private int fortune;
public EnhancedFurnace(int speed, int efficiency, int fortune, ItemStack item, String id, ItemStack[] recipe) { public EnhancedFurnace(int speed, int efficiency, int fortune, ItemStack item, String id, ItemStack[] recipe) {
super(Categories.MACHINES_1, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe); super(Categories.MACHINES_1, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe);
@ -20,33 +24,6 @@ public class EnhancedFurnace extends SlimefunItem {
this.speed = speed - 1; this.speed = speed - 1;
this.efficiency = efficiency - 1; this.efficiency = efficiency - 1;
this.fortune = fortune - 1; this.fortune = fortune - 1;
addItemHandler(new BlockTicker() {
@Override
public void tick(Block b, SlimefunItem item, Config data) {
if (b.getState() instanceof Furnace) {
if (((Furnace) b.getState()).getCookTime() > 0) {
Furnace furnace = (Furnace) b.getState();
int newCookTime = furnace.getCookTime() + getSpeed() * 10;
if (newCookTime > 200) furnace.setCookTime((short) 188);
else furnace.setCookTime((short) newCookTime);
furnace.update(true, false);
}
}
}
@Override
public void uniqueTick() {
}
@Override
public boolean isSynchronized() {
return true;
}
});
} }
public int getSpeed() { public int getSpeed() {
@ -59,9 +36,38 @@ public class EnhancedFurnace extends SlimefunItem {
public int getOutput() { public int getOutput() {
int fortune = this.fortune; int fortune = this.fortune;
fortune = SlimefunStartup.randomize(fortune + 2) - 1; fortune = new Random().nextInt(fortune + 2) - 1;
if (fortune <= 0) fortune = 0; if (fortune <= 0) fortune = 0;
fortune++; fortune++;
return fortune; return fortune;
} }
@Override
public BlockTicker getItemHandler() {
return new BlockTicker() {
@Override
public void tick(Block b, SlimefunItem item, Config data) {
if (!(b.getState() instanceof Furnace)) {
// The Furnace has been destroyed, we can clear the block data
BlockStorage.clearBlockInfo(b);
}
else if (((Furnace) b.getState()).getCookTime() > 0) {
Furnace furnace = (Furnace) b.getState();
int newCookTime = furnace.getCookTime() + getSpeed() * 10;
if (newCookTime > 200) furnace.setCookTime((short) 188);
else furnace.setCookTime((short) newCookTime);
furnace.update(true, false);
}
}
@Override
public boolean isSynchronized() {
return true;
}
};
}
} }

View File

@ -4,7 +4,7 @@ import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable;
public class ExcludedBlock extends SlimefunItem implements NotPlaceable { public class ExcludedBlock extends SlimefunItem implements NotPlaceable {

View File

@ -4,7 +4,7 @@ import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable;
public class ExcludedGadget extends SlimefunGadget implements NotPlaceable { public class ExcludedGadget extends SlimefunGadget implements NotPlaceable {

View File

@ -4,7 +4,7 @@ import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable;
public class ExcludedSoulboundTool extends SoulboundItem implements NotPlaceable { public class ExcludedSoulboundTool extends SoulboundItem implements NotPlaceable {

View File

@ -4,8 +4,9 @@ import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces.NotPlaceable; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable;
@Deprecated
public class ExcludedTool extends SlimefunItem implements NotPlaceable { public class ExcludedTool extends SlimefunItem implements NotPlaceable {
public ExcludedTool(Category category, ItemStack item, String id,RecipeType recipeType, ItemStack[] recipe) { public ExcludedTool(Category category, ItemStack item, String id,RecipeType recipeType, ItemStack[] recipe) {

View File

@ -1,5 +0,0 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces;
public interface NotPlaceable {
}

View File

@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack;
public class JetBoots extends DamagableChargableItem { public class JetBoots extends DamagableChargableItem {
double speed; private double speed;
public JetBoots(ItemStack item, String id, ItemStack[] recipe, double speed) { public JetBoots(ItemStack item, String id, ItemStack[] recipe, double speed) {
super(Categories.TECH, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe, "Jet Boots"); super(Categories.TECH, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe, "Jet Boots");

View File

@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack;
public class Jetpack extends DamagableChargableItem { public class Jetpack extends DamagableChargableItem {
double thrust; private double thrust;
public Jetpack(ItemStack item, String id, ItemStack[] recipe, double thrust) { public Jetpack(ItemStack item, String id, ItemStack[] recipe, double thrust) {
super(Categories.TECH, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe, "Jetpack"); super(Categories.TECH, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe, "Jetpack");

View File

@ -11,7 +11,7 @@ import org.bukkit.inventory.ItemStack;
public class MultiTool extends DamagableChargableItem { public class MultiTool extends DamagableChargableItem {
List<Integer> modes; private List<Integer> modes;
public MultiTool(ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { public MultiTool(ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(Categories.TECH, item, id, recipeType, recipe, "Multi Tool", keys, values); super(Categories.TECH, item, id, recipeType, recipe, "Multi Tool", keys, values);
@ -19,11 +19,9 @@ public class MultiTool extends DamagableChargableItem {
@Override @Override
public void create() { public void create() {
List<Integer> list = new ArrayList<Integer>(); List<Integer> list = new ArrayList<>();
for (int i = 0; i < 50; i++) { for (int i = 0; i < 50; i++) {
if (Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled") != null) { if (Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled") != null && (Boolean) Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled")) list.add(i);
if ((Boolean) Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled")) list.add(i);
}
} }
this.modes = list; this.modes = list;
} }

View File

@ -0,0 +1,30 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
public abstract class SimpleSlimefunItem<T extends ItemHandler> extends SlimefunItem {
public SimpleSlimefunItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
public SimpleSlimefunItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
super(category, item, id, recipeType, recipe, recipeOutput);
}
public SimpleSlimefunItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values);
}
@Override
public void preRegister() {
addItemHandler(getItemHandler());
}
public abstract T getItemHandler();
}

View File

@ -8,7 +8,7 @@ import org.bukkit.potion.PotionEffect;
public class SlimefunArmorPiece extends SlimefunItem { public class SlimefunArmorPiece extends SlimefunItem {
PotionEffect[] effects; private PotionEffect[] effects;
public SlimefunArmorPiece(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, PotionEffect[] effects) { public SlimefunArmorPiece(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, PotionEffect[] effects) {
super(category, item, id, recipeType, recipe); super(category, item, id, recipeType, recipe);
@ -20,6 +20,8 @@ public class SlimefunArmorPiece extends SlimefunItem {
this.effects = effects; this.effects = effects;
} }
public PotionEffect[] getEffects() { return this.effects; } public PotionEffect[] getEffects() {
return this.effects;
}
} }

View File

@ -7,7 +7,7 @@ import me.mrCookieSlime.Slimefun.Objects.Category;
public class SlimefunBackpack extends SlimefunItem { public class SlimefunBackpack extends SlimefunItem {
public int size; private int size;
public SlimefunBackpack(int size, Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { public SlimefunBackpack(int size, Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe); super(category, item, id, recipeType, recipe);
@ -15,4 +15,8 @@ public class SlimefunBackpack extends SlimefunItem {
this.size = size; this.size = size;
} }
public int getSize() {
return size;
}
} }

View File

@ -3,33 +3,37 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class SlimefunGadget extends SlimefunItem { import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem;
List<ItemStack[]> recipes; public class SlimefunGadget extends SlimefunItem implements RecipeDisplayItem {
List<ItemStack> display_recipes;
private List<ItemStack[]> recipes;
private List<ItemStack> displayRecipes;
public SlimefunGadget(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes) { public SlimefunGadget(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes) {
super(category, item, id, recipeType, recipe); super(category, item, id, recipeType, recipe);
this.recipes = new ArrayList<ItemStack[]>();
this.display_recipes = new ArrayList<ItemStack>(); this.recipes = new ArrayList<>();
this.displayRecipes = new ArrayList<>();
for (ItemStack i: machineRecipes) { for (ItemStack i: machineRecipes) {
this.recipes.add(new ItemStack[] {i}); this.recipes.add(new ItemStack[] {i});
this.display_recipes.add(i); this.displayRecipes.add(i);
} }
} }
public SlimefunGadget(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes, String[] keys, Object[] values) { public SlimefunGadget(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values); super(category, item, id, recipeType, recipe, keys, values);
this.recipes = new ArrayList<ItemStack[]>(); this.recipes = new ArrayList<>();
this.display_recipes = new ArrayList<ItemStack>(); this.displayRecipes = new ArrayList<>();
for (ItemStack i: machineRecipes) { for (ItemStack i: machineRecipes) {
this.recipes.add(new ItemStack[] {i}); this.recipes.add(new ItemStack[] {i});
this.display_recipes.add(i); this.displayRecipes.add(i);
} }
} }
@ -37,14 +41,15 @@ public class SlimefunGadget extends SlimefunItem {
return this.recipes; return this.recipes;
} }
@Override
public List<ItemStack> getDisplayRecipes() { public List<ItemStack> getDisplayRecipes() {
return this.display_recipes; return this.displayRecipes;
} }
public void addRecipe(ItemStack input, ItemStack output) { public void addRecipe(ItemStack input, ItemStack output) {
this.recipes.add(new ItemStack[] {input}); this.recipes.add(new ItemStack[] {input});
this.recipes.add(new ItemStack[] {output}); this.recipes.add(new ItemStack[] {output});
this.display_recipes.add(input); this.displayRecipes.add(input);
this.display_recipes.add(output); this.displayRecipes.add(output);
} }
} }

View File

@ -2,11 +2,10 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.logging.Level;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -15,37 +14,26 @@ import org.bukkit.block.Block;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.SlimefunStartup; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.AncientAltar.AltarRecipe;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.Research; import me.mrCookieSlime.Slimefun.Objects.Research;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler; import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.ancient_altar.AltarRecipe;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
import me.mrCookieSlime.Slimefun.api.energy.EnergyNet; import me.mrCookieSlime.Slimefun.api.energy.EnergyNet;
import me.mrCookieSlime.Slimefun.api.energy.EnergyNet.NetworkComponent; import me.mrCookieSlime.Slimefun.api.energy.EnergyNetComponent;
import me.mrCookieSlime.Slimefun.api.energy.EnergyTicker; import me.mrCookieSlime.Slimefun.api.energy.EnergyTicker;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
public class SlimefunItem { public class SlimefunItem {
public static List<SlimefunItem> items = new ArrayList<>();
public static Map<String, SlimefunItem> map_id = new HashMap<>();
public static List<ItemStack> radioactive = new ArrayList<>();
public static int vanilla = 0;
public static Set<String> tickers = new HashSet<>();
public static List<SlimefunItem> all = new ArrayList<>();
public static Map<String, Set<ItemHandler>> handlers = new HashMap<>();
public static Map<String, SlimefunBlockHandler> blockhandler = new HashMap<>();
private String id; private String id;
private String hash; private String hash;
private State state; private State state;
@ -53,27 +41,29 @@ public class SlimefunItem {
private Category category; private Category category;
private ItemStack[] recipe; private ItemStack[] recipe;
private RecipeType recipeType; private RecipeType recipeType;
private ItemStack recipeOutput = null; protected ItemStack recipeOutput = null;
private Research research; private Research research;
private int month = -1; private int month = -1;
private boolean enchantable = true, disenchantable = true; private boolean enchantable = true;
private boolean disenchantable = true;
private boolean hidden = false; private boolean hidden = false;
private boolean replacing = false; private boolean replacing = false;
private boolean addon = false; private boolean addon = false;
private String permission = ""; private String permission = "";
private Set<ItemHandler> itemhandlers = new HashSet<ItemHandler>(); private Set<ItemHandler> itemhandlers = new HashSet<>();
private boolean ticking = false; private boolean ticking = false;
private BlockTicker blockTicker; private BlockTicker blockTicker;
private EnergyTicker energyTicker; private EnergyTicker energyTicker;
private String[] keys = null; private String[] keys = null;
private Object[] values = null; private Object[] values = null;
private String wiki = null;
/** /**
* Defines whether a SlimefunItem is enabled, disabled or fall-back to its vanilla behavior. * Defines whether a SlimefunItem is enabled, disabled or fall-back to its vanilla behavior.
* *
* @since 4.1.10 * @since 4.1.10
*/ */
public enum State { public static enum State {
/** /**
* This SlimefunItem is enabled. * This SlimefunItem is enabled.
*/ */
@ -155,7 +145,10 @@ public class SlimefunItem {
* @since 4.1.11, rename of {@link #getName()}. * @since 4.1.11, rename of {@link #getName()}.
*/ */
public String getID() { return id; } public String getID() { return id; }
@Deprecated
public String getHash() { return hash; } public String getHash() { return hash; }
public State getState() { return state; } public State getState() { return state; }
public ItemStack getItem() { return item; } public ItemStack getItem() { return item; }
public Category getCategory() { return category; } public Category getCategory() { return category; }
@ -209,68 +202,76 @@ public class SlimefunItem {
public void register(boolean slimefun) { public void register(boolean slimefun) {
this.addon = !slimefun; this.addon = !slimefun;
try { try {
if (map_id.containsKey(this.id)) throw new IllegalArgumentException("ID \"" + this.id + "\" already exists"); preRegister();
if (this.recipe.length < 9) this.recipe = new ItemStack[] {null, null, null, null, null, null, null, null, null};
all.add(this);
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".enabled", true); if (SlimefunPlugin.getUtilities().itemIDs.containsKey(this.id)) {
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".can-be-used-in-workbenches", this.replacing); throw new IllegalArgumentException("ID \"" + this.id + "\" already exists");
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".hide-in-guide", this.hidden); }
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".allow-enchanting", this.enchantable); if (this.recipe.length < 9) this.recipe = new ItemStack[] {null, null, null, null, null, null, null, null, null};
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".allow-disenchanting", this.disenchantable); SlimefunPlugin.getUtilities().allItems.add(this);
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".required-permission", this.permission);
SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".enabled", true);
SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".can-be-used-in-workbenches", this.replacing);
SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".hide-in-guide", this.hidden);
SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".allow-enchanting", this.enchantable);
SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".allow-disenchanting", this.disenchantable);
SlimefunPlugin.getItemCfg().setDefaultValue(this.id + ".required-permission", this.permission);
if (this.keys != null && this.values != null) { if (this.keys != null && this.values != null) {
for (int i = 0; i < this.keys.length; i++) { for (int i = 0; i < this.keys.length; i++) {
SlimefunStartup.getItemCfg().setDefaultValue(this.id + "." + this.keys[i], this.values[i]); SlimefunPlugin.getItemCfg().setDefaultValue(this.id + "." + this.keys[i], this.values[i]);
} }
} }
for (World world: Bukkit.getWorlds()) { for (World world: Bukkit.getWorlds()) {
SlimefunStartup.getWhitelist().setDefaultValue(world.getName() + ".enabled", true); SlimefunPlugin.getWhitelist().setDefaultValue(world.getName() + ".enabled", true);
SlimefunStartup.getWhitelist().setDefaultValue(world.getName() + ".enabled-items." + this.id, true); SlimefunPlugin.getWhitelist().setDefaultValue(world.getName() + ".enabled-items." + this.id, true);
} }
if (this.ticking && !SlimefunStartup.getCfg().getBoolean("URID.enable-tickers")) { if (this.ticking && !SlimefunPlugin.getCfg().getBoolean("URID.enable-tickers")) {
this.state = State.DISABLED; this.state = State.DISABLED;
return; return;
} }
if (SlimefunStartup.getItemCfg().getBoolean(id + ".enabled")) { if (SlimefunPlugin.getItemCfg().getBoolean(id + ".enabled")) {
if (!Category.list().contains(category)) category.register(); if (!Category.list().contains(category)) category.register();
this.state = State.ENABLED; this.state = State.ENABLED;
this.replacing = SlimefunStartup.getItemCfg().getBoolean(this.id + ".can-be-used-in-workbenches"); this.replacing = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".can-be-used-in-workbenches");
this.hidden = SlimefunStartup.getItemCfg().getBoolean(this.id + ".hide-in-guide"); this.hidden = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".hide-in-guide");
this.enchantable = SlimefunStartup.getItemCfg().getBoolean(this.id + ".allow-enchanting"); this.enchantable = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".allow-enchanting");
this.disenchantable = SlimefunStartup.getItemCfg().getBoolean(this.id + ".allow-disenchanting"); this.disenchantable = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".allow-disenchanting");
this.permission = SlimefunStartup.getItemCfg().getString(this.id + ".required-permission"); this.permission = SlimefunPlugin.getItemCfg().getString(this.id + ".required-permission");
items.add(this); SlimefunPlugin.getUtilities().enabledItems.add(this);
if (slimefun) vanilla++; if (slimefun) SlimefunPlugin.getUtilities().vanillaItems++;
map_id.put(this.id, this); SlimefunPlugin.getUtilities().itemIDs.put(this.id, this);
this.create();
create();
for (ItemHandler handler: itemhandlers) { for (ItemHandler handler: itemhandlers) {
Set<ItemHandler> handlerset = getHandlers(handler.toCodename()); Set<ItemHandler> handlerset = getHandlers(handler.toCodename());
handlerset.add(handler); handlerset.add(handler);
handlers.put(handler.toCodename(), handlerset); SlimefunPlugin.getUtilities().itemHandlers.put(handler.toCodename(), handlerset);
} }
if (SlimefunStartup.getCfg().getBoolean("options.print-out-loading")) System.out.println("[Slimefun] Loaded Item \"" + this.id + "\""); if (SlimefunPlugin.getSettings().printOutLoading) {
Slimefun.getLogger().log(Level.INFO, "Loaded Item \"{0}\"", this.id);
}
} }
else { else {
if (this instanceof VanillaItem) this.state = State.VANILLA; if (this instanceof VanillaItem) this.state = State.VANILLA;
else this.state = State.DISABLED; else this.state = State.DISABLED;
} }
postRegister();
} catch(Exception x) { } catch(Exception x) {
System.err.println("[Slimefun] Item Registration failed: " + this.id); Slimefun.getLogger().log(Level.WARNING, "Registering the Item '" + id + "' for Slimefun " + Slimefun.getVersion() + " has failed", x);
x.printStackTrace();
} }
} }
public static List<SlimefunItem> list() { public static List<SlimefunItem> list() {
return items; return SlimefunPlugin.getUtilities().enabledItems;
} }
public void bindToResearch(Research r) { public void bindToResearch(Research r) {
@ -278,6 +279,7 @@ public class SlimefunItem {
this.research = r; this.research = r;
} }
@Deprecated
public void setHash(String hash) { public void setHash(String hash) {
this.hash = hash; this.hash = hash;
} }
@ -308,24 +310,26 @@ public class SlimefunItem {
*/ */
@Deprecated @Deprecated
public static SlimefunItem getByName(String name) { public static SlimefunItem getByName(String name) {
return map_id.get(name); return getByID(name);
} }
/** /**
* @since 4.1.11, rename of {@link #getByName(String)}. * @since 4.1.11, rename of {@link #getByName(String)}.
*/ */
public static SlimefunItem getByID(String id) { public static SlimefunItem getByID(String id) {
return map_id.get(id); return SlimefunPlugin.getUtilities().itemIDs.get(id);
} }
public static SlimefunItem getByItem(ItemStack item) { public static SlimefunItem getByItem(ItemStack item) {
if (item == null) return null; if (item == null) return null;
for (SlimefunItem sfi: items) { for (SlimefunItem sfi: SlimefunPlugin.getUtilities().enabledItems) {
if (sfi instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; if ((sfi instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) ||
else if (sfi instanceof DamagableChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; (sfi instanceof DamagableChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) ||
else if (sfi instanceof ChargedItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; (sfi instanceof ChargedItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) ||
else if (sfi instanceof SlimefunBackpack && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; (sfi instanceof SlimefunBackpack && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) ||
else if (SlimefunManager.isItemSimiliar(item, sfi.getItem(), true)) return sfi; SlimefunManager.isItemSimiliar(item, sfi.getItem(), true))
return sfi;
} }
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BROKEN_SPAWNER, false)) return getByID("BROKEN_SPAWNER"); if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BROKEN_SPAWNER, false)) return getByID("BROKEN_SPAWNER");
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.REPAIRED_SPAWNER, false)) return getByID("REINFORCED_SPAWNER"); if (SlimefunManager.isItemSimiliar(item, SlimefunItems.REPAIRED_SPAWNER, false)) return getByID("REINFORCED_SPAWNER");
@ -347,13 +351,14 @@ public class SlimefunItem {
if (recipeOutput != null) output = recipeOutput.clone(); if (recipeOutput != null) output = recipeOutput.clone();
if (recipeType.toItem().isSimilar(RecipeType.MOB_DROP.toItem())) { if (recipeType.toItem().isSimilar(RecipeType.MOB_DROP.toItem())) {
String mob = ChatColor.stripColor(recipe[4].getItemMeta().getDisplayName()).toUpperCase().replace(" ", "_");
try { try {
EntityType entity = EntityType.valueOf(ChatColor.stripColor(recipe[4].getItemMeta().getDisplayName()).toUpperCase().replace(" ", "_")); EntityType entity = EntityType.valueOf(mob);
List<ItemStack> dropping = new ArrayList<ItemStack>(); List<ItemStack> dropping = SlimefunPlugin.getUtilities().drops.getOrDefault(entity, new ArrayList<>());
if (SlimefunManager.drops.containsKey(entity)) dropping = SlimefunManager.drops.get(entity);
dropping.add(output); dropping.add(output);
SlimefunManager.drops.put(entity, dropping); SlimefunPlugin.getUtilities().drops.put(entity, dropping);
} catch(Exception x) { } catch(Exception x) {
Slimefun.getLogger().log(Level.WARNING, "An Exception occured when setting a Drop for the Mob: " + mob + " (" + x.getClass().getSimpleName() + ")");
} }
} }
else if (recipeType.toItem().isSimilar(RecipeType.ANCIENT_ALTAR.toItem())) { else if (recipeType.toItem().isSimilar(RecipeType.ANCIENT_ALTAR.toItem())) {
@ -362,14 +367,15 @@ public class SlimefunItem {
else if (recipeType.getMachine() != null && getByID(recipeType.getMachine().getID()) instanceof SlimefunMachine) { else if (recipeType.getMachine() != null && getByID(recipeType.getMachine().getID()) instanceof SlimefunMachine) {
((SlimefunMachine) getByID(recipeType.getMachine().getID())).addRecipe(recipe, output); ((SlimefunMachine) getByID(recipeType.getMachine().getID())).addRecipe(recipe, output);
} }
install(); install();
} catch(Exception x) { } catch(Exception x) {
System.err.println("[Slimefun] Item Initialization failed: " + id); Slimefun.getLogger().log(Level.WARNING, "Item Setup failed: " + id + " (" + x.getClass().getSimpleName() + ")");
} }
} }
public static State getState(ItemStack item) { public static State getState(ItemStack item) {
for (SlimefunItem i: all) { for (SlimefunItem i: SlimefunPlugin.getUtilities().allItems) {
if (i.isItem(item)) { if (i.isItem(item)) {
return i.getState(); return i.getState();
} }
@ -378,7 +384,7 @@ public class SlimefunItem {
} }
public static boolean isDisabled(ItemStack item) { public static boolean isDisabled(ItemStack item) {
for (SlimefunItem i: all) { for (SlimefunItem i: SlimefunPlugin.getUtilities().allItems) {
if (i.isItem(item)) { if (i.isItem(item)) {
return i.isDisabled(); return i.isDisabled();
} }
@ -386,8 +392,26 @@ public class SlimefunItem {
return false; return false;
} }
public void install() {} @Deprecated
public void create() {} public void install() {
// Deprecated
}
/**
* @deprecated Use {@link SlimefunItem#postRegister()} instead
*/
@Deprecated
public void create() {
// Deprecated
}
/**
* @deprecated Use {@link SlimefunItem#addItemHandler(ItemHandler...)} instead
*/
@Deprecated
public void addItemHandler(me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler... handler) {
addItemHandler((ItemHandler[]) handler);
}
public void addItemHandler(ItemHandler... handler) { public void addItemHandler(ItemHandler... handler) {
this.itemhandlers.addAll(Arrays.asList(handler)); this.itemhandlers.addAll(Arrays.asList(handler));
@ -395,12 +419,12 @@ public class SlimefunItem {
for (ItemHandler h: handler) { for (ItemHandler h: handler) {
if (h instanceof BlockTicker) { if (h instanceof BlockTicker) {
this.ticking = true; this.ticking = true;
tickers.add(getID()); SlimefunPlugin.getUtilities().tickers.add(getID());
this.blockTicker = (BlockTicker) h; this.blockTicker = (BlockTicker) h;
} }
else if (h instanceof EnergyTicker) { else if (h instanceof EnergyTicker) {
this.energyTicker = (EnergyTicker) h; this.energyTicker = (EnergyTicker) h;
EnergyNet.registerComponent(getID(), NetworkComponent.SOURCE); EnergyNet.registerComponent(getID(), EnergyNetComponent.SOURCE);
} }
} }
} }
@ -415,23 +439,40 @@ public class SlimefunItem {
register(false); register(false);
} }
/**
* @deprecated Use {@link SlimefunItem#register(boolean, ItemHandler...)} instead
*/
@Deprecated
public void register(boolean vanilla, me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler... handlers) {
addItemHandler(handlers);
register(vanilla);
}
/**
* @deprecated Use {@link SlimefunItem#register(ItemHandler...)} instead
*/
@Deprecated
public void register(me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler... handlers) {
register((ItemHandler[]) handlers);
}
public void register(boolean vanilla, SlimefunBlockHandler handler) { public void register(boolean vanilla, SlimefunBlockHandler handler) {
blockhandler.put(getID(), handler); SlimefunPlugin.getUtilities().blockHandlers.put(getID(), handler);
register(vanilla); register(vanilla);
} }
public void register(SlimefunBlockHandler handler) { public void register(SlimefunBlockHandler handler) {
blockhandler.put(getID(), handler); SlimefunPlugin.getUtilities().blockHandlers.put(getID(), handler);
register(false); register(false);
} }
public static Set<ItemHandler> getHandlers(String codeid) { public static Set<ItemHandler> getHandlers(String codeid) {
if (handlers.containsKey(codeid)) return handlers.get(codeid); if (SlimefunPlugin.getUtilities().itemHandlers.containsKey(codeid)) return SlimefunPlugin.getUtilities().itemHandlers.get(codeid);
else return new HashSet<>(); else return new HashSet<>();
} }
public static void setRadioactive(ItemStack item) { public static void setRadioactive(ItemStack item) {
radioactive.add(item); SlimefunPlugin.getUtilities().radioactiveItems.add(item);
} }
public static ItemStack getItem(String id) { public static ItemStack getItem(String id) {
@ -442,13 +483,14 @@ public class SlimefunItem {
public static void patchExistingItem(String id, ItemStack stack) { public static void patchExistingItem(String id, ItemStack stack) {
SlimefunItem item = getByID(id); SlimefunItem item = getByID(id);
if (item != null) { if (item != null) {
System.out.println("[Slimefun] WARNING - Patching existing Item - " + id); Slimefun.getLogger().log(Level.INFO, "Patching existing Item... {0}", id);
System.out.println("[Slimefun] This might take a while"); Slimefun.getLogger().log(Level.INFO, "This might take a while");
final ItemStack old = item.getItem(); final ItemStack old = item.getItem();
item.setItem(stack); item.setItem(stack);
for (SlimefunItem sfi: list()) { for (SlimefunItem sfi: list()) {
ItemStack[] recipe = sfi.getRecipe(); ItemStack[] recipe = sfi.getRecipe();
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
if (SlimefunManager.isItemSimiliar(recipe[i], old, true)) recipe[i] = stack; if (SlimefunManager.isItemSimiliar(recipe[i], old, true)) recipe[i] = stack;
} }
@ -464,7 +506,7 @@ public class SlimefunItem {
public void registerChargeableBlock(boolean slimefun, int capacity) { public void registerChargeableBlock(boolean slimefun, int capacity) {
this.register(slimefun); this.register(slimefun);
ChargableBlock.registerChargableBlock(id, capacity, true); ChargableBlock.registerChargableBlock(id, capacity, true);
EnergyNet.registerComponent(id, NetworkComponent.CONSUMER); EnergyNet.registerComponent(id, EnergyNetComponent.CONSUMER);
} }
public void registerUnrechargeableBlock(boolean slimefun, int capacity) { public void registerUnrechargeableBlock(boolean slimefun, int capacity) {
@ -479,25 +521,35 @@ public class SlimefunItem {
public void registerEnergyDistributor(boolean slimefun) { public void registerEnergyDistributor(boolean slimefun) {
this.register(slimefun); this.register(slimefun);
EnergyNet.registerComponent(id, NetworkComponent.DISTRIBUTOR); EnergyNet.registerComponent(id, EnergyNetComponent.DISTRIBUTOR);
} }
public void registerDistibutingCapacitor(boolean slimefun, final int capacity) { public void registerDistibutingCapacitor(boolean slimefun, final int capacity) {
this.register(slimefun); this.register(slimefun);
EnergyNet.registerComponent(id, NetworkComponent.DISTRIBUTOR); EnergyNet.registerComponent(id, EnergyNetComponent.DISTRIBUTOR);
ChargableBlock.registerCapacitor(id, capacity); ChargableBlock.registerCapacitor(id, capacity);
} }
public void preRegister() {
// Override this method to execute code before the Item has been registered
// Useful for calls to addItemHandler(...)
}
public void postRegister() {
// Override this method to execute code after the Item has been registered
// Useful for calls to Slimefun.getItemValue(...)
}
protected void setItem(ItemStack stack) { protected void setItem(ItemStack stack) {
this.item = stack; this.item = stack;
} }
public static boolean isTicking(String item) { public static boolean isTicking(String item) {
return tickers.contains(item); return SlimefunPlugin.getUtilities().tickers.contains(item);
} }
public static void registerBlockHandler(String id, SlimefunBlockHandler handler) { public static void registerBlockHandler(String id, SlimefunBlockHandler handler) {
blockhandler.put(id, handler); SlimefunPlugin.getUtilities().blockHandlers.put(id, handler);
} }
public void registerChargeableBlock(boolean vanilla, int capacity, ItemHandler... handlers) { public void registerChargeableBlock(boolean vanilla, int capacity, ItemHandler... handlers) {
@ -510,6 +562,19 @@ public class SlimefunItem {
} }
public void addWikipage(String page) { public void addWikipage(String page) {
Slimefun.addWikiPage(this.getID(), "https://github.com/TheBusyBiscuit/Slimefun4/wiki/" + page); wiki = "https://github.com/TheBusyBiscuit/Slimefun4/wiki/" + page;
}
public boolean hasWiki() {
return wiki != null;
}
public String getWiki() {
return wiki;
}
@Override
public String toString() {
return "SlimefunItem: " + id + " (" + state + ", vanilla=" + !addon + ")";
} }
} }

View File

@ -1,33 +1,24 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
import java.util.*; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.MultiBlock; import me.mrCookieSlime.Slimefun.Objects.MultiBlock;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem;
import org.bukkit.Material; public class SlimefunMachine extends SlimefunItem implements RecipeDisplayItem {
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Container;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
public class SlimefunMachine extends SlimefunItem {
private List<ItemStack[]> recipes; private List<ItemStack[]> recipes;
private List<ItemStack> shownRecipes;
private Material trigger; private Material trigger;
//Adjacent blockfaces for iterative output chest checks
private static final BlockFace[] outputFaces = { protected List<ItemStack> shownRecipes;
BlockFace.UP,
BlockFace.NORTH,
BlockFace.EAST,
BlockFace.SOUTH,
BlockFace.WEST
};
public SlimefunMachine(Category category, ItemStack item, String id, ItemStack[] recipe, ItemStack[] machineRecipes, Material trigger) { public SlimefunMachine(Category category, ItemStack item, String id, ItemStack[] recipe, ItemStack[] machineRecipes, Material trigger) {
super(category, item, id, RecipeType.MULTIBLOCK, recipe); super(category, item, id, RecipeType.MULTIBLOCK, recipe);
@ -54,20 +45,17 @@ public class SlimefunMachine extends SlimefunItem {
} }
public List<ItemStack[]> getRecipes() { public List<ItemStack[]> getRecipes() {
return this.recipes; return recipes;
} }
@Override
public List<ItemStack> getDisplayRecipes() { public List<ItemStack> getDisplayRecipes() {
return this.shownRecipes; return shownRecipes;
}
public static BlockFace[] getOutputFaces() {
return outputFaces;
} }
public void addRecipe(ItemStack[] input, ItemStack output) { public void addRecipe(ItemStack[] input, ItemStack output) {
this.recipes.add(input); recipes.add(input);
this.recipes.add(new ItemStack[] {output}); recipes.add(new ItemStack[] {output});
} }
@Override @Override
@ -79,8 +67,9 @@ public class SlimefunMachine extends SlimefunItem {
public void install() { public void install() {
for (ItemStack i: this.getDisplayRecipes()) { for (ItemStack i: this.getDisplayRecipes()) {
SlimefunItem item = SlimefunItem.getByItem(i); SlimefunItem item = SlimefunItem.getByItem(i);
if (item == null) this.recipes.add(new ItemStack[] {i}); if (item == null || !SlimefunItem.isDisabled(i)) {
else if (!SlimefunItem.isDisabled(i)) this.recipes.add(new ItemStack[] {i}); this.recipes.add(new ItemStack[] {i});
}
} }
} }
@ -99,34 +88,4 @@ public class SlimefunMachine extends SlimefunItem {
return this.recipes.iterator(); return this.recipes.iterator();
} }
// Overloaded method for finding a potential output chest. Fallbacks to the old system of putting the adding back into the dispenser.
// Optional last argument Inventory placeCheckerInv is for multiblock machines that create a dummy inventory to check if there's a space for the adding,
// i.e. Enhanced crafting table
public static Inventory findValidOutputInv(ItemStack adding, Block dispBlock, Inventory dispInv) {
return findValidOutputInv(adding, dispBlock, dispInv, dispInv);
}
public static Inventory findValidOutputInv(ItemStack product, Block dispBlock, Inventory dispInv, Inventory placeCheckerInv) {
Inventory outputInv = null;
for (BlockFace face : outputFaces) {
Block potentialOutput = dispBlock.getRelative(face);
String id = BlockStorage.checkID(potentialOutput);
if (id != null && id.equals("OUTPUT_CHEST")) {
// Found the output chest! Now, let's check if we can fit the product in it.
Inventory inv = ((Container) potentialOutput.getState()).getInventory();
if (InvUtils.fits(inv, product)) {
// It fits! Let's set the inventory to that now.
outputInv = inv;
break;
}
}
}
// This if-clause will trigger if no suitable output chest was found. It's functionally the same as the old fit check for the dispenser, only refactored.
if (outputInv == null && InvUtils.fits(placeCheckerInv, product)) outputInv = dispInv;
return outputInv;
}
} }

View File

@ -5,11 +5,18 @@ import me.mrCookieSlime.Slimefun.Objects.Category;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
/**
* Represents an Item that will not drop on death.
*
* @author TheBusyBiscuit
*
*/
public class SoulboundItem extends SlimefunItem { public class SoulboundItem extends SlimefunItem {
public SoulboundItem(Category category, ItemStack item, String id, ItemStack[] recipe) { public SoulboundItem(Category category, ItemStack item, String id, ItemStack[] recipe) {
super(category, item, id, RecipeType.MAGIC_WORKBENCH, recipe); super(category, item, id, RecipeType.MAGIC_WORKBENCH, recipe);
} }
public SoulboundItem(Category category, ItemStack item, String id, RecipeType type, ItemStack[] recipe) { public SoulboundItem(Category category, ItemStack item, String id, RecipeType type, ItemStack[] recipe) {
super(category, item, id, type, recipe); super(category, item, id, type, recipe);
} }

View File

@ -2,14 +2,7 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.SlimefunStartup;
import me.mrCookieSlime.Slimefun.Lists.Categories;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Research;
import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -23,16 +16,24 @@ import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.Lists.Categories;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.Research;
import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.api.Slimefun;
/** /**
* @since 4.0 * @since 4.0
*/ */
public class Talisman extends SlimefunItem { public class Talisman extends SlimefunItem {
private String suffix; protected String suffix;
private boolean consumable = true; protected boolean consumable = true;
private boolean cancel = true; protected boolean cancel = true;
private PotionEffect[] effects; protected PotionEffect[] effects;
private int chance = 100; protected int chance = 100;
public Talisman(ItemStack item, String id, ItemStack[] recipe, boolean consumable, boolean cancelEvent, String messageSuffix, PotionEffect... effects) { public Talisman(ItemStack item, String id, ItemStack[] recipe, boolean consumable, boolean cancelEvent, String messageSuffix, PotionEffect... effects) {
super(Categories.TALISMANS_1, item, id, RecipeType.MAGIC_WORKBENCH, recipe, new CustomItem(item, consumable ? 4 : 1)); super(Categories.TALISMANS_1, item, id, RecipeType.MAGIC_WORKBENCH, recipe, new CustomItem(item, consumable ? 4 : 1));
@ -52,12 +53,16 @@ public class Talisman extends SlimefunItem {
} }
public Talisman(ItemStack item, String id, ItemStack[] recipe, String messageSuffix, int chance, PotionEffect... effects) { public Talisman(ItemStack item, String id, ItemStack[] recipe, String messageSuffix, int chance, PotionEffect... effects) {
super(Categories.TALISMANS_1, item, id, RecipeType.MAGIC_WORKBENCH, recipe, item); super(Categories.TALISMANS_1, item, id, RecipeType.MAGIC_WORKBENCH, recipe);
this.suffix = messageSuffix; this.suffix = messageSuffix;
this.effects = effects; this.effects = effects;
this.chance = chance; this.chance = chance;
} }
protected Talisman(Category category, ItemStack item, String id, ItemStack[] recipe) {
super(category, item, id, RecipeType.MAGIC_WORKBENCH, recipe);
}
public String getSuffix() { public String getSuffix() {
return this.suffix; return this.suffix;
} }
@ -78,13 +83,45 @@ public class Talisman extends SlimefunItem {
return this.chance; return this.chance;
} }
public ItemStack upgrade() {
List<String> lore = new ArrayList<>();
lore.add("&7&oEnder Infused");
lore.add("");
for (String line : getItem().getItemMeta().getLore()) {
lore.add(line);
}
return new CustomItem(getItem().getType(), "&5Ender " + ChatColor.stripColor(getItem().getItemMeta().getDisplayName()), lore.toArray(new String[lore.size()]));
}
@Override
public void create() {
EnderTalisman talisman = new EnderTalisman(this);
talisman.register(!isAddonItem());
}
@Override
public void install() {
EnderTalisman talisman = (EnderTalisman) SlimefunItem.getByItem(upgrade());
Research research = Research.getByID(112);
if (talisman != null) {
Slimefun.addOfficialWikiPage(talisman.getID(), "Talismans");
if (research != null) talisman.bindToResearch(research);
}
Slimefun.addOfficialWikiPage(getID(), "Talismans");
}
private static boolean isTalismanMessage(Talisman talisman){
return !("").equalsIgnoreCase(talisman.getSuffix());
}
public static boolean checkFor(Event e, SlimefunItem item) { public static boolean checkFor(Event e, SlimefunItem item) {
if (!(item instanceof Talisman)) { if (!(item instanceof Talisman)) {
return false; return false;
} }
Talisman talisman = (Talisman) item; Talisman talisman = (Talisman) item;
if (!SlimefunStartup.chance(100, talisman.getChance())) { if (new Random().nextInt(100) < talisman.getChance()) {
return false; return false;
} }
@ -108,39 +145,6 @@ public class Talisman extends SlimefunItem {
else return false; else return false;
} }
else return false; else return false;
}
public ItemStack upgrade() {
List<String> lore = new ArrayList<>();
lore.add("&7&oEnder Infused");
lore.add("");
for (String line : getItem().getItemMeta().getLore()) {
lore.add(line);
}
return new CustomItem(getItem().getType(), "&5Ender " + ChatColor.stripColor(getItem().getItemMeta().getDisplayName()), lore.toArray(new String[lore.size()]));
}
@Override
public void create() {
EnderTalisman talisman = new EnderTalisman(this);
talisman.register(true);
}
@Override
public void install() {
EnderTalisman talisman = (EnderTalisman) SlimefunItem.getByItem(upgrade());
Research research = Research.getByID(112);
if (talisman != null) {
Slimefun.addOfficialWikiPage(talisman.getID(), "Talismans");
if (research != null) talisman.bindToResearch(research);
}
Slimefun.addOfficialWikiPage(getID(), "Talismans");
}
private static boolean isTalismanMessage(Talisman talisman){
return !("").equalsIgnoreCase(talisman.getSuffix());
} }
private static void executeTalismanAttributes(Event e, Player p, Talisman talisman){ private static void executeTalismanAttributes(Event e, Player p, Talisman talisman){

View File

@ -5,17 +5,12 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenuClickHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenuClickHandler;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction;
@ -23,23 +18,21 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
public abstract class AContainer extends SlimefunItem { public abstract class AContainer extends SlimefunItem implements InventoryBlock {
public static Map<Block, MachineRecipe> processing = new HashMap<Block, MachineRecipe>(); public static Map<Block, MachineRecipe> processing = new HashMap<>();
public static Map<Block, Integer> progress = new HashMap<Block, Integer>(); public static Map<Block, Integer> progress = new HashMap<>();
protected List<MachineRecipe> recipes = new ArrayList<MachineRecipe>(); protected List<MachineRecipe> recipes = new ArrayList<>();
private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 31, 36, 37, 38, 39, 40, 41, 42, 43, 44}; private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 31, 36, 37, 38, 39, 40, 41, 42, 43, 44};
private static final int[] border_in = {9, 10, 11, 12, 18, 21, 27, 28, 29, 30}; private static final int[] border_in = {9, 10, 11, 12, 18, 21, 27, 28, 29, 30};
@ -48,37 +41,9 @@ public abstract class AContainer extends SlimefunItem {
public AContainer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { public AContainer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe); super(category, item, id, recipeType, recipe);
new BlockMenuPreset(id, getInventoryTitle()) { createPreset(this, getInventoryTitle(), this::constructMenu);
@Override registerBlockHandler(id, (p, b, tool, reason) -> {
public void init() {
constructMenu(this);
}
@Override
public void newInstance(BlockMenu menu, Block b) {
}
@Override
public boolean canOpen(Block b, Player p) {
return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
}
@Override
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots();
else return getOutputSlots();
}
};
registerBlockHandler(id, new SlimefunBlockHandler() {
@Override
public void onPlace(Player p, Block b, SlimefunItem item) {
}
@Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b); BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) { if (inv != null) {
for (int slot : getInputSlots()) { for (int slot : getInputSlots()) {
@ -87,6 +52,7 @@ public abstract class AContainer extends SlimefunItem {
inv.replaceExistingItem(slot, null); inv.replaceExistingItem(slot, null);
} }
} }
for (int slot : getOutputSlots()) { for (int slot : getOutputSlots()) {
if (inv.getItemInSlot(slot) != null) { if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
@ -94,94 +60,34 @@ public abstract class AContainer extends SlimefunItem {
} }
} }
} }
progress.remove(b); progress.remove(b);
processing.remove(b); processing.remove(b);
return true; return true;
}
}); });
this.registerDefaultRecipes(); this.registerDefaultRecipes();
} }
public AContainer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { public AContainer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
super(category, item, id, recipeType, recipe, recipeOutput); this(category, item, id, recipeType, recipe);
this.recipeOutput = recipeOutput;
new BlockMenuPreset(id, getInventoryTitle()) {
@Override
public void init() {
constructMenu(this);
}
@Override
public void newInstance(BlockMenu menu, Block b) {
}
@Override
public boolean canOpen(Block b, Player p) {
return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
}
@Override
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots();
else return getOutputSlots();
}
};
registerBlockHandler(id, new SlimefunBlockHandler() {
@Override
public void onPlace(Player p, Block b, SlimefunItem item) {
}
@Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) {
for (int slot: getInputSlots()) {
if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
inv.replaceExistingItem(slot, null);
}
}
for (int slot: getOutputSlots()) {
if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
inv.replaceExistingItem(slot, null);
}
}
}
processing.remove(b);
progress.remove(b);
return true;
}
});
this.registerDefaultRecipes();
} }
protected void constructMenu(BlockMenuPreset preset) { protected void constructMenu(BlockMenuPreset preset) {
for (int i : border) { for (int i : border) {
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
}
for (int i : border_in) {
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "),
(p, slot, item, action) -> false
);
}
for (int i : border_out) {
preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "),
(p, slot, item, action) -> false
);
} }
preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), for (int i : border_in) {
(p, slot, item, action) -> false preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
); }
for (int i : border_out) {
preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
}
preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
for (int i : getOutputSlots()) { for (int i : getOutputSlots()) {
preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() { preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() {
@ -201,15 +107,31 @@ public abstract class AContainer extends SlimefunItem {
public abstract String getInventoryTitle(); public abstract String getInventoryTitle();
public abstract ItemStack getProgressBar(); public abstract ItemStack getProgressBar();
public abstract void registerDefaultRecipes();
public abstract int getEnergyConsumption(); public abstract int getEnergyConsumption();
public abstract int getSpeed(); public abstract int getSpeed();
public abstract String getMachineIdentifier(); public abstract String getMachineIdentifier();
public void registerDefaultRecipes() {
// Override this method to register your machine recipes
}
public List<ItemStack> getDisplayRecipes() {
List<ItemStack> displayRecipes = new ArrayList<>(recipes.size() * 2);
for (MachineRecipe recipe: recipes) {
displayRecipes.add(recipe.getInput()[0]);
displayRecipes.add(recipe.getOutput()[0]);
}
return displayRecipes;
}
@Override
public int[] getInputSlots() { public int[] getInputSlots() {
return new int[] {19, 20}; return new int[] {19, 20};
} }
@Override
public int[] getOutputSlots() { public int[] getOutputSlots() {
return new int[] {24, 25}; return new int[] {24, 25};
} }
@ -231,33 +153,8 @@ public abstract class AContainer extends SlimefunItem {
this.registerRecipe(new MachineRecipe(seconds, input, output)); this.registerRecipe(new MachineRecipe(seconds, input, output));
} }
private Inventory inject(Block b) {
int size = BlockStorage.getInventory(b).toInventory().getSize();
Inventory inv = Bukkit.createInventory(null, size);
for (int i = 0; i < size; i++) {
inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US"));
}
for (int slot : getOutputSlots()) {
inv.setItem(slot, BlockStorage.getInventory(b).getItemInSlot(slot));
}
return inv;
}
protected boolean fits(Block b, ItemStack[] items) {
return inject(b).addItem(items).isEmpty();
}
protected void pushItems(Block b, ItemStack[] items) {
Inventory inv = inject(b);
inv.addItem(items);
for (int slot : getOutputSlots()) {
BlockStorage.getInventory(b).replaceExistingItem(slot, inv.getItem(slot));
}
}
@Override @Override
public void register(boolean slimefun) { public void preRegister() {
addItemHandler(new BlockTicker() { addItemHandler(new BlockTicker() {
@Override @Override
@ -265,35 +162,18 @@ public abstract class AContainer extends SlimefunItem {
AContainer.this.tick(b); AContainer.this.tick(b);
} }
@Override
public void uniqueTick() {
}
@Override @Override
public boolean isSynchronized() { public boolean isSynchronized() {
return false; return false;
} }
}); });
super.register(slimefun);
} }
protected void tick(Block b) { protected void tick(Block b) {
if (isProcessing(b)) { if (isProcessing(b)) {
int timeleft = progress.get(b); int timeleft = progress.get(b);
if (timeleft > 0) { if (timeleft > 0) {
ItemStack item = getProgressBar().clone(); MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar());
ItemMeta im = item.getItemMeta();
((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks()));
im.setDisplayName(" ");
List<String> lore = new ArrayList<String>();
lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks()));
lore.add("");
lore.add(MachineHelper.getTimeLeft(timeleft / 2));
im.setLore(lore);
item.setItemMeta(im);
BlockStorage.getInventory(b).replaceExistingItem(22, item);
if (ChargableBlock.isChargable(b)) { if (ChargableBlock.isChargable(b)) {
if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
@ -312,30 +192,31 @@ public abstract class AContainer extends SlimefunItem {
} }
else { else {
MachineRecipe r = null; MachineRecipe r = null;
Map<Integer, Integer> found = new HashMap<Integer, Integer>(); Map<Integer, Integer> found = new HashMap<>();
outer:
for (MachineRecipe recipe: recipes) { for (MachineRecipe recipe: recipes) {
for (ItemStack input: recipe.getInput()) { for (ItemStack input: recipe.getInput()) {
slots:
for (int slot: getInputSlots()) { for (int slot: getInputSlots()) {
if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), input, true)) { if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), input, true)) {
found.put(slot, input.getAmount()); found.put(slot, input.getAmount());
break slots; break;
} }
} }
} }
if (found.size() == recipe.getInput().length) { if (found.size() == recipe.getInput().length) {
r = recipe; r = recipe;
break outer; break;
} }
else found.clear(); else found.clear();
} }
if (r != null) { if (r != null) {
if (!fits(b, r.getOutput())) return; if (!fits(b, r.getOutput())) return;
for (Map.Entry<Integer, Integer> entry: found.entrySet()) { for (Map.Entry<Integer, Integer> entry: found.entrySet()) {
BlockStorage.getInventory(b).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(entry.getKey()), entry.getValue())); BlockStorage.getInventory(b).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(entry.getKey()), entry.getValue()));
} }
processing.put(b, r); processing.put(b, r);
progress.put(b, r.getTicks()); progress.put(b, r.getTicks());
} }

View File

@ -1,15 +1,10 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction;
@ -21,7 +16,6 @@ import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
@ -77,10 +71,6 @@ public abstract class ADrill extends AContainer {
} }
} }
@Override
public void newInstance(BlockMenu menu, Block b) {
}
@Override @Override
public boolean canOpen(Block b, Player p) { public boolean canOpen(Block b, Player p) {
if (!(p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true))) { if (!(p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true))) {
@ -96,7 +86,7 @@ public abstract class ADrill extends AContainer {
@Override @Override
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots(); if (flow == ItemTransportFlow.INSERT) return getInputSlots();
else return getOutputSlots(); else return getOutputSlots();
} }
}; };
@ -110,22 +100,12 @@ public abstract class ADrill extends AContainer {
@Override @Override
public void registerDefaultRecipes() {} public void registerDefaultRecipes() {}
@Override
protected void tick(Block b) { protected void tick(Block b) {
if (isProcessing(b)) { if (isProcessing(b)) {
int timeleft = progress.get(b); int timeleft = progress.get(b);
if (timeleft > 0) { if (timeleft > 0) {
ItemStack item = getProgressBar().clone(); MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar());
ItemMeta im = item.getItemMeta();
((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks()));
im.setDisplayName(" ");
List<String> lore = new ArrayList<String>();
lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks()));
lore.add("");
lore.add(MachineHelper.getTimeLeft(timeleft / 2));
im.setLore(lore);
item.setItemMeta(im);
BlockStorage.getInventory(b).replaceExistingItem(22, item);
if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
ChargableBlock.addCharge(b, -getEnergyConsumption()); ChargableBlock.addCharge(b, -getEnergyConsumption());

View File

@ -16,10 +16,8 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
@ -41,10 +39,6 @@ public abstract class AFarm extends SlimefunItem {
constructMenu(this); constructMenu(this);
} }
@Override
public void newInstance(BlockMenu menu, Block b) {
}
@Override @Override
public boolean canOpen(Block b, Player p) { public boolean canOpen(Block b, Player p) {
return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true); return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
@ -52,19 +46,12 @@ public abstract class AFarm extends SlimefunItem {
@Override @Override
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots(); if (flow == ItemTransportFlow.WITHDRAW) return getOutputSlots();
return new int[0]; return new int[0];
} }
}; };
registerBlockHandler(id, new SlimefunBlockHandler() { registerBlockHandler(id, (p, b, tool, reason) -> {
@Override
public void onPlace(Player p, Block b, SlimefunItem item) {
}
@Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b); BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) { if (inv != null) {
for (int slot : getOutputSlots()) { for (int slot : getOutputSlots()) {
@ -75,73 +62,19 @@ public abstract class AFarm extends SlimefunItem {
} }
} }
return true; return true;
}
});
}
public AFarm(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
super(category, item, id, recipeType, recipe, recipeOutput);
new BlockMenuPreset(id, getInventoryTitle()) {
@Override
public void init() {
constructMenu(this);
}
@Override
public void newInstance(BlockMenu menu, Block b) {
}
@Override
public boolean canOpen(Block b, Player p) {
return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
}
@Override
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();
return new int[0];
}
};
registerBlockHandler(id, new SlimefunBlockHandler() {
@Override
public void onPlace(Player p, Block b, SlimefunItem item) {
}
@Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) {
for (int slot: getOutputSlots()) {
if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
inv.replaceExistingItem(slot, null);
}
}
}
return true;
}
}); });
} }
private void constructMenu(BlockMenuPreset preset) { private void constructMenu(BlockMenuPreset preset) {
for (int i : border) { for (int i : border) {
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
}
for (int i : border_out) {
preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "),
(p, slot, item, action) -> false
);
} }
preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), for (int i : border_out) {
(p, slot, item, action) -> false preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
); }
preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
for (int i : getOutputSlots()) { for (int i : getOutputSlots()) {
preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() { preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() {
@ -173,16 +106,21 @@ public abstract class AFarm extends SlimefunItem {
if (ChargableBlock.isChargable(b)) { if (ChargableBlock.isChargable(b)) {
if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return; if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
int i = getSize() / 2; int i = getSize() / 2;
loop:
for (int x = -i; x <= i; x++) { for (int x = -i; x <= i; x++) {
for (int z = -i; z <= i; z++) { for (int z = -i; z <= i; z++) {
Block block = new Location(b.getWorld(), b.getX() + x, b.getY() + 2, b.getZ() + z).getBlock(); Block block = new Location(b.getWorld(), b.getX() + (double) x, b.getY() + 2.0, b.getZ() + (double) z).getBlock();
if (canHarvest(block)) { if (canHarvest(block)) {
ItemStack item = harvest(block); ItemStack item = harvest(block);
if (!fits(block, new ItemStack[] {item})) break loop;
pushItems(b, new ItemStack[] {item}); if (!fits(block, item)) {
return;
}
pushItems(b, item);
ChargableBlock.addCharge(b, -getEnergyConsumption()); ChargableBlock.addCharge(b, -getEnergyConsumption());
break loop;
return;
} }
} }
} }
@ -190,7 +128,7 @@ public abstract class AFarm extends SlimefunItem {
} }
@Override @Override
public void register(boolean slimefun) { public void preRegister() {
addItemHandler(new BlockTicker() { addItemHandler(new BlockTicker() {
@Override @Override
@ -198,36 +136,32 @@ public abstract class AFarm extends SlimefunItem {
AFarm.this.tick(b); AFarm.this.tick(b);
} }
@Override
public void uniqueTick() {
}
@Override @Override
public boolean isSynchronized() { public boolean isSynchronized() {
return true; return true;
} }
}); });
super.register(slimefun);
} }
private Inventory inject(Block b) { private Inventory inject(Block b) {
int size = BlockStorage.getInventory(b).toInventory().getSize(); int size = BlockStorage.getInventory(b).toInventory().getSize();
Inventory inv = Bukkit.createInventory(null, size); Inventory inv = Bukkit.createInventory(null, size);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US")); inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US"));
} }
for (int slot: getOutputSlots()) { for (int slot: getOutputSlots()) {
inv.setItem(slot, BlockStorage.getInventory(b).getItemInSlot(slot)); inv.setItem(slot, BlockStorage.getInventory(b).getItemInSlot(slot));
} }
return inv; return inv;
} }
protected boolean fits(Block b, ItemStack[] items) { protected boolean fits(Block b, ItemStack... items) {
return inject(b).addItem(items).isEmpty(); return inject(b).addItem(items).isEmpty();
} }
protected void pushItems(Block b, ItemStack[] items) { protected void pushItems(Block b, ItemStack... items) {
Inventory inv = inject(b); Inventory inv = inject(b);
inv.addItem(items); inv.addItem(items);

View File

@ -1,9 +1,7 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -15,8 +13,6 @@ import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
@ -27,9 +23,7 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
@ -40,10 +34,10 @@ import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
public abstract class AGenerator extends SlimefunItem { public abstract class AGenerator extends SlimefunItem {
public static Map<Location, MachineFuel> processing = new HashMap<Location, MachineFuel>(); public static Map<Location, MachineFuel> processing = new HashMap<>();
public static Map<Location, Integer> progress = new HashMap<Location, Integer>(); public static Map<Location, Integer> progress = new HashMap<>();
private Set<MachineFuel> recipes = new HashSet<MachineFuel>(); private Set<MachineFuel> recipes = new HashSet<>();
private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 31, 36, 37, 38, 39, 40, 41, 42, 43, 44}; private static final int[] border = {0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 31, 36, 37, 38, 39, 40, 41, 42, 43, 44};
private static final int[] border_in = {9, 10, 11, 12, 18, 21, 27, 28, 29, 30}; private static final int[] border_in = {9, 10, 11, 12, 18, 21, 27, 28, 29, 30};
@ -59,10 +53,6 @@ public abstract class AGenerator extends SlimefunItem {
constructMenu(this); constructMenu(this);
} }
@Override
public void newInstance(BlockMenu menu, Block b) {
}
@Override @Override
public boolean canOpen(Block b, Player p) { public boolean canOpen(Block b, Player p) {
return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true); return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
@ -70,19 +60,12 @@ public abstract class AGenerator extends SlimefunItem {
@Override @Override
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) { public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots(); if (flow == ItemTransportFlow.INSERT) return getInputSlots();
else return getOutputSlots(); else return getOutputSlots();
} }
}; };
registerBlockHandler(id, new SlimefunBlockHandler() { registerBlockHandler(id, (p, b, tool, reason) -> {
@Override
public void onPlace(Player p, Block b, SlimefunItem item) {
}
@Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b); BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) { if (inv != null) {
for (int slot : getInputSlots()) { for (int slot : getInputSlots()) {
@ -101,85 +84,27 @@ public abstract class AGenerator extends SlimefunItem {
progress.remove(b.getLocation()); progress.remove(b.getLocation());
processing.remove(b.getLocation()); processing.remove(b.getLocation());
return true; return true;
}
}); });
this.registerDefaultRecipes(); this.registerDefaultRecipes();
} }
public AGenerator(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { public AGenerator(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
super(category, item, id, recipeType, recipe, recipeOutput); this(category, item, id, recipeType, recipe);
this.recipeOutput = recipeOutput;
new BlockMenuPreset(id, getInventoryTitle()) {
@Override
public void init() {
constructMenu(this);
}
@Override
public void newInstance(BlockMenu menu, Block b) {
}
@Override
public boolean canOpen(Block b, Player p) {
return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
}
@Override
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots();
else return getOutputSlots();
}
};
registerBlockHandler(id, new SlimefunBlockHandler() {
@Override
public void onPlace(Player p, Block b, SlimefunItem item) {
}
@Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) {
for (int slot : getInputSlots()) {
if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
inv.replaceExistingItem(slot, null);
}
}
for (int slot : getOutputSlots()) {
if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
inv.replaceExistingItem(slot, null);
}
}
}
progress.remove(b.getLocation());
processing.remove(b.getLocation());
return true;
}
});
this.registerDefaultRecipes();
} }
private void constructMenu(BlockMenuPreset preset) { private void constructMenu(BlockMenuPreset preset) {
for (int i : border) { for (int i : border) {
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
for (int i : border_in) { for (int i : border_in) {
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "),(p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
for (int i: border_out) { for (int i: border_out) {
preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
for (int i: getOutputSlots()) { for (int i: getOutputSlots()) {
@ -197,9 +122,7 @@ public abstract class AGenerator extends SlimefunItem {
}); });
} }
preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
public abstract String getInventoryTitle(); public abstract String getInventoryTitle();
@ -228,7 +151,7 @@ public abstract class AGenerator extends SlimefunItem {
} }
@Override @Override
public void register(boolean slimefun) { public void preRegister() {
addItemHandler(new EnergyTicker() { addItemHandler(new EnergyTicker() {
@Override @Override
@ -236,18 +159,7 @@ public abstract class AGenerator extends SlimefunItem {
if (isProcessing(l)) { if (isProcessing(l)) {
int timeleft = progress.get(l); int timeleft = progress.get(l);
if (timeleft > 0) { if (timeleft > 0) {
ItemStack item = getProgressBar().clone(); MachineHelper.updateProgressbar(BlockStorage.getInventory(l), 22, timeleft, processing.get(l).getTicks(), getProgressBar());
ItemMeta im = item.getItemMeta();
((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(l).getTicks()));
im.setDisplayName(" ");
List<String> lore = new ArrayList<String>();
lore.add(MachineHelper.getProgress(timeleft, processing.get(l).getTicks()));
lore.add("");
lore.add(MachineHelper.getTimeLeft(timeleft / 2));
im.setLore(lore);
item.setItemMeta(im);
BlockStorage.getInventory(l).replaceExistingItem(22, item);
if (ChargableBlock.isChargable(l)) { if (ChargableBlock.isChargable(l)) {
if (ChargableBlock.getMaxCharge(l) - ChargableBlock.getCharge(l) >= getEnergyProduction()) { if (ChargableBlock.getMaxCharge(l) - ChargableBlock.getCharge(l) >= getEnergyProduction()) {
@ -267,7 +179,7 @@ public abstract class AGenerator extends SlimefunItem {
if (SlimefunManager.isItemSimiliar(fuel, new ItemStack(Material.LAVA_BUCKET), true) if (SlimefunManager.isItemSimiliar(fuel, new ItemStack(Material.LAVA_BUCKET), true)
|| SlimefunManager.isItemSimiliar(fuel, SlimefunItems.BUCKET_OF_FUEL, true) || SlimefunManager.isItemSimiliar(fuel, SlimefunItems.BUCKET_OF_FUEL, true)
|| SlimefunManager.isItemSimiliar(fuel, SlimefunItems.BUCKET_OF_OIL, true)) { || SlimefunManager.isItemSimiliar(fuel, SlimefunItems.BUCKET_OF_OIL, true)) {
pushItems(l, new ItemStack[] {new ItemStack(Material.BUCKET)}); pushItems(l, new ItemStack(Material.BUCKET));
} }
BlockStorage.getInventory(l).replaceExistingItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " ")); BlockStorage.getInventory(l).replaceExistingItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "));
@ -277,25 +189,17 @@ public abstract class AGenerator extends SlimefunItem {
} }
} }
else { else {
MachineFuel r = null; BlockMenu menu = BlockStorage.getInventory(l);
Map<Integer, Integer> found = new HashMap<Integer, Integer>(); Map<Integer, Integer> found = new HashMap<>();
outer: MachineFuel fuel = findRecipe(menu, found);
for (MachineFuel recipe: recipes) {
for (int slot: getInputSlots()) { if (fuel != null) {
if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(l).getItemInSlot(slot), recipe.getInput(), true)) { for (Map.Entry<Integer, Integer> entry: found.entrySet()) {
found.put(slot, recipe.getInput().getAmount()); menu.replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(menu.getItemInSlot(entry.getKey()), entry.getValue()));
r = recipe;
break outer;
}
}
} }
if (r != null) { processing.put(l, fuel);
for (Map.Entry<Integer, Integer> entry: found.entrySet()) { progress.put(l, fuel.getTicks());
BlockStorage.getInventory(l).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(l).getItemInSlot(entry.getKey()), entry.getValue()));
}
processing.put(l, r);
progress.put(l, r.getTicks());
} }
return 0; return 0;
} }
@ -306,8 +210,19 @@ public abstract class AGenerator extends SlimefunItem {
return false; return false;
} }
}); });
}
super.register(slimefun); private MachineFuel findRecipe(BlockMenu menu, Map<Integer, Integer> found) {
for (MachineFuel recipe: recipes) {
for (int slot: getInputSlots()) {
if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), recipe.getInput(), true)) {
found.put(slot, recipe.getInput().getAmount());
return recipe;
}
}
}
return null;
} }
public Set<MachineFuel> getFuelTypes() { public Set<MachineFuel> getFuelTypes() {
@ -326,7 +241,7 @@ public abstract class AGenerator extends SlimefunItem {
return inv; return inv;
} }
protected void pushItems(Location l, ItemStack[] items) { protected void pushItems(Location l, ItemStack... items) {
Inventory inv = inject(l); Inventory inv = inject(l);
inv.addItem(items); inv.addItem(items);

View File

@ -1,12 +1,12 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.logging.Level;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@ -16,23 +16,21 @@ import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib; import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull;
import me.mrCookieSlime.Slimefun.SlimefunStartup; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ReactorAccessPort; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ReactorAccessPort;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
import me.mrCookieSlime.Slimefun.api.energy.EnergyTicker; import me.mrCookieSlime.Slimefun.api.energy.EnergyTicker;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
@ -63,7 +61,9 @@ public abstract class AReactor extends SlimefunItem {
private static final int[] border_1 = {9, 10, 11, 18, 20, 27, 29, 36, 38, 45, 46, 47}; private static final int[] border_1 = {9, 10, 11, 18, 20, 27, 29, 36, 38, 45, 46, 47};
private static final int[] border_2 = {15, 16, 17, 24, 26, 33, 35, 42, 44, 51, 52, 53}; private static final int[] border_2 = {15, 16, 17, 24, 26, 33, 35, 42, 44, 51, 52, 53};
private static final int[] border_3 = {30, 31, 32, 39, 41, 48, 50}; private static final int[] border_3 = {30, 31, 32, 39, 41, 48, 50};
private static final int[] border_4 = {25, 34, 43}; // No coolant border
// No coolant border
private static final int[] border_4 = {25, 34, 43};
private static final int infoSlot = 49; private static final int infoSlot = 49;
public AReactor(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { public AReactor(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
@ -82,6 +82,7 @@ public abstract class AReactor extends SlimefunItem {
if (BlockStorage.getLocationInfo(b.getLocation(), "reactor-mode") == null){ if (BlockStorage.getLocationInfo(b.getLocation(), "reactor-mode") == null){
BlockStorage.addBlockInfo(b, "reactor-mode", "generator"); BlockStorage.addBlockInfo(b, "reactor-mode", "generator");
} }
if (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "reactor-mode").equals("generator")) { if (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "reactor-mode").equals("generator")) {
menu.replaceExistingItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&7Focus: &eElectricity", "", "&6Your Reactor will focus on Power Generation", "&6If your Energy Network doesn't need Power", "&6it will not produce any either", "", "&7> Click to change the Focus to &eProduction")); menu.replaceExistingItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTM0M2NlNThkYTU0Yzc5OTI0YTJjOTMzMWNmYzQxN2ZlOGNjYmJlYTliZTQ1YTdhYzg1ODYwYTZjNzMwIn19fQ=="), "&7Focus: &eElectricity", "", "&6Your Reactor will focus on Power Generation", "&6If your Energy Network doesn't need Power", "&6it will not produce any either", "", "&7> Click to change the Focus to &eProduction"));
menu.addMenuClickHandler(4, (p, slot, item, action) -> { menu.addMenuClickHandler(4, (p, slot, item, action) -> {
@ -98,16 +99,18 @@ public abstract class AReactor extends SlimefunItem {
return false; return false;
}); });
} }
BlockMenu ap = getAccessPort(b.getLocation());
if(ap != null) { BlockMenu port = getAccessPort(b.getLocation());
if (port != null) {
menu.replaceExistingItem(infoSlot, new CustomItem(new ItemStack(Material.GREEN_WOOL), "&7Access Port", "", "&6Detected", "", "&7> Click to view Access Port")); menu.replaceExistingItem(infoSlot, new CustomItem(new ItemStack(Material.GREEN_WOOL), "&7Access Port", "", "&6Detected", "", "&7> Click to view Access Port"));
menu.addMenuClickHandler(infoSlot, (p, slot, item, action) -> { menu.addMenuClickHandler(infoSlot, (p, slot, item, action) -> {
ap.open(p); port.open(p);
newInstance(menu, b); newInstance(menu, b);
return false; return false;
}); });
} else { }
else {
menu.replaceExistingItem(infoSlot, new CustomItem(new ItemStack(Material.RED_WOOL), "&7Access Port", "", "&cNot detected", "", "&7Access Port must be", "&7placed 3 blocks above", "&7a reactor!")); menu.replaceExistingItem(infoSlot, new CustomItem(new ItemStack(Material.RED_WOOL), "&7Access Port", "", "&cNot detected", "", "&7Access Port must be", "&7placed 3 blocks above", "&7a reactor!"));
menu.addMenuClickHandler(infoSlot, (p, slot, item, action) -> { menu.addMenuClickHandler(infoSlot, (p, slot, item, action) -> {
newInstance(menu, b); newInstance(menu, b);
@ -117,6 +120,7 @@ public abstract class AReactor extends SlimefunItem {
} }
} catch(Exception x) { } catch(Exception x) {
Slimefun.getLogger().log(Level.SEVERE, "An Error occured when creating a Reactor Menu for Slimefun " + Slimefun.getVersion(), x);
} }
} }
@ -132,14 +136,7 @@ public abstract class AReactor extends SlimefunItem {
} }
}; };
registerBlockHandler(id, new SlimefunBlockHandler() { registerBlockHandler(id, (p, b, tool, reason) -> {
@Override
public void onPlace(Player p, Block b, SlimefunItem item) {
}
@Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b); BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) { if (inv != null) {
for (int slot : getFuelSlots()) { for (int slot : getFuelSlots()) {
@ -148,12 +145,14 @@ public abstract class AReactor extends SlimefunItem {
inv.replaceExistingItem(slot, null); inv.replaceExistingItem(slot, null);
} }
} }
for (int slot : getCoolantSlots()) { for (int slot : getCoolantSlots()) {
if (inv.getItemInSlot(slot) != null) { if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
inv.replaceExistingItem(slot, null); inv.replaceExistingItem(slot, null);
} }
} }
for (int slot : getOutputSlots()) { for (int slot : getOutputSlots()) {
if (inv.getItemInSlot(slot) != null) { if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot)); b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
@ -161,11 +160,11 @@ public abstract class AReactor extends SlimefunItem {
} }
} }
} }
progress.remove(b.getLocation()); progress.remove(b.getLocation());
processing.remove(b.getLocation()); processing.remove(b.getLocation());
ReactorHologram.remove(b.getLocation()); ReactorHologram.remove(b.getLocation());
return true; return true;
}
}); });
this.registerDefaultRecipes(); this.registerDefaultRecipes();
@ -173,35 +172,23 @@ public abstract class AReactor extends SlimefunItem {
private void constructMenu(BlockMenuPreset preset) { private void constructMenu(BlockMenuPreset preset) {
for (int i : border) { for (int i : border) {
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
for (int i : border_1) { for (int i : border_1) {
preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
for (int i : border_3) { for (int i : border_3) {
preset.addItem(i, new CustomItem(new ItemStack(Material.GREEN_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.GREEN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
preset.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"), preset.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
for (int i : border_2) { for (int i : border_2) {
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
if (needsCooling()) { if (needsCooling()) {
@ -211,9 +198,7 @@ public abstract class AReactor extends SlimefunItem {
preset.addItem(7, new CustomItem(new ItemStack(Material.BARRIER), "&bCoolant Slot", "", "&rThis Slot accepts Coolant Cells")); preset.addItem(7, new CustomItem(new ItemStack(Material.BARRIER), "&bCoolant Slot", "", "&rThis Slot accepts Coolant Cells"));
for (int i : border_4) { for (int i : border_4) {
preset.addItem(i, new CustomItem(new ItemStack(Material.BARRIER), "&cNo Coolant Required"), preset.addItem(i, new CustomItem(new ItemStack(Material.BARRIER), "&cNo Coolant Required"), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
} }
} }
@ -261,10 +246,10 @@ public abstract class AReactor extends SlimefunItem {
} }
@Override @Override
public void register(boolean slimefun) { public void preRegister() {
addItemHandler(new EnergyTicker() { addItemHandler(new EnergyTicker() {
Set<Location> explode = new HashSet<Location>(); private Set<Location> explode = new HashSet<>();
@Override @Override
public double generateEnergy(final Location l, SlimefunItem sf, Config data) { public double generateEnergy(final Location l, SlimefunItem sf, Config data) {
@ -283,22 +268,11 @@ public abstract class AReactor extends SlimefunItem {
if (space >= produced || !BlockStorage.getLocationInfo(l, "reactor-mode").equals("generator")) { if (space >= produced || !BlockStorage.getLocationInfo(l, "reactor-mode").equals("generator")) {
progress.put(l, timeleft - 1); progress.put(l, timeleft - 1);
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
if (!l.getBlock().getRelative(cooling[CSCoreLib.randomizer().nextInt(cooling.length)]).isLiquid()) explode.add(l); if (!l.getBlock().getRelative(cooling[new Random().nextInt(cooling.length)]).isLiquid()) explode.add(l);
}); });
ItemStack item = getProgressBar().clone(); MachineHelper.updateProgressbar(BlockStorage.getInventory(l), 22, timeleft, processing.get(l).getTicks(), getProgressBar());
ItemMeta im = item.getItemMeta();
im.setDisplayName(" ");
List<String> lore = new ArrayList<String>();
lore.add(MachineHelper.getProgress(timeleft, processing.get(l).getTicks()));
lore.add(MachineHelper.getCoolant(timeleft, processing.get(l).getTicks()));
lore.add("");
lore.add(MachineHelper.getTimeLeft(timeleft / 2));
im.setLore(lore);
item.setItemMeta(im);
BlockStorage.getInventory(l).replaceExistingItem(22, item);
if (needsCooling()) { if (needsCooling()) {
boolean coolant = (processing.get(l).getTicks() - timeleft) % 25 == 0; boolean coolant = (processing.get(l).getTicks() - timeleft) % 25 == 0;
@ -352,40 +326,19 @@ public abstract class AReactor extends SlimefunItem {
} }
} }
else { else {
MachineFuel r = null; BlockMenu menu = BlockStorage.getInventory(l);
Map<Integer, Integer> found = new HashMap<Integer, Integer>(); Map<Integer, Integer> found = new HashMap<>();
MachineFuel fuel = findRecipe(menu, found);
if (port != null) { if (port != null) restockCoolant(l, port);
refill:
for (int slot: getFuelSlots()) {
for (MachineFuel recipe: recipes) {
if (SlimefunManager.isItemSimiliar(port.getItemInSlot(slot), recipe.getInput(), true)) {
if (pushItems(l, new CustomItem(port.getItemInSlot(slot), 1), getFuelSlots()) == null) {
port.replaceExistingItem(slot, InvUtils.decreaseItem(port.getItemInSlot(slot), 1));
break refill;
}
}
}
}
}
outer: if (fuel != null) {
for (MachineFuel recipe: recipes) {
for (int slot: getFuelSlots()) {
if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(l).getItemInSlot(slot), recipe.getInput(), true)) {
found.put(slot, recipe.getInput().getAmount());
r = recipe;
break outer;
}
}
}
if (r != null) {
for (Map.Entry<Integer, Integer> entry: found.entrySet()) { for (Map.Entry<Integer, Integer> entry: found.entrySet()) {
BlockStorage.getInventory(l).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(l).getItemInSlot(entry.getKey()), entry.getValue())); menu.replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(menu.getItemInSlot(entry.getKey()), entry.getValue()));
} }
processing.put(l, r);
progress.put(l, r.getTicks()); processing.put(l, fuel);
progress.put(l, fuel.getTicks());
} }
return 0; return 0;
} }
@ -397,9 +350,7 @@ public abstract class AReactor extends SlimefunItem {
if (explosion) { if (explosion) {
BlockStorage.getInventory(l).close(); BlockStorage.getInventory(l).close();
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> { Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> ReactorHologram.remove(l), 0);
ReactorHologram.remove(l);
}, 0);
explode.remove(l); explode.remove(l);
processing.remove(l); processing.remove(l);
@ -408,8 +359,30 @@ public abstract class AReactor extends SlimefunItem {
return explosion; return explosion;
} }
}); });
}
super.register(slimefun); private void restockCoolant(Location l, BlockMenu port) {
for (int slot: getFuelSlots()) {
for (MachineFuel recipe: recipes) {
if (SlimefunManager.isItemSimiliar(port.getItemInSlot(slot), recipe.getInput(), true) && pushItems(l, new CustomItem(port.getItemInSlot(slot), 1), getFuelSlots()) == null) {
port.replaceExistingItem(slot, InvUtils.decreaseItem(port.getItemInSlot(slot), 1));
return;
}
}
}
}
private MachineFuel findRecipe(BlockMenu menu, Map<Integer, Integer> found) {
for (MachineFuel recipe: recipes) {
for (int slot: getInputSlots()) {
if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), recipe.getInput(), true)) {
found.put(slot, recipe.getInput().getAmount());
return recipe;
}
}
}
return null;
} }
private Inventory inject(Location l) { private Inventory inject(Location l) {

View File

@ -4,9 +4,9 @@ import org.bukkit.inventory.ItemStack;
public class MachineFuel { public class MachineFuel {
int seconds; private int seconds;
ItemStack fuel; private ItemStack fuel;
ItemStack output; private ItemStack output;
public MachineFuel(int seconds, ItemStack fuel) { public MachineFuel(int seconds, ItemStack fuel) {
this.seconds = seconds * 2; this.seconds = seconds * 2;

View File

@ -1,25 +1,33 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
public class MachineHelper { import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
public static String getTimeLeft(int l) { public final class MachineHelper {
private MachineHelper() {}
public static String getTimeLeft(int seconds) {
String timeleft = ""; String timeleft = "";
final int minutes = (int) (l / 60L); final int minutes = (int) (seconds / 60L);
if (minutes > 0) { if (minutes > 0) {
timeleft = String.valueOf(timeleft) + minutes + "m "; timeleft = String.valueOf(timeleft) + minutes + "m ";
} }
l -= minutes * 60; seconds -= minutes * 60;
final int seconds = (int)l;
timeleft = String.valueOf(timeleft) + seconds + "s"; timeleft = String.valueOf(timeleft) + seconds + "s";
return ChatColor.translateAlternateColorCodes('&', "&7" + timeleft + " left"); return ChatColor.translateAlternateColorCodes('&', "&7" + timeleft + " left");
} }
public static String getProgress(int time, int total) { public static String getProgress(int time, int total) {
StringBuilder progress = new StringBuilder(); StringBuilder progress = new StringBuilder();
float percentage = Math.round(((((total - time) * 100.0f) / total) * 100.0f) / 100.0f); float percentage = Math.round(((((total - time) * 100.0F) / total) * 100.0F) / 100.0F);
if (percentage < 16.0F) progress.append("&4"); if (percentage < 16.0F) progress.append("&4");
else if (percentage < 32.0F) progress.append("&c"); else if (percentage < 32.0F) progress.append("&c");
@ -47,7 +55,7 @@ public class MachineHelper {
public static String getCoolant(int time, int total) { public static String getCoolant(int time, int total) {
int passed = ((total - time) % 25); int passed = ((total - time) % 25);
StringBuilder progress = new StringBuilder(); StringBuilder progress = new StringBuilder();
float percentage = Math.round(((((25 - passed) * 100.0f) / 25) * 100.0f) / 100.0f); float percentage = Math.round(((((25 - passed) * 100.0F) / 25) * 100.0F) / 100.0F);
if (percentage < 33.0F) progress.append("&9"); if (percentage < 33.0F) progress.append("&9");
else if (percentage < 66.0F) progress.append("&1"); else if (percentage < 66.0F) progress.append("&1");
@ -71,11 +79,26 @@ public class MachineHelper {
public static float getPercentage(int time, int total) { public static float getPercentage(int time, int total) {
int passed = ((total - time) % 25); int passed = ((total - time) % 25);
return Math.round(((((25 - passed) * 100.0f) / 25) * 100.0f) / 100.0f); return Math.round(((((25 - passed) * 100.0F) / 25) * 100.0F) / 100.0F);
} }
public static short getDurability(ItemStack item, int timeleft, int max) { public static short getDurability(ItemStack item, int timeleft, int max) {
return (short) ((item.getType().getMaxDurability() / max) * timeleft); return (short) ((item.getType().getMaxDurability() / max) * timeleft);
} }
public static void updateProgressbar(BlockMenu menu, int slot, int timeleft, int time, ItemStack indicator) {
ItemStack item = indicator.clone();
ItemMeta im = item.getItemMeta();
((Damageable) im).setDamage(getDurability(item, timeleft, time));
im.setDisplayName(" ");
List<String> lore = new ArrayList<>();
lore.add(getProgress(timeleft, time));
lore.add("");
lore.add(getTimeLeft(timeleft / 2));
im.setLore(lore);
item.setItemMeta(im);
menu.replaceExistingItem(slot, item);
}
} }

View File

@ -4,9 +4,9 @@ import org.bukkit.inventory.ItemStack;
public class MachineRecipe { public class MachineRecipe {
int ticks; private int ticks;
ItemStack[] input; private ItemStack[] input;
ItemStack[] output; private ItemStack[] output;
public MachineRecipe(int seconds, ItemStack[] input, ItemStack[] output) { public MachineRecipe(int seconds, ItemStack[] input, ItemStack[] output) {
this.ticks = seconds * 2; this.ticks = seconds * 2;

View File

@ -30,6 +30,6 @@ public abstract class Teleporter extends SlimefunItem {
}); });
} }
public abstract void onInteract(Player p, Block b) throws Exception; public abstract void onInteract(Player p, Block b);
} }

View File

@ -1,4 +1,6 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo;
import java.util.logging.Level;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -19,6 +21,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet;
@ -105,7 +108,7 @@ public class AdvancedCargoOutputNode extends SlimefunItem {
menu.addMenuClickHandler(41, (p, slot, item, action) -> { menu.addMenuClickHandler(41, (p, slot, item, action) -> {
int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1;
if (channel < 0) { if (channel < 0) {
if (CargoNet.EXTRA_CHANNELS) channel = 16; if (CargoNet.extraChannels) channel = 16;
else channel = 15; else channel = 15;
} }
BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel));
@ -132,7 +135,7 @@ public class AdvancedCargoOutputNode extends SlimefunItem {
menu.addMenuClickHandler(43, (p, slot, item, action) -> { menu.addMenuClickHandler(43, (p, slot, item, action) -> {
int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1;
if (CargoNet.EXTRA_CHANNELS) { if (CargoNet.extraChannels) {
if (channeln > 16) channeln = 0; if (channeln > 16) channeln = 0;
} }
else { else {
@ -144,8 +147,8 @@ public class AdvancedCargoOutputNode extends SlimefunItem {
return false; return false;
}); });
} catch (Exception e) { } catch (Exception x) {
e.printStackTrace(); Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the Inventory of an Advanced Cargo Output Node for Slimefun " + Slimefun.getVersion(), x);
} }
} }

View File

@ -1,6 +1,9 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo;
import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper; import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper;
import java.util.logging.Level;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -19,6 +22,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet;
@ -63,6 +67,7 @@ public class CargoInputNode extends SlimefunItem {
Damageable dmg = (Damageable) is.getItemMeta(); Damageable dmg = (Damageable) is.getItemMeta();
dmg.setDamage(20); dmg.setDamage(20);
is.setItemMeta((ItemMeta) dmg); is.setItemMeta((ItemMeta) dmg);
menu.replaceExistingItem(16, new CustomItem(is, "&7Include Sub-IDs/Durability: &4\u2718", "", "&e> Click to toggle whether the Durability has to match")); menu.replaceExistingItem(16, new CustomItem(is, "&7Include Sub-IDs/Durability: &4\u2718", "", "&e> Click to toggle whether the Durability has to match"));
menu.addMenuClickHandler(16, (p, slot, item, action) -> { menu.addMenuClickHandler(16, (p, slot, item, action) -> {
BlockStorage.addBlockInfo(b, "filter-durability", "true"); BlockStorage.addBlockInfo(b, "filter-durability", "true");
@ -75,6 +80,7 @@ public class CargoInputNode extends SlimefunItem {
Damageable dmg = (Damageable) is.getItemMeta(); Damageable dmg = (Damageable) is.getItemMeta();
dmg.setDamage(20); dmg.setDamage(20);
is.setItemMeta((ItemMeta) dmg); is.setItemMeta((ItemMeta) dmg);
menu.replaceExistingItem(16, new CustomItem(is, "&7Include Sub-IDs/Durability: &2\u2714", "", "&e> Click to toggle whether the Durability has to match")); menu.replaceExistingItem(16, new CustomItem(is, "&7Include Sub-IDs/Durability: &2\u2714", "", "&e> Click to toggle whether the Durability has to match"));
menu.addMenuClickHandler(16, (p, slot, item, action) -> { menu.addMenuClickHandler(16, (p, slot, item, action) -> {
BlockStorage.addBlockInfo(b, "filter-durability", "false"); BlockStorage.addBlockInfo(b, "filter-durability", "false");
@ -121,7 +127,7 @@ public class CargoInputNode extends SlimefunItem {
menu.addMenuClickHandler(41, (p, slot, item, action) -> { menu.addMenuClickHandler(41, (p, slot, item, action) -> {
int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1;
if (channel < 0) { if (channel < 0) {
if (CargoNet.EXTRA_CHANNELS) channel = 16; if (CargoNet.extraChannels) channel = 16;
else channel = 15; else channel = 15;
} }
BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel));
@ -148,7 +154,7 @@ public class CargoInputNode extends SlimefunItem {
menu.addMenuClickHandler(43, (p, slot, item, action) -> { menu.addMenuClickHandler(43, (p, slot, item, action) -> {
int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1;
if (CargoNet.EXTRA_CHANNELS) { if (CargoNet.extraChannels) {
if (channeln > 16) channeln = 0; if (channeln > 16) channeln = 0;
} }
else { else {
@ -160,8 +166,8 @@ public class CargoInputNode extends SlimefunItem {
return false; return false;
}); });
} catch (Exception e) { } catch (Exception x) {
e.printStackTrace(); Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a Cargo Input Node for Slimefun " + Slimefun.getVersion(), x);
} }
} }
@ -196,6 +202,7 @@ public class CargoInputNode extends SlimefunItem {
@Override @Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) { public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b); BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) { if (inv != null) {
for (int slot : getInputSlots()) { for (int slot : getInputSlots()) {
if (inv.getItemInSlot(slot) != null) { if (inv.getItemInSlot(slot) != null) {
@ -211,14 +218,10 @@ public class CargoInputNode extends SlimefunItem {
protected void constructMenu(BlockMenuPreset preset) { protected void constructMenu(BlockMenuPreset preset) {
for (int i : border) { for (int i : border) {
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
preset.addItem(2, new CustomItem(new ItemStack(Material.PAPER), "&3Items", "", "&bPut in all Items you want to", "&bblacklist/whitelist"), preset.addItem(2, new CustomItem(new ItemStack(Material.PAPER), "&3Items", "", "&bPut in all Items you want to", "&bblacklist/whitelist"), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
public int[] getInputSlots() { public int[] getInputSlots() {

View File

@ -0,0 +1,66 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo;
import org.bukkit.ChatColor;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet;
import me.mrCookieSlime.Slimefun.holograms.CargoHologram;
public class CargoManagerBlock extends SlimefunItem {
public CargoManagerBlock(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
SlimefunItem.registerBlockHandler("CARGO_MANAGER", (p, b, tool, reason) -> {
CargoHologram.remove(b);
return true;
});
}
@Override
public void preRegister() {
addItemHandler(new BlockTicker() {
@Override
public void tick(Block b, SlimefunItem item, Config data) {
CargoNet.getNetworkFromLocationOrCreate(b.getLocation()).tick(b);
}
@Override
public boolean isSynchronized() {
return false;
}
}, new ItemInteractionHandler() {
@Override
public boolean onRightClick(ItemUseEvent e, Player p, ItemStack stack) {
if (e.getClickedBlock() == null) return false;
String item = BlockStorage.checkID(e.getClickedBlock());
if (item == null || !item.equals(getID())) return false;
e.setCancelled(true);
if (BlockStorage.getLocationInfo(e.getClickedBlock().getLocation(), "visualizer") == null) {
BlockStorage.addBlockInfo(e.getClickedBlock(), "visualizer", "disabled");
p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCargo Net Visualizer: " + "&4\u2718"));
}
else {
BlockStorage.addBlockInfo(e.getClickedBlock(), "visualizer", null);
p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCargo Net Visualizer: " + "&2\u2714"));
}
return true;
}
});
}
}

View File

@ -1,4 +1,6 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.cargo;
import java.util.logging.Level;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -17,6 +19,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet; import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet;
@ -40,12 +43,11 @@ public class CargoOutputNode extends SlimefunItem {
@Override @Override
public void newInstance(final BlockMenu menu, final Block b) { public void newInstance(final BlockMenu menu, final Block b) {
try { try {
menu.replaceExistingItem(12, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjI1OTliZDk4NjY1OWI4Y2UyYzQ5ODg1MjVjOTRlMTlkZGQzOWZhZDA4YTM4Mjg0YTE5N2YxYjcwNjc1YWNjIn19fQ=="), "&bChannel", "", "&e> Click to decrease the Channel ID by 1")); menu.replaceExistingItem(12, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjI1OTliZDk4NjY1OWI4Y2UyYzQ5ODg1MjVjOTRlMTlkZGQzOWZhZDA4YTM4Mjg0YTE5N2YxYjcwNjc1YWNjIn19fQ=="), "&bChannel", "", "&e> Click to decrease the Channel ID by 1"));
menu.addMenuClickHandler(12, (p, slot, item, action) -> { menu.addMenuClickHandler(12, (p, slot, item, action) -> {
int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1; int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1;
if (channel < 0) { if (channel < 0) {
if (CargoNet.EXTRA_CHANNELS) channel = 16; if (CargoNet.extraChannels) channel = 16;
else channel = 15; else channel = 15;
} }
BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel)); BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel));
@ -72,7 +74,7 @@ public class CargoOutputNode extends SlimefunItem {
menu.addMenuClickHandler(14, (p, slot, item, action) -> { menu.addMenuClickHandler(14, (p, slot, item, action) -> {
int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1; int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1;
if (CargoNet.EXTRA_CHANNELS) { if (CargoNet.extraChannels) {
if (channeln > 16) channeln = 0; if (channeln > 16) channeln = 0;
} }
else { else {
@ -84,8 +86,8 @@ public class CargoOutputNode extends SlimefunItem {
return false; return false;
}); });
} catch (Exception e) { } catch (Exception x) {
e.printStackTrace(); Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating a Cargo Output Node for Slimefun " + Slimefun.getVersion(), x);
} }
} }
@ -121,9 +123,7 @@ public class CargoOutputNode extends SlimefunItem {
protected void constructMenu(BlockMenuPreset preset) { protected void constructMenu(BlockMenuPreset preset) {
for (int i : border) { for (int i : border) {
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
(p, slot, item, action) -> false
);
} }
} }

View File

@ -1,18 +0,0 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import org.bukkit.block.Block;
import org.bukkit.block.Dispenser;
import org.bukkit.event.block.BlockDispenseEvent;
public abstract class AutonomousMachineHandler extends ItemHandler {
@Override
public String toCodename() {
return "AutonomousMachineHandler";
}
public abstract boolean onBlockDispense(BlockDispenseEvent e, Block dispenser, Dispenser d, Block block, Block chest, SlimefunItem machine);
}

View File

@ -1,16 +0,0 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
import org.bukkit.block.Block;
import org.bukkit.block.Dispenser;
import org.bukkit.event.block.BlockDispenseEvent;
public abstract class AutonomousToolHandler extends ItemHandler {
@Override
public String toCodename() {
return "AutonomousToolHandler";
}
public abstract boolean onBlockDispense(BlockDispenseEvent e, Block dispenser, Dispenser d, Block block, Block chest, int i);
}

View File

@ -1,16 +1,6 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
import java.util.List; @Deprecated
public abstract class BlockBreakHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler {
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.inventory.ItemStack;
public abstract class BlockBreakHandler extends ItemHandler {
public abstract boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List<ItemStack> drops);
@Override
public String toCodename() {
return "BlockBreakHandler";
}
} }

View File

@ -1,14 +1,5 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
import org.bukkit.event.block.BlockPlaceEvent; @Deprecated
import org.bukkit.inventory.ItemStack; public abstract class BlockPlaceHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.BlockPlaceHandler {
public abstract class BlockPlaceHandler extends ItemHandler {
public abstract boolean onBlockPlace(BlockPlaceEvent e, ItemStack item);
@Override
public String toCodename() {
return "BlockPlaceHandler";
}
} }

View File

@ -1,29 +1,5 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; @Deprecated
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; public abstract class BlockTicker extends me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker {
import org.bukkit.block.Block;
public abstract class BlockTicker extends ItemHandler {
public boolean unique = true;
public void update() {
if (unique) {
uniqueTick();
unique = false;
}
}
public abstract boolean isSynchronized();
public abstract void uniqueTick();
public abstract void tick(Block b, SlimefunItem item, Config data);
@Override
public String toCodename() {
return "BlockTicker";
}
} }

View File

@ -1,14 +0,0 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
public abstract class BowShootHandler extends ItemHandler {
public abstract boolean onHit(EntityDamageByEntityEvent e, LivingEntity n);
@Override
public String toCodename() {
return "BowShootHandler";
}
}

View File

@ -1,6 +1,6 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
public abstract class ItemHandler { @Deprecated
public abstract class ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler {
public abstract String toCodename();
} }

View File

@ -1,17 +1,5 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent; @Deprecated
public abstract class ItemInteractionHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler {
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public abstract class ItemInteractionHandler extends ItemHandler {
public abstract boolean onRightClick(ItemUseEvent e, Player p, ItemStack item);
@Override
public String toCodename() {
return "ItemInteractionHandler";
}
} }

View File

@ -1,16 +1,5 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
import me.mrCookieSlime.Slimefun.Objects.MultiBlock; @Deprecated
public abstract class MultiBlockInteractionHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.MultiBlockInteractionHandler {
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
public abstract class MultiBlockInteractionHandler extends ItemHandler {
public abstract boolean onInteract(Player p, MultiBlock mb, Block b);
@Override
public String toCodename() {
return "MultiBlockInteractionHandler";
}
} }

View File

@ -0,0 +1,34 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
@FunctionalInterface
public interface DamageableItem {
boolean isDamageable();
default void damageItem(Player p, ItemStack item) {
if (item != null && item.getType() != null && item.getType() != Material.AIR && item.getAmount() > 0 && isDamageable()) {
if (item.getEnchantments().containsKey(Enchantment.DURABILITY) && Math.random() * 100 <= (60 + Math.floorDiv(40, (item.getEnchantmentLevel(Enchantment.DURABILITY) + 1)))) {
return;
}
ItemMeta meta = item.getItemMeta();
Damageable damageable = (Damageable) meta;
if (damageable.getDamage() >= item.getType().getMaxDurability()) {
item.setAmount(0);
}
else {
damageable.setDamage(damageable.getDamage() + 1);
item.setItemMeta(meta);
}
}
}
}

View File

@ -0,0 +1,77 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces;
import java.util.function.Consumer;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.Math.Calculator;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
public interface InventoryBlock {
int[] getInputSlots();
int[] getOutputSlots();
default void createPreset(SlimefunItem item, String title, Consumer<BlockMenuPreset> setup) {
new BlockMenuPreset(item.getID(), title) {
@Override
public void init() {
setup.accept(this);
}
@Override
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
if (flow == ItemTransportFlow.INSERT) return getInputSlots();
else return getOutputSlots();
}
@Override
public boolean canOpen(Block b, Player p) {
return p.hasPermission("slimefun.inventory.bypass") || (SlimefunPlugin.getProtectionManager().hasPermission(p, b.getLocation(), Action.ACCESS_INVENTORIES) && Slimefun.hasUnlocked(p, item, false));
}
};
}
default Inventory inject(Block b) {
int size = getOutputSlots().length;
Inventory inv = Bukkit.createInventory(null, Calculator.formToLine(size) * 9);
for (int i = 0; i < inv.getSize(); i++) {
if (i < size) {
inv.setItem(i, BlockStorage.getInventory(b).getItemInSlot(getOutputSlots()[i]));
}
else {
inv.setItem(i, new CustomItem(Material.COMMAND_BLOCK, " &4ALL YOUR PLACEHOLDERS ARE BELONG TO US"));
}
}
return inv;
}
default boolean fits(Block b, ItemStack... items) {
return inject(b).addItem(items).isEmpty();
}
default void pushItems(Block b, ItemStack... items) {
Inventory inv = inject(b);
inv.addItem(items);
for (int i = 0; i < getOutputSlots().length; i++) {
BlockStorage.getInventory(b).replaceExistingItem(getOutputSlots()[i], inv.getItem(i));
}
}
}

View File

@ -0,0 +1,5 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces;
public interface NotPlaceable {
}

View File

@ -0,0 +1,12 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces;
import java.util.List;
import org.bukkit.inventory.ItemStack;
@FunctionalInterface
public interface RecipeDisplayItem {
List<ItemStack> getDisplayRecipes();
}

View File

@ -0,0 +1,36 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.ChatColor;
import org.bukkit.Sound;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffectType;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemConsumptionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class DietCookie extends SimpleSlimefunItem<ItemConsumptionHandler> {
public DietCookie(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public ItemConsumptionHandler getItemHandler() {
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true)) {
p.sendMessage(ChatColor.YELLOW + "You feel so light...");
p.playSound(p.getLocation(), Sound.ENTITY_GENERIC_EAT, 1, 1);
if (p.hasPotionEffect(PotionEffectType.LEVITATION)) p.removePotionEffect(PotionEffectType.LEVITATION);
p.addPotionEffect(PotionEffectType.LEVITATION.createEffect(60, 1));
return true;
}
return false;
};
}
}

View File

@ -0,0 +1,105 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.List;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.HandledBlock;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.DamageableItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class ExplosivePickaxe extends SimpleSlimefunItem<BlockBreakHandler> implements NotPlaceable, DamageableItem {
private String[] blacklist;
private boolean damageOnUse;
public ExplosivePickaxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values);
}
@Override
public BlockBreakHandler getItemHandler() {
return (e, item, fortune, drops) -> {
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.EXPLOSIVE_PICKAXE, true)) {
e.setCancelled(true);
e.getBlock().getWorld().createExplosion(e.getBlock().getLocation(), 0.0F);
e.getBlock().getWorld().playSound(e.getBlock().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.3F, 1F);
for (int x = -1; x <= 1; x++) {
for (int y = -1; y <= 1; y++) {
for (int z = -1; z <= 1; z++) {
Block b = e.getBlock().getRelative(x, y, z);
if (b.getType() != Material.AIR && !b.isLiquid() && !StringUtils.equals(b.getType().toString(), blacklist) && SlimefunPlugin.getProtectionManager().hasPermission(e.getPlayer(), b.getLocation(), Action.BREAK_BLOCK)) {
if (SlimefunPlugin.getHooks().isCoreProtectInstalled()) {
SlimefunPlugin.getHooks().getCoreProtectAPI().logRemoval(e.getPlayer().getName(), b.getLocation(), b.getType(), b.getBlockData());
}
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
SlimefunItem sfItem = BlockStorage.check(b);
boolean allow = false;
if (sfItem != null && !(sfItem instanceof HandledBlock)) {
if (SlimefunPlugin.getUtilities().blockHandlers.containsKey(sfItem.getID())) {
allow = SlimefunPlugin.getUtilities().blockHandlers.get(sfItem.getID()).onBreak(e.getPlayer(), e.getBlock(), sfItem, UnregisterReason.PLAYER_BREAK);
}
if (allow) {
drops.add(BlockStorage.retrieve(e.getBlock()));
}
}
else if (b.getType() == Material.PLAYER_HEAD) {
b.breakNaturally();
}
else if (b.getType().name().endsWith("_SHULKER_BOX")) {
b.breakNaturally();
}
else {
for (ItemStack drop: b.getDrops()) {
b.getWorld().dropItemNaturally(b.getLocation(), (b.getType().toString().endsWith("_ORE") && b.getType() != Material.IRON_ORE && b.getType() != Material.GOLD_ORE) ? new CustomItem(drop, fortune): drop);
}
b.setType(Material.AIR);
}
damageItem(e.getPlayer(), item);
}
}
}
}
return true;
}
else return false;
};
}
@Override
public void postRegister() {
damageOnUse = ((boolean) Slimefun.getItemValue(getID(), "damage-on-use"));
List<?> list = (List<?>) Slimefun.getItemValue(getID(), "unbreakable-blocks");
blacklist = list.toArray(new String[list.size()]);
}
@Override
public boolean isDamageable() {
return damageOnUse;
}
}

View File

@ -0,0 +1,84 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.materials.MaterialTools;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.DamageableItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class ExplosiveShovel extends SimpleSlimefunItem<BlockBreakHandler> implements NotPlaceable, DamageableItem {
private boolean damageOnUse;
public ExplosiveShovel(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values);
}
@Override
public BlockBreakHandler getItemHandler() {
return (e, item, fortune, drops) -> {
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.EXPLOSIVE_SHOVEL, true)) {
e.setCancelled(true);
e.getBlock().getWorld().createExplosion(e.getBlock().getLocation(), 0.0F);
e.getBlock().getWorld().playSound(e.getBlock().getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.3F, 1F);
for (int x = -1; x <= 1; x++) {
for (int y = -1; y <= 1; y++) {
for (int z = -1; z <= 1; z++) {
Block b = e.getBlock().getRelative(x, y, z);
boolean correctType = false;
for (Material mat : MaterialTools.getShovelItems()) {
if (b.getType() == mat) {
correctType = true;
break;
}
}
if (correctType && SlimefunPlugin.getProtectionManager().hasPermission(e.getPlayer(), b.getLocation(), Action.BREAK_BLOCK)) {
if (SlimefunPlugin.getHooks().isCoreProtectInstalled()) {
SlimefunPlugin.getHooks().getCoreProtectAPI().logRemoval(e.getPlayer().getName(), b.getLocation(), b.getType(), b.getBlockData());
}
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
for (ItemStack drop: b.getDrops()) {
b.getWorld().dropItemNaturally(b.getLocation(), drop);
}
b.setType(Material.AIR);
damageItem(e.getPlayer(), item);
}
}
}
}
return true;
}
else return false;
};
}
@Override
public void postRegister() {
damageOnUse = ((boolean) Slimefun.getItemValue(getID(), "damage-on-use"));
}
@Override
public boolean isDamageable() {
return damageOnUse;
}
}

View File

@ -0,0 +1,61 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class GoldPan extends SlimefunGadget {
private Random random = new Random();
public GoldPan(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, machineRecipes, keys, values);
}
@Override
public void register(boolean slimefun) {
addItemHandler(new ItemInteractionHandler() {
@Override
public boolean onRightClick(ItemUseEvent e, Player p, ItemStack item) {
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GOLD_PAN, true)) {
if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.GRAVEL && CSCoreLib.getLib().getProtectionManager().canBuild(p.getUniqueId(), e.getClickedBlock(), true)) {
List<ItemStack> drops = new ArrayList<>();
if (random.nextInt(100) < (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.SIFTED_ORE")) drops.add(SlimefunItems.SIFTED_ORE);
else if (random.nextInt(100) < (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.CLAY")) drops.add(new ItemStack(Material.CLAY_BALL));
else if (random.nextInt(100) < (Integer) Slimefun.getItemValue("GOLD_PAN", "chance.FLINT")) drops.add(new ItemStack(Material.FLINT));
e.getClickedBlock().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, e.getClickedBlock().getType());
e.getClickedBlock().setType(Material.AIR);
for (ItemStack drop: drops) {
e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), drop);
}
}
e.setCancelled(true);
return true;
}
else return false;
}
});
super.register(slimefun);
}
}

View File

@ -0,0 +1,95 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Bat;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import me.mrCookieSlime.Slimefun.utils.Utilities;
public class GrapplingHook extends SimpleSlimefunItem<ItemInteractionHandler> {
private long despawnTicks;
public GrapplingHook(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values);
}
@Override
public ItemInteractionHandler getItemHandler() {
Utilities utilities = SlimefunPlugin.getUtilities();
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true)) {
UUID uuid = p.getUniqueId();
if (e.getClickedBlock() == null && !utilities.jumpState.containsKey(uuid)) {
e.setCancelled(true);
if (p.getInventory().getItemInOffHand().getType() == Material.BOW) {
// Cancel, to fix dupe #740
return false;
}
utilities.jumpState.put(uuid, p.getInventory().getItemInMainHand().getType() != Material.SHEARS);
if (item.getType() == Material.LEAD) {
item.setAmount(item.getAmount() - 1);
}
Vector direction = p.getEyeLocation().getDirection().multiply(2.0);
Arrow arrow = p.getWorld().spawn(p.getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), Arrow.class);
arrow.setShooter(p);
arrow.setVelocity(direction);
Bat b = (Bat) p.getWorld().spawnEntity(p.getLocation(), EntityType.BAT);
b.setCanPickupItems(false);
b.setAI(false);
b.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 100000, 100000));
b.setLeashHolder(arrow);
utilities.damage.add(uuid);
utilities.remove.put(uuid, new Entity[]{b, arrow});
// To fix issue #253
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
if (utilities.jumpState.containsKey(uuid)) {
utilities.arrows.remove(uuid);
for (Entity n : utilities.remove.get(uuid)) {
if (n.isValid()) n.remove();
}
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
utilities.damage.remove(uuid);
utilities.jumpState.remove(uuid);
utilities.remove.remove(uuid);
}, 20L);
}
}, despawnTicks);
}
return true;
}
else return false;
};
}
@Override
public void postRegister() {
despawnTicks = (int) Slimefun.getItemValue("GRAPPLING_HOOK", "despawn-seconds") * 20L;
}
}

View File

@ -0,0 +1,41 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class HerculesPickaxe extends SimpleSlimefunItem<BlockBreakHandler> {
public HerculesPickaxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public BlockBreakHandler getItemHandler() {
return (e, item, fortune, drops) -> {
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.HERCULES_PICKAXE, true) && e.getBlock().getType().toString().endsWith("_ORE")) {
if (e.getBlock().getType() == Material.IRON_ORE) {
drops.add(new CustomItem(SlimefunItems.IRON_DUST, 2));
}
else if (e.getBlock().getType() == Material.GOLD_ORE) {
drops.add(new CustomItem(SlimefunItems.GOLD_DUST, 2));
}
else {
for (ItemStack drop: e.getBlock().getDrops()) {
drops.add(new CustomItem(drop, drop.getAmount() * 2));
}
}
return true;
}
else return false;
};
}
}

View File

@ -0,0 +1,53 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Talisman;
import me.mrCookieSlime.Slimefun.Objects.handlers.EntityKillHandler;
public class HunterTalisman extends Talisman {
public HunterTalisman(ItemStack item, String id, ItemStack[] recipe, boolean consumable, boolean cancelEvent, String messageSuffix, int chance) {
super(item, id, recipe, consumable, cancelEvent, messageSuffix, chance);
}
@Override
public void preRegister() {
addItemHandler(getItemHandler());
}
public EntityKillHandler getItemHandler() {
return (e, entity, killer, item) -> {
if (Talisman.checkFor(e, this) && !(e.getEntity() instanceof Player)) {
if (!e.getEntity().getCanPickupItems()) {
List<ItemStack> extraDrops = new ArrayList<>(e.getDrops());
if (e.getEntity() instanceof ChestedHorse) {
for (ItemStack invItem : ((ChestedHorse) e.getEntity()).getInventory().getStorageContents()) {
extraDrops.remove(invItem);
}
//The chest is not included in getStorageContents()
extraDrops.remove(new ItemStack(Material.CHEST));
}
for (ItemStack drop: extraDrops) {
e.getDrops().add(drop);
}
}
return true;
}
else {
return false;
}
};
}
}

View File

@ -0,0 +1,40 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.block.data.Ageable;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class InfernalBonemeal extends SimpleSlimefunItem<ItemInteractionHandler> {
public InfernalBonemeal(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
super(category, item, id, recipeType, recipe, recipeOutput);
}
@Override
public ItemInteractionHandler getItemHandler() {
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(e.getItem(), getItem(), true)) {
if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.NETHER_WART) {
Ageable ageable = (Ageable)e.getClickedBlock().getBlockData();
if (ageable.getAge() < ageable.getMaximumAge()) {
ageable.setAge(ageable.getMaximumAge());
e.getClickedBlock().setBlockData(ageable);
e.getClickedBlock().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, Material.REDSTONE_BLOCK);
PlayerInventory.consumeItemInHand(p);
}
}
return true;
}
return false;
};
}
}

View File

@ -0,0 +1,40 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Container;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class KnowledgeFlask extends SimpleSlimefunItem<ItemInteractionHandler> {
public KnowledgeFlask(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
super(category, item, id, recipeType, recipe, recipeOutput);
}
@Override
public ItemInteractionHandler getItemHandler() {
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true) && p.getLevel() >= 1) {
if (e.getClickedBlock() == null || !(e.getClickedBlock().getState() instanceof Container)) {
p.setLevel(p.getLevel() - 1);
e.setCancelled(true);
p.getInventory().addItem(new CustomItem(Material.EXPERIENCE_BOTTLE, "&aFlask of Knowledge"));
p.playSound(p.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1F, 0.5F);
item.setAmount(item.getAmount() - 1);
}
return true;
}
else return false;
};
}
}

View File

@ -0,0 +1,53 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.bukkit.ChatColor;
import org.bukkit.Sound;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.Research;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.PlayerProfile;
public class KnowledgeTome extends SimpleSlimefunItem<ItemInteractionHandler> {
public KnowledgeTome(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public ItemInteractionHandler getItemHandler() {
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true)) {
List<String> lore = item.getItemMeta().getLore();
lore.set(0, ChatColor.translateAlternateColorCodes('&', "&7Owner: &b" + p.getName()));
lore.set(1, ChatColor.BLACK + "" + p.getUniqueId());
ItemMeta im = item.getItemMeta();
im.setLore(lore);
item.setItemMeta(im);
p.getEquipment().setItemInMainHand(item);
p.getWorld().playSound(p.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1F, 1F);
return true;
}
else if (SlimefunManager.isItemSimiliar(item, getItem(), false)) {
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;
}
else return false;
};
}
}

View File

@ -0,0 +1,55 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action;
import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper;
import me.mrCookieSlime.CSCoreLibPlugin.general.Block.TreeCalculator;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class LumberAxe extends SimpleSlimefunItem<BlockBreakHandler> implements NotPlaceable {
public LumberAxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public BlockBreakHandler getItemHandler() {
return (e, item, fortune, drops) -> {
if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), getItem(), true)) {
if (MaterialHelper.isLog( e.getBlock().getType())) {
List<Location> logs = new ArrayList<>();
TreeCalculator.getTree(e.getBlock().getLocation(), e.getBlock().getLocation(), logs);
if (logs.contains(e.getBlock().getLocation())) logs.remove(e.getBlock().getLocation());
for (Location b: logs) {
if (SlimefunPlugin.getProtectionManager().hasPermission(e.getPlayer(), b, Action.BREAK_BLOCK)) {
b.getWorld().playEffect(b, Effect.STEP_SOUND, b.getBlock().getType());
for (ItemStack drop: b.getBlock().getDrops()) {
b.getWorld().dropItemNaturally(b, drop);
}
b.getBlock().setType(Material.AIR);
}
}
}
return true;
}
else return false;
};
}
}

View File

@ -0,0 +1,36 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.Sound;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import me.mrCookieSlime.CSCoreLibPlugin.general.Player.PlayerInventory;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class MagicSugar extends SimpleSlimefunItem<ItemInteractionHandler> {
public MagicSugar(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values);
}
@Override
public ItemInteractionHandler getItemHandler() {
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.MAGIC_SUGAR, true)) {
PlayerInventory.consumeItemInHand(p);
p.getWorld().playSound(p.getLocation(), Sound.ENTITY_GENERIC_EAT, 1, 1);
p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 600, (Integer) Slimefun.getItemValue("MAGIC_SUGAR", "effects.SPEED")));
return true;
}
else return false;
};
}
}

View File

@ -0,0 +1,39 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemConsumptionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class MonsterJerky extends SimpleSlimefunItem<ItemConsumptionHandler> {
public MonsterJerky(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public ItemConsumptionHandler getItemHandler() {
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true)) {
SlimefunPlugin.instance.getServer().getScheduler().runTaskLater(SlimefunPlugin.instance, () -> {
if (p.hasPotionEffect(PotionEffectType.HUNGER)) {
p.removePotionEffect(PotionEffectType.HUNGER);
}
p.addPotionEffect(new PotionEffect(PotionEffectType.SATURATION, 5, 0));
}, 1L);
return true;
}
else {
return false;
}
};
}
}

View File

@ -0,0 +1,61 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import me.mrCookieSlime.CSCoreLibPlugin.general.String.StringUtils;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
public class PickaxeOfContainment extends SimpleSlimefunItem<BlockBreakHandler> {
public PickaxeOfContainment(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public BlockBreakHandler getItemHandler() {
return (e, item, fortune, drops) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true)) {
// Refactored it into this so we don't need to call e.getBlock() all the time.
Block b = e.getBlock();
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++) {
if (lore.get(i).contains("<Type>")) lore.set(i, lore.get(i).replace("<Type>", StringUtils.format(((CreatureSpawner) b.getState()).getSpawnedType().toString())));
}
im.setLore(lore);
spawner.setItemMeta(im);
b.getLocation().getWorld().dropItemNaturally(b.getLocation(), spawner);
e.setExpToDrop(0);
e.setDropItems(false);
return true;
}
else {
if (e.getBlock().getType() == Material.SPAWNER) e.setDropItems(false);
return false;
}
};
}
}

View File

@ -0,0 +1,69 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.DamageableItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class PickaxeOfTheSeeker extends SimpleSlimefunItem<ItemInteractionHandler> implements DamageableItem {
public PickaxeOfTheSeeker(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public ItemInteractionHandler getItemHandler() {
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true)) {
Block closest = null;
for (int x = -4; x <= 4; x++) {
for (int y = -4; y <= 4; y++) {
for (int z = -4; z <= 4; z++) {
if (p.getLocation().getBlock().getRelative(x, y, z).getType().toString().endsWith("_ORE")) {
if (closest == null || p.getLocation().distance(closest.getLocation()) < p.getLocation().distance(p.getLocation().getBlock().getRelative(x, y, z).getLocation())) {
closest = p.getLocation().getBlock().getRelative(x, y, z);
}
}
}
}
}
if (closest == null) {
Messages.local.sendTranslation(p, "miner.no-ores", true);
}
else {
double l = closest.getX() + 0.5 - p.getLocation().getX();
double w = closest.getZ() + 0.5 - p.getLocation().getZ();
float yaw;
float pitch;
double c = Math.sqrt(l * l + w * w);
double alpha1 = -Math.asin(l / c) / Math.PI * 180;
double alpha2 = Math.acos(w / c) / Math.PI * 180;
if (alpha2 > 90) yaw = (float) (180 - alpha1);
else yaw = (float) alpha1;
pitch = (float) ((-Math.atan((closest.getY() - 0.5 - p.getLocation().getY()) / Math.sqrt(l * l + w * w))) * 180F / Math.PI);
p.teleport(new Location(p.getWorld(), p.getLocation().getX(), p.getLocation().getY(), p.getLocation().getZ(), yaw, pitch));
}
damageItem(p, item);
return true;
}
else return false;
};
}
@Override
public boolean isDamageable() {
return true;
}
}

View File

@ -0,0 +1,56 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule.Action;
import me.mrCookieSlime.CSCoreLibPlugin.general.Block.Vein;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class PickaxeOfVeinMining extends SimpleSlimefunItem<BlockBreakHandler> {
public PickaxeOfVeinMining(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public BlockBreakHandler getItemHandler() {
return (e, item, fortune, drops) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true)) {
if (e.getBlock().getType().toString().endsWith("_ORE")) {
List<Location> blocks = new ArrayList<>();
Vein.calculate(e.getBlock().getLocation(), e.getBlock().getLocation(), blocks, 16);
for (Location block: blocks) {
if (SlimefunPlugin.getProtectionManager().hasPermission(e.getPlayer(), block, Action.BREAK_BLOCK)) {
Block b = block.getBlock();
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
for (ItemStack drop: b.getDrops()) {
b.getWorld().dropItemNaturally(b.getLocation(), drop.getType().isBlock() ? drop: new CustomItem(drop, fortune));
}
b.setType(Material.AIR);
}
}
}
return true;
}
else return false;
};
}
}

View File

@ -0,0 +1,92 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Entity;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.DamageableItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.NotPlaceable;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class SeismicAxe extends SimpleSlimefunItem<ItemInteractionHandler> implements NotPlaceable, DamageableItem {
public SeismicAxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public ItemInteractionHandler getItemHandler() {
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.SEISMIC_AXE, true)) {
List<Block> blocks = p.getLineOfSight(null, 10);
for (int i = 0; i < blocks.size(); i++) {
Block b = blocks.get(i);
Location ground = b.getLocation();
if (b.getType() == null || b.getType() == Material.AIR) {
for (int y = ground.getBlockY(); y > 0; y--) {
if (b.getWorld().getBlockAt(b.getX(), y, b.getZ()) != null && b.getWorld().getBlockAt(b.getX(), y, b.getZ()).getType() != null && b.getWorld().getBlockAt(b.getX(), y, b.getZ()).getType() != Material.AIR) {
ground = new Location(b.getWorld(), b.getX(), y, b.getZ());
break;
}
}
}
b.getWorld().playEffect(ground, Effect.STEP_SOUND, ground.getBlock().getType());
if (ground.getBlock().getRelative(BlockFace.UP).getType() == null || ground.getBlock().getRelative(BlockFace.UP).getType() == Material.AIR) {
Location loc = ground.getBlock().getRelative(BlockFace.UP).getLocation().add(0.5, 0.0, 0.5);
FallingBlock block = ground.getWorld().spawnFallingBlock(loc, ground.getBlock().getBlockData());
block.setDropItem(false);
block.setVelocity(new Vector(0, 0.4 + i * 0.01, 0));
SlimefunPlugin.getUtilities().blocks.add(block.getUniqueId());
}
for (Entity n: ground.getChunk().getEntities()) {
if (n instanceof LivingEntity && n.getLocation().distance(ground) <= 2.0D && !n.getUniqueId().equals(p.getUniqueId())) {
Vector vector = n.getLocation().toVector().subtract(p.getLocation().toVector()).normalize().multiply(1.4);
vector.setY(0.9);
n.setVelocity(vector);
if (p.getWorld().getPVP()) {
EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(p, n, DamageCause.ENTITY_ATTACK, 6D);
Bukkit.getPluginManager().callEvent(event);
if (!event.isCancelled()) ((LivingEntity) n).damage(6D);
}
}
}
}
for (int i = 0; i < 4; i++) {
damageItem(p, item);
}
return true;
}
else return false;
};
}
@Override
public boolean isDamageable() {
return true;
}
}

View File

@ -0,0 +1,50 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.List;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.Recipe.RecipeCalculator;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
public class SmeltersPickaxe extends SimpleSlimefunItem<BlockBreakHandler> {
public SmeltersPickaxe(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public BlockBreakHandler getItemHandler() {
return (e, item, fortune, drops) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true)) {
if (BlockStorage.hasBlockInfo(e.getBlock())) return true;
if (e.getBlock().getType() == Material.PLAYER_HEAD) return true;
int j = -1;
List<ItemStack> dropsList = (List<ItemStack>) e.getBlock().getDrops();
for (int i = 0; i < dropsList.size(); i++) {
if (dropsList.get(i) != null) {
j++;
drops.add(e.getBlock().getType().toString().endsWith("_ORE") ? new CustomItem(dropsList.get(i), fortune): dropsList.get(i));
if (RecipeCalculator.getSmeltedOutput(drops.get(i).getType()) != null) {
e.getBlock().getWorld().playEffect(e.getBlock().getLocation(), Effect.MOBSPAWNER_FLAMES, 1);
drops.set(j, new CustomItem(RecipeCalculator.getSmeltedOutput(drops.get(i).getType()), drops.get(i).getAmount()));
}
}
}
return true;
}
else return false;
};
}
}

View File

@ -0,0 +1,114 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectionModule;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class StormStaff extends SimpleSlimefunItem<ItemInteractionHandler> {
private static final int MAX_USES = 8;
public StormStaff(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe, getCraftedOutput());
}
private static ItemStack getCraftedOutput() {
ItemStack item = SlimefunItems.STAFF_STORM.clone();
ItemMeta im = item.getItemMeta();
List<String> lore = im.getLore();
lore.set(4, ChatColor.translateAlternateColorCodes('&', "&e" + MAX_USES + " Uses &7left"));
im.setLore(lore);
item.setItemMeta(im);
return item;
}
@Override
public ItemInteractionHandler getItemHandler() {
return (e, p, item) -> {
//Not checking if lores equals because we need a special one for that.
if (SlimefunManager.isItemSimiliar(item, getItem(), false)) {
if (!item.hasItemMeta()) return false;
ItemMeta itemMeta = item.getItemMeta();
if (!itemMeta.hasLore()) return false;
List<String> itemLore = itemMeta.getLore();
ItemStack sfItem = getItem();
ItemMeta sfItemMeta = sfItem.getItemMeta();
List<String> sfItemLore = sfItemMeta.getLore();
if (itemLore.size() < 6) {
// Index 1 and 3 in SlimefunItems.STAFF_STORM has lores with words and stuff so we check for them.
if (itemLore.get(1).equals(sfItemLore.get(1)) && itemLore.get(3).equals(sfItemLore.get(3))) {
if (p.getFoodLevel() >= 4 || p.getGameMode() == GameMode.CREATIVE) {
// Get a target block with max. 30 blocks of distance
Location loc = p.getTargetBlock(null, 30).getLocation();
if (loc.getWorld() != null && loc.getChunk().isLoaded()) {
if (loc.getWorld().getPVP() && SlimefunPlugin.getProtectionManager().hasPermission(p, loc, ProtectionModule.Action.PVP)) {
loc.getWorld().strikeLightning(loc);
if (p.getInventory().getItemInMainHand().getType() != Material.SHEARS && p.getGameMode() != GameMode.CREATIVE) {
FoodLevelChangeEvent event = new FoodLevelChangeEvent(p, p.getFoodLevel() - 4);
Bukkit.getPluginManager().callEvent(event);
p.setFoodLevel(event.getFoodLevel());
}
for (int i = MAX_USES; i > 0; i--) {
if (i == 1 && ChatColor.translateAlternateColorCodes('&', "&e1 Use &7left").equals(itemLore.get(4))) {
e.setCancelled(true);
p.playSound(p.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1);
item.setAmount(0);
return true;
}
else if (ChatColor.translateAlternateColorCodes('&', "&e" + i + " Uses &7left").equals(itemLore.get(4))) {
itemLore.set(4, ChatColor.translateAlternateColorCodes('&', "&e" + (i - 1) + " " + (i > 2 ? "Uses": "Use") + " &7left"));
e.setCancelled(true);
// Saving the changes to lore and item.
itemMeta.setLore(itemLore);
item.setItemMeta(itemMeta);
return true;
}
}
return false;
}
else {
Messages.local.sendTranslation(p, "messages.no-pvp", true);
}
}
}
else {
Messages.local.sendTranslation(p, "messages.hungry", true);
}
return true;
}
}
}
return false;
};
}
}

View File

@ -0,0 +1,83 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.Random;
import org.bukkit.Material;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.Player;
import org.bukkit.entity.Skeleton;
import org.bukkit.entity.WitherSkeleton;
import org.bukkit.entity.Zombie;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.EntityKillHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class SwordOfBeheading extends SimpleSlimefunItem<EntityKillHandler> {
private final Random random = new Random();
private int chanceZombie;
private int chanceSkeleton;
private int chanceCreeper;
private int chanceWitherSkeleton;
private int chancePlayer;
public SwordOfBeheading(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values);
}
@Override
public EntityKillHandler getItemHandler() {
return (e, entity, killer, item) -> {
if (SlimefunManager.isItemSimiliar(item, getItem(), true)) {
if (e.getEntity() instanceof Zombie) {
if (random.nextInt(100) < chanceZombie) {
e.getDrops().add(new ItemStack(Material.ZOMBIE_HEAD));
}
}
else if (e.getEntity() instanceof WitherSkeleton) {
if (random.nextInt(100) < chanceWitherSkeleton)
e.getDrops().add(new ItemStack(Material.WITHER_SKELETON_SKULL));
}
else if (e.getEntity() instanceof Skeleton) {
if (random.nextInt(100) < chanceSkeleton)
e.getDrops().add(new ItemStack(Material.SKELETON_SKULL));
}
else if (e.getEntity() instanceof Creeper) {
if (random.nextInt(100) < chanceCreeper) {
e.getDrops().add(new ItemStack(Material.CREEPER_HEAD));
}
}
else if (e.getEntity() instanceof Player) {
if (random.nextInt(100) < chancePlayer) {
ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
ItemMeta meta = skull.getItemMeta();
((SkullMeta) meta).setOwningPlayer((Player) e.getEntity());
skull.setItemMeta(meta);
e.getDrops().add(skull);
}
}
return true;
}
else return false;
};
}
@Override
public void postRegister() {
chanceZombie = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.ZOMBIE");
chanceSkeleton = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.SKELETON");
chanceCreeper = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.CREEPER");
chanceWitherSkeleton = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.WITHER_SKELETON");
chancePlayer = (int) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.PLAYER");
}
}

View File

@ -0,0 +1,40 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import org.bukkit.Location;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
public class TelepositionScroll extends SimpleSlimefunItem<ItemInteractionHandler> {
public TelepositionScroll(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, id, recipeType, recipe);
}
@Override
public ItemInteractionHandler getItemHandler() {
return (e, p, item) -> {
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.SCROLL_OF_DIMENSIONAL_TELEPOSITION, true)) {
for (Entity n: p.getNearbyEntities(10.0, 10.0, 10.0)) {
if (n instanceof LivingEntity && !(n instanceof ArmorStand) && !n.getUniqueId().equals(p.getUniqueId())) {
float yaw = n.getLocation().getYaw() + 180.0F;
if (yaw > 360.0F) yaw = yaw - 360.0F;
n.teleport(new Location(n.getWorld(), n.getLocation().getX(), n.getLocation().getY(), n.getLocation().getZ(), yaw, n.getLocation().getPitch()));
}
}
return true;
}
else return false;
};
}
}

View File

@ -0,0 +1,27 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines;
import org.bukkit.entity.Item;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.ancient_altar.AncientAltarListener;
public class AncientPedestal extends SlimefunItem {
public AncientPedestal(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) {
super(category, item, id, recipeType, recipe, recipeOutput);
SlimefunItem.registerBlockHandler(getID(), (p, b, tool, reason) -> {
Item stack = AncientAltarListener.findItem(b);
if (stack != null) {
stack.removeMetadata("item_placed", SlimefunPlugin.instance);
b.getWorld().dropItem(b.getLocation(), AncientAltarListener.fixItemStack(stack.getItemStack(), stack.getCustomName()));
stack.remove();
}
return true;
});
}
}

View File

@ -0,0 +1,73 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.AutonomousMachineHandler;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.Slimefun;
public class BlockPlacer extends SimpleSlimefunItem<AutonomousMachineHandler> {
private String[] blacklist;
public BlockPlacer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) {
super(category, item, id, recipeType, recipe, keys, values);
}
@Override
public AutonomousMachineHandler getItemHandler() {
return (e, dispenser, d, block, chest, machine) -> {
if (machine.getID().equalsIgnoreCase(getID())) {
e.setCancelled(true);
if ((block.getType() == null || block.getType() == Material.AIR) && e.getItem().getType().isBlock()) {
for (String blockType : blacklist) {
if (e.getItem().getType().toString().equals(blockType)) {
return false;
}
}
SlimefunItem sfItem = SlimefunItem.getByItem(e.getItem());
if (sfItem != null) {
if (!SlimefunPlugin.getUtilities().blockHandlers.containsKey(sfItem.getID())) {
block.setType(e.getItem().getType());
BlockStorage.store(block, sfItem.getID());
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, e.getItem().getType());
if (d.getInventory().containsAtLeast(e.getItem(), 2)) d.getInventory().removeItem(new CustomItem(e.getItem(), 1));
else {
Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> d.getInventory().removeItem(e.getItem()), 2L);
}
}
}
else {
block.setType(e.getItem().getType());
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, e.getItem().getType());
if (d.getInventory().containsAtLeast(e.getItem(), 2)) d.getInventory().removeItem(new CustomItem(e.getItem(), 1));
else {
Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> d.getInventory().removeItem(e.getItem()), 2L);
}
}
}
return true;
}
else return false;
};
}
@Override
public void postRegister() {
List<?> list = (List<?>) Slimefun.getItemValue(getID(), "unplaceable-blocks");
blacklist = list.toArray(new String[list.size()]);
}
}

View File

@ -1,123 +0,0 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.compatibility.MaterialHelper;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow;
public class CargoCraftingNode extends SlimefunItem {
private static final int[] border = {0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 22, 23, 24, 25, 26, 27, 31, 32, 33, 34, 35, 36, 40, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53};
public CargoCraftingNode(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, name, recipeType, recipe);
new BlockMenuPreset(name, "&3Input Node") {
@Override
public void init() {
constructMenu(this);
}
@Override
public void newInstance(final BlockMenu menu, final Block b) {
try {
menu.replaceExistingItem(41, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjI1OTliZDk4NjY1OWI4Y2UyYzQ5ODg1MjVjOTRlMTlkZGQzOWZhZDA4YTM4Mjg0YTE5N2YxYjcwNjc1YWNjIn19fQ=="), "&bChannel", "", "&e> Click to decrease the Channel ID by 1"));
menu.addMenuClickHandler(41, (p, slot, item, action) -> {
int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1;
if (channel < 0) channel = 15;
BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel));
newInstance(menu, b);
return false;
});
menu.replaceExistingItem(42, new CustomItem(new ItemStack(((!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "frequency") == null) ? Material.WHITE_WOOL : MaterialHelper.WoolColours[(Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")))])), "&bChannel ID: &3" + (((!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "frequency") == null) ? 0: (Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")))) + 1)));
menu.addMenuClickHandler(42,
(p, slot, item, action) -> false
);
menu.replaceExistingItem(43, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzJmOTEwYzQ3ZGEwNDJlNGFhMjhhZjZjYzgxY2Y0OGFjNmNhZjM3ZGFiMzVmODhkYjk5M2FjY2I5ZGZlNTE2In19fQ=="), "&bChannel", "", "&e> Click to increase the Channel ID by 1"));
menu.addMenuClickHandler(43, (p, slot, item, action) -> {
int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1;
if (channel > 15) channel = 0;
BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel));
newInstance(menu, b);
return false;
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean canOpen(Block b, Player p) {
boolean open = CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b) || p.hasPermission("slimefun.cargo.bypass");
if (!open) {
Messages.local.sendTranslation(p, "inventory.no-access", true);
}
return open;
}
@Override
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
return new int[0];
}
};
registerBlockHandler(name, new SlimefunBlockHandler() {
@Override
public void onPlace(Player p, Block b, SlimefunItem item) {
BlockStorage.addBlockInfo(b, "owner", p.getUniqueId().toString());
BlockStorage.addBlockInfo(b, "frequency", "0");
}
@Override
public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
BlockMenu inv = BlockStorage.getInventory(b);
if (inv != null) {
for (int slot : getInputSlots()) {
if (inv.getItemInSlot(slot) != null) {
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
inv.replaceExistingItem(slot, null);
}
}
}
return true;
}
});
}
protected void constructMenu(BlockMenuPreset preset) {
for (int i : border) {
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "),
(p, slot, item, action) -> false
);
}
preset.addItem(2, new CustomItem(new ItemStack(Material.CRAFTING_TABLE), "&eRecipe", "", "&bPut in the Recipe you want to craft"),
(p, slot, item, action) -> false
);
}
public int[] getInputSlots() {
return new int[] {19, 20, 21, 28, 29, 30, 37, 38, 39};
}
}

View File

@ -0,0 +1,78 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines;
import org.bukkit.Bukkit;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent;
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunGadget;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler;
import me.mrCookieSlime.Slimefun.Setup.Messages;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage;
public class Composter extends SlimefunGadget {
public Composter(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes) {
super(category, item, id, recipeType, recipe, machineRecipes);
}
@Override
public void preRegister() {
addItemHandler(new ItemInteractionHandler() {
@Override
public boolean onRightClick(ItemUseEvent e, final Player p, ItemStack item) {
if (e.getClickedBlock() != null) {
String id = BlockStorage.checkID(e.getClickedBlock());
if (id != null && id.equals(getID())) {
if (CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), e.getClickedBlock(), true)) {
final ItemStack input = p.getInventory().getItemInMainHand();
final Block b = e.getClickedBlock();
SlimefunItem machine = SlimefunItem.getByID(id);
for (ItemStack convert: RecipeType.getRecipeInputs(machine)) {
if (convert != null && SlimefunManager.isItemSimiliar(input, convert, true)) {
ItemStack removing = input.clone();
removing.setAmount(convert.getAmount());
p.getInventory().removeItem(removing);
final ItemStack adding = RecipeType.getRecipeOutput(machine, convert);
for (int i = 1; i < 12; i++) {
int j = i;
Bukkit.getScheduler().runTaskLater(SlimefunPlugin.instance, () -> {
if (j < 11) {
b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, input.getType().isBlock() ? input.getType() : Material.HAY_BLOCK);
}
else {
p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F);
b.getWorld().dropItemNaturally(b.getRelative(BlockFace.UP).getLocation(), adding);
}
}, i*30L);
}
return true;
}
}
Messages.local.sendTranslation(p, "machines.wrong-item", true);
return true;
}
return true;
}
}
return false;
}
});
}
}

Some files were not shown because too many files have changed in this diff Show More