From 862f3bb6b92bfe284d2707b5f8a0b44309c0e382 Mon Sep 17 00:00:00 2001 From: Frank Date: Sat, 7 Aug 2021 03:48:30 +0200 Subject: [PATCH] Fix ReceipBook for players --- .../ru/bclib/api/datafixer/DataFixerAPI.java | 51 +++++++++++++++---- .../bclib/api/datafixer/MigrationProfile.java | 17 +++++-- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/bclib/api/datafixer/DataFixerAPI.java b/src/main/java/ru/bclib/api/datafixer/DataFixerAPI.java index 39845952..52a78055 100644 --- a/src/main/java/ru/bclib/api/datafixer/DataFixerAPI.java +++ b/src/main/java/ru/bclib/api/datafixer/DataFixerAPI.java @@ -10,8 +10,9 @@ import net.minecraft.client.gui.screens.worldselection.EditWorldScreen; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.ProgressListener; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.storage.RegionFile; @@ -322,12 +323,42 @@ public class DataFixerAPI { private static void fixPlayerNbt(CompoundTag player, boolean[] changed, MigrationProfile data) { //Checking Inventory - ListTag inventory = player.getList("Inventory", 10); + ListTag inventory = player.getList("Inventory", Tag.TAG_COMPOUND); fixItemArrayWithID(inventory, changed, data, true); //Checking EnderChest - ListTag enderitems = player.getList("EnderItems", 10); + ListTag enderitems = player.getList("EnderItems", Tag.TAG_COMPOUND); fixItemArrayWithID(enderitems, changed, data, true); + + //Checking ReceipBook + if (player.contains("recipeBook")) { + CompoundTag recipeBook = player.getCompound("recipeBook"); + changed[0] |= fixStringIDList(recipeBook, "recipes", data); + changed[0] |= fixStringIDList(recipeBook, "toBeDisplayed", data); + } + } + + static boolean fixStringIDList(CompoundTag root, String name, MigrationProfile data) { + boolean _changed = false; + if (root.contains(name)) { + ListTag items = root.getList(name, Tag.TAG_STRING); + ListTag newItems = new ListTag(); + + for (Tag tag : items) { + final StringTag str = (StringTag)tag; + final String replace = data.replaceStringFromIDs(str.getAsString()); + if (replace!=null) { + _changed = true; + newItems.add(StringTag.valueOf(replace)); + } else { + newItems.add(tag); + } + } + if (_changed) { + root.put(name, newItems); + } + } + return _changed; } private static void fixRegion(MigrationProfile data, State state, File file) { @@ -350,18 +381,18 @@ public class DataFixerAPI { //Checking TileEntities ListTag tileEntities = root.getCompound("Level") - .getList("TileEntities", 10); + .getList("TileEntities", Tag.TAG_COMPOUND); fixItemArrayWithID(tileEntities, changed, data, true); //Checking Entities - ListTag entities = root.getList("Entities", 10); + ListTag entities = root.getList("Entities", Tag.TAG_COMPOUND); fixItemArrayWithID(entities, changed, data, true); //Checking Block Palette ListTag sections = root.getCompound("Level") - .getList("Sections", 10); + .getList("Sections", Tag.TAG_COMPOUND); sections.forEach((tag) -> { - ListTag palette = ((CompoundTag) tag).getList("Palette", 10); + ListTag palette = ((CompoundTag) tag).getList("Palette", Tag.TAG_COMPOUND); palette.forEach((blockTag) -> { CompoundTag blockTagCompound = ((CompoundTag) blockTag); changed[0] |= data.replaceStringFromIDs(blockTagCompound, "Name"); @@ -413,10 +444,10 @@ public class DataFixerAPI { } if (recursive && tag.contains("Items")) { - fixItemArrayWithID(tag.getList("Items", 10), changed, data, true); + fixItemArrayWithID(tag.getList("Items", Tag.TAG_COMPOUND), changed, data, true); } if (recursive && tag.contains("Inventory")) { - ListTag inventory = tag.getList("Inventory", 10); + ListTag inventory = tag.getList("Inventory", Tag.TAG_COMPOUND); fixItemArrayWithID(inventory, changed, data, true); } if (tag.contains("tag")) { @@ -424,7 +455,7 @@ public class DataFixerAPI { if (entityTag.contains("BlockEntityTag")){ CompoundTag blockEntityTag = (CompoundTag)entityTag.get("BlockEntityTag"); fixID(blockEntityTag, changed, data, recursive); - /*ListTag items = blockEntityTag.getList("Items", 10); + /*ListTag items = blockEntityTag.getList("Items", Tag.TAG_COMPOUND); fixItemArrayWithID(items, changed, data, recursive);*/ } } diff --git a/src/main/java/ru/bclib/api/datafixer/MigrationProfile.java b/src/main/java/ru/bclib/api/datafixer/MigrationProfile.java index 8ee2416a..e0466207 100644 --- a/src/main/java/ru/bclib/api/datafixer/MigrationProfile.java +++ b/src/main/java/ru/bclib/api/datafixer/MigrationProfile.java @@ -83,10 +83,15 @@ public class MigrationProfile { public boolean hasAnyFixes() { return idReplacements.size() > 0 || levelPatchers.size() > 0 || worldDataPatchers.size() > 0; } + + public String replaceStringFromIDs(@NotNull String val) { + final String replace = idReplacements.get(val); + return replace; + } public boolean replaceStringFromIDs(@NotNull CompoundTag tag, @NotNull String key) { if (!tag.contains(key)) return false; - + final String val = tag.getString(key); final String replace = idReplacements.get(val); @@ -116,7 +121,7 @@ public class MigrationProfile { if (tag.contains(part)) { final byte type = tag.getTagType(part); if (type == Tag.TAG_LIST) { - ListTag list = tag.getList(part, 10); + ListTag list = tag.getList(part, Tag.TAG_COMPOUND); return replaceIDatPath(list, parts, i); } else if (type == Tag.TAG_COMPOUND) { tag = tag.getCompound(part); @@ -130,9 +135,13 @@ public class MigrationProfile { final String key = parts[parts.length-1]; final byte type = tag.getTagType(key); if (type == Tag.TAG_LIST) { - final ListTag list = tag.getList(key, 10); + final ListTag list = tag.getList(key, Tag.TAG_COMPOUND); final boolean[] _changed = {false}; - DataFixerAPI.fixItemArrayWithID(list, _changed, this, true); + if (list.size()==0) { + _changed[0] = DataFixerAPI.fixStringIDList(tag, key, this); + } else { + DataFixerAPI.fixItemArrayWithID(list, _changed, this, true); + } return _changed[0]; } else if (type == Tag.TAG_STRING) { return replaceStringFromIDs(tag, key);