make HavenBags works with CustomAnvil. fix #44

This commit is contained in:
alexcrea 2024-12-24 19:15:48 +01:00
parent 85d2d873eb
commit 84ce0afd2b
No known key found for this signature in database
GPG key ID: 43FD265DB0DBF91F
5 changed files with 128 additions and 18 deletions

View file

@ -44,11 +44,14 @@ dependencies {
// ExcellentEnchants // ExcellentEnchants
compileOnly(files("libs/nightcore-2.6.4.jar")) compileOnly(files("libs/nightcore-2.6.4.jar"))
compileOnly(files("libs/ExcellentEnchants-4.2.2.jar")) compileOnly(files("libs/ExcellentEnchants-4.2.2.jar"))
compileOnly(files("libs/ExcellentEnchants 4.1.0-striped.jar")) compileOnly(files("libs/ExcellentEnchants 4.1.0-striped.jar")) // For legacy excellent enchants
// Disenchantment // Disenchantment
compileOnly("cz.kominekjan:Disenchantment:v5.4.0") compileOnly("cz.kominekjan:Disenchantment:v5.4.0")
// HavenBags
compileOnly(files("libs/HavenBags-1.30.1.1729.jar"))
// Include nms // Include nms
implementation(project(":nms:nms-common")) implementation(project(":nms:nms-common"))
implementation(project(":nms:v1_17R1", configuration = "reobf")) implementation(project(":nms:v1_17R1", configuration = "reobf"))

Binary file not shown.

View file

@ -28,6 +28,7 @@ object DependencyManager {
var excellentEnchantsCompatibility: ExcellentEnchantsDependency? = null var excellentEnchantsCompatibility: ExcellentEnchantsDependency? = null
var disenchantmentCompatibility: DisenchantmentDependency? = null var disenchantmentCompatibility: DisenchantmentDependency? = null
var havenBagsCompatibility: HavenBagsDependency? = null
fun loadDependency() { fun loadDependency() {
val pluginManager = Bukkit.getPluginManager() val pluginManager = Bukkit.getPluginManager()
@ -69,6 +70,12 @@ object DependencyManager {
disenchantmentCompatibility!!.redirectListeners() disenchantmentCompatibility!!.redirectListeners()
} }
// HavenBags dependency
if (pluginManager.isPluginEnabled("HavenBags")) {
havenBagsCompatibility = HavenBagsDependency()
havenBagsCompatibility!!.redirectListeners()
}
} }
fun handleCompatibilityConfig() { fun handleCompatibilityConfig() {
@ -95,15 +102,19 @@ object DependencyManager {
fun tryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean { fun tryEventPreAnvilBypass(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
var bypass = false var bypass = false
// Test if disenchantment used special prepare anvil // Test if disenchantment used prepare anvil
if (disenchantmentCompatibility?.testPrepareAnvil(event, player) == true) bypass = true if (disenchantmentCompatibility?.testPrepareAnvil(event, player) == true) bypass = true
// Test excellent enchantments used special prepare anvil // Test heaven bags used prepare anvil
if (!bypass && (havenBagsCompatibility?.testPrepareAnvil(event, player) == true)) bypass = true
// Test excellent enchantments used prepare anvil
if (!bypass && (excellentEnchantsCompatibility?.testPrepareAnvil(event) == true)) bypass = true if (!bypass && (excellentEnchantsCompatibility?.testPrepareAnvil(event) == true)) bypass = true
// Test if the inventory is a gui(version specific) // Test if the inventory is a gui(version specific)
if (!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true if (!bypass && (externGuiTester?.testIfGui(event.view) == true)) bypass = true
return bypass return bypass
} }
@ -114,10 +125,13 @@ object DependencyManager {
fun tryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean { fun tryClickAnvilResultBypass(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
var bypass = false var bypass = false
// Test if disenchantment used special event click // Test if disenchantment used event click
if (disenchantmentCompatibility?.testAnvilResult(event, inventory) == true) bypass = true if (disenchantmentCompatibility?.testAnvilResult(event, inventory) == true) bypass = true
// Test if disenchantment used special event click // Test if haven bag used event click
if (!bypass && (havenBagsCompatibility?.testAnvilResult(event, inventory) == true)) bypass = true
// Test if disenchantment used event click
if (!bypass && (excellentEnchantsCompatibility?.testAnvilResult(event) == true)) bypass = true if (!bypass && (excellentEnchantsCompatibility?.testAnvilResult(event) == true)) bypass = true
// Test if the inventory is a gui(version specific) // Test if the inventory is a gui(version specific)

View file

@ -0,0 +1,92 @@
package xyz.alexcrea.cuanvil.dependency
import io.delilaheve.CustomAnvil
import org.bukkit.entity.HumanEntity
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.inventory.AnvilInventory
import org.bukkit.inventory.ItemStack
import org.bukkit.plugin.RegisteredListener
import valorless.havenbags.BagSkin
import valorless.havenbags.BagUpgrade
import valorless.havenbags.HavenBags
import valorless.havenbags.prevention.EquipPrevention
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener
import xyz.alexcrea.cuanvil.util.AnvilXpUtil
class HavenBagsDependency {
init {
CustomAnvil.instance.logger.info("Heaven Bags Detected !")
}
private lateinit var bagUpgrade: BagUpgrade
private lateinit var bagSkin: BagSkin
fun redirectListeners() {
val toUnregister = ArrayList<RegisteredListener>()
// get required PrepareAnvilEvent listener
for (registeredListener in PrepareAnvilEvent.getHandlerList().registeredListeners) {
val listener = registeredListener.listener
if (listener is BagUpgrade) {
bagUpgrade = listener
toUnregister.add(registeredListener)
}
if (listener is BagSkin) {
bagSkin = listener
toUnregister.add(registeredListener)
}
}
for (listener in toUnregister) {
PrepareAnvilEvent.getHandlerList().unregister(listener)
InventoryClickEvent.getHandlerList().unregister(listener)
}
}
fun testPrepareAnvil(event: PrepareAnvilEvent, player: HumanEntity): Boolean {
val previousResult = event.result
event.result = null
// Test if event change the result
bagSkin.onPrepareAnvil(event)
if (event.result != null) {
CustomAnvil.log("Detected pre anvil heaven bag anvil skin.")
AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
return true
}
bagUpgrade.onPrepareAnvil(event)
if (event.result != null) {
CustomAnvil.log("Detected pre anvil heaven bag anvil upgrade.")
AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost)
return true
}
event.result = previousResult
return false
}
fun testAnvilResult(event: InventoryClickEvent, inventory: AnvilInventory): Boolean {
val result = inventory.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)?.clone()
if (HavenBags.IsBag(result)) {
CustomAnvil.log("Detected anvil click haven bag bypass.")
bagUpgrade.onInventoryClick(event)
bagSkin.onInventoryClick(event)
return true;
}
return false
}
private fun testAnvilInventoryChange(inventory: AnvilInventory, previous: ItemStack?): Boolean {
val currentResult = inventory.getItem(PrepareAnvilListener.ANVIL_OUTPUT_SLOT)
return currentResult == previous
}
}

View file

@ -58,3 +58,4 @@ softdepend:
- EcoEnchants - EcoEnchants
- eco - eco
- ExcellentEnchants - ExcellentEnchants
- HavenBags