Compare commits

..

19 Commits

Author SHA1 Message Date
Will FP
f01e18950c Merge pull request #365 from Exanthiax/develop 2024-07-24 10:44:03 +01:00
Exanthiax
d4a6bf105b Update ParticleFactoryRGB.kt 2024-07-24 01:55:20 +01:00
Auxilor
a9a961ff2b Added FancyHolograms integration 2024-07-20 12:49:07 +01:00
Auxilor
25d572c0db Added AutocrafterPatch 2024-07-20 09:59:58 +01:00
Auxilor
8a4243e434 Fixed XP price 2024-07-19 20:01:20 +01:00
Auxilor
6c40670f5e Updated to 6.72.0 2024-07-19 19:46:26 +01:00
Auxilor
6e94f3cee8 Added support for multiple display modules per plugin 2024-07-19 19:46:26 +01:00
Auxilor
4968d3ff22 Updated to 6.71.6 2024-07-14 16:04:21 +01:00
Auxilor
eecd80be1c Fixed display name 2024-07-14 16:04:14 +01:00
Auxilor
52c1b52f6d Fixed tab completion bug 2024-07-12 18:18:40 +01:00
Auxilor
f321296227 Updated to 6.71.5 2024-07-12 18:08:35 +01:00
Auxilor
ddd12db420 Fixed ExtendedPersistentDataContainerFactory 2024-07-12 18:07:53 +01:00
Auxilor
bd09791b5b Improved command tab-completion 2024-07-08 18:49:29 +01:00
Auxilor
ce9549f03d Updated to 6.71.4 2024-07-08 15:14:24 +01:00
Auxilor
52367dbb95 Fixed Java 17 compatibility 2024-07-08 15:14:18 +01:00
Auxilor
0080c32c23 Updated to 6.71.3 2024-06-25 02:30:45 +01:00
Auxilor
581094a930 Fixed DurabilityUtils 2024-06-25 02:30:37 +01:00
Auxilor
5d9c8775e8 Updated to 6.71.2 2024-06-24 18:44:16 +01:00
Auxilor
9ab51d2c87 Added fix for TopInventory on pre-1.21 2024-06-24 18:42:32 +01:00
45 changed files with 587 additions and 71 deletions

View File

