Files
MinecraftConsoles/Minecraft.World/CompoundTag.h

301 lines
6.1 KiB
C
Raw Normal View History

2026-03-01 12:16:08 +08:00
#pragma once
#include "Tag.h"
#include "ListTag.h"
#include "ByteTag.h"
#include "DoubleTag.h"
#include "FloatTag.h"
#include "IntTag.h"
#include "LongTag.h"
#include "ShortTag.h"
#include "StringTag.h"
#include "ByteArrayTag.h"
#include "IntArrayTag.h"
class CompoundTag : public Tag
2026-03-01 12:16:08 +08:00
{
private:
unordered_map<wstring, Tag *> tags;
public:
CompoundTag() : Tag(L"") {}
CompoundTag(const wstring &name) : Tag(name) {}
void write(DataOutput *dos)
2026-03-01 12:16:08 +08:00
{
AUTO_VAR(itEnd, tags.end());
for( unordered_map<wstring, Tag *>::iterator it = tags.begin(); it != itEnd; it++ )
{
Tag::writeNamedTag(it->second, dos);
}
dos->writeByte(Tag::TAG_End);
}
2026-03-01 12:16:08 +08:00
void load(DataInput *dis, int tagDepth)
2026-03-01 12:16:08 +08:00
{
if(tagDepth > MAX_DEPTH)
{
#ifndef _CONTENT_PACKAGE
printf("Tried to read NBT tag with too high complexity, depth > %d" , MAX_DEPTH);
__debugbreak();
#endif
return;
}
tags.clear();
Tag *tag;
while ((tag = Tag::readNamedTag(dis))->getId() != Tag::TAG_End)
2026-03-01 12:16:08 +08:00
{
tags[tag->getName()] = tag;
}
2026-03-01 12:16:08 +08:00
delete tag;
}
2026-03-01 12:16:08 +08:00
vector<Tag *> *getAllTags() // 4J - was collection
2026-03-01 12:16:08 +08:00
{
// 4J - was return tags.values();
vector<Tag *> *ret = new vector<Tag *>;
2026-03-01 12:16:08 +08:00
AUTO_VAR(itEnd, tags.end());
for( unordered_map<wstring, Tag *>::iterator it = tags.begin(); it != itEnd; it++ )
{
ret->push_back(it->second);
}
return ret;
}
2026-03-01 12:16:08 +08:00
byte getId()
2026-03-01 12:16:08 +08:00
{
return TAG_Compound;
}
2026-03-01 12:16:08 +08:00
void put(const wstring &name, Tag *tag)
2026-03-01 12:16:08 +08:00
{
tags[name] = tag->setName(name);
}
2026-03-01 12:16:08 +08:00
void putByte(const wstring &name, byte value)
2026-03-01 12:16:08 +08:00
{
tags[name] = (new ByteTag(name,value));
}
2026-03-01 12:16:08 +08:00
void putShort(const wstring &name, short value)
2026-03-01 12:16:08 +08:00
{
tags[name] = (new ShortTag(name,value));
}
2026-03-01 12:16:08 +08:00
void putInt(const wstring &name, int value)
2026-03-01 12:16:08 +08:00
{
tags[name] = (new IntTag(name,value));
}
2026-03-01 12:16:08 +08:00
void putLong(const wstring &name, __int64 value)
2026-03-01 12:16:08 +08:00
{
tags[name] = (new LongTag(name,value));
}
2026-03-01 12:16:08 +08:00
void putFloat(const wstring &name, float value)
2026-03-01 12:16:08 +08:00
{
tags[name] = (new FloatTag(name,value));
}
2026-03-01 12:16:08 +08:00
void putDouble(const wstring &name, double value)
2026-03-01 12:16:08 +08:00
{
tags[name] = (new DoubleTag(name,value));
}
2026-03-01 12:16:08 +08:00
void putString(const wstring &name, const wstring& value)
2026-03-01 12:16:08 +08:00
{
tags[name] = (new StringTag(name,value));
}
2026-03-01 12:16:08 +08:00
void putByteArray(const wstring &name, byteArray value)
2026-03-01 12:16:08 +08:00
{
tags[name] = (new ByteArrayTag(name,value));
}
2026-03-01 12:16:08 +08:00
void putIntArray(const wstring &name, intArray value)
2026-03-01 12:16:08 +08:00
{
tags[name] = (new IntArrayTag(name, value));
}
void putCompound(const wstring &name, CompoundTag *value)
2026-03-01 12:16:08 +08:00
{
tags[name] = value->setName( wstring( name ) );
}
2026-03-01 12:16:08 +08:00
void putBoolean(const wstring &name, bool val)
2026-03-01 12:16:08 +08:00
{
putByte(name, val?(byte)1:0);
}
2026-03-01 12:16:08 +08:00
Tag *get(const wstring &name)
2026-03-01 12:16:08 +08:00
{
AUTO_VAR(it, tags.find(name));
if(it != tags.end()) return it->second;
return NULL;
}
bool contains(const wstring &name)
2026-03-01 12:16:08 +08:00
{
return tags.find(name) != tags.end();
}
2026-03-01 12:16:08 +08:00
byte getByte(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return (byte)0;
return ((ByteTag *) tags[name])->data;
}
2026-03-01 12:16:08 +08:00
short getShort(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return (short)0;
return ((ShortTag *) tags[name])->data;
}
2026-03-01 12:16:08 +08:00
int getInt(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return (int)0;
return ((IntTag *) tags[name])->data;
}
2026-03-01 12:16:08 +08:00
__int64 getLong(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return (__int64)0;
return ((LongTag *) tags[name])->data;
}
2026-03-01 12:16:08 +08:00
float getFloat(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return (float)0;
return ((FloatTag *) tags[name])->data;
}
2026-03-01 12:16:08 +08:00
double getDouble(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return (double)0;
return ((DoubleTag *) tags[name])->data;
}
2026-03-01 12:16:08 +08:00
wstring getString(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return wstring( L"" );
return ((StringTag *) tags[name])->data;
}
2026-03-01 12:16:08 +08:00
byteArray getByteArray(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return byteArray();
return ((ByteArrayTag *) tags[name])->data;
}
2026-03-01 12:16:08 +08:00
intArray getIntArray(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return intArray();
2026-03-01 12:16:08 +08:00
return ((IntArrayTag *) tags[name])->data;
}
CompoundTag *getCompound(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return new CompoundTag(name);
return (CompoundTag *) tags[name];
}
2026-03-01 12:16:08 +08:00
ListTag<Tag> *getList(const wstring &name)
2026-03-01 12:16:08 +08:00
{
if (tags.find(name) == tags.end()) return new ListTag<Tag>(name);
return (ListTag<Tag> *) tags[name];
}
2026-03-01 12:16:08 +08:00
bool getBoolean(const wstring &string)
2026-03-01 12:16:08 +08:00
{
return getByte(string)!=0;
}
2026-03-01 12:16:08 +08:00
void remove(const wstring &name)
{
AUTO_VAR(it, tags.find(name));
if(it != tags.end()) tags.erase(it);
//tags.remove(name);
}
wstring toString()
2026-03-01 12:16:08 +08:00
{
static const int bufSize = 32;
static wchar_t buf[bufSize];
swprintf(buf,bufSize,L"%d entries",tags.size());
return wstring( buf );
}
2026-03-01 12:16:08 +08:00
void print(char *prefix, ostream out)
2026-03-01 12:16:08 +08:00
{
/*
Tag::print(prefix, out);
2026-03-01 12:16:08 +08:00
out << prefix << "{" << endl;
char *newPrefix = new char[ strlen(prefix) + 4 ];
strcpy( newPrefix, prefix);
strcat( newPrefix, " ");
2026-03-01 12:16:08 +08:00
AUTO_VAR(itEnd, tags.end());
for( unordered_map<string, Tag *>::iterator it = tags.begin(); it != itEnd; it++ )
{
it->second->print(newPrefix, out);
2026-03-01 12:16:08 +08:00
}
delete[] newPrefix;
out << prefix << "}" << endl;
*/
}
2026-03-01 12:16:08 +08:00
bool isEmpty()
2026-03-01 12:16:08 +08:00
{
return tags.empty();
}
2026-03-01 12:16:08 +08:00
virtual ~CompoundTag()
{
AUTO_VAR(itEnd, tags.end());
for( AUTO_VAR(it, tags.begin()); it != itEnd; it++ )
{
delete it->second;
}
}
Tag *copy()
{
CompoundTag *tag = new CompoundTag(getName());
2026-03-01 12:16:08 +08:00
AUTO_VAR(itEnd, tags.end());
for( AUTO_VAR(it, tags.begin()); it != itEnd; it++ )
{
2026-03-01 12:16:08 +08:00
tag->put((wchar_t *)it->first.c_str(), it->second->copy());
}
return tag;
}
bool equals(Tag *obj)
{
if (Tag::equals(obj))
{
CompoundTag *o = (CompoundTag *) obj;
if(tags.size() == o->tags.size())
{
bool equal = true;
AUTO_VAR(itEnd, tags.end());
for( AUTO_VAR(it, tags.begin()); it != itEnd; it++ )
{
AUTO_VAR(itFind, o->tags.find(it->first));
if(itFind == o->tags.end() || !it->second->equals(itFind->second) )
{
equal = false;
break;
}
}
return equal;
//return tags.entrySet().equals(o.tags.entrySet());
}
}
return false;
}
};