Compare commits

..

31 Commits
6.5.2 ... 6.7.0

Author SHA1 Message Date
Auxilor
61ace5c8e5 Updated to 6.7.0 2021-09-03 12:50:23 +01:00
Auxilor
94b73ef35c Improved Arg Parser javadoc 2021-09-03 12:49:59 +01:00
Auxilor
5cfc2068e7 Added arg parser lookup system 2021-09-03 12:47:23 +01:00
Auxilor
0ce7d1dd6c Added texture:<base64> to Items.lookup 2021-09-03 12:28:03 +01:00
Auxilor
19eefaf879 Improved Items.lookup javadoc 2021-09-03 11:54:48 +01:00
Auxilor
1ebf7fb875 Added Head Database integration 2021-09-03 11:45:34 +01:00
Auxilor
e8afd15d80 Updated to 6.6.4 2021-09-02 18:55:49 +01:00
Auxilor
d024c9238e Switched TestableStack display to only show recipe lore in recipes 2021-09-02 18:55:37 +01:00
Auxilor
1356bd1f26 ItemsAdder fix 2021-09-02 18:50:01 +01:00
Auxilor
407ccca5e0 TestableStack changes don't stop ever 2021-09-02 11:49:48 +01:00
Auxilor
82de602d47 Hopefully fixed crafting exploit 2021-09-02 10:53:14 +01:00
Auxilor
b0873112af Added ItemsAdder and Oraxen to plugin.yml 2021-09-02 10:50:40 +01:00
Auxilor
3a0b81b7de Updated to 6.6.3 2021-09-02 10:50:12 +01:00
Auxilor
5142b9ce92 More Items#lookup improvements 2021-09-02 10:46:25 +01:00
Auxilor
9403a1cbcb Marked item:amount system as legacy and replaced it with item amount 2021-09-02 10:42:29 +01:00
Auxilor
e4ebea354d Added ItemsAdder support 2021-09-02 10:35:03 +01:00
Auxilor
d32b31f1e5 Updated to 6.6.2 2021-09-01 15:35:57 +01:00
Auxilor
384657f1dc Fixed menu inventory registration memory leak 2021-09-01 15:35:33 +01:00
Auxilor
7c9d226bc3 Updated to 6.6.1 2021-08-31 14:52:52 +01:00
Auxilor
031401bb8e Added option to lang.yml 2021-08-31 14:52:37 +01:00
Auxilor
1a5c429b67 Fixed villager trade display with players 2021-08-31 14:51:45 +01:00
Auxilor
d028cf5bf3 Added ShopGuiPlus to softdepend 2021-08-29 16:35:16 +01:00
Auxilor
fdd1581ce3 Removed redundant code 2021-08-29 16:34:26 +01:00
Auxilor
3d07e10543 Fixed ItemFlag application 2021-08-29 16:33:31 +01:00
Auxilor
c851e35347 Added ItemFlags to FastItemStack 2021-08-29 16:32:42 +01:00
Auxilor
4cbb33b1fd More code cleanup 2021-08-29 16:03:14 +01:00
Auxilor
2ff1458772 Fixed config wrappers missing methods 2021-08-29 15:56:39 +01:00
Auxilor
e71ad9f034 Updated to 6.6.0 2021-08-29 15:51:49 +01:00
Auxilor
196a651ab3 Added ShopGuiPlus integration 2021-08-29 15:51:38 +01:00
Auxilor
253a8c24ad Improved kotlin codestyle conventions 2021-08-29 15:38:27 +01:00
Auxilor
ac265d0260 Added more formatting options 2021-08-29 15:30:25 +01:00
57 changed files with 1133 additions and 413 deletions

View File

