村民无限补货
This commit is contained in:
@@ -8,8 +8,7 @@ class Helper : JavaPlugin() {
|
||||
|
||||
override fun onEnable() {
|
||||
// Plugin startup logic
|
||||
logger.info("Registering events...")
|
||||
logger.info("监听末影人生成...")
|
||||
logger.info("Registering listeners...")
|
||||
Bukkit.getPluginManager().registerEvents(ForternListener(this), this)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,31 +1,20 @@
|
||||
package xyz.fortern.forternhelper.listener
|
||||
|
||||
import org.bukkit.entity.Enderman
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.entity.Villager
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent
|
||||
import org.bukkit.event.entity.VillagerReplenishTradeEvent
|
||||
import org.bukkit.event.inventory.TradeSelectEvent
|
||||
import org.bukkit.event.player.PlayerInteractAtEntityEvent
|
||||
import org.bukkit.event.player.PlayerInteractEntityEvent
|
||||
import xyz.fortern.forternhelper.Helper
|
||||
import xyz.fortern.forternhelper.reflection.NMSAdapter
|
||||
|
||||
class ForternListener(val helper: Helper) : Listener {
|
||||
@EventHandler
|
||||
fun onCreatureSpawn(event: CreatureSpawnEvent) {
|
||||
val entity = event.entity
|
||||
if (entity !is Enderman) {
|
||||
fun onTrade(event: PlayerInteractEntityEvent) {
|
||||
val entity = event.rightClicked
|
||||
if (entity !is Villager) {
|
||||
return
|
||||
}
|
||||
val location = event.location
|
||||
val x = location.x
|
||||
val y = location.y
|
||||
val z = location.z
|
||||
// x: -900
|
||||
if (x > -1028 && x < -770 && y > 0 && y < 186 && z > -777 && z < -521) {
|
||||
helper.logger.info("Enderman spawned at ${entity.location}")
|
||||
}
|
||||
NMSAdapter.NMS.setVillagerRestock(entity, 0)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package xyz.fortern.forternhelper.nms.v26_R1
|
||||
|
||||
import org.bukkit.entity.Villager
|
||||
import xyz.fortern.forternhelper.reflection.NMSAdapter.PKG_NAME
|
||||
import xyz.fortern.forternhelper.reflection.NMSHandler
|
||||
import java.lang.reflect.Field
|
||||
import java.lang.reflect.Method
|
||||
|
||||
// 26.1.x
|
||||
class NMSHandlerImpl : NMSHandler {
|
||||
|
||||
override fun setVillagerRestock(villager: Villager, restockToday: Int) {
|
||||
val mcVillager = villagerGetHandlerMethod.invoke(villager)
|
||||
villagerRestockTodayField.isAccessible = true
|
||||
villagerRestockTodayField.set(mcVillager, restockToday)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val craftVillagerClass: Class<*>
|
||||
private val villagerGetHandlerMethod: Method
|
||||
private val mcVillagerClass: Class<*>
|
||||
private val villagerRestockTodayField: Field
|
||||
|
||||
|
||||
init {
|
||||
try {
|
||||
craftVillagerClass = Class.forName("$PKG_NAME.entity.CraftVillager")
|
||||
villagerGetHandlerMethod = craftVillagerClass.getMethod("getHandle")
|
||||
mcVillagerClass = Class.forName("net.minecraft.world.entity.npc.villager.Villager")
|
||||
villagerRestockTodayField = mcVillagerClass.getField("numberOfRestocksToday")
|
||||
} catch (e: ReflectiveOperationException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package xyz.fortern.forternhelper.reflection
|
||||
|
||||
import org.bukkit.Bukkit
|
||||
|
||||
object NMSAdapter {
|
||||
val NMS: NMSHandler
|
||||
|
||||
val REFLECT_VERSION: String
|
||||
|
||||
val PKG_NAME: String
|
||||
|
||||
init {
|
||||
try {
|
||||
// "org.bukkit.craftbukkit" or "org.bukkit.craftbukkit.vX_RY"
|
||||
PKG_NAME = Bukkit.getServer().javaClass.getPackage().name
|
||||
if (PKG_NAME.contains("R")) {
|
||||
// e.g. org.bukkit.craftbukkit.v1_21_R5
|
||||
REFLECT_VERSION = PKG_NAME.substring(PKG_NAME.lastIndexOf('.') + 1)
|
||||
} else {
|
||||
// Paper 自 1.20.5 开始不再重定位 CraftBukkit 包。
|
||||
// Spigot 自 26.1 开始不再重定位 CraftBukkit 包。
|
||||
val bukkitVersion = Bukkit.getBukkitVersion()
|
||||
val mcVersion = bukkitVersion.split("-".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[0]
|
||||
REFLECT_VERSION = when (mcVersion) {
|
||||
"1.20.5", "1.20.6" -> "v1_20_R4"
|
||||
"1.21", "1.21.1" -> "v1_21_R1"
|
||||
"1.21.2", "1.21.3" -> "v1_21_R2"
|
||||
"1.21.4" -> "v1_21_R3"
|
||||
"1.21.5" -> "v1_21_R4"
|
||||
"1.21.6", "1.21.7", "1.21.8" -> "v1_21_R5"
|
||||
"1.21.9", "1.21.10" -> "v1_21_R6"
|
||||
"1.21.11" -> "v1_21_R7"
|
||||
"26.1", "26.1.1", "26.1.2" -> "v26_R1"
|
||||
else -> throw Exception("Unknown NMS version")
|
||||
}
|
||||
}
|
||||
NMS = Class.forName("xyz.fortern.forternhelper.nms.$REFLECT_VERSION.NMSHandlerImpl").getConstructor()
|
||||
.newInstance() as NMSHandler
|
||||
} catch (e: Exception) {
|
||||
throw RuntimeException("init NMSAdapter fail. NMS", e)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package xyz.fortern.forternhelper.reflection
|
||||
|
||||
import org.bukkit.entity.Villager
|
||||
|
||||
interface NMSHandler {
|
||||
fun setVillagerRestock(villager: Villager, restockToday: Int)
|
||||
}
|
||||
Reference in New Issue
Block a user