2023-09-30 19:17:44 +02:00
|
|
|
package net.minestom.server.network.packet.server.common;
|
2020-06-30 20:38:42 +02:00
|
|
|
|
2020-12-15 06:21:59 +01:00
|
|
|
import net.minestom.server.MinecraftServer;
|
2020-06-30 20:38:42 +02:00
|
|
|
import net.minestom.server.gamedata.tags.Tag;
|
2022-10-29 11:02:22 +02:00
|
|
|
import net.minestom.server.network.NetworkBuffer;
|
2021-11-17 08:13:31 +01:00
|
|
|
import net.minestom.server.network.packet.server.CachedPacket;
|
2020-06-30 20:38:42 +02:00
|
|
|
import net.minestom.server.network.packet.server.ServerPacket;
|
|
|
|
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
|
2021-09-20 19:34:43 +02:00
|
|
|
import org.jetbrains.annotations.ApiStatus;
|
2020-10-25 22:19:27 +01:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2020-06-30 20:38:42 +02:00
|
|
|
|
2021-12-01 22:59:38 +01:00
|
|
|
import java.util.EnumMap;
|
2021-07-29 12:54:16 +02:00
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
2020-06-30 20:38:42 +02:00
|
|
|
|
2022-10-29 11:02:22 +02:00
|
|
|
import static net.minestom.server.network.NetworkBuffer.*;
|
|
|
|
|
2024-03-19 17:42:06 +01:00
|
|
|
public record TagsPacket(
|
|
|
|
@NotNull Map<Tag.BasicType, List<Tag>> tagsMap) implements ServerPacket.Configuration, ServerPacket.Play {
|
2021-09-20 19:34:43 +02:00
|
|
|
@ApiStatus.Internal
|
2021-11-17 08:13:31 +01:00
|
|
|
public static final CachedPacket DEFAULT_TAGS = new CachedPacket(new TagsPacket(MinecraftServer.getTagManager().getTagMap()));
|
2020-06-30 20:38:42 +02:00
|
|
|
|
2021-11-30 17:49:41 +01:00
|
|
|
public TagsPacket {
|
|
|
|
tagsMap = Map.copyOf(tagsMap);
|
2020-12-15 06:21:59 +01:00
|
|
|
}
|
|
|
|
|
2022-10-29 11:02:22 +02:00
|
|
|
public TagsPacket(@NotNull NetworkBuffer reader) {
|
2021-11-30 17:49:41 +01:00
|
|
|
this(readTagsMap(reader));
|
2021-06-07 13:25:04 +02:00
|
|
|
}
|
2021-02-05 21:18:40 +01:00
|
|
|
|
2020-06-30 20:38:42 +02:00
|
|
|
@Override
|
2022-10-29 11:02:22 +02:00
|
|
|
public void write(@NotNull NetworkBuffer writer) {
|
|
|
|
writer.write(VAR_INT, tagsMap.size());
|
2021-06-11 16:00:14 +02:00
|
|
|
for (var entry : tagsMap.entrySet()) {
|
|
|
|
final var type = entry.getKey();
|
|
|
|
final var tags = entry.getValue();
|
2022-10-29 11:02:22 +02:00
|
|
|
writer.write(STRING, type.getIdentifier());
|
|
|
|
writer.write(VAR_INT, tags.size());
|
2021-07-29 12:54:16 +02:00
|
|
|
for (var tag : tags) {
|
2022-10-29 11:02:22 +02:00
|
|
|
writer.write(STRING, tag.getName().asString());
|
2021-07-29 12:54:16 +02:00
|
|
|
final var values = tag.getValues();
|
2022-10-29 11:02:22 +02:00
|
|
|
writer.write(VAR_INT, values.size());
|
2021-07-29 12:54:16 +02:00
|
|
|
for (var name : values) {
|
2022-10-29 11:02:22 +02:00
|
|
|
writer.write(VAR_INT, type.getFunction().apply(name.asString()));
|
2021-06-07 13:25:04 +02:00
|
|
|
}
|
|
|
|
}
|
2021-06-09 21:23:35 +02:00
|
|
|
}
|
2020-06-30 20:38:42 +02:00
|
|
|
}
|
|
|
|
|
2021-02-05 21:18:40 +01:00
|
|
|
@Override
|
2024-03-19 17:42:06 +01:00
|
|
|
public int configurationId() {
|
|
|
|
return ServerPacketIdentifier.CONFIGURATION_TAGS;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int playId() {
|
|
|
|
return ServerPacketIdentifier.TAGS;
|
2021-11-30 17:49:41 +01:00
|
|
|
}
|
|
|
|
|
2022-10-29 11:02:22 +02:00
|
|
|
private static Map<Tag.BasicType, List<Tag>> readTagsMap(@NotNull NetworkBuffer reader) {
|
2021-12-01 22:59:38 +01:00
|
|
|
Map<Tag.BasicType, List<Tag>> tagsMap = new EnumMap<>(Tag.BasicType.class);
|
2021-06-10 09:45:30 +02:00
|
|
|
// Read amount of tag types
|
2022-10-29 11:02:22 +02:00
|
|
|
final int typeCount = reader.read(VAR_INT);
|
2021-06-07 13:25:04 +02:00
|
|
|
for (int i = 0; i < typeCount; i++) {
|
2021-06-10 09:45:30 +02:00
|
|
|
// Read tag type
|
2022-10-29 11:02:22 +02:00
|
|
|
final Tag.BasicType tagType = Tag.BasicType.fromIdentifer(reader.read(STRING));
|
2021-06-10 09:45:30 +02:00
|
|
|
if (tagType == null) {
|
|
|
|
throw new IllegalArgumentException("Tag type could not be resolved");
|
2021-06-07 13:25:04 +02:00
|
|
|
}
|
|
|
|
|
2022-10-29 11:02:22 +02:00
|
|
|
final int tagCount = reader.read(VAR_INT);
|
2021-06-11 16:00:14 +02:00
|
|
|
for (int j = 0; j < tagCount; j++) {
|
2022-10-29 11:02:22 +02:00
|
|
|
final String tagName = reader.read(STRING);
|
|
|
|
final int[] entries = reader.read(VAR_INT_ARRAY);
|
2021-06-11 16:00:14 +02:00
|
|
|
// TODO convert
|
2020-06-30 20:38:42 +02:00
|
|
|
}
|
|
|
|
}
|
2021-11-30 17:49:41 +01:00
|
|
|
return tagsMap;
|
2020-06-30 20:38:42 +02:00
|
|
|
}
|
|
|
|
}
|