mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-27 06:03:01 +02:00
WIP Enchantments (de)serialization
This commit is contained in:
parent
0354a60635
commit
7eee0c788f
@ -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();
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user