diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapter.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapter.java index 957fdf1e32..611e4bf507 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapter.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapter.java @@ -15,10 +15,18 @@ public record DataComponentAdapter( ) { static final Function API_TO_UNIT_CONVERTER = $ -> Unit.INSTANCE; + static final Function API_TO_UNIMPLEMENTED_CONVERTER = $ -> { + throw new UnsupportedOperationException("Cannot convert an API value to an unimplemented type"); + }; + public boolean isValued() { return this.apiToVanilla != API_TO_UNIT_CONVERTER; } + public boolean isUnimplemented() { + return this.apiToVanilla == API_TO_UNIMPLEMENTED_CONVERTER; + } + public NMS toVanilla(final API value) { final NMS nms = this.apiToVanilla.apply(value); if (this.codecValidation) { diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java index 7675588202..b3c201527b 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/DataComponentAdapters.java @@ -63,6 +63,10 @@ public final class DataComponentAdapters { throw new UnsupportedOperationException("Cannot convert the Unit type to an API value"); }; + static final Function UNIMPLEMENTED_TO_API_CONVERTER = $ -> { + throw new UnsupportedOperationException("Cannot convert the an unimplemented type to an API value"); + }; + static final Map>, DataComponentAdapter> ADAPTERS = new HashMap<>(); public static void bootstrap() { @@ -136,10 +140,9 @@ public final class DataComponentAdapters { // register(DataComponents.LOCK, PaperLockCode::new); register(DataComponents.CONTAINER_LOOT, PaperSeededContainerLoot::new); - // TODO: REMOVE THIS... we want to build the PR... so lets just make things UNTYPED! for (final Map.Entry>, DataComponentType> componentType : BuiltInRegistries.DATA_COMPONENT_TYPE.entrySet()) { if (!ADAPTERS.containsKey(componentType.getKey())) { - registerUntyped((DataComponentType) componentType.getValue()); + registerUnimplemented(componentType.getValue()); } } } @@ -152,6 +155,10 @@ public final class DataComponentAdapters { registerInternal(type, Function.identity(), Function.identity(), true); } + public static void registerUnimplemented(final DataComponentType type) { + registerInternal(type, UNIMPLEMENTED_TO_API_CONVERTER, DataComponentAdapter.API_TO_UNIMPLEMENTED_CONVERTER, false); + } + private static > void register(final DataComponentType type, final Function vanillaToApi) { registerInternal(type, vanillaToApi, Handleable::getHandle, false); } diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/PaperDataComponentType.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/PaperDataComponentType.java index 7ec9b765f0..e8fc0dda83 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/PaperDataComponentType.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/PaperDataComponentType.java @@ -77,7 +77,9 @@ public abstract class PaperDataComponentType implements DataComponentTyp if (adapter == null) { throw new IllegalArgumentException("No adapter found for " + key); } - if (adapter.isValued()) { + if (adapter.isUnimplemented()) { + return new Unimplemented<>(key, type, adapter); + } else if (adapter.isValued()) { return new ValuedImpl<>(key, type, adapter); } else { return new NonValuedImpl<>(key, type, adapter); @@ -105,4 +107,15 @@ public abstract class PaperDataComponentType implements DataComponentTyp super(key, type, adapter); } } + + public static final class Unimplemented extends PaperDataComponentType { + + public Unimplemented( + final NamespacedKey key, + final net.minecraft.core.component.DataComponentType type, + final DataComponentAdapter adapter + ) { + super(key, type, adapter); + } + } }