@@ -22,6 +22,7 @@ dependencies {
implementation(project(path = ":eco-core:core-plugin", configuration = "shadow")) implementation(project(path = ":eco-core:core-plugin", configuration = "shadow"))
implementation(project(":eco-core:core-proxy")) implementation(project(":eco-core:core-proxy"))
implementation(project(":eco-core:core-backend")) implementation(project(":eco-core:core-backend"))
implementation(project(":eco-core:core-backend-modern"))
implementation(project(path = ":eco-core:core-nms:v1_17_R1", configuration = "reobf")) implementation(project(path = ":eco-core:core-nms:v1_17_R1", configuration = "reobf"))
implementation(project(path = ":eco-core:core-nms:v1_18_R1", configuration = "reobf")) implementation(project(path = ":eco-core:core-nms:v1_18_R1", configuration = "reobf"))
implementation(project(path = ":eco-core:core-nms:v1_18_R2", configuration = "reobf")) implementation(project(path = ":eco-core:core-nms:v1_18_R2", configuration = "reobf"))
@@ -96,6 +97,9 @@ allprojects {
// HuskPlugins // HuskPlugins
maven("https://repo.william278.net/releases") maven("https://repo.william278.net/releases")
// FancyHolograms
maven("https://repo.fancyplugins.de/releases")
} }
dependencies { dependencies {

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core; package com.willfp.eco.core;
import com.google.common.collect.ImmutableList;
import com.willfp.eco.core.command.impl.PluginCommand; import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.eco.core.config.base.ConfigYml; import com.willfp.eco.core.config.base.ConfigYml;
import com.willfp.eco.core.config.base.LangYml; import com.willfp.eco.core.config.base.LangYml;
@@ -36,6 +37,8 @@ import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -120,9 +123,17 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Regist
/** /**
* The display module for the plugin. * The display module for the plugin.
*
* @deprecated Plugins can now have multiple display modules.
*/ */
@Deprecated(since = "6.72.0")
private DisplayModule displayModule; private DisplayModule displayModule;
/**
* The display modules for the plugin.
*/
private List<DisplayModule> displayModules = new ArrayList<>();
/** /**
* The logger for the plugin. * The logger for the plugin.
*/ */
@@ -555,10 +566,15 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Regist
* Default code to be executed after the server is up. * Default code to be executed after the server is up.
*/ */
public final void afterLoad() { public final void afterLoad() {
this.displayModule = createDisplayModule(); DisplayModule module = createDisplayModule();
if (module != null) {
Display.registerDisplayModule(module);
this.displayModules.add(module);
}
if (this.getDisplayModule() != null) { for (DisplayModule displayModule : this.loadDisplayModules()) {
Display.registerDisplayModule(this.getDisplayModule()); Display.registerDisplayModule(displayModule);
this.displayModules.add(displayModule);
} }
if (Prerequisite.HAS_PROTOCOLLIB.isMet()) { if (Prerequisite.HAS_PROTOCOLLIB.isMet()) {
@@ -899,14 +915,25 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Regist
* Create the display module for the plugin. * Create the display module for the plugin.
* *
* @return The display module, or null. * @return The display module, or null.
* @deprecated Use {@link #loadDisplayModules()} instead.
*/ */
@Nullable @Nullable
@Deprecated(since = "6.72.0")
protected DisplayModule createDisplayModule() { protected DisplayModule createDisplayModule() {
Validate.isTrue(this.getDisplayModule() == null, "Display module exists!"); Validate.isTrue(this.getDisplayModule() == null, "Display module exists!");
return null; return null;
} }
/**
* Load display modules.
*
* @return The display modules.
*/
protected List<DisplayModule> loadDisplayModules() {
return new ArrayList<>();
}
/** /**
* Get the minimum version of eco to use the plugin. * Get the minimum version of eco to use the plugin.
* *
@@ -1156,12 +1183,23 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Regist
* Get the plugin's display module. * Get the plugin's display module.
* *
* @return The display module. * @return The display module.
* @deprecated Use {@link #getDisplayModules()} instead.
*/ */
@Nullable @Nullable
@Deprecated(since = "6.72.0", forRemoval = true)
public DisplayModule getDisplayModule() { public DisplayModule getDisplayModule() {
return this.displayModule; return this.displayModule;
} }
/**
* Get the plugin's display modules.
*
* @return The display modules.
*/
public List<DisplayModule> getDisplayModules() {
return ImmutableList.copyOf(this.displayModules);
}
/** /**
* Get if the plugin is outdated. * Get if the plugin is outdated.
* *

View File

@@ -211,12 +211,22 @@ public final class Display {
new ArrayList<>() new ArrayList<>()
); );
modules.removeIf(it -> it.getPluginName().equalsIgnoreCase(module.getPluginName()));
modules.add(module); modules.add(module);
REGISTERED_MODULES.put(module.getWeight(), modules); REGISTERED_MODULES.put(module.getWeight(), modules);
} }
/**
* Unregister a display module.
*
* @param module The module.
*/
public static void unregisterDisplayModule(@NotNull final DisplayModule module) {
for (List<DisplayModule> modules : REGISTERED_MODULES.values()) {
modules.remove(module);
}
}
private Display() { private Display() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
} }

View File

@@ -158,11 +158,8 @@ public final class DurabilityUtils {
} }
if (item.getItemMeta() instanceof Damageable meta) { if (item.getItemMeta() instanceof Damageable meta) {
meta.setDamage(meta.getDamage() - repair); meta.setDamage(Math.max(0, meta.getDamage() - repair));
if (meta.getDamage() < 0) {
meta.setDamage(0);
}
item.setItemMeta((ItemMeta) meta); item.setItemMeta((ItemMeta) meta);
} }
} }

View File

@@ -0,0 +1,19 @@
group = "com.willfp"
version = rootProject.version
dependencies {
compileOnly(project(":eco-core:core-backend"))
compileOnly("io.papermc.paper:paper-api:1.21-R0.1-SNAPSHOT")
}
tasks {
compileJava {
options.release = 21
}
compileKotlin {
kotlinOptions {
jvmTarget = "21"
}
}
}

View File

@@ -0,0 +1,13 @@
package com.willfp.eco.internal.compat.modern.entities
import com.willfp.eco.core.entities.Entities
import com.willfp.eco.internal.compat.modern.entities.parsers.EntityArgParserJumpStrength
import com.willfp.eco.internal.compat.modern.entities.parsers.EntityArgParserScale
import com.willfp.eco.internal.entities.ModernEntityArgParsers
class ModernEntityArgParsersImpl: ModernEntityArgParsers {
override fun registerAll() {
Entities.registerArgParser(EntityArgParserScale)
Entities.registerArgParser(EntityArgParserJumpStrength)
}
}

View File

@@ -1,4 +1,4 @@
package com.willfp.eco.internal.entities package com.willfp.eco.internal.compat.modern.entities.parsers
import com.willfp.eco.core.entities.args.EntityArgParseResult import com.willfp.eco.core.entities.args.EntityArgParseResult
import com.willfp.eco.core.entities.args.EntityArgParser import com.willfp.eco.core.entities.args.EntityArgParser
@@ -40,4 +40,4 @@ object EntityArgParserJumpStrength : EntityArgParser {
} }
) )
} }
} }

View File

@@ -0,0 +1,45 @@
package com.willfp.eco.internal.compat.modern.entities.parsers
import com.willfp.eco.core.entities.args.EntityArgParseResult
import com.willfp.eco.core.entities.args.EntityArgParser
import org.bukkit.attribute.Attribute
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Phantom
import org.bukkit.entity.Slime
object EntityArgParserScale : EntityArgParser {
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
var attributeValue: Double? = null
for (arg in args) {
val argSplit = arg.split(":")
if (!argSplit[0].equals("scale", ignoreCase = true)) {
continue
}
if (argSplit.size < 2) {
continue
}
attributeValue = argSplit[1].toDoubleOrNull()
}
attributeValue ?: return null
return EntityArgParseResult(
{
if (it !is LivingEntity) {
return@EntityArgParseResult false
}
val inst = it.getAttribute(Attribute.GENERIC_SCALE) ?: return@EntityArgParseResult false
inst.value >= attributeValue
},
{
if (it !is LivingEntity) {
return@EntityArgParseResult
}
it.getAttribute(Attribute.GENERIC_SCALE)?.baseValue = attributeValue
}
)
}
}

View File

@@ -0,0 +1,21 @@
package com.willfp.eco.internal.compat.modern.items
import com.willfp.eco.core.items.Items
import com.willfp.eco.internal.compat.modern.items.parsers.ArgParserFireResistant
import com.willfp.eco.internal.compat.modern.items.parsers.ArgParserGlint
import com.willfp.eco.internal.compat.modern.items.parsers.ArgParserItemName
import com.willfp.eco.internal.compat.modern.items.parsers.ArgParserMaxDamage
import com.willfp.eco.internal.compat.modern.items.parsers.ArgParserMaxStackSize
import com.willfp.eco.internal.compat.modern.items.parsers.ArgParserTrim
import com.willfp.eco.internal.items.ModernItemArgParsers
class ModernItemArgParsersImpl : ModernItemArgParsers {
override fun registerAll() {
Items.registerArgParser(ArgParserTrim)
Items.registerArgParser(ArgParserFireResistant)
Items.registerArgParser(ArgParserGlint)
Items.registerArgParser(ArgParserItemName)
Items.registerArgParser(ArgParserMaxDamage)
Items.registerArgParser(ArgParserMaxStackSize)
}
}

