LibAC-dart/lib/nbt/Tag.dart
2024-05-04 21:40:20 -07:00

113 lines
2.4 KiB
Dart

import 'package:libac_flutter/nbt/impl/ByteArrayTag.dart';
import 'package:libac_flutter/nbt/impl/CompoundTag.dart';
import 'package:libac_flutter/nbt/impl/DoubleTag.dart';
import 'package:libac_flutter/nbt/impl/EndTag.dart';
import 'package:libac_flutter/nbt/impl/FloatTag.dart';
import 'package:libac_flutter/nbt/impl/IntArrayTag.dart';
import 'package:libac_flutter/nbt/impl/IntTag.dart';
import 'package:libac_flutter/nbt/impl/TagLong.dart';
import 'package:libac_flutter/nbt/impl/TagShort.dart';
import 'Stream.dart';
import 'impl/ByteTag.dart';
enum TagType {
End(0),
Byte(1),
Short(2),
Int(3),
Long(4),
Float(5),
Double(6),
ByteArray(7),
String(8),
List(9),
Compound(10),
IntArray(11),
LongArray(12);
final int byte;
const TagType(this.byte);
static TagType get(int byte) {
for (TagType type in values) {
if (type.byte == byte) {
return type;
}
}
return TagType.End;
}
}
abstract class Tag {
int getType() {
return getTagType().byte;
}
TagType getTagType();
void writeValue(ByteLayer data);
void readValue(ByteLayer data);
String? _key;
String getKey() {
return (_key == null ? "" : _key!);
}
static Tag readNamedTag(ByteLayer data) {
var type = data.readByte();
if (type == 0) {
return new EndTag();
} else {
Tag tag = makeTagOfType(TagType.get(type));
tag._key = data.readString();
tag.readValue(data);
return tag;
}
}
static void writeNamedTag(Tag tag, ByteLayer data) {
data.writeByte(tag.getType());
if (tag.getType() != 0) {
data.writeString(tag.getKey());
tag.writeValue(data);
}
}
static Tag makeTagOfType(TagType type) {
switch (type) {
case TagType.Byte:
{
return new ByteTag();
}
case TagType.ByteArray:
{
return new ByteArrayTag();
}
case TagType.Compound:
{
return new CompoundTag();
}
case TagType.Double:
{
return new DoubleTag();
}
case TagType.End:
return new EndTag();
case TagType.Short:
return new TagShort(value: 0);
case TagType.Int:
return new IntTag();
case TagType.Long:
return new TagLong(value: 0);
case TagType.Float:
return new FloatTag();
case TagType.IntArray:
{
return new IntArrayTag();
}
}
}
}