diff --git a/build.gradle b/build.gradle index 77763143..c65fc00a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java-library' - id 'com.github.johnrengelman.shadow' version '5.2.0' + id 'com.github.johnrengelman.shadow' version '7.0.0' id 'maven-publish' id 'java' } @@ -16,7 +16,6 @@ allprojects { repositories { mavenCentral() - jcenter() mavenLocal() maven { url 'https://jitpack.io' } maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } @@ -53,11 +52,11 @@ allprojects { compileOnly 'org.jetbrains:annotations:19.0.0' - compileOnly 'org.projectlombok:lombok:1.18.16' - annotationProcessor 'org.projectlombok:lombok:1.18.16' + compileOnly 'org.projectlombok:lombok:1.18.20' + annotationProcessor 'org.projectlombok:lombok:1.18.20' - testCompileOnly 'org.projectlombok:lombok:1.18.16' - testAnnotationProcessor 'org.projectlombok:lombok:1.18.16' + testCompileOnly 'org.projectlombok:lombok:1.18.20' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' } tasks.withType(JavaCompile) { @@ -96,7 +95,7 @@ jar { group = 'com.willfp' archivesBaseName = project.name version = findProperty("version") -java.sourceCompatibility = JavaVersion.VERSION_1_8 +java.sourceCompatibility = JavaVersion.VERSION_16 compileJava.options.encoding = 'UTF-8' diff --git a/eco-core/core-nms/v1_17_R1/build.gradle b/eco-core/core-nms/v1_17_R1/build.gradle new file mode 100644 index 00000000..e732641e --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/build.gradle @@ -0,0 +1,6 @@ +group 'com.willfp' +version rootProject.version + +dependencies { + compileOnly 'org.spigotmc:spigot:1.17-R0.1-SNAPSHOT' +} \ No newline at end of file diff --git a/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/EcoCraftEnchantmentManager.java b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/EcoCraftEnchantmentManager.java new file mode 100644 index 00000000..857034f1 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/EcoCraftEnchantmentManager.java @@ -0,0 +1,25 @@ +package com.willfp.ecoenchants.proxy.v1_17_R1; + +import com.willfp.ecoenchants.enchantments.support.vanilla.VanillaEnchantmentMetadata; +import com.willfp.ecoenchants.enchantments.support.vanilla.VanillaEnchantments; +import com.willfp.ecoenchants.proxy.proxies.EcoCraftEnchantmentManagerProxy; +import com.willfp.ecoenchants.proxy.v1_17_R1.enchants.EcoCraftEnchantment; +import net.minecraft.core.IRegistry; +import net.minecraft.world.item.enchantment.Enchantment; +import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey; + +import java.util.Map; + +public final class EcoCraftEnchantmentManager implements EcoCraftEnchantmentManagerProxy { + @Override + public void registerNewCraftEnchantments() { + Map metadataMap = VanillaEnchantments.getMetadataMap(); + + for (Enchantment enchantment : IRegistry.X) { + NamespacedKey key = CraftNamespacedKey.fromMinecraft(IRegistry.X.getKey(enchantment)); + VanillaEnchantmentMetadata metadata = metadataMap.get(org.bukkit.enchantments.Enchantment.getByKey(key)); + new EcoCraftEnchantment(enchantment, metadata).register(); + } + } +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/FastGetEnchants.java b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/FastGetEnchants.java new file mode 100644 index 00000000..d5621715 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/FastGetEnchants.java @@ -0,0 +1,57 @@ +package com.willfp.ecoenchants.proxy.v1_17_R1; + +import com.willfp.ecoenchants.proxy.proxies.FastGetEnchantsProxy; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.world.item.ItemEnchantedBook; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; + +public final class FastGetEnchants implements FastGetEnchantsProxy { + @Override + public Map getEnchantmentsOnItem(@NotNull final ItemStack itemStack, + final boolean checkStored) { + net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + NBTTagList enchantmentNBT = checkStored && itemStack.getType() == Material.ENCHANTED_BOOK ? ItemEnchantedBook.d(nmsStack) : nmsStack.getEnchantments(); + HashMap foundEnchantments = new HashMap<>(); + + for (NBTBase base : enchantmentNBT) { + NBTTagCompound compound = (NBTTagCompound) base; + String key = compound.getString("id"); + int level = '\uffff' & compound.getShort("lvl"); + + Enchantment found = Enchantment.getByKey(CraftNamespacedKey.fromStringOrNull(key)); + if (found != null) { + foundEnchantments.put(found, level); + } + } + return foundEnchantments; + } + + @Override + public int getLevelOnItem(@NotNull final ItemStack itemStack, + @NotNull final Enchantment enchantment, + final boolean checkStored) { + net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + NBTTagList enchantmentNBT = checkStored && itemStack.getType() == Material.ENCHANTED_BOOK ? ItemEnchantedBook.d(nmsStack) : nmsStack.getEnchantments(); + + for (NBTBase base : enchantmentNBT) { + NBTTagCompound compound = (NBTTagCompound) base; + String key = compound.getString("id"); + if (!key.equals(enchantment.getKey().toString())) { + continue; + } + + return '\uffff' & compound.getShort("lvl"); + } + return 0; + } +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/OpenInventory.java b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/OpenInventory.java new file mode 100644 index 00000000..f5e5db80 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/OpenInventory.java @@ -0,0 +1,13 @@ +package com.willfp.ecoenchants.proxy.v1_17_R1; + +import com.willfp.ecoenchants.proxy.proxies.OpenInventoryProxy; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public final class OpenInventory implements OpenInventoryProxy { + @Override + public Object getOpenInventory(@NotNull final Player player) { + return ((CraftPlayer) player).getHandle().bV; + } +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/RepairCost.java b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/RepairCost.java new file mode 100644 index 00000000..ce98da51 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/RepairCost.java @@ -0,0 +1,22 @@ +package com.willfp.ecoenchants.proxy.v1_17_R1; + +import com.willfp.ecoenchants.proxy.proxies.RepairCostProxy; +import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +public final class RepairCost implements RepairCostProxy { + @Override + public ItemStack setRepairCost(@NotNull final ItemStack itemStack, + final int cost) { + net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + nmsStack.setRepairCost(cost); + return CraftItemStack.asBukkitCopy(nmsStack); + } + + @Override + public int getRepairCost(@NotNull final ItemStack itemStack) { + net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + return nmsStack.getRepairCost(); + } +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/enchants/EcoCraftEnchantment.java b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/enchants/EcoCraftEnchantment.java new file mode 100644 index 00000000..f5a58348 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/java/com/willfp/ecoenchants/proxy/v1_17_R1/enchants/EcoCraftEnchantment.java @@ -0,0 +1,61 @@ +package com.willfp.ecoenchants.proxy.v1_17_R1.enchants; + +import com.willfp.ecoenchants.enchantments.EcoEnchants; +import com.willfp.ecoenchants.enchantments.support.vanilla.VanillaEnchantmentMetadata; +import net.minecraft.world.item.enchantment.Enchantment; +import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.v1_17_R1.enchantments.CraftEnchantment; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +@SuppressWarnings("unchecked") +public class EcoCraftEnchantment extends CraftEnchantment { + private final VanillaEnchantmentMetadata metadata; + + public EcoCraftEnchantment(@NotNull final Enchantment target, + @NotNull final VanillaEnchantmentMetadata metadata) { + super(target); + this.metadata = metadata; + } + + @Override + public int getMaxLevel() { + return metadata.getMaxLevel() == null ? this.getHandle().getMaxLevel() : metadata.getMaxLevel(); + } + + @Override + public boolean conflictsWith(@NotNull final org.bukkit.enchantments.Enchantment other) { + return EcoEnchants.getFromEnchantment(other) == null ? super.conflictsWith(other) : other.conflictsWith(other); + } + + public void register() { + try { + Field byIdField = org.bukkit.enchantments.Enchantment.class.getDeclaredField("byKey"); + Field byNameField = org.bukkit.enchantments.Enchantment.class.getDeclaredField("byName"); + byIdField.setAccessible(true); + byNameField.setAccessible(true); + Map byKey = (Map) byIdField.get(null); + Map byName = (Map) byNameField.get(null); + byKey.remove(this.getKey()); + byName.remove(this.getName()); + + Map byNameClone = new HashMap<>(byName); + for (Map.Entry entry : byNameClone.entrySet()) { + if (entry.getValue().getKey().equals(this.getKey())) { + byName.remove(entry.getKey()); + } + } + + Field f = org.bukkit.enchantments.Enchantment.class.getDeclaredField("acceptingNew"); + f.setAccessible(true); + f.set(null, true); + f.setAccessible(false); + + org.bukkit.enchantments.Enchantment.registerEnchantment(this); + } catch (NoSuchFieldException | IllegalAccessException ignored) { + } + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 622ab64a..0f80bbf5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/settings.gradle b/settings.gradle index 47b40497..6debe263 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,6 +6,7 @@ include ':eco-core:core-nms' include ':eco-core:core-nms:v1_16_R1' include ':eco-core:core-nms:v1_16_R2' include ':eco-core:core-nms:v1_16_R3' +include ':eco-core:core-nms:v1_17_R1' include ':eco-core:core-proxy' include ':eco-core:core-plugin'