Compare commits
50 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8e21617345 | ||
|
|
2f99a17d02 | ||
|
|
34edf1d7b4 | ||
|
|
be85ba5706 | ||
|
|
b817b00ca4 | ||
|
|
ee02528abc | ||
|
|
794948c8f9 | ||
|
|
7c70dec2e7 | ||
|
|
d1f20b7111 | ||
|
|
595751a094 | ||
|
|
8231afdcbf | ||
|
|
4f55d66096 | ||
|
|
d350febbdc | ||
|
|
78755b0e9a | ||
|
|
63d7bdab6b | ||
|
|
344032b7e3 | ||
|
|
3ae5c8a72c | ||
|
|
e4f2bc2e39 | ||
|
|
90ba0a0391 | ||
|
|
801a3cd4f9 | ||
|
|
ce9cada75a | ||
|
|
ae551dd0f7 | ||
|
|
1b3dd53fb8 | ||
|
|
dda4224e6e | ||
|
|
6e14265655 | ||
|
|
77fd99d215 | ||
|
|
cf05efc2ff | ||
|
|
0e8c759a4c | ||
|
|
ba7bfb828b | ||
|
|
8dd1239b99 | ||
|
|
edada09966 | ||
|
|
19c300bbf3 | ||
|
|
4fc9c21034 | ||
|
|
2366dcd293 | ||
|
|
054e6a53c0 | ||
|
|
46f590fe3e | ||
|
|
b46aaf547f | ||
|
|
0f7125e1c8 | ||
|
|
6cb99819f3 | ||
|
|
a018a1fca5 | ||
|
|
8a7b8f2b03 | ||
|
|
abf3dc1e9e | ||
|
|
e92cc41be6 | ||
|
|
49570c841b | ||
|
|
9aa465844d | ||
|
|
a692fbee01 | ||
|
|
4223e8f17a | ||
|
|
5f26b23a53 | ||
|
|
c8c179981c | ||
|
|
4bb8bb62f9 |
@@ -51,23 +51,20 @@ allprojects {
|
||||
|
||||
// CombatLogX
|
||||
maven { url 'https://nexus.sirblobman.xyz/repository/public/' }
|
||||
|
||||
// Head Database
|
||||
maven { url 'https://mvn.intellectualsites.com/content/groups/public/' }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly 'org.jetbrains:annotations:19.0.0'
|
||||
|
||||
// Lombok
|
||||
compileOnly 'org.projectlombok:lombok:1.18.20'
|
||||
compileOnly 'org.projectlombok:lombok:1.18.22'
|
||||
annotationProcessor 'org.projectlombok:lombok:1.18.20'
|
||||
testCompileOnly 'org.projectlombok:lombok:1.18.20'
|
||||
testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
|
||||
|
||||
// Test
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
|
||||
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
|
||||
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile) {
|
||||
@@ -87,7 +84,7 @@ allprojects {
|
||||
|
||||
shadowJar {
|
||||
relocate('org.bstats', 'com.willfp.eco.shaded.bstats')
|
||||
relocate('net.kyori.adventure', 'com.willfp.eco.shaded.adventure')
|
||||
relocate('net.kyori.adventure.text.minimessage', 'com.willfp.eco.shaded.minimessage')
|
||||
}
|
||||
|
||||
jar {
|
||||
|
||||
@@ -6,14 +6,18 @@ group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
dependencies {
|
||||
// Adventure
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
compileOnly 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
||||
compileOnly 'net.kyori:adventure-api:4.9.1'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-gson:4.9.2'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-legacy:4.8.1'
|
||||
|
||||
// Other
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
compileOnly 'org.apache.maven:maven-artifact:3.0.3'
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.0-SNAPSHOT'
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.1-SNAPSHOT'
|
||||
compileOnly 'com.google.code.gson:gson:2.8.7'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-gson:4.8.1'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-legacy:4.8.1'
|
||||
compileOnly 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
}
|
||||
|
||||
java {
|
||||
|
||||
@@ -210,6 +210,6 @@ public interface Handler {
|
||||
*
|
||||
* @return The audiences.
|
||||
*/
|
||||
@NotNull
|
||||
@Nullable
|
||||
BukkitAudiences getAdventure();
|
||||
}
|
||||
|
||||
@@ -29,6 +29,16 @@ public class AntigriefManager {
|
||||
registered.add(antigrief);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister an AntiGrief/Land Management integration.
|
||||
*
|
||||
* @param antigrief The integration to unregister.
|
||||
*/
|
||||
public void unregister(@NotNull final AntigriefWrapper antigrief) {
|
||||
registered.removeIf(it -> it.getPluginName().equalsIgnoreCase(antigrief.getPluginName()));
|
||||
registered.remove(antigrief);
|
||||
}
|
||||
|
||||
/**
|
||||
* Can player break block.
|
||||
*
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
package com.willfp.eco.core.items;
|
||||
|
||||
import com.willfp.eco.core.items.args.LookupArgParser;
|
||||
import com.willfp.eco.core.items.provider.ItemProvider;
|
||||
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
|
||||
import com.willfp.eco.core.recipe.parts.MaterialTestableItem;
|
||||
import com.willfp.eco.core.recipe.parts.ModifiedTestableItem;
|
||||
import com.willfp.eco.core.recipe.parts.TestableStack;
|
||||
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||
import com.willfp.eco.util.NumberUtils;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
@@ -16,12 +18,12 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Class to manage all custom and vanilla items.
|
||||
@@ -31,7 +33,12 @@ public final class Items {
|
||||
/**
|
||||
* All recipe parts.
|
||||
*/
|
||||
private static final Map<NamespacedKey, CustomItem> REGISTRY = new ConcurrentHashMap<>();
|
||||
private static final Map<NamespacedKey, TestableItem> REGISTRY = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* All item providers.
|
||||
*/
|
||||
private static final Map<String, ItemProvider> PROVIDERS = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* All recipe parts.
|
||||
@@ -42,11 +49,20 @@ public final class Items {
|
||||
* Register a new custom item.
|
||||
*
|
||||
* @param key The key of the item.
|
||||
* @param part The item.
|
||||
* @param item The item.
|
||||
*/
|
||||
public void registerCustomItem(@NotNull final NamespacedKey key,
|
||||
@NotNull final CustomItem part) {
|
||||
REGISTRY.put(key, part);
|
||||
@NotNull final TestableItem item) {
|
||||
REGISTRY.put(key, item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a new item provider.
|
||||
*
|
||||
* @param provider The provider.
|
||||
*/
|
||||
public void registerItemProvider(@NotNull final ItemProvider provider) {
|
||||
PROVIDERS.put(provider.getNamespace(), provider);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -123,7 +139,20 @@ public final class Items {
|
||||
}
|
||||
|
||||
if (split.length == 2) {
|
||||
CustomItem part = REGISTRY.get(NamespacedKeyUtils.create(split[0], split[1]));
|
||||
String namespace = split[0];
|
||||
String keyID = split[1];
|
||||
NamespacedKey namespacedKey = NamespacedKeyUtils.create(namespace, keyID);
|
||||
|
||||
TestableItem part = REGISTRY.get(namespacedKey);
|
||||
|
||||
if (part == null && PROVIDERS.containsKey(namespace)) {
|
||||
ItemProvider provider = PROVIDERS.get(namespace);
|
||||
item = provider.provideForKey(keyID);
|
||||
if (item instanceof EmptyTestableItem || item == null) {
|
||||
return new EmptyTestableItem();
|
||||
}
|
||||
registerCustomItem(namespacedKey, item);
|
||||
}
|
||||
|
||||
/*
|
||||
Legacy id:amount format
|
||||
@@ -146,7 +175,7 @@ public final class Items {
|
||||
This has been superseded by namespace:id amount
|
||||
*/
|
||||
if (split.length == 3) {
|
||||
CustomItem part = REGISTRY.get(NamespacedKeyUtils.create(split[0], split[1]));
|
||||
TestableItem part = REGISTRY.get(NamespacedKeyUtils.create(split[0], split[1]));
|
||||
if (part == null) {
|
||||
return new EmptyTestableItem();
|
||||
}
|
||||
@@ -215,7 +244,7 @@ public final class Items {
|
||||
* @return If is recipe.
|
||||
*/
|
||||
public boolean isCustomItem(@NotNull final ItemStack itemStack) {
|
||||
for (CustomItem item : REGISTRY.values()) {
|
||||
for (TestableItem item : REGISTRY.values()) {
|
||||
if (item.matches(itemStack)) {
|
||||
return true;
|
||||
}
|
||||
@@ -231,9 +260,9 @@ public final class Items {
|
||||
*/
|
||||
@Nullable
|
||||
public CustomItem getCustomItem(@NotNull final ItemStack itemStack) {
|
||||
for (CustomItem item : REGISTRY.values()) {
|
||||
for (TestableItem item : REGISTRY.values()) {
|
||||
if (item.matches(itemStack)) {
|
||||
return item;
|
||||
return getOrWrap(item);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -245,6 +274,27 @@ public final class Items {
|
||||
* @return A set of all items.
|
||||
*/
|
||||
public Set<CustomItem> getCustomItems() {
|
||||
return new HashSet<>(REGISTRY.values());
|
||||
return REGISTRY.values().stream().map(Items::getOrWrap).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a CustomItem instance for a given TestableItem.
|
||||
* <p>
|
||||
* Used internally since 6.10.0 when the registration moved from {@link CustomItem}
|
||||
* to {@link TestableItem} for added flexibility.
|
||||
*
|
||||
* @param item The item.
|
||||
* @return The CustomItem.
|
||||
*/
|
||||
public CustomItem getOrWrap(@NotNull final TestableItem item) {
|
||||
if (item instanceof CustomItem) {
|
||||
return (CustomItem) item;
|
||||
} else {
|
||||
return new CustomItem(
|
||||
NamespacedKeyUtils.createEcoKey("wrapped_" + NumberUtils.randInt(0, 100000)),
|
||||
item::matches,
|
||||
item.getItem()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.willfp.eco.core.items.provider;
|
||||
|
||||
import com.willfp.eco.core.items.TestableItem;
|
||||
import lombok.Getter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Item providers are call-site registrations for items. In other words,
|
||||
* they only register their items when a request is made. This is marginally
|
||||
* slower, however it is required for certain plugins, and fixes bugs related to
|
||||
* loading orders.
|
||||
*
|
||||
* @see TestableItem
|
||||
*/
|
||||
public abstract class ItemProvider {
|
||||
/**
|
||||
* The namespace.
|
||||
*/
|
||||
@Getter
|
||||
private final String namespace;
|
||||
|
||||
/**
|
||||
* Create a new ItemProvider for a specific namespace.
|
||||
*
|
||||
* @param namespace The namespace.
|
||||
*/
|
||||
protected ItemProvider(@NotNull final String namespace) {
|
||||
this.namespace = namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide a TestableItem for a given key.
|
||||
*
|
||||
* @param key The item ID.
|
||||
* @return The TestableItem, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
public abstract TestableItem provideForKey(@NotNull final String key);
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
package com.willfp.eco.util;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.Prerequisite;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import net.kyori.adventure.audience.Audience;
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -20,7 +22,21 @@ public class PlayerUtils {
|
||||
*/
|
||||
@NotNull
|
||||
public Audience getAudience(@NotNull final Player player) {
|
||||
return Eco.getHandler().getAdventure().player(player);
|
||||
BukkitAudiences adventure = Eco.getHandler().getAdventure();
|
||||
|
||||
if (Prerequisite.HAS_PAPER.isMet()) {
|
||||
if (player instanceof Audience) {
|
||||
return (Audience) player;
|
||||
} else {
|
||||
return Audience.empty();
|
||||
}
|
||||
} else {
|
||||
if (adventure == null) {
|
||||
return Audience.empty();
|
||||
} else {
|
||||
return adventure.player(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -31,6 +47,20 @@ public class PlayerUtils {
|
||||
*/
|
||||
@NotNull
|
||||
public Audience getAudience(@NotNull final CommandSender sender) {
|
||||
return Eco.getHandler().getAdventure().sender(sender);
|
||||
BukkitAudiences adventure = Eco.getHandler().getAdventure();
|
||||
|
||||
if (Prerequisite.HAS_PAPER.isMet()) {
|
||||
if (sender instanceof Audience) {
|
||||
return (Audience) sender;
|
||||
} else {
|
||||
return Audience.empty();
|
||||
}
|
||||
} else {
|
||||
if (adventure == null) {
|
||||
return Audience.empty();
|
||||
} else {
|
||||
return adventure.sender(sender);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.willfp.eco.util;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.willfp.eco.core.Prerequisite;
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import net.kyori.adventure.text.Component;
|
||||
@@ -251,9 +252,11 @@ public class StringUtils {
|
||||
processedMessage = PlaceholderManager.translatePlaceholders(processedMessage, player);
|
||||
}
|
||||
processedMessage = translateGradients(processedMessage);
|
||||
processedMessage = translateMiniMessage(processedMessage);
|
||||
processedMessage = translateHexColorCodes(processedMessage);
|
||||
processedMessage = ChatColor.translateAlternateColorCodes('&', processedMessage);
|
||||
if (Prerequisite.HAS_PAPER.isMet()) {
|
||||
processedMessage = translateMiniMessage(processedMessage);
|
||||
}
|
||||
return processedMessage;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ buildscript {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21"
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,4 +18,12 @@ subprojects {
|
||||
compileOnly project(":eco-api")
|
||||
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.5.31'
|
||||
}
|
||||
|
||||
compileKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = "16"
|
||||
}
|
||||
targetCompatibility = JavaVersion.VERSION_16
|
||||
sourceCompatibility = JavaVersion.VERSION_16
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,6 @@ import com.willfp.eco.internal.config.yaml.EcoLoadableYamlConfig
|
||||
import com.willfp.eco.internal.config.yaml.EcoUpdatableYamlConfig
|
||||
import org.reflections.Reflections
|
||||
import org.reflections.scanners.MethodAnnotationsScanner
|
||||
import java.lang.reflect.Modifier
|
||||
|
||||
class EcoConfigHandler(
|
||||
private val plugin: EcoPlugin
|
||||
@@ -25,10 +24,6 @@ class EcoConfigHandler(
|
||||
|
||||
override fun callUpdate() {
|
||||
for (method in reflections.getMethodsAnnotatedWith(ConfigUpdater::class.java)) {
|
||||
if (!Modifier.isStatic(method.modifiers)) {
|
||||
throw InvalidUpdateMethodException("Update method in ${method.declaringClass.name} must be static.")
|
||||
}
|
||||
|
||||
try {
|
||||
when (method.parameterCount) {
|
||||
0 -> method.invoke(null)
|
||||
|
||||
@@ -3,4 +3,6 @@ version rootProject.version
|
||||
|
||||
dependencies {
|
||||
compileOnly 'org.spigotmc:spigot:1.16.5-R0.1-SNAPSHOT'
|
||||
compileOnly 'net.kyori:adventure-api:4.9.1'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-gson:4.8.1'
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
package com.willfp.eco.proxy.v1_16_R3;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||
import com.willfp.eco.core.display.Display;
|
||||
import com.willfp.eco.proxy.ChatComponentProxy;
|
||||
import net.minecraft.server.v1_16_R3.ChatBaseComponent;
|
||||
import net.minecraft.server.v1_16_R3.ChatHoverable;
|
||||
import net.minecraft.server.v1_16_R3.ChatMessage;
|
||||
import net.minecraft.server.v1_16_R3.ChatModifier;
|
||||
import net.minecraft.server.v1_16_R3.IChatBaseComponent;
|
||||
import net.minecraft.server.v1_16_R3.MojangsonParser;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public final class ChatComponent implements ChatComponentProxy {
|
||||
@Override
|
||||
public Object modifyComponent(@NotNull final Object obj,
|
||||
@NotNull final Player player) {
|
||||
if (!(obj instanceof IChatBaseComponent chatComponent)) {
|
||||
return obj;
|
||||
}
|
||||
|
||||
for (IChatBaseComponent iChatBaseComponent : chatComponent) {
|
||||
if (iChatBaseComponent == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
modifyBaseComponent(iChatBaseComponent, player);
|
||||
}
|
||||
|
||||
return chatComponent;
|
||||
}
|
||||
|
||||
private void modifyBaseComponent(@NotNull final IChatBaseComponent component,
|
||||
@NotNull final Player player) {
|
||||
for (IChatBaseComponent sibling : component.getSiblings()) {
|
||||
if (sibling == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
modifyBaseComponent(sibling, player);
|
||||
}
|
||||
if (component instanceof ChatMessage) {
|
||||
Arrays.stream(((ChatMessage) component).getArgs())
|
||||
.filter(o -> o instanceof IChatBaseComponent)
|
||||
.map(o -> (IChatBaseComponent) o)
|
||||
.forEach(o -> this.modifyBaseComponent(o, player));
|
||||
}
|
||||
|
||||
ChatHoverable hoverable = component.getChatModifier().getHoverEvent();
|
||||
|
||||
if (hoverable == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
JsonObject jsonObject = hoverable.b();
|
||||
JsonElement json = hoverable.b().get("contents");
|
||||
if (json.getAsJsonObject().get("id") == null) {
|
||||
return;
|
||||
}
|
||||
if (json.getAsJsonObject().get("tag") == null) {
|
||||
return;
|
||||
}
|
||||
String id = json.getAsJsonObject().get("id").toString();
|
||||
String tag = json.getAsJsonObject().get("tag").toString();
|
||||
ItemStack itemStack = getFromTag(tag, id);
|
||||
|
||||
Display.displayAndFinalize(itemStack, player);
|
||||
|
||||
json.getAsJsonObject().remove("tag");
|
||||
String newTag = toJson(itemStack);
|
||||
json.getAsJsonObject().add("tag", new JsonPrimitive(newTag));
|
||||
|
||||
jsonObject.remove("contents");
|
||||
jsonObject.add("contents", json);
|
||||
ChatHoverable newHoverable = ChatHoverable.a(jsonObject);
|
||||
ChatModifier modifier = component.getChatModifier();
|
||||
modifier = modifier.setChatHoverable(newHoverable);
|
||||
|
||||
((ChatBaseComponent) component).setChatModifier(modifier);
|
||||
}
|
||||
|
||||
private static ItemStack getFromTag(@NotNull final String jsonTag,
|
||||
@NotNull final String id) {
|
||||
String processedId = id;
|
||||
String processedJsonTag = jsonTag;
|
||||
processedId = processedId.replace("minecraft:", "");
|
||||
processedId = processedId.toUpperCase();
|
||||
processedId = processedId.replace("\"", "");
|
||||
processedJsonTag = processedJsonTag.substring(1, processedJsonTag.length() - 1);
|
||||
processedJsonTag = processedJsonTag.replace("id:", "\"id\":");
|
||||
processedJsonTag = processedJsonTag.replace("\\", "");
|
||||
Material material = Material.getMaterial(processedId);
|
||||
|
||||
assert material != null;
|
||||
ItemStack itemStack = new ItemStack(material);
|
||||
net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack);
|
||||
|
||||
try {
|
||||
nmsStack.setTag(MojangsonParser.parse(processedJsonTag));
|
||||
} catch (CommandSyntaxException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return CraftItemStack.asBukkitCopy(nmsStack);
|
||||
}
|
||||
|
||||
private static String toJson(@NotNull final ItemStack itemStack) {
|
||||
return CraftItemStack.asNMSCopy(itemStack).getOrCreateTag().toString();
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
package com.willfp.eco.proxy.v1_16_R3;
|
||||
|
||||
import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.Validate;
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class FastItemStackUtils {
|
||||
private static final Field FIELD;
|
||||
|
||||
public static net.minecraft.server.v1_16_R3.ItemStack getNMSStack(@NotNull final ItemStack itemStack) {
|
||||
if (!(itemStack instanceof CraftItemStack)) {
|
||||
return CraftItemStack.asNMSCopy(itemStack);
|
||||
} else {
|
||||
try {
|
||||
net.minecraft.server.v1_16_R3.ItemStack nms = (net.minecraft.server.v1_16_R3.ItemStack) FIELD.get(itemStack);
|
||||
return nms == null ? CraftItemStack.asNMSCopy(itemStack) : nms;
|
||||
} catch (ReflectiveOperationException e) {
|
||||
e.printStackTrace();
|
||||
return net.minecraft.server.v1_16_R3.ItemStack.b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
Field temp = null;
|
||||
|
||||
try {
|
||||
Field handleField = CraftItemStack.class.getDeclaredField("handle");
|
||||
handleField.setAccessible(true);
|
||||
temp = handleField;
|
||||
} catch (ReflectiveOperationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
assert temp != null;
|
||||
Validate.notNull(temp, "Error occurred in initialization!");
|
||||
|
||||
FIELD = temp;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.willfp.eco.proxy.v1_16_R3
|
||||
|
||||
import com.willfp.eco.core.display.Display
|
||||
import com.willfp.eco.proxy.ChatComponentProxy
|
||||
import net.kyori.adventure.nbt.api.BinaryTagHolder
|
||||
import net.kyori.adventure.text.BuildableComponent
|
||||
import net.kyori.adventure.text.Component
|
||||
import net.kyori.adventure.text.TranslatableComponent
|
||||
import net.kyori.adventure.text.event.HoverEvent
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
|
||||
import net.minecraft.server.v1_16_R3.IChatBaseComponent
|
||||
import net.minecraft.server.v1_16_R3.MojangsonParser
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
class ChatComponent : ChatComponentProxy {
|
||||
private val gsonComponentSerializer = GsonComponentSerializer.gson()
|
||||
|
||||
override fun modifyComponent(obj: Any, player: Player): Any {
|
||||
if (obj !is IChatBaseComponent) {
|
||||
return obj
|
||||
}
|
||||
|
||||
val component = gsonComponentSerializer.deserialize(
|
||||
IChatBaseComponent.ChatSerializer.a(
|
||||
obj
|
||||
)
|
||||
).asComponent() as BuildableComponent<*, *>
|
||||
|
||||
val newComponent = modifyBaseComponent(component, player)
|
||||
|
||||
return IChatBaseComponent.ChatSerializer.a(
|
||||
gsonComponentSerializer.serialize(newComponent.asComponent())
|
||||
) ?: obj
|
||||
}
|
||||
|
||||
private fun modifyBaseComponent(baseComponent: Component, player: Player): Component {
|
||||
var component = baseComponent
|
||||
|
||||
if (component is TranslatableComponent) {
|
||||
val args = mutableListOf<Component>()
|
||||
for (arg in component.args()) {
|
||||
args.add(modifyBaseComponent(arg, player))
|
||||
}
|
||||
component = component.args(args)
|
||||
}
|
||||
|
||||
val children = mutableListOf<Component>()
|
||||
for (child in component.children()) {
|
||||
children.add(modifyBaseComponent(child, player))
|
||||
}
|
||||
component = component.children(children)
|
||||
|
||||
val hoverEvent: HoverEvent<Any> = component.style().hoverEvent() as HoverEvent<Any>? ?: return component
|
||||
|
||||
val showItem = hoverEvent.value()
|
||||
|
||||
if (showItem !is HoverEvent.ShowItem) {
|
||||
return component
|
||||
}
|
||||
|
||||
val newShowItem = showItem.nbt(
|
||||
BinaryTagHolder.of(
|
||||
CraftItemStack.asNMSCopy(
|
||||
Display.display(
|
||||
CraftItemStack.asBukkitCopy(
|
||||
CraftItemStack.asNMSCopy(
|
||||
org.bukkit.inventory.ItemStack(
|
||||
Material.matchMaterial(
|
||||
showItem.item()
|
||||
.toString()
|
||||
) ?: return component,
|
||||
showItem.count()
|
||||
)
|
||||
).apply {
|
||||
this.tag = MojangsonParser.parse(
|
||||
showItem.nbt()?.string() ?: return component
|
||||
) ?: return component
|
||||
}
|
||||
),
|
||||
player
|
||||
)
|
||||
).orCreateTag.toString()
|
||||
)
|
||||
)
|
||||
|
||||
val newHover = hoverEvent.value(newShowItem)
|
||||
val style = component.style().hoverEvent(newHover)
|
||||
return component.style(style)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.willfp.eco.proxy.v1_16_R3.fast
|
||||
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import java.lang.reflect.Field
|
||||
|
||||
private val field: Field = CraftItemStack::class.java.getDeclaredField("handle").apply {
|
||||
isAccessible = true
|
||||
}
|
||||
|
||||
fun ItemStack.getNMSStack(): net.minecraft.server.v1_16_R3.ItemStack {
|
||||
return if (this !is CraftItemStack) {
|
||||
CraftItemStack.asNMSCopy(this)
|
||||
} else {
|
||||
field[this] as net.minecraft.server.v1_16_R3.ItemStack? ?: CraftItemStack.asNMSCopy(this)
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.willfp.eco.proxy.v1_16_R3.fast
|
||||
|
||||
import com.willfp.eco.internal.fast.EcoFastItemStack
|
||||
import com.willfp.eco.proxy.v1_16_R3.FastItemStackUtils
|
||||
import com.willfp.eco.util.StringUtils
|
||||
import net.minecraft.server.v1_16_R3.*
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
|
||||
@@ -12,7 +11,7 @@ import org.bukkit.inventory.ItemFlag
|
||||
import kotlin.experimental.and
|
||||
|
||||
class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack<ItemStack>(
|
||||
FastItemStackUtils.getNMSStack(itemStack), itemStack
|
||||
itemStack.getNMSStack(), itemStack
|
||||
) {
|
||||
private var loreCache: List<String>? = null
|
||||
override fun getEnchantmentsOnItem(checkStored: Boolean): Map<Enchantment, Int> {
|
||||
@@ -151,6 +150,18 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
||||
handle.repairCost = cost
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is NMSFastItemStack) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.hashCode() == this.hashCode()
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return handle.tag.hashCode() * 31 + Item.getId(handle.item)
|
||||
}
|
||||
|
||||
private fun apply() {
|
||||
if (bukkit !is CraftItemStack) {
|
||||
bukkit.itemMeta = CraftItemStack.asCraftMirror(handle).itemMeta
|
||||
|
||||
@@ -7,6 +7,8 @@ version rootProject.version
|
||||
|
||||
dependencies {
|
||||
compileOnly 'org.spigotmc:spigot:1.17.1-R0.1-SNAPSHOT:remapped-mojang'
|
||||
compileOnly 'net.kyori:adventure-api:4.9.1'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-gson:4.8.1'
|
||||
}
|
||||
|
||||
specialGradle {
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
package com.willfp.eco.proxy.v1_17_R1;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||
import com.willfp.eco.core.display.Display;
|
||||
import net.minecraft.nbt.TagParser;
|
||||
import net.minecraft.network.chat.BaseComponent;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.network.chat.HoverEvent;
|
||||
import net.minecraft.network.chat.Style;
|
||||
import net.minecraft.network.chat.TranslatableComponent;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import com.willfp.eco.proxy.ChatComponentProxy;
|
||||
|
||||
public final class ChatComponent implements ChatComponentProxy {
|
||||
@Override
|
||||
public Object modifyComponent(@NotNull final Object obj,
|
||||
@NotNull final Player player) {
|
||||
if (!(obj instanceof Component chatComponent)) {
|
||||
return obj;
|
||||
}
|
||||
|
||||
for (Component iChatBaseComponent : chatComponent) {
|
||||
if (iChatBaseComponent == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
modifyBaseComponent(iChatBaseComponent, player);
|
||||
}
|
||||
|
||||
return chatComponent;
|
||||
}
|
||||
|
||||
private void modifyBaseComponent(@NotNull final Component component,
|
||||
@NotNull final Player player) {
|
||||
for (Component sibling : component.getSiblings()) {
|
||||
if (sibling == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
modifyBaseComponent(sibling, player);
|
||||
}
|
||||
|
||||
if (component instanceof TranslatableComponent baseComponent) {
|
||||
for (Object arg : baseComponent.getArgs()) {
|
||||
if (arg instanceof Component) {
|
||||
modifyBaseComponent((Component) arg, player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HoverEvent hoverable = component.getStyle().getHoverEvent();
|
||||
|
||||
if (hoverable == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
JsonObject jsonObject = hoverable.serialize();
|
||||
JsonElement json = jsonObject.get("contents");
|
||||
if (json.getAsJsonObject().get("id") == null) {
|
||||
return;
|
||||
}
|
||||
if (json.getAsJsonObject().get("tag") == null) {
|
||||
return;
|
||||
}
|
||||
String id = json.getAsJsonObject().get("id").toString();
|
||||
String tag = json.getAsJsonObject().get("tag").toString();
|
||||
ItemStack itemStack = getFromTag(tag, id);
|
||||
|
||||
Display.displayAndFinalize(itemStack, player);
|
||||
|
||||
json.getAsJsonObject().remove("tag");
|
||||
String newTag = toJson(itemStack);
|
||||
json.getAsJsonObject().add("tag", new JsonPrimitive(newTag));
|
||||
|
||||
jsonObject.remove("contents");
|
||||
jsonObject.add("contents", json);
|
||||
HoverEvent newHoverable = HoverEvent.deserialize(jsonObject);
|
||||
Style modifier = component.getStyle();
|
||||
modifier = modifier.withHoverEvent(newHoverable);
|
||||
|
||||
((BaseComponent) component).setStyle(modifier);
|
||||
}
|
||||
|
||||
private static ItemStack getFromTag(@NotNull final String jsonTag,
|
||||
@NotNull final String id) {
|
||||
String processedId = id;
|
||||
String processedJsonTag = jsonTag;
|
||||
processedId = processedId.replace("minecraft:", "");
|
||||
processedId = processedId.toUpperCase();
|
||||
processedId = processedId.replace("\"", "");
|
||||
processedJsonTag = processedJsonTag.substring(1, processedJsonTag.length() - 1);
|
||||
processedJsonTag = processedJsonTag.replace("id:", "\"id\":");
|
||||
processedJsonTag = processedJsonTag.replace("\\", "");
|
||||
Material material = Material.getMaterial(processedId);
|
||||
|
||||
assert material != null;
|
||||
ItemStack itemStack = new ItemStack(material);
|
||||
net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack);
|
||||
|
||||
try {
|
||||
nmsStack.setTag(TagParser.parseTag(processedJsonTag));
|
||||
} catch (CommandSyntaxException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return CraftItemStack.asBukkitCopy(nmsStack);
|
||||
}
|
||||
|
||||
private static String toJson(@NotNull final ItemStack itemStack) {
|
||||
return CraftItemStack.asNMSCopy(itemStack).getOrCreateTag().toString();
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
package com.willfp.eco.proxy.v1_17_R1;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.Validate;
|
||||
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
@UtilityClass
|
||||
public class FastItemStackUtils {
|
||||
private static final Field FIELD;
|
||||
|
||||
public static net.minecraft.world.item.ItemStack getNMSStack(@NotNull final ItemStack itemStack) {
|
||||
if (!(itemStack instanceof CraftItemStack)) {
|
||||
return CraftItemStack.asNMSCopy(itemStack);
|
||||
} else {
|
||||
try {
|
||||
net.minecraft.world.item.ItemStack nms = (net.minecraft.world.item.ItemStack) FIELD.get(itemStack);
|
||||
return nms == null ? CraftItemStack.asNMSCopy(itemStack) : nms;
|
||||
} catch (ReflectiveOperationException e) {
|
||||
e.printStackTrace();
|
||||
return net.minecraft.world.item.ItemStack.EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
Field temp = null;
|
||||
|
||||
try {
|
||||
Field handleField = CraftItemStack.class.getDeclaredField("handle");
|
||||
handleField.setAccessible(true);
|
||||
temp = handleField;
|
||||
} catch (ReflectiveOperationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
assert temp != null;
|
||||
Validate.notNull(temp, "Error occurred in initialization!");
|
||||
|
||||
FIELD = temp;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.willfp.eco.proxy.v1_17_R1
|
||||
|
||||
import com.willfp.eco.core.display.Display
|
||||
import com.willfp.eco.proxy.ChatComponentProxy
|
||||
import net.kyori.adventure.nbt.api.BinaryTagHolder
|
||||
import net.kyori.adventure.text.BuildableComponent
|
||||
import net.kyori.adventure.text.Component
|
||||
import net.kyori.adventure.text.TranslatableComponent
|
||||
import net.kyori.adventure.text.event.HoverEvent
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
|
||||
import net.minecraft.nbt.TagParser
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
class ChatComponent : ChatComponentProxy {
|
||||
private val gsonComponentSerializer = GsonComponentSerializer.gson()
|
||||
|
||||
override fun modifyComponent(obj: Any, player: Player): Any {
|
||||
if (obj !is net.minecraft.network.chat.Component) {
|
||||
return obj
|
||||
}
|
||||
|
||||
val component = gsonComponentSerializer.deserialize(
|
||||
net.minecraft.network.chat.Component.Serializer.toJson(
|
||||
obj
|
||||
)
|
||||
).asComponent() as BuildableComponent<*, *>
|
||||
|
||||
val newComponent = modifyBaseComponent(component, player)
|
||||
|
||||
return net.minecraft.network.chat.Component.Serializer.fromJson(
|
||||
gsonComponentSerializer.serialize(newComponent.asComponent())
|
||||
) ?: obj
|
||||
}
|
||||
|
||||
private fun modifyBaseComponent(baseComponent: Component, player: Player): Component {
|
||||
var component = baseComponent
|
||||
|
||||
if (component is TranslatableComponent) {
|
||||
val args = mutableListOf<Component>()
|
||||
for (arg in component.args()) {
|
||||
args.add(modifyBaseComponent(arg, player))
|
||||
}
|
||||
component = component.args(args)
|
||||
}
|
||||
|
||||
val children = mutableListOf<Component>()
|
||||
for (child in component.children()) {
|
||||
children.add(modifyBaseComponent(child, player))
|
||||
}
|
||||
component = component.children(children)
|
||||
|
||||
val hoverEvent: HoverEvent<Any> = component.style().hoverEvent() as HoverEvent<Any>? ?: return component
|
||||
|
||||
val showItem = hoverEvent.value()
|
||||
|
||||
if (showItem !is HoverEvent.ShowItem) {
|
||||
return component
|
||||
}
|
||||
|
||||
val newShowItem = showItem.nbt(
|
||||
BinaryTagHolder.of(
|
||||
CraftItemStack.asNMSCopy(
|
||||
Display.display(
|
||||
CraftItemStack.asBukkitCopy(
|
||||
CraftItemStack.asNMSCopy(
|
||||
ItemStack(
|
||||
Material.matchMaterial(
|
||||
showItem.item()
|
||||
.toString()
|
||||
) ?: return component,
|
||||
showItem.count()
|
||||
)
|
||||
).apply {
|
||||
this.tag = TagParser.parseTag(
|
||||
showItem.nbt()?.string() ?: return component
|
||||
) ?: return component
|
||||
}
|
||||
),
|
||||
player
|
||||
)
|
||||
).orCreateTag.toString()
|
||||
)
|
||||
)
|
||||
|
||||
val newHover = hoverEvent.value(newShowItem)
|
||||
val style = component.style().hoverEvent(newHover)
|
||||
return component.style(style)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.willfp.eco.proxy.v1_17_R1.fast
|
||||
|
||||
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import java.lang.reflect.Field
|
||||
|
||||
private val field: Field = CraftItemStack::class.java.getDeclaredField("handle").apply {
|
||||
isAccessible = true
|
||||
}
|
||||
|
||||
fun ItemStack.getNMSStack(): net.minecraft.world.item.ItemStack {
|
||||
return if (this !is CraftItemStack) {
|
||||
CraftItemStack.asNMSCopy(this)
|
||||
} else {
|
||||
field[this] as net.minecraft.world.item.ItemStack? ?: CraftItemStack.asNMSCopy(this)
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
package com.willfp.eco.proxy.v1_17_R1.fast
|
||||
|
||||
import com.willfp.eco.internal.fast.EcoFastItemStack
|
||||
import com.willfp.eco.proxy.v1_17_R1.FastItemStackUtils
|
||||
import com.willfp.eco.util.StringUtils
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.nbt.ListTag
|
||||
import net.minecraft.nbt.StringTag
|
||||
import net.minecraft.world.item.EnchantedBookItem
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack
|
||||
@@ -17,7 +17,7 @@ import org.bukkit.inventory.ItemFlag
|
||||
import kotlin.experimental.and
|
||||
|
||||
class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack<ItemStack>(
|
||||
FastItemStackUtils.getNMSStack(itemStack), itemStack
|
||||
itemStack.getNMSStack(), itemStack
|
||||
) {
|
||||
private var loreCache: List<String>? = null
|
||||
|
||||
@@ -171,6 +171,18 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
||||
handle.setRepairCost(cost)
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is NMSFastItemStack) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.hashCode() == this.hashCode()
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return handle.tag.hashCode() * 31 + Item.getId(handle.item)
|
||||
}
|
||||
|
||||
private fun apply() {
|
||||
if (bukkit !is CraftItemStack) {
|
||||
bukkit.itemMeta = CraftItemStack.asCraftMirror(handle).itemMeta
|
||||
|
||||
@@ -3,32 +3,33 @@ version rootProject.version
|
||||
|
||||
dependencies {
|
||||
implementation 'org.bstats:bstats-bukkit:1.7'
|
||||
implementation 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
||||
implementation 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
implementation 'net.kyori:adventure-api:4.9.1'
|
||||
implementation 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
||||
implementation 'net.kyori:adventure-text-serializer-gson:4.8.1'
|
||||
implementation 'net.kyori:adventure-text-serializer-legacy:4.8.1'
|
||||
implementation('net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT') {
|
||||
exclude group: 'net.kyori', module: 'adventure-api'
|
||||
}
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
compileOnly 'net.kyori:adventure-api:4.9.1'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-gson:4.9.2'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-legacy:4.8.1'
|
||||
compileOnly 'org.apache.maven:maven-artifact:3.0.3'
|
||||
compileOnly 'com.google.code.gson:gson:2.8.7'
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
compileOnly project(":eco-core:core-proxy")
|
||||
compileOnly project(":eco-core:core-backend")
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.0-SNAPSHOT'
|
||||
compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.4-SNAPSHOT'
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.1-SNAPSHOT'
|
||||
compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.7-SNAPSHOT'
|
||||
compileOnly 'com.github.TechFortress:GriefPrevention:16.17.1'
|
||||
compileOnly 'com.massivecraft:Factions:1.6.9.5-U0.5.10'
|
||||
compileOnly 'com.github.cryptomorin:kingdoms:1.10.14'
|
||||
compileOnly 'com.github.TownyAdvanced:Towny:0.97.1.0'
|
||||
compileOnly 'com.github.TownyAdvanced:Towny:0.97.2.5'
|
||||
compileOnly 'com.github.angeschossen:LandsAPI:4.7.3'
|
||||
compileOnly 'fr.neatmonster:nocheatplus:3.16.1-SNAPSHOT'
|
||||
compileOnly 'com.github.jiangdashao:matrix-api-repo:317d4635fd'
|
||||
compileOnly 'com.gmail.nossr50.mcMMO:mcMMO:2.1.157'
|
||||
compileOnly 'com.gmail.nossr50.mcMMO:mcMMO:2.1.202'
|
||||
compileOnly 'me.clip:placeholderapi:2.10.10'
|
||||
compileOnly 'com.willfp:Oraxen:e1f4003d8d'
|
||||
compileOnly 'com.github.brcdev-minecraft:shopgui-api:2.2.0'
|
||||
compileOnly 'com.github.LoneDev6:API-ItemsAdder:2.4.7'
|
||||
compileOnly 'me.arcaniax:HeadDatabase-API:1.2.0'
|
||||
compileOnly 'com.arcaniax:HeadDatabase-API:1.3.0'
|
||||
|
||||
// CombatLogX V10 + NewbieHelper Expansion
|
||||
compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT'
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
package com.willfp.eco.spigot.eventlisteners;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginDependent;
|
||||
import com.willfp.eco.core.events.ArmorChangeEvent;
|
||||
import com.willfp.eco.core.events.ArmorEquipEvent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public class ArmorChangeEventListeners extends PluginDependent<EcoPlugin> implements Listener {
|
||||
/**
|
||||
* Pass an {@link EcoPlugin} in order to interface with it.
|
||||
*
|
||||
* @param plugin The plugin to manage.
|
||||
*/
|
||||
public ArmorChangeEventListeners(@NotNull final EcoPlugin plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onArmorChange(@NotNull final ArmorEquipEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
List<ItemStack> before = new ArrayList<>(Arrays.asList(player.getInventory().getArmorContents()));
|
||||
|
||||
this.getPlugin().getScheduler().runLater(() -> {
|
||||
List<ItemStack> after = new ArrayList<>(Arrays.asList(player.getInventory().getArmorContents()));
|
||||
|
||||
ArmorChangeEvent armorChangeEvent = new ArmorChangeEvent(player, before, after);
|
||||
Bukkit.getPluginManager().callEvent(armorChangeEvent);
|
||||
}, 1);
|
||||
}
|
||||
}
|
||||
@@ -1,187 +0,0 @@
|
||||
package com.willfp.eco.spigot.eventlisteners;
|
||||
|
||||
import com.willfp.eco.core.events.ArmorEquipEvent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event.Result;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.event.inventory.InventoryAction;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryDragEvent;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.event.inventory.InventoryType.SlotType;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerItemBreakEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public class ArmorListener implements Listener {
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public final void inventoryClick(@NotNull final InventoryClickEvent event) {
|
||||
boolean shift = false;
|
||||
boolean numberkey = false;
|
||||
if (event.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
if (event.getAction() == InventoryAction.NOTHING) {
|
||||
return;
|
||||
}
|
||||
if (event.getClick().equals(ClickType.SHIFT_LEFT) || event.getClick().equals(ClickType.SHIFT_RIGHT)) {
|
||||
shift = true;
|
||||
}
|
||||
if (event.getClick().equals(ClickType.NUMBER_KEY)) {
|
||||
numberkey = true;
|
||||
}
|
||||
if (event.getSlotType() != SlotType.ARMOR && event.getSlotType() != SlotType.QUICKBAR && event.getSlotType() != SlotType.CONTAINER) {
|
||||
return;
|
||||
}
|
||||
if (event.getClickedInventory() != null && !event.getClickedInventory().getType().equals(InventoryType.PLAYER)) {
|
||||
return;
|
||||
}
|
||||
if (!event.getInventory().getType().equals(InventoryType.CRAFTING) && !event.getInventory().getType().equals(InventoryType.PLAYER)) {
|
||||
return;
|
||||
}
|
||||
if (!(event.getWhoClicked() instanceof Player)) {
|
||||
return;
|
||||
}
|
||||
ArmorType newArmorType = ArmorType.matchType(shift ? event.getCurrentItem() : event.getCursor());
|
||||
if (!shift && newArmorType != null && event.getRawSlot() != newArmorType.getSlot()) {
|
||||
// Used for drag and drop checking to make sure you aren't trying to place a helmet in the boots slot.
|
||||
return;
|
||||
}
|
||||
if (shift) {
|
||||
newArmorType = ArmorType.matchType(event.getCurrentItem());
|
||||
if (newArmorType != null) {
|
||||
boolean equipping = true;
|
||||
if (event.getRawSlot() == newArmorType.getSlot()) {
|
||||
equipping = false;
|
||||
}
|
||||
if (newArmorType.equals(ArmorType.HELMET)
|
||||
&& (equipping == isAirOrNull(event.getWhoClicked().getInventory().getHelmet()))
|
||||
|| newArmorType.equals(ArmorType.CHESTPLATE)
|
||||
&& (equipping == isAirOrNull(event.getWhoClicked().getInventory().getChestplate()))
|
||||
|| newArmorType.equals(ArmorType.LEGGINGS)
|
||||
&& (equipping == isAirOrNull(event.getWhoClicked().getInventory().getLeggings()))
|
||||
|| newArmorType.equals(ArmorType.BOOTS)
|
||||
&& (equipping == isAirOrNull(event.getWhoClicked().getInventory().getBoots()))) {
|
||||
ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(
|
||||
(Player) event.getWhoClicked()
|
||||
);
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (numberkey) {
|
||||
if (event.getClickedInventory().getType().equals(InventoryType.PLAYER)) {
|
||||
ItemStack hotbarItem = event.getClickedInventory().getItem(event.getHotbarButton());
|
||||
if (!isAirOrNull(hotbarItem)) {
|
||||
newArmorType = ArmorType.matchType(hotbarItem);
|
||||
} else {
|
||||
newArmorType = ArmorType.matchType(!isAirOrNull(event.getCurrentItem()) ? event.getCurrentItem() : event.getCursor());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (isAirOrNull(event.getCursor()) && !isAirOrNull(event.getCurrentItem())) {
|
||||
newArmorType = ArmorType.matchType(event.getCurrentItem());
|
||||
}
|
||||
}
|
||||
if (newArmorType != null && event.getRawSlot() == newArmorType.getSlot()) {
|
||||
ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) event.getWhoClicked());
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void playerInteractEvent(@NotNull final PlayerInteractEvent e) {
|
||||
if (e.useItemInHand().equals(Result.DENY)) {
|
||||
return;
|
||||
}
|
||||
if (e.getAction() == Action.PHYSICAL) {
|
||||
return;
|
||||
}
|
||||
if (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
Player player = e.getPlayer();
|
||||
if (!e.useInteractedBlock().equals(Result.DENY)) {
|
||||
if (e.getClickedBlock() != null && e.getAction() == Action.RIGHT_CLICK_BLOCK && !player.isSneaking()) {
|
||||
Material mat = e.getClickedBlock().getType();
|
||||
}
|
||||
}
|
||||
ArmorType newArmorType = ArmorType.matchType(e.getItem());
|
||||
if (newArmorType != null) {
|
||||
if (newArmorType.equals(ArmorType.HELMET)
|
||||
&& isAirOrNull(e.getPlayer().getInventory().getHelmet())
|
||||
|| newArmorType.equals(ArmorType.CHESTPLATE)
|
||||
&& isAirOrNull(e.getPlayer().getInventory().getChestplate())
|
||||
|| newArmorType.equals(ArmorType.LEGGINGS)
|
||||
&& isAirOrNull(e.getPlayer().getInventory().getLeggings())
|
||||
|| newArmorType.equals(ArmorType.BOOTS)
|
||||
&& isAirOrNull(e.getPlayer().getInventory().getBoots())) {
|
||||
ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(e.getPlayer());
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void inventoryDrag(@NotNull final InventoryDragEvent event) {
|
||||
ArmorType type = ArmorType.matchType(event.getOldCursor());
|
||||
if (event.getRawSlots().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
if (type != null && type.getSlot() == event.getRawSlots().stream().findFirst().orElse(0)) {
|
||||
ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) event.getWhoClicked());
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void playerJoinEvent(@NotNull final PlayerJoinEvent event) {
|
||||
ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(event.getPlayer());
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void playerRespawnEvent(@NotNull final PlayerRespawnEvent event) {
|
||||
ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(event.getPlayer());
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void itemBreakEvent(@NotNull final PlayerItemBreakEvent event) {
|
||||
ArmorType type = ArmorType.matchType(event.getBrokenItem());
|
||||
if (type != null) {
|
||||
Player p = event.getPlayer();
|
||||
ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(p);
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void playerDeathEvent(@NotNull final PlayerDeathEvent event) {
|
||||
Player p = event.getEntity();
|
||||
if (event.getKeepInventory()) {
|
||||
return;
|
||||
}
|
||||
for (ItemStack i : p.getInventory().getArmorContents()) {
|
||||
if (!isAirOrNull(i)) {
|
||||
Bukkit.getPluginManager().callEvent(new ArmorEquipEvent(p));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isAirOrNull(@Nullable final ItemStack item) {
|
||||
return item == null || item.getType().equals(Material.AIR);
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
package com.willfp.eco.spigot.eventlisteners;
|
||||
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public enum ArmorType {
|
||||
HELMET(5),
|
||||
CHESTPLATE(6),
|
||||
LEGGINGS(7),
|
||||
BOOTS(8);
|
||||
|
||||
private final int slot;
|
||||
|
||||
ArmorType(final int slot) {
|
||||
this.slot = slot;
|
||||
}
|
||||
|
||||
public static ArmorType matchType(final ItemStack itemStack) {
|
||||
if (ArmorListener.isAirOrNull(itemStack)) {
|
||||
return null;
|
||||
}
|
||||
String type = itemStack.getType().name();
|
||||
if (type.endsWith("_HELMET") || type.endsWith("_SKULL") || type.endsWith("PLAYER_HEAD")) {
|
||||
return HELMET;
|
||||
} else if (type.endsWith("_CHESTPLATE") || type.endsWith("ELYTRA")) {
|
||||
return CHESTPLATE;
|
||||
} else if (type.endsWith("_LEGGINGS")) {
|
||||
return LEGGINGS;
|
||||
} else if (type.endsWith("_BOOTS")) {
|
||||
return BOOTS;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public int getSlot() {
|
||||
return slot;
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
package com.willfp.eco.spigot.eventlisteners;
|
||||
|
||||
import com.willfp.eco.core.events.ArmorEquipEvent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockDispenseArmorEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public class DispenserArmorListener implements Listener {
|
||||
@EventHandler
|
||||
public void dispenseArmorEvent(@NotNull final BlockDispenseArmorEvent event) {
|
||||
ArmorType type = ArmorType.matchType(event.getItem());
|
||||
if (type != null && event.getTargetEntity() instanceof Player p) {
|
||||
ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(p);
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,7 +43,7 @@ import java.util.logging.Logger
|
||||
class EcoHandler : EcoSpigotPlugin(), Handler {
|
||||
private val cleaner = EcoCleaner()
|
||||
private val requirementFactory = EcoRequirementFactory()
|
||||
private lateinit var adventure: BukkitAudiences
|
||||
private var adventure: BukkitAudiences? = null
|
||||
|
||||
override fun createScheduler(plugin: EcoPlugin): Scheduler {
|
||||
return EcoScheduler(plugin)
|
||||
@@ -129,7 +129,7 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
|
||||
return requirementFactory
|
||||
}
|
||||
|
||||
override fun getAdventure(): BukkitAudiences {
|
||||
override fun getAdventure(): BukkitAudiences? {
|
||||
return adventure
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.willfp.eco.spigot
|
||||
import com.willfp.eco.core.AbstractPacketAdapter
|
||||
import com.willfp.eco.core.Eco
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.Prerequisite
|
||||
import com.willfp.eco.core.display.Display
|
||||
import com.willfp.eco.core.integrations.IntegrationLoader
|
||||
import com.willfp.eco.core.integrations.anticheat.AnticheatManager
|
||||
@@ -21,10 +22,15 @@ import com.willfp.eco.proxy.SkullProxy
|
||||
import com.willfp.eco.spigot.arrows.ArrowDataListener
|
||||
import com.willfp.eco.spigot.display.*
|
||||
import com.willfp.eco.spigot.drops.CollatedRunnable
|
||||
import com.willfp.eco.spigot.eventlisteners.*
|
||||
import com.willfp.eco.spigot.eventlisteners.EntityDeathByEntityListeners
|
||||
import com.willfp.eco.spigot.eventlisteners.NaturalExpGainListeners
|
||||
import com.willfp.eco.spigot.eventlisteners.PlayerJumpListeners
|
||||
import com.willfp.eco.spigot.eventlisteners.armor.ArmorChangeEventListeners
|
||||
import com.willfp.eco.spigot.eventlisteners.armor.ArmorListener
|
||||
import com.willfp.eco.spigot.gui.GUIListener
|
||||
import com.willfp.eco.spigot.integrations.anticheat.*
|
||||
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.mcmmo.McmmoIntegrationImpl
|
||||
@@ -69,7 +75,10 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
|
||||
override fun handleEnable() {
|
||||
CollatedRunnable(this)
|
||||
(Eco.getHandler() as EcoHandler).adventure = BukkitAudiences.create(this)
|
||||
|
||||
if (!Prerequisite.HAS_PAPER.isMet) {
|
||||
(Eco.getHandler() as EcoHandler).setAdventure(BukkitAudiences.create(this))
|
||||
}
|
||||
|
||||
this.logger.info("Ignore messages about deprecated events!")
|
||||
|
||||
@@ -91,7 +100,7 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
}
|
||||
|
||||
override fun handleDisable() {
|
||||
Eco.getHandler().adventure.close()
|
||||
Eco.getHandler().adventure?.close()
|
||||
}
|
||||
|
||||
override fun handleReload() {
|
||||
@@ -109,7 +118,6 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
// AntiGrief
|
||||
IntegrationLoader("WorldGuard") { AntigriefManager.register(AntigriefWorldGuard()) },
|
||||
IntegrationLoader("GriefPrevention") { AntigriefManager.register(AntigriefGriefPrevention()) },
|
||||
IntegrationLoader("GriefDefender") { AntigriefManager.register(AntigriefGriefDefender()) },
|
||||
IntegrationLoader("FactionsUUID") { AntigriefManager.register(AntigriefFactionsUUID()) },
|
||||
IntegrationLoader("Towny") { AntigriefManager.register(AntigriefTowny()) },
|
||||
IntegrationLoader("Lands") { AntigriefManager.register(AntigriefLands(this)) },
|
||||
@@ -135,7 +143,8 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
|
||||
// Custom Items
|
||||
IntegrationLoader("Oraxen") { CustomItemsManager.register(CustomItemsOraxen()) },
|
||||
IntegrationLoader("ItemsAdder") { CustomItemsManager.register(CustomItemsItemsAdder(this)) },
|
||||
IntegrationLoader("ItemsAdder") { CustomItemsManager.register(CustomItemsItemsAdder()) },
|
||||
IntegrationLoader("HeadDatabase") { CustomItemsManager.register(CustomItemsHeadDatabase(this)) },
|
||||
|
||||
// Shop
|
||||
IntegrationLoader("ShopGUIPlus") { ShopManager.register(ShopShopGuiPlus()) },
|
||||
@@ -160,7 +169,6 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
return listOf(
|
||||
NaturalExpGainListeners(),
|
||||
ArmorListener(),
|
||||
DispenserArmorListener(),
|
||||
EntityDeathByEntityListeners(this),
|
||||
ShapedRecipeListener(this),
|
||||
PlayerJumpListeners(),
|
||||
|
||||
@@ -13,7 +13,7 @@ import org.bukkit.entity.Player
|
||||
class PacketChat(plugin: EcoPlugin) :
|
||||
AbstractPacketAdapter(plugin,
|
||||
PacketType.Play.Server.CHAT,
|
||||
if (plugin.configYml.getBool("use-lower-protocollib-priority")) ListenerPriority.NORMAL else ListenerPriority.MONITOR,
|
||||
if (plugin.configYml.getBool("use-lower-protocollib-priority")) ListenerPriority.NORMAL else ListenerPriority.HIGHEST,
|
||||
true) {
|
||||
override fun onSend(
|
||||
packet: PacketContainer,
|
||||
|
||||
@@ -6,9 +6,11 @@ import com.comphenix.protocol.events.PacketEvent
|
||||
import com.willfp.eco.core.AbstractPacketAdapter
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.display.Display
|
||||
import com.willfp.eco.core.fast.FastItemStack
|
||||
import com.willfp.eco.spigot.display.frame.DisplayFrame
|
||||
import com.willfp.eco.spigot.display.frame.lastDisplayFrame
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import java.util.function.Consumer
|
||||
|
||||
class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, PacketType.Play.Server.WINDOW_ITEMS, false) {
|
||||
override fun onSend(
|
||||
@@ -20,11 +22,21 @@ class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packe
|
||||
if (itemStacks == null) {
|
||||
return@modify null
|
||||
}
|
||||
itemStacks.forEach(Consumer { item: ItemStack ->
|
||||
Display.display(
|
||||
item, player
|
||||
)
|
||||
})
|
||||
val frameMap = mutableMapOf<Byte, Int>()
|
||||
|
||||
for (index in itemStacks.indices) {
|
||||
frameMap[index.toByte()] = FastItemStack.wrap(itemStacks[index]).hashCode()
|
||||
}
|
||||
|
||||
val newFrame = DisplayFrame(frameMap)
|
||||
|
||||
val changes = player.lastDisplayFrame.getChangedSlots(newFrame)
|
||||
|
||||
player.lastDisplayFrame = newFrame
|
||||
|
||||
for (index in changes) {
|
||||
Display.display(itemStacks[index.toInt()], player)
|
||||
}
|
||||
itemStacks
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.willfp.eco.spigot.display.frame
|
||||
|
||||
import org.bukkit.entity.Player
|
||||
import java.util.*
|
||||
|
||||
data class DisplayFrame(val items: Map<Byte, Int>) {
|
||||
fun getChangedSlots(newFrame: DisplayFrame): List<Byte> {
|
||||
val changes = mutableListOf<Byte>()
|
||||
|
||||
for ((slot, hash) in newFrame.items) {
|
||||
if (items[slot] != hash) {
|
||||
changes.add(slot)
|
||||
}
|
||||
}
|
||||
|
||||
return changes
|
||||
}
|
||||
}
|
||||
|
||||
private val frames = mutableMapOf<UUID, DisplayFrame>()
|
||||
|
||||
var Player.lastDisplayFrame: DisplayFrame
|
||||
get() {
|
||||
return frames[this.uniqueId] ?: DisplayFrame(emptyMap())
|
||||
}
|
||||
set(value) {
|
||||
frames[this.uniqueId] = value
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.willfp.eco.spigot.eventlisteners.armor
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.events.ArmorChangeEvent
|
||||
import com.willfp.eco.core.events.ArmorEquipEvent
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.block.BlockDispenseArmorEvent
|
||||
|
||||
class ArmorChangeEventListeners(
|
||||
private val plugin: EcoPlugin
|
||||
) : Listener {
|
||||
@EventHandler
|
||||
fun onArmorChange(event: ArmorEquipEvent) {
|
||||
val player = event.player
|
||||
val before = player.inventory.armorContents.toMutableList()
|
||||
plugin.scheduler.run {
|
||||
val after = player.inventory.armorContents.toMutableList()
|
||||
val armorChangeEvent = ArmorChangeEvent(player, before, after)
|
||||
Bukkit.getPluginManager().callEvent(armorChangeEvent)
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
fun dispenseArmorEvent(event: BlockDispenseArmorEvent) {
|
||||
val type = ArmorType.matchType(event.item)
|
||||
if (type != null && event.targetEntity is Player) {
|
||||
Bukkit.getPluginManager().callEvent(ArmorEquipEvent(event.targetEntity as Player))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
package com.willfp.eco.spigot.eventlisteners.armor
|
||||
|
||||
import com.willfp.eco.core.events.ArmorEquipEvent
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.Event
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.EventPriority
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.block.Action
|
||||
import org.bukkit.event.entity.PlayerDeathEvent
|
||||
import org.bukkit.event.inventory.*
|
||||
import org.bukkit.event.player.PlayerInteractEvent
|
||||
import org.bukkit.event.player.PlayerItemBreakEvent
|
||||
import org.bukkit.event.player.PlayerJoinEvent
|
||||
import org.bukkit.event.player.PlayerRespawnEvent
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
class ArmorListener : Listener {
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
fun inventoryClick(event: InventoryClickEvent) {
|
||||
var shift = false
|
||||
var numberkey = false
|
||||
if (event.isCancelled) {
|
||||
return
|
||||
}
|
||||
if (event.action == InventoryAction.NOTHING) {
|
||||
return
|
||||
}
|
||||
if (event.click == ClickType.SHIFT_LEFT || event.click == ClickType.SHIFT_RIGHT) {
|
||||
shift = true
|
||||
}
|
||||
if (event.click == ClickType.NUMBER_KEY) {
|
||||
numberkey = true
|
||||
}
|
||||
if (event.slotType != InventoryType.SlotType.ARMOR && event.slotType != InventoryType.SlotType.QUICKBAR && event.slotType != InventoryType.SlotType.CONTAINER) {
|
||||
return
|
||||
}
|
||||
if (event.clickedInventory != null && event.clickedInventory!!.type != InventoryType.PLAYER) {
|
||||
return
|
||||
}
|
||||
if (event.inventory.type != InventoryType.CRAFTING && event.inventory.type != InventoryType.PLAYER) {
|
||||
return
|
||||
}
|
||||
if (event.whoClicked !is Player) {
|
||||
return
|
||||
}
|
||||
var newArmorType = ArmorType.matchType(if (shift) event.currentItem else event.cursor)
|
||||
if (!shift && newArmorType != null && event.rawSlot != newArmorType.slot) {
|
||||
// Used for drag and drop checking to make sure you aren't trying to place a helmet in the boots slot.
|
||||
return
|
||||
}
|
||||
if (shift) {
|
||||
newArmorType = ArmorType.matchType(event.currentItem)
|
||||
if (newArmorType != null) {
|
||||
var equipping = true
|
||||
if (event.rawSlot == newArmorType.slot) {
|
||||
equipping = false
|
||||
}
|
||||
if (newArmorType == ArmorType.HELMET && equipping == isAirOrNull(event.whoClicked.inventory.helmet) || newArmorType == ArmorType.CHESTPLATE && equipping == isAirOrNull(
|
||||
event.whoClicked.inventory.chestplate
|
||||
) || newArmorType == ArmorType.LEGGINGS && equipping == isAirOrNull(event.whoClicked.inventory.leggings) || newArmorType == ArmorType.BOOTS && equipping == isAirOrNull(
|
||||
event.whoClicked.inventory.boots
|
||||
)
|
||||
) {
|
||||
val armorEquipEvent = ArmorEquipEvent(
|
||||
(event.whoClicked as Player)
|
||||
)
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (numberkey) {
|
||||
if (event.clickedInventory!!.type == InventoryType.PLAYER) {
|
||||
val hotbarItem = event.clickedInventory!!.getItem(event.hotbarButton)
|
||||
newArmorType = if (!isAirOrNull(hotbarItem)) {
|
||||
ArmorType.matchType(hotbarItem)
|
||||
} else {
|
||||
ArmorType.matchType(if (!isAirOrNull(event.currentItem)) event.currentItem else event.cursor)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (isAirOrNull(event.cursor) && !isAirOrNull(event.currentItem)) {
|
||||
newArmorType = ArmorType.matchType(event.currentItem)
|
||||
}
|
||||
}
|
||||
if (newArmorType != null && event.rawSlot == newArmorType.slot) {
|
||||
val armorEquipEvent = ArmorEquipEvent(
|
||||
(event.whoClicked as Player)
|
||||
)
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
fun playerInteractEvent(e: PlayerInteractEvent) {
|
||||
if (e.useItemInHand() == Event.Result.DENY) {
|
||||
return
|
||||
}
|
||||
if (e.action == Action.PHYSICAL) {
|
||||
return
|
||||
}
|
||||
if (e.action == Action.RIGHT_CLICK_AIR || e.action == Action.RIGHT_CLICK_BLOCK) {
|
||||
val newArmorType = ArmorType.matchType(e.item)
|
||||
if (newArmorType != null) {
|
||||
if (newArmorType == ArmorType.HELMET && isAirOrNull(e.player.inventory.helmet) || newArmorType == ArmorType.CHESTPLATE && isAirOrNull(
|
||||
e.player.inventory.chestplate
|
||||
) || newArmorType == ArmorType.LEGGINGS && isAirOrNull(e.player.inventory.leggings) || newArmorType == ArmorType.BOOTS && isAirOrNull(
|
||||
e.player.inventory.boots
|
||||
)
|
||||
) {
|
||||
val armorEquipEvent = ArmorEquipEvent(e.player)
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
fun inventoryDrag(event: InventoryDragEvent) {
|
||||
val type = ArmorType.matchType(event.oldCursor)
|
||||
if (event.rawSlots.isEmpty()) {
|
||||
return
|
||||
}
|
||||
if (type != null && type.slot == event.rawSlots.stream().findFirst().orElse(0)) {
|
||||
val armorEquipEvent = ArmorEquipEvent(
|
||||
(event.whoClicked as Player)
|
||||
)
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent)
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
fun playerJoinEvent(event: PlayerJoinEvent) {
|
||||
val armorEquipEvent = ArmorEquipEvent(event.player)
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent)
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
fun playerRespawnEvent(event: PlayerRespawnEvent) {
|
||||
val armorEquipEvent = ArmorEquipEvent(event.player)
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent)
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
fun itemBreakEvent(event: PlayerItemBreakEvent) {
|
||||
val type = ArmorType.matchType(event.brokenItem)
|
||||
if (type != null) {
|
||||
val p = event.player
|
||||
val armorEquipEvent = ArmorEquipEvent(p)
|
||||
Bukkit.getPluginManager().callEvent(armorEquipEvent)
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
fun playerDeathEvent(event: PlayerDeathEvent) {
|
||||
val p = event.entity
|
||||
if (event.keepInventory) {
|
||||
return
|
||||
}
|
||||
for (i in p.inventory.armorContents) {
|
||||
if (!isAirOrNull(i)) {
|
||||
Bukkit.getPluginManager().callEvent(ArmorEquipEvent(p))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun isAirOrNull(item: ItemStack?): Boolean {
|
||||
return item == null || item.type == Material.AIR
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.willfp.eco.spigot.eventlisteners.armor
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
enum class ArmorType(val slot: Int) {
|
||||
HELMET(5), CHESTPLATE(6), LEGGINGS(7), BOOTS(8);
|
||||
|
||||
companion object {
|
||||
fun matchType(itemStack: ItemStack?): ArmorType? {
|
||||
if (ArmorListener.isAirOrNull(itemStack)) {
|
||||
return null
|
||||
}
|
||||
itemStack ?: return null
|
||||
val type = itemStack.type.name
|
||||
return if (type.endsWith("_HELMET") || type.endsWith("_SKULL") || type.endsWith("PLAYER_HEAD")) {
|
||||
HELMET
|
||||
} else if (type.endsWith("_CHESTPLATE") || type.endsWith("ELYTRA")) {
|
||||
CHESTPLATE
|
||||
} else if (type.endsWith("_LEGGINGS")) {
|
||||
LEGGINGS
|
||||
} else if (type.endsWith("_BOOTS")) {
|
||||
BOOTS
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -59,4 +59,15 @@ class AntigriefCombatLogXV10 : AntigriefWrapper {
|
||||
return "CombatLogX"
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is AntigriefWrapper) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.pluginName == this.pluginName
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return this.pluginName.hashCode()
|
||||
}
|
||||
}
|
||||
@@ -62,4 +62,15 @@ class AntigriefCombatLogXV11 : AntigriefWrapper {
|
||||
return "CombatLogX"
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is AntigriefWrapper) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.pluginName == this.pluginName
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return this.pluginName.hashCode()
|
||||
}
|
||||
}
|
||||
@@ -64,4 +64,16 @@ class AntigriefFactionsUUID : AntigriefWrapper {
|
||||
override fun getPluginName(): String {
|
||||
return "FactionsUUID"
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is AntigriefWrapper) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.pluginName == this.pluginName
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return this.pluginName.hashCode()
|
||||
}
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
package com.willfp.eco.spigot.integrations.antigrief
|
||||
|
||||
import com.flowpowered.math.vector.Vector3i
|
||||
import com.griefdefender.api.GriefDefender
|
||||
import com.griefdefender.api.data.PlayerData
|
||||
import com.griefdefender.api.permission.flag.Flags
|
||||
import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.block.Block
|
||||
import org.bukkit.entity.LivingEntity
|
||||
import org.bukkit.entity.Player
|
||||
import java.util.*
|
||||
|
||||
class AntigriefGriefDefender : AntigriefWrapper {
|
||||
override fun canBreakBlock(player: Player, block: Block): Boolean {
|
||||
val data = GriefDefender.getCore().getPlayerData(player.world.uid, player.uniqueId) ?: return true
|
||||
|
||||
val claim = GriefDefender.getCore().getClaimAt(Vector3i(block.location.x, block.location.y, block.location.z))
|
||||
?: return true
|
||||
|
||||
return if (data.canIgnoreClaim(claim)) {
|
||||
true
|
||||
} else {
|
||||
claim.getActiveFlagPermissionValue(Flags.BLOCK_BREAK, data.user, Collections.emptySet(), true).asBoolean()
|
||||
}
|
||||
}
|
||||
|
||||
override fun canCreateExplosion(player: Player, location: Location): Boolean {
|
||||
val data = GriefDefender.getCore().getPlayerData(player.world.uid, player.uniqueId) ?: return true
|
||||
|
||||
val claim = GriefDefender.getCore().getClaimAt(Vector3i(location.x, location.y, location.z)) ?: return true
|
||||
|
||||
return if (data.canIgnoreClaim(claim)) {
|
||||
true
|
||||
} else {
|
||||
claim.getActiveFlagPermissionValue(Flags.EXPLOSION_BLOCK, data.user, Collections.emptySet(), true)
|
||||
.asBoolean()
|
||||
}
|
||||
}
|
||||
|
||||
override fun canPlaceBlock(player: Player, block: Block): Boolean {
|
||||
|
||||
val data: PlayerData = GriefDefender.getCore().getPlayerData(player.world.uid, player.uniqueId) ?: return true
|
||||
|
||||
val claim =
|
||||
GriefDefender.getCore().getClaimAt(Vector3i(block.location.x, block.location.y, block.location.z))
|
||||
?: return true
|
||||
|
||||
return if (data.canIgnoreClaim(claim)) {
|
||||
true
|
||||
} else {
|
||||
claim.getActiveFlagPermissionValue(Flags.BLOCK_PLACE, data.user, Collections.emptySet(), true)
|
||||
.asBoolean()
|
||||
}
|
||||
}
|
||||
|
||||
override fun canInjure(player: Player, victim: LivingEntity): Boolean {
|
||||
|
||||
val data = GriefDefender.getCore().getPlayerData(player.world.uid, player.uniqueId) ?: return true
|
||||
|
||||
if (data.canIgnoreClaim(data.currentClaim)) {
|
||||
return true
|
||||
}
|
||||
|
||||
return if (victim is Player) {
|
||||
val vicData = GriefDefender.getCore().getPlayerData(victim.world.uid, victim.uniqueId)
|
||||
if (vicData != null) {
|
||||
data.canPvp(data.currentClaim) && data.canPvp(vicData.currentClaim)
|
||||
} else data.canPvp(data.currentClaim)
|
||||
} else {
|
||||
val claim =
|
||||
GriefDefender.getCore().getClaimAt(Vector3i(victim.location.x, victim.location.y, victim.location.z))
|
||||
claim?.getActiveFlagPermissionValue(Flags.ENTITY_DAMAGE, data.user, Collections.emptySet(), true)
|
||||
?.asBoolean() ?: true
|
||||
}
|
||||
}
|
||||
|
||||
override fun getPluginName(): String {
|
||||
return "GriefDefender"
|
||||
}
|
||||
}
|
||||
@@ -54,4 +54,16 @@ class AntigriefGriefPrevention : AntigriefWrapper {
|
||||
override fun getPluginName(): String {
|
||||
return "GriefPrevention"
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is AntigriefWrapper) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.pluginName == this.pluginName
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return this.pluginName.hashCode()
|
||||
}
|
||||
}
|
||||
@@ -68,4 +68,16 @@ class AntigriefKingdoms : AntigriefWrapper {
|
||||
override fun getPluginName(): String {
|
||||
return "Kingdoms"
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is AntigriefWrapper) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.pluginName == this.pluginName
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return this.pluginName.hashCode()
|
||||
}
|
||||
}
|
||||
@@ -55,4 +55,16 @@ class AntigriefLands(private val plugin: EcoPlugin) : AntigriefWrapper {
|
||||
override fun getPluginName(): String {
|
||||
return "Lands"
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is AntigriefWrapper) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.pluginName == this.pluginName
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return this.pluginName.hashCode()
|
||||
}
|
||||
}
|
||||
@@ -72,4 +72,16 @@ class AntigriefTowny : AntigriefWrapper {
|
||||
override fun getPluginName(): String {
|
||||
return "Towny"
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is AntigriefWrapper) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.pluginName == this.pluginName
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return this.pluginName.hashCode()
|
||||
}
|
||||
}
|
||||
@@ -101,4 +101,16 @@ class AntigriefWorldGuard : AntigriefWrapper {
|
||||
override fun getPluginName(): String {
|
||||
return "WorldGuard"
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is AntigriefWrapper) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.pluginName == this.pluginName
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return this.pluginName.hashCode()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
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.core.items.Items
|
||||
import com.willfp.eco.core.items.TestableItem
|
||||
import com.willfp.eco.core.items.provider.ItemProvider
|
||||
import com.willfp.eco.util.NamespacedKeyUtils
|
||||
import me.arcaniax.hdb.api.DatabaseLoadEvent
|
||||
import me.arcaniax.hdb.api.HeadDatabaseAPI
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import java.util.function.Predicate
|
||||
|
||||
class CustomItemsHeadDatabase(
|
||||
plugin: EcoPlugin
|
||||
) : CustomItemsWrapper {
|
||||
private val provider = HeadDBProvider()
|
||||
|
||||
init {
|
||||
plugin.eventManager.registerListener(provider)
|
||||
}
|
||||
|
||||
override fun registerAllItems() {
|
||||
Items.registerItemProvider(HeadDBProvider())
|
||||
}
|
||||
|
||||
override fun getPluginName(): String {
|
||||
return "HeadDatabase"
|
||||
}
|
||||
|
||||
private inner class HeadDBProvider : ItemProvider("headdb"), Listener {
|
||||
private lateinit var api: HeadDatabaseAPI
|
||||
|
||||
override fun provideForKey(key: String): TestableItem? {
|
||||
if (this::api.isInitialized) {
|
||||
return null
|
||||
}
|
||||
|
||||
val head = api.getItemHead(key) ?: return null
|
||||
val namespacedKey = NamespacedKeyUtils.create("headdb", key)
|
||||
return CustomItem(
|
||||
namespacedKey,
|
||||
Predicate { test: ItemStack ->
|
||||
val found = api.getItemID(test) ?: return@Predicate false
|
||||
found == key
|
||||
},
|
||||
head
|
||||
)
|
||||
}
|
||||
@EventHandler
|
||||
fun onLoad(@Suppress("UNUSED_PARAMETER") event: DatabaseLoadEvent) {
|
||||
api = HeadDatabaseAPI()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,36 +1,39 @@
|
||||
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.core.items.Items
|
||||
import com.willfp.eco.core.items.TestableItem
|
||||
import com.willfp.eco.core.items.provider.ItemProvider
|
||||
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 {
|
||||
class CustomItemsItemsAdder : 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)
|
||||
Items.registerItemProvider(ItemsAdderProvider())
|
||||
}
|
||||
|
||||
override fun getPluginName(): String {
|
||||
return "ItemsAdder"
|
||||
}
|
||||
|
||||
private class ItemsAdderProvider : ItemProvider("itemsadder") {
|
||||
override fun provideForKey(key: String): TestableItem? {
|
||||
val item = CustomStack.getInstance("itemsadder:$key") ?: return null
|
||||
val id = item.id
|
||||
val namespacedKey = NamespacedKeyUtils.create("itemsadder", key)
|
||||
val stack = item.itemStack
|
||||
return CustomItem(
|
||||
namespacedKey,
|
||||
Predicate { test: ItemStack ->
|
||||
val customStack = CustomStack.byItemStack(test) ?: return@Predicate false
|
||||
customStack.id.equals(id, ignoreCase = true)
|
||||
},
|
||||
stack
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,9 @@ class CustomItemsOraxen : CustomItemsWrapper {
|
||||
for (item in OraxenItems.getItems()) {
|
||||
val stack = item.build()
|
||||
val id: String = Objects.requireNonNullElse(OraxenItems.getIdByItem(item), "")
|
||||
if (id.isEmpty()) continue
|
||||
if (id.isEmpty()) {
|
||||
continue
|
||||
}
|
||||
val key: NamespacedKey = NamespacedKeyUtils.create("oraxen", id.lowercase())
|
||||
CustomItem(
|
||||
key, Predicate { test: ItemStack ->
|
||||
|
||||
@@ -25,8 +25,11 @@ softdepend:
|
||||
- ItemsAdder
|
||||
- Oraxen
|
||||
- HeadDatabase
|
||||
- GriefDefender
|
||||
libraries:
|
||||
- org.reflections:reflections:0.9.12
|
||||
- org.apache.maven:maven-artifact:3.0.3
|
||||
- org.jetbrains.kotlin:kotlin-stdlib:1.5.31
|
||||
- 'org.reflections:reflections:0.9.12'
|
||||
- 'org.apache.maven:maven-artifact:3.0.3'
|
||||
- 'org.jetbrains.kotlin:kotlin-stdlib:1.5.31'
|
||||
- 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
- 'net.kyori:adventure-api:4.9.1'
|
||||
- 'net.kyori:adventure-text-serializer-gson:4.9.2'
|
||||
- 'net.kyori:adventure-text-serializer-legacy:4.8.1'
|
||||
@@ -7,5 +7,5 @@ interface ChatComponentProxy : AbstractProxy {
|
||||
fun modifyComponent(
|
||||
obj: Any,
|
||||
player: Player
|
||||
): Any?
|
||||
): Any
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
version = 6.9.1
|
||||
version = 6.10.0
|
||||
plugin-name = eco
|
||||
Binary file not shown.
Reference in New Issue
Block a user