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