View File

@@ -1,4 +1,4 @@
package com.willfp.eco.internal.items.modern package com.willfp.eco.internal.compat.modern.items.parsers
import com.willfp.eco.internal.items.templates.FlagArgParser import com.willfp.eco.internal.items.templates.FlagArgParser
import org.bukkit.inventory.meta.ItemMeta import org.bukkit.inventory.meta.ItemMeta

View File

@@ -1,4 +1,4 @@
package com.willfp.eco.internal.items.modern package com.willfp.eco.internal.compat.modern.items.parsers
import com.willfp.eco.internal.items.templates.FlagArgParser import com.willfp.eco.internal.items.templates.FlagArgParser
import org.bukkit.inventory.meta.ItemMeta import org.bukkit.inventory.meta.ItemMeta

View File

@@ -1,4 +1,4 @@
package com.willfp.eco.internal.items.modern package com.willfp.eco.internal.compat.modern.items.parsers
import com.willfp.eco.internal.items.templates.ValueArgParser import com.willfp.eco.internal.items.templates.ValueArgParser
import com.willfp.eco.util.StringUtils import com.willfp.eco.util.StringUtils

View File

@@ -1,12 +1,8 @@
package com.willfp.eco.internal.items.modern package com.willfp.eco.internal.compat.modern.items.parsers
import com.willfp.eco.internal.items.templates.ValueArgParser import com.willfp.eco.internal.items.templates.ValueArgParser
import com.willfp.eco.util.StringUtils
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.minimessage.MiniMessage
import org.bukkit.inventory.meta.Damageable import org.bukkit.inventory.meta.Damageable
import org.bukkit.inventory.meta.ItemMeta import org.bukkit.inventory.meta.ItemMeta
import org.checkerframework.checker.units.qual.m
object ArgParserMaxDamage : ValueArgParser<Int>("max_damage") { object ArgParserMaxDamage : ValueArgParser<Int>("max_damage") {
override fun parse(arg: String): Int? { override fun parse(arg: String): Int? {

View File

@@ -1,12 +1,7 @@
package com.willfp.eco.internal.items.modern package com.willfp.eco.internal.compat.modern.items.parsers
import com.willfp.eco.internal.items.templates.ValueArgParser import com.willfp.eco.internal.items.templates.ValueArgParser
import com.willfp.eco.util.StringUtils
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.minimessage.MiniMessage
import org.bukkit.inventory.meta.Damageable
import org.bukkit.inventory.meta.ItemMeta import org.bukkit.inventory.meta.ItemMeta
import org.checkerframework.checker.units.qual.m
object ArgParserMaxStackSize : ValueArgParser<Int>("max_stack_size") { object ArgParserMaxStackSize : ValueArgParser<Int>("max_stack_size") {
override fun parse(arg: String): Int? { override fun parse(arg: String): Int? {

View File

@@ -1,4 +1,4 @@
package com.willfp.eco.internal.items.modern package com.willfp.eco.internal.compat.modern.items.parsers
import com.willfp.eco.core.items.args.LookupArgParser import com.willfp.eco.core.items.args.LookupArgParser
import org.bukkit.NamespacedKey import org.bukkit.NamespacedKey

View File

@@ -0,0 +1,19 @@
@file:Suppress("UnstableApiUsage")
package com.willfp.eco.internal.compat.modern.recipes
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.internal.recipes.AutocrafterPatch
import org.bukkit.event.EventHandler
import org.bukkit.event.block.CrafterCraftEvent
class AutocrafterPatchImpl: AutocrafterPatch {
@EventHandler
fun preventEcoRecipes(event: CrafterCraftEvent) {
if (!EcoPlugin.getPluginNames().contains(event.recipe.key.namespace)) {
return
}
event.isCancelled = true
}
}

View File

@@ -6,7 +6,7 @@ dependencies {
implementation("org.reflections:reflections:0.9.12") implementation("org.reflections:reflections:0.9.12")
implementation("org.objenesis:objenesis:3.2") implementation("org.objenesis:objenesis:3.2")
compileOnly("io.papermc.paper:paper-api:1.21-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT")
compileOnly("me.clip:placeholderapi:2.11.4") compileOnly("me.clip:placeholderapi:2.11.4")
compileOnly("net.kyori:adventure-text-minimessage:4.10.0") compileOnly("net.kyori:adventure-text-minimessage:4.10.0")
compileOnly("net.kyori:adventure-platform-bukkit:4.1.0") compileOnly("net.kyori:adventure-platform-bukkit:4.1.0")
@@ -16,12 +16,12 @@ dependencies {
tasks { tasks {
compileJava { compileJava {
options.release = 21 options.release = 17
} }
compileKotlin { compileKotlin {
kotlinOptions { kotlinOptions {
jvmTarget = "21" jvmTarget = "17"
} }
} }
} }

View File

@@ -126,14 +126,19 @@ abstract class HandledCommand(
* @return The tab completion results. * @return The tab completion results.
*/ */
private fun CommandBase.handleTabComplete(sender: CommandSender, args: List<String>): List<String> { private fun CommandBase.handleTabComplete(sender: CommandSender, args: List<String>): List<String> {
if (!sender.hasPermission(permission)) return emptyList() if (!sender.hasPermission(permission)) {
return emptyList()
}
if (args.size == 1) { if (args.size == 1) {
val completions = subcommands.filter { sender.hasPermission(it.permission) }.map { it.name } val completions = mutableListOf<String>()
val list = mutableListOf<String>() StringUtil.copyPartialMatches(
args[0],
subcommands.filter { sender.hasPermission(it.permission) }.map { it.name },
completions
)
StringUtil.copyPartialMatches(args[0], completions, list)
if (completions.isNotEmpty()) { if (completions.isNotEmpty()) {
return completions return completions
} }
@@ -156,9 +161,11 @@ abstract class HandledCommand(
} }
val completions = tabComplete(sender, args).toMutableList() val completions = tabComplete(sender, args).toMutableList()
if (sender is Player) { if (sender is Player) {
completions.addAll(tabComplete(sender, args)) completions.addAll(tabComplete(sender, args))
} }
return completions.sorted() return completions.sorted()
} }
} }

View File

@@ -0,0 +1,68 @@
package com.willfp.eco.internal.compat
import com.willfp.eco.core.Prerequisite
import com.willfp.eco.core.proxy.exceptions.ProxyError
private const val BASE_PACKAGE = "com.willfp.eco.internal.compat.modern"
private val isModern = Prerequisite.HAS_PAPER.isMet && Prerequisite.HAS_1_21.isMet
internal annotation class ModernCompatibilityProxy(
val location: String
)
private val cache = mutableMapOf<Class<*>, Any>()
object ModernCompatibilityScope {
inline fun <reified T> loadProxy(): T {
return loadCompatibilityProxy(T::class.java)
}
inline fun <reified T> useProxy(block: T.() -> Any?) {
val proxy = loadProxy<T>()
with(proxy) {
block()
}
}
}
fun <R> ifModern(block: ModernCompatibilityScope.() -> R) {
if (!isModern) {
return
}
block(ModernCompatibilityScope)
}
fun <T> loadCompatibilityProxy(clazz: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return cache.getOrPut(clazz) {
loadProxyUncached(clazz)
} as T
}
private fun loadProxyUncached(clazz: Class<*>): Any {
val proxy = clazz.getAnnotation(ModernCompatibilityProxy::class.java)
val location = proxy?.location ?: throw IllegalArgumentException("Class ${clazz.name} is not a proxy")
val className = "$BASE_PACKAGE.$location"
try {
val found = Class.forName(className)
val constructor = found.getConstructor()
val instance = constructor.newInstance()
if (!clazz.isInstance(instance)) {
throw ProxyError(
"Modern compatibility proxy class $className does not implement ${clazz.name}",
ClassCastException()
)
}
return instance
} catch (e: ClassNotFoundException) {
throw ProxyError("Could not find modern compatibility proxy class $className", e)
} catch (e: NoSuchMethodException) {
throw ProxyError("Could not find no-args constructor for modern compatibility proxy class $className", e)
}
}

View File

@@ -40,4 +40,4 @@ object EntityArgParserFlySpeed : EntityArgParser {
} }
) )
} }
} }

View File

@@ -0,0 +1,8 @@
package com.willfp.eco.internal.entities
import com.willfp.eco.internal.compat.ModernCompatibilityProxy
@ModernCompatibilityProxy("entities.ModernEntityArgParsersImpl")
interface ModernEntityArgParsers {
fun registerAll()
}

View File

@@ -1,5 +1,7 @@
package com.willfp.eco.internal.gui.menu package com.willfp.eco.internal.gui.menu
import com.willfp.eco.core.Eco
import com.willfp.eco.core.Prerequisite
import com.willfp.eco.core.gui.menu.events.CaptiveItemChangeEvent import com.willfp.eco.core.gui.menu.events.CaptiveItemChangeEvent
import com.willfp.eco.core.items.isEcoEmpty import com.willfp.eco.core.items.isEcoEmpty
import com.willfp.eco.core.recipe.parts.EmptyTestableItem import com.willfp.eco.core.recipe.parts.EmptyTestableItem
@@ -20,9 +22,23 @@ fun Player.forceRenderedInventory(menu: RenderedInventory) {
trackedForceRendered[this.uniqueId] = menu trackedForceRendered[this.uniqueId] = menu
} }
// Workaround because 1.21 has OpenInventory as an interface instead of an abstract class like in previous versions
interface TopInventoryProxy {
fun getTopInventory(player: Player): Inventory
}
private val Player.topInventory: Inventory
get() {
return if (!Prerequisite.HAS_1_21.isMet) {
Eco.get().ecoPlugin.getProxy(TopInventoryProxy::class.java).getTopInventory(this)
} else {
this.openInventory.topInventory
}
}
val Player.renderedInventory: RenderedInventory? val Player.renderedInventory: RenderedInventory?
get() = trackedForceRendered[this.uniqueId] get() = trackedForceRendered[this.uniqueId]
?: this.openInventory.topInventory.asRenderedInventory() ?: this.topInventory.asRenderedInventory()
class RenderedInventory( class RenderedInventory(
val menu: EcoMenu, val menu: EcoMenu,

View File

@@ -0,0 +1,8 @@
package com.willfp.eco.internal.items
import com.willfp.eco.internal.compat.ModernCompatibilityProxy
@ModernCompatibilityProxy("items.ModernItemArgParsersImpl")
interface ModernItemArgParsers {
fun registerAll()
}

View File

@@ -12,7 +12,7 @@ object ParticleFactoryRGB : ParticleFactory {
if (Prerequisite.HAS_1_20_5.isMet) { if (Prerequisite.HAS_1_20_5.isMet) {
Particle.valueOf("DUST") Particle.valueOf("DUST")
} else { } else {
Particle.valueOf("REDSTONE_DUST") Particle.valueOf("REDSTONE")
} }
}.getOrNull() }.getOrNull()

View File

@@ -8,6 +8,11 @@ import org.bukkit.entity.Player
import java.util.UUID import java.util.UUID
import kotlin.math.roundToInt import kotlin.math.roundToInt
private fun getXPNeededForLevel(level: Int): Int {
// XP Formula from NMS Player
return if (level >= 30) 112 + (level - 30) * 9 else (if (level >= 15) 37 + (level - 15) * 5 else 7 + level * 2)
}
object PriceFactoryXP : PriceFactory { object PriceFactoryXP : PriceFactory {
override fun getNames() = listOf( override fun getNames() = listOf(
"xp", "xp",
@@ -25,15 +30,37 @@ object PriceFactoryXP : PriceFactory {
) : Price { ) : Price {
private val multipliers = mutableMapOf<UUID, Double>() private val multipliers = mutableMapOf<UUID, Double>()
override fun canAfford(player: Player, multiplier: Double): Boolean = override fun canAfford(player: Player, multiplier: Double): Boolean {
player.totalExperience >= getValue(player, multiplier) var totalExperience = 0
for (level in 0 until player.level) {
totalExperience += getXPNeededForLevel(level)
}
totalExperience += (player.exp * getXPNeededForLevel(player.level)).toInt()
return totalExperience >= getValue(player, multiplier).roundToInt()
}
override fun pay(player: Player, multiplier: Double) { override fun pay(player: Player, multiplier: Double) {
player.totalExperience -= getValue(player, multiplier).roundToInt() takeXP(player, getValue(player, multiplier).roundToInt())
}
private fun takeXP(player: Player, amount: Int) {
val currentLevel = player.level
val currentExp = player.exp * getXPNeededForLevel(currentLevel)
if (currentExp >= amount) {
player.exp = (currentExp - amount) / getXPNeededForLevel(currentLevel)
} else {
// Handle recursive level down
player.exp = 1f
player.level = (currentLevel - 1).coerceAtLeast(0)
takeXP(player, (amount - currentExp).toInt())
}
} }
override fun giveTo(player: Player, multiplier: Double) { override fun giveTo(player: Player, multiplier: Double) {
player.totalExperience += getValue(player, multiplier).roundToInt() player.giveExp(getValue(player, multiplier).roundToInt())
} }
override fun getValue(player: Player, multiplier: Double): Double { override fun getValue(player: Player, multiplier: Double): Double {

View File

@@ -0,0 +1,7 @@
package com.willfp.eco.internal.recipes
import com.willfp.eco.internal.compat.ModernCompatibilityProxy
import org.bukkit.event.Listener
@ModernCompatibilityProxy("recipes.AutocrafterPatchImpl")
interface AutocrafterPatch: Listener

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.internal.spigot.proxy.v1_17_R1
import com.willfp.eco.internal.gui.menu.TopInventoryProxy
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
class TopInventory: TopInventoryProxy {
override fun getTopInventory(player: Player): Inventory {
return player.openInventory.topInventory
}
}

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.internal.spigot.proxy.v1_18_R1
import com.willfp.eco.internal.gui.menu.TopInventoryProxy
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
class TopInventory: TopInventoryProxy {
override fun getTopInventory(player: Player): Inventory {
return player.openInventory.topInventory
}
}

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.internal.spigot.proxy.v1_18_R2
import com.willfp.eco.internal.gui.menu.TopInventoryProxy
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
class TopInventory: TopInventoryProxy {
override fun getTopInventory(player: Player): Inventory {
return player.openInventory.topInventory
}
}

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.internal.spigot.proxy.v1_19_R1
import com.willfp.eco.internal.gui.menu.TopInventoryProxy
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
class TopInventory: TopInventoryProxy {
override fun getTopInventory(player: Player): Inventory {
return player.openInventory.topInventory
}
}

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.internal.spigot.proxy.v1_19_R2
import com.willfp.eco.internal.gui.menu.TopInventoryProxy
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
class TopInventory: TopInventoryProxy {
override fun getTopInventory(player: Player): Inventory {
return player.openInventory.topInventory
}
}

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.internal.spigot.proxy.v1_19_R3
import com.willfp.eco.internal.gui.menu.TopInventoryProxy
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
class TopInventory: TopInventoryProxy {
override fun getTopInventory(player: Player): Inventory {
return player.openInventory.topInventory
}
}

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R1
import com.willfp.eco.internal.gui.menu.TopInventoryProxy
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
class TopInventory: TopInventoryProxy {
override fun getTopInventory(player: Player): Inventory {
return player.openInventory.topInventory
}
}

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R2
import com.willfp.eco.internal.gui.menu.TopInventoryProxy
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
class TopInventory: TopInventoryProxy {
override fun getTopInventory(player: Player): Inventory {
return player.openInventory.topInventory
}
}

View File

@@ -0,0 +1,11 @@
package com.willfp.eco.internal.spigot.proxy.v1_20_R3
import com.willfp.eco.internal.gui.menu.TopInventoryProxy
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
class TopInventory: TopInventoryProxy {
override fun getTopInventory(player: Player): Inventory {
return player.openInventory.topInventory
}
}

View File

@@ -43,15 +43,13 @@ class DisplayName : DisplayNameProxy {
val nmsComponent = displayName.toNMS() val nmsComponent = displayName.toNMS()
val nmsEntity = entity.handle val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible
val entityData = SynchedEntityData.Builder(nmsEntity).build()
entityData.set(displayNameAccessor, Optional.of(nmsComponent), true)
entityData.set(customNameVisibleAccessor, visible, true)
val packet = ClientboundSetEntityDataPacket( val packet = ClientboundSetEntityDataPacket(
nmsEntity.id, nmsEntity.id,
entityData.packDirty() ?: throw IllegalStateException("No packed entity data") listOf(
SynchedEntityData.DataValue.create(displayNameAccessor, Optional.of(nmsComponent)),
SynchedEntityData.DataValue.create(customNameVisibleAccessor, visible)
)
) )
player.sendPacket(Packet(packet)) player.sendPacket(Packet(packet))

View File

@@ -10,6 +10,7 @@ import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataContainer import org.bukkit.persistence.PersistentDataContainer
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
import java.lang.reflect.Field
class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFactoryProxy { class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFactoryProxy {
private val registry: CraftPersistentDataTypeRegistry private val registry: CraftPersistentDataTypeRegistry
@@ -21,7 +22,15 @@ class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFa
*/ */
val item = CraftItemStack.asCraftCopy(ItemStack(Material.STONE)) val item = CraftItemStack.asCraftCopy(ItemStack(Material.STONE))
val pdc = item.itemMeta!!.persistentDataContainer val pdc = item.itemMeta!!.persistentDataContainer
this.registry = CraftPersistentDataContainer::class.java.getDeclaredField("registry")
// Cross-version compatibility:
val registryField: Field = try {
CraftPersistentDataContainer::class.java.getDeclaredField("registry")
} catch (e: NoSuchFieldException) {
CraftPersistentDataContainer::class.java.superclass.getDeclaredField("registry")
}
this.registry = registryField
.apply { isAccessible = true }.get(pdc) as CraftPersistentDataTypeRegistry .apply { isAccessible = true }.get(pdc) as CraftPersistentDataTypeRegistry
} }

View File

@@ -66,6 +66,7 @@ dependencies {
compileOnly("net.william278.huskclaims:huskclaims-bukkit:1.0.1") compileOnly("net.william278.huskclaims:huskclaims-bukkit:1.0.1")
compileOnly("net.william278:husktowns:2.6.1") compileOnly("net.william278:husktowns:2.6.1")
compileOnly("com.github.jojodmo:ItemBridge:b0054538c1") compileOnly("com.github.jojodmo:ItemBridge:b0054538c1")
compileOnly("de.oliver:FancyHolograms:2.3.0")
compileOnly(fileTree("../../lib") { compileOnly(fileTree("../../lib") {
include("*.jar") include("*.jar")

View File

@@ -20,22 +20,45 @@ import com.willfp.eco.core.items.Items
import com.willfp.eco.core.packet.PacketListener import com.willfp.eco.core.packet.PacketListener
import com.willfp.eco.core.particle.Particles import com.willfp.eco.core.particle.Particles
import com.willfp.eco.core.price.Prices import com.willfp.eco.core.price.Prices
import com.willfp.eco.internal.compat.ifModern
import com.willfp.eco.internal.data.MavenVersionToStringAdapter import com.willfp.eco.internal.data.MavenVersionToStringAdapter
import com.willfp.eco.internal.data.VersionToStringAdapter import com.willfp.eco.internal.data.VersionToStringAdapter
import com.willfp.eco.internal.entities.* import com.willfp.eco.internal.entities.EntityArgParserAdult
import com.willfp.eco.internal.items.* import com.willfp.eco.internal.entities.EntityArgParserAttackDamage
import com.willfp.eco.internal.items.modern.ArgParserFireResistant import com.willfp.eco.internal.entities.EntityArgParserAttackSpeed
import com.willfp.eco.internal.items.modern.ArgParserGlint import com.willfp.eco.internal.entities.EntityArgParserBaby
import com.willfp.eco.internal.items.modern.ArgParserItemName import com.willfp.eco.internal.entities.EntityArgParserCharged
import com.willfp.eco.internal.items.modern.ArgParserMaxDamage import com.willfp.eco.internal.entities.EntityArgParserEquipment
import com.willfp.eco.internal.items.modern.ArgParserMaxStackSize import com.willfp.eco.internal.entities.EntityArgParserExplosionRadius
import com.willfp.eco.internal.items.modern.ArgParserTrim import com.willfp.eco.internal.entities.EntityArgParserFlySpeed
import com.willfp.eco.internal.entities.EntityArgParserFollowRange
import com.willfp.eco.internal.entities.EntityArgParserHealth
import com.willfp.eco.internal.entities.EntityArgParserKnockback
import com.willfp.eco.internal.entities.EntityArgParserKnockbackResistance
import com.willfp.eco.internal.entities.EntityArgParserName
import com.willfp.eco.internal.entities.EntityArgParserNoAI
import com.willfp.eco.internal.entities.EntityArgParserSilent
import com.willfp.eco.internal.entities.EntityArgParserSize
import com.willfp.eco.internal.entities.EntityArgParserSpawnReinforcements
import com.willfp.eco.internal.entities.EntityArgParserSpeed
import com.willfp.eco.internal.entities.ModernEntityArgParsers
import com.willfp.eco.internal.items.ArgParserColor
import com.willfp.eco.internal.items.ArgParserCustomModelData
import com.willfp.eco.internal.items.ArgParserEnchantment
import com.willfp.eco.internal.items.ArgParserEntity
import com.willfp.eco.internal.items.ArgParserFlag
import com.willfp.eco.internal.items.ArgParserHead
import com.willfp.eco.internal.items.ArgParserName
import com.willfp.eco.internal.items.ArgParserTexture
import com.willfp.eco.internal.items.ArgParserUnbreakable
import com.willfp.eco.internal.items.ModernItemArgParsers
import com.willfp.eco.internal.lookup.SegmentParserGroup import com.willfp.eco.internal.lookup.SegmentParserGroup
import com.willfp.eco.internal.lookup.SegmentParserUseIfPresent import com.willfp.eco.internal.lookup.SegmentParserUseIfPresent
import com.willfp.eco.internal.particle.ParticleFactoryRGB import com.willfp.eco.internal.particle.ParticleFactoryRGB
import com.willfp.eco.internal.price.PriceFactoryEconomy import com.willfp.eco.internal.price.PriceFactoryEconomy
import com.willfp.eco.internal.price.PriceFactoryXP import com.willfp.eco.internal.price.PriceFactoryXP
import com.willfp.eco.internal.price.PriceFactoryXPLevels import com.willfp.eco.internal.price.PriceFactoryXPLevels
import com.willfp.eco.internal.recipes.AutocrafterPatch
import com.willfp.eco.internal.spigot.arrows.ArrowDataListener import com.willfp.eco.internal.spigot.arrows.ArrowDataListener
import com.willfp.eco.internal.spigot.data.DataListener import com.willfp.eco.internal.spigot.data.DataListener
import com.willfp.eco.internal.spigot.data.DataYml import com.willfp.eco.internal.spigot.data.DataYml
@@ -43,21 +66,56 @@ import com.willfp.eco.internal.spigot.data.PlayerBlockListener
import com.willfp.eco.internal.spigot.data.ProfileHandler import com.willfp.eco.internal.spigot.data.ProfileHandler
import com.willfp.eco.internal.spigot.data.storage.ProfileSaver import com.willfp.eco.internal.spigot.data.storage.ProfileSaver
import com.willfp.eco.internal.spigot.drops.CollatedRunnable import com.willfp.eco.internal.spigot.drops.CollatedRunnable
import com.willfp.eco.internal.spigot.eventlisteners.* import com.willfp.eco.internal.spigot.eventlisteners.EntityDeathByEntityListeners
import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListenersPaper
import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListenersSpigot
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersPaper
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersSpigot
import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorChangeEventListeners import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorChangeEventListeners
import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener
import com.willfp.eco.internal.spigot.gui.GUIListener import com.willfp.eco.internal.spigot.gui.GUIListener
import com.willfp.eco.internal.spigot.integrations.afk.AFKIntegrationCMI import com.willfp.eco.internal.spigot.integrations.afk.AFKIntegrationCMI
import com.willfp.eco.internal.spigot.integrations.afk.AFKIntegrationEssentials import com.willfp.eco.internal.spigot.integrations.afk.AFKIntegrationEssentials
import com.willfp.eco.internal.spigot.integrations.anticheat.* import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatAAC
import com.willfp.eco.internal.spigot.integrations.antigrief.* import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatAlice
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatMatrix
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatNCP
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatSpartan
import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatVulcan
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefBentoBox
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCombatLogXV10
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCombatLogXV11
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCrashClaim
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefDeluxeCombat
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefFabledSkyBlock
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefFactionsUUID
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefGriefPrevention
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefHuskClaims
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefHuskTowns
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefIridiumSkyblock
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefKingdoms
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefLands
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefPvPManager
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefRPGHorses
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefSuperiorSkyblock2
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefTowny
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefWorldGuard
import com.willfp.eco.internal.spigot.integrations.customentities.CustomEntitiesMythicMobs import com.willfp.eco.internal.spigot.integrations.customentities.CustomEntitiesMythicMobs
import com.willfp.eco.internal.spigot.integrations.customitems.* import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsCustomCrafting
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsDenizen
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsExecutableItems
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsHeadDatabase
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsItemBridge
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsItemsAdder
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsMythicMobs
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsOraxen
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsScyther
import com.willfp.eco.internal.spigot.integrations.customrecipes.CustomRecipeCustomCrafting import com.willfp.eco.internal.spigot.integrations.customrecipes.CustomRecipeCustomCrafting
import com.willfp.eco.internal.spigot.integrations.economy.EconomyVault import com.willfp.eco.internal.spigot.integrations.economy.EconomyVault
import com.willfp.eco.internal.spigot.integrations.entitylookup.EntityLookupModelEngine import com.willfp.eco.internal.spigot.integrations.entitylookup.EntityLookupModelEngine
import com.willfp.eco.internal.spigot.integrations.hologram.HologramCMI import com.willfp.eco.internal.spigot.integrations.hologram.HologramCMI
import com.willfp.eco.internal.spigot.integrations.hologram.HologramDecentHolograms import com.willfp.eco.internal.spigot.integrations.hologram.HologramDecentHolograms
import com.willfp.eco.internal.spigot.integrations.hologram.HologramFancyHolograms
import com.willfp.eco.internal.spigot.integrations.hologram.HologramHolographicDisplays import com.willfp.eco.internal.spigot.integrations.hologram.HologramHolographicDisplays
import com.willfp.eco.internal.spigot.integrations.mcmmo.McmmoIntegrationImpl import com.willfp.eco.internal.spigot.integrations.mcmmo.McmmoIntegrationImpl
import com.willfp.eco.internal.spigot.integrations.multiverseinventories.MultiverseInventoriesIntegration import com.willfp.eco.internal.spigot.integrations.multiverseinventories.MultiverseInventoriesIntegration
@@ -104,13 +162,10 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
Items.registerArgParser(ArgParserHead) Items.registerArgParser(ArgParserHead)
Items.registerArgParser(ArgParserEntity) Items.registerArgParser(ArgParserEntity)
if (Prerequisite.HAS_PAPER.isMet && Prerequisite.HAS_1_21.isMet) { ifModern {
Items.registerArgParser(ArgParserTrim) useProxy<ModernItemArgParsers> {
Items.registerArgParser(ArgParserFireResistant) registerAll()
Items.registerArgParser(ArgParserGlint) }
Items.registerArgParser(ArgParserItemName)
Items.registerArgParser(ArgParserMaxDamage)
Items.registerArgParser(ArgParserMaxStackSize)
} }
Entities.registerArgParser(EntityArgParserName) Entities.registerArgParser(EntityArgParserName)
@@ -120,7 +175,6 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
Entities.registerArgParser(EntityArgParserFlySpeed) Entities.registerArgParser(EntityArgParserFlySpeed)
Entities.registerArgParser(EntityArgParserFollowRange) Entities.registerArgParser(EntityArgParserFollowRange)
Entities.registerArgParser(EntityArgParserHealth) Entities.registerArgParser(EntityArgParserHealth)
Entities.registerArgParser(EntityArgParserJumpStrength)
Entities.registerArgParser(EntityArgParserKnockback) Entities.registerArgParser(EntityArgParserKnockback)
Entities.registerArgParser(EntityArgParserKnockbackResistance) Entities.registerArgParser(EntityArgParserKnockbackResistance)
Entities.registerArgParser(EntityArgParserSize) Entities.registerArgParser(EntityArgParserSize)
@@ -133,6 +187,12 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
Entities.registerArgParser(EntityArgParserSilent) Entities.registerArgParser(EntityArgParserSilent)
Entities.registerArgParser(EntityArgParserEquipment) Entities.registerArgParser(EntityArgParserEquipment)
ifModern {
useProxy<ModernEntityArgParsers> {
registerAll()
}
}
Prices.registerPriceFactory(PriceFactoryEconomy) Prices.registerPriceFactory(PriceFactoryEconomy)
Prices.registerPriceFactory(PriceFactoryXPLevels) Prices.registerPriceFactory(PriceFactoryXPLevels)
Prices.registerPriceFactory(PriceFactoryXP) Prices.registerPriceFactory(PriceFactoryXP)
@@ -311,6 +371,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
IntegrationLoader("CMI") { HologramManager.register(HologramCMI()) }, IntegrationLoader("CMI") { HologramManager.register(HologramCMI()) },
IntegrationLoader("DecentHolograms") { HologramManager.register(HologramDecentHolograms()) }, IntegrationLoader("DecentHolograms") { HologramManager.register(HologramDecentHolograms()) },
//IntegrationLoader("GHolo") { HologramManager.register(HologramGHolo()) }, //IntegrationLoader("GHolo") { HologramManager.register(HologramGHolo()) },
IntegrationLoader("FancyHolograms") { HologramManager.register(HologramFancyHolograms()) },
// AFK // AFK
IntegrationLoader("Essentials") { AFKManager.register(AFKIntegrationEssentials()) }, IntegrationLoader("Essentials") { AFKManager.register(AFKIntegrationEssentials()) },
@@ -375,6 +436,10 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
listeners.add(NaturalExpGainListenersSpigot()) listeners.add(NaturalExpGainListenersSpigot())
} }
ifModern {
listeners += loadProxy<AutocrafterPatch>()
}
return listeners return listeners
} }

View File

@@ -0,0 +1,45 @@
package com.willfp.eco.internal.spigot.integrations.hologram
import com.willfp.eco.core.integrations.hologram.Hologram
import com.willfp.eco.core.integrations.hologram.HologramIntegration
import de.oliver.fancyholograms.api.FancyHologramsPlugin
import de.oliver.fancyholograms.api.data.TextHologramData
import org.bukkit.Location
import java.util.UUID
import kotlin.jvm.optionals.getOrNull
class HologramFancyHolograms : HologramIntegration {
private val manager = FancyHologramsPlugin.get().hologramManager
override fun createHologram(location: Location, contents: List<String>): Hologram {
val id = UUID.randomUUID().toString()
val data = TextHologramData(id, location)
data.text = contents
data.isPersistent = false
val holo = manager.create(data)
FancyHologramsPlugin.get().hologramManager.addHologram(holo)
return HologramImplFancyHolograms(id)
}
override fun getPluginName(): String {
return "FancyHolograms"
}
inner class HologramImplFancyHolograms(
private val id: String,
) : Hologram {
override fun remove() {
val hologram = manager.getHologram(id).getOrNull() ?: return
manager.removeHologram(hologram)
}
override fun setContents(contents: List<String>) {
val hologram = manager.getHologram(id).getOrNull() ?: return
val data = hologram.data as? TextHologramData ?: return
data.text = contents
}
}
}

View File

@@ -1,10 +1,8 @@
package com.willfp.eco.internal.spigot.recipes package com.willfp.eco.internal.spigot.recipes
import com.willfp.eco.core.Eco
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.recipe.Recipes import com.willfp.eco.core.recipe.Recipes
import org.bukkit.Keyed import org.bukkit.Keyed
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.inventory.CraftItemEvent import org.bukkit.event.inventory.CraftItemEvent
@@ -17,6 +15,7 @@ class CraftingRecipeListener(val plugin: EcoPlugin) : Listener {
if (!EcoPlugin.getPluginNames().contains(event.recipe.namespace)) { if (!EcoPlugin.getPluginNames().contains(event.recipe.namespace)) {
return return
} }
if (event.recipe.key.contains("_displayed")) { if (event.recipe.key.contains("_displayed")) {
event.isCancelled = true event.isCancelled = true
} }

View File

@@ -59,4 +59,4 @@ class WrappedCraftItemEvent(
event.result = Event.Result.DENY event.result = Event.Result.DENY
event.isCancelled = true event.isCancelled = true
} }
} }

View File

@@ -61,3 +61,4 @@ softdepend:
- PlayerPoints - PlayerPoints
- Denizen - Denizen
- RoyaleEconomy - RoyaleEconomy
- FancyHolograms

View File

@@ -1,2 +1,2 @@
version = 6.71.1 version = 6.72.0
kotlin.incremental.useClasspathSnapshot=false kotlin.incremental.useClasspathSnapshot=false

View File

@@ -29,4 +29,5 @@ include(":eco-core:core-nms:v1_20_R3")
include(":eco-core:core-nms:v1_21") include(":eco-core:core-nms:v1_21")
include(":eco-core:core-proxy") include(":eco-core:core-proxy")
include(":eco-core:core-plugin") include(":eco-core:core-plugin")
include(":eco-core:core-backend") include(":eco-core:core-backend")
include(":eco-core:core-backend-modern")