From 1319e80b00b76e2444efe41b5d18c2a48200f60a Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:24:29 -0400 Subject: [PATCH 1/5] Add scrying lens to Accessories face tag --- .../src/main/resources/data/accessories/tags/item/face.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Common/src/main/resources/data/accessories/tags/item/face.json diff --git a/Common/src/main/resources/data/accessories/tags/item/face.json b/Common/src/main/resources/data/accessories/tags/item/face.json new file mode 100644 index 0000000000..1b39fc552e --- /dev/null +++ b/Common/src/main/resources/data/accessories/tags/item/face.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "hexcasting:lens" + ] +} \ No newline at end of file From 1f731b415b030cf7870b89c2b29d16670360bc40 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:24:51 -0400 Subject: [PATCH 2/5] Make the lens render properly --- .../petrak/hexcasting/interop/HexInterop.java | 4 ++++ .../accessories/LensAccessoryRenderer.java | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 Common/src/main/java/at/petrak/hexcasting/interop/accessories/LensAccessoryRenderer.java diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java b/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java index f0c878373b..d98676dfc9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java @@ -1,11 +1,14 @@ package at.petrak.hexcasting.interop; +import at.petrak.hexcasting.common.lib.HexItems; +import at.petrak.hexcasting.interop.accessories.LensAccessoryRenderer; import at.petrak.hexcasting.interop.inline.InlineHex; import at.petrak.hexcasting.interop.inline.InlineHexClient; import at.petrak.hexcasting.interop.pehkui.PehkuiInterop; import at.petrak.hexcasting.xplat.IClientXplatAbstractions; import at.petrak.hexcasting.xplat.IXplatAbstractions; import at.petrak.hexcasting.xplat.Platform; +import io.wispforest.accessories.api.client.AccessoriesRendererRegistry; import vazkii.patchouli.api.PatchouliAPI; import java.util.List; @@ -39,6 +42,7 @@ public static void init() { public static void clientInit() { IClientXplatAbstractions.INSTANCE.initPlatformSpecific(); InlineHexClient.init(); + AccessoriesRendererRegistry.registerRenderer(HexItems.SCRYING_LENS, LensAccessoryRenderer::new); } private static void initPatchouli() { diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/accessories/LensAccessoryRenderer.java b/Common/src/main/java/at/petrak/hexcasting/interop/accessories/LensAccessoryRenderer.java new file mode 100644 index 0000000000..f66631298b --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/interop/accessories/LensAccessoryRenderer.java @@ -0,0 +1,23 @@ +package at.petrak.hexcasting.interop.accessories; + +import com.mojang.blaze3d.vertex.PoseStack; +import io.wispforest.accessories.api.client.AccessoryRenderer; +import io.wispforest.accessories.api.client.Side; +import io.wispforest.accessories.api.client.SimpleAccessoryRenderer; +import io.wispforest.accessories.api.slot.SlotReference; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; + +public class LensAccessoryRenderer implements SimpleAccessoryRenderer { + @Override + public void align(ItemStack stack, SlotReference reference, EntityModel model, PoseStack matrices) { + if (model instanceof PlayerModel playerModel) { + // Translate and scale to place the lens over the left eye + AccessoryRenderer.transformToFace(matrices, playerModel.head, Side.FRONT); + matrices.translate(0.3, 0, 0); + matrices.scale(0.625f, 0.625f, 0.625f); + } + } +} From ad9d48b3a062553421e5d9e292e15be80f8d7503 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:50:10 -0400 Subject: [PATCH 3/5] Remove sided curio/accessory setup since both sides use accessories now --- .../petrak/hexcasting/interop/HexInterop.java | 23 +++-- .../accessories/AccessoriesApiInterop.java | 3 +- .../accessories/LensAccessoryRenderer.java | 46 ---------- .../fabric/xplat/FabricClientXplatImpl.java | 5 +- .../fabric/xplat/FabricXplatImpl.java | 5 +- .../resources/data/trinkets/entities/hex.json | 8 -- .../data/trinkets/tags/items/head/face.json | 6 -- .../hexcasting/forge/ForgeHexInitializer.java | 8 -- .../forge/cap/ForgeCapabilityHandler.java | 3 - .../interop/curios/CuriosApiInterop.java | 92 ------------------- .../forge/interop/curios/CuriosRenderers.java | 27 ------ .../interop/curios/LensCurioRenderer.java | 55 ----------- .../forge/xplat/ForgeXplatImpl.java | 5 +- .../resources/data/curios/tags/item/head.json | 6 -- 14 files changed, 17 insertions(+), 275 deletions(-) rename {Fabric/src/main/java/at/petrak/hexcasting/fabric => Common/src/main/java/at/petrak/hexcasting}/interop/accessories/AccessoriesApiInterop.java (96%) delete mode 100644 Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/accessories/LensAccessoryRenderer.java delete mode 100644 Fabric/src/main/resources/data/trinkets/entities/hex.json delete mode 100644 Fabric/src/main/resources/data/trinkets/tags/items/head/face.json delete mode 100644 Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosApiInterop.java delete mode 100644 Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosRenderers.java delete mode 100644 Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/LensCurioRenderer.java delete mode 100644 Neoforge/src/main/resources/data/curios/tags/item/head.json diff --git a/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java b/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java index d98676dfc9..9a9cd18b57 100644 --- a/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/HexInterop.java @@ -1,6 +1,7 @@ package at.petrak.hexcasting.interop; import at.petrak.hexcasting.common.lib.HexItems; +import at.petrak.hexcasting.interop.accessories.AccessoriesApiInterop; import at.petrak.hexcasting.interop.accessories.LensAccessoryRenderer; import at.petrak.hexcasting.interop.inline.InlineHex; import at.petrak.hexcasting.interop.inline.InlineHexClient; @@ -8,6 +9,7 @@ import at.petrak.hexcasting.xplat.IClientXplatAbstractions; import at.petrak.hexcasting.xplat.IXplatAbstractions; import at.petrak.hexcasting.xplat.Platform; +import io.wispforest.accessories.api.AccessoriesAPI; import io.wispforest.accessories.api.client.AccessoriesRendererRegistry; import vazkii.patchouli.api.PatchouliAPI; @@ -17,14 +19,7 @@ public class HexInterop { public static final String PATCHOULI_ANY_INTEROP_FLAG = "hexcasting:any_interop"; public static final String PEHKUI_ID = "pehkui"; - - public static final class Forge { - public static final String CURIOS_API_ID = "curios"; - } - - public static final class Fabric { - public static final String ACCESSORIES_API_ID = "accessories"; - } + public static final String ACCESSORIES_ID = "accessories"; public static void init() { initPatchouli(); @@ -33,6 +28,9 @@ public static void init() { if (xplat.isModPresent(PEHKUI_ID)) { PehkuiInterop.init(); } + if (xplat.isModPresent(ACCESSORIES_ID)) { + AccessoriesApiInterop.init(); + } xplat.initPlatformSpecific(); @@ -40,9 +38,14 @@ public static void init() { } public static void clientInit() { - IClientXplatAbstractions.INSTANCE.initPlatformSpecific(); InlineHexClient.init(); - AccessoriesRendererRegistry.registerRenderer(HexItems.SCRYING_LENS, LensAccessoryRenderer::new); + + IXplatAbstractions xplat = IXplatAbstractions.INSTANCE; + if (xplat.isModPresent(ACCESSORIES_ID)) { + AccessoriesApiInterop.clientInit(); + } + + xplat.initPlatformSpecific(); } private static void initPatchouli() { diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/accessories/AccessoriesApiInterop.java b/Common/src/main/java/at/petrak/hexcasting/interop/accessories/AccessoriesApiInterop.java similarity index 96% rename from Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/accessories/AccessoriesApiInterop.java rename to Common/src/main/java/at/petrak/hexcasting/interop/accessories/AccessoriesApiInterop.java index 2d89b7e612..6f802a204c 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/accessories/AccessoriesApiInterop.java +++ b/Common/src/main/java/at/petrak/hexcasting/interop/accessories/AccessoriesApiInterop.java @@ -1,4 +1,4 @@ -package at.petrak.hexcasting.fabric.interop.accessories; +package at.petrak.hexcasting.interop.accessories; import at.petrak.hexcasting.api.misc.DiscoveryHandlers; import at.petrak.hexcasting.common.items.HexBaubleItem; @@ -15,7 +15,6 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.util.Tuple; import net.minecraft.world.item.ItemStack; import static io.wispforest.accessories.api.client.AccessoriesRendererRegistry.registerRenderer; diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/accessories/LensAccessoryRenderer.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/accessories/LensAccessoryRenderer.java deleted file mode 100644 index 2e80525fe5..0000000000 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/interop/accessories/LensAccessoryRenderer.java +++ /dev/null @@ -1,46 +0,0 @@ -package at.petrak.hexcasting.fabric.interop.accessories; - -import at.petrak.hexcasting.common.lib.HexItems; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Axis; -import io.wispforest.accessories.api.client.AccessoryRenderer; -import io.wispforest.accessories.api.slot.SlotReference; -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.EntityModel; -import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; - -/** - * @author WireSegal - * Created at 9:50 AM on 7/25/22. - */ -public class LensAccessoryRenderer implements AccessoryRenderer { - @Override - @SuppressWarnings("unchecked") - public void render(ItemStack stack, SlotReference slotReference, PoseStack matrices, EntityModel model, MultiBufferSource multiBufferSource, int light, float v, float v1, float v2, float v3, float v4, float v5) { - if (stack.is(HexItems.SCRYING_LENS) && - model instanceof PlayerModel playerModel && slotReference.entity() instanceof Player) { - - // from https://github.com/Creators-of-Create/Create/blob/ee33823ed0b5084af10ed131a1626ce71db4c07e/src/main/java/com/simibubi/create/compat/curios/GogglesCurioRenderer.java - - // Translate and rotate with our head - matrices.pushPose(); - - // Translate and scale to our head - matrices.translate(0, 0, 0.3); - matrices.mulPose(Axis.ZP.rotationDegrees(180.0f)); - matrices.scale(0.625f, 0.625f, 0.625f); - - // Render - var instance = Minecraft.getInstance(); - instance.getItemRenderer().renderStatic(stack, ItemDisplayContext.HEAD, - light, OverlayTexture.NO_OVERLAY, matrices, multiBufferSource, instance.level, 0); - matrices.popPose(); - } - } -} diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricClientXplatImpl.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricClientXplatImpl.java index bd5048cdfe..80811be607 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricClientXplatImpl.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricClientXplatImpl.java @@ -3,7 +3,6 @@ import at.petrak.hexcasting.api.client.ClientCastingStack; import at.petrak.hexcasting.fabric.cc.HexCardinalComponents; import at.petrak.hexcasting.fabric.client.ExtendedTexture; -import at.petrak.hexcasting.fabric.interop.accessories.AccessoriesApiInterop; import at.petrak.hexcasting.interop.HexInterop; import at.petrak.hexcasting.xplat.IClientXplatAbstractions; import at.petrak.hexcasting.xplat.IXplatAbstractions; @@ -44,9 +43,7 @@ public void setRenderLayer(Block block, RenderType type) { @Override public void initPlatformSpecific() { - if (IXplatAbstractions.INSTANCE.isModPresent(HexInterop.Fabric.ACCESSORIES_API_ID)) { - AccessoriesApiInterop.clientInit(); - } + // platform-specific initialization not currently necessary } @Override diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java index 5d18904532..5f218850f8 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/xplat/FabricXplatImpl.java @@ -25,7 +25,6 @@ import at.petrak.hexcasting.common.recipe.ingredient.brainsweep.BrainsweepeeIngredientType; import at.petrak.hexcasting.common.recipe.ingredient.state.StateIngredientType; import at.petrak.hexcasting.fabric.cc.HexCardinalComponents; -import at.petrak.hexcasting.fabric.interop.accessories.AccessoriesApiInterop; import at.petrak.hexcasting.fabric.recipe.FabricUnsealedIngredient; import at.petrak.hexcasting.interop.HexInterop; import at.petrak.hexcasting.interop.pehkui.PehkuiInterop; @@ -109,9 +108,7 @@ public boolean isModPresent(String id) { @Override public void initPlatformSpecific() { - if (this.isModPresent(HexInterop.Fabric.ACCESSORIES_API_ID)) { - AccessoriesApiInterop.init(); - } + // platform-specific initialization not currently necessary } // @Override diff --git a/Fabric/src/main/resources/data/trinkets/entities/hex.json b/Fabric/src/main/resources/data/trinkets/entities/hex.json deleted file mode 100644 index 6f53a620b4..0000000000 --- a/Fabric/src/main/resources/data/trinkets/entities/hex.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "entities": [ - "player" - ], - "slots": [ - "head/face" - ] -} diff --git a/Fabric/src/main/resources/data/trinkets/tags/items/head/face.json b/Fabric/src/main/resources/data/trinkets/tags/items/head/face.json deleted file mode 100644 index 9fae8ae720..0000000000 --- a/Fabric/src/main/resources/data/trinkets/tags/items/head/face.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "replace": false, - "values": [ - "hexcasting:lens" - ] -} diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java index ae0fdf5dd0..9a050651ed 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java @@ -23,8 +23,6 @@ import at.petrak.hexcasting.forge.cap.CapSyncers; import at.petrak.hexcasting.forge.cap.ForgeCapabilityHandler; import at.petrak.hexcasting.forge.datagen.ForgeHexDataGenerators; -import at.petrak.hexcasting.forge.interop.curios.CuriosApiInterop; -import at.petrak.hexcasting.forge.interop.curios.CuriosRenderers; import at.petrak.hexcasting.forge.lib.ForgeHexArgumentTypeRegistry; import at.petrak.hexcasting.forge.lib.ForgeHexAttachments; import at.petrak.hexcasting.forge.lib.ForgeHexIngredientTypes; @@ -290,12 +288,6 @@ private static void initListeners() { e.add(EntityType.PLAYER, HexAttributes.AMBIT_RADIUS); e.add(EntityType.PLAYER, HexAttributes.SENTINEL_RADIUS); }); - - if (ModList.get().isLoaded(HexInterop.Forge.CURIOS_API_ID)) { - modBus.addListener(CuriosApiInterop::onClientSetup); - if(FMLEnvironment.dist == Dist.CLIENT) - modBus.addListener(CuriosRenderers::onLayerRegister); - } } // aaaauughhg diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeCapabilityHandler.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeCapabilityHandler.java index 02b06c5acb..b2b5654173 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeCapabilityHandler.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/cap/ForgeCapabilityHandler.java @@ -12,7 +12,6 @@ import at.petrak.hexcasting.common.lib.HexBlocks; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.forge.cap.adimpl.*; -import at.petrak.hexcasting.forge.interop.curios.CuriosApiInterop; import at.petrak.hexcasting.interop.HexInterop; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.core.registries.BuiltInRegistries; @@ -37,8 +36,6 @@ public static void registerCaps(RegisterCapabilitiesEvent evt) { evt.registerItem(HexCapabilities.Item.VARIANT_ITEM, (stack, ctx) -> new CapItemVariantItem(holder, stack), item); if(item instanceof PigmentItem holder) evt.registerItem(HexCapabilities.Item.COLOR, (stack, ctx) -> new CapItemPigment(holder, stack), item); - if(item instanceof HexBaubleItem && IXplatAbstractions.INSTANCE.isModPresent(HexInterop.Forge.CURIOS_API_ID)) - CuriosApiInterop.registerCap(evt, item); } evt.registerItem( diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosApiInterop.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosApiInterop.java deleted file mode 100644 index fd95a3cbfd..0000000000 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosApiInterop.java +++ /dev/null @@ -1,92 +0,0 @@ -package at.petrak.hexcasting.forge.interop.curios; - -import at.petrak.hexcasting.api.misc.DiscoveryHandlers; -import at.petrak.hexcasting.common.items.HexBaubleItem; -import at.petrak.hexcasting.common.items.magic.ItemCreativeUnlocker; -import com.google.common.collect.Multimap; -import net.minecraft.core.Holder; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; -import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; -import top.theillusivec4.curios.api.CuriosCapability; -import top.theillusivec4.curios.api.SlotContext; -import top.theillusivec4.curios.api.type.capability.ICurio; - -import java.util.*; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; - -public class CuriosApiInterop { - static class Wrapper implements ICurio { - private final ItemStack stack; - private final HexBaubleItem bauble; - - Wrapper(ItemStack stack) { - this.stack = stack; - if (stack.getItem() instanceof HexBaubleItem bauble) { - this.bauble = bauble; - } else { - throw new IllegalArgumentException("Item stack " + stack + " wasn't a bauble item weewoo"); - } - } - - @Override - public ItemStack getStack() { - return stack; - } - - @Override - public Multimap, AttributeModifier> getAttributeModifiers(SlotContext slotContext, ResourceLocation id) { - var map = ICurio.super.getAttributeModifiers(slotContext, id); - map.putAll(this.bauble.getHexBaubleAttrs(this.stack)); - return map; - } - } - - - public static void init() { - DiscoveryHandlers.addExtraEquipmentDiscoverer(player -> { - List result = new ArrayList<>(); - ICuriosItemHandler handler = player.getCapability(CuriosCapability.INVENTORY); - if(handler != null) { - for (var stacksHandler : handler.getCurios().values()) { - var stacks = stacksHandler.getStacks(); - for (int i = 0; i < stacks.getSlots(); i++) { - var stack = stacks.getStackInSlot(i); - if (stack.isEmpty()) continue; - result.add(stack); - } - } - } - return result; - }); - - DiscoveryHandlers.addDebugItemDiscoverer((player, type) -> { - var inv = player.getCapability(CuriosCapability.INVENTORY); - - if(inv != null) { - for (var stacksHandler : inv.getCurios().values()) { - var stacks = stacksHandler.getStacks(); - for (int i = 0; i < stacks.getSlots(); i++) { - var stack = stacks.getStackInSlot(i); - if (ItemCreativeUnlocker.isDebug(stack, type)) { - return stack; - } - } - } - } - return ItemStack.EMPTY; - }); - } - - public static void registerCap(RegisterCapabilitiesEvent evt, Item item) { - evt.registerItem(CuriosCapability.ITEM, (stack, ctx) -> new Wrapper(stack), item); - } - - public static void onClientSetup(final FMLClientSetupEvent event) { - CuriosRenderers.register(); - } -} diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosRenderers.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosRenderers.java deleted file mode 100644 index a7785611ee..0000000000 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/CuriosRenderers.java +++ /dev/null @@ -1,27 +0,0 @@ -package at.petrak.hexcasting.forge.interop.curios; - -import at.petrak.hexcasting.common.lib.HexItems; -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.CubeDeformation; -import net.minecraft.client.model.geom.builders.CubeListBuilder; -import net.minecraft.client.model.geom.builders.LayerDefinition; -import net.minecraft.client.model.geom.builders.MeshDefinition; -import net.neoforged.neoforge.client.event.EntityRenderersEvent; -import top.theillusivec4.curios.api.client.CuriosRendererRegistry; - -public class CuriosRenderers { - public static void register() { - CuriosRendererRegistry.register(HexItems.SCRYING_LENS, () -> new LensCurioRenderer(Minecraft.getInstance().getEntityModels().bakeLayer(LensCurioRenderer.LAYER))); - } - - public static void onLayerRegister(final EntityRenderersEvent.RegisterLayerDefinitions event) { - event.registerLayerDefinition(LensCurioRenderer.LAYER, () -> { - CubeListBuilder builder = new CubeListBuilder(); - MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, 0); - mesh.getRoot().addOrReplaceChild("head", builder, PartPose.ZERO); - return LayerDefinition.create(mesh, 1, 1); - }); - } -} diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/LensCurioRenderer.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/LensCurioRenderer.java deleted file mode 100644 index a9f590d950..0000000000 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/interop/curios/LensCurioRenderer.java +++ /dev/null @@ -1,55 +0,0 @@ -package at.petrak.hexcasting.forge.interop.curios; - -import at.petrak.hexcasting.api.HexAPI; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Axis; -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.EntityModel; -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.model.geom.ModelLayerLocation; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.RenderLayerParent; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import top.theillusivec4.curios.api.SlotContext; -import top.theillusivec4.curios.api.client.ICurioRenderer; - -public class LensCurioRenderer implements ICurioRenderer { - public static final ModelLayerLocation LAYER = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(HexAPI.MOD_ID, "lens"), "lens"); - - private final HumanoidModel model; - - public LensCurioRenderer(ModelPart part) { - this.model = new HumanoidModel<>(part); - } - - @Override - public > void render(ItemStack stack, SlotContext slotContext, PoseStack matrixStack, RenderLayerParent renderLayerParent, MultiBufferSource renderTypeBuffer, int light, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { - // https://github.com/Creators-of-Create/Create/blob/ee33823ed0b5084af10ed131a1626ce71db4c07e/src/main/java/com/simibubi/create/compat/curios/GogglesCurioRenderer.java - - // Prepare values for transformation - model.setupAnim(slotContext.entity(), limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); - model.prepareMobModel(slotContext.entity(), limbSwing, limbSwingAmount, partialTicks); - ICurioRenderer.followHeadRotations(slotContext.entity(), model.head); - - // Translate and rotate with our head - matrixStack.pushPose(); - matrixStack.translate(model.head.x / 16.0, model.head.y / 16.0, model.head.z / 16.0); - matrixStack.mulPose(Axis.YP.rotation(model.head.yRot)); - matrixStack.mulPose(Axis.XP.rotation(model.head.xRot)); - - // Translate and scale to our head - matrixStack.translate(0, -0.25, 0); - matrixStack.mulPose(Axis.ZP.rotationDegrees(180.0f)); - matrixStack.scale(0.625f, 0.625f, 0.625f); - - // Render - var instance = Minecraft.getInstance(); - instance.getItemRenderer().renderStatic(stack, ItemDisplayContext.HEAD, light, OverlayTexture.NO_OVERLAY, matrixStack, renderTypeBuffer, instance.level, 0); - matrixStack.popPose(); - } -} diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java index 5acbe02d87..7b5a1e01e3 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/xplat/ForgeXplatImpl.java @@ -27,7 +27,6 @@ import at.petrak.hexcasting.common.recipe.ingredient.state.StateIngredientType; import at.petrak.hexcasting.forge.cap.CapSyncers; import at.petrak.hexcasting.forge.cap.HexCapabilities; -import at.petrak.hexcasting.forge.interop.curios.CuriosApiInterop; import at.petrak.hexcasting.forge.network.MsgBrainsweepAck; import at.petrak.hexcasting.forge.recipe.ForgeUnsealedIngredient; import at.petrak.hexcasting.interop.HexInterop; @@ -121,9 +120,7 @@ public boolean isModPresent(String id) { @Override public void initPlatformSpecific() { - if (this.isModPresent(HexInterop.Forge.CURIOS_API_ID)) { - CuriosApiInterop.init(); - } + // platform-specific initialization not currently necessary } // @Override diff --git a/Neoforge/src/main/resources/data/curios/tags/item/head.json b/Neoforge/src/main/resources/data/curios/tags/item/head.json deleted file mode 100644 index 9fae8ae720..0000000000 --- a/Neoforge/src/main/resources/data/curios/tags/item/head.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "replace": false, - "values": [ - "hexcasting:lens" - ] -} From bc51e9c1df884a0e2f3b1d2b98fefced9e9a92e3 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Tue, 23 Jun 2026 17:01:02 -0400 Subject: [PATCH 4/5] Properly make Accessories an optional dependency --- Fabric/src/main/resources/fabric.mod.json | 3 ++- .../src/main/resources/META-INF/neoforge.mods.toml | 12 ++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Fabric/src/main/resources/fabric.mod.json b/Fabric/src/main/resources/fabric.mod.json index 1f5ad84f67..dc3946d3f0 100644 --- a/Fabric/src/main/resources/fabric.mod.json +++ b/Fabric/src/main/resources/fabric.mod.json @@ -62,7 +62,8 @@ }, "suggests": { "pehkui": ">=3.7.6", - "modmenu": ">=7.0.1" + "modmenu": ">=7.0.1", + "accessories": ">=1.1.0-beta.16+1.21.1" }, "custom": { "cardinal-components": [ diff --git a/Neoforge/src/main/resources/META-INF/neoforge.mods.toml b/Neoforge/src/main/resources/META-INF/neoforge.mods.toml index 6b5b68b202..765571e7dd 100644 --- a/Neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/Neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -21,47 +21,43 @@ config = "hexcasting_forge.mixins.json" [[dependencies.hexcasting]] modId = "neoforge" -mandatory = true versionRange = "[21,)" ordering = "NONE" side = "BOTH" [[dependencies.hexcasting]] modId = "minecraft" -mandatory = true versionRange = "[1.21.1,1.21.10)" ordering = "NONE" side = "BOTH" [[dependencies.hexcasting]] modId = "paucal" -mandatory = true versionRange = "[0.7.1,)" ordering = "NONE" side = "BOTH" [[dependencies.hexcasting]] modId = "patchouli" -mandatory = true versionRange = "[1.21-80,)" ordering = "NONE" side = "BOTH" [[dependencies.hexcasting]] modId = "caelus" -mandatory = true versionRange = "[7.0.1+1.21.1,)" ordering = "NONE" side = "BOTH" [[dependencies.hexcasting]] modId = "inline" -mandatory = true versionRange = "[1.21.1-1.2.2,)" ordering = "NONE" side = "BOTH" [[dependencies.hexcasting]] modId = "accessories" -mandatory = false -versionRange = "[1.1.0-beta.16+1.21.1,)" \ No newline at end of file +type = "optional" +versionRange = "[1.1.0-beta.16+1.21.1,)" +ordering = "NONE" +side = "BOTH" \ No newline at end of file From 221bcc56eb3e3f4ef0a2eb5b377d998e4179af71 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Tue, 23 Jun 2026 17:33:49 -0400 Subject: [PATCH 5/5] Set up non-accessories lens attribute modifiers --- .../at/petrak/hexcasting/common/items/ItemLens.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLens.java b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLens.java index 5f9772ec4d..290ff0b1fa 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLens.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemLens.java @@ -9,11 +9,13 @@ import net.minecraft.core.dispenser.BlockSource; import net.minecraft.core.dispenser.OptionalDispenseItemBehavior; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.level.block.DispenserBlock; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,7 +31,7 @@ public class ItemLens extends Item implements HexBaubleItem { // Wearable, HexAPI.modLoc("scrying_lens_sight"), 1.0, AttributeModifier.Operation.ADD_VALUE); public ItemLens(Properties pProperties) { - super(pProperties); + super(pProperties.attributes(lensAttributeModifiers())); DispenserBlock.registerBehavior(this, new OptionalDispenseItemBehavior() { protected @NotNull ItemStack execute(@NotNull BlockSource world, @NotNull ItemStack stack) { this.setSuccess(ArmorItem.dispenseArmor(world, stack)); @@ -38,6 +40,15 @@ public ItemLens(Properties pProperties) { }); } + private static ItemAttributeModifiers lensAttributeModifiers() { + ItemAttributeModifiers.Builder builder = ItemAttributeModifiers.builder(); + builder.add(HexAttributes.GRID_ZOOM, GRID_ZOOM, EquipmentSlotGroup.HAND); + builder.add(HexAttributes.GRID_ZOOM, GRID_ZOOM, EquipmentSlotGroup.HEAD); + builder.add(HexAttributes.SCRY_SIGHT, SCRY_SIGHT, EquipmentSlotGroup.HAND); + builder.add(HexAttributes.SCRY_SIGHT, SCRY_SIGHT, EquipmentSlotGroup.HEAD); + return builder.build(); + } + @Override public Multimap, AttributeModifier> getHexBaubleAttrs(ItemStack stack) { HashMultimap, AttributeModifier> out = HashMultimap.create();