Cache meta binary

This commit is contained in:
TheMode 2021-04-10 00:55:18 +02:00
parent f5b8f267d6
commit d1f8e60a7e
3 changed files with 24 additions and 16 deletions

View File

@ -2,6 +2,8 @@ package net.minestom.server.item;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.minestom.server.item.attribute.ItemAttribute; import net.minestom.server.item.attribute.ItemAttribute;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.binary.Writeable;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -12,7 +14,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer; import java.util.function.Consumer;
public class ItemMeta { public class ItemMeta implements Writeable {
private final int damage; private final int damage;
private final boolean unbreakable; private final boolean unbreakable;
@ -28,6 +30,8 @@ public class ItemMeta {
private final NBTCompound nbt; private final NBTCompound nbt;
private final ItemMetaBuilder emptyBuilder; private final ItemMetaBuilder emptyBuilder;
private BinaryWriter cachedBuffer;
protected ItemMeta(@NotNull ItemMetaBuilder metaBuilder) { protected ItemMeta(@NotNull ItemMetaBuilder metaBuilder) {
this.damage = metaBuilder.damage; this.damage = metaBuilder.damage;
this.unbreakable = metaBuilder.unbreakable; this.unbreakable = metaBuilder.unbreakable;
@ -124,4 +128,15 @@ public class ItemMeta {
protected @NotNull ItemMetaBuilder builder() { protected @NotNull ItemMetaBuilder builder() {
return ItemMetaBuilder.fromNBT(emptyBuilder, nbt); return ItemMetaBuilder.fromNBT(emptyBuilder, nbt);
} }
@Override
public synchronized void write(@NotNull BinaryWriter writer) {
if (cachedBuffer == null) {
BinaryWriter w = new BinaryWriter();
w.writeNBT("", nbt);
this.cachedBuffer = w;
}
writer.write(cachedBuffer);
cachedBuffer.getBuffer().resetReaderIndex();
}
} }

View File

@ -16,7 +16,6 @@ import net.minestom.server.item.attribute.AttributeSlot;
import net.minestom.server.item.attribute.ItemAttribute; import net.minestom.server.item.attribute.ItemAttribute;
import net.minestom.server.registry.Registries; import net.minestom.server.registry.Registries;
import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -280,18 +279,6 @@ public final class NBTUtils {
} }
} }
public static void writeItemStack(@NotNull BinaryWriter packet, @NotNull ItemStack itemStack) {
if (itemStack.isAir()) {
packet.writeBoolean(false);
} else {
packet.writeBoolean(true);
packet.writeVarInt(itemStack.getMaterial().getId());
packet.writeByte((byte) itemStack.getAmount());
packet.writeNBT("", itemStack.getMeta().toNBT());
}
}
@FunctionalInterface @FunctionalInterface
public interface EnchantmentSetter { public interface EnchantmentSetter {
void applyEnchantment(Enchantment name, short level); void applyEnchantment(Enchantment name, short level);

View File

@ -9,7 +9,6 @@ import net.minestom.server.adventure.AdventureSerializer;
import net.minestom.server.chat.JsonMessage; import net.minestom.server.chat.JsonMessage;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.utils.BlockPosition; import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.NBTUtils;
import net.minestom.server.utils.SerializerUtils; import net.minestom.server.utils.SerializerUtils;
import net.minestom.server.utils.Utils; import net.minestom.server.utils.Utils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -264,7 +263,14 @@ public class BinaryWriter extends OutputStream {
} }
public void writeItemStack(@NotNull ItemStack itemStack) { public void writeItemStack(@NotNull ItemStack itemStack) {
NBTUtils.writeItemStack(this, itemStack); if (itemStack.isAir()) {
writeBoolean(false);
} else {
writeBoolean(true);
writeVarInt(itemStack.getMaterial().getId());
writeByte((byte) itemStack.getAmount());
write(itemStack.getMeta());
}
} }
public void writeNBT(@NotNull String name, @NotNull NBT tag) { public void writeNBT(@NotNull String name, @NotNull NBT tag) {