WIP Enchantments (de)serialization

This commit is contained in:
Felix Cravic 2020-04-29 20:17:04 +02:00
parent 0354a60635
commit 7eee0c788f
5 changed files with 80 additions and 10 deletions

View File

@ -214,8 +214,6 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler
if (itemStack != null) {
this.items[slot] = itemStack;
}
//System.out.println("INSERT: " + slot);
//sendSlotRefresh((short) slot, itemStack);
// Refresh inventory items
update();

View File

@ -5,6 +5,9 @@ import net.minestom.server.data.DataContainer;
import net.minestom.server.item.rule.VanillaStackingRule;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class ItemStack implements DataContainer {
@ -28,6 +31,8 @@ public class ItemStack implements DataContainer {
private boolean unbreakable;
private ArrayList<String> lore;
private Map<Enchantment, Integer> enchantmentMap;
private StackingRule stackingRule;
private Data data;
@ -37,6 +42,8 @@ public class ItemStack implements DataContainer {
this.damage = damage;
this.lore = new ArrayList<>();
this.enchantmentMap = new HashMap<>();
this.stackingRule = defaultStackingRule;
}
@ -63,6 +70,7 @@ public class ItemStack implements DataContainer {
itemStack.getDisplayName() == displayName &&
itemStack.isUnbreakable() == unbreakable &&
itemStack.getDamage() == damage &&
itemStack.enchantmentMap.equals(enchantmentMap) &&
itemStack.getStackingRule() == stackingRule &&
itemStack.getData() == data;
}
@ -115,6 +123,27 @@ public class ItemStack implements DataContainer {
return lore != null && !lore.isEmpty();
}
public Map<Enchantment, Integer> getEnchantmentMap() {
return Collections.unmodifiableMap(enchantmentMap);
}
public void setEnchantment(Enchantment enchantment, int level) {
if (level < 1) {
removeEnchantment(enchantment);
return;
}
this.enchantmentMap.put(enchantment, level);
}
public void removeEnchantment(Enchantment enchantment) {
this.enchantmentMap.remove(enchantment);
}
public int getEnchantmentLevel(Enchantment enchantment) {
return this.enchantmentMap.getOrDefault(enchantment, 0);
}
public boolean isUnbreakable() {
return unbreakable;
}
@ -133,6 +162,9 @@ public class ItemStack implements DataContainer {
itemStack.setUnbreakable(unbreakable);
itemStack.setLore(getLore());
itemStack.setStackingRule(getStackingRule());
itemStack.enchantmentMap = new HashMap<>(enchantmentMap);
Data data = getData();
if (data != null)
itemStack.setData(data.clone());

View File

@ -14,8 +14,9 @@ public class CreativeInventoryActionListener {
return;
ItemStack item = packet.item;
short slot = packet.slot;
slot = (short) PlayerInventoryUtils.convertSlot(slot, PlayerInventoryUtils.OFFSET);
PlayerInventory inventory = player.getInventory();
inventory.setItemStack(PlayerInventoryUtils.convertSlot(slot, PlayerInventoryUtils.OFFSET), item);
inventory.setItemStack(slot, item);
}

View File

@ -3,6 +3,7 @@ package net.minestom.server.utils;
import club.thectm.minecraft.text.LegacyText;
import club.thectm.minecraft.text.TextObject;
import com.google.gson.JsonParser;
import net.minestom.server.item.Enchantment;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.PacketReader;
@ -70,22 +71,26 @@ public class NbtReaderUtils {
String listName = reader.readShortSizedString();
if (listName.equals("StoredEnchantments")) {
boolean end = false;
while (!end) {
reader.readByte(); // Should be a compound (0x0A)
int size = reader.readInteger();
reader.readByte(); // Should be a compound (0x0A)
int size = reader.readInteger();
for (int ench = 0; ench < size; ench++) {
byte test = reader.readByte();
String lvlName = reader.readShortSizedString();
short lvl = reader.readShort();
byte test2 = reader.readByte();
String idName = reader.readShortSizedString();
short id = reader.readShort();
int id = reader.readVarInt();
System.out.println("byte: " + test + " : " + test2);
System.out.println("string: " + lvlName + " : " + idName);
System.out.println("size: " + lvl + " : " + id);
end = true;
System.out.println("add= " + Enchantment.fromId(id) + " : " + lvl);
item.setEnchantment(Enchantment.fromId(id), lvl);
}
// TODO
reader.readByte();
}
break;

View File

@ -3,12 +3,14 @@ package net.minestom.server.utils;
import io.netty.buffer.ByteBuf;
import net.minestom.server.chat.Chat;
import net.minestom.server.instance.Chunk;
import net.minestom.server.item.Enchantment;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.PacketReader;
import net.minestom.server.network.packet.PacketWriter;
import net.minestom.server.utils.buffer.BufferWrapper;
import java.util.ArrayList;
import java.util.Map;
public class Utils {
@ -134,6 +136,38 @@ public class Utils {
}
// End display
// FIXME: Enchantment
{
System.out.println("ENCODAGE");
Map<Enchantment, Integer> enchantmentMap = itemStack.getEnchantmentMap();
if (!enchantmentMap.isEmpty()) {
System.out.println("write enchant");
packet.writeByte((byte) 0x09); // list
packet.writeShortSizedString("StoredEnchantments");
packet.writeByte((byte) 0x0A); // Compound
packet.writeInt(enchantmentMap.size()); // Map size
for (Map.Entry<Enchantment, Integer> entry : enchantmentMap.entrySet()) {
Enchantment enchantment = entry.getKey();
int level = entry.getValue();
packet.writeByte((byte) 0x02);
packet.writeShortSizedString("lvl");
packet.writeShort((short) level);
packet.writeByte((byte) 0x08);
packet.writeShortSizedString("id");
packet.writeShort((short) enchantment.getId());
}
//packet.writeByte((byte) 0); // End enchantment compound
}
}
// End enchantment
packet.writeByte((byte) 0); // End nbt
}
}