Skip to content
Closed

1.21 #113

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
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
java
id("io.izzel.taboolib") version "2.0.23" apply false
id("io.izzel.taboolib") version "2.0.22" apply false
id("org.jetbrains.kotlin.jvm") version "1.8.22" apply false
}

Expand All @@ -21,7 +21,7 @@ subprojects {

install(BukkitNMSDataSerializer)
}
version { taboolib = "6.2.3-8cc2f66" }
version { taboolib = "6.2.3-20d868d" }
}
repositories {
mavenLocal()
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
group=ink.ptms.adyeshach
version=2.1.1
version=2.1.0
kotlin.incremental=true
kotlin.incremental.java=true
kotlin.incremental.useClasspathSnapshot=true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package ink.ptms.adyeshach.impl.nms

import ink.ptms.adyeshach.core.MinecraftWorldAccess
import ink.ptms.adyeshach.impl.DefaultAdyeshachMinecraftAPI
import net.minecraft.world.level.chunk.Chunk
import ink.ptms.adyeshach.impl.nms.specific.NMS21
import net.minecraft.world.level.chunk.ChunkStatus
import org.bukkit.Material
import org.bukkit.World
Expand Down Expand Up @@ -33,7 +33,9 @@ class DefaultMinecraftBlockAccess(val world: World?, override val x: Int, overri
(obcChunk as org.bukkit.craftbukkit.v1_19_R2.CraftChunk?)?.handle as Any?
} catch (_: NoSuchMethodError) {
// 1.19.4 (最新版改动)
obcChunk?.getHandle(ChunkStatus.FULL) as Any?
if (MinecraftVersion.versionId >= 12101) {
NMS21.instance.getChunk(world?.getChunkAt(x, z))
} else obcChunk?.getHandle(ChunkStatus.FULL) as Any?
}

override fun getBlockType(x: Int, y: Int, z: Int): Material {
Expand All @@ -46,7 +48,7 @@ class DefaultMinecraftBlockAccess(val world: World?, override val x: Int, overri
// 这个版本的命名与 1.16 相同,但是类型不同
9 -> ((nmsChunk as NMS16IBlockAccess).getType(NMS16BlockPosition(x, y, z)) as NMSBlockData).block
// 1.18, 1.19, 1.20
10, 11, 12 -> ((nmsChunk as NMSIBlockAccess).getBlockState(NMSBlockPosition(x, y, z)) as NMSBlockData).block
10, 11, 12, 13 -> ((nmsChunk as NMSIBlockAccess).getBlockState(NMSBlockPosition(x, y, z)) as NMSBlockData).block
// 不支持
else -> error("Unsupported version: $major")
}
Expand Down Expand Up @@ -83,7 +85,7 @@ class DefaultMinecraftBlockAccess(val world: World?, override val x: Int, overri
// 1.9, 1.10, 1.11, 1.12
1, 2, 3, 4 -> getBlockHeightLegacy(obcChunk!!.getBlock(x, y, z))
// 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.20
5, 6, 7, 8, 9, 10, 11, 12 -> {
5, 6, 7, 8, 9, 10, 11, 12, 13 -> {
val slab = world!!.getBlockAt(x, y, z).blockData as Slab
if (slab.type == Slab.Type.TOP || slab.type == Slab.Type.DOUBLE) 1.0 else 0.5
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package ink.ptms.adyeshach.impl.nms

import taboolib.module.nms.createDataSerializer
import ink.ptms.adyeshach.core.*
import ink.ptms.adyeshach.core.bukkit.BukkitParticles
import ink.ptms.adyeshach.core.bukkit.BukkitPose
Expand All @@ -11,6 +10,7 @@ import ink.ptms.adyeshach.core.entity.type.AdySniffer
import ink.ptms.adyeshach.impl.entity.DefaultEntityInstance
import ink.ptms.adyeshach.impl.nms.parser.*
import ink.ptms.adyeshach.impl.nms.specific.NMS19
import ink.ptms.adyeshach.impl.nms.specific.NMS21
import org.bukkit.Art
import org.bukkit.entity.Cat
import org.bukkit.inventory.ItemStack
Expand All @@ -21,6 +21,7 @@ import taboolib.common.platform.function.warning
import taboolib.common5.Quat
import taboolib.module.nms.MinecraftVersion
import taboolib.module.nms.MinecraftVersion.isUniversal
import taboolib.module.nms.createDataSerializer
import java.util.*
import java.util.function.Consumer

Expand Down Expand Up @@ -100,8 +101,11 @@ class DefaultMinecraftEntityMetadataHandler : MinecraftEntityMetadataHandler {
}

override fun createMetadataPacket(entityId: Int, metaList: List<MinecraftMeta>): Any {
// 1.19.3 变更为 record 类型,因此无法兼容之前的写法
return if (majorLegacy >= 11903) {
// 1.21取消了DataSerializer,改用构造函数实例化
return if (MinecraftVersion.versionId >= 12101) {
NMS21.instance.createPacketPlayOutEntityMetadata(entityId, metaList)
} else if (majorLegacy >= 11903) {
// 1.19.3 变更为 record 类型,因此无法兼容之前的写法
NMS19.instance.createPacketPlayOutEntityMetadata(entityId, metaList)
} else if (isUniversal) {
NMSPacketPlayOutEntityMetadata(createDataSerializer {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package ink.ptms.adyeshach.impl.nms

import com.mojang.datafixers.util.Pair
import taboolib.module.nms.createDataSerializer
import ink.ptms.adyeshach.core.*
import ink.ptms.adyeshach.core.bukkit.BukkitAnimation
import ink.ptms.adyeshach.core.util.ifloor
import ink.ptms.adyeshach.impl.nms.specific.NMS21
import org.bukkit.Location
import org.bukkit.entity.Player
import org.bukkit.inventory.EquipmentSlot
import org.bukkit.inventory.ItemStack
import org.bukkit.util.Vector
import taboolib.library.reflex.Reflex.Companion.invokeConstructor
import taboolib.module.nms.MinecraftVersion
import taboolib.module.nms.createDataSerializer

/**
* Adyeshach
Expand Down Expand Up @@ -68,7 +70,21 @@ class DefaultMinecraftEntityOperator : MinecraftEntityOperator {
writeBoolean(onGround)
}.build() as NMSPacketDataSerializer)
// 1.21
13 -> error("还不支持")
13 -> {
if (MinecraftVersion.versionId == 12101) {
NMSPacketPlayOutEntityTeleport::class.java.invokeConstructor(createDataSerializer {
writeVarInt(entityId)
writeDouble(location.x)
writeDouble(location.y)
writeDouble(location.z)
writeByte(yaw)
writeByte(pitch)
writeBoolean(onGround)
}.build() as NMSPacketDataSerializer)
} else {
NMS21.instance.createTeleport(entityId, location, yaw, pitch, onGround)
}
}
// 不支持
else -> error("Unsupported version.")
}
Expand Down Expand Up @@ -135,7 +151,9 @@ class DefaultMinecraftEntityOperator : MinecraftEntityOperator {
override fun updateHeadRotation(player: List<Player>, entityId: Int, yaw: Float) {
// 修复视角
val yf = Adyeshach.api().getEntityFinder().getEntityFromClientEntityId(entityId, player.firstOrNull() ?: return)?.entityType.fixYaw(yaw)
if (isUniversal) {
if (MinecraftVersion.versionId >= 12101) {
packetHandler.sendPacket(player, NMS21.instance.createEntityHead(entityId, ifloor(yf * 256.0 / 360.0).toByte()))
} else if (isUniversal) {
packetHandler.sendPacket(player, NMSPacketPlayOutEntityHeadRotation(createDataSerializer {
writeVarInt(entityId)
writeByte(ifloor(yf * 256.0 / 360.0).toByte())
Expand All @@ -156,6 +174,9 @@ class DefaultMinecraftEntityOperator : MinecraftEntityOperator {

override fun updateEquipment(player: List<Player>, entityId: Int, equipment: Map<EquipmentSlot, ItemStack>) {
when {
majorLegacy >= 12100 -> {
packetHandler.sendPacket(player, NMS21.instance.createEntityEquipment(entityId, equipment))
}
// 从 1.16 开始每个包支持多个物品
majorLegacy >= 11600 -> {
val items = equipment.map { Pair(it.key.toNMSEnumItemSlot(), CraftItemStack19.asNMSCopy(it.value)) }
Expand All @@ -171,7 +192,9 @@ class DefaultMinecraftEntityOperator : MinecraftEntityOperator {
}

override fun updatePassengers(player: List<Player>, entityId: Int, vararg passengers: Int) {
if (isUniversal) {
if (MinecraftVersion.versionId >= 12101) {
packetHandler.sendPacket(player, NMS21.instance.createPassengers(entityId, *passengers))
} else if (isUniversal) {
packetHandler.sendPacket(player, NMSPacketPlayOutMount(createDataSerializer {
writeVarInt(entityId)
writeVarIntArray(passengers)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
package ink.ptms.adyeshach.impl.nms

import taboolib.module.nms.createDataSerializer
import ink.ptms.adyeshach.core.*
import ink.ptms.adyeshach.core.bukkit.BukkitDirection
import ink.ptms.adyeshach.core.bukkit.BukkitPaintings
import ink.ptms.adyeshach.core.entity.EntityTypes
import ink.ptms.adyeshach.impl.nms.specific.NMS19
import ink.ptms.adyeshach.impl.nms.specific.NMS21
import org.bukkit.Location
import org.bukkit.Material
import org.bukkit.entity.Player
import org.bukkit.material.MaterialData
import taboolib.common.util.unsafeLazy
import taboolib.library.reflex.Reflex.Companion.getProperty
import taboolib.library.reflex.Reflex.Companion.invokeConstructor
import taboolib.library.reflex.Reflex.Companion.invokeMethod
import taboolib.library.reflex.UnsafeAccess
import taboolib.module.nms.MinecraftVersion
import taboolib.module.nms.createDataSerializer
import java.lang.invoke.MethodHandle
import java.util.*
import java.util.concurrent.ConcurrentHashMap
Expand Down Expand Up @@ -117,15 +119,17 @@ class DefaultMinecraftEntitySpawner : MinecraftEntitySpawner {
}.build() as NMS16PacketDataSerializer)
}
// 1.17, 1.18, 1.19, 1.12
9, 10, 11, 12 -> NMSPacketPlayOutSpawnEntity(createDataSerializer {
9, 10, 11, 12 -> NMSPacketPlayOutSpawnEntity::class.java.invokeConstructor(createDataSerializer {
writeVarInt(entityId)
writeUUID(uuid)
// 类型
when (major) {
// 1.17, 1.18 写法相同
// 1.17 -> this.type = (EntityTypes)IRegistry.ENTITY_TYPE.fromId(var0.j());
// 1.18 -> this.type = (EntityTypes)IRegistry.ENTITY_TYPE.byId(var0.readVarInt());
9, 10 -> writeVarInt(NMSIRegistry.ENTITY_TYPE.getId(helper.adapt(entityType) as NMSEntityTypes<*>))
9, 10 -> writeVarInt(
NMSIRegistry.ENTITY_TYPE.getId(helper.adapt(entityType) as NMSEntityTypes<*>)
)
// 1.19 写法不同
11 -> {
when (minor) {
Expand Down Expand Up @@ -160,6 +164,19 @@ class DefaultMinecraftEntitySpawner : MinecraftEntitySpawner {
writeShort(0)
writeShort(0)
}.build() as NMSPacketDataSerializer)

13 -> {
NMS21.instance.createSpawnEntity(
entityId,
uuid,
location,
yaw.toFloat(),
pitch.toFloat(),
data,
NMS19.instance.entityTypeGetId(helper.adapt(entityType)),
yaw.toDouble()
)
}
// 不支持
else -> error("Unsupported version.")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import ink.ptms.adyeshach.core.entity.EntityTypes
import ink.ptms.adyeshach.core.util.errorBy
import ink.ptms.adyeshach.impl.nms.specific.NMS19p
import ink.ptms.adyeshach.impl.nms.specific.NMS20p
import ink.ptms.adyeshach.impl.nms.specific.NMS21
import ink.ptms.adyeshach.minecraft.ChunkPos
import org.bukkit.Location
import org.bukkit.World
Expand Down Expand Up @@ -137,10 +138,18 @@ class DefaultMinecraftHelper : MinecraftHelper {
}

override fun craftChatSerializerToJson(compound: Any): String {
return if (MinecraftVersion.isUniversal) {
NMSChatSerializer.toJson(compound as NMSIChatBaseComponent)
} else {
NMS16ChatSerializer.a(compound as NMS16IChatBaseComponent)
return when {
MinecraftVersion.versionId >= 12100 -> {
NMS21.instance.toJson(compound)
}

MinecraftVersion.isUniversal -> {
NMSChatSerializer.toJson(compound as NMSIChatBaseComponent)
}

else -> {
NMS16ChatSerializer.a(compound as NMS16IChatBaseComponent)
}
}
}

Expand All @@ -164,9 +173,12 @@ class DefaultMinecraftHelper : MinecraftHelper {
} catch (_: Throwable) {
}
return try {
if (MinecraftVersion.versionId >= 12101) {
(player.world as CraftWorld19).isChunkLoaded(chunkX, chunkZ)
}
// 从 1.18 开始 getVisibleChunk -> getVisibleChunkIfPresent
// getChunkProvider -> getChunkSource
if (MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_18)) {
else if (MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_18)) {
val craftWorld = player.world as CraftWorld19
craftWorld.handle.chunkSource.chunkMap.visibleChunkMap.get(ChunkPos.asLong(chunkX, chunkZ)) != null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import ink.ptms.adyeshach.core.Adyeshach
import ink.ptms.adyeshach.core.MinecraftPacketHandler
import ink.ptms.adyeshach.core.MinecraftScoreboardOperator
import org.bukkit.entity.Player
import taboolib.common.platform.function.info
import ink.ptms.adyeshach.impl.nms.specific.NMS21
import taboolib.module.nms.MinecraftVersion

/**
Expand Down Expand Up @@ -93,6 +93,10 @@ class DefaultMinecraftScoreboardOperator : MinecraftScoreboardOperator {
team.members.forEach { name -> writeUtf(name) }
}
}.build() as NMSPacketDataSerializer)

13 -> {
NMS21.instance.createTeam(team, method)
}
// 不支持
else -> error("Unsupported version.")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ink.ptms.adyeshach.impl.nms.specific

import ink.ptms.adyeshach.core.MinecraftMeta
import ink.ptms.adyeshach.core.MinecraftScoreboardOperator
import org.bukkit.Location
import org.bukkit.inventory.EquipmentSlot
import org.bukkit.inventory.ItemStack
import taboolib.common.util.unsafeLazy
import taboolib.module.nms.nmsProxy
import java.util.*

abstract class NMS21 {

abstract fun createEntityHead(entityId: Int, yHeadRot: Byte): Any

abstract fun toJson(compound: Any): String

abstract fun createSpawnEntity(entityId: Int, uuid: UUID, location: Location, yaw: Float, pitch: Float, data: Int, entityType: Int, yhead: Double): Any

abstract fun createPacketPlayOutEntityMetadata(entityId: Int, packedItems: List<MinecraftMeta>): Any

abstract fun createPassengers(entityId: Int, vararg passengers: Int): Any

abstract fun getChunk(chunk: Any?): Any?

abstract fun createTeleport(entityId: Int, location: Location, yaw: Byte, pitch: Byte, onGround: Boolean): Any

abstract fun createEntityEquipment(entityId: Int, equipment: Map<EquipmentSlot, ItemStack>): Any

abstract fun createTeam(team: MinecraftScoreboardOperator.Team, method: MinecraftScoreboardOperator.TeamMethod): Any

companion object {
val instance by unsafeLazy { nmsProxy<NMS21>() }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import ink.ptms.adyeshach.core.bukkit.data.GameProfileAction
import ink.ptms.adyeshach.core.entity.type.AdySniffer
import ink.ptms.adyeshach.impl.nms.NMSDataWatcherItem
import ink.ptms.adyeshach.impl.nms.NMSDataWatcherObject
import net.minecraft.core.Holder
import net.minecraft.core.IRegistry
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.network.chat.IChatBaseComponent
Expand Down Expand Up @@ -88,7 +89,11 @@ class NMS19Impl : NMS19() {
val ir = BuiltInRegistries.CAT_VARIANT as IRegistry<CatVariant>
val texture = "textures/entity/cat/${type.name.lowercase()}.png"
val variant = ir.first { it.texture.path == texture }
return DataWatcher.Item(DataWatcherObject(index, DataWatcherRegistry.CAT_VARIANT), variant)
return kotlin.runCatching {
DataWatcher.Item(DataWatcherObject(index, DataWatcherRegistry.CAT_VARIANT), variant)
}.getOrElse {
DataWatcher.Item::class.java.invokeConstructor(DataWatcherObject(index, DataWatcherRegistry.CAT_VARIANT), Holder.direct(variant))
}
}

override fun createSnifferStateMeta(index: Int, type: AdySniffer.State): Any {
Expand Down Expand Up @@ -158,6 +163,7 @@ class NMS19Impl : NMS19() {
// }
}
}

else -> error("Unsupported action: $action")
}
}
Expand Down Expand Up @@ -185,13 +191,7 @@ class NMS19Impl : NMS19() {
val gameMode = if (gameProfile.spectator) EnumGamemode.SPECTATOR else EnumGamemode.CREATIVE
val displayName = Adyeshach.api().getMinecraftAPI().getHelper().literalChatBaseComponent(gameProfile.name) as IChatBaseComponent
return ClientboundPlayerInfoUpdatePacket.b(
uuid,
gameProfile.toMojang(uuid),
listed,
latency,
gameMode,
displayName,
null
uuid, gameProfile.toMojang(uuid), listed, latency, gameMode, displayName, null
)
}
}
Expand Down
Loading