diff --git a/common/src/main/java/io/github/gaming32/bingo/client/icons/DefaultIconRenderers.java b/common/src/main/java/io/github/gaming32/bingo/client/icons/DefaultIconRenderers.java index e3834660..35034cb6 100644 --- a/common/src/main/java/io/github/gaming32/bingo/client/icons/DefaultIconRenderers.java +++ b/common/src/main/java/io/github/gaming32/bingo/client/icons/DefaultIconRenderers.java @@ -14,5 +14,6 @@ public static void setup() { IconRenderers.register(GoalIconType.INSTRUMENT_CYCLE, new InstrumentCycleIconRenderer()); IconRenderers.register(GoalIconType.ITEM, (icon, graphics, x, y) -> graphics.renderFakeItem(icon.item(), x, y)); IconRenderers.register(GoalIconType.ITEM_TAG_CYCLE, new ItemTagCycleIconRenderer()); + IconRenderers.register(GoalIconType.SPRITE, new SpriteIconRenderer()); } } diff --git a/common/src/main/java/io/github/gaming32/bingo/client/icons/SpriteIconRenderer.java b/common/src/main/java/io/github/gaming32/bingo/client/icons/SpriteIconRenderer.java new file mode 100644 index 00000000..51a87705 --- /dev/null +++ b/common/src/main/java/io/github/gaming32/bingo/client/icons/SpriteIconRenderer.java @@ -0,0 +1,13 @@ +package io.github.gaming32.bingo.client.icons; + +import io.github.gaming32.bingo.data.icons.SpriteIcon; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.RenderType; + +public class SpriteIconRenderer implements IconRenderer { + @Override + public void render(SpriteIcon icon, GuiGraphics graphics, int x, int y) { + final var sprite = icon.sprite().withPrefix("bingo/icon/"); + graphics.blitSprite(RenderType::guiTextured, sprite, x, y, 16, 16); + } +} diff --git a/common/src/main/java/io/github/gaming32/bingo/data/icons/GoalIconType.java b/common/src/main/java/io/github/gaming32/bingo/data/icons/GoalIconType.java index c8e429ae..6a39ab87 100644 --- a/common/src/main/java/io/github/gaming32/bingo/data/icons/GoalIconType.java +++ b/common/src/main/java/io/github/gaming32/bingo/data/icons/GoalIconType.java @@ -24,6 +24,7 @@ public interface GoalIconType { RegistryValue> INSTRUMENT_CYCLE = register("instrument_cycle", InstrumentCycleIcon.CODEC, InstrumentCycleIcon.STREAM_CODEC); RegistryValue> ITEM = register("item", ItemIcon.CODEC, ItemIcon.STREAM_CODEC); RegistryValue> ITEM_TAG_CYCLE = register("item_tag_cycle", ItemTagCycleIcon.CODEC, ItemTagCycleIcon.STREAM_CODEC); + RegistryValue> SPRITE = register("sprite", SpriteIcon.CODEC, SpriteIcon.STREAM_CODEC); MapCodec codec(); diff --git a/common/src/main/java/io/github/gaming32/bingo/data/icons/SpriteIcon.java b/common/src/main/java/io/github/gaming32/bingo/data/icons/SpriteIcon.java new file mode 100644 index 00000000..859cb109 --- /dev/null +++ b/common/src/main/java/io/github/gaming32/bingo/data/icons/SpriteIcon.java @@ -0,0 +1,33 @@ +package io.github.gaming32.bingo.data.icons; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import io.github.gaming32.bingo.util.BingoCodecs; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +public record SpriteIcon(ResourceLocation sprite, ItemStack fallback) implements GoalIcon.WithoutContext { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group( + ResourceLocation.CODEC.fieldOf("sprite").forGetter(SpriteIcon::sprite), + BingoCodecs.LENIENT_ITEM_STACK.fieldOf("fallback").forGetter(SpriteIcon::fallback) + ).apply(instance, SpriteIcon::new) + ); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ResourceLocation.STREAM_CODEC, SpriteIcon::sprite, + ItemStack.STREAM_CODEC, SpriteIcon::fallback, + SpriteIcon::new + ); + + @Override + public ItemStack getFallback() { + return fallback; + } + + @Override + public GoalIconType type() { + return GoalIconType.SPRITE.get(); + } +}