aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/utils/datafixer
diff options
context:
space:
mode:
authorAaron <51387595+AzureAaron@users.noreply.github.com>2024-05-04 19:14:06 -0400
committerGitHub <noreply@github.com>2024-05-04 19:14:06 -0400
commit4a4234d7c9d4f038d4fa418fb15ef24ce3fcc501 (patch)
tree6e87c6b67aabeb82dbe075d68c16b5492ff92c9b /src/main/java/de/hysky/skyblocker/utils/datafixer
parented0489539902d77595625aaa3bca4e328e1f7e88 (diff)
parentf7b13895a4605e1d22e2c00e7b62c7365902d1aa (diff)
downloadSkyblocker-4a4234d7c9d4f038d4fa418fb15ef24ce3fcc501.tar.gz
Skyblocker-4a4234d7c9d4f038d4fa418fb15ef24ce3fcc501.tar.bz2
Skyblocker-4a4234d7c9d4f038d4fa418fb15ef24ce3fcc501.zip
Merge pull request #669 from SkyblockerMod/1.20.5
1.20.5 & 1.20.6
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/utils/datafixer')
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java b/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java
new file mode 100644
index 00000000..3543a2f1
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/utils/datafixer/ItemStackComponentizationFixer.java
@@ -0,0 +1,82 @@
+package de.hysky.skyblocker.utils.datafixer;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import com.mojang.brigadier.StringReader;
+import com.mojang.serialization.Dynamic;
+
+import net.minecraft.command.argument.ItemStringReader;
+import net.minecraft.command.argument.ItemStringReader.ItemResult;
+import net.minecraft.component.DataComponentType;
+import net.minecraft.datafixer.Schemas;
+import net.minecraft.datafixer.TypeReferences;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtElement;
+import net.minecraft.nbt.NbtOps;
+import net.minecraft.registry.DynamicRegistryManager;
+import net.minecraft.registry.Registries;
+import net.minecraft.registry.RegistryOps;
+import net.minecraft.util.Identifier;
+
+/**
+ * Contains a data fixer to convert legacy item NBT to the new components system, among other fixers related to the item components system.
+ *
+ * @see net.minecraft.datafixer.fix.ItemStackComponentizationFix
+ */
+public class ItemStackComponentizationFixer {
+ private static final int ITEM_NBT_DATA_VERSION = 3817;
+ private static final int ITEM_COMPONENTS_DATA_VERSION = 3825;
+ private static final DynamicRegistryManager REGISTRY_MANAGER = new DynamicRegistryManager.ImmutableImpl(List.of(Registries.ITEM, Registries.DATA_COMPONENT_TYPE));
+
+ public static ItemStack fixUpItem(NbtCompound nbt) {
+ Dynamic<NbtElement> dynamic = Schemas.getFixer().update(TypeReferences.ITEM_STACK, new Dynamic<>(NbtOps.INSTANCE, nbt), ITEM_NBT_DATA_VERSION, ITEM_COMPONENTS_DATA_VERSION);
+
+ return ItemStack.CODEC.parse(dynamic).getOrThrow();
+ }
+
+ /**
+ * Modified version of {@link net.minecraft.command.argument.ItemStackArgument#asString(net.minecraft.registry.RegistryWrapper.WrapperLookup)} to only care about changed components.
+ *
+ * @return The {@link ItemStack}'s components as a string which is in the format that the {@code /give} command accepts.
+ */
+ public static String componentsAsString(ItemStack stack) {
+ RegistryOps<NbtElement> nbtRegistryOps = REGISTRY_MANAGER.getOps(NbtOps.INSTANCE);
+
+ return Arrays.toString(stack.getComponentChanges().entrySet().stream().map(entry -> {
+ @SuppressWarnings("unchecked")
+ DataComponentType<Object> dataComponentType = (DataComponentType<Object>) entry.getKey();
+ Identifier componentId = Registries.DATA_COMPONENT_TYPE.getId(dataComponentType);
+ Optional<NbtElement> encodedComponent = dataComponentType.getCodec().encodeStart(nbtRegistryOps, entry.getValue().orElseThrow()).result();
+
+ if (componentId == null || encodedComponent.isEmpty()) {
+ return null;
+ }
+
+ return componentId + "=" + encodedComponent.orElseThrow();
+ }).filter(Objects::nonNull).toArray());
+ }
+
+ /**
+ * Constructs an {@link ItemStack} from an {@code itemId}, with item components in string format as returned by {@link #componentsAsString(ItemStack)}, and with a specified stack count.
+ *
+ * @return an {@link ItemStack} or {@link ItemStack#EMPTY} if there was an exception thrown.
+ */
+ public static ItemStack fromComponentsString(String itemId, int count, String componentsString) {
+ ItemStringReader reader = new ItemStringReader(REGISTRY_MANAGER);
+
+ try {
+ ItemResult result = reader.consume(new StringReader(itemId + componentsString));
+ ItemStack stack = new ItemStack(result.item(), count);
+
+ stack.applyComponentsFrom(result.components());
+
+ return stack;
+ } catch (Exception ignored) {}
+
+ return ItemStack.EMPTY;
+ }
+}