Skip to content

Commit

Permalink
use namespace of datapack
Browse files Browse the repository at this point in the history
instead of description which might be just lengthy text
  • Loading branch information
EtlamGit authored and = committed Nov 15, 2023
1 parent 7c4b10b commit 66d581f
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 49 deletions.
80 changes: 38 additions & 42 deletions worldinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ void WorldInfo::clear() {
}


// used to generate menu File->Open World
// parse only basic stuff in the world folder:
// does it look like a Minecraft world
// does the world have a custom name
/// used to generate menu File->Open World
/// parse only basic stuff in the world folder:
/// does it look like a Minecraft world
/// does the world have a custom name
bool WorldInfo::parseWorldFolder(const QDir &path)
{
clear();
Expand All @@ -62,8 +62,8 @@ bool WorldInfo::parseWorldFolder(const QDir &path)
}


// used when opening a world
// parse more stuff relevant later for rendering
/// used when opening a world
/// parse more stuff relevant later for rendering
bool WorldInfo::parseWorldInfo()
{
NBT level(folder.filePath("level.dat"));
Expand Down Expand Up @@ -141,13 +141,12 @@ void WorldInfo::parseDatapacks(const Tag * data)
ZipReader zip(zip_file);
if (zip.open()) {
for (auto & file: zip.getFileList()) {

// name of datapack
// -> ./pack.mcmeta
if (file == "pack.mcmeta") {
QJsonDocument json_doc = QJsonDocument::fromJson(zip.get(file));
if (!json_doc.isNull())
parsePackMcmeta(json_doc, zip_file, true, true);
// determine name of datapack
// -> ./data/<namespace>/*
if (file.startsWith("data/")) {
QStringList folders(file.split("/"));
if (folders.length() > 2) // only when 2 subfolders
parseDatapackNamespace(folders[1], zip_file, true, true);
}

// custom Dimensions
Expand All @@ -169,15 +168,12 @@ void WorldInfo::parseDatapacks(const Tag * data)
{
QStringRef pack_name(&dp, 5, dp.size()-5);
QString pack_path(folder.path() + "/datapacks/" + pack_name + "/");
// name of datapack
// -> ./pack.mcmeta
QFile f(pack_path + "pack.mcmeta");
if (f.open(QIODevice::ReadOnly)) {
QByteArray data = f.readAll();
f.close();
QJsonDocument json_doc = QJsonDocument::fromJson(data);
if (!json_doc.isNull())
parsePackMcmeta(json_doc, pack_path, true, false);
// determine name of datapack
// -> ./data/<namespace>/*
QDirIterator data(pack_path + "data", QDir::Dirs | QDir::NoDotAndDotDot);
while (data.hasNext()) {
data.next();
parseDatapackNamespace(data.fileName(), pack_path, true, false);
}

// custom Dimensions
Expand All @@ -190,23 +186,27 @@ void WorldInfo::parseDatapacks(const Tag * data)
}


bool WorldInfo::parsePackMcmeta(const QJsonDocument & json_doc, const QString path, bool enabled, bool zipped)
bool WorldInfo::parseDatapackNamespace(const QString name_space, const QString path, bool enabled, bool zipped)
{
QJsonObject json = json_doc.object();
if (json.contains("pack")) {
QJsonObject pack = json.value("pack").toObject();
if (pack.contains("description")) {
DatapackInfo dp;
dp.name = pack.value("description").toString();
dp.path = path;
dp.enabled = enabled;
dp.zipped = zipped;
// store it in list
datapacks.append(dp);
return true;
// skip default stuff
if (name_space == "minecraft") return false;

// test if already there
if (datapacks.contains(name_space)) {
QMap<QString, DatapackInfo>::const_iterator it = datapacks.constFind(name_space);
for (; it != datapacks.constEnd(); ++it) {
if (it->path == path) return false;
}
}
return false;

// else insert it
DatapackInfo dp;
dp.path = path;
dp.enabled = enabled;
dp.zipped = zipped;
// store it in list
datapacks.insert(name_space, dp);
return true;
}


Expand Down Expand Up @@ -419,11 +419,7 @@ void WorldInfo::changeViewToDimension() {

// datapack stuff

bool WorldInfo::isDatapackEnabled(const QString name) const
bool WorldInfo::isDatapackEnabled(const QString name_space) const
{
for (auto & dp: datapacks) {
if (dp.name == name)
return true;
}
return false;
return datapacks.contains(name_space);
}
12 changes: 5 additions & 7 deletions worldinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,10 @@
class DatapackInfo {
public:
DatapackInfo()
: name("")
, path("")
, enabled(false)
, zipped(false) {}
: path("")
, enabled(false)
, zipped(false) {}

QString name;
QString path;
bool enabled;
bool zipped;
Expand Down Expand Up @@ -67,7 +65,7 @@ class WorldInfo : public QObject
WorldInfo &operator=(const WorldInfo &);

void parseDatapacks(const Tag * data);
bool parsePackMcmeta(const QJsonDocument & json_doc, const QString path, bool enabled, bool zipped);
bool parseDatapackNamespace(const QString name_space, const QString path, bool enabled, bool zipped);
bool parseDimension(const QJsonDocument & json_doc, QString pack_name, QString dim_name);
bool parseDimensionType(DimensionInfo & dim, const QString & dim_type_id);

Expand All @@ -80,7 +78,7 @@ class WorldInfo : public QObject
long long seed;

QList<DimensionInfo> dimensions;
QList<DatapackInfo> datapacks;
QMultiMap<QString, DatapackInfo> datapacks;

// Dimension view menu
void addDimensionToMenu(QDir path, QString dir, QString name, QObject *parent);
Expand Down

0 comments on commit 66d581f

Please sign in to comment.