@@ -51,6 +51,9 @@ allprojects {
// CombatLogX // CombatLogX
maven { url 'https://nexus.sirblobman.xyz/repository/public/' } maven { url 'https://nexus.sirblobman.xyz/repository/public/' }
// Head Database
maven { url 'https://mvn.intellectualsites.com/content/groups/public/' }
} }
dependencies { dependencies {

View File

@@ -2,6 +2,7 @@ package com.willfp.eco.core.config.base;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.yaml.YamlBaseConfig; import com.willfp.eco.core.config.yaml.YamlBaseConfig;
import com.willfp.eco.util.StringUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
@@ -42,6 +43,18 @@ public class LangYml extends YamlBaseConfig {
* @return The message with a prefix appended. * @return The message with a prefix appended.
*/ */
public String getMessage(@NotNull final String message) { public String getMessage(@NotNull final String message) {
return getPrefix() + this.getString("messages." + message); return getMessage(message, StringUtils.FormatOption.WITH_PLACEHOLDERS);
}
/**
* Get a chat message.
*
* @param message The key of the message.
* @param option The format options.
* @return The message with a prefix appended.
*/
public String getMessage(@NotNull final String message,
@NotNull final StringUtils.FormatOption option) {
return getPrefix() + this.getString("messages." + message, option);
} }
} }

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.config.interfaces; package com.willfp.eco.core.config.interfaces;
import com.willfp.eco.util.StringUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -165,7 +166,9 @@ public interface Config extends Cloneable {
* @return The found value, or an empty string if not found. * @return The found value, or an empty string if not found.
*/ */
@NotNull @NotNull
String getString(@NotNull String path); default String getString(@NotNull String path) {
return getString(path, true);
}
/** /**
* Get a string from config. * Get a string from config.
@@ -175,8 +178,36 @@ public interface Config extends Cloneable {
* @return The found value, or an empty string if not found. * @return The found value, or an empty string if not found.
*/ */
@NotNull @NotNull
default String getString(@NotNull String path,
boolean format) {
return this.getString(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
}
/**
* Get a string from config.
*
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or an empty string if not found.
*/
@NotNull
default String getString(@NotNull String path,
@NotNull final StringUtils.FormatOption option) {
return this.getString(path, true, option);
}
/**
* Get a string from config.
*
* @param path The key to fetch the value from.
* @param format If the string should be formatted.
* @param option The format option.
* @return The found value, or an empty string if not found.
*/
@NotNull
String getString(@NotNull String path, String getString(@NotNull String path,
boolean format); boolean format,
@NotNull StringUtils.FormatOption option);
/** /**
* Get a string from config. * Get a string from config.
@@ -185,7 +216,9 @@ public interface Config extends Cloneable {
* @return The found value, or null if not found. * @return The found value, or null if not found.
*/ */
@Nullable @Nullable
String getStringOrNull(@NotNull String path); default String getStringOrNull(@NotNull String path) {
return getStringOrNull(path, true);
}
/** /**
* Get a string from config. * Get a string from config.
@@ -195,8 +228,36 @@ public interface Config extends Cloneable {
* @return The found value, or null if not found. * @return The found value, or null if not found.
*/ */
@Nullable @Nullable
default String getStringOrNull(@NotNull String path,
boolean format) {
return this.getStringOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
}
/**
* Get a string from config.
*
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or null if not found.
*/
@Nullable
default String getStringOrNull(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return this.getStringOrNull(path, true, option);
}
/**
* Get a string from config.
*
* @param path The key to fetch the value from.
* @param format If the string should be formatted.
* @param option The format option.
* @return The found value, or null if not found.
*/
@Nullable
String getStringOrNull(@NotNull String path, String getStringOrNull(@NotNull String path,
boolean format); boolean format,
@NotNull StringUtils.FormatOption option);
/** /**
* Get a list of strings from config. * Get a list of strings from config.
@@ -207,7 +268,9 @@ public interface Config extends Cloneable {
* @return The found value, or a blank {@link java.util.ArrayList} if not found. * @return The found value, or a blank {@link java.util.ArrayList} if not found.
*/ */
@NotNull @NotNull
List<String> getStrings(@NotNull String path); default List<String> getStrings(@NotNull String path) {
return getStrings(path, true);
}
/** /**
* Get a list of strings from config. * Get a list of strings from config.
@@ -217,8 +280,36 @@ public interface Config extends Cloneable {
* @return The found value, or a blank {@link java.util.ArrayList} if not found. * @return The found value, or a blank {@link java.util.ArrayList} if not found.
*/ */
@NotNull @NotNull
default List<String> getStrings(@NotNull String path,
boolean format) {
return this.getStrings(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
}
/**
* Get a list of strings from config.
*
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
*/
@Nullable
default List<String> getStrings(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return getStrings(path, true, option);
}
/**
* Get a list of strings from config.
*
* @param path The key to fetch the value from.
* @param format If the strings should be formatted.
* @param option The option.
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
*/
@NotNull
List<String> getStrings(@NotNull String path, List<String> getStrings(@NotNull String path,
boolean format); boolean format,
@NotNull StringUtils.FormatOption option);
/** /**
* Get a list of strings from config. * Get a list of strings from config.
@@ -227,7 +318,9 @@ public interface Config extends Cloneable {
* @return The found value, or null if not found. * @return The found value, or null if not found.
*/ */
@Nullable @Nullable
List<String> getStringsOrNull(@NotNull String path); default List<String> getStringsOrNull(@NotNull String path) {
return getStringsOrNull(path, true);
}
/** /**
* Get a list of strings from config. * Get a list of strings from config.
@@ -237,8 +330,36 @@ public interface Config extends Cloneable {
* @return The found value, or null if not found. * @return The found value, or null if not found.
*/ */
@Nullable @Nullable
default List<String> getStringsOrNull(@NotNull String path,
boolean format) {
return getStringsOrNull(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
}
/**
* Get a list of strings from config.
*
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or null if not found.
*/
@Nullable
default List<String> getStringsOrNull(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return getStringsOrNull(path, true, option);
}
/**
* Get a list of strings from config.
*
* @param path The key to fetch the value from.
* @param format If the strings should be formatted.
* @param option The format option.
* @return The found value, or null if not found.
*/
@Nullable
List<String> getStringsOrNull(@NotNull String path, List<String> getStringsOrNull(@NotNull String path,
boolean format); boolean format,
@NotNull StringUtils.FormatOption option);
/** /**
* Get a decimal from config. * Get a decimal from config.

View File

@@ -1,6 +1,7 @@
package com.willfp.eco.core.config.wrapper; package com.willfp.eco.core.config.wrapper;
import com.willfp.eco.core.config.interfaces.Config; import com.willfp.eco.core.config.interfaces.Config;
import com.willfp.eco.util.StringUtils;
import lombok.Getter; import lombok.Getter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -125,48 +126,33 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
return handle.getBoolsOrNull(path); return handle.getBoolsOrNull(path);
} }
@Override
public @NotNull String getString(@NotNull final String path) {
return handle.getString(path);
}
@Override @Override
public @NotNull String getString(@NotNull final String path, public @NotNull String getString(@NotNull final String path,
final boolean format) { final boolean format,
return handle.getString(path, format); @NotNull final StringUtils.FormatOption option) {
} return handle.getString(path, format, option);
@Override
public @Nullable String getStringOrNull(@NotNull final String path) {
return handle.getStringOrNull(path);
} }
@Override @Override
public @Nullable String getStringOrNull(@NotNull final String path, public @Nullable String getStringOrNull(@NotNull final String path,
final boolean format) { final boolean format,
return handle.getStringOrNull(path, format); @NotNull final StringUtils.FormatOption option) {
} return handle.getStringOrNull(path, format, option);
@Override
public @NotNull List<String> getStrings(@NotNull final String path) {
return handle.getStrings(path);
} }
@Override @Override
public @NotNull List<String> getStrings(@NotNull final String path, public @NotNull List<String> getStrings(@NotNull final String path,
final boolean format) { final boolean format,
return handle.getStrings(path, format); @NotNull final StringUtils.FormatOption option) {
} return handle.getStrings(path, format, option);
@Override
public @Nullable List<String> getStringsOrNull(@NotNull final String path) {
return handle.getStringsOrNull(path);
} }
@Override @Override
public @Nullable List<String> getStringsOrNull(@NotNull final String path, public @Nullable List<String> getStringsOrNull(@NotNull final String path,
final boolean format) { final boolean format,
return handle.getStringsOrNull(path, format); @NotNull final StringUtils.FormatOption option) {
return handle.getStringsOrNull(path, format, option);
} }
@Override @Override

View File

@@ -3,6 +3,7 @@ package com.willfp.eco.core.fast;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -10,6 +11,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
/** /**
* FastItemStack contains methods to modify and read items faster than in default bukkit. * FastItemStack contains methods to modify and read items faster than in default bukkit.
@@ -51,17 +53,47 @@ public interface FastItemStack {
/** /**
* Set the rework penalty. * Set the rework penalty.
* *
* @param cost The rework penalty to set. * @param cost The rework penalty to set.
*/ */
void setRepairCost(int cost); void setRepairCost(int cost);
/** /**
* Get the rework penalty. * Get the rework penalty.
*. * .
*
* @return The rework penalty found on the item. * @return The rework penalty found on the item.
*/ */
int getRepairCost(); int getRepairCost();
/**
* Add ItemFlags.
*
* @param hideFlags The flags.
*/
void addItemFlags(ItemFlag... hideFlags);
/**
* Remove ItemFlags.
*
* @param hideFlags The flags.
*/
void removeItemFlags(ItemFlag... hideFlags);
/**
* Get the ItemFlags.
*
* @return The flags.
*/
Set<ItemFlag> getItemFlags();
/**
* Test the item for a flag.
*
* @param flag The flag.
* @return If the flag is present.
*/
boolean hasItemFlag(ItemFlag flag);
/** /**
* Get the Bukkit ItemStack again. * Get the Bukkit ItemStack again.
* *

View File

@@ -1,9 +1,11 @@
package com.willfp.eco.core.integrations.customitems; package com.willfp.eco.core.integrations.customitems;
import com.willfp.eco.core.integrations.Integration;
/** /**
* Wrapper class for custom item integrations. * Wrapper class for custom item integrations.
*/ */
public interface CustomItemsWrapper { public interface CustomItemsWrapper extends Integration {
/** /**
* Register all the custom items for a specific plugin into eco. * Register all the custom items for a specific plugin into eco.
* *

View File

@@ -16,7 +16,7 @@ public class McmmoManager {
/** /**
* A set of all registered integrations. * A set of all registered integrations.
*/ */
private final Set<McmmoWrapper> regsistered = new HashSet<>(); private final Set<McmmoWrapper> registered = new HashSet<>();
/** /**
* Register a new integration. * Register a new integration.
@@ -24,7 +24,7 @@ public class McmmoManager {
* @param integration The integration to register. * @param integration The integration to register.
*/ */
public void register(@NotNull final McmmoWrapper integration) { public void register(@NotNull final McmmoWrapper integration) {
regsistered.add(integration); registered.add(integration);
} }
/** /**
@@ -34,7 +34,7 @@ public class McmmoManager {
* @return The bonus drop count. * @return The bonus drop count.
*/ */
public int getBonusDropCount(@NotNull final Block block) { public int getBonusDropCount(@NotNull final Block block) {
for (McmmoWrapper mcmmoWrapper : regsistered) { for (McmmoWrapper mcmmoWrapper : registered) {
return mcmmoWrapper.getBonusDropCount(block); return mcmmoWrapper.getBonusDropCount(block);
} }
return 0; return 0;
@@ -47,7 +47,7 @@ public class McmmoManager {
* @return If the event is fake. * @return If the event is fake.
*/ */
public boolean isFake(@NotNull final Event event) { public boolean isFake(@NotNull final Event event) {
for (McmmoWrapper mcmmoWrapper : regsistered) { for (McmmoWrapper mcmmoWrapper : registered) {
return mcmmoWrapper.isFake(event); return mcmmoWrapper.isFake(event);
} }
return false; return false;

View File

@@ -0,0 +1,36 @@
package com.willfp.eco.core.integrations.shop;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.Set;
/**
* Class to handle shop integrations.
*/
@UtilityClass
public class ShopManager {
/**
* A set of all registered integrations.
*/
private final Set<ShopWrapper> registered = new HashSet<>();
/**
* Register a new integration.
*
* @param integration The integration to register.
*/
public void register(@NotNull final ShopWrapper integration) {
registered.add(integration);
}
/**
* Register eco item provider for shop plugins.
*/
public void registerEcoProvider() {
for (ShopWrapper shopWrapper : registered) {
shopWrapper.registerEcoProvider();
}
}
}

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.core.integrations.shop;
/**
* Wrapper class for shop integrations.
*/
public interface ShopWrapper {
/**
* Register eco item provider for shop plugins.
*/
void registerEcoProvider();
}

View File

@@ -1,8 +1,6 @@
package com.willfp.eco.core.items; package com.willfp.eco.core.items;
import com.willfp.eco.core.items.builder.EnchantedBookBuilder; import com.willfp.eco.core.items.args.LookupArgParser;
import com.willfp.eco.core.items.builder.ItemBuilder;
import com.willfp.eco.core.items.builder.ItemStackBuilder;
import com.willfp.eco.core.recipe.parts.EmptyTestableItem; import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
import com.willfp.eco.core.recipe.parts.MaterialTestableItem; import com.willfp.eco.core.recipe.parts.MaterialTestableItem;
import com.willfp.eco.core.recipe.parts.ModifiedTestableItem; import com.willfp.eco.core.recipe.parts.ModifiedTestableItem;
@@ -11,17 +9,19 @@ import com.willfp.eco.util.NamespacedKeyUtils;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
/** /**
* Class to manage all custom and vanilla items. * Class to manage all custom and vanilla items.
@@ -31,19 +31,33 @@ public final class Items {
/** /**
* All recipe parts. * All recipe parts.
*/ */
private static final Map<NamespacedKey, CustomItem> REGISTRY = new HashMap<>(); private static final Map<NamespacedKey, CustomItem> REGISTRY = new ConcurrentHashMap<>();
/** /**
* Register a new recipe part. * All recipe parts.
*/
private static final List<LookupArgParser> ARG_PARSERS = new ArrayList<>();
/**
* Register a new custom item.
* *
* @param key The key of the recipe part. * @param key The key of the item.
* @param part The recipe part. * @param part The item.
*/ */
public void registerCustomItem(@NotNull final NamespacedKey key, public void registerCustomItem(@NotNull final NamespacedKey key,
@NotNull final CustomItem part) { @NotNull final CustomItem part) {
REGISTRY.put(key, part); REGISTRY.put(key, part);
} }
/**
* Register a new arg parser.
*
* @param parser The parser.
*/
public void registerArgParser(@NotNull final LookupArgParser parser) {
ARG_PARSERS.add(parser);
}
/** /**
* Remove an item. * Remove an item.
* *
@@ -54,12 +68,27 @@ public final class Items {
} }
/** /**
* Lookup item from string. * This is the backbone of the entire eco item system.
* <p> * <p>
* Used for recipes. * You can lookup a TestableItem for any material, custom item,
* or item in general, and it will return it with any modifiers
* passed as parameters. This includes stack size (item amount)
* and enchantments that should be present on the item.
* <p>
* If you want to get an ItemStack instance from this, then just call
* {@link TestableItem#getItem()}.
* <p>
* The advantages of the testable item system are that there is the inbuilt
* {@link TestableItem#matches(ItemStack)} - this allows to check if any item
* is that testable item; which may sound negligible but actually it allows for
* much more power an flexibility. For example, you can have an item with an
* extra metadata tag, extra lore lines, different display name - and it
* will still work as long as the test passes. This is very important
* for custom crafting recipes where other plugins may add metadata
* values or the play may rename the item.
* *
* @param key The string to test. * @param key The lookup string.
* @return The found testable item, or an empty item if not found. * @return The testable item, or an {@link EmptyTestableItem}.
*/ */
public TestableItem lookup(@NotNull final String key) { public TestableItem lookup(@NotNull final String key) {
if (key.contains("?")) { if (key.contains("?")) {
@@ -81,6 +110,8 @@ public final class Items {
TestableItem item = null; TestableItem item = null;
int stackAmount = 1;
String[] split = args[0].toLowerCase().split(":"); String[] split = args[0].toLowerCase().split(":");
if (split.length == 1) { if (split.length == 1) {
@@ -94,90 +125,83 @@ public final class Items {
if (split.length == 2) { if (split.length == 2) {
CustomItem part = REGISTRY.get(NamespacedKeyUtils.create(split[0], split[1])); CustomItem part = REGISTRY.get(NamespacedKeyUtils.create(split[0], split[1]));
/*
Legacy id:amount format
This has been superseded by id amount
*/
if (part == null) { if (part == null) {
Material material = Material.getMaterial(split[0].toUpperCase()); Material material = Material.getMaterial(split[0].toUpperCase());
if (material == null || material == Material.AIR) { if (material == null || material == Material.AIR) {
return new EmptyTestableItem(); return new EmptyTestableItem();
} }
item = new TestableStack(new MaterialTestableItem(material), Integer.parseInt(split[1])); item = new MaterialTestableItem(material);
stackAmount = Integer.parseInt(split[1]);
} else { } else {
item = part; item = part;
} }
} }
/*
Legacy namespace:id:amount format
This has been superseded by namespace:id amount
*/
if (split.length == 3) { if (split.length == 3) {
CustomItem part = REGISTRY.get(NamespacedKeyUtils.create(split[0], split[1])); CustomItem part = REGISTRY.get(NamespacedKeyUtils.create(split[0], split[1]));
item = part == null ? new EmptyTestableItem() : new TestableStack(part, Integer.parseInt(split[2])); if (part == null) {
return new EmptyTestableItem();
}
item = part;
stackAmount = Integer.parseInt(split[2]);
} }
if (item == null || item instanceof EmptyTestableItem) { boolean usingNewStackFormat = false;
if (args.length >= 2) {
try {
stackAmount = Integer.parseInt(args[1]);
usingNewStackFormat = true;
} catch (NumberFormatException ignored) {
}
}
if (item == null) {
return new EmptyTestableItem(); return new EmptyTestableItem();
} }
String[] enchantArgs = Arrays.copyOfRange(args, 1, args.length);
Map<Enchantment, Integer> requiredEnchantments = new HashMap<>();
for (String enchantArg : enchantArgs) {
String[] enchantArgSplit = enchantArg.split(":");
Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(enchantArgSplit[0].toLowerCase()));
int level = Integer.parseInt(enchantArgSplit[1]);
requiredEnchantments.put(enchantment, level);
}
if (requiredEnchantments.isEmpty()) {
return item;
}
ItemStack example = item.getItem(); ItemStack example = item.getItem();
ItemMeta meta = example.getItemMeta();
assert meta != null;
if (example.getItemMeta() instanceof EnchantmentStorageMeta storageMeta) { String[] modifierArgs = Arrays.copyOfRange(args, usingNewStackFormat ? 2 : 1, args.length);
requiredEnchantments.forEach((enchantment, integer) -> storageMeta.addStoredEnchant(enchantment, integer, true));
example.setItemMeta(storageMeta); List<Predicate<ItemStack>> predicates = new ArrayList<>();
} else {
ItemMeta meta = example.getItemMeta(); for (LookupArgParser argParser : ARG_PARSERS) {
assert meta != null; predicates.add(argParser.parseArguments(modifierArgs, meta));
requiredEnchantments.forEach((enchantment, integer) -> meta.addEnchant(enchantment, integer, true));
example.setItemMeta(meta);
} }
return new ModifiedTestableItem( example.setItemMeta(meta);
item, if (!predicates.isEmpty()) {
itemStack -> { item = new ModifiedTestableItem(
if (!itemStack.hasItemMeta()) { item,
return false; test -> {
} for (Predicate<ItemStack> predicate : predicates) {
if (!predicate.test(test)) {
ItemMeta meta = itemStack.getItemMeta();
assert meta != null;
if (meta instanceof EnchantmentStorageMeta storageMeta) {
for (Map.Entry<Enchantment, Integer> entry : requiredEnchantments.entrySet()) {
if (!storageMeta.hasStoredEnchant(entry.getKey())) {
return false;
}
if (storageMeta.getStoredEnchantLevel(entry.getKey()) < entry.getValue()) {
return false; return false;
} }
} }
} else {
for (Map.Entry<Enchantment, Integer> entry : requiredEnchantments.entrySet()) {
if (!meta.hasEnchant(entry.getKey())) {
return false;
}
if (meta.getEnchantLevel(entry.getKey()) < entry.getValue()) {
return false;
}
}
}
return true; return true;
}, },
example example
); );
}
if (stackAmount == 1) {
return item;
} else {
return new TestableStack(item, stackAmount);
}
} }
/** /**
@@ -195,6 +219,22 @@ public final class Items {
return false; return false;
} }
/**
* Get custom item from item.
*
* @param itemStack The item.
* @return The custom item, or null if not exists.
*/
@Nullable
public CustomItem getCustomItem(@NotNull final ItemStack itemStack) {
for (CustomItem item : REGISTRY.values()) {
if (item.matches(itemStack)) {
return item;
}
}
return null;
}
/** /**
* Get all registered custom items. * Get all registered custom items.
* *

View File

@@ -0,0 +1,75 @@
package com.willfp.eco.core.items.args;
import org.bukkit.NamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
public class EnchantmentArgParser implements LookupArgParser {
@Override
public Predicate<ItemStack> parseArguments(@NotNull final String[] args,
@NotNull final ItemMeta meta) {
Map<Enchantment, Integer> requiredEnchantments = new HashMap<>();
for (String enchantArg : args) {
String[] enchantArgSplit = enchantArg.split(":");
Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(enchantArgSplit[0].toLowerCase()));
if (enchantment == null) {
continue;
}
if (enchantArgSplit.length < 2) {
continue;
}
int level = Integer.parseInt(enchantArgSplit[1]);
requiredEnchantments.put(enchantment, level);
}
if (meta instanceof EnchantmentStorageMeta storageMeta) {
requiredEnchantments.forEach((enchantment, integer) -> storageMeta.addStoredEnchant(enchantment, integer, true));
} else {
requiredEnchantments.forEach((enchantment, integer) -> meta.addEnchant(enchantment, integer, true));
}
return test -> {
if (!test.hasItemMeta()) {
return false;
}
ItemMeta testMeta = test.getItemMeta();
assert testMeta != null;
if (testMeta instanceof EnchantmentStorageMeta storageMeta) {
for (Map.Entry<Enchantment, Integer> entry : requiredEnchantments.entrySet()) {
if (!storageMeta.hasStoredEnchant(entry.getKey())) {
return false;
}
if (storageMeta.getStoredEnchantLevel(entry.getKey()) < entry.getValue()) {
return false;
}
}
} else {
for (Map.Entry<Enchantment, Integer> entry : requiredEnchantments.entrySet()) {
if (!testMeta.hasEnchant(entry.getKey())) {
return false;
}
if (testMeta.getEnchantLevel(entry.getKey()) < entry.getValue()) {
return false;
}
}
}
return true;
};
}
}

View File

@@ -0,0 +1,23 @@
package com.willfp.eco.core.items.args;
import com.willfp.eco.core.items.TestableItem;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.function.Predicate;
public interface LookupArgParser {
/**
* Parse the arguments.
* <p>
* An argument parser should generate the predicate as well
* as modify the ItemMeta for {@link TestableItem#getItem()}
*
* @param args The arguments.
* @param meta The ItemMeta to modify.
* @return The predicate test to apply to the modified item.
*/
Predicate<ItemStack> parseArguments(@NotNull String[] args,
@NotNull ItemMeta meta);
}

View File

@@ -0,0 +1,51 @@
package com.willfp.eco.core.items.args;
import com.willfp.eco.util.SkullUtils;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
import org.jetbrains.annotations.NotNull;
import java.util.function.Predicate;
public class TextureArgParser implements LookupArgParser {
@Override
public Predicate<ItemStack> parseArguments(@NotNull final String[] args,
@NotNull final ItemMeta meta) {
String skullTexture = null;
for (String arg : args) {
String[] argSplit = arg.split(":");
if (!argSplit[0].equalsIgnoreCase("texture")) {
continue;
}
if (argSplit.length < 2) {
continue;
}
skullTexture = argSplit[1];
}
if (meta instanceof SkullMeta skullMeta && skullTexture != null) {
SkullUtils.setSkullTexture(skullMeta, skullTexture);
}
String finalSkullTexture = skullTexture;
return test -> {
if (!test.hasItemMeta()) {
return false;
}
ItemMeta testMeta = test.getItemMeta();
assert testMeta != null;
if (testMeta instanceof SkullMeta skullMeta && finalSkullTexture != null) {
return finalSkullTexture.equalsIgnoreCase(SkullUtils.getSkullTexture(skullMeta));
}
return true;
};
}
}

View File

@@ -1,17 +1,12 @@
package com.willfp.eco.core.recipe.parts; package com.willfp.eco.core.recipe.parts;
import com.willfp.eco.core.Eco;
import com.willfp.eco.core.items.TestableItem; import com.willfp.eco.core.items.TestableItem;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
/** /**
* Stacks of items. * Stacks of items.
*/ */
@@ -56,19 +51,7 @@ public class TestableStack implements TestableItem {
@Override @Override
public ItemStack getItem() { public ItemStack getItem() {
ItemStack temp = handle.getItem().clone(); ItemStack temp = handle.getItem().clone();
ItemMeta meta = temp.getItemMeta();
assert meta != null;
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
assert lore != null;
lore.add("");
String add = Eco.getHandler().getEcoPlugin().getLangYml().getString("multiple-in-craft");
add = add.replace("%amount%", String.valueOf(amount));
lore.add(add);
meta.setLore(lore);
temp.setItemMeta(meta);
temp.setAmount(amount); temp.setAmount(amount);
return temp; return temp;
} }
} }

View File

@@ -1,16 +1,19 @@
package com.willfp.eco.core.recipe.recipes; package com.willfp.eco.core.recipe.recipes;
import com.willfp.eco.core.Eco;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent; import com.willfp.eco.core.PluginDependent;
import com.willfp.eco.core.items.TestableItem; import com.willfp.eco.core.items.TestableItem;
import com.willfp.eco.core.recipe.Recipes; import com.willfp.eco.core.recipe.Recipes;
import com.willfp.eco.core.recipe.parts.EmptyTestableItem; import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
import com.willfp.eco.core.recipe.parts.TestableStack;
import lombok.Getter; import lombok.Getter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.RecipeChoice; import org.bukkit.inventory.RecipeChoice;
import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
@@ -87,7 +90,23 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
displayedRecipe.shape("012", "345", "678"); displayedRecipe.shape("012", "345", "678");
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
char character = String.valueOf(i).toCharArray()[0]; char character = String.valueOf(i).toCharArray()[0];
displayedRecipe.setIngredient(character, new RecipeChoice.ExactChoice(parts.get(i).getItem())); ItemStack item = parts.get(i).getItem();
if (parts.get(i) instanceof TestableStack) {
ItemMeta meta = item.getItemMeta();
assert meta != null;
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
assert lore != null;
lore.add("");
String add = Eco.getHandler().getEcoPlugin().getLangYml().getString("multiple-in-craft");
add = add.replace("%amount%", String.valueOf(item.getAmount()));
lore.add(add);
meta.setLore(lore);
item.setItemMeta(meta);
}
displayedRecipe.setIngredient(character, new RecipeChoice.ExactChoice(item));
} }
Bukkit.getServer().addRecipe(shapedRecipe); Bukkit.getServer().addRecipe(shapedRecipe);

View File

@@ -7,6 +7,7 @@ import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Function;
/** /**
* Utilities / API methods for player heads. * Utilities / API methods for player heads.
@@ -23,6 +24,11 @@ public class SkullUtils {
*/ */
private BiConsumer<SkullMeta, String> metaSetConsumer = null; private BiConsumer<SkullMeta, String> metaSetConsumer = null;
/**
* The meta get function.
*/
private Function<SkullMeta, String> metaGetConsumer = null;
/** /**
* Set the texture of a skull from base64. * Set the texture of a skull from base64.
* *
@@ -37,16 +43,32 @@ public class SkullUtils {
metaSetConsumer.accept(meta, base64); metaSetConsumer.accept(meta, base64);
} }
/**
* Get the texture of a skull - in base64.
*
* @param meta The meta to modify.
* @return The texture.
*/
public String getSkullTexture(@NotNull final SkullMeta meta) {
Validate.isTrue(initialized, "Must be initialized!");
Validate.notNull(metaGetConsumer, "Must be initialized!");
return metaGetConsumer.apply(meta);
}
/** /**
* Initialize the skull texture function. * Initialize the skull texture function.
* *
* @param function The function. * @param function The function.
* @param function2 Get function.
*/ */
@ApiStatus.Internal @ApiStatus.Internal
public void initialize(@NotNull final BiConsumer<SkullMeta, String> function) { public void initialize(@NotNull final BiConsumer<SkullMeta, String> function,
@NotNull final Function<SkullMeta, String> function2) {
Validate.isTrue(!initialized, "Already initialized!"); Validate.isTrue(!initialized, "Already initialized!");
metaSetConsumer = function; metaSetConsumer = function;
metaGetConsumer = function2;
initialized = true; initialized = true;
} }
} }

View File

@@ -12,7 +12,7 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.awt.*; import java.awt.Color;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@@ -57,7 +57,21 @@ public class StringUtils {
.build(); .build();
/** /**
* Format a list of strings - converts Placeholders and Color codes. * Format a list of strings.
* <p>
* Converts color codes and placeholders.
*
* @param list The messages to format.
* @return The message, formatted.
*/
public List<String> formatList(@NotNull final List<String> list) {
return formatList(list, (Player) null);
}
/**
* Format a list of strings.
* <p>
* Coverts color codes and placeholders for a player.
* *
* @param list The messages to format. * @param list The messages to format.
* @param player The player to translate placeholders with respect to. * @param player The player to translate placeholders with respect to.
@@ -65,26 +79,61 @@ public class StringUtils {
*/ */
public List<String> formatList(@NotNull final List<String> list, public List<String> formatList(@NotNull final List<String> list,
@Nullable final Player player) { @Nullable final Player player) {
return formatList(list, player, FormatOption.WITH_PLACEHOLDERS);
}
/**
* Format a list of strings.
* <p>
* Converts color codes and placeholders if specified.
*
* @param list The messages to format.
* @param option The format option.
* @return The message, formatted.
*/
public List<String> formatList(@NotNull final List<String> list,
@NotNull final FormatOption option) {
return formatList(list, null, option);
}
/**
* Format a list of strings.
* <p>
* Coverts color codes and placeholders for a player if specified.
*
* @param list The messages to format.
* @param player The player to translate placeholders with respect to.
* @param option The options.
* @return The message, format.
*/
public List<String> formatList(@NotNull final List<String> list,
@Nullable final Player player,
@NotNull final FormatOption option) {
List<String> translated = new ArrayList<>(); List<String> translated = new ArrayList<>();
for (String string : list) { for (String string : list) {
translated.add(format(string, player)); translated.add(format(string, player, option));
} }
return translated; return translated;
} }
/** /**
* Format a list of strings - converts Placeholders and Color codes. * Format a string.
* <p>
* Converts color codes and placeholders.
* *
* @param list The messages to format. * @param message The message to translate.
* @return The message, formatted. * @return The message, formatted.
* @see StringUtils#format(String, Player)
*/ */
public List<String> formatList(@NotNull final List<String> list) { public String format(@NotNull final String message) {
return formatList(list, null); return format(message, (Player) null);
} }
/** /**
* Format a string - converts Placeholders and Color codes. * Format a string.
* <p>
* Converts color codes and placeholders for a player.
* *
* @param message The message to format. * @param message The message to format.
* @param player The player to translate placeholders with respect to. * @param player The player to translate placeholders with respect to.
@@ -92,23 +141,45 @@ public class StringUtils {
*/ */
public String format(@NotNull final String message, public String format(@NotNull final String message,
@Nullable final Player player) { @Nullable final Player player) {
String processedMessage = message; return format(message, player, FormatOption.WITH_PLACEHOLDERS);
processedMessage = translateGradients(processedMessage);
processedMessage = PlaceholderManager.translatePlaceholders(processedMessage, player);
processedMessage = translateHexColorCodes(processedMessage);
processedMessage = ChatColor.translateAlternateColorCodes('&', processedMessage);
return processedMessage;
} }
/** /**
* Format a string without respect to a player. * Format a string.
* <p>
* Converts color codes and placeholders if specified.
* *
* @param message The message to translate. * @param message The message to translate.
* @param option The format option.
* @return The message, formatted. * @return The message, formatted.
* @see StringUtils#format(String, Player) * @see StringUtils#format(String, Player)
*/ */
public String format(@NotNull final String message) { public String format(@NotNull final String message,
return format(message, null); @NotNull final FormatOption option) {
return format(message, null, option);
}
/**
* Format a string.
* <p>
* Coverts color codes and placeholders for a player if specified.
*
* @param message The message to format.
* @param player The player to translate placeholders with respect to.
* @param option The format options.
* @return The message, formatted.
*/
public String format(@NotNull final String message,
@Nullable final Player player,
@NotNull final FormatOption option) {
String processedMessage = message;
processedMessage = translateGradients(processedMessage);
if (option == FormatOption.WITH_PLACEHOLDERS) {
processedMessage = PlaceholderManager.translatePlaceholders(processedMessage, player);
}
processedMessage = translateHexColorCodes(processedMessage);
processedMessage = ChatColor.translateAlternateColorCodes('&', processedMessage);
return processedMessage;
} }
private static String translateHexColorCodes(@NotNull final String message) { private static String translateHexColorCodes(@NotNull final String message) {
@@ -271,4 +342,19 @@ public class StringUtils {
GsonComponentSerializer.gson().deserialize(json) GsonComponentSerializer.gson().deserialize(json)
); );
} }
/**
* Options for formatting.
*/
public enum FormatOption {
/**
* Completely formatted.
*/
WITH_PLACEHOLDERS,
/**
* Completely formatted without placeholders.
*/
WITHOUT_PLACEHOLDERS
}
} }

View File

@@ -11,9 +11,9 @@ import java.util.*
open class EcoJSONConfigWrapper : JSONConfig { open class EcoJSONConfigWrapper : JSONConfig {
val handle: Gson = GsonBuilder().setPrettyPrinting().create() val handle: Gson = GsonBuilder().setPrettyPrinting().create()
val values: MutableMap<String, Any?> = HashMap() val values = mutableMapOf<String, Any?>()
private val cache: MutableMap<String, Any> = HashMap() private val cache = mutableMapOf<String, Any>()
fun init(values: Map<String, Any?>) { fun init(values: Map<String, Any?>) {
this.values.clear() this.values.clear()
@@ -138,17 +138,17 @@ open class EcoJSONConfigWrapper : JSONConfig {
override fun getSubsections(path: String): List<JSONConfig> { override fun getSubsections(path: String): List<JSONConfig> {
val subsections = getSubsectionsOrNull(path) val subsections = getSubsectionsOrNull(path)
return subsections ?: ArrayList() return subsections ?: mutableListOf()
} }
override fun getSubsectionsOrNull(path: String): List<JSONConfig>? { override fun getSubsectionsOrNull(path: String): List<JSONConfig>? {
val maps = getOfKnownType(path, Any::class.java) as List<Map<String, Any>>? val maps = getOfKnownType(path, Any::class.java) as List<Map<String, Any>>?
?: return null ?: return null
val configs: MutableList<JSONConfig> = ArrayList() val configs = mutableListOf<JSONConfig>()
for (map in maps) { for (map in maps) {
configs.add(EcoJSONConfigSection(map)) configs.add(EcoJSONConfigSection(map))
} }
return configs return configs.toMutableList()
} }
override fun getInt(path: String): Int { override fun getInt(path: String): Int {
@@ -170,11 +170,11 @@ open class EcoJSONConfigWrapper : JSONConfig {
return Objects.requireNonNullElse(getOfKnownType(path, Int::class.java), def) return Objects.requireNonNullElse(getOfKnownType(path, Int::class.java), def)
} }
override fun getInts(path: String): List<Int> { override fun getInts(path: String): MutableList<Int> {
return Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), ArrayList<Any>()) as List<Int> return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Int>()) as List<Int>).toMutableList()
} }
override fun getIntsOrNull(path: String): List<Int>? { override fun getIntsOrNull(path: String): MutableList<Int>? {
return if (has(path)) { return if (has(path)) {
getInts(path) getInts(path)
} else { } else {
@@ -194,11 +194,11 @@ open class EcoJSONConfigWrapper : JSONConfig {
} }
} }
override fun getBools(path: String): List<Boolean> { override fun getBools(path: String): MutableList<Boolean> {
return Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), ArrayList<Any>()) as List<Boolean> return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Boolean>()) as List<Boolean>).toMutableList()
} }
override fun getBoolsOrNull(path: String): List<Boolean>? { override fun getBoolsOrNull(path: String): MutableList<Boolean>? {
return if (has(path)) { return if (has(path)) {
getBools(path) getBools(path)
} else { } else {
@@ -206,64 +206,44 @@ open class EcoJSONConfigWrapper : JSONConfig {
} }
} }
override fun getString(path: String): String {
return getString(path, true)
}
override fun getString( override fun getString(
path: String, path: String,
format: Boolean format: Boolean,
option: StringUtils.FormatOption
): String { ): String {
val string = getOfKnownType(path, String::class.java) ?: "" val string = getOfKnownType(path, String::class.java) ?: ""
return if (format) StringUtils.format(string) else string return if (format) StringUtils.format(string, option) else string
}
override fun getStringOrNull(path: String): String? {
return if (has(path)) {
getString(path)
} else {
null
}
} }
override fun getStringOrNull( override fun getStringOrNull(
path: String, path: String,
format: Boolean format: Boolean,
option: StringUtils.FormatOption
): String? { ): String? {
return if (has(path)) { return if (has(path)) {
getString(path, format) getString(path, format, option)
} else { } else {
null null
} }
} }
override fun getStrings(path: String): List<String> {
return getStrings(path, true)
}
override fun getStrings( override fun getStrings(
path: String, path: String,
format: Boolean format: Boolean,
): List<String> { option: StringUtils.FormatOption
): MutableList<String> {
val strings = val strings =
Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), ArrayList<Any>()) as List<String> (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<String>()) as List<String>).toMutableList()
return if (format) StringUtils.formatList(strings) else strings return if (format) StringUtils.formatList(strings, option) else strings
}
override fun getStringsOrNull(path: String): List<String>? {
return if (has(path)) {
getStrings(path)
} else {
null
}
} }
override fun getStringsOrNull( override fun getStringsOrNull(
path: String, path: String,
format: Boolean format: Boolean,
): List<String>? { option: StringUtils.FormatOption
): MutableList<String>? {
return if (has(path)) { return if (has(path)) {
getStrings(path, format) getStrings(path, format, option)
} else { } else {
null null
} }
@@ -281,11 +261,11 @@ open class EcoJSONConfigWrapper : JSONConfig {
} }
} }
override fun getDoubles(path: String): List<Double> { override fun getDoubles(path: String): MutableList<Double> {
return Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), ArrayList<Any>()) as List<Double> return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Double>()) as List<Double>).toMutableList()
} }
override fun getDoublesOrNull(path: String): List<Double>? { override fun getDoublesOrNull(path: String): MutableList<Double>? {
return if (has(path)) { return if (has(path)) {
getDoubles(path) getDoubles(path)
} else { } else {

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.internal.config.updating package com.willfp.eco.internal.config.updating
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.config.interfaces.LoadableConfig import com.willfp.eco.core.config.interfaces.LoadableConfig
import com.willfp.eco.core.config.updating.ConfigHandler import com.willfp.eco.core.config.updating.ConfigHandler
import com.willfp.eco.core.config.updating.ConfigUpdater import com.willfp.eco.core.config.updating.ConfigUpdater
@@ -14,14 +13,14 @@ import org.reflections.scanners.MethodAnnotationsScanner
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
class EcoConfigHandler( class EcoConfigHandler(
plugin: EcoPlugin private val plugin: EcoPlugin
) : PluginDependent<EcoPlugin>(plugin), ConfigHandler { ) : ConfigHandler {
private val reflections: Reflections = Reflections( private val reflections: Reflections = Reflections(
this.plugin::class.java.classLoader, this.plugin::class.java.classLoader,
MethodAnnotationsScanner() MethodAnnotationsScanner()
) )
private val configs: MutableList<LoadableConfig> = ArrayList() private val configs = mutableListOf<LoadableConfig>()
override fun callUpdate() { override fun callUpdate() {
for (method in reflections.getMethodsAnnotatedWith(ConfigUpdater::class.java)) { for (method in reflections.getMethodsAnnotatedWith(ConfigUpdater::class.java)) {

View File

@@ -10,7 +10,7 @@ import java.io.StringReader
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config { open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
lateinit var handle: T lateinit var handle: T
private val cache: MutableMap<String, Any?> = HashMap() private val cache = mutableMapOf<String, Any?>()
protected fun init(config: T): Config { protected fun init(config: T): Config {
handle = config handle = config
@@ -98,16 +98,16 @@ open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
} }
} }
override fun getInts(path: String): List<Int> { override fun getInts(path: String): MutableList<Int> {
return if (cache.containsKey(path)) { return if (cache.containsKey(path)) {
cache[path] as List<Int> (cache[path] as MutableList<Int>).toMutableList()
} else { } else {
cache[path] = if (has(path)) ArrayList(handle.getIntegerList(path)) else ArrayList<Any>() cache[path] = if (has(path)) ArrayList(handle.getIntegerList(path)) else mutableListOf<Int>()
getInts(path) getInts(path)
} }
} }
override fun getIntsOrNull(path: String): List<Int>? { override fun getIntsOrNull(path: String): MutableList<Int>? {
return if (has(path)) { return if (has(path)) {
getInts(path) getInts(path)
} else { } else {
@@ -132,17 +132,17 @@ open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
} }
} }
override fun getBools(path: String): List<Boolean> { override fun getBools(path: String): MutableList<Boolean> {
return if (cache.containsKey(path)) { return if (cache.containsKey(path)) {
cache[path] as List<Boolean> (cache[path] as MutableList<Boolean>).toMutableList()
} else { } else {
cache[path] = cache[path] =
if (has(path)) ArrayList(handle.getBooleanList(path)) else ArrayList<Any>() if (has(path)) ArrayList(handle.getBooleanList(path)) else mutableListOf<Boolean>()
getBools(path) getBools(path)
} }
} }
override fun getBoolsOrNull(path: String): List<Boolean>? { override fun getBoolsOrNull(path: String): MutableList<Boolean>? {
return if (has(path)) { return if (has(path)) {
getBools(path) getBools(path)
} else { } else {
@@ -150,92 +150,80 @@ open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
} }
} }
override fun getString(path: String): String {
return getString(path, true)
}
override fun getString( override fun getString(
path: String, path: String,
format: Boolean format: Boolean,
option: StringUtils.FormatOption
): String { ): String {
if (format) { if (format && option == StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) {
return if (cache.containsKey("$path\$FMT")) { return if (cache.containsKey("$path\$FMT")) {
cache["$path\$FMT"] as String cache["$path\$FMT"] as String
} else { } else {
val string: String = handle.getString(path, "")!! val string: String = handle.getString(path, "")!!
cache["$path\$FMT"] = StringUtils.format(string) cache["$path\$FMT"] = StringUtils.format(string, option)
getString(path, format) getString(path, format, option)
} }
} else { } else {
return if (cache.containsKey(path)) { val string = if (cache.containsKey(path)) {
cache[path] as String cache[path] as String
} else { } else {
cache[path] = handle.getString(path, "")!! cache[path] = handle.getString(path, "")!!
getString(path) getString(path, format, option)
} }
}
}
override fun getStringOrNull(path: String): String? { return if (format) StringUtils.format(string) else string
return if (has(path)) {
getString(path)
} else {
null
} }
} }
override fun getStringOrNull( override fun getStringOrNull(
path: String, path: String,
format: Boolean format: Boolean,
option: StringUtils.FormatOption
): String? { ): String? {
return if (has(path)) { return if (has(path)) {
getString(path, format) getString(path, format, option)
} else { } else {
null null
} }
} }
override fun getStrings(path: String): List<String> {
return getStrings(path, true)
}
override fun getStrings( override fun getStrings(
path: String, path: String,
format: Boolean format: Boolean,
): List<String> { option: StringUtils.FormatOption
if (format) { ): MutableList<String> {
if (format && option == StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) {
return if (cache.containsKey("$path\$FMT")) { return if (cache.containsKey("$path\$FMT")) {
cache["$path\$FMT"] as List<String> (cache["$path\$FMT"] as MutableList<String>).toMutableList()
} else { } else {
val list = if (has(path)) handle.getStringList(path) else ArrayList() val list = if (has(path)) handle.getStringList(path) else mutableListOf<String>()
cache["$path\$FMT"] = StringUtils.formatList(list); cache["$path\$FMT"] = StringUtils.formatList(list, option)
getStrings(path, true) getStrings(path, true, option)
} }
} else { } else {
return if (cache.containsKey(path)) { val strings = if (cache.containsKey(path)) {
cache[path] as List<String> (cache[path] as MutableList<String>).toMutableList()
} else { } else {
cache[path] = cache[path] =
if (has(path)) ArrayList(handle.getStringList(path)) else ArrayList<Any>() if (has(path)) ArrayList(handle.getStringList(path)) else mutableListOf<String>()
getStrings(path, false) getStrings(path, false, option)
} }
}
}
override fun getStringsOrNull(path: String): List<String>? { return if (format) {
return if (has(path)) { StringUtils.formatList(strings, StringUtils.FormatOption.WITH_PLACEHOLDERS)
getStrings(path) } else {
} else { strings
null }
} }
} }
override fun getStringsOrNull( override fun getStringsOrNull(
path: String, path: String,
format: Boolean format: Boolean,
): List<String>? { option: StringUtils.FormatOption
): MutableList<String>? {
return if (has(path)) { return if (has(path)) {
getStrings(path, format) getStrings(path, format, option)
} else { } else {
null null
} }
@@ -258,16 +246,16 @@ open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
} }
} }
override fun getDoubles(path: String): List<Double> { override fun getDoubles(path: String): MutableList<Double> {
return if (cache.containsKey(path)) { return if (cache.containsKey(path)) {
cache[path] as List<Double> (cache[path] as MutableList<Double>).toMutableList()
} else { } else {
cache[path] = if (has(path)) ArrayList(handle.getDoubleList(path)) else ArrayList<Any>() cache[path] = if (has(path)) ArrayList(handle.getDoubleList(path)) else emptyList<Double>()
getDoubles(path) getDoubles(path)
} }
} }
override fun getDoublesOrNull(path: String): List<Double>? { override fun getDoublesOrNull(path: String): MutableList<Double>? {
return if (has(path)) { return if (has(path)) {
getDoubles(path) getDoubles(path)
} else { } else {

View File

@@ -13,8 +13,8 @@ import org.bukkit.inventory.ItemStack
import org.bukkit.util.Vector import org.bukkit.util.Vector
open class EcoDropQueue(player: Player) : InternalDropQueue { open class EcoDropQueue(player: Player) : InternalDropQueue {
val items: MutableList<ItemStack> val items = mutableListOf<ItemStack>()
var xp: Int var xp: Int = 0
val player: Player val player: Player
var loc: Location var loc: Location
var hasTelekinesis = false var hasTelekinesis = false
@@ -79,8 +79,6 @@ open class EcoDropQueue(player: Player) : InternalDropQueue {
} }
init { init {
items = ArrayList()
xp = 0
this.player = player this.player = player
loc = player.location loc = player.location
} }

View File

@@ -1,13 +1,12 @@
package com.willfp.eco.internal.events package com.willfp.eco.internal.events
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.events.EventManager import com.willfp.eco.core.events.EventManager
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.event.HandlerList import org.bukkit.event.HandlerList
import org.bukkit.event.Listener import org.bukkit.event.Listener
class EcoEventManager constructor(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), EventManager { class EcoEventManager constructor(private val plugin: EcoPlugin) : EventManager {
override fun registerListener(listener: Listener) { override fun registerListener(listener: Listener) {
Bukkit.getPluginManager().registerEvents(listener, plugin) Bukkit.getPluginManager().registerEvents(listener, plugin)
} }

View File

@@ -2,7 +2,6 @@ package com.willfp.eco.internal.extensions
import com.google.common.collect.ImmutableSet import com.google.common.collect.ImmutableSet
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.config.yaml.YamlTransientConfig import com.willfp.eco.core.config.yaml.YamlTransientConfig
import com.willfp.eco.core.extensions.Extension import com.willfp.eco.core.extensions.Extension
import com.willfp.eco.core.extensions.ExtensionLoader import com.willfp.eco.core.extensions.ExtensionLoader
@@ -16,9 +15,9 @@ import java.net.URL
import java.net.URLClassLoader import java.net.URLClassLoader
class EcoExtensionLoader( class EcoExtensionLoader(
plugin: EcoPlugin private val plugin: EcoPlugin
) : PluginDependent<EcoPlugin>(plugin), ExtensionLoader { ) : ExtensionLoader {
private val extensions: MutableMap<Extension, URLClassLoader> = HashMap() private val extensions = mutableMapOf<Extension, URLClassLoader>()
override fun loadExtensions() { override fun loadExtensions() {
val dir = File(this.plugin.dataFolder, "/extensions") val dir = File(this.plugin.dataFolder, "/extensions")
@@ -43,7 +42,7 @@ class EcoExtensionLoader(
@Throws(MalformedExtensionException::class) @Throws(MalformedExtensionException::class)
private fun loadExtension(extensionJar: File) { private fun loadExtension(extensionJar: File) {
lateinit var url : URL lateinit var url: URL
try { try {
url = extensionJar.toURI().toURL() url = extensionJar.toURI().toURL()
@@ -53,7 +52,7 @@ class EcoExtensionLoader(
val classLoader = URLClassLoader(arrayOf(url), this.plugin::class.java.classLoader) val classLoader = URLClassLoader(arrayOf(url), this.plugin::class.java.classLoader)
val ymlIn = classLoader.getResourceAsStream("extension.yml") val ymlIn = classLoader.getResourceAsStream("extension.yml")
?: throw MalformedExtensionException ("No extension.yml found in " + extensionJar.name) ?: throw MalformedExtensionException("No extension.yml found in " + extensionJar.name)
val extensionYml = YamlTransientConfig(YamlConfiguration.loadConfiguration(InputStreamReader(ymlIn))) val extensionYml = YamlTransientConfig(YamlConfiguration.loadConfiguration(InputStreamReader(ymlIn)))
@@ -64,7 +63,7 @@ class EcoExtensionLoader(
if (mainClass == null) { if (mainClass == null) {
throw MalformedExtensionException ("Invalid extension.yml found in " + extensionJar.name) throw MalformedExtensionException("Invalid extension.yml found in " + extensionJar.name)
} }
if (name == null) { if (name == null) {

View File

@@ -1,11 +1,10 @@
package com.willfp.eco.internal.factory package com.willfp.eco.internal.factory
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.factory.MetadataValueFactory import com.willfp.eco.core.factory.MetadataValueFactory
import org.bukkit.metadata.FixedMetadataValue import org.bukkit.metadata.FixedMetadataValue
class EcoMetadataValueFactory(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), MetadataValueFactory { class EcoMetadataValueFactory(private val plugin: EcoPlugin) : MetadataValueFactory {
override fun create(value: Any): FixedMetadataValue { override fun create(value: Any): FixedMetadataValue {
return FixedMetadataValue(plugin, value) return FixedMetadataValue(plugin, value)
} }

View File

@@ -1,11 +1,10 @@
package com.willfp.eco.internal.factory package com.willfp.eco.internal.factory
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.factory.NamespacedKeyFactory import com.willfp.eco.core.factory.NamespacedKeyFactory
import org.bukkit.NamespacedKey import org.bukkit.NamespacedKey
class EcoNamespacedKeyFactory(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), NamespacedKeyFactory { class EcoNamespacedKeyFactory(private val plugin: EcoPlugin) : NamespacedKeyFactory {
override fun create(key: String): NamespacedKey { override fun create(key: String): NamespacedKey {
return NamespacedKey(plugin, key) return NamespacedKey(plugin, key)
} }

View File

@@ -1,13 +1,12 @@
package com.willfp.eco.internal.factory package com.willfp.eco.internal.factory
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.factory.RunnableFactory import com.willfp.eco.core.factory.RunnableFactory
import com.willfp.eco.core.scheduling.RunnableTask import com.willfp.eco.core.scheduling.RunnableTask
import com.willfp.eco.internal.scheduling.EcoRunnableTask import com.willfp.eco.internal.scheduling.EcoRunnableTask
import java.util.function.Consumer import java.util.function.Consumer
class EcoRunnableFactory(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), RunnableFactory { class EcoRunnableFactory(private val plugin: EcoPlugin) : RunnableFactory {
override fun create(consumer: Consumer<RunnableTask>): RunnableTask { override fun create(consumer: Consumer<RunnableTask>): RunnableTask {
return object : EcoRunnableTask(plugin) { return object : EcoRunnableTask(plugin) {
override fun run() { override fun run() {

View File

@@ -1,6 +1,7 @@
package com.willfp.eco.internal.fast package com.willfp.eco.internal.fast
import com.willfp.eco.core.fast.FastItemStack import com.willfp.eco.core.fast.FastItemStack
import org.bukkit.inventory.ItemFlag
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
abstract class EcoFastItemStack<T: Any>( abstract class EcoFastItemStack<T: Any>(
@@ -10,4 +11,8 @@ abstract class EcoFastItemStack<T: Any>(
override fun unwrap(): ItemStack { override fun unwrap(): ItemStack {
return bukkit return bukkit
} }
fun getBitModifier(hideFlag: ItemFlag): Int {
return 1 shl hideFlag.ordinal
}
} }

View File

@@ -63,6 +63,7 @@ class EcoMenu(
fun handleClose(event: InventoryCloseEvent) { fun handleClose(event: InventoryCloseEvent) {
onClose.handle(event, this) onClose.handle(event, this)
MenuHandler.unregisterMenu(event.inventory)
} }
override fun getRows(): Int { override fun getRows(): Int {
@@ -75,7 +76,7 @@ class EcoMenu(
override fun getCaptiveItems(player: Player): MutableList<ItemStack> { override fun getCaptiveItems(player: Player): MutableList<ItemStack> {
val inventory = MenuHandler.getExtendedInventory(player.openInventory.topInventory) val inventory = MenuHandler.getExtendedInventory(player.openInventory.topInventory)
inventory ?: return ArrayList() inventory ?: return mutableListOf()
return inventory.captiveItems return inventory.captiveItems
} }

View File

@@ -61,10 +61,10 @@ class EcoMenuBuilder(private val rows: Int) : MenuBuilder {
} }
} }
val finalSlots: MutableList<MutableList<EcoSlot>> = ArrayList() val finalSlots = mutableListOf<MutableList<EcoSlot>>()
for (row in tempSlots) { for (row in tempSlots) {
val tempRow = ArrayList<EcoSlot>() val tempRow = mutableListOf<EcoSlot>()
for (slot in row) { for (slot in row) {
var tempSlot = slot var tempSlot = slot
if (tempSlot is FillerSlot) { if (tempSlot is FillerSlot) {

View File

@@ -12,8 +12,8 @@ class ExtendedInventory(
val inventory: Inventory, val inventory: Inventory,
private val menu: EcoMenu private val menu: EcoMenu
) { ) {
val captiveItems: MutableList<ItemStack> = ArrayList() val captiveItems = mutableListOf<ItemStack>()
val data: MutableMap<NamespacedKey, Any> = HashMap() val data = mutableMapOf<NamespacedKey, Any>()
fun refresh(player: Player) { fun refresh(player: Player) {
captiveItems.clear() captiveItems.clear()

View File

@@ -4,28 +4,28 @@ import com.willfp.eco.core.gui.menu.Menu
import org.bukkit.inventory.Inventory import org.bukkit.inventory.Inventory
object MenuHandler { object MenuHandler {
private val MENUS: MutableMap<ExtendedInventory, EcoMenu> = HashMap() private val menus = mutableMapOf<ExtendedInventory, EcoMenu>()
private val INVS: MutableMap<Inventory, ExtendedInventory> = HashMap() private val inventories = mutableMapOf<Inventory, ExtendedInventory>()
fun registerMenu( fun registerMenu(
inventory: Inventory, inventory: Inventory,
menu: EcoMenu menu: EcoMenu
) { ) {
val extendedInventory = ExtendedInventory(inventory, menu) val extendedInventory = ExtendedInventory(inventory, menu)
INVS[inventory] = extendedInventory inventories[inventory] = extendedInventory
MENUS[extendedInventory] = menu menus[extendedInventory] = menu
} }
fun unregisterMenu(inventory: Inventory) { fun unregisterMenu(inventory: Inventory) {
MENUS.remove(INVS[inventory]) menus.remove(inventories[inventory])
INVS.remove(inventory) inventories.remove(inventory)
} }
fun getMenu(inventory: Inventory): Menu? { fun getMenu(inventory: Inventory): Menu? {
return MENUS[INVS[inventory]] return menus[inventories[inventory]]
} }
fun getExtendedInventory(inventory: Inventory): ExtendedInventory? { fun getExtendedInventory(inventory: Inventory): ExtendedInventory? {
return INVS[inventory] return inventories[inventory]
} }
} }

View File

@@ -8,7 +8,7 @@ import com.willfp.eco.core.gui.slot.functional.SlotProvider
class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder { class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder {
private var captive = false private var captive = false
var modifier: SlotModifier = SlotModifier{ player, menu, _ -> provider.provide(player, menu)} private var modifier: SlotModifier = SlotModifier{ player, menu, _ -> provider.provide(player, menu)}
private var onLeftClick = private var onLeftClick =
SlotHandler { _, _, _ -> run { } } SlotHandler { _, _, _ -> run { } }

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.internal.proxy; package com.willfp.eco.internal.proxy
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.proxy.AbstractProxy import com.willfp.eco.core.proxy.AbstractProxy
import com.willfp.eco.core.proxy.ProxyConstants import com.willfp.eco.core.proxy.ProxyConstants
import com.willfp.eco.core.proxy.ProxyFactory import com.willfp.eco.core.proxy.ProxyFactory
@@ -11,8 +10,8 @@ import java.net.URLClassLoader
import java.util.* import java.util.*
class EcoProxyFactory( class EcoProxyFactory(
plugin: EcoPlugin private val plugin: EcoPlugin
) : PluginDependent<EcoPlugin>(plugin), ProxyFactory { ) : ProxyFactory {
private val proxyClassLoader: ClassLoader = plugin::class.java.classLoader private val proxyClassLoader: ClassLoader = plugin::class.java.classLoader
private val cache: MutableMap<Class<out AbstractProxy>, AbstractProxy> = IdentityHashMap() private val cache: MutableMap<Class<out AbstractProxy>, AbstractProxy> = IdentityHashMap()

View File

@@ -1,12 +1,11 @@
package com.willfp.eco.internal.scheduling package com.willfp.eco.internal.scheduling
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.scheduling.Scheduler import com.willfp.eco.core.scheduling.Scheduler
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.scheduler.BukkitTask import org.bukkit.scheduler.BukkitTask
class EcoScheduler(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), Scheduler { class EcoScheduler(private val plugin: EcoPlugin) : Scheduler {
override fun runLater( override fun runLater(
runnable: Runnable, runnable: Runnable,
ticksLater: Long ticksLater: Long

View File

@@ -1,32 +1,43 @@
package com.willfp.eco.proxy.v1_16_R3 package com.willfp.eco.proxy.v1_16_R3
import com.mojang.authlib.GameProfile import com.mojang.authlib.GameProfile
import com.mojang.authlib.properties.Property import com.mojang.authlib.properties.Property
import org.bukkit.inventory.meta.SkullMeta
import com.willfp.eco.proxy.SkullProxy import com.willfp.eco.proxy.SkullProxy
import org.bukkit.inventory.meta.SkullMeta
import java.lang.reflect.Field
import java.lang.reflect.Method import java.lang.reflect.Method
import java.util.* import java.util.*
class Skull : SkullProxy { class Skull : SkullProxy {
private lateinit var setProfile: Method private lateinit var setProfile: Method
private lateinit var profile: Field
override fun setSkullTexture( override fun setSkullTexture(
meta: SkullMeta, meta: SkullMeta,
base64: String base64: String
) { ) {
try { if (!this::setProfile.isInitialized) {
if (!this::setProfile.isInitialized) { setProfile = meta.javaClass.getDeclaredMethod("setProfile", GameProfile::class.java)
setProfile = meta.javaClass.getDeclaredMethod("setProfile", GameProfile::class.java) setProfile.isAccessible = true
setProfile.isAccessible = true
}
val uuid = UUID(
base64.substring(base64.length - 20).hashCode().toLong(),
base64.substring(base64.length - 10).hashCode().toLong()
)
val profile = GameProfile(uuid, "eco")
profile.properties.put("textures", Property("textures", base64))
setProfile.invoke(meta, profile)
} catch (e: ReflectiveOperationException) {
e.printStackTrace()
} }
val uuid = UUID(
base64.substring(base64.length - 20).hashCode().toLong(),
base64.substring(base64.length - 10).hashCode().toLong()
)
val profile = GameProfile(uuid, "eco")
profile.properties.put("textures", Property("textures", base64))
setProfile.invoke(meta, profile)
}
override fun getSkullTexture(
meta: SkullMeta
): String? {
if (!this::profile.isInitialized) {
profile = meta.javaClass.getDeclaredField("profile")
profile.isAccessible = true
}
val profile = profile[meta] as GameProfile?
val property = profile?.properties?.get("textures") as Property?
return property?.value
} }
} }

View File

@@ -1,9 +1,9 @@
package com.willfp.eco.proxy.v1_16_R3 package com.willfp.eco.proxy.v1_16_R3
import com.willfp.eco.core.display.Display import com.willfp.eco.core.display.Display
import com.willfp.eco.proxy.VillagerTradeProxy
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftMerchantRecipe import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftMerchantRecipe
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.MerchantRecipe import org.bukkit.inventory.MerchantRecipe
import com.willfp.eco.proxy.VillagerTradeProxy
import java.lang.reflect.Field import java.lang.reflect.Field
class VillagerTrade : VillagerTradeProxy { class VillagerTrade : VillagerTradeProxy {
@@ -15,7 +15,7 @@ class VillagerTrade : VillagerTradeProxy {
): MerchantRecipe { ): MerchantRecipe {
val oldRecipe = recipe as CraftMerchantRecipe val oldRecipe = recipe as CraftMerchantRecipe
val newRecipe = CraftMerchantRecipe( val newRecipe = CraftMerchantRecipe(
Display.display(recipe.getResult().clone()), Display.display(recipe.getResult().clone(), player),
recipe.getUses(), recipe.getUses(),
recipe.getMaxUses(), recipe.getMaxUses(),
recipe.hasExperienceReward(), recipe.hasExperienceReward(),

View File

@@ -8,7 +8,7 @@ import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
import org.bukkit.craftbukkit.v1_16_R3.util.CraftMagicNumbers import org.bukkit.craftbukkit.v1_16_R3.util.CraftMagicNumbers
import org.bukkit.craftbukkit.v1_16_R3.util.CraftNamespacedKey import org.bukkit.craftbukkit.v1_16_R3.util.CraftNamespacedKey
import org.bukkit.enchantments.Enchantment import org.bukkit.enchantments.Enchantment
import java.lang.reflect.Field import org.bukkit.inventory.ItemFlag
import kotlin.experimental.and import kotlin.experimental.and
class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack<ItemStack>( class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack<ItemStack>(
@@ -96,12 +96,59 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
} }
} }
override fun addItemFlags(vararg hideFlags: ItemFlag) {
for (flag in hideFlags) {
this.flagBits = this.flagBits or getBitModifier(flag)
}
apply()
}
override fun removeItemFlags(vararg hideFlags: ItemFlag) {
for (flag in hideFlags) {
this.flagBits = this.flagBits and getBitModifier(flag)
}
apply()
}
override fun getItemFlags(): MutableSet<ItemFlag> {
val flags = mutableSetOf<ItemFlag>()
var flagArr: Array<ItemFlag>
val size = ItemFlag.values().also { flagArr = it }.size
for (i in 0 until size) {
val flag = flagArr[i]
if (this.hasItemFlag(flag)) {
flags.add(flag)
}
}
return flags
}
override fun hasItemFlag(flag: ItemFlag): Boolean {
val bitModifier = getBitModifier(flag)
return this.flagBits and bitModifier == bitModifier
}
private var flagBits: Int
get() =
if (handle.hasTag() && handle.tag!!.hasKeyOfType(
"HideFlags",
99
)
) handle.tag!!.getInt("HideFlags") else 0
set(value) =
handle.orCreateTag.setInt("HideFlags", value)
override fun getRepairCost(): Int { override fun getRepairCost(): Int {
return handle.repairCost; return handle.repairCost
} }
override fun setRepairCost(cost: Int) { override fun setRepairCost(cost: Int) {
handle.repairCost = cost; handle.repairCost = cost
} }
private fun apply() { private fun apply() {
@@ -109,28 +156,4 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
bukkit.itemMeta = CraftItemStack.asCraftMirror(handle).itemMeta bukkit.itemMeta = CraftItemStack.asCraftMirror(handle).itemMeta
} }
} }
companion object {
private var field: Field
init {
lateinit var temp: Field
try {
val handleField = CraftItemStack::class.java.getDeclaredField("handle")
handleField.isAccessible = true
temp = handleField
} catch (e: ReflectiveOperationException) {
e.printStackTrace()
}
field = temp
}
fun getNMSStack(itemStack: org.bukkit.inventory.ItemStack): ItemStack? {
return if (itemStack !is CraftItemStack) {
CraftItemStack.asNMSCopy(itemStack)
} else {
field.get(itemStack) as ItemStack
}
}
}
} }

View File

@@ -4,30 +4,40 @@ import com.mojang.authlib.GameProfile
import com.mojang.authlib.properties.Property import com.mojang.authlib.properties.Property
import com.willfp.eco.proxy.SkullProxy import com.willfp.eco.proxy.SkullProxy
import org.bukkit.inventory.meta.SkullMeta import org.bukkit.inventory.meta.SkullMeta
import java.lang.reflect.Field
import java.lang.reflect.Method import java.lang.reflect.Method
import java.util.* import java.util.*
class Skull : SkullProxy { class Skull : SkullProxy {
private lateinit var setProfile: Method private lateinit var setProfile: Method
private lateinit var profile: Field
override fun setSkullTexture( override fun setSkullTexture(
meta: SkullMeta, meta: SkullMeta,
base64: String base64: String
) { ) {
try { if (!this::setProfile.isInitialized) {
if (!this::setProfile.isInitialized) { setProfile = meta.javaClass.getDeclaredMethod("setProfile", GameProfile::class.java)
setProfile = meta.javaClass.getDeclaredMethod("setProfile", GameProfile::class.java) setProfile.isAccessible = true
setProfile.isAccessible = true
}
val uuid = UUID(
base64.substring(base64.length - 20).hashCode().toLong(),
base64.substring(base64.length - 10).hashCode().toLong()
)
val profile = GameProfile(uuid, "eco")
profile.properties.put("textures", Property("textures", base64))
setProfile.invoke(meta, profile)
} catch (e: ReflectiveOperationException) {
e.printStackTrace()
} }
val uuid = UUID(
base64.substring(base64.length - 20).hashCode().toLong(),
base64.substring(base64.length - 10).hashCode().toLong()
)
val profile = GameProfile(uuid, "eco")
profile.properties.put("textures", Property("textures", base64))
setProfile.invoke(meta, profile)
}
override fun getSkullTexture(
meta: SkullMeta
): String? {
if (!this::profile.isInitialized) {
profile = meta.javaClass.getDeclaredField("profile")
profile.isAccessible = true
}
val profile = profile[meta] as GameProfile?
val property = profile?.properties?.get("textures") as Property?
return property?.value
} }
} }

View File

@@ -1,15 +1,15 @@
package com.willfp.eco.proxy.v1_17_R1 package com.willfp.eco.proxy.v1_17_R1
import com.willfp.eco.core.display.Display import com.willfp.eco.core.display.Display
import com.willfp.eco.proxy.VillagerTradeProxy
import net.minecraft.world.item.trading.MerchantOffer import net.minecraft.world.item.trading.MerchantOffer
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftMerchantRecipe import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftMerchantRecipe
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.MerchantRecipe import org.bukkit.inventory.MerchantRecipe
import com.willfp.eco.proxy.VillagerTradeProxy
import java.lang.reflect.Field import java.lang.reflect.Field
class VillagerTrade : VillagerTradeProxy { class VillagerTrade : VillagerTradeProxy {
private var handle: Field private val handle: Field = CraftMerchantRecipe::class.java.getDeclaredField("handle")
override fun displayTrade( override fun displayTrade(
recipe: MerchantRecipe, recipe: MerchantRecipe,
@@ -17,7 +17,7 @@ class VillagerTrade : VillagerTradeProxy {
): MerchantRecipe { ): MerchantRecipe {
val oldRecipe = recipe as CraftMerchantRecipe val oldRecipe = recipe as CraftMerchantRecipe
val newRecipe = CraftMerchantRecipe( val newRecipe = CraftMerchantRecipe(
Display.display(recipe.getResult().clone()), Display.display(recipe.getResult().clone(), player),
recipe.getUses(), recipe.getUses(),
recipe.getMaxUses(), recipe.getMaxUses(),
recipe.hasExperienceReward(), recipe.hasExperienceReward(),
@@ -32,21 +32,10 @@ class VillagerTrade : VillagerTradeProxy {
} }
private fun getHandle(recipe: CraftMerchantRecipe): MerchantOffer { private fun getHandle(recipe: CraftMerchantRecipe): MerchantOffer {
try { return handle[recipe] as MerchantOffer
return handle[recipe] as MerchantOffer
} catch (e: IllegalAccessException) {
e.printStackTrace()
}
throw IllegalArgumentException("Not CMR")
} }
init { init {
try { handle.isAccessible = true
handle = CraftMerchantRecipe::class.java.getDeclaredField("handle")
handle.isAccessible = true
} catch (e: NoSuchFieldException) {
e.printStackTrace()
throw RuntimeException("Error!")
}
} }
} }

View File

@@ -13,6 +13,7 @@ import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack
import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers
import org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey import org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey
import org.bukkit.enchantments.Enchantment import org.bukkit.enchantments.Enchantment
import org.bukkit.inventory.ItemFlag
import kotlin.experimental.and import kotlin.experimental.and
class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack<ItemStack>( class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack<ItemStack>(
@@ -115,12 +116,59 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
} }
} }
override fun addItemFlags(vararg hideFlags: ItemFlag) {
for (flag in hideFlags) {
this.flagBits = this.flagBits or getBitModifier(flag)
}
apply()
}
override fun removeItemFlags(vararg hideFlags: ItemFlag) {
for (flag in hideFlags) {
this.flagBits = this.flagBits and getBitModifier(flag)
}
apply()
}
override fun getItemFlags(): MutableSet<ItemFlag> {
val flags = mutableSetOf<ItemFlag>()
var flagArr: Array<ItemFlag>
val size = ItemFlag.values().also { flagArr = it }.size
for (i in 0 until size) {
val flag = flagArr[i]
if (this.hasItemFlag(flag)) {
flags.add(flag)
}
}
return flags
}
override fun hasItemFlag(flag: ItemFlag): Boolean {
val bitModifier = getBitModifier(flag)
return this.flagBits and bitModifier == bitModifier
}
private var flagBits: Int
get() =
if (handle.hasTag() && handle.tag!!.contains(
"HideFlags",
99
)
) handle.tag!!.getInt("HideFlags") else 0
set(value) =
handle.orCreateTag.putInt("HideFlags", value)
override fun getRepairCost(): Int { override fun getRepairCost(): Int {
return handle.baseRepairCost; return handle.baseRepairCost
} }
override fun setRepairCost(cost: Int) { override fun setRepairCost(cost: Int) {
handle.setRepairCost(cost); handle.setRepairCost(cost)
} }
private fun apply() { private fun apply() {

View File

@@ -20,8 +20,9 @@ dependencies {
compileOnly 'com.gmail.nossr50.mcMMO:mcMMO:2.1.157' compileOnly 'com.gmail.nossr50.mcMMO:mcMMO:2.1.157'
compileOnly 'me.clip:placeholderapi:2.10.9' compileOnly 'me.clip:placeholderapi:2.10.9'
compileOnly 'com.willfp:Oraxen:e1f4003d8d' compileOnly 'com.willfp:Oraxen:e1f4003d8d'
compileOnly 'com.github.brcdev-minecraft:shopgui-api:2.2.0'
compileOnly 'com.github.LoneDev6:API-ItemsAdder:2.3.8' compileOnly 'com.github.LoneDev6:API-ItemsAdder:2.4.7'
compileOnly 'me.arcaniax:HeadDatabase-API:1.2.0'
// CombatLogX V10 + NewbieHelper Expansion // CombatLogX V10 + NewbieHelper Expansion
compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT' compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT'

View File

@@ -98,16 +98,65 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
return; return;
} }
this.getPlugin().getScheduler().runLater(() -> { boolean isStackedRecipe = false;
for (int i = 0; i < 9; i++) {
ItemStack inMatrix = event.getInventory().getMatrix()[i];
TestableItem inRecipe = matched.getParts().get(i);
if (inRecipe instanceof TestableStack testableStack) { int upperBound = 64;
for (int i = 0; i < 9; i++) {
ItemStack inMatrix = event.getInventory().getMatrix()[i];
TestableItem inRecipe = matched.getParts().get(i);
if (inRecipe instanceof TestableStack testableStack) {
int max = Math.floorDiv(inMatrix.getAmount(), testableStack.getAmount());
if (max < upperBound) {
upperBound = max;
}
isStackedRecipe = true;
} else if (inMatrix != null) {
int max = inMatrix.getAmount();
if (max < upperBound) {
upperBound = max;
}
}
}
if (!isStackedRecipe) {
return;
}
int toGivePerRecipe = event.getRecipe().getResult().getAmount();
int maxStackSize = event.getRecipe().getResult().getMaxStackSize();
while (toGivePerRecipe * upperBound > maxStackSize) {
upperBound--;
}
for (int i = 0; i < 9; i++) {
ItemStack inMatrix = event.getInventory().getMatrix()[i];
TestableItem inRecipe = matched.getParts().get(i);
if (inRecipe instanceof TestableStack testableStack) {
if (event.isShiftClick()) {
int amount = inMatrix.getAmount() + 1;
for (int j = 0; j < upperBound; j++) {
amount -= testableStack.getAmount();
}
inMatrix.setAmount(amount);
} else {
inMatrix.setAmount(inMatrix.getAmount() - (testableStack.getAmount() - 1)); inMatrix.setAmount(inMatrix.getAmount() - (testableStack.getAmount() - 1));
} }
} }
}, 1); }
int finalUpperBound = upperBound;
if (event.isShiftClick()) {
ItemStack result = event.getInventory().getResult();
if (result == null) {
return;
}
result.setAmount(result.getAmount() * finalUpperBound);
event.getInventory().setResult(result);
}
} }
@EventHandler @EventHandler

View File

@@ -31,9 +31,9 @@ import com.willfp.eco.internal.integrations.PlaceholderIntegrationPAPI
import com.willfp.eco.internal.logging.EcoLogger import com.willfp.eco.internal.logging.EcoLogger
import com.willfp.eco.internal.proxy.EcoProxyFactory import com.willfp.eco.internal.proxy.EcoProxyFactory
import com.willfp.eco.internal.scheduling.EcoScheduler import com.willfp.eco.internal.scheduling.EcoScheduler
import com.willfp.eco.proxy.FastItemStackFactoryProxy
import com.willfp.eco.spigot.integrations.bstats.MetricHandler import com.willfp.eco.spigot.integrations.bstats.MetricHandler
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import com.willfp.eco.proxy.FastItemStackFactoryProxy
import java.util.logging.Logger import java.util.logging.Logger
@Suppress("UNUSED") @Suppress("UNUSED")
@@ -105,7 +105,7 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
} }
override fun getLoadedPlugins(): List<String> { override fun getLoadedPlugins(): List<String> {
return ArrayList(Plugins.LOADED_ECO_PLUGINS.keys) return Plugins.LOADED_ECO_PLUGINS.keys.toMutableList()
} }
override fun getPluginByName(name: String): EcoPlugin? { override fun getPluginByName(name: String): EcoPlugin? {

View File

@@ -8,6 +8,10 @@ import com.willfp.eco.core.integrations.anticheat.AnticheatManager
import com.willfp.eco.core.integrations.antigrief.AntigriefManager import com.willfp.eco.core.integrations.antigrief.AntigriefManager
import com.willfp.eco.core.integrations.customitems.CustomItemsManager import com.willfp.eco.core.integrations.customitems.CustomItemsManager
import com.willfp.eco.core.integrations.mcmmo.McmmoManager import com.willfp.eco.core.integrations.mcmmo.McmmoManager
import com.willfp.eco.core.integrations.shop.ShopManager
import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.args.EnchantmentArgParser
import com.willfp.eco.core.items.args.TextureArgParser
import com.willfp.eco.internal.drops.DropManager import com.willfp.eco.internal.drops.DropManager
import com.willfp.eco.proxy.BlockBreakProxy import com.willfp.eco.proxy.BlockBreakProxy
import com.willfp.eco.proxy.FastItemStackFactoryProxy import com.willfp.eco.proxy.FastItemStackFactoryProxy
@@ -19,8 +23,11 @@ import com.willfp.eco.spigot.eventlisteners.*
import com.willfp.eco.spigot.gui.GUIListener import com.willfp.eco.spigot.gui.GUIListener
import com.willfp.eco.spigot.integrations.anticheat.* import com.willfp.eco.spigot.integrations.anticheat.*
import com.willfp.eco.spigot.integrations.antigrief.* import com.willfp.eco.spigot.integrations.antigrief.*
import com.willfp.eco.spigot.integrations.customitems.CustomItemsHeadDatabase
import com.willfp.eco.spigot.integrations.customitems.CustomItemsItemsAdder
import com.willfp.eco.spigot.integrations.customitems.CustomItemsOraxen import com.willfp.eco.spigot.integrations.customitems.CustomItemsOraxen
import com.willfp.eco.spigot.integrations.mcmmo.McmmoIntegrationImpl import com.willfp.eco.spigot.integrations.mcmmo.McmmoIntegrationImpl
import com.willfp.eco.spigot.integrations.shop.ShopShopGuiPlus
import com.willfp.eco.spigot.recipes.ShapedRecipeListener import com.willfp.eco.spigot.recipes.ShapedRecipeListener
import com.willfp.eco.util.BlockUtils import com.willfp.eco.util.BlockUtils
import com.willfp.eco.util.SkullUtils import com.willfp.eco.util.SkullUtils
@@ -41,8 +48,14 @@ abstract class EcoSpigotPlugin : EcoPlugin(
init { init {
Display.setFinalizeKey(namespacedKeyFactory.create("finalized")) Display.setFinalizeKey(namespacedKeyFactory.create("finalized"))
Items.registerArgParser(EnchantmentArgParser())
Items.registerArgParser(TextureArgParser())
val skullProxy = getProxy(SkullProxy::class.java) val skullProxy = getProxy(SkullProxy::class.java)
SkullUtils.initialize { meta: SkullMeta, base64: String -> skullProxy.setSkullTexture(meta, base64) } SkullUtils.initialize(
{ meta: SkullMeta, base64: String -> skullProxy.setSkullTexture(meta, base64) },
{ meta: SkullMeta -> skullProxy.getSkullTexture(meta) }
)
val blockBreakProxy = getProxy(BlockBreakProxy::class.java) val blockBreakProxy = getProxy(BlockBreakProxy::class.java)
BlockUtils.initialize { player: Player, block: Block -> blockBreakProxy.breakBlock(player, block) } BlockUtils.initialize { player: Player, block: Block -> blockBreakProxy.breakBlock(player, block) }
@@ -109,6 +122,11 @@ abstract class EcoSpigotPlugin : EcoPlugin(
// Custom Items // Custom Items
IntegrationLoader("Oraxen") { CustomItemsManager.register(CustomItemsOraxen()) }, IntegrationLoader("Oraxen") { CustomItemsManager.register(CustomItemsOraxen()) },
IntegrationLoader("ItemsAdder") { CustomItemsManager.register(CustomItemsItemsAdder(this)) },
IntegrationLoader("HeadDatabase") { CustomItemsManager.register(CustomItemsHeadDatabase()) },
// Shop
IntegrationLoader("ShopGuiPlus") { ShopManager.register(ShopShopGuiPlus()) },
// Misc // Misc
IntegrationLoader("mcMMO") { McmmoManager.register(McmmoIntegrationImpl()) } IntegrationLoader("mcMMO") { McmmoManager.register(McmmoIntegrationImpl()) }
@@ -116,19 +134,14 @@ abstract class EcoSpigotPlugin : EcoPlugin(
} }
override fun loadPacketAdapters(): List<AbstractPacketAdapter> { override fun loadPacketAdapters(): List<AbstractPacketAdapter> {
val adapters = mutableListOf( return listOf(
PacketAutoRecipe(this), PacketAutoRecipe(this),
PacketChat(this), PacketChat(this),
PacketSetCreativeSlot(this), PacketSetCreativeSlot(this),
PacketSetSlot(this), PacketSetSlot(this),
PacketWindowItems(this) PacketWindowItems(this),
PacketOpenWindowMerchant(this)
) )
if (!configYml.getBool("disable-display-on-villagers")) {
adapters.add(PacketOpenWindowMerchant(this))
}
return adapters
} }
override fun loadListeners(): List<Listener> { override fun loadListeners(): List<Listener> {

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.spigot.arrows package com.willfp.eco.spigot.arrows
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.entity.Arrow import org.bukkit.entity.Arrow
import org.bukkit.entity.LivingEntity import org.bukkit.entity.LivingEntity
@@ -11,8 +10,8 @@ import org.bukkit.event.Listener
import org.bukkit.event.entity.ProjectileLaunchEvent import org.bukkit.event.entity.ProjectileLaunchEvent
class ArrowDataListener( class ArrowDataListener(
plugin: EcoPlugin private val plugin: EcoPlugin
) : PluginDependent<EcoPlugin>(plugin), Listener { ) : Listener {
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
fun onLaunch(event:ProjectileLaunchEvent) { fun onLaunch(event:ProjectileLaunchEvent) {

View File

@@ -19,7 +19,7 @@ class PacketOpenWindowMerchant(plugin: EcoPlugin) :
player: Player, player: Player,
event: PacketEvent event: PacketEvent
) { ) {
val recipes: MutableList<MerchantRecipe> = ArrayList() val recipes = mutableListOf<MerchantRecipe>()
/* /*

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.spigot.eventlisteners package com.willfp.eco.spigot.eventlisteners
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import org.bukkit.entity.LivingEntity import org.bukkit.entity.LivingEntity
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority import org.bukkit.event.EventPriority
@@ -11,8 +10,8 @@ import org.bukkit.event.entity.EntityDeathEvent
import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.atomic.AtomicReference
class EntityDeathByEntityListeners( class EntityDeathByEntityListeners(
plugin: EcoPlugin private val plugin: EcoPlugin
) : PluginDependent<EcoPlugin>(plugin), Listener { ) : Listener {
private val events = HashSet<EntityDeathByEntityBuilder>() private val events = HashSet<EntityDeathByEntityBuilder>()
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.spigot.gui package com.willfp.eco.spigot.gui
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.drops.DropQueue import com.willfp.eco.core.drops.DropQueue
import com.willfp.eco.internal.gui.menu.EcoMenu import com.willfp.eco.internal.gui.menu.EcoMenu
import com.willfp.eco.internal.gui.menu.MenuHandler import com.willfp.eco.internal.gui.menu.MenuHandler
@@ -16,7 +15,7 @@ import org.bukkit.event.inventory.ClickType
import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.InventoryCloseEvent import org.bukkit.event.inventory.InventoryCloseEvent
class GUIListener(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), Listener { class GUIListener(private val plugin: EcoPlugin) : Listener {
@EventHandler @EventHandler
fun handleSlotClick(event: InventoryClickEvent) { fun handleSlotClick(event: InventoryClickEvent) {
val player = event.whoClicked val player = event.whoClicked
@@ -39,7 +38,7 @@ class GUIListener(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), Liste
val extendedInventory = MenuHandler.getExtendedInventory(event.clickedInventory!!) ?: return val extendedInventory = MenuHandler.getExtendedInventory(event.clickedInventory!!) ?: return
plugin.scheduler.run{ extendedInventory.refresh(player) } plugin.scheduler.run { extendedInventory.refresh(player) }
} }
@EventHandler @EventHandler
@@ -52,7 +51,7 @@ class GUIListener(plugin: EcoPlugin) : PluginDependent<EcoPlugin>(plugin), Liste
MenuHandler.getMenu(player.openInventory.topInventory) ?: return MenuHandler.getMenu(player.openInventory.topInventory) ?: return
MenuHandler.getExtendedInventory(player.openInventory.topInventory) ?: return MenuHandler.getExtendedInventory(player.openInventory.topInventory) ?: return
plugin.scheduler.run{ MenuHandler.getExtendedInventory(player.openInventory.topInventory)?.refresh(player) } plugin.scheduler.run { MenuHandler.getExtendedInventory(player.openInventory.topInventory)?.refresh(player) }
} }
@EventHandler @EventHandler

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.spigot.integrations.antigrief package com.willfp.eco.spigot.integrations.antigrief
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.PluginDependent
import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper
import me.angeschossen.lands.api.integration.LandsIntegration import me.angeschossen.lands.api.integration.LandsIntegration
import me.angeschossen.lands.api.role.enums.RoleSetting import me.angeschossen.lands.api.role.enums.RoleSetting
@@ -10,8 +9,8 @@ import org.bukkit.block.Block
import org.bukkit.entity.LivingEntity import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player import org.bukkit.entity.Player
class AntigriefLands(plugin: EcoPlugin) : PluginDependent<EcoPlugin?>(plugin), AntigriefWrapper { class AntigriefLands(private val plugin: EcoPlugin) : AntigriefWrapper {
private val landsIntegration = LandsIntegration(this.plugin!!) private val landsIntegration = LandsIntegration(this.plugin)
override fun canBreakBlock( override fun canBreakBlock(
player: Player, player: Player,
block: Block block: Block

View File

@@ -0,0 +1,34 @@
package com.willfp.eco.spigot.integrations.customitems
import com.willfp.eco.core.integrations.customitems.CustomItemsWrapper
import com.willfp.eco.core.items.CustomItem
import com.willfp.eco.util.NamespacedKeyUtils
import me.arcaniax.hdb.api.HeadDatabaseAPI
import me.arcaniax.hdb.enums.CategoryEnum
import java.util.function.Predicate
class CustomItemsHeadDatabase : CustomItemsWrapper {
private val api = HeadDatabaseAPI()
override fun registerAllItems() {
for (categoryEnum in CategoryEnum.values()) {
for (head in api.getHeads(categoryEnum)) {
val stack = head.head
val id = head.id
val key = NamespacedKeyUtils.create("headdb", id.lowercase());
CustomItem(
key,
Predicate { test ->
val headId = api.getItemID(test) ?: return@Predicate false
headId.equals(id, ignoreCase = true)
},
stack
).register()
}
}
}
override fun getPluginName(): String {
return "HeadDatabase"
}
}

View File

@@ -0,0 +1,36 @@
package com.willfp.eco.spigot.integrations.customitems
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.integrations.customitems.CustomItemsWrapper
import com.willfp.eco.core.items.CustomItem
import com.willfp.eco.util.NamespacedKeyUtils
import dev.lone.itemsadder.api.CustomStack
import dev.lone.itemsadder.api.ItemsAdder
import org.bukkit.inventory.ItemStack
import java.util.function.Predicate
class CustomItemsItemsAdder(
private val plugin: EcoPlugin
) : CustomItemsWrapper {
override fun registerAllItems() {
plugin.scheduler.runLater({
for (item in ItemsAdder.getAllItems()) {
val stack = item.itemStack
val id = item.id
val key = NamespacedKeyUtils.create("itemsadder", id.lowercase())
CustomItem(
key,
Predicate { test: ItemStack ->
val customStack = CustomStack.byItemStack(test) ?: return@Predicate false
customStack.id.equals(id, ignoreCase = true)
},
stack
).register()
}
}, 2)
}
override fun getPluginName(): String {
return "ItemsAdder"
}
}

View File

@@ -23,4 +23,8 @@ class CustomItemsOraxen : CustomItemsWrapper {
).register() ).register()
} }
} }
override fun getPluginName(): String {
return "Oraxen"
}
} }

View File

@@ -0,0 +1,31 @@
package com.willfp.eco.spigot.integrations.shop
import com.willfp.eco.core.integrations.shop.ShopWrapper
import com.willfp.eco.core.items.Items
import net.brcdev.shopgui.ShopGuiPlusApi
import net.brcdev.shopgui.provider.item.ItemProvider
import org.bukkit.configuration.ConfigurationSection
import org.bukkit.inventory.ItemStack
class ShopShopGuiPlus : ShopWrapper {
override fun registerEcoProvider() {
ShopGuiPlusApi.registerItemProvider(EcoShopGuiPlusProvider())
}
class EcoShopGuiPlusProvider : ItemProvider("eco") {
override fun isValidItem(itemStack: ItemStack?): Boolean {
itemStack ?: return false
return Items.isCustomItem(itemStack)
}
override fun loadItem(configurationSection: ConfigurationSection): ItemStack? {
val id = configurationSection.getString("eco")
return if (id == null) null else Items.lookup(id)?.item
}
override fun compare(itemStack1: ItemStack, itemStack2: ItemStack): Boolean {
return Items.getCustomItem(itemStack1)?.key == Items.getCustomItem(itemStack2)?.key
}
}
}

View File

@@ -5,7 +5,6 @@
# Options to fix villager bugs left behind from old (buggy) versions. # Options to fix villager bugs left behind from old (buggy) versions.
disable-display-on-villagers: false
villager-display-fix: false villager-display-fix: false
# DropQueue by default uses a faster collated queue system where all drops # DropQueue by default uses a faster collated queue system where all drops

View File

@@ -4,6 +4,7 @@ main: com.willfp.eco.spigot.EcoHandler
api-version: 1.16 api-version: 1.16
authors: [Auxilor] authors: [Auxilor]
website: willfp.com website: willfp.com
load: STARTUP
depend: depend:
- ProtocolLib - ProtocolLib
softdepend: softdepend:
@@ -20,6 +21,10 @@ softdepend:
- PlaceholderAPI - PlaceholderAPI
- mcMMO - mcMMO
- CombatLogX - CombatLogX
- ShopGuiPlus
- ItemsAdder
- Oraxen
- HeadDatabase
libraries: libraries:
- org.reflections:reflections:0.9.12 - org.reflections:reflections:0.9.12
- org.apache.maven:maven-artifact:3.0.3 - org.apache.maven:maven-artifact:3.0.3

View File

@@ -8,4 +8,8 @@ interface SkullProxy : AbstractProxy {
meta: SkullMeta, meta: SkullMeta,
base64: String base64: String
) )
fun getSkullTexture(
meta: SkullMeta
): String?
} }

View File

@@ -1,2 +1,2 @@
version = 6.5.2 version = 6.7.0
plugin-name = eco plugin-name = eco