enchantments couldn’t retreat due ItemStack
serialization.
code:
Player player = (Player) src;
String data;
{//serialize
StringWriter sink = new StringWriter();
GsonConfigurationLoader loader = GsonConfigurationLoader.builder().setSink(() -> new BufferedWriter(sink)).build();
final DataTranslator<ConfigurationNode> translator = DataTranslators.CONFIGURATION_NODE;
final DataView container = player.getItemInHand(HandTypes.OFF_HAND).get().toContainer();
try {
loader.save(translator.translate(container));
} catch (IOException e) {
e.printStackTrace();
}
data = sink.toString();
}
System.out.println(data);//line 16, check serialize data
{//deserialize
StringReader source = new StringReader(data);
GsonConfigurationLoader loader = GsonConfigurationLoader.builder().setSource(() -> new BufferedReader(source)).build();
ConfigurationNode node = null;
try {
node = loader.load();
} catch (IOException e) {
e.printStackTrace();
}
final DataTranslator<ConfigurationNode> translator = DataTranslators.CONFIGURATION_NODE;
final DataView container = translator.translate(node);
ItemStack itemStack = Sponge.getDataManager().deserialize(ItemStack.class, container).get();
player.getInventory().offer(itemStack);
}
Output of line 16:
[21:50:06] [Server thread/INFO] [STDOUT]: [***.execute(***.java:16)]: {
"ContentVersion": 1,
"ItemType": "minecraft:enchanted_book",
"Count": 1,
"UnsafeDamage": 0,
"UnsafeData": {
"StoredEnchantments": [
{
"lvl": "1",
"id": "33"
}
]
}
}
Off hand item is a enchanted book of silk touch, after deserialize, it became protect I.
Dig more:
ConfigurationNode node1 = null;
ConfigurationNode node2 = null;
{//serialize
StringWriter sink = new StringWriter();
GsonConfigurationLoader loader = GsonConfigurationLoader.builder().setSink(() -> new BufferedWriter(sink)).build();
final DataTranslator<ConfigurationNode> translator = DataTranslators.CONFIGURATION_NODE;
final DataView container = player.getItemInHand(HandTypes.OFF_HAND).get().toContainer();
try {
node1 = translator.translate(container);
loader.save(node1);
} catch (IOException e) {
e.printStackTrace();
}
data = sink.toString();
}
{//deserialize
StringReader source = new StringReader(data);
GsonConfigurationLoader loader = GsonConfigurationLoader.builder().setSource(() -> new BufferedReader(source)).build();
try {
node2 = loader.load();
System.out.println(node2.getString());
System.out.println(node1.getString());
} catch (IOException e) {
e.printStackTrace();
}
final DataTranslator<ConfigurationNode> translator = DataTranslators.CONFIGURATION_NODE;
final DataView container1 = translator.translate(node1);
final DataView container2 = translator.translate(node2);
ItemStack itemStack1 = Sponge.getDataManager().deserialize(ItemStack.class, container1).get();
ItemStack itemStack2 = Sponge.getDataManager().deserialize(ItemStack.class, container2).get();
player.getInventory().offer(itemStack1);
player.getInventory().offer(itemStack2);
}
Output:
[08:18:46] [Server thread/INFO] [STDOUT]: [***.execute(***.java:64)]: {ContentVersion=1, ItemType=minecraft:enchanted_book, Count=1, UnsafeDamage=0, UnsafeData={StoredEnchantments=[{lvl=3, id=35}]}}
[08:18:46] [Server thread/INFO] [STDOUT]: [***.execute(***.java:65)]: {ContentVersion=1, ItemType=minecraft:enchanted_book, Count=1, UnsafeDamage=0, UnsafeData={StoredEnchantments=[{lvl=3, id=35}]}}
Version: SpongeVanilla version 1.11.2-6.0.0-BETA-249
Two node seems same but serialize one was broken.