|
| 1 | +package kr.toxicity.libraries.datacomponent.nms.v1_21_R1; |
| 2 | + |
| 3 | +import com.google.gson.JsonArray; |
| 4 | +import com.google.gson.JsonElement; |
| 5 | +import com.google.gson.JsonObject; |
| 6 | +import com.google.gson.JsonPrimitive; |
| 7 | +import com.mojang.serialization.Codec; |
| 8 | +import com.mojang.serialization.JsonOps; |
| 9 | +import lombok.RequiredArgsConstructor; |
| 10 | +import net.minecraft.core.RegistryAccess; |
| 11 | +import net.minecraft.core.registries.BuiltInRegistries; |
| 12 | +import net.minecraft.network.chat.Component; |
| 13 | +import net.minecraft.network.chat.ComponentSerialization; |
| 14 | +import net.minecraft.network.chat.contents.PlainTextContents; |
| 15 | +import net.minecraft.resources.RegistryOps; |
| 16 | +import net.minecraft.resources.ResourceLocation; |
| 17 | +import net.minecraft.util.Unit; |
| 18 | +import net.minecraft.world.food.FoodProperties; |
| 19 | +import net.minecraft.world.item.AdventureModePredicate; |
| 20 | +import net.minecraft.world.item.Rarity; |
| 21 | +import net.minecraft.world.item.alchemy.PotionContents; |
| 22 | +import net.minecraft.world.item.armortrim.ArmorTrim; |
| 23 | +import net.minecraft.world.item.component.*; |
| 24 | +import net.minecraft.world.level.saveddata.maps.MapId; |
| 25 | +import org.jetbrains.annotations.NotNull; |
| 26 | + |
| 27 | +import java.util.function.Function; |
| 28 | + |
| 29 | +@RequiredArgsConstructor |
| 30 | +final class CodecImpl<T> implements kr.toxicity.libraries.datacomponent.api.Codec<T> { |
| 31 | + |
| 32 | + private static final RegistryOps<JsonElement> OPS = RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY).createSerializationContext(JsonOps.INSTANCE); |
| 33 | + |
| 34 | + static final CodecImpl<Component> COMPONENT = of(ComponentSerialization.CODEC, t -> t.stream().count() == 1 && t.getStyle().isEmpty() && t.getContents() instanceof PlainTextContents textContents ? new JsonPrimitive(textContents.text()) : new JsonObject()); |
| 35 | + static final CodecImpl<ItemLore> ITEM_LORE = of(ItemLore.CODEC, t -> new JsonArray()); |
| 36 | + static final CodecImpl<Rarity> RARITY = of(Rarity.CODEC, t -> new JsonPrimitive(t.name().toLowerCase())); |
| 37 | + static final CodecImpl<Unit> UNIT = of(Codec.unit(Unit.INSTANCE), t -> new JsonPrimitive(true)); |
| 38 | + static final CodecImpl<AdventureModePredicate> ADVENTURE_MODE_PREDICATE = of(AdventureModePredicate.CODEC, t -> new JsonObject()); |
| 39 | + static final CodecImpl<Tool> TOOL = of(Tool.CODEC, t -> new JsonObject()); |
| 40 | + static final CodecImpl<DyedItemColor> DYED_ITEM_COLOR = of(DyedItemColor.CODEC, t -> new JsonObject()); |
| 41 | + static final CodecImpl<MapItemColor> MAP_ITEM_COLOR = of(MapItemColor.CODEC, t -> new JsonPrimitive(t.rgb())); |
| 42 | + static final CodecImpl<MapId> MAP_ID = of(MapId.CODEC, t -> new JsonPrimitive(t.id())); |
| 43 | + static final CodecImpl<BundleContents> BUNDLE_CONTENTS = of(BundleContents.CODEC, t -> new JsonArray()); |
| 44 | + static final CodecImpl<PotionContents> POTION_CONTENTS = of(PotionContents.CODEC, t -> new JsonObject()); |
| 45 | + static final CodecImpl<SuspiciousStewEffects> SUSPICIOUS_STEW_EFFECTS = of(SuspiciousStewEffects.CODEC, t -> new JsonArray()); |
| 46 | + static final CodecImpl<WritableBookContent> WRITABLE_BOOK_CONTENT = of(WritableBookContent.CODEC, t -> new JsonObject()); |
| 47 | + static final CodecImpl<WrittenBookContent> WRITTEN_BOOK_CONTENT = of(WrittenBookContent.CODEC, t -> new JsonObject()); |
| 48 | + static final CodecImpl<BlockItemStateProperties> BLOCK_STATE = of(BlockItemStateProperties.CODEC, t -> new JsonObject()); |
| 49 | + static final CodecImpl<FoodProperties> FOOD = of(FoodProperties.DIRECT_CODEC, t -> new JsonObject()); |
| 50 | + static final CodecImpl<ArmorTrim> TRIM = of(ArmorTrim.CODEC, t -> new JsonObject()); |
| 51 | + static final CodecImpl<CustomModelData> CUSTOM_MODEL_DATA = of(CustomModelData.CODEC, t -> new JsonPrimitive(t.value())); |
| 52 | + static final CodecImpl<CustomData> CUSTOM_DATA = of(CustomData.CODEC, t -> new JsonObject()); |
| 53 | + static final CodecImpl<ResourceLocation> RESOURCE_LOCATION = of(ResourceLocation.CODEC, t -> new JsonPrimitive(t.toString())); |
| 54 | + |
| 55 | + private static <T> @NotNull CodecImpl<T> of(@NotNull Codec<T> codec, Function<T, JsonElement> function) { |
| 56 | + return new CodecImpl<>( |
| 57 | + codec, |
| 58 | + function |
| 59 | + ); |
| 60 | + } |
| 61 | + |
| 62 | + private final Codec<T> codec; |
| 63 | + private final Function<T, JsonElement> function; |
| 64 | + |
| 65 | + @Override |
| 66 | + public @NotNull JsonElement encode(@NotNull T t) { |
| 67 | + var element = function.apply(t); |
| 68 | + return element instanceof JsonPrimitive ? element : codec.encode(t, OPS, element).getOrThrow(); |
| 69 | + } |
| 70 | + |
| 71 | + @Override |
| 72 | + public @NotNull T decode(@NotNull JsonElement t) { |
| 73 | + return codec.decode(OPS, t).getOrThrow().getFirst(); |
| 74 | + } |
| 75 | +} |
0 commit comments