@@ -3,6 +3,7 @@ package taboolib.module.nms
3
3
import org.bukkit.Material
4
4
import org.bukkit.inventory.ItemStack
5
5
import org.tabooproject.reflex.UnsafeAccess
6
+ import taboolib.common.platform.function.info
6
7
import java.lang.invoke.MethodHandle
7
8
8
9
/* *
@@ -59,6 +60,7 @@ class NMSItemTagImpl : NMSItemTag() {
59
60
60
61
val nbtTagCompoundGetter = unreflectGetter< net.minecraft.server.v1_12_R1.NBTTagCompound > (if (MinecraftVersion .isUniversal) " x" else " map" )
61
62
val nbtTagListGetter = unreflectGetter< net.minecraft.server.v1_12_R1.NBTTagList > (if (MinecraftVersion .isUniversal) " c" else " list" )
63
+ val nbtTagListTypeSetter = unreflectSetter< net.minecraft.server.v1_12_R1.NBTTagList > (if (MinecraftVersion .isUniversal) " w" else " type" )
62
64
val nbtTagByteGetter = unreflectGetter< net.minecraft.server.v1_12_R1.NBTTagByte > (if (MinecraftVersion .isUniversal) " x" else " data" )
63
65
val nbtTagShortGetter = unreflectGetter< net.minecraft.server.v1_12_R1.NBTTagShort > (if (MinecraftVersion .isUniversal) " c" else " data" )
64
66
val nbtTagIntGetter = unreflectGetter< net.minecraft.server.v1_12_R1.NBTTagInt > (if (MinecraftVersion .isUniversal) " c" else " data" )
@@ -106,7 +108,12 @@ class NMSItemTagImpl : NMSItemTag() {
106
108
// 反射获取字段:
107
109
// private final List<NBTBase> list;
108
110
val list = nbtTagListGetter.get<MutableList <Any >>(nmsList)
109
- itemTagData.asList().forEach { list + = itemTagToNMSCopy(it) }
111
+ val dataList = itemTagData.asList()
112
+ if (dataList.isNotEmpty()) {
113
+ dataList.forEach { list + = itemTagToNMSCopy(it) }
114
+ // 修改 NBTTagList 的类型,不改他妈这条 List 作废,天坑。。。
115
+ nbtTagListTypeSetter.set(nmsList, dataList.first().type.id)
116
+ }
110
117
}
111
118
}
112
119
@@ -117,6 +124,7 @@ class NMSItemTagImpl : NMSItemTag() {
117
124
// private final Map<String, NBTBase> map
118
125
val map = nbtTagCompoundGetter.get<MutableMap <String , Any >>(nmsCompound)
119
126
itemTagData.asCompound().entries.forEach { (key, value) -> map[key] = itemTagToNMSCopy(value) }
127
+ info(" nmsCompound $nmsCompound " )
120
128
}
121
129
}
122
130
@@ -142,12 +150,12 @@ class NMSItemTagImpl : NMSItemTag() {
142
150
143
151
// 列表类型特殊处理
144
152
is net.minecraft.server.v1_12_R1.NBTTagList -> {
145
- ItemTagData ( ItemTagType . LIST , ItemTagList (nbtTagListGetter.get<List <Any >>(nbtTag).map { itemTagToBukkitCopy(it) }) )
153
+ ItemTagList (nbtTagListGetter.get<List <Any >>(nbtTag).map { itemTagToBukkitCopy(it) })
146
154
}
147
155
148
156
// 复合类型特殊处理
149
157
is net.minecraft.server.v1_12_R1.NBTTagCompound -> {
150
- ItemTagData ( ItemTagType . COMPOUND , ItemTag ().apply { nbtTagCompoundGetter.get<Map <String , Any >>(nbtTag).forEach { put(it.key, itemTagToBukkitCopy(it.value)) } })
158
+ ItemTag ().apply { nbtTagCompoundGetter.get<Map <String , Any >>(nbtTag).forEach { put(it.key, itemTagToBukkitCopy(it.value)) } }
151
159
}
152
160
153
161
// 不支持的类型
@@ -159,9 +167,17 @@ class NMSItemTagImpl : NMSItemTag() {
159
167
return UnsafeAccess .lookup.unreflectGetter(T ::class .java.getDeclaredField(name).apply { isAccessible = true })
160
168
}
161
169
170
+ private inline fun <reified T > unreflectSetter (name : String ): MethodHandle {
171
+ return UnsafeAccess .lookup.unreflectSetter(T ::class .java.getDeclaredField(name).apply { isAccessible = true })
172
+ }
173
+
162
174
private fun <T > MethodHandle.get (src : Any ): T {
163
175
return bindTo(src).invoke() as T
164
176
}
177
+
178
+ private fun <T > MethodHandle.set (src : Any , value : T ) {
179
+ bindTo(src).invoke(value)
180
+ }
165
181
}
166
182
167
183
/* *
0 commit comments