diff --git a/README.md b/README.md new file mode 100644 index 0000000..0eda03f --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Return Piglin Farms + +It's plugin for Spigot-compatible servers that makes some tweaks for mimic 1.21.4 behavior of Zombified Piglins +(especialy when used in farms). + +## Tweaks: + +- Zombified Piglins drop XP while not attacked by player (config value - `dropXP`, `true` by default) +- Zombified Piglins drop gold ingots while not attacked by player +- Zombified Piglins don't equip spears (config value - `disableSpears`, `true` by default) + +All loot and XP table used from [minecraft wiki](https://minecraft.wiki/w/Zombified_Piglin#Drops) for 1.21.11. It means, +plugin will give to player exact loot from table from 1.21.11 (Default column) + +## Works only on 1.21.11 +I don't plan to build this plugin for other versions, but you can **build it yourself**! \ No newline at end of file diff --git a/pom.xml b/pom.xml index e7c2756..8f011eb 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ su.lisdev RPF - 1.0-SNAPSHOT + 1.0 jar RPF diff --git a/src/main/kotlin/su/lisdev/rpf/RPF.kt b/src/main/kotlin/su/lisdev/rpf/RPF.kt index 3b92682..d25ad05 100644 --- a/src/main/kotlin/su/lisdev/rpf/RPF.kt +++ b/src/main/kotlin/su/lisdev/rpf/RPF.kt @@ -6,9 +6,11 @@ import org.bukkit.plugin.java.JavaPlugin class RPF : JavaPlugin(), Listener { override fun onEnable() { - server.pluginManager.registerEvents(ZombifiedPiglinLootRestore(this, logger), + setupConfig() + + server.pluginManager.registerEvents(ZombifiedPiglinLootRestore(config), this) - server.pluginManager.registerEvents(ZombifiedPiglinSpearDisable(), + server.pluginManager.registerEvents(ZombifiedPiglinSpearDisable(config), this) logger.info("${server.name} has been enabled!") } @@ -16,4 +18,11 @@ class RPF : JavaPlugin(), Listener { override fun onDisable() { logger.info("${server.name} has been disabled!") } + + fun setupConfig(){ + config.addDefault("dropXP", true) + config.addDefault("disableSpears", true) + config.options().copyDefaults(true) + saveDefaultConfig() + } } diff --git a/src/main/kotlin/su/lisdev/rpf/ZombifiedPiglinLootRestore.kt b/src/main/kotlin/su/lisdev/rpf/ZombifiedPiglinLootRestore.kt index 8610180..8e1de03 100644 --- a/src/main/kotlin/su/lisdev/rpf/ZombifiedPiglinLootRestore.kt +++ b/src/main/kotlin/su/lisdev/rpf/ZombifiedPiglinLootRestore.kt @@ -1,7 +1,7 @@ package su.lisdev.rpf import org.bukkit.Material -import org.bukkit.NamespacedKey +import org.bukkit.configuration.file.FileConfiguration import org.bukkit.enchantments.Enchantment import org.bukkit.entity.PigZombie import org.bukkit.event.EventHandler @@ -12,25 +12,34 @@ import org.bukkit.inventory.EntityEquipment import org.bukkit.inventory.EquipmentSlot import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.Damageable -import org.bukkit.persistence.PersistentDataType -import org.bukkit.plugin.java.JavaPlugin import java.util.concurrent.ThreadLocalRandom -import java.util.logging.Logger import kotlin.math.max -class ZombifiedPiglinLootRestore(plugin: JavaPlugin, val logger: Logger) : Listener { +class ZombifiedPiglinLootRestore(config: FileConfiguration) : Listener { - private val aggroKey = NamespacedKey(plugin, "aggroed_at_player") + private companion object { + const val ADULT_XP = 5 + const val BABY_XP = 12 + + const val GOLD_INGOT_CHANCE = 0.025f + + val XP_SLOTS: List Float>> = listOf( + EquipmentSlot.HAND to EntityEquipment::getItemInMainHandDropChance, + EquipmentSlot.OFF_HAND to EntityEquipment::getItemInOffHandDropChance, + EquipmentSlot.HEAD to EntityEquipment::getHelmetDropChance, + EquipmentSlot.CHEST to EntityEquipment::getChestplateDropChance, + EquipmentSlot.LEGS to EntityEquipment::getLeggingsDropChance, + EquipmentSlot.FEET to EntityEquipment::getBootsDropChance, + ) + } + + private val dropXP = config.getBoolean("dropXP") @EventHandler(priority = EventPriority.NORMAL) fun onEntityDeath(event: EntityDeathEvent) { val piglin = event.entity as? PigZombie ?: return if (piglin.killer != null || event.droppedExp > 0) return - - logger.info("Piglin vanilla anger: ${piglin.isAngry}, Piglin NBT data anger: " + - "${piglin.persistentDataContainer.has(aggroKey, PersistentDataType.BYTE)}") - if (!piglin.isAngry) return val rng = ThreadLocalRandom.current() @@ -62,6 +71,8 @@ class ZombifiedPiglinLootRestore(plugin: JavaPlugin, val logger: Logger) : Liste } } + if(!dropXP) return + var exp = if (piglin.isAdult) ADULT_XP else BABY_XP repeat(keptEquipment) { exp += 1 + rng.nextInt(3) } event.droppedExp = exp @@ -81,20 +92,4 @@ class ZombifiedPiglinLootRestore(plugin: JavaPlugin, val logger: Logger) : Liste item.itemMeta = meta return item } - - private companion object { - const val ADULT_XP = 5 - const val BABY_XP = 12 - - const val GOLD_INGOT_CHANCE = 0.025f - - val XP_SLOTS: List Float>> = listOf( - EquipmentSlot.HAND to EntityEquipment::getItemInMainHandDropChance, - EquipmentSlot.OFF_HAND to EntityEquipment::getItemInOffHandDropChance, - EquipmentSlot.HEAD to EntityEquipment::getHelmetDropChance, - EquipmentSlot.CHEST to EntityEquipment::getChestplateDropChance, - EquipmentSlot.LEGS to EntityEquipment::getLeggingsDropChance, - EquipmentSlot.FEET to EntityEquipment::getBootsDropChance, - ) - } } \ No newline at end of file diff --git a/src/main/kotlin/su/lisdev/rpf/ZombifiedPiglinSpearDisable.kt b/src/main/kotlin/su/lisdev/rpf/ZombifiedPiglinSpearDisable.kt index a56e72b..a59740f 100644 --- a/src/main/kotlin/su/lisdev/rpf/ZombifiedPiglinSpearDisable.kt +++ b/src/main/kotlin/su/lisdev/rpf/ZombifiedPiglinSpearDisable.kt @@ -1,16 +1,20 @@ package su.lisdev.rpf import org.bukkit.Material +import org.bukkit.configuration.file.FileConfiguration import org.bukkit.entity.PigZombie import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.entity.EntitySpawnEvent import org.bukkit.inventory.ItemStack -class ZombifiedPiglinSpearDisable() : Listener { +class ZombifiedPiglinSpearDisable(config: FileConfiguration) : Listener { + private val disableSpears = config.getBoolean("disableSpears") @EventHandler private fun onEntitySpawn(event: EntitySpawnEvent){ + if(!disableSpears) return + val piglin = event.entity as? PigZombie ?: return if (piglin.equipment?.itemInMainHand?.type != Material.GOLDEN_SPEAR) return