From 682a9b7c6329d22418a2ed4e9772b42f8b1439d1 Mon Sep 17 00:00:00 2001
From: modmuss50 <modmuss50@gmail.com>
Date: Fri, 11 Feb 2022 18:14:32 +0000
Subject: [PATCH] Fix crash when remapping registries with unused raw ids.

---
 .../fabric/mixin/registry/sync/MixinIdRegistry.java  | 12 ++++++++----
 .../fabric/test/registry/sync/RegistrySyncTest.java  |  3 +++
 gradle.properties                                    |  6 +++---
 3 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MixinIdRegistry.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MixinIdRegistry.java
index bfeeea584..3e2803194 100644
--- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MixinIdRegistry.java
+++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MixinIdRegistry.java
@@ -310,13 +310,17 @@ public abstract class MixinIdRegistry<T> extends Registry<T> implements Remappab
 
 		Int2IntMap idMap = new Int2IntOpenHashMap();
 
-		for (RegistryEntry.Reference<T> o : rawIdToEntry) {
-			Identifier id = getId(o.value());
-			int rid = getRawId(o.value());
+		for (int i = 0; i < rawIdToEntry.size(); i++) {
+			RegistryEntry.Reference<T> reference = rawIdToEntry.get(i);
+
+			// Unused id, skip
+			if (reference == null) continue;
+
+			Identifier id = reference.registryKey().getValue();
 
 			// see above note
 			if (remoteIndexedEntries.containsKey(id)) {
-				idMap.put(rid, remoteIndexedEntries.getInt(id));
+				idMap.put(i, remoteIndexedEntries.getInt(id));
 			}
 		}
 
diff --git a/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java b/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java
index ddf38cf01..4a78ec75b 100644
--- a/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java
+++ b/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java
@@ -114,6 +114,9 @@ public class RegistrySyncTest implements ModInitializer {
 				System.out.println(id);
 			});
 		});
+
+		// Vanilla status effects don't have an entry for the int id 0, test we can handle this.
+		RegistryAttributeHolder.get(Registry.STATUS_EFFECT).addAttribute(RegistryAttribute.MODDED);
 	}
 
 	private static void registerBlocks(String namespace, int amount, int startingId) {
diff --git a/gradle.properties b/gradle.properties
index 64a8c750d..76db2308e 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,6 +1,6 @@
 org.gradle.jvmargs=-Xmx2560M
 
-version=0.47.0
+version=0.47.1
 minecraft_version=22w06a
 yarn_version=+build.8
 loader_version=0.13.2
@@ -17,7 +17,7 @@ fabric-commands-v0-version=0.2.7
 fabric-containers-v0-version=0.1.20
 fabric-content-registries-v0-version=2.0.0
 fabric-crash-report-info-v1-version=0.1.10
-fabric-data-generation-api-v1-version=2.0.0
+fabric-data-generation-api-v1-version=2.0.1
 fabric-dimensions-v1-version=2.1.12
 fabric-entity-events-v1-version=1.4.7
 fabric-events-interaction-v0-version=0.4.18
@@ -36,7 +36,7 @@ fabric-networking-api-v1-version=1.0.20
 fabric-networking-v0-version=0.3.7
 fabric-object-builder-api-v1-version=2.0.0
 fabric-particles-v1-version=0.2.11
-fabric-registry-sync-v0-version=0.9.3
+fabric-registry-sync-v0-version=0.9.4
 fabric-renderer-api-v1-version=0.4.12
 fabric-renderer-indigo-version=0.4.16
 fabric-renderer-registries-v1-version=3.2.10