mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-21 04:05:48 +00:00
commit
428bfcc575
14
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
14
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal 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.
|
18
.github/PULL_REQUEST_TEMPLATE/features.md
vendored
Normal file
18
.github/PULL_REQUEST_TEMPLATE/features.md
vendored
Normal 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
14
.github/PULL_REQUEST_TEMPLATE/fix.md
vendored
Normal 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.
|
@ -24,6 +24,9 @@ Release Candidates or "stable" builds will have a proper Version such as "4.1.18
|
||||
</a>
|
||||
</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
|
||||
You can find Slimefun's community on Discord!
|
||||
Click the badge to join it for Suggestions/Questions or other discussions about this plugin.
|
||||
|
4
pom.xml
4
pom.xml
@ -67,6 +67,8 @@
|
||||
<artifact>com.github.thebusybiscuit:CS-CoreLib2</artifact>
|
||||
<includes>
|
||||
<include>**/cscorelib2/updater/**</include>
|
||||
<include>**/cscorelib2/materials/**</include>
|
||||
<include>**/cscorelib2/protection/**</include>
|
||||
</includes>
|
||||
</filter>
|
||||
</filters>
|
||||
@ -122,7 +124,7 @@
|
||||
<dependency>
|
||||
<groupId>com.github.thebusybiscuit</groupId>
|
||||
<artifactId>CS-CoreLib2</artifactId>
|
||||
<version>0.3.7</version>
|
||||
<version>0.4.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
@ -14,6 +14,7 @@ options:
|
||||
research-give-fireworks: true
|
||||
legacy-ore-washer: false
|
||||
legacy-dust-washer: false
|
||||
legacy-ore-grinder: true
|
||||
guide:
|
||||
default-view-book: false
|
||||
URID:
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -12,18 +12,18 @@ public class MultiBlockInteractEvent extends Event implements Cancellable {
|
||||
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
Player p;
|
||||
MultiBlock mb;
|
||||
Block b;
|
||||
boolean cancelled;
|
||||
private Player p;
|
||||
private MultiBlock mb;
|
||||
private Block b;
|
||||
private boolean cancelled;
|
||||
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlers;
|
||||
}
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public MultiBlockInteractEvent(Player p, MultiBlock mb, Block clicked) {
|
||||
this.p = p;
|
||||
|
@ -11,17 +11,17 @@ public class ResearchUnlockEvent extends Event implements Cancellable {
|
||||
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
Player p;
|
||||
Research r;
|
||||
boolean cancelled;
|
||||
private Player p;
|
||||
private Research r;
|
||||
private boolean cancelled;
|
||||
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlers;
|
||||
}
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public ResearchUnlockEvent(Player p, Research res) {
|
||||
this.p = p;
|
||||
|
@ -5,16 +5,24 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
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();
|
||||
|
||||
}
|
||||
|
@ -1,26 +1,27 @@
|
||||
package me.mrCookieSlime.Slimefun.GEO;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.block.Biome;
|
||||
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
|
||||
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() {
|
||||
return map.values();
|
||||
return SlimefunPlugin.getUtilities().resources.values();
|
||||
}
|
||||
|
||||
public static void registerResource(OreGenResource resource) {
|
||||
map.put(resource.getName(), resource);
|
||||
System.out.println("[Slimefun - GEO] Registering Ore Gen: " + resource.getName());
|
||||
SlimefunPlugin.getUtilities().resources.put(resource.getName(), resource);
|
||||
Slimefun.getLogger().log(Level.INFO, "Registering Ore Gen: " + resource.getName());
|
||||
|
||||
Config cfg = new Config("plugins/Slimefun/generators/" + resource.getName() + ".cfg");
|
||||
for (Biome biome: Biome.values()) {
|
||||
@ -30,7 +31,7 @@ public class OreGenSystem {
|
||||
}
|
||||
|
||||
public static OreGenResource getResource(String name) {
|
||||
return map.get(name);
|
||||
return SlimefunPlugin.getUtilities().resources.get(name);
|
||||
}
|
||||
|
||||
private static int getDefault(OreGenResource resource, Biome biome) {
|
||||
|
@ -1,4 +1,4 @@
|
||||
package me.mrCookieSlime.Slimefun.GEO.Resources;
|
||||
package me.mrCookieSlime.Slimefun.GEO.resources;
|
||||
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@ -10,14 +10,7 @@ public class NetherIceResource implements OreGenResource {
|
||||
|
||||
@Override
|
||||
public int getDefaultSupply(Biome biome) {
|
||||
switch (biome) {
|
||||
case NETHER: {
|
||||
return 32;
|
||||
}
|
||||
default: {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return biome == Biome.NETHER ? 32: 0;
|
||||
}
|
||||
|
||||
@Override
|
@ -1,4 +1,4 @@
|
||||
package me.mrCookieSlime.Slimefun.GEO.Resources;
|
||||
package me.mrCookieSlime.Slimefun.GEO.resources;
|
||||
|
||||
import org.bukkit.block.Biome;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@ -14,35 +14,30 @@ public class OilResource implements OreGenResource {
|
||||
switch (biome) {
|
||||
case SNOWY_BEACH:
|
||||
case STONE_SHORE:
|
||||
case BEACH: {
|
||||
case BEACH:
|
||||
return CSCoreLib.randomizer().nextInt(6) + 2;
|
||||
}
|
||||
|
||||
case DESERT:
|
||||
case DESERT_HILLS:
|
||||
case DESERT_LAKES: {
|
||||
case DESERT_LAKES:
|
||||
return CSCoreLib.randomizer().nextInt(40) + 19;
|
||||
}
|
||||
|
||||
case MOUNTAINS:
|
||||
case GRAVELLY_MOUNTAINS:
|
||||
case MOUNTAIN_EDGE:
|
||||
case RIVER: {
|
||||
case RIVER:
|
||||
return CSCoreLib.randomizer().nextInt(14) + 13;
|
||||
}
|
||||
|
||||
case SNOWY_MOUNTAINS:
|
||||
case SNOWY_TUNDRA:
|
||||
case ICE_SPIKES:
|
||||
case FROZEN_OCEAN:
|
||||
case FROZEN_RIVER: {
|
||||
case FROZEN_RIVER:
|
||||
return CSCoreLib.randomizer().nextInt(11) + 3;
|
||||
}
|
||||
|
||||
case THE_END:
|
||||
case NETHER: {
|
||||
case NETHER:
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
case BADLANDS:
|
||||
@ -52,24 +47,20 @@ public class OilResource implements OreGenResource {
|
||||
case MODIFIED_BADLANDS_PLATEAU:
|
||||
case MODIFIED_WOODED_BADLANDS_PLATEAU:
|
||||
case MUSHROOM_FIELDS:
|
||||
case MUSHROOM_FIELD_SHORE: {
|
||||
case MUSHROOM_FIELD_SHORE:
|
||||
return CSCoreLib.randomizer().nextInt(24) + 14;
|
||||
}
|
||||
|
||||
case DEEP_OCEAN:
|
||||
case OCEAN: {
|
||||
case OCEAN:
|
||||
return CSCoreLib.randomizer().nextInt(62) + 24;
|
||||
}
|
||||
|
||||
case SWAMP:
|
||||
case SWAMP_HILLS: {
|
||||
case SWAMP_HILLS:
|
||||
return CSCoreLib.randomizer().nextInt(20) + 4;
|
||||
}
|
||||
|
||||
default: {
|
||||
default:
|
||||
return CSCoreLib.randomizer().nextInt(10) + 6;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
@ -1,7 +1,6 @@
|
||||
package me.mrCookieSlime.Slimefun.GPS;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
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.MenuHelper;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
|
||||
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
|
||||
import me.mrCookieSlime.Slimefun.Setup.Messages;
|
||||
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) {
|
||||
ChestMenu menu = new ChestMenu("Elevator Settings");
|
||||
@ -35,7 +35,7 @@ public class Elevator {
|
||||
pl.sendMessage("");
|
||||
|
||||
MenuHelper.awaitChatInput(pl, (player, message) -> {
|
||||
BlockStorage.addBlockInfo(b, "floor", message.replaceAll("&", "&"));
|
||||
BlockStorage.addBlockInfo(b, "floor", message.replace(ChatColor.COLOR_CHAR, '&'));
|
||||
|
||||
player.sendMessage("");
|
||||
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) {
|
||||
if (ignored.contains(p.getUniqueId())) {
|
||||
ignored.remove(p.getUniqueId());
|
||||
Set<UUID> elevatorUsers = SlimefunPlugin.getUtilities().elevatorUsers;
|
||||
|
||||
if (elevatorUsers.contains(p.getUniqueId())) {
|
||||
elevatorUsers.remove(p.getUniqueId());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@ import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
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.Math.DoubleHandler;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull;
|
||||
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
|
||||
import me.mrCookieSlime.Slimefun.GEO.OreGenResource;
|
||||
import me.mrCookieSlime.Slimefun.GEO.OreGenSystem;
|
||||
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[] 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<>();
|
||||
if (transmitters.containsKey(uuid)) set = transmitters.get(uuid);
|
||||
if (status.equals(NetworkStatus.ONLINE)) {
|
||||
if (!set.contains(b.getLocation())) {
|
||||
set.add(b.getLocation());
|
||||
|
||||
if (status == NetworkStatus.ONLINE) {
|
||||
if (!set.contains(l)) {
|
||||
set.add(l);
|
||||
transmitters.put(uuid, set);
|
||||
}
|
||||
}
|
||||
else {
|
||||
set.remove(b.getLocation());
|
||||
set.remove(l);
|
||||
transmitters.put(uuid, set);
|
||||
}
|
||||
}
|
||||
@ -64,7 +70,7 @@ public class GPSNetwork {
|
||||
else return transmitters.get(uuid).size();
|
||||
}
|
||||
|
||||
public void openTransmitterControlPanel(Player p) throws Exception {
|
||||
public void openTransmitterControlPanel(Player p) {
|
||||
ChestMenu menu = new ChestMenu("&9Control Panel");
|
||||
|
||||
for (int slot : border) {
|
||||
@ -73,37 +79,35 @@ public class GPSNetwork {
|
||||
);
|
||||
}
|
||||
|
||||
menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &e(Selected)"));
|
||||
menu.addMenuClickHandler(2,
|
||||
(pl, slot, item, action) -> 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.addMenuClickHandler(4,
|
||||
(pl, slot, item, action) -> false
|
||||
);
|
||||
|
||||
menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &r(Select)"));
|
||||
menu.addMenuClickHandler(6, (pl, slot, item, action) -> {
|
||||
try {
|
||||
openWaypointControlPanel(pl);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
int index = 0;
|
||||
for (Location l : getTransmitters(p.getUniqueId())) {
|
||||
if (index >= inventory.length) break;
|
||||
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.addMenuClickHandler(slot,
|
||||
(pl, slotn, item, action) -> false
|
||||
try {
|
||||
menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &e(Selected)"));
|
||||
menu.addMenuClickHandler(2,
|
||||
(pl, slot, item, action) -> false
|
||||
);
|
||||
|
||||
index++;
|
||||
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,
|
||||
(pl, slot, item, action) -> false
|
||||
);
|
||||
|
||||
menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &r(Select)"));
|
||||
menu.addMenuClickHandler(6, (pl, slot, item, action) -> {
|
||||
openWaypointControlPanel(pl);
|
||||
return false;
|
||||
});
|
||||
|
||||
int index = 0;
|
||||
for (Location l : getTransmitters(p.getUniqueId())) {
|
||||
if (index >= inventory.length) break;
|
||||
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.addMenuClickHandler(slot, (pl, slotn, item, action) -> false);
|
||||
|
||||
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);
|
||||
@ -115,10 +119,10 @@ public class GPSNetwork {
|
||||
if (entry.getKey().startsWith("&4Deathpoint")) {
|
||||
return CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMWFlMzg1NWY5NTJjZDRhMDNjMTQ4YTk0NmUzZjgxMmE1OTU1YWQzNWNiY2I1MjYyN2VhNGFjZDQ3ZDMwODEifX19");
|
||||
}
|
||||
else if (l.getWorld().getEnvironment().equals(Environment.NETHER)) {
|
||||
else if (l.getWorld().getEnvironment() == Environment.NETHER) {
|
||||
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");
|
||||
}
|
||||
else {
|
||||
@ -126,59 +130,51 @@ public class GPSNetwork {
|
||||
}
|
||||
}
|
||||
|
||||
public void openWaypointControlPanel(Player p) throws Exception {
|
||||
public void openWaypointControlPanel(Player p) {
|
||||
ChestMenu menu = new ChestMenu("&9Control Panel");
|
||||
|
||||
for (int slot: border) {
|
||||
menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "),
|
||||
(pl, slotn, item, action) -> false
|
||||
);
|
||||
menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (pl, slotn, item, action) -> false);
|
||||
}
|
||||
|
||||
menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &r(Select)"));
|
||||
menu.addMenuClickHandler(2, (pl, slot, item, action) -> {
|
||||
try {
|
||||
try {
|
||||
menu.addItem(2, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjBjOWMxYTAyMmY0MGI3M2YxNGI0Y2JhMzdjNzE4YzZhNTMzZjNhMjg2NGI2NTM2ZDVmNDU2OTM0Y2MxZiJ9fX0="), "&7Transmitter Overview &r(Select)"));
|
||||
menu.addMenuClickHandler(2, (pl, slot, item, action) -> {
|
||||
openTransmitterControlPanel(pl);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
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.addMenuClickHandler(4,
|
||||
(pl, slot, item, action) -> false
|
||||
);
|
||||
|
||||
menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Selected)"));
|
||||
menu.addMenuClickHandler(6,
|
||||
(pl, slot, item, action) -> false
|
||||
);
|
||||
|
||||
int index = 0;
|
||||
for (final Map.Entry<String, Location> entry : getWaypoints(p.getUniqueId()).entrySet()) {
|
||||
if (index >= inventory.length) break;
|
||||
int slot = inventory[index];
|
||||
|
||||
Location l = entry.getValue();
|
||||
ItemStack globe = getPlanet(entry);
|
||||
|
||||
menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&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 &cClick to delete"));
|
||||
menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> {
|
||||
String id = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', entry.getKey())).toUpperCase().replace(" ", "_");
|
||||
Config cfg = new Config("data-storage/Slimefun/waypoints/" + pl.getUniqueId().toString() + ".yml");
|
||||
cfg.setValue(id, null);
|
||||
cfg.save();
|
||||
pl.playSound(pl.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F);
|
||||
try {
|
||||
openWaypointControlPanel(pl);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
index++;
|
||||
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, (pl, slot, item, action) -> false);
|
||||
|
||||
menu.addItem(6, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Selected)"));
|
||||
menu.addMenuClickHandler(6, (pl, slot, item, action) -> false);
|
||||
|
||||
int index = 0;
|
||||
for (final Map.Entry<String, Location> entry : getWaypoints(p.getUniqueId()).entrySet()) {
|
||||
if (index >= inventory.length) break;
|
||||
int slot = inventory[index];
|
||||
|
||||
Location l = entry.getValue();
|
||||
ItemStack globe = getPlanet(entry);
|
||||
|
||||
menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&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 &cClick to delete"));
|
||||
menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> {
|
||||
String id = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', entry.getKey())).toUpperCase().replace(" ", "_");
|
||||
Config cfg = new Config("data-storage/Slimefun/waypoints/" + pl.getUniqueId().toString() + ".yml");
|
||||
cfg.setValue(id, null);
|
||||
cfg.save();
|
||||
pl.playSound(pl.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F);
|
||||
|
||||
openWaypointControlPanel(pl);
|
||||
return false;
|
||||
});
|
||||
|
||||
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);
|
||||
@ -223,7 +219,7 @@ public class GPSNetwork {
|
||||
}
|
||||
|
||||
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) {
|
||||
@ -238,29 +234,22 @@ public class GPSNetwork {
|
||||
for (OreGenResource resource: OreGenSystem.listResources()) {
|
||||
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()),
|
||||
(pl, slot, item, action) -> false
|
||||
);
|
||||
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);
|
||||
index++;
|
||||
}
|
||||
|
||||
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};
|
||||
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};
|
||||
|
||||
public static void openTeleporterGUI(Player p, UUID uuid, Block b, final int complexity) throws Exception {
|
||||
if (TeleportationSequence.players.contains(p.getUniqueId())) return;
|
||||
public static void openTeleporterGUI(Player p, UUID uuid, Block b, final int complexity) {
|
||||
if (SlimefunPlugin.getUtilities().teleporterUsers.contains(p.getUniqueId())) return;
|
||||
|
||||
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");
|
||||
|
||||
menu.addMenuCloseHandler(
|
||||
pl -> TeleportationSequence.players.remove(pl.getUniqueId())
|
||||
);
|
||||
menu.addMenuCloseHandler(pl -> SlimefunPlugin.getUtilities().teleporterUsers.remove(pl.getUniqueId()));
|
||||
|
||||
for (int slot : teleporter_border) {
|
||||
menu.addItem(slot, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "),
|
||||
@ -268,28 +257,31 @@ public class GPSNetwork {
|
||||
);
|
||||
}
|
||||
|
||||
menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Select a Destination)"));
|
||||
menu.addMenuClickHandler(4,
|
||||
(pl, slot, item, action) -> false
|
||||
);
|
||||
try {
|
||||
menu.addItem(4, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="), "&7Waypoint Overview &e(Select a Destination)"));
|
||||
menu.addMenuClickHandler(4, (pl, slot, item, action) -> false);
|
||||
|
||||
final Location source = new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + 2D, b.getZ() + 0.5D);
|
||||
int index = 0;
|
||||
for (final Map.Entry<String, Location> entry: Slimefun.getGPSNetwork().getWaypoints(uuid).entrySet()) {
|
||||
if (index >= teleporter_inventory.length) break;
|
||||
int slot = teleporter_inventory[index];
|
||||
final Location source = new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + 2D, b.getZ() + 0.5D);
|
||||
int index = 0;
|
||||
for (final Map.Entry<String, Location> entry: Slimefun.getGPSNetwork().getWaypoints(uuid).entrySet()) {
|
||||
if (index >= teleporter_inventory.length) break;
|
||||
int slot = teleporter_inventory[index];
|
||||
|
||||
final Location l = entry.getValue();
|
||||
ItemStack globe = getPlanet(entry);
|
||||
final Location l = entry.getValue();
|
||||
ItemStack globe = getPlanet(entry);
|
||||
|
||||
menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&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 &7Estimated Teleportation Time: &r" + (50 / TeleportationSequence.getSpeed(Slimefun.getGPSNetwork().getNetworkComplexity(uuid), source, l)) + "s", "", "&8\u21E8 &cClick to select"));
|
||||
menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> {
|
||||
pl.closeInventory();
|
||||
TeleportationSequence.start(pl.getUniqueId(), complexity, source, l, false);
|
||||
return false;
|
||||
});
|
||||
menu.addItem(slot, new CustomItem(globe, entry.getKey(), "&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 &7Estimated Teleportation Time: &r" + (50 / TeleportationSequence.getSpeed(Slimefun.getGPSNetwork().getNetworkComplexity(uuid), source, l)) + "s", "", "&8\u21E8 &cClick to select"));
|
||||
menu.addMenuClickHandler(slot, (pl, slotn, item, action) -> {
|
||||
pl.closeInventory();
|
||||
TeleportationSequence.start(pl.getUniqueId(), complexity, source, l, false);
|
||||
return false;
|
||||
});
|
||||
|
||||
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);
|
||||
|
@ -1,8 +1,7 @@
|
||||
package me.mrCookieSlime.Slimefun.GPS;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
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.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) {
|
||||
players.add(uuid);
|
||||
SlimefunPlugin.getUtilities().teleporterUsers.add(uuid);
|
||||
|
||||
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) {
|
||||
players.remove(uuid);
|
||||
SlimefunPlugin.getUtilities().teleporterUsers.remove(uuid);
|
||||
|
||||
if (p != null) {
|
||||
try {
|
||||
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);
|
||||
subtitle.send(TitleType.SUBTITLE, p);
|
||||
} 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().playSound(destination, Sound.ENTITY_BLAZE_DEATH, 2F, 1.4F);
|
||||
players.remove(uuid);
|
||||
SlimefunPlugin.getUtilities().teleporterUsers.remove(uuid);
|
||||
}
|
||||
else {
|
||||
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().playSound(source, Sound.UI_BUTTON_CLICK, 1.7F, 0.6F);
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
|
||||
updateProgress(uuid, speed, progress + speed, source, destination, resistance);
|
||||
}, 10l);
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> updateProgress(uuid, speed, progress + speed, source, destination, resistance), 10L);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception x) {
|
||||
Slimefun.getLogger().log(Level.SEVERE, "An Error occured during a Teleportation Sequence for Slimefun " + Slimefun.getVersion(), x);
|
||||
}
|
||||
}
|
||||
else cancel(uuid, p);
|
||||
|
@ -1,16 +1,13 @@
|
||||
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.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.LockedCategory;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SeasonCategory;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SeasonalCategory;
|
||||
|
||||
/**
|
||||
* Built-in categories.
|
||||
@ -19,42 +16,35 @@ import org.bukkit.Material;
|
||||
* @since 4.0
|
||||
* @see Category
|
||||
*/
|
||||
public class Categories {
|
||||
public final class Categories {
|
||||
|
||||
public static Category WEAPONS = new Category(new MenuItem(Material.GOLDEN_SWORD, "&7Weapons", 0, "open"), 1);
|
||||
public static Category PORTABLE = null;
|
||||
public static Category FOOD = new Category(new MenuItem(Material.APPLE, "&7Food", 0, "open"), 2);
|
||||
public static Category MACHINES_1 = null;
|
||||
public static LockedCategory ELECTRICITY = null;
|
||||
public static LockedCategory GPS = null;
|
||||
public static Category ARMOR = new Category(new MenuItem(Material.IRON_CHESTPLATE, "&7Armor", 0, "open"), 2);
|
||||
public static Category LUMPS_AND_MAGIC = new Category(new MenuItem(Material.FIRE_CHARGE, "&7Magical Items", 0, "open"), 2);
|
||||
public static Category MAGIC = new Category(new MenuItem(Material.BLAZE_POWDER, "&7Magical Gadgets", 0, "open"), 3);
|
||||
public static Category MISC = null;
|
||||
public static Category TECH = new Category(new CustomArmor(new MenuItem(Material.LEATHER_CHESTPLATE, "&7Technical Gadgets", 0, "open"), Color.SILVER), 3);
|
||||
public static Category RESOURCES = null;
|
||||
public static Category CARGO = null;
|
||||
public static Category TECH_MISC = new Category(new MenuItem(Material.COMPARATOR, "&7Technical Components", 0, "open"), 2);
|
||||
public static Category MAGIC_ARMOR = new Category(new MenuItem(Material.GOLDEN_CHESTPLATE, "&7Magical Armor", 0, "open"), 2);
|
||||
public static Category TALISMANS_1 = new Category(new MenuItem(Material.EMERALD, "&7Talismans - &aTier I", 0, "open"), 2);
|
||||
public static LockedCategory TALISMANS_2 = new LockedCategory(new MenuItem(Material.EMERALD, "&7Talismans - &aTier II", 0, "open"), 3, TALISMANS_1);
|
||||
public static Category TOOLS = new Category(new MenuItem(Material.GOLDEN_PICKAXE, "&7Tools", 0, "open"), 1);
|
||||
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 SeasonCategory VALENTINES_DAY = new SeasonCategory(2, 2, new MenuItem(Material.POPPY, "&dValentine's Day", 0, ChatColor.translateAlternateColorCodes('&', "&dcelebrate Love")));
|
||||
public static SeasonCategory EASTER = new SeasonCategory(4, 2, new MenuItem(Material.EGG, "&6Easter", 0, ChatColor.translateAlternateColorCodes('&', "&apaint some Eggs")));
|
||||
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")));
|
||||
private Categories() {}
|
||||
|
||||
private static final String LORE = "&a> Click to open";
|
||||
|
||||
public static final Category WEAPONS = new Category(new CustomItem(Material.GOLDEN_SWORD, "&7Weapons", "", LORE), 1);
|
||||
public static final Category PORTABLE = new Category(new CustomItem(SlimefunItems.BACKPACK_MEDIUM, "&7Items", "", LORE), 1);
|
||||
public static final Category FOOD = new Category(new CustomItem(Material.APPLE, "&7Food", "", LORE), 2);
|
||||
public static final Category MACHINES_1 = new Category(new CustomItem(Material.SMITHING_TABLE, "&7Basic Machines", "", LORE), 1);
|
||||
public static final LockedCategory ELECTRICITY = new LockedCategory(new CustomItem(SlimefunItems.NUCLEAR_REACTOR, "&bEnergy and Electricity", "", LORE), 4, MACHINES_1);
|
||||
public static final LockedCategory GPS = new LockedCategory(new CustomItem(SlimefunItems.GPS_TRANSMITTER, "&bGPS-based Machines", "", LORE), 4, MACHINES_1);
|
||||
public static final Category ARMOR = new Category(new CustomItem(Material.IRON_CHESTPLATE, "&7Armor", "", LORE), 2);
|
||||
public static final Category LUMPS_AND_MAGIC = new Category(new CustomItem(SlimefunItems.RUNE_ENDER, "&7Magical Items", "", LORE), 2);
|
||||
public static final Category MAGIC = new Category(new CustomItem(Material.ELYTRA, "&7Magical Gadgets", "", LORE), 3);
|
||||
public static final Category MISC = new Category(new CustomItem(SlimefunItems.CAN, "&7Miscellaneous", "", LORE), 2);
|
||||
public static final Category TECH = new Category(new CustomArmor(new CustomItem(Material.LEATHER_CHESTPLATE, "&7Technical Gadgets", "", LORE), Color.SILVER), 3);
|
||||
public static final Category RESOURCES = new Category(new CustomItem(SlimefunItems.SYNTHETIC_SAPPHIRE, "&7Resources", "", LORE), 1);
|
||||
public static final Category CARGO = new LockedCategory(new CustomItem(SlimefunItems.CARGO_MANAGER, "&cCargo Management", "", LORE), 4, MACHINES_1);
|
||||
public static final Category TECH_MISC = new Category(new CustomItem(SlimefunItems.HEATING_COIL, "&7Technical Components", "", LORE), 2);
|
||||
public static final Category MAGIC_ARMOR = new Category(new CustomItem(SlimefunItems.ENDER_HELMET, "&7Magical Armor", "", LORE), 2);
|
||||
public static final Category TALISMANS_1 = new Category(new CustomItem(Material.EMERALD, "&7Talismans - &aTier I", "", LORE), 2);
|
||||
public static final LockedCategory TALISMANS_2 = new LockedCategory(new CustomItem(Material.EMERALD, "&7Talismans - &aTier II", "", LORE), 3, TALISMANS_1);
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,26 +14,26 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
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 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 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 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 SMELTERY = new RecipeType(new CustomItem(Material.FURNACE, "&6Smeltery", 0, new String[] {"", "&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 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 COMPRESSOR = new RecipeType(new CustomItem(Material.PISTON, "&bCompressor", 0, new String[] {"", "&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 OVEN = new RecipeType(new CustomItem(Material.FURNACE, "&bOven", 0, new String[] {"", "&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 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 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 JUICER = new RecipeType(new CustomItem(Material.GLASS_BOTTLE, "&eJuicer", 0, new String[] {"", "&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 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", "", "&a&oCraft it in an Armor Forge"), "ARMOR_FORGE");
|
||||
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", "", "&a&oKill the specified Mob to obtain this Item"));
|
||||
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", "", "&a&oCrush it using the Ore Crusher"), "ORE_CRUSHER");
|
||||
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", "", "&a&oCompress it using the Compressor"), "COMPRESSOR");
|
||||
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", "", "&a&oSmelt it in an Oven"), "OVEN");
|
||||
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", "", "&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", "", "&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", "", "&a&oUsed for Juice Creation"), "JUICER");
|
||||
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 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 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 FURNACE = new RecipeType(new CustomItem(Material.FURNACE, "&eFurnace Recipe", 0, new String[] {"", "&a&oJust smelt it in a regular Furnace"}));
|
||||
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", "", "&a&oJust a standard Recipe in the Workbench..."));
|
||||
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);
|
||||
|
||||
private ItemStack item;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,9 +0,0 @@
|
||||
package me.mrCookieSlime.Slimefun.Misc;
|
||||
|
||||
public enum BookDesign {
|
||||
|
||||
BOOK,
|
||||
CHEST,
|
||||
CHEAT_SHEET;
|
||||
|
||||
}
|
@ -2,14 +2,15 @@ package me.mrCookieSlime.Slimefun.Objects;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
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.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||
|
||||
/**
|
||||
* Statically handles categories.
|
||||
@ -20,15 +21,9 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||
* @since 4.0
|
||||
*
|
||||
* @see LockedCategory
|
||||
* @see SeasonCategory
|
||||
* @see SeasonalCategory
|
||||
*/
|
||||
public class Category {
|
||||
/**
|
||||
* List of the registered Categories.
|
||||
* @since 4.0
|
||||
* @see Categories
|
||||
*/
|
||||
public static List<Category> list = new ArrayList<>();
|
||||
|
||||
private ItemStack item;
|
||||
private List<SlimefunItem> items;
|
||||
@ -44,6 +39,11 @@ public class Category {
|
||||
*/
|
||||
public Category(ItemStack item) {
|
||||
this.item = item;
|
||||
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
|
||||
this.item.setItemMeta(meta);
|
||||
|
||||
this.items = new ArrayList<>();
|
||||
this.tier = 3;
|
||||
}
|
||||
@ -72,14 +72,19 @@ public class Category {
|
||||
* @since 4.0
|
||||
*/
|
||||
public void register() {
|
||||
list.add(this);
|
||||
Collections.sort(list, new CategorySorter());
|
||||
SlimefunPlugin.getUtilities().allCategories.add(this);
|
||||
Collections.sort(list(), SlimefunPlugin.getUtilities().categorySorter);
|
||||
|
||||
if (this instanceof SeasonCategory) {
|
||||
if (((SeasonCategory) this).isUnlocked()) Slimefun.current_categories.add(this);
|
||||
if (this instanceof SeasonalCategory) {
|
||||
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
|
||||
*/
|
||||
public static List<Category> list() {
|
||||
return list;
|
||||
return SlimefunPlugin.getUtilities().allCategories;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -135,8 +140,9 @@ public class Category {
|
||||
*
|
||||
* @since 4.0
|
||||
*/
|
||||
@Deprecated
|
||||
public static Category getByItem(ItemStack item) {
|
||||
for (Category c: list) {
|
||||
for (Category c: list()) {
|
||||
if (c.getItem().isSimilar(item)) return c;
|
||||
}
|
||||
return null;
|
||||
@ -153,19 +159,4 @@ public class Category {
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -20,7 +20,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
* @since 4.0
|
||||
*
|
||||
* @see Category
|
||||
* @see SeasonCategory
|
||||
* @see SeasonalCategory
|
||||
*/
|
||||
public class LockedCategory extends Category {
|
||||
|
||||
@ -116,11 +116,7 @@ public class LockedCategory extends Category {
|
||||
|
||||
for (Category category: parents) {
|
||||
for (SlimefunItem item: category.getItems()) {
|
||||
if (Slimefun.isEnabled(p, item.getItem(), false) && Slimefun.hasPermission(p, item, false)) {
|
||||
if (item.getResearch() != null) {
|
||||
if (!profile.hasUnlocked(item.getResearch())) return false;
|
||||
}
|
||||
}
|
||||
if (Slimefun.isEnabled(p, item.getItem(), false) && Slimefun.hasPermission(p, item, false) && item.getResearch() != null && !profile.hasUnlocked(item.getResearch())) return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
@ -1,20 +1,18 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects;
|
||||
|
||||
import java.util.ArrayList;
|
||||
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 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 static List<MultiBlock> list = new ArrayList<>();
|
||||
|
||||
Material[] blocks;
|
||||
Material trigger;
|
||||
private Material[] blocks;
|
||||
private Material trigger;
|
||||
|
||||
public MultiBlock(Material[] build, Material trigger) {
|
||||
this.blocks = build;
|
||||
@ -30,48 +28,46 @@ public class MultiBlock {
|
||||
}
|
||||
|
||||
public void register() {
|
||||
list.add(this);
|
||||
SlimefunPlugin.getUtilities().allMultiblocks.add(this);
|
||||
}
|
||||
|
||||
public static List<MultiBlock> list() {
|
||||
return list;
|
||||
return SlimefunPlugin.getUtilities().allMultiblocks;
|
||||
}
|
||||
|
||||
public boolean isMultiBlock(SlimefunItem machine) {
|
||||
if (machine == null) return false;
|
||||
else if (!(machine instanceof SlimefunMachine)) return false;
|
||||
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;
|
||||
if (machine instanceof SlimefunMachine) {
|
||||
return isMultiBlock(((SlimefunMachine) machine).toMultiBlock());
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
|
||||
public boolean isMultiBlock(MultiBlock mb) {
|
||||
if (mb == null) return false;
|
||||
else if (trigger == mb.getTriggerBlock()) {
|
||||
|
||||
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;
|
||||
}
|
||||
if (!compareBlocks(blocks[i], mb.getBuild()[i])) return false;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -17,7 +17,7 @@ import org.bukkit.entity.Player;
|
||||
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Variable;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.FireworkShow;
|
||||
import me.mrCookieSlime.Slimefun.SlimefunStartup;
|
||||
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
|
||||
import me.mrCookieSlime.Slimefun.Events.ResearchUnlockEvent;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.Setup.Messages;
|
||||
@ -40,36 +40,6 @@ public class Research {
|
||||
|
||||
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 String name;
|
||||
private List<SlimefunItem> items;
|
||||
@ -103,7 +73,7 @@ public class Research {
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return enableResearching && enabled;
|
||||
return SlimefunPlugin.getSettings().researchesEnabled && enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -138,7 +108,7 @@ public class Research {
|
||||
*/
|
||||
@Deprecated
|
||||
public int getLevel() {
|
||||
return cost;
|
||||
return getCost();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -151,7 +121,7 @@ public class Research {
|
||||
*/
|
||||
@Deprecated
|
||||
public void setLevel(int level) {
|
||||
this.cost = level;
|
||||
setCost(level);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -237,7 +207,7 @@ public class Research {
|
||||
*/
|
||||
public boolean canUnlock(Player p) {
|
||||
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);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
|
||||
if (!event.isCancelled()) {
|
||||
if (instant) {
|
||||
PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true);
|
||||
Runnable runnable = () -> {
|
||||
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")) {
|
||||
FireworkShow.launchRandom(p, 1);
|
||||
}
|
||||
if (SlimefunPlugin.getCfg().getBoolean("options.research-unlock-fireworks")) {
|
||||
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()));
|
||||
|
||||
for (int i = 1; i < research_progress.length + 1; 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);
|
||||
Messages.local.sendTranslation(p, "messages.research.progress", true, new Variable("%research%", getName()), new Variable("%progress%", research_progress[j - 1] + "%"));
|
||||
}, i * 20L);
|
||||
}
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
|
||||
PlayerProfile.fromUUID(p.getUniqueId()).setResearched(this, true);
|
||||
Messages.local.sendTranslation(p, "messages.unlocked", true, new Variable("%research%", getName()));
|
||||
|
||||
if (SlimefunStartup.getCfg().getBoolean("options.research-unlock-fireworks")) {
|
||||
FireworkShow.launchRandom(p, 1);
|
||||
}
|
||||
|
||||
researching.remove(p.getUniqueId());
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
|
||||
runnable.run();
|
||||
SlimefunPlugin.getUtilities().researching.remove(p.getUniqueId());
|
||||
}, (research_progress.length + 1) * 20L);
|
||||
}
|
||||
}
|
||||
@ -309,9 +275,9 @@ public class Research {
|
||||
* @since 4.0
|
||||
*/
|
||||
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();
|
||||
while (iterator.hasNext()) {
|
||||
SlimefunItem item = iterator.next();
|
||||
@ -321,16 +287,18 @@ public class Research {
|
||||
return;
|
||||
}
|
||||
|
||||
SlimefunStartup.getResearchCfg().setDefaultValue(this.getID() + ".name", this.getName());
|
||||
SlimefunStartup.getResearchCfg().setDefaultValue(this.getID() + ".cost", this.getCost());
|
||||
SlimefunStartup.getResearchCfg().setDefaultValue(this.getID() + ".enabled", true);
|
||||
SlimefunPlugin.getResearchCfg().setDefaultValue(this.getID() + ".name", this.getName());
|
||||
SlimefunPlugin.getResearchCfg().setDefaultValue(this.getID() + ".cost", this.getCost());
|
||||
SlimefunPlugin.getResearchCfg().setDefaultValue(this.getID() + ".enabled", true);
|
||||
|
||||
this.name = SlimefunStartup.getResearchCfg().getString(this.getID() + ".name");
|
||||
this.cost = SlimefunStartup.getResearchCfg().getInt(this.getID() + ".cost");
|
||||
this.enabled = SlimefunStartup.getResearchCfg().getBoolean(this.getID() + ".enabled");
|
||||
this.name = SlimefunPlugin.getResearchCfg().getString(this.getID() + ".name");
|
||||
this.cost = SlimefunPlugin.getResearchCfg().getInt(this.getID() + ".cost");
|
||||
this.enabled = SlimefunPlugin.getResearchCfg().getBoolean(this.getID() + ".enabled");
|
||||
|
||||
list.add(this);
|
||||
if (SlimefunStartup.getCfg().getBoolean("options.print-out-loading")) System.out.println("[Slimefun] Loaded Research \"" + this.getName() + "\"");
|
||||
SlimefunPlugin.getUtilities().allResearches.add(this);
|
||||
if (SlimefunPlugin.getSettings().printOutLoading) {
|
||||
Slimefun.getLogger().log(Level.INFO, "Loaded Research \"" + this.getName() + "\"");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -342,7 +310,7 @@ public class Research {
|
||||
* @see ResearchSetup
|
||||
*/
|
||||
public static List<Research> list() {
|
||||
return list;
|
||||
return SlimefunPlugin.getUtilities().allResearches;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -354,7 +322,7 @@ public class Research {
|
||||
* @since 4.0
|
||||
*/
|
||||
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) {
|
||||
PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId());
|
||||
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% ";
|
||||
else if (Float.parseFloat(progress) < 32.0F) progress = "&c" + progress + " &r% ";
|
||||
else if (Float.parseFloat(progress) < 48.0F) progress = "&6" + progress + " &r% ";
|
||||
@ -399,10 +367,8 @@ public class Research {
|
||||
* @see #sendStats(CommandSender, Player)
|
||||
*/
|
||||
@Deprecated
|
||||
public static String getTitle(Player p, Set<Research> researched) {
|
||||
int index = Math.round(Float.valueOf(String.valueOf(Math.round(((researched.size() * 100.0f) / list().size()) * 100.0f) / 100.0f)) / 100.0F) * titles.size();
|
||||
if (index > 0) index--;
|
||||
return titles.get(index);
|
||||
public static String getTitle(Player p, Collection<Research> researched) {
|
||||
return PlayerProfile.fromUUID(p.getUniqueId()).getTitle();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -414,7 +380,7 @@ public class Research {
|
||||
* @since 4.0
|
||||
*/
|
||||
public static Research getByID(int id) {
|
||||
for (Research research: list) {
|
||||
for (Research research: list()) {
|
||||
if (research.getID() == id) return research;
|
||||
}
|
||||
return null;
|
||||
@ -452,4 +418,9 @@ public class Research {
|
||||
public static List<Research> getResearches(String uuid) {
|
||||
return getResearches(UUID.fromString(uuid));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Research {" + id + "," + name + "}";
|
||||
}
|
||||
}
|
@ -16,7 +16,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
* @see Category
|
||||
* @see LockedCategory
|
||||
*/
|
||||
public class SeasonCategory extends Category {
|
||||
public class SeasonalCategory extends Category {
|
||||
|
||||
private int month = -1;
|
||||
|
||||
@ -32,7 +32,7 @@ public class SeasonCategory extends Category {
|
||||
*
|
||||
* @since 4.0
|
||||
*/
|
||||
public SeasonCategory(int month, int tier, ItemStack item) {
|
||||
public SeasonalCategory(int month, int tier, ItemStack item) {
|
||||
super(item, tier);
|
||||
this.month = month - 1;
|
||||
}
|
@ -6,9 +6,30 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@FunctionalInterface
|
||||
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);
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class ChargableItem extends SlimefunItem {
|
||||
|
||||
String chargeType;
|
||||
private String chargeType;
|
||||
|
||||
public ChargableItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) {
|
||||
super(category, item, id, recipeType, recipe);
|
||||
@ -19,6 +19,8 @@ public class ChargableItem extends SlimefunItem {
|
||||
this.chargeType = chargeType;
|
||||
}
|
||||
|
||||
public String getChargeType() { return this.chargeType; }
|
||||
public String getChargeType() {
|
||||
return chargeType;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,13 +1,13 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
|
||||
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class ChargedItem extends SlimefunItem {
|
||||
|
||||
String chargeType;
|
||||
private String chargeType;
|
||||
|
||||
public ChargedItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) {
|
||||
super(category, item, id, recipeType, recipe);
|
||||
@ -19,6 +19,8 @@ public class ChargedItem extends SlimefunItem {
|
||||
this.chargeType = chargeType;
|
||||
}
|
||||
|
||||
public String getChargeType() { return this.chargeType; }
|
||||
public String getChargeType() {
|
||||
return chargeType;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class DamagableChargableItem extends SlimefunItem {
|
||||
|
||||
String chargeType;
|
||||
private String chargeType;
|
||||
|
||||
public DamagableChargableItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, String chargeType) {
|
||||
super(category, item, id, recipeType, recipe);
|
||||
@ -19,6 +19,8 @@ public class DamagableChargableItem extends SlimefunItem {
|
||||
this.chargeType = chargeType;
|
||||
}
|
||||
|
||||
public String getChargeType() { return this.chargeType; }
|
||||
public String getChargeType() {
|
||||
return this.chargeType;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,36 +1,42 @@
|
||||
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.potion.PotionEffect;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.Lists.Categories;
|
||||
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
|
||||
import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||
|
||||
/**
|
||||
* @since 4.0
|
||||
*/
|
||||
public class EnderTalisman extends SlimefunItem {
|
||||
|
||||
private String suffix;
|
||||
private boolean consumable;
|
||||
private boolean cancel;
|
||||
private PotionEffect[] effects;
|
||||
private int chance;
|
||||
public class EnderTalisman extends Talisman {
|
||||
|
||||
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());
|
||||
this.consumable = parent.isConsumable();
|
||||
this.cancel = parent.isEventCancelled();
|
||||
this.suffix = parent.getSuffix();
|
||||
this.effects = parent.getEffects();
|
||||
this.chance = parent.getChance();
|
||||
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});
|
||||
|
||||
consumable = parent.isConsumable();
|
||||
cancel = parent.isEventCancelled();
|
||||
suffix = parent.getSuffix();
|
||||
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");
|
||||
}
|
||||
|
||||
public String getSuffix() { return this.suffix; }
|
||||
public boolean isConsumable() { return this.consumable; }
|
||||
public boolean isEventCancelled() { return this.cancel; }
|
||||
public PotionEffect[] getEffects() { return this.effects; }
|
||||
public int getChance() { return this.chance; }
|
||||
@Override
|
||||
public ItemStack upgrade() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@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
|
||||
}
|
||||
}
|
||||
|
@ -1,18 +1,22 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
|
||||
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||
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 java.util.Random;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Furnace;
|
||||
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) {
|
||||
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.efficiency = efficiency - 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() {
|
||||
@ -59,9 +36,38 @@ public class EnhancedFurnace extends SlimefunItem {
|
||||
|
||||
public int getOutput() {
|
||||
int fortune = this.fortune;
|
||||
fortune = SlimefunStartup.randomize(fortune + 2) - 1;
|
||||
fortune = new Random().nextInt(fortune + 2) - 1;
|
||||
if (fortune <= 0) fortune = 0;
|
||||
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;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
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 {
|
||||
|
||||
|
@ -4,7 +4,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
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 {
|
||||
|
||||
|
@ -4,7 +4,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
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 {
|
||||
|
||||
|
@ -4,8 +4,9 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
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 ExcludedTool(Category category, ItemStack item, String id,RecipeType recipeType, ItemStack[] recipe) {
|
||||
|
@ -1,5 +0,0 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.Interfaces;
|
||||
|
||||
public interface NotPlaceable {
|
||||
|
||||
}
|
@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class JetBoots extends DamagableChargableItem {
|
||||
|
||||
double speed;
|
||||
private double speed;
|
||||
|
||||
public JetBoots(ItemStack item, String id, ItemStack[] recipe, double speed) {
|
||||
super(Categories.TECH, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe, "Jet Boots");
|
||||
|
@ -7,7 +7,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class Jetpack extends DamagableChargableItem {
|
||||
|
||||
double thrust;
|
||||
private double thrust;
|
||||
|
||||
public Jetpack(ItemStack item, String id, ItemStack[] recipe, double thrust) {
|
||||
super(Categories.TECH, item, id, RecipeType.ENHANCED_CRAFTING_TABLE, recipe, "Jetpack");
|
||||
|
@ -11,7 +11,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
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) {
|
||||
super(Categories.TECH, item, id, recipeType, recipe, "Multi Tool", keys, values);
|
||||
@ -19,11 +19,9 @@ public class MultiTool extends DamagableChargableItem {
|
||||
|
||||
@Override
|
||||
public void create() {
|
||||
List<Integer> list = new ArrayList<Integer>();
|
||||
List<Integer> list = new ArrayList<>();
|
||||
for (int i = 0; i < 50; i++) {
|
||||
if (Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled") != null) {
|
||||
if ((Boolean) Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled")) list.add(i);
|
||||
}
|
||||
if (Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled") != null && (Boolean) Slimefun.getItemValue(this.getID(), "mode." + i + ".enabled")) list.add(i);
|
||||
}
|
||||
this.modes = list;
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
}
|
@ -8,7 +8,7 @@ import org.bukkit.potion.PotionEffect;
|
||||
|
||||
public class SlimefunArmorPiece extends SlimefunItem {
|
||||
|
||||
PotionEffect[] effects;
|
||||
private PotionEffect[] effects;
|
||||
|
||||
public SlimefunArmorPiece(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, PotionEffect[] effects) {
|
||||
super(category, item, id, recipeType, recipe);
|
||||
@ -20,6 +20,8 @@ public class SlimefunArmorPiece extends SlimefunItem {
|
||||
this.effects = effects;
|
||||
}
|
||||
|
||||
public PotionEffect[] getEffects() { return this.effects; }
|
||||
public PotionEffect[] getEffects() {
|
||||
return this.effects;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
|
||||
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) {
|
||||
super(category, item, id, recipeType, recipe);
|
||||
@ -15,4 +15,8 @@ public class SlimefunBackpack extends SlimefunItem {
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,33 +3,37 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
|
||||
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;
|
||||
List<ItemStack> display_recipes;
|
||||
public class SlimefunGadget extends SlimefunItem implements RecipeDisplayItem {
|
||||
|
||||
private List<ItemStack[]> recipes;
|
||||
private List<ItemStack> displayRecipes;
|
||||
|
||||
public SlimefunGadget(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe, ItemStack[] machineRecipes) {
|
||||
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) {
|
||||
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) {
|
||||
super(category, item, id, recipeType, recipe, keys, values);
|
||||
this.recipes = new ArrayList<ItemStack[]>();
|
||||
this.display_recipes = new ArrayList<ItemStack>();
|
||||
this.recipes = new ArrayList<>();
|
||||
this.displayRecipes = new ArrayList<>();
|
||||
|
||||
for (ItemStack i: machineRecipes) {
|
||||
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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getDisplayRecipes() {
|
||||
return this.display_recipes;
|
||||
return this.displayRecipes;
|
||||
}
|
||||
|
||||
public void addRecipe(ItemStack input, ItemStack output) {
|
||||
this.recipes.add(new ItemStack[] {input});
|
||||
this.recipes.add(new ItemStack[] {output});
|
||||
this.display_recipes.add(input);
|
||||
this.display_recipes.add(output);
|
||||
this.displayRecipes.add(input);
|
||||
this.displayRecipes.add(output);
|
||||
}
|
||||
}
|
||||
|
@ -2,11 +2,10 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -15,37 +14,26 @@ import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.SlimefunStartup;
|
||||
import me.mrCookieSlime.Slimefun.AncientAltar.AltarRecipe;
|
||||
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.Research;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunBlockHandler;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.ItemHandler;
|
||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||
import me.mrCookieSlime.Slimefun.Objects.handlers.ItemHandler;
|
||||
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
|
||||
import me.mrCookieSlime.Slimefun.ancient_altar.AltarRecipe;
|
||||
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.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.inventory.BlockMenu;
|
||||
|
||||
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 hash;
|
||||
private State state;
|
||||
@ -53,27 +41,29 @@ public class SlimefunItem {
|
||||
private Category category;
|
||||
private ItemStack[] recipe;
|
||||
private RecipeType recipeType;
|
||||
private ItemStack recipeOutput = null;
|
||||
protected ItemStack recipeOutput = null;
|
||||
private Research research;
|
||||
private int month = -1;
|
||||
private boolean enchantable = true, disenchantable = true;
|
||||
private boolean enchantable = true;
|
||||
private boolean disenchantable = true;
|
||||
private boolean hidden = false;
|
||||
private boolean replacing = false;
|
||||
private boolean addon = false;
|
||||
private String permission = "";
|
||||
private Set<ItemHandler> itemhandlers = new HashSet<ItemHandler>();
|
||||
private Set<ItemHandler> itemhandlers = new HashSet<>();
|
||||
private boolean ticking = false;
|
||||
private BlockTicker blockTicker;
|
||||
private EnergyTicker energyTicker;
|
||||
private String[] keys = null;
|
||||
private Object[] values = null;
|
||||
private String wiki = null;
|
||||
|
||||
/**
|
||||
* Defines whether a SlimefunItem is enabled, disabled or fall-back to its vanilla behavior.
|
||||
*
|
||||
* @since 4.1.10
|
||||
*/
|
||||
public enum State {
|
||||
public static enum State {
|
||||
/**
|
||||
* This SlimefunItem is enabled.
|
||||
*/
|
||||
@ -155,7 +145,10 @@ public class SlimefunItem {
|
||||
* @since 4.1.11, rename of {@link #getName()}.
|
||||
*/
|
||||
public String getID() { return id; }
|
||||
|
||||
@Deprecated
|
||||
public String getHash() { return hash; }
|
||||
|
||||
public State getState() { return state; }
|
||||
public ItemStack getItem() { return item; }
|
||||
public Category getCategory() { return category; }
|
||||
@ -209,68 +202,76 @@ public class SlimefunItem {
|
||||
public void register(boolean slimefun) {
|
||||
this.addon = !slimefun;
|
||||
try {
|
||||
if (map_id.containsKey(this.id)) throw new IllegalArgumentException("ID \"" + this.id + "\" already exists");
|
||||
if (this.recipe.length < 9) this.recipe = new ItemStack[] {null, null, null, null, null, null, null, null, null};
|
||||
all.add(this);
|
||||
preRegister();
|
||||
|
||||
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".enabled", true);
|
||||
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".can-be-used-in-workbenches", this.replacing);
|
||||
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".hide-in-guide", this.hidden);
|
||||
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".allow-enchanting", this.enchantable);
|
||||
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".allow-disenchanting", this.disenchantable);
|
||||
SlimefunStartup.getItemCfg().setDefaultValue(this.id + ".required-permission", this.permission);
|
||||
if (SlimefunPlugin.getUtilities().itemIDs.containsKey(this.id)) {
|
||||
throw new IllegalArgumentException("ID \"" + this.id + "\" already exists");
|
||||
}
|
||||
if (this.recipe.length < 9) this.recipe = new ItemStack[] {null, null, null, null, null, null, null, null, null};
|
||||
SlimefunPlugin.getUtilities().allItems.add(this);
|
||||
|
||||
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) {
|
||||
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()) {
|
||||
SlimefunStartup.getWhitelist().setDefaultValue(world.getName() + ".enabled", true);
|
||||
SlimefunStartup.getWhitelist().setDefaultValue(world.getName() + ".enabled-items." + this.id, true);
|
||||
SlimefunPlugin.getWhitelist().setDefaultValue(world.getName() + ".enabled", 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;
|
||||
return;
|
||||
}
|
||||
|
||||
if (SlimefunStartup.getItemCfg().getBoolean(id + ".enabled")) {
|
||||
if (SlimefunPlugin.getItemCfg().getBoolean(id + ".enabled")) {
|
||||
if (!Category.list().contains(category)) category.register();
|
||||
|
||||
this.state = State.ENABLED;
|
||||
|
||||
this.replacing = SlimefunStartup.getItemCfg().getBoolean(this.id + ".can-be-used-in-workbenches");
|
||||
this.hidden = SlimefunStartup.getItemCfg().getBoolean(this.id + ".hide-in-guide");
|
||||
this.enchantable = SlimefunStartup.getItemCfg().getBoolean(this.id + ".allow-enchanting");
|
||||
this.disenchantable = SlimefunStartup.getItemCfg().getBoolean(this.id + ".allow-disenchanting");
|
||||
this.permission = SlimefunStartup.getItemCfg().getString(this.id + ".required-permission");
|
||||
items.add(this);
|
||||
if (slimefun) vanilla++;
|
||||
map_id.put(this.id, this);
|
||||
this.create();
|
||||
this.replacing = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".can-be-used-in-workbenches");
|
||||
this.hidden = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".hide-in-guide");
|
||||
this.enchantable = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".allow-enchanting");
|
||||
this.disenchantable = SlimefunPlugin.getItemCfg().getBoolean(this.id + ".allow-disenchanting");
|
||||
this.permission = SlimefunPlugin.getItemCfg().getString(this.id + ".required-permission");
|
||||
SlimefunPlugin.getUtilities().enabledItems.add(this);
|
||||
if (slimefun) SlimefunPlugin.getUtilities().vanillaItems++;
|
||||
SlimefunPlugin.getUtilities().itemIDs.put(this.id, this);
|
||||
|
||||
create();
|
||||
|
||||
for (ItemHandler handler: itemhandlers) {
|
||||
Set<ItemHandler> handlerset = getHandlers(handler.toCodename());
|
||||
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 {
|
||||
if (this instanceof VanillaItem) this.state = State.VANILLA;
|
||||
else this.state = State.DISABLED;
|
||||
}
|
||||
|
||||
postRegister();
|
||||
} catch(Exception x) {
|
||||
System.err.println("[Slimefun] Item Registration failed: " + this.id);
|
||||
x.printStackTrace();
|
||||
Slimefun.getLogger().log(Level.WARNING, "Registering the Item '" + id + "' for Slimefun " + Slimefun.getVersion() + " has failed", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static List<SlimefunItem> list() {
|
||||
return items;
|
||||
return SlimefunPlugin.getUtilities().enabledItems;
|
||||
}
|
||||
|
||||
public void bindToResearch(Research r) {
|
||||
@ -278,6 +279,7 @@ public class SlimefunItem {
|
||||
this.research = r;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void setHash(String hash) {
|
||||
this.hash = hash;
|
||||
}
|
||||
@ -308,24 +310,26 @@ public class SlimefunItem {
|
||||
*/
|
||||
@Deprecated
|
||||
public static SlimefunItem getByName(String name) {
|
||||
return map_id.get(name);
|
||||
return getByID(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.1.11, rename of {@link #getByName(String)}.
|
||||
*/
|
||||
public static SlimefunItem getByID(String id) {
|
||||
return map_id.get(id);
|
||||
return SlimefunPlugin.getUtilities().itemIDs.get(id);
|
||||
}
|
||||
|
||||
public static SlimefunItem getByItem(ItemStack item) {
|
||||
if (item == null) return null;
|
||||
for (SlimefunItem sfi: items) {
|
||||
if (sfi instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
||||
else if (sfi instanceof DamagableChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
||||
else if (sfi instanceof ChargedItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
||||
else if (sfi instanceof SlimefunBackpack && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi;
|
||||
else if (SlimefunManager.isItemSimiliar(item, sfi.getItem(), true)) return sfi;
|
||||
for (SlimefunItem sfi: SlimefunPlugin.getUtilities().enabledItems) {
|
||||
if ((sfi instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) ||
|
||||
(sfi instanceof DamagableChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) ||
|
||||
(sfi instanceof ChargedItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) ||
|
||||
(sfi instanceof SlimefunBackpack && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) ||
|
||||
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.REPAIRED_SPAWNER, false)) return getByID("REINFORCED_SPAWNER");
|
||||
@ -347,13 +351,14 @@ public class SlimefunItem {
|
||||
if (recipeOutput != null) output = recipeOutput.clone();
|
||||
|
||||
if (recipeType.toItem().isSimilar(RecipeType.MOB_DROP.toItem())) {
|
||||
String mob = ChatColor.stripColor(recipe[4].getItemMeta().getDisplayName()).toUpperCase().replace(" ", "_");
|
||||
try {
|
||||
EntityType entity = EntityType.valueOf(ChatColor.stripColor(recipe[4].getItemMeta().getDisplayName()).toUpperCase().replace(" ", "_"));
|
||||
List<ItemStack> dropping = new ArrayList<ItemStack>();
|
||||
if (SlimefunManager.drops.containsKey(entity)) dropping = SlimefunManager.drops.get(entity);
|
||||
EntityType entity = EntityType.valueOf(mob);
|
||||
List<ItemStack> dropping = SlimefunPlugin.getUtilities().drops.getOrDefault(entity, new ArrayList<>());
|
||||
dropping.add(output);
|
||||
SlimefunManager.drops.put(entity, dropping);
|
||||
SlimefunPlugin.getUtilities().drops.put(entity, dropping);
|
||||
} 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())) {
|
||||
@ -362,14 +367,15 @@ public class SlimefunItem {
|
||||
else if (recipeType.getMachine() != null && getByID(recipeType.getMachine().getID()) instanceof SlimefunMachine) {
|
||||
((SlimefunMachine) getByID(recipeType.getMachine().getID())).addRecipe(recipe, output);
|
||||
}
|
||||
|
||||
install();
|
||||
} 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) {
|
||||
for (SlimefunItem i: all) {
|
||||
for (SlimefunItem i: SlimefunPlugin.getUtilities().allItems) {
|
||||
if (i.isItem(item)) {
|
||||
return i.getState();
|
||||
}
|
||||
@ -378,7 +384,7 @@ public class SlimefunItem {
|
||||
}
|
||||
|
||||
public static boolean isDisabled(ItemStack item) {
|
||||
for (SlimefunItem i: all) {
|
||||
for (SlimefunItem i: SlimefunPlugin.getUtilities().allItems) {
|
||||
if (i.isItem(item)) {
|
||||
return i.isDisabled();
|
||||
}
|
||||
@ -386,8 +392,26 @@ public class SlimefunItem {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void install() {}
|
||||
public void create() {}
|
||||
@Deprecated
|
||||
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) {
|
||||
this.itemhandlers.addAll(Arrays.asList(handler));
|
||||
@ -395,12 +419,12 @@ public class SlimefunItem {
|
||||
for (ItemHandler h: handler) {
|
||||
if (h instanceof BlockTicker) {
|
||||
this.ticking = true;
|
||||
tickers.add(getID());
|
||||
SlimefunPlugin.getUtilities().tickers.add(getID());
|
||||
this.blockTicker = (BlockTicker) h;
|
||||
}
|
||||
else if (h instanceof EnergyTicker) {
|
||||
this.energyTicker = (EnergyTicker) h;
|
||||
EnergyNet.registerComponent(getID(), NetworkComponent.SOURCE);
|
||||
EnergyNet.registerComponent(getID(), EnergyNetComponent.SOURCE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -415,23 +439,40 @@ public class SlimefunItem {
|
||||
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) {
|
||||
blockhandler.put(getID(), handler);
|
||||
SlimefunPlugin.getUtilities().blockHandlers.put(getID(), handler);
|
||||
register(vanilla);
|
||||
}
|
||||
|
||||
public void register(SlimefunBlockHandler handler) {
|
||||
blockhandler.put(getID(), handler);
|
||||
SlimefunPlugin.getUtilities().blockHandlers.put(getID(), handler);
|
||||
register(false);
|
||||
}
|
||||
|
||||
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<>();
|
||||
}
|
||||
|
||||
public static void setRadioactive(ItemStack item) {
|
||||
radioactive.add(item);
|
||||
SlimefunPlugin.getUtilities().radioactiveItems.add(item);
|
||||
}
|
||||
|
||||
public static ItemStack getItem(String id) {
|
||||
@ -442,13 +483,14 @@ public class SlimefunItem {
|
||||
public static void patchExistingItem(String id, ItemStack stack) {
|
||||
SlimefunItem item = getByID(id);
|
||||
if (item != null) {
|
||||
System.out.println("[Slimefun] WARNING - Patching existing Item - " + id);
|
||||
System.out.println("[Slimefun] This might take a while");
|
||||
Slimefun.getLogger().log(Level.INFO, "Patching existing Item... {0}", id);
|
||||
Slimefun.getLogger().log(Level.INFO, "This might take a while");
|
||||
|
||||
final ItemStack old = item.getItem();
|
||||
item.setItem(stack);
|
||||
for (SlimefunItem sfi: list()) {
|
||||
ItemStack[] recipe = sfi.getRecipe();
|
||||
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (SlimefunManager.isItemSimiliar(recipe[i], old, true)) recipe[i] = stack;
|
||||
}
|
||||
@ -464,7 +506,7 @@ public class SlimefunItem {
|
||||
public void registerChargeableBlock(boolean slimefun, int capacity) {
|
||||
this.register(slimefun);
|
||||
ChargableBlock.registerChargableBlock(id, capacity, true);
|
||||
EnergyNet.registerComponent(id, NetworkComponent.CONSUMER);
|
||||
EnergyNet.registerComponent(id, EnergyNetComponent.CONSUMER);
|
||||
}
|
||||
|
||||
public void registerUnrechargeableBlock(boolean slimefun, int capacity) {
|
||||
@ -479,25 +521,35 @@ public class SlimefunItem {
|
||||
|
||||
public void registerEnergyDistributor(boolean slimefun) {
|
||||
this.register(slimefun);
|
||||
EnergyNet.registerComponent(id, NetworkComponent.DISTRIBUTOR);
|
||||
EnergyNet.registerComponent(id, EnergyNetComponent.DISTRIBUTOR);
|
||||
}
|
||||
|
||||
public void registerDistibutingCapacitor(boolean slimefun, final int capacity) {
|
||||
this.register(slimefun);
|
||||
EnergyNet.registerComponent(id, NetworkComponent.DISTRIBUTOR);
|
||||
EnergyNet.registerComponent(id, EnergyNetComponent.DISTRIBUTOR);
|
||||
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) {
|
||||
this.item = stack;
|
||||
}
|
||||
|
||||
public static boolean isTicking(String item) {
|
||||
return tickers.contains(item);
|
||||
return SlimefunPlugin.getUtilities().tickers.contains(item);
|
||||
}
|
||||
|
||||
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) {
|
||||
@ -510,6 +562,19 @@ public class SlimefunItem {
|
||||
}
|
||||
|
||||
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 + ")";
|
||||
}
|
||||
}
|
||||
|
@ -1,33 +1,24 @@
|
||||
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.Objects.Category;
|
||||
import me.mrCookieSlime.Slimefun.Objects.MultiBlock;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem;
|
||||
|
||||
import org.bukkit.Material;
|
||||
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 {
|
||||
public class SlimefunMachine extends SlimefunItem implements RecipeDisplayItem {
|
||||
|
||||
private List<ItemStack[]> recipes;
|
||||
private List<ItemStack> shownRecipes;
|
||||
private Material trigger;
|
||||
//Adjacent blockfaces for iterative output chest checks
|
||||
private static final BlockFace[] outputFaces = {
|
||||
BlockFace.UP,
|
||||
BlockFace.NORTH,
|
||||
BlockFace.EAST,
|
||||
BlockFace.SOUTH,
|
||||
BlockFace.WEST
|
||||
};
|
||||
|
||||
protected List<ItemStack> shownRecipes;
|
||||
|
||||
public SlimefunMachine(Category category, ItemStack item, String id, ItemStack[] recipe, ItemStack[] machineRecipes, Material trigger) {
|
||||
super(category, item, id, RecipeType.MULTIBLOCK, recipe);
|
||||
@ -54,20 +45,17 @@ public class SlimefunMachine extends SlimefunItem {
|
||||
}
|
||||
|
||||
public List<ItemStack[]> getRecipes() {
|
||||
return this.recipes;
|
||||
return recipes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getDisplayRecipes() {
|
||||
return this.shownRecipes;
|
||||
}
|
||||
|
||||
public static BlockFace[] getOutputFaces() {
|
||||
return outputFaces;
|
||||
return shownRecipes;
|
||||
}
|
||||
|
||||
public void addRecipe(ItemStack[] input, ItemStack output) {
|
||||
this.recipes.add(input);
|
||||
this.recipes.add(new ItemStack[] {output});
|
||||
recipes.add(input);
|
||||
recipes.add(new ItemStack[] {output});
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -79,8 +67,9 @@ public class SlimefunMachine extends SlimefunItem {
|
||||
public void install() {
|
||||
for (ItemStack i: this.getDisplayRecipes()) {
|
||||
SlimefunItem item = SlimefunItem.getByItem(i);
|
||||
if (item == null) this.recipes.add(new ItemStack[] {i});
|
||||
else if (!SlimefunItem.isDisabled(i)) this.recipes.add(new ItemStack[] {i});
|
||||
if (item == null || !SlimefunItem.isDisabled(i)) {
|
||||
this.recipes.add(new ItemStack[] {i});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -99,34 +88,4 @@ public class SlimefunMachine extends SlimefunItem {
|
||||
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;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -5,11 +5,18 @@ import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
/**
|
||||
* Represents an Item that will not drop on death.
|
||||
*
|
||||
* @author TheBusyBiscuit
|
||||
*
|
||||
*/
|
||||
public class SoulboundItem extends SlimefunItem {
|
||||
|
||||
public SoulboundItem(Category category, ItemStack item, String id, ItemStack[] recipe) {
|
||||
super(category, item, id, RecipeType.MAGIC_WORKBENCH, recipe);
|
||||
}
|
||||
|
||||
public SoulboundItem(Category category, ItemStack item, String id, RecipeType type, ItemStack[] recipe) {
|
||||
super(category, item, id, type, recipe);
|
||||
}
|
||||
|
@ -2,14 +2,7 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
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 java.util.Random;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -23,16 +16,24 @@ import org.bukkit.event.player.PlayerEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
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
|
||||
*/
|
||||
public class Talisman extends SlimefunItem {
|
||||
|
||||
private String suffix;
|
||||
private boolean consumable = true;
|
||||
private boolean cancel = true;
|
||||
private PotionEffect[] effects;
|
||||
private int chance = 100;
|
||||
protected String suffix;
|
||||
protected boolean consumable = true;
|
||||
protected boolean cancel = true;
|
||||
protected PotionEffect[] effects;
|
||||
protected int chance = 100;
|
||||
|
||||
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));
|
||||
@ -52,12 +53,16 @@ public class Talisman extends SlimefunItem {
|
||||
}
|
||||
|
||||
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.effects = effects;
|
||||
this.chance = chance;
|
||||
}
|
||||
|
||||
protected Talisman(Category category, ItemStack item, String id, ItemStack[] recipe) {
|
||||
super(category, item, id, RecipeType.MAGIC_WORKBENCH, recipe);
|
||||
}
|
||||
|
||||
public String getSuffix() {
|
||||
return this.suffix;
|
||||
}
|
||||
@ -78,13 +83,45 @@ public class Talisman extends SlimefunItem {
|
||||
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) {
|
||||
if (!(item instanceof Talisman)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Talisman talisman = (Talisman) item;
|
||||
if (!SlimefunStartup.chance(100, talisman.getChance())) {
|
||||
if (new Random().nextInt(100) < talisman.getChance()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -108,39 +145,6 @@ public class Talisman extends SlimefunItem {
|
||||
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){
|
||||
|
@ -5,17 +5,12 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
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.general.Inventory.ChestMenu.AdvancedMenuClickHandler;
|
||||
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.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.Objects.SlimefunItem.handlers.BlockTicker;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.InventoryBlock;
|
||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
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.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, Integer> progress = new HashMap<Block, Integer>();
|
||||
public static Map<Block, MachineRecipe> processing = new HashMap<>();
|
||||
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_in = {9, 10, 11, 12, 18, 21, 27, 28, 29, 30};
|
||||
@ -48,140 +41,53 @@ public abstract class AContainer extends SlimefunItem {
|
||||
public AContainer(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) {
|
||||
super(category, item, id, recipeType, recipe);
|
||||
|
||||
new BlockMenuPreset(id, getInventoryTitle()) {
|
||||
createPreset(this, getInventoryTitle(), this::constructMenu);
|
||||
|
||||
@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);
|
||||
}
|
||||
registerBlockHandler(id, (p, b, tool, 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);
|
||||
processing.remove(b);
|
||||
return true;
|
||||
}
|
||||
|
||||
progress.remove(b);
|
||||
processing.remove(b);
|
||||
return true;
|
||||
});
|
||||
|
||||
this.registerDefaultRecipes();
|
||||
}
|
||||
|
||||
public AContainer(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.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();
|
||||
this(category, item, id, recipeType, recipe);
|
||||
this.recipeOutput = recipeOutput;
|
||||
}
|
||||
|
||||
protected void constructMenu(BlockMenuPreset preset) {
|
||||
for (int i : border) {
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "),
|
||||
(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(i, new CustomItem(new ItemStack(Material.GRAY_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 : 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), " "), (p, slot, item, action) -> false);
|
||||
|
||||
for (int i : getOutputSlots()) {
|
||||
preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() {
|
||||
@ -201,15 +107,31 @@ public abstract class AContainer extends SlimefunItem {
|
||||
|
||||
public abstract String getInventoryTitle();
|
||||
public abstract ItemStack getProgressBar();
|
||||
public abstract void registerDefaultRecipes();
|
||||
public abstract int getEnergyConsumption();
|
||||
public abstract int getSpeed();
|
||||
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() {
|
||||
return new int[] {19, 20};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getOutputSlots() {
|
||||
return new int[] {24, 25};
|
||||
}
|
||||
@ -231,33 +153,8 @@ public abstract class AContainer extends SlimefunItem {
|
||||
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
|
||||
public void register(boolean slimefun) {
|
||||
public void preRegister() {
|
||||
addItemHandler(new BlockTicker() {
|
||||
|
||||
@Override
|
||||
@ -265,35 +162,18 @@ public abstract class AContainer extends SlimefunItem {
|
||||
AContainer.this.tick(b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void uniqueTick() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSynchronized() {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
super.register(slimefun);
|
||||
}
|
||||
|
||||
protected void tick(Block b) {
|
||||
if (isProcessing(b)) {
|
||||
int timeleft = progress.get(b);
|
||||
if (timeleft > 0) {
|
||||
ItemStack item = getProgressBar().clone();
|
||||
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);
|
||||
MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar());
|
||||
|
||||
if (ChargableBlock.isChargable(b)) {
|
||||
if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
|
||||
@ -312,30 +192,31 @@ public abstract class AContainer extends SlimefunItem {
|
||||
}
|
||||
else {
|
||||
MachineRecipe r = null;
|
||||
Map<Integer, Integer> found = new HashMap<Integer, Integer>();
|
||||
outer:
|
||||
Map<Integer, Integer> found = new HashMap<>();
|
||||
|
||||
for (MachineRecipe recipe: recipes) {
|
||||
for (ItemStack input: recipe.getInput()) {
|
||||
slots:
|
||||
for (int slot: getInputSlots()) {
|
||||
if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), input, true)) {
|
||||
found.put(slot, input.getAmount());
|
||||
break slots;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found.size() == recipe.getInput().length) {
|
||||
r = recipe;
|
||||
break outer;
|
||||
break;
|
||||
}
|
||||
else found.clear();
|
||||
}
|
||||
|
||||
if (r != null) {
|
||||
if (!fits(b, r.getOutput())) return;
|
||||
|
||||
for (Map.Entry<Integer, Integer> entry: found.entrySet()) {
|
||||
BlockStorage.getInventory(b).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(entry.getKey()), entry.getValue()));
|
||||
}
|
||||
|
||||
processing.put(b, r);
|
||||
progress.put(b, r.getTicks());
|
||||
}
|
||||
|
@ -1,15 +1,10 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
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.general.Inventory.ClickAction;
|
||||
@ -21,7 +16,6 @@ import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||
import me.mrCookieSlime.Slimefun.Setup.Messages;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
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.item_transport.ItemTransportFlow;
|
||||
|
||||
@ -77,10 +71,6 @@ public abstract class ADrill extends AContainer {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void newInstance(BlockMenu menu, Block b) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canOpen(Block b, Player p) {
|
||||
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
|
||||
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
|
||||
if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots();
|
||||
if (flow == ItemTransportFlow.INSERT) return getInputSlots();
|
||||
else return getOutputSlots();
|
||||
}
|
||||
};
|
||||
@ -110,22 +100,12 @@ public abstract class ADrill extends AContainer {
|
||||
@Override
|
||||
public void registerDefaultRecipes() {}
|
||||
|
||||
@Override
|
||||
protected void tick(Block b) {
|
||||
if (isProcessing(b)) {
|
||||
int timeleft = progress.get(b);
|
||||
if (timeleft > 0) {
|
||||
ItemStack item = getProgressBar().clone();
|
||||
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);
|
||||
MachineHelper.updateProgressbar(BlockStorage.getInventory(b), 22, timeleft, processing.get(b).getTicks(), getProgressBar());
|
||||
|
||||
if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
|
||||
ChargableBlock.addCharge(b, -getEnergyConsumption());
|
||||
|
@ -16,10 +16,8 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction;
|
||||
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.SlimefunBlockHandler;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers.BlockTicker;
|
||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock;
|
||||
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
|
||||
@ -41,10 +39,6 @@ public abstract class AFarm extends SlimefunItem {
|
||||
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);
|
||||
@ -52,96 +46,35 @@ public abstract class AFarm extends SlimefunItem {
|
||||
|
||||
@Override
|
||||
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
|
||||
if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();
|
||||
if (flow == 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);
|
||||
}
|
||||
registerBlockHandler(id, (p, b, tool, 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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
private void constructMenu(BlockMenuPreset preset) {
|
||||
for (int i : border) {
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_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(i, new CustomItem(new ItemStack(Material.GRAY_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 : 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()) {
|
||||
preset.addMenuClickHandler(i, new AdvancedMenuClickHandler() {
|
||||
@ -173,24 +106,29 @@ public abstract class AFarm extends SlimefunItem {
|
||||
if (ChargableBlock.isChargable(b)) {
|
||||
if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
|
||||
int i = getSize() / 2;
|
||||
loop:
|
||||
for (int x = -i; x <= i; x++) {
|
||||
for (int z = -i; z <= i; z++) {
|
||||
Block block = new Location(b.getWorld(), b.getX() + x, b.getY() + 2, b.getZ() + z).getBlock();
|
||||
if (canHarvest(block)) {
|
||||
ItemStack item = harvest(block);
|
||||
if (!fits(block, new ItemStack[] {item})) break loop;
|
||||
pushItems(b, new ItemStack[] {item});
|
||||
ChargableBlock.addCharge(b, -getEnergyConsumption());
|
||||
break loop;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int x = -i; x <= i; x++) {
|
||||
for (int z = -i; z <= i; z++) {
|
||||
Block block = new Location(b.getWorld(), b.getX() + (double) x, b.getY() + 2.0, b.getZ() + (double) z).getBlock();
|
||||
if (canHarvest(block)) {
|
||||
ItemStack item = harvest(block);
|
||||
|
||||
if (!fits(block, item)) {
|
||||
return;
|
||||
}
|
||||
|
||||
pushItems(b, item);
|
||||
ChargableBlock.addCharge(b, -getEnergyConsumption());
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(boolean slimefun) {
|
||||
public void preRegister() {
|
||||
addItemHandler(new BlockTicker() {
|
||||
|
||||
@Override
|
||||
@ -198,36 +136,32 @@ public abstract class AFarm extends SlimefunItem {
|
||||
AFarm.this.tick(b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void uniqueTick() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSynchronized() {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
super.register(slimefun);
|
||||
}
|
||||
|
||||
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) {
|
||||
protected boolean fits(Block b, ItemStack... items) {
|
||||
return inject(b).addItem(items).isEmpty();
|
||||
}
|
||||
|
||||
protected void pushItems(Block b, ItemStack[] items) {
|
||||
protected void pushItems(Block b, ItemStack... items) {
|
||||
Inventory inv = inject(b);
|
||||
inv.addItem(items);
|
||||
|
||||
|
@ -1,9 +1,7 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
@ -15,8 +13,6 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
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;
|
||||
@ -27,9 +23,7 @@ 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.SlimefunBlockHandler;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.UnregisterReason;
|
||||
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
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 static Map<Location, MachineFuel> processing = new HashMap<Location, MachineFuel>();
|
||||
public static Map<Location, Integer> progress = new HashMap<Location, Integer>();
|
||||
public static Map<Location, MachineFuel> processing = new HashMap<>();
|
||||
public static Map<Location, Integer> progress = new HashMap<>();
|
||||
|
||||
private 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_in = {9, 10, 11, 12, 18, 21, 27, 28, 29, 30};
|
||||
@ -59,10 +53,6 @@ public abstract class AGenerator extends SlimefunItem {
|
||||
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);
|
||||
@ -70,116 +60,51 @@ public abstract class AGenerator extends SlimefunItem {
|
||||
|
||||
@Override
|
||||
public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
|
||||
if (flow.equals(ItemTransportFlow.INSERT)) return getInputSlots();
|
||||
if (flow == 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);
|
||||
}
|
||||
registerBlockHandler(id, (p, b, tool, 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;
|
||||
}
|
||||
progress.remove(b.getLocation());
|
||||
processing.remove(b.getLocation());
|
||||
return true;
|
||||
});
|
||||
|
||||
this.registerDefaultRecipes();
|
||||
}
|
||||
|
||||
public AGenerator(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.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();
|
||||
this(category, item, id, recipeType, recipe);
|
||||
this.recipeOutput = recipeOutput;
|
||||
}
|
||||
|
||||
private void constructMenu(BlockMenuPreset preset) {
|
||||
for (int i : border) {
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (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
|
||||
);
|
||||
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(i, new CustomItem(new ItemStack(Material.ORANGE_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
|
||||
}
|
||||
|
||||
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), " "),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
|
||||
}
|
||||
|
||||
public abstract String getInventoryTitle();
|
||||
@ -228,7 +151,7 @@ public abstract class AGenerator extends SlimefunItem {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(boolean slimefun) {
|
||||
public void preRegister() {
|
||||
addItemHandler(new EnergyTicker() {
|
||||
|
||||
@Override
|
||||
@ -236,18 +159,7 @@ public abstract class AGenerator extends SlimefunItem {
|
||||
if (isProcessing(l)) {
|
||||
int timeleft = progress.get(l);
|
||||
if (timeleft > 0) {
|
||||
ItemStack item = getProgressBar().clone();
|
||||
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);
|
||||
MachineHelper.updateProgressbar(BlockStorage.getInventory(l), 22, timeleft, processing.get(l).getTicks(), getProgressBar());
|
||||
|
||||
if (ChargableBlock.isChargable(l)) {
|
||||
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)
|
||||
|| SlimefunManager.isItemSimiliar(fuel, SlimefunItems.BUCKET_OF_FUEL, 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), " "));
|
||||
|
||||
@ -277,25 +189,17 @@ public abstract class AGenerator extends SlimefunItem {
|
||||
}
|
||||
}
|
||||
else {
|
||||
MachineFuel r = null;
|
||||
Map<Integer, Integer> found = new HashMap<Integer, Integer>();
|
||||
outer:
|
||||
for (MachineFuel recipe: recipes) {
|
||||
for (int slot: getInputSlots()) {
|
||||
if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(l).getItemInSlot(slot), recipe.getInput(), true)) {
|
||||
found.put(slot, recipe.getInput().getAmount());
|
||||
r = recipe;
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
BlockMenu menu = BlockStorage.getInventory(l);
|
||||
Map<Integer, Integer> found = new HashMap<>();
|
||||
MachineFuel fuel = findRecipe(menu, found);
|
||||
|
||||
if (r != null) {
|
||||
if (fuel != null) {
|
||||
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;
|
||||
}
|
||||
@ -306,8 +210,19 @@ public abstract class AGenerator extends SlimefunItem {
|
||||
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() {
|
||||
@ -326,7 +241,7 @@ public abstract class AGenerator extends SlimefunItem {
|
||||
return inv;
|
||||
}
|
||||
|
||||
protected void pushItems(Location l, ItemStack[] items) {
|
||||
protected void pushItems(Location l, ItemStack... items) {
|
||||
Inventory inv = inject(l);
|
||||
inv.addItem(items);
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
@ -16,23 +16,21 @@ import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.CSCoreLib;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils;
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
|
||||
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.SlimefunItems;
|
||||
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.Objects.SlimefunItem.machines.ReactorAccessPort;
|
||||
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
|
||||
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.EnergyTicker;
|
||||
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_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_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;
|
||||
|
||||
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){
|
||||
BlockStorage.addBlockInfo(b, "reactor-mode", "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.addMenuClickHandler(4, (p, slot, item, action) -> {
|
||||
@ -98,16 +99,18 @@ public abstract class AReactor extends SlimefunItem {
|
||||
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.addMenuClickHandler(infoSlot, (p, slot, item, action) -> {
|
||||
ap.open(p);
|
||||
port.open(p);
|
||||
newInstance(menu, b);
|
||||
|
||||
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.addMenuClickHandler(infoSlot, (p, slot, item, action) -> {
|
||||
newInstance(menu, b);
|
||||
@ -117,6 +120,7 @@ public abstract class AReactor extends SlimefunItem {
|
||||
}
|
||||
|
||||
} catch(Exception x) {
|
||||
Slimefun.getLogger().log(Level.SEVERE, "An Error occured when creating a Reactor Menu for Slimefun " + Slimefun.getVersion(), x);
|
||||
}
|
||||
}
|
||||
|
||||
@ -132,40 +136,35 @@ public abstract class AReactor extends SlimefunItem {
|
||||
}
|
||||
};
|
||||
|
||||
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 : getFuelSlots()) {
|
||||
if (inv.getItemInSlot(slot) != null) {
|
||||
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
|
||||
inv.replaceExistingItem(slot, null);
|
||||
}
|
||||
}
|
||||
for (int slot : getCoolantSlots()) {
|
||||
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);
|
||||
}
|
||||
registerBlockHandler(id, (p, b, tool, reason) -> {
|
||||
BlockMenu inv = BlockStorage.getInventory(b);
|
||||
if (inv != null) {
|
||||
for (int slot : getFuelSlots()) {
|
||||
if (inv.getItemInSlot(slot) != null) {
|
||||
b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
|
||||
inv.replaceExistingItem(slot, null);
|
||||
}
|
||||
}
|
||||
|
||||
for (int slot : getCoolantSlots()) {
|
||||
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());
|
||||
ReactorHologram.remove(b.getLocation());
|
||||
return true;
|
||||
}
|
||||
|
||||
progress.remove(b.getLocation());
|
||||
processing.remove(b.getLocation());
|
||||
ReactorHologram.remove(b.getLocation());
|
||||
return true;
|
||||
});
|
||||
|
||||
this.registerDefaultRecipes();
|
||||
@ -173,35 +172,23 @@ public abstract class AReactor extends SlimefunItem {
|
||||
|
||||
private void constructMenu(BlockMenuPreset preset) {
|
||||
for (int i : border) {
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
|
||||
}
|
||||
|
||||
for (int i : border_1) {
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
|
||||
}
|
||||
|
||||
for (int i : border_3) {
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.GREEN_STAINED_GLASS_PANE), " "),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.GREEN_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
|
||||
);
|
||||
preset.addItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
|
||||
|
||||
preset.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(1, new CustomItem(SlimefunItems.URANIUM, "&7Fuel Slot", "", "&rThis Slot accepts radioactive Fuel such as:", "&2Uranium &ror &aNeptunium"), (p, slot, item, action) -> false);
|
||||
|
||||
for (int i : border_2) {
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
|
||||
}
|
||||
|
||||
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"));
|
||||
|
||||
for (int i : border_4) {
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.BARRIER), "&cNo Coolant Required"),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.BARRIER), "&cNo Coolant Required"), (p, slot, item, action) -> false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -261,10 +246,10 @@ public abstract class AReactor extends SlimefunItem {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(boolean slimefun) {
|
||||
public void preRegister() {
|
||||
addItemHandler(new EnergyTicker() {
|
||||
|
||||
Set<Location> explode = new HashSet<Location>();
|
||||
private Set<Location> explode = new HashSet<>();
|
||||
|
||||
@Override
|
||||
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")) {
|
||||
progress.put(l, timeleft - 1);
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
|
||||
if (!l.getBlock().getRelative(cooling[CSCoreLib.randomizer().nextInt(cooling.length)]).isLiquid()) explode.add(l);
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> {
|
||||
if (!l.getBlock().getRelative(cooling[new Random().nextInt(cooling.length)]).isLiquid()) explode.add(l);
|
||||
});
|
||||
|
||||
ItemStack item = getProgressBar().clone();
|
||||
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);
|
||||
MachineHelper.updateProgressbar(BlockStorage.getInventory(l), 22, timeleft, processing.get(l).getTicks(), getProgressBar());
|
||||
|
||||
if (needsCooling()) {
|
||||
boolean coolant = (processing.get(l).getTicks() - timeleft) % 25 == 0;
|
||||
@ -352,40 +326,19 @@ public abstract class AReactor extends SlimefunItem {
|
||||
}
|
||||
}
|
||||
else {
|
||||
MachineFuel r = null;
|
||||
Map<Integer, Integer> found = new HashMap<Integer, Integer>();
|
||||
BlockMenu menu = BlockStorage.getInventory(l);
|
||||
Map<Integer, Integer> found = new HashMap<>();
|
||||
MachineFuel fuel = findRecipe(menu, found);
|
||||
|
||||
if (port != null) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (port != null) restockCoolant(l, port);
|
||||
|
||||
outer:
|
||||
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) {
|
||||
if (fuel != null) {
|
||||
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;
|
||||
}
|
||||
@ -397,9 +350,7 @@ public abstract class AReactor extends SlimefunItem {
|
||||
if (explosion) {
|
||||
BlockStorage.getInventory(l).close();
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
|
||||
ReactorHologram.remove(l);
|
||||
}, 0);
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> ReactorHologram.remove(l), 0);
|
||||
|
||||
explode.remove(l);
|
||||
processing.remove(l);
|
||||
@ -408,8 +359,30 @@ public abstract class AReactor extends SlimefunItem {
|
||||
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) {
|
||||
|
@ -4,9 +4,9 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class MachineFuel {
|
||||
|
||||
int seconds;
|
||||
ItemStack fuel;
|
||||
ItemStack output;
|
||||
private int seconds;
|
||||
private ItemStack fuel;
|
||||
private ItemStack output;
|
||||
|
||||
public MachineFuel(int seconds, ItemStack fuel) {
|
||||
this.seconds = seconds * 2;
|
||||
|
@ -1,25 +1,33 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
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 = "";
|
||||
final int minutes = (int) (l / 60L);
|
||||
final int minutes = (int) (seconds / 60L);
|
||||
if (minutes > 0) {
|
||||
timeleft = String.valueOf(timeleft) + minutes + "m ";
|
||||
}
|
||||
l -= minutes * 60;
|
||||
final int seconds = (int)l;
|
||||
seconds -= minutes * 60;
|
||||
timeleft = String.valueOf(timeleft) + seconds + "s";
|
||||
return ChatColor.translateAlternateColorCodes('&', "&7" + timeleft + " left");
|
||||
}
|
||||
|
||||
public static String getProgress(int time, int total) {
|
||||
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");
|
||||
else if (percentage < 32.0F) progress.append("&c");
|
||||
@ -47,7 +55,7 @@ public class MachineHelper {
|
||||
public static String getCoolant(int time, int total) {
|
||||
int passed = ((total - time) % 25);
|
||||
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");
|
||||
else if (percentage < 66.0F) progress.append("&1");
|
||||
@ -71,11 +79,26 @@ public class MachineHelper {
|
||||
|
||||
public static float getPercentage(int time, int total) {
|
||||
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) {
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -4,9 +4,9 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class MachineRecipe {
|
||||
|
||||
int ticks;
|
||||
ItemStack[] input;
|
||||
ItemStack[] output;
|
||||
private int ticks;
|
||||
private ItemStack[] input;
|
||||
private ItemStack[] output;
|
||||
|
||||
public MachineRecipe(int seconds, ItemStack[] input, ItemStack[] output) {
|
||||
this.ticks = seconds * 2;
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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.block.Block;
|
||||
@ -19,6 +21,7 @@ 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.Slimefun;
|
||||
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
|
||||
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
|
||||
import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet;
|
||||
@ -105,7 +108,7 @@ public class AdvancedCargoOutputNode extends SlimefunItem {
|
||||
menu.addMenuClickHandler(41, (p, slot, item, action) -> {
|
||||
int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1;
|
||||
if (channel < 0) {
|
||||
if (CargoNet.EXTRA_CHANNELS) channel = 16;
|
||||
if (CargoNet.extraChannels) channel = 16;
|
||||
else channel = 15;
|
||||
}
|
||||
BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel));
|
||||
@ -132,7 +135,7 @@ public class AdvancedCargoOutputNode extends SlimefunItem {
|
||||
menu.addMenuClickHandler(43, (p, slot, item, action) -> {
|
||||
int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1;
|
||||
|
||||
if (CargoNet.EXTRA_CHANNELS) {
|
||||
if (CargoNet.extraChannels) {
|
||||
if (channeln > 16) channeln = 0;
|
||||
}
|
||||
else {
|
||||
@ -144,8 +147,8 @@ public class AdvancedCargoOutputNode extends SlimefunItem {
|
||||
return false;
|
||||
});
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception x) {
|
||||
Slimefun.getLogger().log(Level.SEVERE, "An Error occured while creating the Inventory of an Advanced Cargo Output Node for Slimefun " + Slimefun.getVersion(), x);
|
||||
}
|
||||
}
|
||||
|
@ -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 java.util.logging.Level;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
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.Setup.Messages;
|
||||
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.BlockMenuPreset;
|
||||
import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet;
|
||||
@ -63,6 +67,7 @@ public class CargoInputNode extends SlimefunItem {
|
||||
Damageable dmg = (Damageable) is.getItemMeta();
|
||||
dmg.setDamage(20);
|
||||
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.addMenuClickHandler(16, (p, slot, item, action) -> {
|
||||
BlockStorage.addBlockInfo(b, "filter-durability", "true");
|
||||
@ -75,6 +80,7 @@ public class CargoInputNode extends SlimefunItem {
|
||||
Damageable dmg = (Damageable) is.getItemMeta();
|
||||
dmg.setDamage(20);
|
||||
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.addMenuClickHandler(16, (p, slot, item, action) -> {
|
||||
BlockStorage.addBlockInfo(b, "filter-durability", "false");
|
||||
@ -121,7 +127,7 @@ public class CargoInputNode extends SlimefunItem {
|
||||
menu.addMenuClickHandler(41, (p, slot, item, action) -> {
|
||||
int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1;
|
||||
if (channel < 0) {
|
||||
if (CargoNet.EXTRA_CHANNELS) channel = 16;
|
||||
if (CargoNet.extraChannels) channel = 16;
|
||||
else channel = 15;
|
||||
}
|
||||
BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel));
|
||||
@ -148,7 +154,7 @@ public class CargoInputNode extends SlimefunItem {
|
||||
menu.addMenuClickHandler(43, (p, slot, item, action) -> {
|
||||
int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1;
|
||||
|
||||
if (CargoNet.EXTRA_CHANNELS) {
|
||||
if (CargoNet.extraChannels) {
|
||||
if (channeln > 16) channeln = 0;
|
||||
}
|
||||
else {
|
||||
@ -160,8 +166,8 @@ public class CargoInputNode extends SlimefunItem {
|
||||
return false;
|
||||
});
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception x) {
|
||||
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
|
||||
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) {
|
||||
@ -211,14 +218,10 @@ public class CargoInputNode extends SlimefunItem {
|
||||
|
||||
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(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
|
||||
}
|
||||
|
||||
preset.addItem(2, new CustomItem(new ItemStack(Material.PAPER), "&3Items", "", "&bPut in all Items you want to", "&bblacklist/whitelist"),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(2, new CustomItem(new ItemStack(Material.PAPER), "&3Items", "", "&bPut in all Items you want to", "&bblacklist/whitelist"), (p, slot, item, action) -> false);
|
||||
}
|
||||
|
||||
public int[] getInputSlots() {
|
@ -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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@ -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.block.Block;
|
||||
@ -17,6 +19,7 @@ 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.Slimefun;
|
||||
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu;
|
||||
import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset;
|
||||
import me.mrCookieSlime.Slimefun.api.item_transport.CargoNet;
|
||||
@ -40,12 +43,11 @@ public class CargoOutputNode extends SlimefunItem {
|
||||
@Override
|
||||
public void newInstance(final BlockMenu menu, final Block b) {
|
||||
try {
|
||||
|
||||
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) -> {
|
||||
int channel = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) - 1;
|
||||
if (channel < 0) {
|
||||
if (CargoNet.EXTRA_CHANNELS) channel = 16;
|
||||
if (CargoNet.extraChannels) channel = 16;
|
||||
else channel = 15;
|
||||
}
|
||||
BlockStorage.addBlockInfo(b, "frequency", String.valueOf(channel));
|
||||
@ -72,7 +74,7 @@ public class CargoOutputNode extends SlimefunItem {
|
||||
menu.addMenuClickHandler(14, (p, slot, item, action) -> {
|
||||
int channeln = Integer.parseInt(BlockStorage.getLocationInfo(b.getLocation(), "frequency")) + 1;
|
||||
|
||||
if (CargoNet.EXTRA_CHANNELS) {
|
||||
if (CargoNet.extraChannels) {
|
||||
if (channeln > 16) channeln = 0;
|
||||
}
|
||||
else {
|
||||
@ -84,8 +86,8 @@ public class CargoOutputNode extends SlimefunItem {
|
||||
return false;
|
||||
});
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception x) {
|
||||
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) {
|
||||
for (int i : border) {
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "),
|
||||
(p, slot, item, action) -> false
|
||||
);
|
||||
preset.addItem(i, new CustomItem(new ItemStack(Material.CYAN_STAINED_GLASS_PANE), " "), (p, slot, item, action) -> false);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
@ -1,16 +1,6 @@
|
||||
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";
|
||||
}
|
||||
}
|
@ -1,14 +1,5 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
|
||||
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public abstract class BlockPlaceHandler extends ItemHandler {
|
||||
|
||||
public abstract boolean onBlockPlace(BlockPlaceEvent e, ItemStack item);
|
||||
|
||||
@Override
|
||||
public String toCodename() {
|
||||
return "BlockPlaceHandler";
|
||||
}
|
||||
@Deprecated
|
||||
public abstract class BlockPlaceHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.BlockPlaceHandler {
|
||||
}
|
@ -1,29 +1,5 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
|
||||
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
|
||||
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
||||
|
||||
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";
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public abstract class BlockTicker extends me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker {
|
||||
}
|
||||
|
@ -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";
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
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();
|
||||
}
|
||||
|
@ -1,17 +1,5 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
|
||||
|
||||
import me.mrCookieSlime.CSCoreLibPlugin.events.ItemUseEvent;
|
||||
|
||||
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";
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public abstract class ItemInteractionHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler {
|
||||
}
|
@ -1,16 +1,5 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.handlers;
|
||||
|
||||
import me.mrCookieSlime.Slimefun.Objects.MultiBlock;
|
||||
|
||||
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";
|
||||
}
|
||||
@Deprecated
|
||||
public abstract class MultiBlockInteractionHandler extends ItemHandler implements me.mrCookieSlime.Slimefun.Objects.handlers.MultiBlockInteractionHandler {
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces;
|
||||
|
||||
public interface NotPlaceable {
|
||||
|
||||
}
|
@ -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();
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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");
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
});
|
||||
}
|
||||
}
|
@ -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()]);
|
||||
}
|
||||
}
|
@ -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};
|
||||
}
|
||||
|
||||
}
|
@ -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
Loading…
Reference in New Issue
Block a user