Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .tools/servergen.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
group=taboolib
version=6.2.4
version=6.3.0
kotlin.incremental=true
kotlin.incremental.java=true
kotlin.caching.enabled=true
Expand Down
3 changes: 2 additions & 1 deletion module/bukkit-nms/bukkit-nms-ai/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ dependencies {
// 服务端
compileOnly("ink.ptms:nms-all:1.0.0")
compileOnly("ink.ptms.core:v12104:12104:mapped")
compileOnly("ink.ptms.core:v260100:260100-minimize")
}

kotlin {
jvmToolchain(21) // 仅针对该模块
jvmToolchain(25) // 仅针对该模块
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package taboolib.module.ai;

/**
* 该类仅用作生成 ASM 代码,无任何意义
*
* @author sky
* @since 2018-09-19 22:31
*/
public class PathfinderCreatorImpl26 extends net.minecraft.world.entity.ai.goal.Goal implements PathfinderCreator {

private SimpleAi simpleAI;

public PathfinderCreatorImpl26() {
}

public PathfinderCreatorImpl26(SimpleAi ai) {
this.simpleAI = ai;
}

@Override
public Object createPathfinderGoal(SimpleAi ai) {
return new PathfinderCreatorImpl26(ai);
}

@Override
public boolean canUse() {
return simpleAI.shouldExecute();
}

@Override
public boolean canContinueToUse() {
return simpleAI.continueExecute();
}

@Override
public void start() {
simpleAI.startTask();
}

@Override
public void stop() {
simpleAI.resetTask();
}

@Override
public void tick() {
simpleAI.updateTask();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ class PathfinderExecutorImpl17 : PathfinderExecutor() {
init {
pathfinderGoalSelectorSet = PathfinderGoalSelector::class.java.getDeclaredField(
// Paper 1.20.5+ using mojmap
if (MinecraftVersion.isUniversalCraftBukkit) "availableGoals" else if (MinecraftVersion.majorLegacy >= 12005) "c" else "d"
if (MinecraftVersion.isMojangMapping) "availableGoals" else if (MinecraftVersion.majorLegacy >= 12005) "c" else "d"
)
pathfinderGoalSelectorSet.isAccessible = true
controllerJumpCurrent = ControllerJump::class.java.getDeclaredField(
// Paper 1.20.5+ using mojmap
if (MinecraftVersion.isUniversalCraftBukkit) "jump" else "a"
if (MinecraftVersion.isMojangMapping) "jump" else "a"
)
controllerJumpCurrent.isAccessible = true
for (field in NavigationAbstract::class.java.declaredFields) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,248 @@
package taboolib.module.ai

import net.minecraft.world.entity.Mob
import net.minecraft.world.entity.ai.attributes.Attributes
import net.minecraft.world.entity.ai.control.JumpControl
import net.minecraft.world.entity.ai.control.LookControl
import net.minecraft.world.entity.ai.goal.Goal
import net.minecraft.world.entity.ai.goal.GoalSelector
import net.minecraft.world.entity.ai.navigation.PathNavigation
import net.minecraft.world.level.pathfinder.Path
import org.bukkit.Location
import org.bukkit.craftbukkit.entity.CraftEntity
import org.bukkit.entity.Entity
import org.bukkit.entity.LivingEntity
import org.tabooproject.reflex.Reflex.Companion.getProperty
import org.tabooproject.reflex.Reflex.Companion.setProperty
import org.tabooproject.reflex.UnsafeAccess.get
import org.tabooproject.reflex.UnsafeAccess.put
import taboolib.module.nms.MinecraftVersion
import taboolib.module.nms.remap.DynamicOpcode
import taboolib.module.nms.remap.dynamic
import java.lang.reflect.Field

/**
* 该类仅用作生成 ASM 代码,无任何意义
*
* @author sky
* @since 2018-09-20 20:57
*/
class PathfinderExecutorImpl26 : PathfinderExecutor() {

private var pathEntity: Field? = null
private val pathfinderGoalSelectorSet: Field
private var controllerJumpCurrent: Field

init {
pathfinderGoalSelectorSet = GoalSelector::class.java.getDeclaredField("availableGoals")
pathfinderGoalSelectorSet.isAccessible = true
controllerJumpCurrent = JumpControl::class.java.getDeclaredField("jump")
controllerJumpCurrent.isAccessible = true
for (field in PathNavigation::class.java.declaredFields) {
if (field.type == Path::class.java) {
pathEntity = field
break
}
}
}

override fun getEntityInsentient(entity: LivingEntity): Any {
return (entity as CraftEntity).handle
}

override fun getNavigation(entity: LivingEntity): Any {
return (getEntityInsentient(entity) as Mob).navigation
}

override fun getControllerJump(entity: LivingEntity): Any {
val e = getEntityInsentient(entity)
if (MinecraftVersion.isUniversal) {
return (e as Mob).jumpControl
}
return (e as Mob).jumpControl
}

override fun getControllerMove(entity: LivingEntity): Any {
return (getEntityInsentient(entity) as Mob).moveControl
}

override fun getControllerLook(entity: LivingEntity): Any {
val e = getEntityInsentient(entity)
if (MinecraftVersion.isUniversal) {
return (e as Mob).lookControl
}
return (e as Mob).lookControl
}

override fun getGoalSelector(entity: LivingEntity): Any {
return (getEntityInsentient(entity) as Mob).goalSelector
}

override fun getTargetSelector(entity: LivingEntity): Any {
return (getEntityInsentient(entity) as Mob).targetSelector
}

override fun getPathEntity(entity: LivingEntity): Any {
return get(getNavigation(entity), pathEntity!!)!!
}

override fun setPathEntity(entity: LivingEntity, pathEntity: Any) {
put(getNavigation(entity), this.pathEntity!!, pathEntity)
}

override fun addGoalAi(entity: LivingEntity, ai: SimpleAi, priority: Int) {
(getEntityInsentient(entity) as Mob).goalSelector.addGoal(priority, pathfinderCreator.createPathfinderGoal(ai) as Goal)
}

override fun addTargetAi(entity: LivingEntity, ai: SimpleAi, priority: Int) {
(getEntityInsentient(entity) as Mob).targetSelector.addGoal(priority, pathfinderCreator.createPathfinderGoal(ai) as Goal)
}

override fun replaceGoalAi(entity: LivingEntity, ai: SimpleAi, priority: Int) {
replaceGoalAi(entity, ai, priority, null)
}

override fun replaceTargetAi(entity: LivingEntity, ai: SimpleAi, priority: Int) {
replaceTargetAi(entity, ai, priority, null)
}

override fun replaceGoalAi(entity: LivingEntity, ai: SimpleAi, priority: Int, name: String?) {
if (name == null) {
removeGoal(priority, (getEntityInsentient(entity) as Mob).goalSelector)
} else {
removeGoal(name, (getEntityInsentient(entity) as Mob).goalSelector)
}
addGoalAi(entity, ai, priority)
}

override fun replaceTargetAi(entity: LivingEntity, ai: SimpleAi, priority: Int, name: String?) {
if (name == null) {
removeGoal(priority, (getEntityInsentient(entity) as Mob).targetSelector)
} else {
removeGoal(name, (getEntityInsentient(entity) as Mob).targetSelector)
}
addTargetAi(entity, ai, priority)
}

override fun removeGoalAi(entity: LivingEntity, priority: Int) {
removeGoal(priority, (getEntityInsentient(entity) as Mob).goalSelector)
}

override fun removeTargetAi(entity: LivingEntity, priority: Int) {
removeGoal(priority, (getEntityInsentient(entity) as Mob).targetSelector)
}

override fun removeGoalAi(entity: LivingEntity, name: String) {
removeGoal(name, (getEntityInsentient(entity) as Mob).goalSelector)
}

override fun removeTargetAi(entity: LivingEntity, name: String) {
removeGoal(name, (getEntityInsentient(entity) as Mob).targetSelector)
}

private fun removeGoal(name: String, targetSelector: Any) {
val collection = getGoal(targetSelector)
collection.toList().forEach {
val a = it!!.getProperty<Any>("goal", remap = true)!!
if (a.javaClass.name.contains(name)) {
if (collection is MutableList) {
collection.remove(it)
} else if (collection is MutableSet) {
collection.remove(it)
}
}
if (a.javaClass.simpleName == "PathfinderCreatorImpl26" && a.getProperty<Any>("simpleAI")!!.javaClass.name.contains(name)) {
if (collection is MutableList) {
collection.remove(it)
} else if (collection is MutableSet) {
collection.remove(it)
}
}
}
}

private fun removeGoal(priority: Int, targetSelector: Any) {
val collection = getGoal(targetSelector)
collection.toList().forEach {
if (it!!.getProperty<Int>("priority") == priority) {
if (collection is MutableList) {
collection.remove(it)
} else if (collection is MutableSet) {
collection.remove(it)
}
}
}
}

private fun getGoal(targetSelector: Any): Collection<*> {
return targetSelector.getProperty<Set<*>>("availableGoals", remap = true)!!
}

override fun clearGoalAi(entity: LivingEntity) {
get<MutableCollection<*>>((getEntityInsentient(entity) as Mob).goalSelector, pathfinderGoalSelectorSet)?.clear()
}

override fun clearTargetAi(entity: LivingEntity) {
get<MutableCollection<*>>((getEntityInsentient(entity) as Mob).targetSelector, pathfinderGoalSelectorSet)?.clear()
}

override fun getGoalAi(entity: LivingEntity): Iterable<*>? {
return get<Collection<*>>((getEntityInsentient(entity) as Mob).goalSelector, pathfinderGoalSelectorSet)
}

override fun getTargetAi(entity: LivingEntity): Iterable<*>? {
return get<Collection<*>>((getEntityInsentient(entity) as Mob).targetSelector, pathfinderGoalSelectorSet)
}

override fun setGoalAi(entity: LivingEntity, ai: Iterable<*>?) {
put((getEntityInsentient(entity) as Mob).goalSelector, pathfinderGoalSelectorSet, ai)
}

override fun setTargetAi(entity: LivingEntity, ai: Iterable<*>?) {
put((getEntityInsentient(entity) as Mob).targetSelector, pathfinderGoalSelectorSet, ai)
}

override fun navigationMove(entity: LivingEntity, location: Location): Boolean {
return navigationMove(entity, location, 0.6)
}

override fun navigationMove(entity: LivingEntity, location: Location, speed: Double): Boolean {
return (getNavigation(entity) as PathNavigation).moveTo(location.x, location.y, location.z, speed)
}

override fun navigationMove(entity: LivingEntity, target: LivingEntity): Boolean {
return navigationMove(entity, target, 0.6)
}

override fun navigationMove(entity: LivingEntity, target: LivingEntity, speed: Double): Boolean {
return (getNavigation(entity) as PathNavigation).moveTo((target as CraftEntity).handle, speed)
}

override fun navigationReach(entity: LivingEntity): Boolean {
return dynamic(
DynamicOpcode.INVOKEVIRTUAL,
"net.minecraft.world.level.pathfinder.Path#canReach()Z",
getPathEntity(entity)
) as Boolean
}

override fun controllerLookAt(entity: LivingEntity, target: Location) {
(getControllerLook(entity) as LookControl).setLookAt(target.x, target.y, target.z, 10f, 40f)
}

override fun controllerLookAt(entity: LivingEntity, target: Entity) {
(getControllerLook(entity) as LookControl).setLookAt((target as CraftEntity).handle, 10f, 40f)
}

override fun controllerJumpReady(entity: LivingEntity) {
(getControllerJump(entity) as JumpControl).setProperty("jump", true, remap = true)
}

override fun controllerJumpCurrent(entity: LivingEntity): Boolean {
return controllerJumpCurrent.getBoolean(getControllerJump(entity))
}

override fun setFollowRange(entity: LivingEntity, value: Double) {
(getEntityInsentient(entity) as Mob).getAttribute(Attributes.FOLLOW_RANGE)!!.baseValue = value
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ import org.bukkit.entity.LivingEntity
import taboolib.module.nms.MinecraftVersion
import taboolib.module.nms.nmsProxy

val pathfinderCreator = nmsProxy(PathfinderCreator::class.java, bind = "{name}Impl" + if (MinecraftVersion.isUniversal) "17" else "")
private val versionId = if (MinecraftVersion.isUnobfuscated) "26" else if (MinecraftVersion.isUniversal) "17" else ""

val pathfinderExecutor = nmsProxy(PathfinderExecutor::class.java, bind = "{name}Impl" + if (MinecraftVersion.isUniversal) "17" else "")
val pathfinderCreator = nmsProxy(PathfinderCreator::class.java, bind = "{name}Impl$versionId")

val pathfinderExecutor = nmsProxy(PathfinderExecutor::class.java, bind = "{name}Impl$versionId")

/**
* 注册一个 Goal AI
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ dependencies {
compileOnly(project(":module:bukkit-nms"))
compileOnly(project(":module:bukkit-nms:bukkit-nms-data-serializer"))
// 服务端
compileOnly("ink.ptms.core:v12104:12104:mapped")
compileOnly("ink.ptms.core:v260100:260100-minimize")
// DataSerializer
compileOnly("io.netty:netty-all:4.1.73.Final")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package taboolib.module.nms

import io.netty.buffer.ByteBufOutputStream
import io.netty.buffer.Unpooled
import net.minecraft.core.IRegistryCustom
import net.minecraft.core.RegistryAccess
import net.minecraft.network.RegistryFriendlyByteBuf
import net.minecraft.network.chat.ComponentSerialization
import org.bukkit.craftbukkit.v1_21_R3.util.CraftChatMessage
import org.bukkit.craftbukkit.util.CraftChatMessage
import java.io.DataOutput

/**
Expand All @@ -17,7 +17,7 @@ import java.io.DataOutput
*/
class DataSerializerFactory12005 : DataSerializerFactory, DataSerializer {

val buf: RegistryFriendlyByteBuf = RegistryFriendlyByteBuf(Unpooled.buffer(), IRegistryCustom.EMPTY)
val buf: RegistryFriendlyByteBuf = RegistryFriendlyByteBuf(Unpooled.buffer(), RegistryAccess.EMPTY)

override fun writeByte(byte: Byte): DataSerializer {
return buf.writeByte(byte.toInt()).let { this }
Expand Down
1 change: 1 addition & 0 deletions module/bukkit-nms/bukkit-nms-stable/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ dependencies {
compileOnly("ink.ptms.core:v12005:12005:mapped")
compileOnly("ink.ptms.core:v12002:12002:mapped")
compileOnly("ink.ptms.core:v11604:11604")
compileOnly("ink.ptms.core:v260100:260100-minimize")
compileOnly("ink.ptms:nms-all:1.0.0")
// Mojang
compileOnly("com.mojang:brigadier:1.0.18")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ class NMSEntityImpl : NMSEntity() {
@Suppress("SpellCheckingInspection")
override fun getLanguageKey(entity: Entity): MinecraftLanguage.LanguageKey {
val key = when (MinecraftVersion.major) {
// region 1.17 .. 1.21
in MinecraftVersion.V1_17..MinecraftVersion.V1_21 -> {
// region 1.17 .. Latest
in MinecraftVersion.V1_17..Int.MAX_VALUE -> {
// 使用 Translatable 接口
if (isTranslatableSupported) {
var key = entity.type.translationKey
Expand Down
Loading
Loading