2019-10-02 11:54:59 +00:00
|
|
|
package me.mrCookieSlime.Slimefun.api;
|
|
|
|
|
2020-01-03 13:41:15 +00:00
|
|
|
import java.util.ArrayList;
|
2020-01-03 01:20:36 +00:00
|
|
|
import java.util.Base64;
|
2020-01-03 13:41:15 +00:00
|
|
|
import java.util.List;
|
2020-04-08 13:49:44 +00:00
|
|
|
import java.util.Locale;
|
2019-12-30 00:01:09 +00:00
|
|
|
import java.util.Optional;
|
2019-10-02 11:54:59 +00:00
|
|
|
import java.util.function.Consumer;
|
|
|
|
|
2020-04-08 13:49:44 +00:00
|
|
|
import org.apache.commons.lang.Validate;
|
2019-12-27 10:38:54 +00:00
|
|
|
import org.bukkit.ChatColor;
|
2019-10-03 16:06:14 +00:00
|
|
|
import org.bukkit.Color;
|
2019-10-02 11:54:59 +00:00
|
|
|
import org.bukkit.Material;
|
2020-02-10 17:00:14 +00:00
|
|
|
import org.bukkit.inventory.ItemFlag;
|
2019-10-02 11:54:59 +00:00
|
|
|
import org.bukkit.inventory.ItemStack;
|
|
|
|
import org.bukkit.inventory.meta.ItemMeta;
|
2020-01-03 13:41:15 +00:00
|
|
|
import org.bukkit.inventory.meta.PotionMeta;
|
|
|
|
import org.bukkit.potion.PotionEffect;
|
2020-02-10 17:00:14 +00:00
|
|
|
import org.bukkit.potion.PotionEffectType;
|
2019-10-02 11:54:59 +00:00
|
|
|
|
|
|
|
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
|
2019-12-08 11:58:05 +00:00
|
|
|
import io.github.thebusybiscuit.cscorelib2.item.ImmutableItemMeta;
|
2019-12-11 22:13:51 +00:00
|
|
|
import io.github.thebusybiscuit.cscorelib2.skull.SkullItem;
|
2020-04-08 13:49:44 +00:00
|
|
|
import io.github.thebusybiscuit.slimefun4.api.exceptions.PrematureCodeException;
|
|
|
|
import io.github.thebusybiscuit.slimefun4.utils.PatternUtils;
|
2019-10-04 00:21:38 +00:00
|
|
|
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
|
2020-03-19 19:38:13 +00:00
|
|
|
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
2019-10-02 11:54:59 +00:00
|
|
|
|
|
|
|
public class SlimefunItemStack extends CustomItem {
|
2020-03-04 23:04:18 +00:00
|
|
|
|
|
|
|
private String id;
|
|
|
|
private ImmutableItemMeta immutableMeta;
|
|
|
|
|
2020-03-19 19:38:13 +00:00
|
|
|
private String texture = null;
|
2020-03-04 23:04:18 +00:00
|
|
|
|
|
|
|
public SlimefunItemStack(String id, Material type, String name, String... lore) {
|
|
|
|
super(type, name, lore);
|
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SlimefunItemStack(String id, Material type, Color color, String name, String... lore) {
|
|
|
|
super(new ItemStack(type), color, name, lore);
|
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SlimefunItemStack(String id, Color color, PotionEffect effect, String name, String... lore) {
|
|
|
|
super(Material.POTION, im -> {
|
|
|
|
if (name != null) {
|
|
|
|
im.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lore.length > 0) {
|
|
|
|
List<String> lines = new ArrayList<>();
|
|
|
|
|
|
|
|
for (String line : lore) {
|
|
|
|
lines.add(ChatColor.translateAlternateColorCodes('&', line));
|
|
|
|
}
|
|
|
|
|
|
|
|
im.setLore(lines);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (im instanceof PotionMeta) {
|
|
|
|
((PotionMeta) im).setColor(color);
|
|
|
|
((PotionMeta) im).addCustomEffect(effect, true);
|
|
|
|
|
|
|
|
if (effect.getType().equals(PotionEffectType.SATURATION)) {
|
|
|
|
im.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SlimefunItemStack(String id, ItemStack item, String name, String... lore) {
|
|
|
|
super(item, name, lore);
|
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SlimefunItemStack(String id, ItemStack item) {
|
|
|
|
super(item);
|
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SlimefunItemStack(String id, ItemStack item, Consumer<ItemMeta> consumer) {
|
|
|
|
super(item, consumer);
|
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SlimefunItemStack(String id, Material type, String name, Consumer<ItemMeta> consumer) {
|
|
|
|
super(type, meta -> {
|
|
|
|
if (name != null) {
|
|
|
|
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
|
|
|
|
}
|
|
|
|
|
|
|
|
consumer.accept(meta);
|
|
|
|
});
|
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SlimefunItemStack(String id, String texture, String name, String... lore) {
|
2020-04-08 13:49:44 +00:00
|
|
|
super(getSkull(id, texture), name, lore);
|
|
|
|
this.texture = getTexture(id, texture);
|
2020-03-04 23:04:18 +00:00
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SlimefunItemStack(String id, String texture, String name, Consumer<ItemMeta> consumer) {
|
2020-04-08 13:49:44 +00:00
|
|
|
super(getSkull(id, texture), meta -> {
|
2020-03-04 23:04:18 +00:00
|
|
|
if (name != null) {
|
|
|
|
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
|
|
|
|
}
|
|
|
|
|
|
|
|
consumer.accept(meta);
|
|
|
|
});
|
|
|
|
|
2020-04-08 13:49:44 +00:00
|
|
|
this.texture = getTexture(id, texture);
|
2020-03-04 23:04:18 +00:00
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SlimefunItemStack(String id, String texture, Consumer<ItemMeta> consumer) {
|
2020-04-08 13:49:44 +00:00
|
|
|
super(getSkull(id, texture), consumer);
|
|
|
|
this.texture = getTexture(id, texture);
|
2020-03-04 23:04:18 +00:00
|
|
|
|
|
|
|
setID(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setID(String id) {
|
2020-04-08 13:49:44 +00:00
|
|
|
Validate.isTrue(id.equals(id.toUpperCase(Locale.ROOT)), "Slimefun Item Ids must be uppercase! (e.g. 'MY_ITEM_ID')");
|
|
|
|
|
|
|
|
if (SlimefunPlugin.instance == null) {
|
|
|
|
throw new PrematureCodeException("A SlimefunItemStack must never be be created before your Plugin was enabled.");
|
|
|
|
}
|
|
|
|
|
2020-03-04 23:04:18 +00:00
|
|
|
this.id = id;
|
|
|
|
|
|
|
|
ItemMeta meta = getItemMeta();
|
|
|
|
|
|
|
|
SlimefunPlugin.getItemDataService().setItemData(meta, id);
|
|
|
|
SlimefunPlugin.getItemTextureService().setTexture(meta, id);
|
|
|
|
|
|
|
|
setItemMeta(meta);
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getItemID() {
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
2020-03-11 01:53:59 +00:00
|
|
|
/**
|
2020-03-11 02:13:58 +00:00
|
|
|
* Gets the {@link SlimefunItem} associated for this {@link SlimefunItemStack}. Null if no item is found.
|
2020-03-11 01:53:59 +00:00
|
|
|
*
|
2020-03-11 02:13:58 +00:00
|
|
|
* @return The {@link SlimefunItem} for this {@link SlimefunItemStack}, null if not found.
|
2020-03-11 01:53:59 +00:00
|
|
|
*/
|
|
|
|
public SlimefunItem getItem() {
|
2020-04-08 13:49:44 +00:00
|
|
|
return SlimefunItem.getByID(id);
|
2020-03-11 01:53:59 +00:00
|
|
|
}
|
|
|
|
|
2020-03-04 23:04:18 +00:00
|
|
|
public ImmutableItemMeta getImmutableMeta() {
|
|
|
|
return immutableMeta;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean setItemMeta(ItemMeta meta) {
|
|
|
|
immutableMeta = new ImmutableItemMeta(meta);
|
|
|
|
|
|
|
|
return super.setItemMeta(meta);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public ItemStack clone() {
|
|
|
|
SlimefunItemStack item = (SlimefunItemStack) super.clone();
|
|
|
|
item.id = getItemID();
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
|
2020-03-19 19:38:13 +00:00
|
|
|
public Optional<String> getSkullTexture() {
|
2020-03-04 23:04:18 +00:00
|
|
|
return Optional.ofNullable(texture);
|
|
|
|
}
|
|
|
|
|
2020-04-08 13:49:44 +00:00
|
|
|
private static ItemStack getSkull(String id, String texture) {
|
|
|
|
return SkullItem.fromBase64(getTexture(id, texture));
|
2020-03-19 19:38:13 +00:00
|
|
|
}
|
|
|
|
|
2020-04-08 13:49:44 +00:00
|
|
|
private static String getTexture(String id, String texture) {
|
2020-04-09 00:21:30 +00:00
|
|
|
if (texture.startsWith("ey")) {
|
|
|
|
return texture;
|
|
|
|
}
|
|
|
|
else if (PatternUtils.ALPHANUMERIC.matcher(texture).matches()) {
|
|
|
|
return Base64.getEncoder().encodeToString(("{\"textures\":{\"SKIN\":{\"url\":\"http://textures.minecraft.net/texture/" + texture + "\"}}}").getBytes());
|
2020-03-04 23:04:18 +00:00
|
|
|
}
|
2020-04-09 00:21:30 +00:00
|
|
|
else {
|
2020-04-08 13:49:44 +00:00
|
|
|
throw new IllegalArgumentException("The provided texture for Item \"" + id + "\" does not seem to be a valid texture String!");
|
|
|
|
}
|
2020-03-04 23:04:18 +00:00
|
|
|
}
|
2019-12-30 00:01:09 +00:00
|
|
|
|
2019-10-02 11:54:59 +00:00
|
|
|
}
|