diff --git a/nms/v1_21_R3/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R3/EntityData.kt b/nms/v1_21_R3/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R3/EntityData.kt index b66dad34..8a4c0f64 100644 --- a/nms/v1_21_R3/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R3/EntityData.kt +++ b/nms/v1_21_R3/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R3/EntityData.kt @@ -28,7 +28,7 @@ internal fun Class<*>.accessors() = declaredFields.filter { f -> EntityDataAccessor::class.java.isAssignableFrom(f.type) }.map { it.toEntityDataAccessor() -} +}.sortedBy { it.id } internal val DISPLAY_SET = Display::class.java.accessors() internal val SHARED_FLAG = Entity::class.java.accessors().first().id @@ -123,4 +123,3 @@ internal class TransformationData { } } } - diff --git a/nms/v1_21_R4/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R4/EntityData.kt b/nms/v1_21_R4/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R4/EntityData.kt index d6f87125..891f2b7e 100644 --- a/nms/v1_21_R4/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R4/EntityData.kt +++ b/nms/v1_21_R4/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R4/EntityData.kt @@ -28,7 +28,7 @@ internal fun Class<*>.accessors() = declaredFields.filter { f -> EntityDataAccessor::class.java.isAssignableFrom(f.type) }.map { it.toEntityDataAccessor() -} +}.sortedBy { it.id } internal val DISPLAY_SET = Display::class.java.accessors() internal val SHARED_FLAG = Entity::class.java.accessors().first().id @@ -123,4 +123,3 @@ internal class TransformationData { } } } - diff --git a/nms/v1_21_R5/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R5/EntityData.kt b/nms/v1_21_R5/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R5/EntityData.kt index ff59b22f..b0f44b94 100644 --- a/nms/v1_21_R5/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R5/EntityData.kt +++ b/nms/v1_21_R5/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R5/EntityData.kt @@ -28,7 +28,7 @@ internal fun Class<*>.accessors() = declaredFields.filter { f -> EntityDataAccessor::class.java.isAssignableFrom(f.type) }.map { it.toEntityDataAccessor() -} +}.sortedBy { it.id } internal val DISPLAY_SET = Display::class.java.accessors() internal val SHARED_FLAG = Entity::class.java.accessors().first().id @@ -123,4 +123,3 @@ internal class TransformationData { } } } - diff --git a/nms/v1_21_R6/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R6/EntityData.kt b/nms/v1_21_R6/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R6/EntityData.kt index c3299f2d..9700b656 100644 --- a/nms/v1_21_R6/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R6/EntityData.kt +++ b/nms/v1_21_R6/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R6/EntityData.kt @@ -28,7 +28,7 @@ internal fun Class<*>.accessors() = declaredFields.filter { f -> EntityDataAccessor::class.java.isAssignableFrom(f.type) }.map { it.toEntityDataAccessor() -} +}.sortedBy { it.id } internal val DISPLAY_SET = Display::class.java.accessors() internal val SHARED_FLAG = Entity::class.java.accessors().first().id @@ -123,4 +123,3 @@ internal class TransformationData { } } } - diff --git a/nms/v1_21_R7/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R7/EntityData.kt b/nms/v1_21_R7/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R7/EntityData.kt index 9c801680..da845f89 100644 --- a/nms/v1_21_R7/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R7/EntityData.kt +++ b/nms/v1_21_R7/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R7/EntityData.kt @@ -28,7 +28,7 @@ internal fun Class<*>.accessors() = declaredFields.filter { f -> EntityDataAccessor::class.java.isAssignableFrom(f.type) }.map { it.toEntityDataAccessor() -} +}.sortedBy { it.id } internal val DISPLAY_SET = Display::class.java.accessors() internal val SHARED_FLAG = Entity::class.java.accessors().first().id @@ -123,4 +123,3 @@ internal class TransformationData { } } } - diff --git a/nms/v26_R1/src/main/kotlin/kr/toxicity/model/bukkit/nms/v26_R1/EntityData.kt b/nms/v26_R1/src/main/kotlin/kr/toxicity/model/bukkit/nms/v26_R1/EntityData.kt index 40185675..d741040d 100644 --- a/nms/v26_R1/src/main/kotlin/kr/toxicity/model/bukkit/nms/v26_R1/EntityData.kt +++ b/nms/v26_R1/src/main/kotlin/kr/toxicity/model/bukkit/nms/v26_R1/EntityData.kt @@ -28,7 +28,7 @@ internal fun Class<*>.accessors() = declaredFields.filter { f -> EntityDataAccessor::class.java.isAssignableFrom(f.type) }.map { it.toEntityDataAccessor() -} +}.sortedBy { it.id } internal val DISPLAY_SET = Display::class.java.accessors() internal val SHARED_FLAG = Entity::class.java.accessors().first().id @@ -123,4 +123,3 @@ internal class TransformationData { } } } - diff --git a/nms/v26_R2/src/main/kotlin/kr/toxicity/model/bukkit/nms/v26_R2/EntityData.kt b/nms/v26_R2/src/main/kotlin/kr/toxicity/model/bukkit/nms/v26_R2/EntityData.kt index bd6da9f8..fe6d8991 100644 --- a/nms/v26_R2/src/main/kotlin/kr/toxicity/model/bukkit/nms/v26_R2/EntityData.kt +++ b/nms/v26_R2/src/main/kotlin/kr/toxicity/model/bukkit/nms/v26_R2/EntityData.kt @@ -28,7 +28,7 @@ internal fun Class<*>.accessors() = declaredFields.filter { f -> EntityDataAccessor::class.java.isAssignableFrom(f.type) }.map { it.toEntityDataAccessor() -} +}.sortedBy { it.id } internal val DISPLAY_SET = Display::class.java.accessors() internal val SHARED_FLAG = Entity::class.java.accessors().first().id @@ -123,4 +123,3 @@ internal class TransformationData { } } } - diff --git a/nms/v26_R2/src/test/kotlin/kr/toxicity/model/bukkit/nms/v26_R2/EntityDataTest.kt b/nms/v26_R2/src/test/kotlin/kr/toxicity/model/bukkit/nms/v26_R2/EntityDataTest.kt new file mode 100644 index 00000000..a7be99b8 --- /dev/null +++ b/nms/v26_R2/src/test/kotlin/kr/toxicity/model/bukkit/nms/v26_R2/EntityDataTest.kt @@ -0,0 +1,61 @@ +/* + * This source file is part of BetterModel. + * Copyright (c) 2026 toxicity188 + * Licensed under the MIT License. + * See LICENSE.md file for full license text. + */ + +package kr.toxicity.model.bukkit.nms.v26_R2 + +import net.minecraft.network.syncher.EntityDataSerializers +import net.minecraft.world.entity.Display +import org.joml.Quaternionf +import org.joml.Vector3f +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertSame +import kotlin.test.assertTrue + +class EntityDataTest { + + @Test + fun `display accessors are ordered by metadata id`() { + val ids = Display::class.java.accessors().map { it.id } + + assertTrue(ids.zipWithNext().all { (first, second) -> first < second }) + } + + @Test + fun `transformation data uses the expected metadata types`() { + val translation = Vector3f(1F, 2F, 3F) + val scale = Vector3f(4F, 5F, 6F) + val rotation = Quaternionf().rotationXYZ(0.1F, 0.2F, 0.3F) + val packed = TransformationData().apply { + transform(20, translation, scale, rotation) + }.pack() + + assertEquals(listOf(8, 9, 11, 12, 13), packed.map { it.id }) + assertEquals(packed.size, packed.map { it.id }.distinct().size) + + assertSame(EntityDataSerializers.INT, packed[0].serializer) + assertIs(packed[0].value) + assertEquals(0, packed[0].value) + + assertSame(EntityDataSerializers.INT, packed[1].serializer) + assertIs(packed[1].value) + assertEquals(20, packed[1].value) + + assertSame(EntityDataSerializers.VECTOR3, packed[2].serializer) + assertIs(packed[2].value) + assertEquals(translation, packed[2].value) + + assertSame(EntityDataSerializers.VECTOR3, packed[3].serializer) + assertIs(packed[3].value) + assertEquals(scale, packed[3].value) + + assertSame(EntityDataSerializers.QUATERNION, packed[4].serializer) + assertIs(packed[4].value) + assertEquals(rotation, packed[4].value) + } +}