From de51617059f2fdd6b62900774bd0911a08cd6697 Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Mon, 20 May 2024 17:53:15 +0200 Subject: [PATCH] Add XP cost display above 40. Need ProtocoLib installed. --- README.md | 21 +++++----- build.gradle.kts | 7 +++- .../io/delilaheve/AnvilEventListener.kt | 20 +++++++++- src/main/kotlin/io/delilaheve/CustomAnvil.kt | 19 ++++++++- .../alexcrea/cuanvil/packet/NoProtocoLib.kt | 13 +++++++ .../alexcrea/cuanvil/packet/PacketManager.kt | 11 ++++++ .../cuanvil/packet/ProtocoLibWrapper.kt | 39 +++++++++++++++++++ src/main/resources/plugin.yml | 5 ++- 8 files changed, 119 insertions(+), 16 deletions(-) create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/packet/NoProtocoLib.kt create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/packet/PacketManager.kt create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/packet/ProtocoLibWrapper.kt diff --git a/README.md b/README.md index f48852e..b5254ea 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,15 @@ the plugin can be downloaded on the or [on GitHub](https://github.com/alexcrea/CustomAnvil/releases/latest) --- **Custom Anvil** have the following features: -- Vanilla like default configuration -- Custom enchantment level limit -- Custom anvil recipes -- Custom enchant restrictions (allow unsafe enchantment only for a group of item or create new restriction) -- Custom items of unit repairs (repair damaged with unit of "material", for example the repair of diamond sword by diamonds) -- Custom XP cost for every aspect of the anvil +- Vanilla like default configuration. +- Custom enchantment level limit. +- Custom anvil recipes. +- Custom enchant restrictions (allow unsafe enchantment only for a group of item or create new restriction). +- Custom items of unit repairs (repair damaged with unit of "material", for example the repair of diamond sword by diamonds). +- Custom XP cost for every aspect of the anvil. - Permissions to bypass level limit or enchantment restriction. -- Gui to configure the plugin in game +- Display xp cost instead of "to expensive" when above lv 40. (need ProtocoLib) +- Gui to configure the plugin in game. --- ### Permissions: ```yml @@ -54,8 +55,8 @@ Default configuration can be found on following links: There is non known issue, if you find one please report the issue. ### Planned: -- Semi manual config update on pluign or minecraft update -- Check unknow registered enchantment & warn -- Warn admin on unsuported minecraft version +- Semi manual config update on plugin or minecraft update +- Check unknown registered enchantment & warn +- Warn admin on unsupported minecraft version diff --git a/build.gradle.kts b/build.gradle.kts index 06420e2..6a58a40 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,11 +4,14 @@ plugins { } group = "xyz.alexcrea" -version = "1.4.4" +version = "1.4.5" repositories { mavenCentral() maven(url = "https://hub.spigotmc.org/nexus/content/repositories/snapshots/") + + // ProtocoLib + maven (url = "https://repo.dmulloy2.net/repository/public/" ) } dependencies { @@ -20,6 +23,8 @@ dependencies { // Gui library compileOnly("com.github.stefvanschie.inventoryframework:IF:0.10.13") + // Protocolib + compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.0") diff --git a/src/main/kotlin/io/delilaheve/AnvilEventListener.kt b/src/main/kotlin/io/delilaheve/AnvilEventListener.kt index 4138695..ad59a8d 100644 --- a/src/main/kotlin/io/delilaheve/AnvilEventListener.kt +++ b/src/main/kotlin/io/delilaheve/AnvilEventListener.kt @@ -19,6 +19,7 @@ import org.bukkit.event.EventPriority.HIGHEST import org.bukkit.event.Listener import org.bukkit.event.inventory.ClickType import org.bukkit.event.inventory.InventoryClickEvent +import org.bukkit.event.inventory.InventoryCloseEvent import org.bukkit.event.inventory.PrepareAnvilEvent import org.bukkit.inventory.AnvilInventory import org.bukkit.inventory.InventoryView.Property.REPAIR_COST @@ -26,6 +27,7 @@ import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.Repairable import xyz.alexcrea.cuanvil.config.ConfigHolder import xyz.alexcrea.cuanvil.group.ConflictType +import xyz.alexcrea.cuanvil.packet.PacketManager import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe import xyz.alexcrea.cuanvil.util.UnitRepairUtil.getRepair import kotlin.math.min @@ -34,7 +36,7 @@ import kotlin.math.min /** * Listener for anvil events */ -class AnvilEventListener : Listener { +class AnvilEventListener(private val packetManager: PacketManager) : Listener { companion object { // Anvil's output slot @@ -544,14 +546,30 @@ class AnvilEventListener : Listener { val player = event.view.player if(player is Player){ + if(player.gameMode != GameMode.CREATIVE){ + packetManager.setInstantBuild(player, finalAnvilCost >= 40) + } player.updateInventory() + } }) } + @EventHandler + fun onAnvilClose(event: InventoryCloseEvent){ + val player = event.player + if(event.inventory !is AnvilInventory) return + if(player is Player && GameMode.CREATIVE != player.gameMode){ + packetManager.setInstantBuild(player, false) + } + + } + } + + private class SlotContainer(val type: SlotType, val slot: Int) private enum class SlotType { CURSOR, diff --git a/src/main/kotlin/io/delilaheve/CustomAnvil.kt b/src/main/kotlin/io/delilaheve/CustomAnvil.kt index 52ee56e..3948676 100644 --- a/src/main/kotlin/io/delilaheve/CustomAnvil.kt +++ b/src/main/kotlin/io/delilaheve/CustomAnvil.kt @@ -8,6 +8,9 @@ import xyz.alexcrea.cuanvil.command.EditConfigExecutor import xyz.alexcrea.cuanvil.command.ReloadExecutor import xyz.alexcrea.cuanvil.config.ConfigHolder import xyz.alexcrea.cuanvil.listener.ChatEventListener +import xyz.alexcrea.cuanvil.packet.NoProtocoLib +import xyz.alexcrea.cuanvil.packet.PacketManager +import xyz.alexcrea.cuanvil.packet.ProtocoLibWrapper import xyz.alexcrea.cuanvil.util.Metrics import xyz.alexcrea.cuanvil.util.MetricsUtil import java.io.File @@ -66,14 +69,20 @@ class CustomAnvil : JavaPlugin() { instance.logger.info(message) } } + + } + lateinit var packetManager: PacketManager + /** * Setup plugin for use */ override fun onEnable() { instance = this + val pluginManager = Bukkit.getPluginManager(); + // Disable old plugin name if exist val potentialPlugin = Bukkit.getPluginManager().getPlugin("UnsafeEnchantsPlus") if (potentialPlugin != null) { @@ -82,9 +91,15 @@ class CustomAnvil : JavaPlugin() { logger.warning("Please note CustomAnvil is a more recent version of UnsafeEnchantsPlus") } + // Load ProtocolLib dependency if exist + packetManager = if(pluginManager.isPluginEnabled("ProtocolLib")) + { ProtocoLibWrapper(); } + else + { NoProtocoLib(); } + // Load chat listener chatListener = ChatEventListener() - Bukkit.getPluginManager().registerEvents(chatListener, this) + pluginManager.registerEvents(chatListener, this) // Load config val success = ConfigHolder.loadConfig() @@ -98,7 +113,7 @@ class CustomAnvil : JavaPlugin() { prepareCommand() server.pluginManager.registerEvents( - AnvilEventListener(), + AnvilEventListener(packetManager), this ) } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/packet/NoProtocoLib.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/packet/NoProtocoLib.kt new file mode 100644 index 0000000..29c2074 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/packet/NoProtocoLib.kt @@ -0,0 +1,13 @@ +package xyz.alexcrea.cuanvil.packet + +import org.bukkit.entity.Player + +class NoProtocoLib: PacketManager { + override val isProtocoLibInstalled: Boolean + get() = false + + // ProtocoLib not installed: We do nothing + + override fun setInstantBuild(player: Player, instantBuild: Boolean) {} + +} diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/packet/PacketManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/packet/PacketManager.kt new file mode 100644 index 0000000..a59a48c --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/packet/PacketManager.kt @@ -0,0 +1,11 @@ +package xyz.alexcrea.cuanvil.packet + +import org.bukkit.entity.Player + +interface PacketManager { + + val isProtocoLibInstalled: Boolean + + fun setInstantBuild(player: Player, instantBuild: Boolean) + +} diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/packet/ProtocoLibWrapper.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/packet/ProtocoLibWrapper.kt new file mode 100644 index 0000000..f7e5e92 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/packet/ProtocoLibWrapper.kt @@ -0,0 +1,39 @@ +package xyz.alexcrea.cuanvil.packet + +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.ProtocolLibrary +import com.comphenix.protocol.ProtocolManager +import com.comphenix.protocol.events.PacketContainer +import org.bukkit.entity.Player +import java.lang.reflect.InvocationTargetException + +class ProtocoLibWrapper: PacketManager { + + private val protocolManager: ProtocolManager = ProtocolLibrary.getProtocolManager(); + + override val isProtocoLibInstalled: Boolean + get() = true + + override fun setInstantBuild(player: Player, instantBuild: Boolean) { + val packet = PacketContainer(PacketType.Play.Server.ABILITIES) + + // Set player's properties + packet.float + .write(0, player.flySpeed / 2) + .write(1, player.walkSpeed / 2) + + packet.booleans + .write(0, player.isInvulnerable) + .write(1, player.isFlying) + .write(2, player.allowFlight) + .write(3, instantBuild) + + // Send packet + try { + protocolManager.sendServerPacket(player, packet) + } catch (e: InvocationTargetException) { + e.printStackTrace() + } + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 53c5951..b9873d6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ main: io.delilaheve.CustomAnvil name: CustomAnvil prefix: "Custom Anvil" -version: 1.4.4 +version: 1.4.5 description: Allow to customise anvil mechanics api-version: 1.18 load: POSTWORLD @@ -44,4 +44,5 @@ permissions: # soft depend on old name, so I can disable it if it is on the same server # as it is the old name for this plugin softdepend: - - UnsafeEnchantsPlus \ No newline at end of file + - UnsafeEnchantsPlus + - ProtocolLib