From 5817ad41ec43374c28066f4769526aef1582748a Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 14:46:08 -0400 Subject: [PATCH 01/45] Very basic model setup for neoforge --- .../client/model/HexModelLayers.java | 2 +- .../client/model/HexRobesModel.java | 152 ++++++++++++++++++ .../client/model/HexRobesModels.java | 70 -------- .../hexcasting/common/impl/HexAPIImpl.java | 3 +- .../common/items/armor/ItemRobes.java | 13 ++ .../hexcasting/common/lib/HexItems.java | 6 + .../forge/ForgeHexClientInitializer.java | 32 ++++ 7 files changed, 206 insertions(+), 72 deletions(-) create mode 100644 Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java delete mode 100644 Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModels.java diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexModelLayers.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexModelLayers.java index 11dc412327..d220649bce 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexModelLayers.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexModelLayers.java @@ -29,6 +29,6 @@ private static ModelLayerLocation make(String name, String layer) { // https://github.com/VazkiiMods/Botania/blob/1.19.x/Xplat/src/main/java/vazkii/botania/client/model/BotaniaLayerDefinitions.java public static void init(BiConsumer> consumer) { consumer.accept(ALTIORA, ElytraModel::createLayer); - consumer.accept(ROBES, HexRobesModels::variant1); + consumer.accept(ROBES, HexRobesModel::variant1); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java new file mode 100644 index 0000000000..9f3f1910e5 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java @@ -0,0 +1,152 @@ +package at.petrak.hexcasting.client.model; + +// Made with Blockbench 4.6.1 +// Exported for Minecraft version 1.17 or later with Mojang mappings +// Paste this class into your mod and generate all required imports + +import at.petrak.hexcasting.api.HexAPI; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidArmorModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; + +public class HexRobesModel extends HumanoidArmorModel { + // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into + // this model's constructor + // public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(modLoc("robes"), "main"); + + final EquipmentSlot slot; + + public final ModelPart head; + public final ModelPart body; + public final ModelPart rightArm; + public final ModelPart leftArm; + public final ModelPart rightLeg; + public final ModelPart leftLeg; + + public HexRobesModel(ModelPart root, EquipmentSlot slot) { + super(root); + this.slot = slot; + + this.head = root.getChild("head"); + this.body = root.getChild("body"); + this.rightArm = root.getChild("right_arm"); + this.leftArm = root.getChild("left_arm"); + this.rightLeg = root.getChild("right_leg"); + this.leftLeg = root.getChild("left_leg"); + } + + public static LayerDefinition variant1() { + MeshDefinition meshdef = new MeshDefinition(); + PartDefinition root = meshdef.getRoot(); + + root.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + + var head = root.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + + head.addOrReplaceChild("Hood", + CubeListBuilder.create() + .texOffs(0, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(0, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)), + PartPose.offset(4.0F, -8.0F, -4.0F)); + + head.addOrReplaceChild("Horns", + CubeListBuilder.create() + .texOffs(24, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(24, 0).mirror().addBox(9.5F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .mirror(false), + PartPose.offset(-4.8F, -8.2F, 0.0F)); + + var body = root.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + + body.addOrReplaceChild("Torso", + CubeListBuilder.create() + .texOffs(40, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(40, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), + PartPose.offset(4.0F, 0.0F, -2.0F)); + + var rightArm = root.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + + rightArm.addOrReplaceChild("Arms", + CubeListBuilder.create() + .texOffs(0, 32).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(0, 32).mirror().addBox(8.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .mirror(false), + PartPose.offset(-4.0F, 0.0F, -2.0F)); + + var leftArm = root.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + + // TODO: split up arms? + + PartDefinition Skirt = body.addOrReplaceChild("Skirt", CubeListBuilder.create(), + PartPose.offset(0.0F, 12.0F, -2.0F)); + + PartDefinition Left_r1 = Skirt.addOrReplaceChild("Left_r1", + CubeListBuilder.create() + .texOffs(48, 32).mirror().addBox(0.1F, 0.0F, -4.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .mirror(false), + PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, -0.1309F)); + + PartDefinition Right_r1 = Skirt.addOrReplaceChild("Right_r1", + CubeListBuilder.create() + .texOffs(48, 32).addBox(-4.0F, 0.0F, -4.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), + PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, 0.1309F)); + + var rightLeg = root.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + + rightLeg.addOrReplaceChild("Legs", + CubeListBuilder.create().texOffs(16, 41) + .addBox(-4.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(16, 41).addBox(0.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)), + PartPose.offset(0.0F, 21.0F, -2.0F)); + + var leftLeg = root.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + // TODO: split up legs? + + return LayerDefinition.create(meshdef, 64, 64); + } + + @Override + public void renderToBuffer(PoseStack ms, VertexConsumer buffer, int light, int overlay, int color) { + renderArmorPart(slot); + super.renderToBuffer(ms, buffer, light, overlay, color); + } + + private void renderArmorPart(EquipmentSlot slot) { + setAllVisible(false); + rightLeg.getChild("Legs").visible = false; + body.getChild("Skirt").visible = false; + //leftLeg.getChild("left_leg_armor").visible = false; + //rightLeg.getChild("right_boot").visible = false; + //leftLeg.getChild("left_boot").visible = false; + + switch (slot) { + case HEAD -> head.visible = true; + case CHEST -> { + body.visible = true; + rightArm.visible = true; + leftArm.visible = true; + } + case LEGS -> { + rightLeg.visible = true; + leftLeg.visible = true; + rightLeg.getChild("Legs").visible = true; + //leftLeg.getChild("left_leg_armor").visible = true; + body.getChild("Skirt").visible = true; + } + case FEET -> { + rightLeg.visible = true; + leftLeg.visible = true; + //rightLeg.getChild("right_boot").visible = true; + //leftLeg.getChild("left_boot").visible = true; + } + case MAINHAND, OFFHAND -> { + } + } + } +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModels.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModels.java deleted file mode 100644 index 7f35494cab..0000000000 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModels.java +++ /dev/null @@ -1,70 +0,0 @@ -package at.petrak.hexcasting.client.model; - -// Made with Blockbench 4.6.1 -// Exported for Minecraft version 1.17 or later with Mojang mappings -// Paste this class into your mod and generate all required imports - -import net.minecraft.client.model.geom.ModelLayerLocation; -import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.*; - -import static at.petrak.hexcasting.api.HexAPI.modLoc; - -public class HexRobesModels { - // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into - // this model's constructor - public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(modLoc("robes"), "main"); - - public static LayerDefinition variant1() { - MeshDefinition meshdefinition = new MeshDefinition(); - PartDefinition partdefinition = meshdefinition.getRoot(); - - PartDefinition Hood = partdefinition.addOrReplaceChild("Hood", - CubeListBuilder.create() - .texOffs(0, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)) - .texOffs(0, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)), - PartPose.offset(4.0F, -8.0F, -4.0F)); - - PartDefinition Horns = partdefinition.addOrReplaceChild("Horns", - CubeListBuilder.create() - .texOffs(24, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(24, 0).mirror().addBox(9.5F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .mirror(false), - PartPose.offset(-4.8F, -8.2F, 0.0F)); - - PartDefinition Torso = partdefinition.addOrReplaceChild("Torso", - CubeListBuilder.create() - .texOffs(40, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(40, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), - PartPose.offset(4.0F, 0.0F, -2.0F)); - - PartDefinition Arms = partdefinition.addOrReplaceChild("Arms", - CubeListBuilder.create() - .texOffs(0, 32).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(0, 32).mirror().addBox(8.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) - .mirror(false), - PartPose.offset(-4.0F, 0.0F, -2.0F)); - - PartDefinition Skirt = partdefinition.addOrReplaceChild("Skirt", CubeListBuilder.create(), - PartPose.offset(0.0F, 12.0F, -2.0F)); - - PartDefinition Left_r1 = Skirt.addOrReplaceChild("Left_r1", - CubeListBuilder.create() - .texOffs(48, 32).mirror().addBox(0.1F, 0.0F, -4.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) - .mirror(false), - PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, -0.1309F)); - - PartDefinition Right_r1 = Skirt.addOrReplaceChild("Right_r1", - CubeListBuilder.create() - .texOffs(48, 32).addBox(-4.0F, 0.0F, -4.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), - PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, 0.1309F)); - - PartDefinition Legs = partdefinition.addOrReplaceChild("Legs", - CubeListBuilder.create().texOffs(16, 41) - .addBox(-4.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(16, 41).addBox(0.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)), - PartPose.offset(0.0F, 21.0F, -2.0F)); - - return LayerDefinition.create(meshdefinition, 64, 64); - } -} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java b/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java index 471e5861bd..ccab5c3c8b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Collections; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.function.Consumer; @@ -117,7 +118,7 @@ public FrozenPigment getColorizer(Player player) { 0, SoundEvents.ARMOR_EQUIP_LEATHER, () -> Ingredient.EMPTY, - Collections.emptyList(), // TODO check textures. If not - use robes here from original code + List.of(new ArmorMaterial.Layer(HexAPI.modLoc("robes"))), 0, 0 ); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java index fbe194e85f..ff4d7f82c3 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java @@ -1,8 +1,15 @@ package at.petrak.hexcasting.common.items.armor; +import at.petrak.hexcasting.annotations.SoftImplement; import at.petrak.hexcasting.api.HexAPI; import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; /** * To get the armor model in; @@ -16,4 +23,10 @@ public ItemRobes(ArmorItem.Type type, Properties properties) { super(Holder.direct(HexAPI.instance().robesMaterial()), type, properties); this.type = type; } + + @SoftImplement("IItemExtension") + public ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, ArmorMaterial.Layer layer, boolean innerModel) { + // TODO: detect variant based on itemstack data + return HexAPI.modLoc("textures/armor/robes1.png"); + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index e54537b9c7..ce0cce4186 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -8,6 +8,7 @@ import at.petrak.hexcasting.common.items.ItemLens; import at.petrak.hexcasting.common.items.ItemLoreFragment; import at.petrak.hexcasting.common.items.ItemStaff; +import at.petrak.hexcasting.common.items.armor.ItemRobes; import at.petrak.hexcasting.common.items.magic.*; import at.petrak.hexcasting.common.items.pigment.*; import at.petrak.hexcasting.common.items.storage.*; @@ -75,6 +76,11 @@ public static void registerItemsForCreativeTab(ResourceKey tabK IXplatAbstractions.INSTANCE.addEquipSlotFabric(EquipmentSlot.HEAD) .stacksTo(1).attributes(ItemLens.MODIFIERS))); + public static final Supplier ROBE_MASK = make("robe/mask", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable())); + public static final Supplier ROBE_TUNIC = make("robe/tunic", () -> new ItemRobes(ArmorItem.Type.CHESTPLATE, unstackable())); + public static final Supplier ROBE_LEGS = make("robe/legs", () -> new ItemRobes(ArmorItem.Type.LEGGINGS, unstackable())); + public static final Supplier ROBE_BOOTS = make("robe/boots", () -> new ItemRobes(ArmorItem.Type.BOOTS, unstackable())); + public static final Supplier ABACUS = make("abacus", () -> new ItemAbacus(unstackable())); public static final Supplier THOUGHT_KNOT = make("thought_knot", () -> new ItemThoughtKnot(unstackable())); public static final Supplier FOCUS = make("focus", () -> new ItemFocus(unstackable())); diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java index 3e30a6c875..a6d55e38f8 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java @@ -1,5 +1,6 @@ package at.petrak.hexcasting.forge; +import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.client.ClientTickCounter; import at.petrak.hexcasting.client.Keybinds; import at.petrak.hexcasting.client.RegisterClientStuff; @@ -7,17 +8,23 @@ import at.petrak.hexcasting.client.gui.PatternTooltipComponent; import at.petrak.hexcasting.client.model.AltioraLayer; import at.petrak.hexcasting.client.model.HexModelLayers; +import at.petrak.hexcasting.client.model.HexRobesModel; import at.petrak.hexcasting.client.render.HexAdditionalRenderers; import at.petrak.hexcasting.client.render.shader.HexShaders; import at.petrak.hexcasting.common.casting.PatternRegistryManifest; +import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.lib.HexParticles; import at.petrak.hexcasting.common.misc.PatternTooltip; import at.petrak.hexcasting.forge.lib.ForgeHexAttachments; import at.petrak.hexcasting.interop.HexInterop; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; +import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleProvider; import net.minecraft.client.particle.SpriteSet; @@ -25,13 +32,20 @@ import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.client.ClientHooks; import net.neoforged.neoforge.client.event.*; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import net.neoforged.neoforge.common.NeoForge; import java.io.IOException; +import java.util.Map; import java.util.function.Function; // This is Java because I can't kotlin-fu some of the consumers @@ -147,6 +161,24 @@ public static void addPlayerLayers(EntityRenderersEvent.AddLayers evt) { }); } + @SubscribeEvent + public static void registerArmorRenderer(RegisterClientExtensionsEvent evt) { + evt.registerItem(new IClientItemExtensions() { + private final Map> MODELS = new Object2ObjectArrayMap<>(); + + @Override + public HumanoidModel getHumanoidArmorModel(LivingEntity livingEntity, ItemStack itemStack, EquipmentSlot equipmentSlot, HumanoidModel original) { + return MODELS.computeIfAbsent(equipmentSlot, this::provideArmorModelForSlot); + } + + private HumanoidModel provideArmorModelForSlot(EquipmentSlot slot) { + EntityModelSet models = Minecraft.getInstance().getEntityModels(); + ModelPart root = models.bakeLayer(HexModelLayers.ROBES); + return new HexRobesModel(root, slot); + } + }, HexItems.ROBE_MASK.get(), HexItems.ROBE_TUNIC.get(), HexItems.ROBE_LEGS.get(), HexItems.ROBE_BOOTS.get()); + } + @SubscribeEvent public static void registerBinds(RegisterKeyMappingsEvent event) { Keybinds.ALL_BINDS.forEach(event::register); From ed148cf5eae6a1c886e4834bda8301d2c472f807 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 15:59:52 -0400 Subject: [PATCH 02/45] Equivalent setup for fabric --- .../common/items/armor/ItemRobes.java | 21 ++++++++++++ .../fabric/FabricHexClientInitializer.kt | 3 +- .../fabric/client/HexRobesRenderer.java | 33 +++++++++++++++++++ .../forge/ForgeHexClientInitializer.java | 9 ++--- 4 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java index ff4d7f82c3..ad8e020d75 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java @@ -2,14 +2,22 @@ import at.petrak.hexcasting.annotations.SoftImplement; import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.client.model.HexModelLayers; +import at.petrak.hexcasting.client.model.HexRobesModel; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; +import net.minecraft.client.model.geom.ModelPart; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; /** * To get the armor model in; @@ -18,12 +26,25 @@ */ public class ItemRobes extends ArmorItem { public final ArmorItem.Type type; + private @Nullable HexRobesModel model; public ItemRobes(ArmorItem.Type type, Properties properties) { super(Holder.direct(HexAPI.instance().robesMaterial()), type, properties); this.type = type; } + // TODO: return a collection holding all the variants for the given slot + public static HexRobesModel provideArmorModelForSlot(EquipmentSlot slot) { + EntityModelSet models = Minecraft.getInstance().getEntityModels(); + ModelPart root = models.bakeLayer(HexModelLayers.ROBES); + return new HexRobesModel(root, slot); + } + + public HexRobesModel getArmorModel() { + if (model == null) model = provideArmorModelForSlot(getEquipmentSlot()); + return model; + } + @SoftImplement("IItemExtension") public ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, ArmorMaterial.Layer layer, boolean innerModel) { // TODO: detect variant based on itemstack data diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexClientInitializer.kt b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexClientInitializer.kt index 76130ce49a..6ad22c56f1 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexClientInitializer.kt +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexClientInitializer.kt @@ -9,6 +9,7 @@ import at.petrak.hexcasting.client.model.HexModelLayers import at.petrak.hexcasting.client.render.HexAdditionalRenderers import at.petrak.hexcasting.common.casting.PatternRegistryManifest import at.petrak.hexcasting.common.lib.HexParticles +import at.petrak.hexcasting.fabric.client.HexRobesRenderer import at.petrak.hexcasting.fabric.event.MouseScrollCallback import at.petrak.hexcasting.fabric.network.FabricPacketHandler import at.petrak.hexcasting.interop.HexInterop @@ -56,7 +57,7 @@ object FabricHexClientInitializer : ClientModInitializer { RegisterClientStuff.init() HexModelLayers.init { loc, defn -> EntityModelLayerRegistry.registerModelLayer(loc, defn::get) } - + HexRobesRenderer.init() HexParticles.FactoryHandler.registerFactories(object : HexParticles.FactoryHandler.Consumer { override fun register(type: ParticleType, constructor: Function>) { diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java new file mode 100644 index 0000000000..b61c06e098 --- /dev/null +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java @@ -0,0 +1,33 @@ +package at.petrak.hexcasting.fabric.client; + +import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.common.items.armor.ItemRobes; +import at.petrak.hexcasting.common.lib.HexItems; +import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderer; +import net.minecraft.world.item.Item; + +import java.util.List; + +public class HexRobesRenderer { + public static final List ROBE_ITEMS = + List.of( + HexItems.ROBE_MASK.get(), + HexItems.ROBE_TUNIC.get(), + HexItems.ROBE_LEGS.get(), + HexItems.ROBE_BOOTS.get() + ); + + public static void init() { + ArmorRenderer renderer = (matrices, vertexConsumers, stack, entity, slot, light, contextModel) -> { + + ItemRobes armor = (ItemRobes) stack.getItem(); + var model = armor.getArmorModel(); + var texture = armor.getArmorTexture(stack, entity, slot, HexAPI.instance().robesMaterial().layers().getFirst(), false); + contextModel.copyPropertiesTo(model); + + ArmorRenderer.renderPart(matrices, vertexConsumers, light, stack, model, texture); + + }; + ArmorRenderer.register(renderer, ROBE_ITEMS.toArray(new Item[0])); + } +} diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java index a6d55e38f8..46acccab05 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java @@ -12,6 +12,7 @@ import at.petrak.hexcasting.client.render.HexAdditionalRenderers; import at.petrak.hexcasting.client.render.shader.HexShaders; import at.petrak.hexcasting.common.casting.PatternRegistryManifest; +import at.petrak.hexcasting.common.items.armor.ItemRobes; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.lib.HexParticles; import at.petrak.hexcasting.common.misc.PatternTooltip; @@ -168,13 +169,7 @@ public static void registerArmorRenderer(RegisterClientExtensionsEvent evt) { @Override public HumanoidModel getHumanoidArmorModel(LivingEntity livingEntity, ItemStack itemStack, EquipmentSlot equipmentSlot, HumanoidModel original) { - return MODELS.computeIfAbsent(equipmentSlot, this::provideArmorModelForSlot); - } - - private HumanoidModel provideArmorModelForSlot(EquipmentSlot slot) { - EntityModelSet models = Minecraft.getInstance().getEntityModels(); - ModelPart root = models.bakeLayer(HexModelLayers.ROBES); - return new HexRobesModel(root, slot); + return MODELS.computeIfAbsent(equipmentSlot, ItemRobes::provideArmorModelForSlot); } }, HexItems.ROBE_MASK.get(), HexItems.ROBE_TUNIC.get(), HexItems.ROBE_LEGS.get(), HexItems.ROBE_BOOTS.get()); } From a2deae1f3cdaf4c6032966b8ed8daac15ba339ae Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 16:42:15 -0400 Subject: [PATCH 03/45] Manually tweak robe models to align properly --- .../client/model/HexRobesModel.java | 69 +++++++++---------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java index 9f3f1910e5..7a79fcb8fa 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java @@ -56,8 +56,8 @@ public static LayerDefinition variant1() { head.addOrReplaceChild("Horns", CubeListBuilder.create() - .texOffs(24, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(24, 0).mirror().addBox(9.5F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(24, 0).addBox(8.5F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(24, 0).mirror().addBox(-7F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) .mirror(false), PartPose.offset(-4.8F, -8.2F, 0.0F)); @@ -71,42 +71,43 @@ public static LayerDefinition variant1() { var rightArm = root.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); - rightArm.addOrReplaceChild("Arms", + rightArm.addOrReplaceChild("right_sleeve", CubeListBuilder.create() - .texOffs(0, 32).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(0, 32).mirror().addBox(8.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) - .mirror(false), - PartPose.offset(-4.0F, 0.0F, -2.0F)); + .texOffs(0, 32).addBox(0.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), + PartPose.offset(-3.0F, -2.0F, -2.0F)); var leftArm = root.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); - // TODO: split up arms? - - PartDefinition Skirt = body.addOrReplaceChild("Skirt", CubeListBuilder.create(), - PartPose.offset(0.0F, 12.0F, -2.0F)); - - PartDefinition Left_r1 = Skirt.addOrReplaceChild("Left_r1", + leftArm.addOrReplaceChild("left_sleeve", CubeListBuilder.create() - .texOffs(48, 32).mirror().addBox(0.1F, 0.0F, -4.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(0, 32).mirror().addBox(0, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) .mirror(false), - PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, -0.1309F)); + PartPose.offset(-1.0F, -2.0F, -2.0F)); - PartDefinition Right_r1 = Skirt.addOrReplaceChild("Right_r1", + var rightLeg = root.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + + PartDefinition Right_r1 = rightLeg.addOrReplaceChild("right_skirt", CubeListBuilder.create() - .texOffs(48, 32).addBox(-4.0F, 0.0F, -4.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), + .texOffs(48, 32).mirror().addBox(-2.2F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, 0.1309F)); - var rightLeg = root.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); - - rightLeg.addOrReplaceChild("Legs", - CubeListBuilder.create().texOffs(16, 41) - .addBox(-4.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(16, 41).addBox(0.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)), - PartPose.offset(0.0F, 21.0F, -2.0F)); + rightLeg.addOrReplaceChild("right_boot", + CubeListBuilder.create() + .texOffs(16, 41).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)), + PartPose.offset(2.0F, 9.0F, -2.0F)); var leftLeg = root.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); - // TODO: split up legs? + PartDefinition Left_r1 = leftLeg.addOrReplaceChild("left_skirt", + CubeListBuilder.create() + .texOffs(48, 32).addBox(-1.8F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), + PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, -0.1309F)); + + leftLeg.addOrReplaceChild("left_boot", + CubeListBuilder.create() + .texOffs(16, 41).addBox(0.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)), + PartPose.offset(-2.0F, 9.0F, -2.0F)); return LayerDefinition.create(meshdef, 64, 64); } @@ -119,11 +120,10 @@ public void renderToBuffer(PoseStack ms, VertexConsumer buffer, int light, int o private void renderArmorPart(EquipmentSlot slot) { setAllVisible(false); - rightLeg.getChild("Legs").visible = false; - body.getChild("Skirt").visible = false; - //leftLeg.getChild("left_leg_armor").visible = false; - //rightLeg.getChild("right_boot").visible = false; - //leftLeg.getChild("left_boot").visible = false; + rightLeg.getChild("right_skirt").visible = false; + leftLeg.getChild("left_skirt").visible = false; + rightLeg.getChild("right_boot").visible = false; + leftLeg.getChild("left_boot").visible = false; switch (slot) { case HEAD -> head.visible = true; @@ -135,15 +135,14 @@ private void renderArmorPart(EquipmentSlot slot) { case LEGS -> { rightLeg.visible = true; leftLeg.visible = true; - rightLeg.getChild("Legs").visible = true; - //leftLeg.getChild("left_leg_armor").visible = true; - body.getChild("Skirt").visible = true; + rightLeg.getChild("right_skirt").visible = true; + leftLeg.getChild("left_skirt").visible = true; } case FEET -> { rightLeg.visible = true; leftLeg.visible = true; - //rightLeg.getChild("right_boot").visible = true; - //leftLeg.getChild("left_boot").visible = true; + rightLeg.getChild("right_boot").visible = true; + leftLeg.getChild("left_boot").visible = true; } case MAINHAND, OFFHAND -> { } From 8e63f07a822ccd6983ca20020a70ad753bcc693e Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 16:59:34 -0400 Subject: [PATCH 04/45] Inflate model so it doesn't overlap skin details --- .../client/model/HexRobesModel.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java index 7a79fcb8fa..3453b3c82d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java @@ -50,14 +50,14 @@ public static LayerDefinition variant1() { head.addOrReplaceChild("Hood", CubeListBuilder.create() - .texOffs(0, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)) - .texOffs(0, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)), + .texOffs(0, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.5F)) + .texOffs(0, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.5F)), PartPose.offset(4.0F, -8.0F, -4.0F)); head.addOrReplaceChild("Horns", CubeListBuilder.create() - .texOffs(24, 0).addBox(8.5F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) - .texOffs(24, 0).mirror().addBox(-7F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(24, 0).addBox(8.5F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.5F)) + .texOffs(24, 0).mirror().addBox(-7F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.5F)) .mirror(false), PartPose.offset(-4.8F, -8.2F, 0.0F)); @@ -65,22 +65,22 @@ public static LayerDefinition variant1() { body.addOrReplaceChild("Torso", CubeListBuilder.create() - .texOffs(40, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) - .texOffs(40, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), + .texOffs(40, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)) + .texOffs(40, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)), PartPose.offset(4.0F, 0.0F, -2.0F)); var rightArm = root.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); rightArm.addOrReplaceChild("right_sleeve", CubeListBuilder.create() - .texOffs(0, 32).addBox(0.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), + .texOffs(0, 32).addBox(0.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)), PartPose.offset(-3.0F, -2.0F, -2.0F)); var leftArm = root.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); leftArm.addOrReplaceChild("left_sleeve", CubeListBuilder.create() - .texOffs(0, 32).mirror().addBox(0, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(0, 32).mirror().addBox(0, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)) .mirror(false), PartPose.offset(-1.0F, -2.0F, -2.0F)); @@ -88,25 +88,25 @@ public static LayerDefinition variant1() { PartDefinition Right_r1 = rightLeg.addOrReplaceChild("right_skirt", CubeListBuilder.create() - .texOffs(48, 32).mirror().addBox(-2.2F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(48, 32).mirror().addBox(-2.2F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)) .mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, 0.1309F)); rightLeg.addOrReplaceChild("right_boot", CubeListBuilder.create() - .texOffs(16, 41).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)), + .texOffs(16, 41).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.5F)), PartPose.offset(2.0F, 9.0F, -2.0F)); var leftLeg = root.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); PartDefinition Left_r1 = leftLeg.addOrReplaceChild("left_skirt", CubeListBuilder.create() - .texOffs(48, 32).addBox(-1.8F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)), + .texOffs(48, 32).addBox(-1.8F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)), PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, -0.1309F)); leftLeg.addOrReplaceChild("left_boot", CubeListBuilder.create() - .texOffs(16, 41).addBox(0.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)), + .texOffs(16, 41).addBox(0.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.5F)), PartPose.offset(-2.0F, 9.0F, -2.0F)); return LayerDefinition.create(meshdef, 64, 64); From 569ea67c164f5e86ab2af632c3e2719138fbc559 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 17:29:32 -0400 Subject: [PATCH 05/45] Properly hook up the item textures --- .../assets/hexcasting/models/item/robes/boots.json | 6 ++++++ .../assets/hexcasting/models/item/robes/legs.json | 6 ++++++ .../assets/hexcasting/models/item/robes/mask.json | 6 ++++++ .../assets/hexcasting/models/item/robes/tunic.json | 6 ++++++ .../at/petrak/hexcasting/common/lib/HexItems.java | 8 ++++---- .../textures/item/robes/{1-boots.png => boots1.png} | Bin .../textures/item/robes/{2-boots.png => boots2.png} | Bin .../textures/item/robes/{3-boots.png => boots3.png} | Bin .../robes/{1-chestplate.png => chestplate1.png} | Bin .../robes/{2-chestplate.png => chestplate2.png} | Bin .../robes/{3-chestplate.png => chestplate3.png} | Bin .../item/robes/{1-helmet.png => helmet1.png} | Bin .../item/robes/{2-helmet.png => helmet2.png} | Bin .../item/robes/{3-helmet.png => helmet3.png} | Bin .../item/robes/{1-leggings.png => leggings1.png} | Bin .../item/robes/{2-leggings.png => leggings2.png} | Bin .../item/robes/{3-leggings.png => leggings3.png} | Bin .../hexcasting/fabric/client/HexRobesRenderer.java | 8 ++++---- .../assets/hexcasting/models/item/robes/boots.json | 6 ++++++ .../assets/hexcasting/models/item/robes/legs.json | 6 ++++++ .../assets/hexcasting/models/item/robes/mask.json | 6 ++++++ .../assets/hexcasting/models/item/robes/tunic.json | 6 ++++++ .../hexcasting/forge/ForgeHexClientInitializer.java | 7 +------ .../forge/datagen/xplat/HexItemModels.java | 11 +++++++++++ 24 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/boots.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/legs.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/mask.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{1-boots.png => boots1.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{2-boots.png => boots2.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{3-boots.png => boots3.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{1-chestplate.png => chestplate1.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{2-chestplate.png => chestplate2.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{3-chestplate.png => chestplate3.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{1-helmet.png => helmet1.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{2-helmet.png => helmet2.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{3-helmet.png => helmet3.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{1-leggings.png => leggings1.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{2-leggings.png => leggings2.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{3-leggings.png => leggings3.png} (100%) create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/mask.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots.json new file mode 100644 index 0000000000..d872efd81d --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/boots1" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs.json new file mode 100644 index 0000000000..fb41385983 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/leggings1" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/mask.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/mask.json new file mode 100644 index 0000000000..4465daf8f4 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/mask.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/helmet1" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json new file mode 100644 index 0000000000..4c9f5cb987 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/chestplate1" + } +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index ce0cce4186..5009bdaa4c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -76,10 +76,10 @@ public static void registerItemsForCreativeTab(ResourceKey tabK IXplatAbstractions.INSTANCE.addEquipSlotFabric(EquipmentSlot.HEAD) .stacksTo(1).attributes(ItemLens.MODIFIERS))); - public static final Supplier ROBE_MASK = make("robe/mask", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable())); - public static final Supplier ROBE_TUNIC = make("robe/tunic", () -> new ItemRobes(ArmorItem.Type.CHESTPLATE, unstackable())); - public static final Supplier ROBE_LEGS = make("robe/legs", () -> new ItemRobes(ArmorItem.Type.LEGGINGS, unstackable())); - public static final Supplier ROBE_BOOTS = make("robe/boots", () -> new ItemRobes(ArmorItem.Type.BOOTS, unstackable())); + public static final Supplier ROBES_MASK = make("robes/mask", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable())); + public static final Supplier ROBES_TUNIC = make("robes/tunic", () -> new ItemRobes(ArmorItem.Type.CHESTPLATE, unstackable())); + public static final Supplier ROBES_LEGS = make("robes/legs", () -> new ItemRobes(ArmorItem.Type.LEGGINGS, unstackable())); + public static final Supplier ROBES_BOOTS = make("robes/boots", () -> new ItemRobes(ArmorItem.Type.BOOTS, unstackable())); public static final Supplier ABACUS = make("abacus", () -> new ItemAbacus(unstackable())); public static final Supplier THOUGHT_KNOT = make("thought_knot", () -> new ItemThoughtKnot(unstackable())); diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/1-boots.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/boots1.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/1-boots.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/boots1.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/2-boots.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/boots2.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/2-boots.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/boots2.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/3-boots.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/boots3.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/3-boots.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/boots3.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/1-chestplate.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate1.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/1-chestplate.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate1.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/2-chestplate.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate2.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/2-chestplate.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate2.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/3-chestplate.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate3.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/3-chestplate.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate3.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/1-helmet.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet1.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/1-helmet.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet1.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/2-helmet.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet2.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/2-helmet.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet2.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/3-helmet.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet3.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/3-helmet.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet3.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/1-leggings.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings1.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/1-leggings.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings1.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/2-leggings.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings2.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/2-leggings.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings2.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/3-leggings.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings3.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/3-leggings.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings3.png diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java index b61c06e098..dfaa3c91eb 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java @@ -11,10 +11,10 @@ public class HexRobesRenderer { public static final List ROBE_ITEMS = List.of( - HexItems.ROBE_MASK.get(), - HexItems.ROBE_TUNIC.get(), - HexItems.ROBE_LEGS.get(), - HexItems.ROBE_BOOTS.get() + HexItems.ROBES_MASK.get(), + HexItems.ROBES_TUNIC.get(), + HexItems.ROBES_LEGS.get(), + HexItems.ROBES_BOOTS.get() ); public static void init() { diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots.json new file mode 100644 index 0000000000..d872efd81d --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/boots1" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs.json new file mode 100644 index 0000000000..fb41385983 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/leggings1" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/mask.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/mask.json new file mode 100644 index 0000000000..4465daf8f4 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/mask.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/helmet1" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json new file mode 100644 index 0000000000..4c9f5cb987 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/chestplate1" + } +} \ No newline at end of file diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java index 46acccab05..ab718355c5 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java @@ -1,6 +1,5 @@ package at.petrak.hexcasting.forge; -import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.client.ClientTickCounter; import at.petrak.hexcasting.client.Keybinds; import at.petrak.hexcasting.client.RegisterClientStuff; @@ -8,7 +7,6 @@ import at.petrak.hexcasting.client.gui.PatternTooltipComponent; import at.petrak.hexcasting.client.model.AltioraLayer; import at.petrak.hexcasting.client.model.HexModelLayers; -import at.petrak.hexcasting.client.model.HexRobesModel; import at.petrak.hexcasting.client.render.HexAdditionalRenderers; import at.petrak.hexcasting.client.render.shader.HexShaders; import at.petrak.hexcasting.common.casting.PatternRegistryManifest; @@ -24,8 +22,6 @@ import net.minecraft.client.color.item.ItemColors; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.model.geom.EntityModelSet; -import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleProvider; import net.minecraft.client.particle.SpriteSet; @@ -39,7 +35,6 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; -import net.neoforged.neoforge.client.ClientHooks; import net.neoforged.neoforge.client.event.*; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; @@ -171,7 +166,7 @@ public static void registerArmorRenderer(RegisterClientExtensionsEvent evt) { public HumanoidModel getHumanoidArmorModel(LivingEntity livingEntity, ItemStack itemStack, EquipmentSlot equipmentSlot, HumanoidModel original) { return MODELS.computeIfAbsent(equipmentSlot, ItemRobes::provideArmorModelForSlot); } - }, HexItems.ROBE_MASK.get(), HexItems.ROBE_TUNIC.get(), HexItems.ROBE_LEGS.get(), HexItems.ROBE_BOOTS.get()); + }, HexItems.ROBES_MASK.get(), HexItems.ROBES_TUNIC.get(), HexItems.ROBES_LEGS.get(), HexItems.ROBES_BOOTS.get()); } @SubscribeEvent diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java index 864fb611ca..a4bd0770e0 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java @@ -80,6 +80,11 @@ protected void registerModels() { .translation(-2.5f, 0f, -8f) .scale(0.4f); + buildRobes(HexItems.ROBES_MASK.get(), "helmet", 1); + buildRobes(HexItems.ROBES_TUNIC.get(), "chestplate", 1); + buildRobes(HexItems.ROBES_LEGS.get(), "leggings", 1); + buildRobes(HexItems.ROBES_BOOTS.get(), "boots", 1); + singleTexture("old_staff", ResourceLocation.withDefaultNamespace("item/handheld_rod"), "layer0", modLoc("item/staff/old")); singleTexture("cherry_staff", ResourceLocation.withDefaultNamespace("item/handheld_rod"), @@ -276,6 +281,12 @@ private void buildStaff(Item item, String name) { .end(); } + private void buildRobes(Item item, String type, int numVariants) { + // TODO: actually handle the variants + singleTexture("item/" + getPath(item), ResourceLocation.withDefaultNamespace("item/generated"), + "layer0", modLoc("item/robes/"+type+"1")); + } + private void buildPackagedSpell(Item item, String stub, int numVariants) { var name = getPath(item); var builder = getBuilder(name); From 6cc45f3cef54486787bc1099d4a8a05b6d8f0f0a Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:00:39 -0400 Subject: [PATCH 06/45] Implement model variant 3 --- .../client/model/HexRobesModel.java | 116 +++++++++++++++--- 1 file changed, 101 insertions(+), 15 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java index 3453b3c82d..87eab13823 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java @@ -48,39 +48,39 @@ public static LayerDefinition variant1() { var head = root.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); - head.addOrReplaceChild("Hood", + head.addOrReplaceChild("hood", CubeListBuilder.create() - .texOffs(0, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.5F)) - .texOffs(0, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.5F)), + .texOffs(0, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.3F)) + .texOffs(0, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.4F)), PartPose.offset(4.0F, -8.0F, -4.0F)); - head.addOrReplaceChild("Horns", + head.addOrReplaceChild("horns", CubeListBuilder.create() - .texOffs(24, 0).addBox(8.5F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.5F)) - .texOffs(24, 0).mirror().addBox(-7F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.5F)) + .texOffs(24, 0).addBox(8.5F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.3F)) + .texOffs(24, 0).mirror().addBox(-7F, 0.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.3F)) .mirror(false), PartPose.offset(-4.8F, -8.2F, 0.0F)); var body = root.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); - body.addOrReplaceChild("Torso", + body.addOrReplaceChild("tunic", CubeListBuilder.create() - .texOffs(40, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)) - .texOffs(40, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)), + .texOffs(40, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)) + .texOffs(40, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.4F)), PartPose.offset(4.0F, 0.0F, -2.0F)); var rightArm = root.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); rightArm.addOrReplaceChild("right_sleeve", CubeListBuilder.create() - .texOffs(0, 32).addBox(0.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)), + .texOffs(0, 32).addBox(0.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)), PartPose.offset(-3.0F, -2.0F, -2.0F)); var leftArm = root.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); leftArm.addOrReplaceChild("left_sleeve", CubeListBuilder.create() - .texOffs(0, 32).mirror().addBox(0, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)) + .texOffs(0, 32).mirror().addBox(0, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)) .mirror(false), PartPose.offset(-1.0F, -2.0F, -2.0F)); @@ -88,30 +88,116 @@ public static LayerDefinition variant1() { PartDefinition Right_r1 = rightLeg.addOrReplaceChild("right_skirt", CubeListBuilder.create() - .texOffs(48, 32).mirror().addBox(-2.2F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)) + .texOffs(48, 32).mirror().addBox(-2.2F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.4F)) .mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, 0.1309F)); rightLeg.addOrReplaceChild("right_boot", CubeListBuilder.create() - .texOffs(16, 41).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.5F)), + .texOffs(16, 41).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.3F)), PartPose.offset(2.0F, 9.0F, -2.0F)); var leftLeg = root.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); PartDefinition Left_r1 = leftLeg.addOrReplaceChild("left_skirt", CubeListBuilder.create() - .texOffs(48, 32).addBox(-1.8F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.5F)), + .texOffs(48, 32).addBox(-1.8F, -0.5F, -6.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.4F)), PartPose.offsetAndRotation(0.0F, 0.0F, 4.0F, 0.0F, 0.0F, -0.1309F)); leftLeg.addOrReplaceChild("left_boot", CubeListBuilder.create() - .texOffs(16, 41).addBox(0.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.5F)), + .texOffs(16, 41).addBox(0.0F, 0.0F, 0.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.3F)), PartPose.offset(-2.0F, 9.0F, -2.0F)); return LayerDefinition.create(meshdef, 64, 64); } + public static LayerDefinition variant3() { + MeshDefinition meshdef = new MeshDefinition(); + PartDefinition root = meshdef.getRoot(); + + root.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + + var head = root.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + + head.addOrReplaceChild("hood", + CubeListBuilder.create() + .texOffs(0, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.3F)) + .texOffs(0, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.4F)), + PartPose.offset(4.0F, -8.0F, -4.0F)); + + head.addOrReplaceChild("right_horn", + CubeListBuilder.create() + .texOffs(24, 0).mirror().addBox(-7.0F, -4.0F, 0.0F, 8.0F, 8.0F, 0.0F, new CubeDeformation(0.3F, 0.3F, 0.0F)) + .mirror(false), + PartPose.offsetAndRotation(-5.0F, -8.7F, 0.0F, 0.0F, 0.0F, 1.309F)); + + head.addOrReplaceChild("left_horn", + CubeListBuilder.create() + .texOffs(24, 0).addBox(-1.0F, -4.0F, 0.0F, 8.0F, 8.0F, 0.0F, new CubeDeformation(0.3F, 0.3F, 0.0F)), + PartPose.offsetAndRotation(5.0F, -8.7F, 0.0F, 0.0F, 0.0F, -1.309F)); + + var body = root.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + + body.addOrReplaceChild("tunic", + CubeListBuilder.create() + .texOffs(40, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)) + .texOffs(40, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.4F)), + PartPose.offset(4.0F, 0.0F, -2.0F)); + + var sash = body.addOrReplaceChild("sash", + CubeListBuilder.create() + .texOffs(32, 48).addBox(-10.4F, -3.9F, 0.0F, 3.0F, 3.0F, 6.0F, new CubeDeformation(0.1F)), + PartPose.offset(5.5F, 10.8F, -3.0F)); + + sash.addOrReplaceChild("strap", + CubeListBuilder.create() + .texOffs(0, 48).addBox(-9.05F, -13.2F, -3.0F, 10.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)), + PartPose.offsetAndRotation(-6.2F, 11.45F, 3.0F, 0.0F, 0.0F, 0.3927F)); + + var rightArm = root.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + + rightArm.addOrReplaceChild("right_sleeve", + CubeListBuilder.create() + .texOffs(0, 32).addBox(0.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)), + PartPose.offset(-3.0F, -2.0F, -2.0F)); + + var leftArm = root.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + + leftArm.addOrReplaceChild("left_sleeve", + CubeListBuilder.create() + .texOffs(0, 32).mirror().addBox(0, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)) + .mirror(false), + PartPose.offset(-1.0F, -2.0F, -2.0F)); + + var rightLeg = root.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + + rightLeg.addOrReplaceChild("right_skirt", + CubeListBuilder.create() + .texOffs(48, 32).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)), + PartPose.offset(2.0F, 0.0F, -2.0F)); + + rightLeg.addOrReplaceChild("right_boot", + CubeListBuilder.create() + .texOffs(16, 40).addBox(-4.0F, 8.0F, 0.0F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.35F)), + PartPose.offset(2.0F, 0.0F, -2.0F)); + + var leftLeg = root.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + leftLeg.addOrReplaceChild("left_skirt", + CubeListBuilder.create() + .texOffs(48, 32).mirror().addBox(-4.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.35F)) + .mirror(false), + PartPose.offset(2.0F, 0.0F, -2.0F)); + + leftLeg.addOrReplaceChild("left_boot", + CubeListBuilder.create() + .texOffs(16, 40).addBox(-4.0F, 8.0F, 0.0F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.3F)), + PartPose.offset(2.0F, 0.0F, -2.0F)); + + return LayerDefinition.create(meshdef, 64, 64); + } + @Override public void renderToBuffer(PoseStack ms, VertexConsumer buffer, int light, int overlay, int color) { renderArmorPart(slot); From 8c64eea5d1567f01c0666dd77875e91a90cb6e39 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:24:14 -0400 Subject: [PATCH 07/45] Implement model variant 2 --- .../client/model/HexRobesModel.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java index 87eab13823..98e1bb615f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java @@ -112,6 +112,82 @@ public static LayerDefinition variant1() { return LayerDefinition.create(meshdef, 64, 64); } + public static LayerDefinition variant2() { + MeshDefinition meshdef = new MeshDefinition(); + PartDefinition root = meshdef.getRoot(); + + root.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + + var head = root.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + + head.addOrReplaceChild("hood", + CubeListBuilder.create() + .texOffs(0, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.3F)) + .texOffs(0, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.4F)), + PartPose.offset(4.0F, -8.0F, -4.0F)); + + head.addOrReplaceChild("right_horn", + CubeListBuilder.create() + .texOffs(24, 0).addBox(-4.0F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)), + PartPose.offsetAndRotation(4.25F, -12.25F, 0.0F, 0.0F, 0.0F, -1.5708F)); + + head.addOrReplaceChild("left_horn", + CubeListBuilder.create() + .texOffs(24, 0).mirror().addBox(-4.0F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, new CubeDeformation(0.0F)) + .mirror(false), + PartPose.offsetAndRotation(-4.25F, -12.25F, 0.0F, 0.0F, 0.0F, 1.5708F)); + + var body = root.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + + body.addOrReplaceChild("tunic", + CubeListBuilder.create() + .texOffs(40, 0).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)) + .texOffs(40, 16).addBox(-8.0F, 0.0F, 0.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.4F)), + PartPose.offset(4.0F, 0.0F, -2.0F)); + + var rightArm = root.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + + rightArm.addOrReplaceChild("right_sleeve", + CubeListBuilder.create() + .texOffs(0, 32).addBox(0.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)), + PartPose.offset(-3.0F, -2.0F, -2.0F)); + + var leftArm = root.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + + leftArm.addOrReplaceChild("left_sleeve", + CubeListBuilder.create() + .texOffs(0, 32).mirror().addBox(0, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)) + .mirror(false), + PartPose.offset(-1.0F, -2.0F, -2.0F)); + + var rightLeg = root.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + + rightLeg.addOrReplaceChild("right_skirt", + CubeListBuilder.create() + .texOffs(48, 32).mirror().addBox(-4.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.4F)) + .mirror(false), + PartPose.offset(2.0F, 0.0F, -2.0F)); + + rightLeg.addOrReplaceChild("right_boot", + CubeListBuilder.create() + .texOffs(16, 40).addBox(-4.0F, 8.0F, 0.0F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.3F)), + PartPose.offset(2.0F, 0.0F, -2.0F)); + + var leftLeg = root.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + leftLeg.addOrReplaceChild("left_skirt", + CubeListBuilder.create() + .texOffs(48, 32).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.4F)), + PartPose.offset(2.0F, 0.0F, -2.0F)); + + leftLeg.addOrReplaceChild("left_boot", + CubeListBuilder.create() + .texOffs(16, 40).addBox(-4.0F, 8.0F, 0.0F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.3F)), + PartPose.offset(2.0F, 0.0F, -2.0F)); + + return LayerDefinition.create(meshdef, 64, 64); + } + public static LayerDefinition variant3() { MeshDefinition meshdef = new MeshDefinition(); PartDefinition root = meshdef.getRoot(); From 2cb8d213ab00209036b83c6a1a8ad8cdb9ca771f Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:32:39 -0400 Subject: [PATCH 08/45] Add blockbench models to repo --- art/robes/Robes1.bbmodel | 1 + art/robes/Robes2.bbmodel | 1 + art/robes/Robes3.bbmodel | 1 + 3 files changed, 3 insertions(+) create mode 100644 art/robes/Robes1.bbmodel create mode 100644 art/robes/Robes2.bbmodel create mode 100644 art/robes/Robes3.bbmodel diff --git a/art/robes/Robes1.bbmodel b/art/robes/Robes1.bbmodel new file mode 100644 index 0000000000..61a422e741 --- /dev/null +++ b/art/robes/Robes1.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes1","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":7,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"1581b57e-00c2-c3a2-d822-b969220a28d4"},{"name":"hood_inner","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"c5b38b99-6a56-d9ff-e64c-7b6f865f9a78"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-11.7,28.2,0],"to":[-3.7,32.2,0],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,4],"texture":0},"east":{"uv":[24,0,24,4],"texture":0},"south":{"uv":[32,0,40,4],"texture":0},"west":{"uv":[32,0,32,4],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"6964045e-8723-0987-f243-5ea5477fe7de"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[3.8,28.2,0],"to":[11.8,32.2,0],"autouv":0,"color":0,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,4],"texture":0},"east":{"uv":[32,0,32,4],"texture":0},"south":{"uv":[40,0,32,4],"texture":0},"west":{"uv":[24,0,24,4],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"f33f09f2-5156-ad5f-6a83-b6ec43dd94ba"},{"name":"tunic_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":4,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"e8531e9d-18f6-891f-90e4-7521fdc4d333"},{"name":"tunic_inner","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":7,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"39cd0047-8c4e-0c56-9ba0-6821e5288d85"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"980d2769-4452-dfb8-65e0-279fe928b4dc"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":0,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"a67ab72a-fddc-6238-2450-0efdf132c8f1"},{"name":"right_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.75,0.25,-2],"to":[5.75,12.25,2],"autouv":0,"color":1,"mirror_uv":true,"inflate":0.4,"rotation":[0,0,7.5],"origin":[1.75,0.25,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"9f17843d-d8f7-54ed-8955-46c9f9b16c58"},{"name":"left_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-5.85,0.25,-2],"to":[-1.85,12.25,2],"autouv":0,"color":6,"inflate":0.4,"rotation":[0,0,-7.5],"origin":[-1.75,-0.25,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"948db43e-cb45-4d54-b8c9-2fff5114297d"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,3,2],"autouv":0,"color":9,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,41],"faces":{"north":{"uv":[20,45,24,48],"texture":0},"east":{"uv":[16,45,20,48],"texture":0},"south":{"uv":[28,45,32,48],"texture":0},"west":{"uv":[24,45,28,48],"texture":0},"up":{"uv":[24,45,20,41],"texture":0},"down":{"uv":[28,41,24,45],"texture":0}},"type":"cube","uuid":"79498393-90f7-57dc-503c-6574ada461b9"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,3,2],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,41],"faces":{"north":{"uv":[20,45,24,48],"texture":0},"east":{"uv":[16,45,20,48],"texture":0},"south":{"uv":[28,45,32,48],"texture":0},"west":{"uv":[24,45,28,48],"texture":0},"up":{"uv":[24,45,20,41],"texture":0},"down":{"uv":[28,41,24,45],"texture":0}},"type":"cube","uuid":"ef919b63-e2e6-f0f2-daa2-f3617e632db6"}],"groups":[{"name":"head","uuid":"fd15bc83-0616-6b91-4dc0-205078c28696","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"horns","uuid":"392fe1f0-1ca6-16cb-3fdf-f4df1acbea50","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4.8,32.2,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"body","uuid":"3ce8c80e-9c6b-c2c7-d890-65103951659b","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"8b7e8f66-6842-18bf-5ec6-ed8186b30dcc","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"3f6f3a5d-40f0-79e0-f4c7-8260f3f17f66","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"ad7f6d7b-a515-346a-234d-92719a8f6f03","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[2,12.25,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"89bec69e-bfd8-c0e8-d1df-5948a74a5ae4","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4.1,12.5,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"fd15bc83-0616-6b91-4dc0-205078c28696","isOpen":true,"children":["c5b38b99-6a56-d9ff-e64c-7b6f865f9a78","1581b57e-00c2-c3a2-d822-b969220a28d4",{"uuid":"392fe1f0-1ca6-16cb-3fdf-f4df1acbea50","isOpen":false,"children":["6964045e-8723-0987-f243-5ea5477fe7de","f33f09f2-5156-ad5f-6a83-b6ec43dd94ba"]}]},{"uuid":"3ce8c80e-9c6b-c2c7-d890-65103951659b","isOpen":true,"children":["39cd0047-8c4e-0c56-9ba0-6821e5288d85","e8531e9d-18f6-891f-90e4-7521fdc4d333"]},{"uuid":"3f6f3a5d-40f0-79e0-f4c7-8260f3f17f66","isOpen":true,"children":["980d2769-4452-dfb8-65e0-279fe928b4dc"]},{"uuid":"8b7e8f66-6842-18bf-5ec6-ed8186b30dcc","isOpen":true,"children":["a67ab72a-fddc-6238-2450-0efdf132c8f1"]},{"uuid":"ad7f6d7b-a515-346a-234d-92719a8f6f03","isOpen":true,"children":["9f17843d-d8f7-54ed-8955-46c9f9b16c58","ef919b63-e2e6-f0f2-daa2-f3617e632db6"]},{"uuid":"89bec69e-bfd8-c0e8-d1df-5948a74a5ae4","isOpen":true,"children":["948db43e-cb45-4d54-b8c9-2fff5114297d","79498393-90f7-57dc-503c-6574ada461b9"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"76798d81-bebb-9cf7-cb53-4b3c6019c51a","source":"data:image/png;base64,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"}]} \ No newline at end of file diff --git a/art/robes/Robes2.bbmodel b/art/robes/Robes2.bbmodel new file mode 100644 index 0000000000..690b827aa2 --- /dev/null +++ b/art/robes/Robes2.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes2","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":3,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"b2301383-7b8a-8d9f-c284-318663224705"},{"name":"hood_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":0,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"cec6b116-5e7e-77d1-1f1a-e56dfe32702c"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8.25,34.25,0],"to":[-0.25,38.25,0],"autouv":0,"color":6,"rotation":[0,0,-90],"origin":[-4.25,36.25,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,4],"texture":0},"east":{"uv":[24,0,24,4],"texture":0},"south":{"uv":[32,0,40,4],"texture":0},"west":{"uv":[32,0,32,4],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"cae1f41b-7569-26aa-acc4-3ed8d8815444"},{"name":"tunic_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":7,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"a19f6d42-3fe9-bb4c-480e-d6574977d99f"},{"name":"tunic_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"d6c0c5b1-527b-cf1f-061a-36c7e9bb98db"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":3,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"818aa72b-cef1-58e9-725c-5eaa37f7b9dc"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":7,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"dbf8c827-9338-7729-bb47-4f346cdf3592"},{"name":"left_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,12,2],"autouv":0,"color":8,"inflate":0.4,"origin":[-4,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"22bfadf3-71a3-962a-553b-5d9aff88ddc3"},{"name":"right_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,12,2],"autouv":0,"color":8,"mirror_uv":true,"inflate":0.4,"origin":[4,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"1f6091bd-5faa-e333-da79-c6c57a92952a"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,4,2],"autouv":0,"color":8,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"5a38ae46-c69d-e663-6bf0-db99aa735735"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,4,2],"autouv":0,"color":4,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"60e41237-317f-4c78-8b20-dab88a2ba123"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0.25,34.25,0],"to":[8.25,38.25,0],"autouv":0,"color":7,"mirror_uv":true,"rotation":[0,0,90],"origin":[4.25,36.25,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,4],"texture":0},"east":{"uv":[32,0,32,4],"texture":0},"south":{"uv":[40,0,32,4],"texture":0},"west":{"uv":[24,0,24,4],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"c3b4c436-d99b-e573-ef06-7f6c2bd3370f"}],"groups":[{"name":"head","uuid":"a98bbf19-0b66-952c-1616-51351bc4fde0","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"body","uuid":"a946c104-4b18-70b2-14d4-8c06829849be","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"26a798c8-f71d-51b0-0be9-e11439c93c86","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"759c4eae-7953-1987-4504-74b1555e5c39","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"46e6c36b-8782-ecc4-f6be-415512f92d4a","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"e5bb982a-468b-c3e8-d99f-7b7a594eefed","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"horns","uuid":"5e0675dc-8bb1-c564-3970-d9333592e0b3","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4.25,36.25,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"a98bbf19-0b66-952c-1616-51351bc4fde0","isOpen":true,"children":["cec6b116-5e7e-77d1-1f1a-e56dfe32702c","b2301383-7b8a-8d9f-c284-318663224705",{"uuid":"5e0675dc-8bb1-c564-3970-d9333592e0b3","isOpen":true,"children":["cae1f41b-7569-26aa-acc4-3ed8d8815444","c3b4c436-d99b-e573-ef06-7f6c2bd3370f"]}]},{"uuid":"a946c104-4b18-70b2-14d4-8c06829849be","isOpen":true,"children":["d6c0c5b1-527b-cf1f-061a-36c7e9bb98db","a19f6d42-3fe9-bb4c-480e-d6574977d99f"]},{"uuid":"26a798c8-f71d-51b0-0be9-e11439c93c86","isOpen":true,"children":["dbf8c827-9338-7729-bb47-4f346cdf3592"]},{"uuid":"759c4eae-7953-1987-4504-74b1555e5c39","isOpen":true,"children":["818aa72b-cef1-58e9-725c-5eaa37f7b9dc"]},{"uuid":"e5bb982a-468b-c3e8-d99f-7b7a594eefed","isOpen":true,"children":["1f6091bd-5faa-e333-da79-c6c57a92952a","60e41237-317f-4c78-8b20-dab88a2ba123"]},{"uuid":"46e6c36b-8782-ecc4-f6be-415512f92d4a","isOpen":true,"children":["22bfadf3-71a3-962a-553b-5d9aff88ddc3","5a38ae46-c69d-e663-6bf0-db99aa735735"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"ae10bf54-61f3-91d7-642d-574fba3483bc","source":"data:image/png;base64,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"}]} \ No newline at end of file diff --git a/art/robes/Robes3.bbmodel b/art/robes/Robes3.bbmodel new file mode 100644 index 0000000000..5c0bb4790f --- /dev/null +++ b/art/robes/Robes3.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes3","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":4,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"bb31bdb7-b4f5-8fd6-0631-ad789263fce7"},{"name":"hood_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":8,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759"},{"name":"body_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":5,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"94261ed0-a8a6-8d18-ac42-13127515d848"},{"name":"body_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":3,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"9c87cab3-03d4-97ee-21bd-9815d0e98d53"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":0,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"fd5e025b-d5f6-8bd3-d981-66783aa2a923"},{"name":"right_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,12,2],"autouv":0,"color":3,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"e035f1e5-f5da-d86a-efe6-d73b506ae82e"},{"name":"left_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,12,2],"autouv":0,"color":9,"mirror_uv":true,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"92e4165d-8268-5063-8211-7221aae1b76e"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,4,2],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"0c26f55d-2961-ea9c-ea83-843b23d37a98"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,4,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"3bb185dc-1abc-3fe5-b883-7af7889a4f3f"},{"name":"strap","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-0.2,11.95,-3],"to":[9.8,14.95,3],"autouv":0,"color":2,"rotation":[0,0,22.5],"origin":[0.75,1.75,0],"uv_offset":[0,48],"faces":{"north":{"uv":[6,54,16,57],"texture":0},"east":{"uv":[0,54,6,57],"texture":0},"south":{"uv":[22,54,32,57],"texture":0},"west":{"uv":[16,54,22,57],"texture":0},"up":{"uv":[16,54,6,48],"texture":0},"down":{"uv":[26,48,16,54],"texture":0}},"type":"cube","uuid":"5595171c-e809-03ca-68ed-7115d9ffbb94"},{"name":"buckle","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.95,14.1,-3],"to":[4.95,17.1,3],"autouv":0,"color":6,"inflate":0.1,"origin":[0.75,0,0],"uv_offset":[32,48],"faces":{"north":{"uv":[38,54,41,57],"texture":0},"east":{"uv":[32,54,38,57],"texture":0},"south":{"uv":[47,54,50,57],"texture":0},"west":{"uv":[41,54,47,57],"texture":0},"up":{"uv":[41,54,38,48],"texture":0},"down":{"uv":[44,48,41,54],"texture":0}},"type":"cube","uuid":"4cb47817-d5c8-81f7-ce53-eddcf011ee3e"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,28.5,0],"to":[12,36.5,0],"autouv":0,"color":0,"mirror_uv":true,"rotation":[0,0,75],"origin":[5,32.5,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,8],"texture":0},"east":{"uv":[32,0,32,8],"texture":0},"south":{"uv":[40,0,32,8],"texture":0},"west":{"uv":[24,0,24,8],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"00b324ac-7d37-b5d8-4201-5e85760400af"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-12,28.6,0],"to":[-4,36.6,0],"autouv":0,"color":0,"rotation":[0,0,-75],"origin":[-5,32.6,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,8],"texture":0},"east":{"uv":[24,0,24,8],"texture":0},"south":{"uv":[32,0,40,8],"texture":0},"west":{"uv":[32,0,32,8],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"a9e5e1e6-b585-094b-da8c-835678984610"}],"groups":[{"name":"head","uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"body","uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"sash","uuid":"01148eb6-5484-1b29-ae31-deabde803a47","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-5.45,13.2,-3],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"horns","uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[5,32.5,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","isOpen":true,"children":[{"uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","isOpen":true,"children":["00b324ac-7d37-b5d8-4201-5e85760400af","a9e5e1e6-b585-094b-da8c-835678984610"]},"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759","bb31bdb7-b4f5-8fd6-0631-ad789263fce7"]},{"uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","isOpen":true,"children":["bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40","94261ed0-a8a6-8d18-ac42-13127515d848",{"uuid":"01148eb6-5484-1b29-ae31-deabde803a47","isOpen":false,"children":["5595171c-e809-03ca-68ed-7115d9ffbb94","4cb47817-d5c8-81f7-ce53-eddcf011ee3e"]}]},{"uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","isOpen":true,"children":["fd5e025b-d5f6-8bd3-d981-66783aa2a923"]},{"uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","isOpen":true,"children":["9c87cab3-03d4-97ee-21bd-9815d0e98d53"]},{"uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","isOpen":true,"children":["e035f1e5-f5da-d86a-efe6-d73b506ae82e","3bb185dc-1abc-3fe5-b883-7af7889a4f3f"]},{"uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","isOpen":true,"children":["92e4165d-8268-5063-8211-7221aae1b76e","0c26f55d-2961-ea9c-ea83-843b23d37a98"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"af3aae18-9f98-d4de-7b0f-c58cd9965743","source":"data:image/png;base64,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"}]} \ No newline at end of file From 8a8c4999a98b5c35df1623db69a099bc03f1148b Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 22:34:21 -0400 Subject: [PATCH 09/45] Get variant-cycling working --- .../hexcasting/models/item/robes/boots.json | 22 ++++++++++- .../item/robes/{mask.json => boots_1.json} | 2 +- .../hexcasting/models/item/robes/boots_2.json | 2 +- .../hexcasting/models/item/robes/hood.json | 26 +++++++++++++ .../hexcasting/models/item/robes/hood_1.json | 6 +++ .../hexcasting/models/item/robes/hood_2.json | 6 +++ .../hexcasting/models/item/robes/legs.json | 22 ++++++++++- .../hexcasting/models/item/robes/legs_1.json | 6 +++ .../hexcasting/models/item/robes/legs_2.json | 6 +++ .../hexcasting/models/item/robes/tunic.json | 22 ++++++++++- .../hexcasting/models/item/robes/tunic_1.json | 6 +++ .../hexcasting/models/item/robes/tunic_2.json | 6 +++ .../client/RegisterClientStuff.java | 4 ++ .../client/model/HexModelLayers.java | 8 +++- .../client/model/HexRobesModel.java | 6 +-- .../common/items/armor/ItemRobes.java | 35 +++++++++--------- .../hexcasting/common/lib/HexItems.java | 2 +- .../hexcasting/textures/armor/robes0.png | Bin 0 -> 1429 bytes .../hexcasting/textures/armor/robes1.png | Bin 1429 -> 1493 bytes .../hexcasting/textures/armor/robes2.png | Bin 1493 -> 1749 bytes .../hexcasting/textures/armor/robes3.png | Bin 1749 -> 0 bytes .../item/robes/{boots1.png => 0_boots.png} | Bin .../item/robes/{helmet1.png => 0_hood.png} | Bin .../item/robes/{leggings1.png => 0_legs.png} | Bin .../robes/{chestplate1.png => 0_tunic.png} | Bin .../item/robes/{boots2.png => 1_boots.png} | Bin .../item/robes/{helmet2.png => 1_hood.png} | Bin .../item/robes/{leggings2.png => 1_legs.png} | Bin .../robes/{chestplate2.png => 1_tunic.png} | Bin .../item/robes/{boots3.png => 2_boots.png} | Bin .../item/robes/{helmet3.png => 2_hood.png} | Bin .../item/robes/{leggings3.png => 2_legs.png} | Bin .../robes/{chestplate3.png => 2_tunic.png} | Bin .../fabric/client/HexRobesRenderer.java | 4 +- .../hexcasting/models/item/robes/boots.json | 22 ++++++++++- .../hexcasting/models/item/robes/boots_1.json | 6 +++ .../hexcasting/models/item/robes/boots_2.json | 6 +++ .../hexcasting/models/item/robes/hood.json | 26 +++++++++++++ .../hexcasting/models/item/robes/hood_1.json | 6 +++ .../hexcasting/models/item/robes/hood_2.json | 6 +++ .../hexcasting/models/item/robes/legs.json | 22 ++++++++++- .../hexcasting/models/item/robes/legs_1.json | 6 +++ .../hexcasting/models/item/robes/legs_2.json | 6 +++ .../hexcasting/models/item/robes/tunic.json | 22 ++++++++++- .../hexcasting/models/item/robes/tunic_1.json | 6 +++ .../hexcasting/models/item/robes/tunic_2.json | 6 +++ .../forge/ForgeHexClientInitializer.java | 13 ++++--- .../forge/datagen/xplat/HexItemModels.java | 22 ++++++++--- art/robes/Robes0.bbmodel | 1 + art/robes/Robes1.bbmodel | 2 +- art/robes/Robes2.bbmodel | 2 +- art/robes/Robes3.bbmodel | 1 - 52 files changed, 325 insertions(+), 47 deletions(-) rename Common/src/generated/resources/assets/hexcasting/models/item/robes/{mask.json => boots_1.json} (57%) rename Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/mask.json => Common/src/generated/resources/assets/hexcasting/models/item/robes/boots_2.json (57%) create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/hood.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/hood_1.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/hood_2.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/legs_1.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/legs_2.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic_1.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic_2.json create mode 100644 Common/src/main/resources/assets/hexcasting/textures/armor/robes0.png delete mode 100644 Common/src/main/resources/assets/hexcasting/textures/armor/robes3.png rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{boots1.png => 0_boots.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{helmet1.png => 0_hood.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{leggings1.png => 0_legs.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{chestplate1.png => 0_tunic.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{boots2.png => 1_boots.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{helmet2.png => 1_hood.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{leggings2.png => 1_legs.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{chestplate2.png => 1_tunic.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{boots3.png => 2_boots.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{helmet3.png => 2_hood.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{leggings3.png => 2_legs.png} (100%) rename Common/src/main/resources/assets/hexcasting/textures/item/robes/{chestplate3.png => 2_tunic.png} (100%) create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots_1.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots_2.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood_1.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood_2.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs_1.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs_2.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic_1.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic_2.json create mode 100644 art/robes/Robes0.bbmodel delete mode 100644 art/robes/Robes3.bbmodel diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots.json index d872efd81d..264198cc15 100644 --- a/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots.json +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots.json @@ -1,6 +1,26 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/robes/boots", + "predicate": { + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/robes/boots_1", + "predicate": { + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/robes/boots_2", + "predicate": { + "hexcasting:variant": 2.0 + } + } + ], "textures": { - "layer0": "hexcasting:item/robes/boots1" + "layer0": "hexcasting:item/robes/0_boots" } } \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/mask.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots_1.json similarity index 57% rename from Common/src/generated/resources/assets/hexcasting/models/item/robes/mask.json rename to Common/src/generated/resources/assets/hexcasting/models/item/robes/boots_1.json index 4465daf8f4..fe6a221473 100644 --- a/Common/src/generated/resources/assets/hexcasting/models/item/robes/mask.json +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots_1.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "hexcasting:item/robes/helmet1" + "layer0": "hexcasting:item/robes/1_boots" } } \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/mask.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots_2.json similarity index 57% rename from Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/mask.json rename to Common/src/generated/resources/assets/hexcasting/models/item/robes/boots_2.json index 4465daf8f4..27a0c192a7 100644 --- a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/mask.json +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/boots_2.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "hexcasting:item/robes/helmet1" + "layer0": "hexcasting:item/robes/2_boots" } } \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/hood.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/hood.json new file mode 100644 index 0000000000..d2218f4994 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/hood.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/robes/hood", + "predicate": { + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/robes/hood_1", + "predicate": { + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/robes/hood_2", + "predicate": { + "hexcasting:variant": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/robes/0_hood" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/hood_1.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/hood_1.json new file mode 100644 index 0000000000..4631bfe281 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/hood_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/1_hood" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/hood_2.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/hood_2.json new file mode 100644 index 0000000000..0761f55547 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/hood_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/2_hood" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs.json index fb41385983..03d57e0536 100644 --- a/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs.json +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs.json @@ -1,6 +1,26 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/robes/legs", + "predicate": { + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/robes/legs_1", + "predicate": { + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/robes/legs_2", + "predicate": { + "hexcasting:variant": 2.0 + } + } + ], "textures": { - "layer0": "hexcasting:item/robes/leggings1" + "layer0": "hexcasting:item/robes/0_legs" } } \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs_1.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs_1.json new file mode 100644 index 0000000000..93054eafd4 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/1_legs" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs_2.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs_2.json new file mode 100644 index 0000000000..b5667a0aec --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/legs_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/2_legs" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json index 4c9f5cb987..da671641b8 100644 --- a/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json @@ -1,6 +1,26 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/robes/tunic", + "predicate": { + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/robes/tunic_1", + "predicate": { + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/robes/tunic_2", + "predicate": { + "hexcasting:variant": 2.0 + } + } + ], "textures": { - "layer0": "hexcasting:item/robes/chestplate1" + "layer0": "hexcasting:item/robes/0_tunic" } } \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic_1.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic_1.json new file mode 100644 index 0000000000..797dbbc608 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/1_tunic" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic_2.json b/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic_2.json new file mode 100644 index 0000000000..a665bce0cb --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/robes/tunic_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/2_tunic" + } +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java index 0fcaac0f46..70b12989bc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java @@ -67,6 +67,10 @@ public static void init() { registerVariantOverrides(HexItems.CYPHER.get(), HexItems.CYPHER.get()::getVariant); registerVariantOverrides(HexItems.TRINKET.get(), HexItems.TRINKET.get()::getVariant); registerVariantOverrides(HexItems.ARTIFACT.get(), HexItems.ARTIFACT.get()::getVariant); + registerVariantOverrides(HexItems.ROBES_HOOD.get(), HexItems.ROBES_HOOD.get()::getVariant); + registerVariantOverrides(HexItems.ROBES_TUNIC.get(), HexItems.ROBES_TUNIC.get()::getVariant); + registerVariantOverrides(HexItems.ROBES_LEGS.get(), HexItems.ROBES_LEGS.get()::getVariant); + registerVariantOverrides(HexItems.ROBES_BOOTS.get(), HexItems.ROBES_BOOTS.get()::getVariant); IClientXplatAbstractions.INSTANCE.registerItemProperty(HexItems.THOUGHT_KNOT.get(), ItemThoughtKnot.WRITTEN_PRED, (stack, level, holder, holderID) -> { if (stack.has(HexDataComponents.IOTA_HOLDER_IOTA.get())) { diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexModelLayers.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexModelLayers.java index d220649bce..eeeee86310 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexModelLayers.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexModelLayers.java @@ -13,7 +13,9 @@ public class HexModelLayers { public static final ModelLayerLocation ALTIORA = make("altiora"); - public static final ModelLayerLocation ROBES = make("robes"); + public static final ModelLayerLocation ROBES_0 = make("robes_0"); + public static final ModelLayerLocation ROBES_1 = make("robes_1"); + public static final ModelLayerLocation ROBES_2 = make("robes_2"); private static ModelLayerLocation make(String name) { return make(name, "main"); @@ -29,6 +31,8 @@ private static ModelLayerLocation make(String name, String layer) { // https://github.com/VazkiiMods/Botania/blob/1.19.x/Xplat/src/main/java/vazkii/botania/client/model/BotaniaLayerDefinitions.java public static void init(BiConsumer> consumer) { consumer.accept(ALTIORA, ElytraModel::createLayer); - consumer.accept(ROBES, HexRobesModel::variant1); + consumer.accept(ROBES_0, HexRobesModel::variant0); + consumer.accept(ROBES_1, HexRobesModel::variant1); + consumer.accept(ROBES_2, HexRobesModel::variant2); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java index 98e1bb615f..978bb6666c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java @@ -40,7 +40,7 @@ public HexRobesModel(ModelPart root, EquipmentSlot slot) { this.leftLeg = root.getChild("left_leg"); } - public static LayerDefinition variant1() { + public static LayerDefinition variant0() { MeshDefinition meshdef = new MeshDefinition(); PartDefinition root = meshdef.getRoot(); @@ -112,7 +112,7 @@ public static LayerDefinition variant1() { return LayerDefinition.create(meshdef, 64, 64); } - public static LayerDefinition variant2() { + public static LayerDefinition variant1() { MeshDefinition meshdef = new MeshDefinition(); PartDefinition root = meshdef.getRoot(); @@ -188,7 +188,7 @@ public static LayerDefinition variant2() { return LayerDefinition.create(meshdef, 64, 64); } - public static LayerDefinition variant3() { + public static LayerDefinition variant2() { MeshDefinition meshdef = new MeshDefinition(); PartDefinition root = meshdef.getRoot(); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java index ad8e020d75..d828024cfc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java @@ -2,18 +2,15 @@ import at.petrak.hexcasting.annotations.SoftImplement; import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.api.item.VariantItem; import at.petrak.hexcasting.client.model.HexModelLayers; import at.petrak.hexcasting.client.model.HexRobesModel; import net.minecraft.client.Minecraft; -import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.EntityModelSet; -import net.minecraft.client.model.geom.ModelPart; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ItemStack; @@ -21,33 +18,37 @@ /** * To get the armor model in; - * On forge: cursed self-mixin - * On fabric: hook in ClientInit + * On forge: client item extension in ForgeHexClientInitializer (line 161) + * On fabric: custom HexRobesRenderer set up from FabricHexClientInitializer (line 60) */ -public class ItemRobes extends ArmorItem { +public class ItemRobes extends ArmorItem implements VariantItem { public final ArmorItem.Type type; - private @Nullable HexRobesModel model; + private @Nullable HexRobesModel[] models; public ItemRobes(ArmorItem.Type type, Properties properties) { super(Holder.direct(HexAPI.instance().robesMaterial()), type, properties); this.type = type; } - // TODO: return a collection holding all the variants for the given slot - public static HexRobesModel provideArmorModelForSlot(EquipmentSlot slot) { + public static HexRobesModel[] provideArmorModelsForSlot(EquipmentSlot slot) { EntityModelSet models = Minecraft.getInstance().getEntityModels(); - ModelPart root = models.bakeLayer(HexModelLayers.ROBES); - return new HexRobesModel(root, slot); + return new HexRobesModel[] { + new HexRobesModel(models.bakeLayer(HexModelLayers.ROBES_0), slot), + new HexRobesModel(models.bakeLayer(HexModelLayers.ROBES_1), slot), + new HexRobesModel(models.bakeLayer(HexModelLayers.ROBES_2), slot) + }; } - public HexRobesModel getArmorModel() { - if (model == null) model = provideArmorModelForSlot(getEquipmentSlot()); - return model; + public HexRobesModel[] getArmorModels() { + if (models == null) models = provideArmorModelsForSlot(getEquipmentSlot()); + return models; } @SoftImplement("IItemExtension") public ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, ArmorMaterial.Layer layer, boolean innerModel) { - // TODO: detect variant based on itemstack data - return HexAPI.modLoc("textures/armor/robes1.png"); + return HexAPI.modLoc("textures/armor/robes"+getVariant(stack)+".png"); } + + @Override + public int numVariants() { return 3; } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index 5009bdaa4c..16d4c1cdfa 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -76,7 +76,7 @@ public static void registerItemsForCreativeTab(ResourceKey tabK IXplatAbstractions.INSTANCE.addEquipSlotFabric(EquipmentSlot.HEAD) .stacksTo(1).attributes(ItemLens.MODIFIERS))); - public static final Supplier ROBES_MASK = make("robes/mask", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable())); + public static final Supplier ROBES_HOOD = make("robes/hood", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable())); public static final Supplier ROBES_TUNIC = make("robes/tunic", () -> new ItemRobes(ArmorItem.Type.CHESTPLATE, unstackable())); public static final Supplier ROBES_LEGS = make("robes/legs", () -> new ItemRobes(ArmorItem.Type.LEGGINGS, unstackable())); public static final Supplier ROBES_BOOTS = make("robes/boots", () -> new ItemRobes(ArmorItem.Type.BOOTS, unstackable())); diff --git a/Common/src/main/resources/assets/hexcasting/textures/armor/robes0.png b/Common/src/main/resources/assets/hexcasting/textures/armor/robes0.png new file mode 100644 index 0000000000000000000000000000000000000000..2218a6e628f0aab87649a57ee478783f85f5719d GIT binary patch literal 1429 zcmV;G1#0?@ZUZ9pto;YeP>B3x!;BFpT+-OK%~EL182i7=)7D zIu;5YI~4Egz{)6egpG7-OGj8tqXt`+q8L=?&}fJ3r##6|(v$xr^3VrDC( z-p3v3Q-Axyp+oZ44_{zU*I^traP7m1jumvHt5y5DX;v-P5lypd4aiqQkC__C;PRy* z`}5(k4gfHks!%^m;`nV1No^O2gFo?W>3&Dv<&mGdA&p(VF6n9&s!{=PYWVBFf3xUw zJCIQT9L9?F6O#4rAM2#Kgm-&2=&zolv44WUwomZOV*}s3IFW)vE;W$xRdiQ>?3m%5 zCqG+5nJduMD)Lh|LeGA;Q$U&=xoI69>oA&XOQ*v`X8$jNMu z8%@>GPHkc36X$A41nJlTyvi!l7lzB1h8%^ASJd47qVmb5=@skSCmS6p=w;}aQwsp# zo5RcH#kNzBj1YA+Pd+I+*dIIJBa<5k0H{g@*YfkiiuQtu)JNRwu<}AFuvK0~<>hmz zN(HJ?LFMIhY?W8T=o?uQz-g8A`Xg@6e$BlW`ED=RGhT78!^$V_|NfKj7gGZnH0pJ1 zl~h(Y)gMPbH4v%%mj;|egp%h?e+^?-yxE1Fa?d}(q7jgha0UdS4J(tRMw9bdo zCqFWV{UZ&~34Sw>ox9c^C52lYh-p^cE+X!@*~X7@EZX96R@ZM){UY+L@xbW}`)$Sm=Z%+QsUWS* ztXrdl>9Z7IjnPcgF(_|0=eNV-IYu#RP>dR$z1g#`MHn4SBR?``|7Lz<%r?GQDoC1X z1}@b+hZjo)Y5zz&pCZUJRov$c{4 z@-8a}IExY)ol9jqE`~vMg7j1jXS+zcaU(#qNO|?~W}L!4O!$k!i-MrpCz2#g`RR^= zAb7LSD&b{px1Dentyx!IE!Xo&##anTEQFCI05CXelJaX^^US-U5>DB)QI`{`bw8{YndoprXK>wus%h;sM? zr)xhM%o3GJjJ=L>@zYEbOVcYBr2(4`Wc0%19g7^|yAz}+paVv~&OSXa*x0@+u?0{w zP5%cY?7cGp+=q|!<|mQKjf39*rFVk~U9I9Pd}h(3_V??i(D?1MOv0|Ywc42z>meJj=MuVE~+RJLXXBobDnOkX$#Jri;0PeiHV7c jiHV7ciHV7ci4y+;a70dcW5=|m00000NkvXXu0mjfs#n28 literal 0 HcmV?d00001 diff --git a/Common/src/main/resources/assets/hexcasting/textures/armor/robes1.png b/Common/src/main/resources/assets/hexcasting/textures/armor/robes1.png index 2218a6e628f0aab87649a57ee478783f85f5719d..cb621b6072c69b7ae7516f645ef3e41c0f831d39 100644 GIT binary patch delta 1475 zcmV;!1w8td3)KsdB!8SqL_t(|ob8%lXdFcx$G;m65)aJfE|-vAN@6u)1BOU#A&5kR z`qB_k8dAiRzLRNgyH(rFn}eilT7D7cB`Iq)-i(Mw8Nzc!${>cYAxc z32ZM9&HB*JI=ef&J9~SVTx36Ru)Fiyo%#Ld_h)8rg>T;aN`Kqhks+%pL?wqzQ9^QK zR={H>1|~K5VC=>#h$lKAiD?|~IxV>0;Y{-rCw+}4|6t89hS0e$Mvy8LpzQ3T_o+_b z12j{RvifmJ&1$qEN@`YX2)BCfGtv-8Q+-rFFYXlp07^;XYNx5&dyqp&-auXEPy9MR z=gYb*diu@^$A7y{3k4|)NlXKHr1(GUziH&W9Eef?49fDh69nzy-`aj@0uNI;6z<=~ z?$$p3THePmOA0<&+ZWtiF47Qp9Oy=2$uPrrZ~dS}Z684#!71Dc3%0=#K5HX*{vJC256_~yM1E-;26VK7v3*B1c?&7hGxl!cssju_jAM( z9RL7HOry7FlzX7npfmC;^Vq9AR|qUFOd)-56_S{SB&LzRw~EDuDKF!#S?YjCS<>!D z7#jYFd4J4vZ#76M_nF6DE=*xJpLbQ#?b&`Q z?iCCxzH;QbLV%uer)$;1JaCrM=5}6rE&~uRAn?roQNhswN=ed7#^~sE?B?^>&F3*X zdfn1qP0am}WBR(eombwq2J^fR5S1MBdLq)|tAEbBjpu{;3jlzR2j}#5ul;ea0{|cv z4g&yWRn@QADeu-+3H)rQ30wvsikr`ALmUSEXWjz~d<=w(aUj4(ppy)JN@Q2&X!`na^dG zK{`&IlGOP8C4sf@V9mJQ47l-H_lsz6i~#_)c4Pq1&-*@n2C0!GEK(dEhj|UFQV=s4xELxcX~ridzi1vYkSvC?O;& zIo(Z(5fYIWPuZHt(ryn_W;aOxRbQ^m(9`c|nWFW*MRH?Su-rI3IHS2$fLg}9Zg3mF zr3xJO7Wbg3`OQ$Zu^8b0u*dg;C4WBXZ-$(Rg~MoXjA8i8^EH(t=(22Ap&WOETRXB| zE}Up@j2Y@|t>7hx$*O8KfZOh@T-k$yF1@jE*f87Xb5Y6JC&8ooE|694on)CyVG;&* z?&QV&-{>AQ)aCD2Z&clDc=j+vH>L*=*S6d5(=xRP&kEFaJ8YK>Yc=^1l7AbsLZ&FW zzRDwC#M&Bw&#i-%nP{pI&?C(-p3v3Q-Axyp+oZ44_{zU*I^traP7m1jumvH zt5y5DX;v-P5lypd4aiqQkC__C;PRy*`}5(k4gfHks!%^m;`nV1No^O2gFo?W>3&Dv z<&mGdA&p(VE`RB26{=DJaBBGLzkjpnb32ex0361O_7jrz?jP%0BDsC=sOx#(ZOF-NjvGzY(N1k)<$n|BYDom?*a5uCD$*B*%a?{6 zg^X9!-2I~R$))KP>)R(A9VzH#=$BIq0N|U$%jLzkQ;>`hbu>>tDLU96JKrOd8wUWW zN(I;Q^TLYuf{D~e-0QINLMgCSUPa~QbErxMs!~Da<#TM6SHtKVSrWi$mGt@}Zq9zq zy%zayFMrrGUU9F($|vss{*&()Qv(?^>UC_DSD~v_=xP;P~34Sw>ox9c^C5 z2lYh-p^cE+X!@*~X7@EZX96R@ZMB(Ptnt9<4Et@y0OyUDVyPgl&8%CagXyyrV2#mC(=jM-H|Mv*<2gn# zYEXWXv|cSbr)=nrQ|u)jWq6O9g5FNIRb*$TL>7KFn^; z*@cUiyV=b-iBg9qg75*eLKWjij0L3M)kR19ak zNV;(&K(t7C_3>t$!ahv+i^7Y7pxGyqBux3~j)EX~v(GBwWo);da2BmuTOW~Pn}1+K z6#$;S*%Jc#4U}O8Pul_AH;Qw&M z4MX3b1v;h00Z}{S_nMacVBZ5o0Y24-u{D~b$_;>>wus%h;sM?r)xhM%o3GJjJ=L>@zYEbOVcYB zr2(4`Wc0%19g7^|yAz}+paVv~&OSXa*x0@+u?0{wP5%cY?7cGp+=q|!=6ffR$&G{F z|D|_>30FZXT_)mKOF|nc2~U6XNz1el|@>Xack{U z0KkvMr;fWrJT9sz5<-v0M01{Qt!WF+oQsKxiHV7ciHV7ciHV7ciHQ>b0&ql5cw@)3 Qr2qf`07*qoM6N<$g4*Z97XSbN diff --git a/Common/src/main/resources/assets/hexcasting/textures/armor/robes2.png b/Common/src/main/resources/assets/hexcasting/textures/armor/robes2.png index cb621b6072c69b7ae7516f645ef3e41c0f831d39..cde5477699d03369796f62af66074ff33f16d147 100644 GIT binary patch delta 1734 zcmV;%208iF3)KyfBYy^*Nkl2VNZ((%cYx;gBzRijN=I?iqUjyAO~t43sx3IP%g# zWr0+&bnhp#JH8+BM1S3VMB3x%+ShHJZ)_U?fby0uMQ72r{dgUrQW|afzi@YE%9nLT zSY1h)Th)T~8-ExYMm*7v_V9jR#wMiz*p!u}6EyS5zvj-?IG$wIVWfUXWo-w4FYMsA z`7*wIu%mgoT%s^Ja$4$Ehe$Ll2mr-u6^CML?%jV zJYAMQG(Iw6etqwzs!TRG8R7h~vjAWzJbif?z_M*_;WST>0V&}&2wwcsA@JwYw^r@e zb6Ff29DkD*Gzc7w3{q8T{;)~5h~GjG0EcORZf zkbhTRmKGG;j9$-xJhRncy|^}d-Ijw&)hgCDO8|g(Uw#L_{4);#RvXXn1>dW|puvu6 zsao~)NS@ydd)@#n*rduD!pSHsf2mrvek?o<;1zR;NRK1kjV24#O5()N8i~~@#MgP1 z#74Z)@IhhcfOsCk-b1Et%Z7nyu$%^v+J9|H(5+*BLNh)xVT$#3Ay;0v8Jwq) zylk73C+5oQy9N-s2(^i3b5~|BYEBtfq$CNKEAO^7B1A}DuL)Tq(o@5ei1a+0GAI(R zQOX0rLT1@I?(MQK(()U+_0Q7i{vi@DR|ejA(e7GaWryVh>@!4CIuYsdt*pq6-G9Q! zZEeEy39Eo?l5(Pn1bAxX-JdG>lGdnoMhJivANL<+YP`S;qR}Ua;*KDz0J*TJjd_c0 zzTSPvk-xVqE*$;*hK>-q7i)w>q(>=R6EExbDoVP6eO2#-v@x%xjd@4<$yYuyMTWVP zzNOW4er@!+$tvFH^?cAcd-Rg6GJoA%_`+5GnjFyVCGNAvbF~%-0yPF`#u~qwsEH4D z&yX9U;V}9-qd4{bhfU29wB-f>47~sVP&u!e39fCH(AOFDG(cZx)OrZfOiW*1Ml_rO zz?NkBbK&SspT2D_7x$>-~j};dB9%E6Mj8FXaKJ;P;r0Nx__*SQ&$fw zjW~ZUG{A+KbK3Oj+os41X!KQIKm>(AJOFU^g1wUb2!VJ2Aoha2Hu^w-9sulm0imAJ z7sWh1Cv3zz!>3vWk%6?5feP5!h#wPD^vQbE%utvp@QRUP_b(BJwVT8 z5l{46BTnZ7L&H`sVB-^j?ZXJxQ|j5uLWX7yUQZ}_!O;M;DN>XOMS@UUJkf8<6?_QE zf{e>=&ucU^r)=+(*oa2L^uKo4(LnWFPdq%lc2nM$!}#WoAx{fVD1iz?T5#A3E~>NB;NwB;Euo)%hYp@kM& cXh8}80d^p}iCwYZ;{X5v07*qoM6N<$g4GI9vj6}9 delta 1476 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 diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/boots1.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/0_boots.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/boots1.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/0_boots.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet1.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/0_hood.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet1.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/0_hood.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings1.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/0_legs.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings1.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/0_legs.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate1.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/0_tunic.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate1.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/0_tunic.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/boots2.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/1_boots.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/boots2.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/1_boots.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet2.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/1_hood.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet2.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/1_hood.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings2.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/1_legs.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings2.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/1_legs.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate2.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/1_tunic.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate2.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/1_tunic.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/boots3.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/2_boots.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/boots3.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/2_boots.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet3.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/2_hood.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/helmet3.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/2_hood.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings3.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/2_legs.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/leggings3.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/2_legs.png diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate3.png b/Common/src/main/resources/assets/hexcasting/textures/item/robes/2_tunic.png similarity index 100% rename from Common/src/main/resources/assets/hexcasting/textures/item/robes/chestplate3.png rename to Common/src/main/resources/assets/hexcasting/textures/item/robes/2_tunic.png diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java index dfaa3c91eb..ae9737132b 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java @@ -11,7 +11,7 @@ public class HexRobesRenderer { public static final List ROBE_ITEMS = List.of( - HexItems.ROBES_MASK.get(), + HexItems.ROBES_HOOD.get(), HexItems.ROBES_TUNIC.get(), HexItems.ROBES_LEGS.get(), HexItems.ROBES_BOOTS.get() @@ -21,7 +21,7 @@ public static void init() { ArmorRenderer renderer = (matrices, vertexConsumers, stack, entity, slot, light, contextModel) -> { ItemRobes armor = (ItemRobes) stack.getItem(); - var model = armor.getArmorModel(); + var model = armor.getArmorModels()[armor.getVariant(stack)]; var texture = armor.getArmorTexture(stack, entity, slot, HexAPI.instance().robesMaterial().layers().getFirst(), false); contextModel.copyPropertiesTo(model); diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots.json index d872efd81d..264198cc15 100644 --- a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots.json +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots.json @@ -1,6 +1,26 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/robes/boots", + "predicate": { + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/robes/boots_1", + "predicate": { + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/robes/boots_2", + "predicate": { + "hexcasting:variant": 2.0 + } + } + ], "textures": { - "layer0": "hexcasting:item/robes/boots1" + "layer0": "hexcasting:item/robes/0_boots" } } \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots_1.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots_1.json new file mode 100644 index 0000000000..fe6a221473 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/1_boots" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots_2.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots_2.json new file mode 100644 index 0000000000..27a0c192a7 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/boots_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/2_boots" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood.json new file mode 100644 index 0000000000..d2218f4994 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/robes/hood", + "predicate": { + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/robes/hood_1", + "predicate": { + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/robes/hood_2", + "predicate": { + "hexcasting:variant": 2.0 + } + } + ], + "textures": { + "layer0": "hexcasting:item/robes/0_hood" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood_1.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood_1.json new file mode 100644 index 0000000000..4631bfe281 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/1_hood" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood_2.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood_2.json new file mode 100644 index 0000000000..0761f55547 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/hood_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/2_hood" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs.json index fb41385983..03d57e0536 100644 --- a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs.json +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs.json @@ -1,6 +1,26 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/robes/legs", + "predicate": { + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/robes/legs_1", + "predicate": { + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/robes/legs_2", + "predicate": { + "hexcasting:variant": 2.0 + } + } + ], "textures": { - "layer0": "hexcasting:item/robes/leggings1" + "layer0": "hexcasting:item/robes/0_legs" } } \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs_1.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs_1.json new file mode 100644 index 0000000000..93054eafd4 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/1_legs" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs_2.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs_2.json new file mode 100644 index 0000000000..b5667a0aec --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/legs_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/2_legs" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json index 4c9f5cb987..da671641b8 100644 --- a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic.json @@ -1,6 +1,26 @@ { "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "hexcasting:item/robes/tunic", + "predicate": { + "hexcasting:variant": 0.0 + } + }, + { + "model": "hexcasting:item/robes/tunic_1", + "predicate": { + "hexcasting:variant": 1.0 + } + }, + { + "model": "hexcasting:item/robes/tunic_2", + "predicate": { + "hexcasting:variant": 2.0 + } + } + ], "textures": { - "layer0": "hexcasting:item/robes/chestplate1" + "layer0": "hexcasting:item/robes/0_tunic" } } \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic_1.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic_1.json new file mode 100644 index 0000000000..797dbbc608 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/1_tunic" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic_2.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic_2.json new file mode 100644 index 0000000000..a665bce0cb --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/robes/tunic_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/robes/2_tunic" + } +} \ No newline at end of file diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java index ab718355c5..342a95abf0 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java @@ -16,7 +16,6 @@ import at.petrak.hexcasting.common.misc.PatternTooltip; import at.petrak.hexcasting.forge.lib.ForgeHexAttachments; import at.petrak.hexcasting.interop.HexInterop; -import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; @@ -41,7 +40,6 @@ import net.neoforged.neoforge.common.NeoForge; import java.io.IOException; -import java.util.Map; import java.util.function.Function; // This is Java because I can't kotlin-fu some of the consumers @@ -160,13 +158,18 @@ public static void addPlayerLayers(EntityRenderersEvent.AddLayers evt) { @SubscribeEvent public static void registerArmorRenderer(RegisterClientExtensionsEvent evt) { evt.registerItem(new IClientItemExtensions() { - private final Map> MODELS = new Object2ObjectArrayMap<>(); + //private final Map[]> MODEL_SETS = new Object2ObjectArrayMap<>(); @Override public HumanoidModel getHumanoidArmorModel(LivingEntity livingEntity, ItemStack itemStack, EquipmentSlot equipmentSlot, HumanoidModel original) { - return MODELS.computeIfAbsent(equipmentSlot, ItemRobes::provideArmorModelForSlot); + ItemRobes armor = (ItemRobes) itemStack.getItem(); + return armor.getArmorModels()[armor.getVariant(itemStack)]; + +// var variant = itemStack.get(HexDataComponents.ITEM_VARIANT.get()); +// var modelSet = MODEL_SETS.computeIfAbsent(equipmentSlot, ItemRobes::provideArmorModelsForSlot); +// return variant != null ? modelSet[variant] : modelSet[0]; } - }, HexItems.ROBES_MASK.get(), HexItems.ROBES_TUNIC.get(), HexItems.ROBES_LEGS.get(), HexItems.ROBES_BOOTS.get()); + }, HexItems.ROBES_HOOD.get(), HexItems.ROBES_TUNIC.get(), HexItems.ROBES_LEGS.get(), HexItems.ROBES_BOOTS.get()); } @SubscribeEvent diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java index a4bd0770e0..439b3d6d19 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java @@ -80,10 +80,10 @@ protected void registerModels() { .translation(-2.5f, 0f, -8f) .scale(0.4f); - buildRobes(HexItems.ROBES_MASK.get(), "helmet", 1); - buildRobes(HexItems.ROBES_TUNIC.get(), "chestplate", 1); - buildRobes(HexItems.ROBES_LEGS.get(), "leggings", 1); - buildRobes(HexItems.ROBES_BOOTS.get(), "boots", 1); + buildRobes(HexItems.ROBES_HOOD.get(), "hood", HexItems.ROBES_HOOD.get().numVariants()); + buildRobes(HexItems.ROBES_TUNIC.get(), "tunic", HexItems.ROBES_HOOD.get().numVariants()); + buildRobes(HexItems.ROBES_LEGS.get(), "legs", HexItems.ROBES_HOOD.get().numVariants()); + buildRobes(HexItems.ROBES_BOOTS.get(), "boots", HexItems.ROBES_HOOD.get().numVariants()); singleTexture("old_staff", ResourceLocation.withDefaultNamespace("item/handheld_rod"), "layer0", modLoc("item/staff/old")); @@ -283,8 +283,18 @@ private void buildStaff(Item item, String name) { private void buildRobes(Item item, String type, int numVariants) { // TODO: actually handle the variants - singleTexture("item/" + getPath(item), ResourceLocation.withDefaultNamespace("item/generated"), - "layer0", modLoc("item/robes/"+type+"1")); +// singleTexture("item/" + getPath(item), ResourceLocation.withDefaultNamespace("item/generated"), +// "layer0", modLoc("item/robes/1_"+type)); + var name = "item/" + getPath(item); + var builder = getBuilder(name); + for (int i = 0; i < numVariants; i++) { + var parent_tag = "item/generated"; + var model = i == 0 ? singleTexture(name, ResourceLocation.withDefaultNamespace(parent_tag), + "layer0", modLoc("item/robes/" + i + "_" + type)) + : withExistingParent(name + "_" + i, ResourceLocation.withDefaultNamespace(parent_tag)) + .texture("layer0", modLoc("item/robes/" + i + "_" + type)); + builder.override().predicate(ItemFocus.VARIANT_PRED, i).model(model).end(); + } } private void buildPackagedSpell(Item item, String stub, int numVariants) { diff --git a/art/robes/Robes0.bbmodel b/art/robes/Robes0.bbmodel new file mode 100644 index 0000000000..61a422e741 --- /dev/null +++ b/art/robes/Robes0.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes1","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":7,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"1581b57e-00c2-c3a2-d822-b969220a28d4"},{"name":"hood_inner","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"c5b38b99-6a56-d9ff-e64c-7b6f865f9a78"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-11.7,28.2,0],"to":[-3.7,32.2,0],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,4],"texture":0},"east":{"uv":[24,0,24,4],"texture":0},"south":{"uv":[32,0,40,4],"texture":0},"west":{"uv":[32,0,32,4],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"6964045e-8723-0987-f243-5ea5477fe7de"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[3.8,28.2,0],"to":[11.8,32.2,0],"autouv":0,"color":0,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,4],"texture":0},"east":{"uv":[32,0,32,4],"texture":0},"south":{"uv":[40,0,32,4],"texture":0},"west":{"uv":[24,0,24,4],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"f33f09f2-5156-ad5f-6a83-b6ec43dd94ba"},{"name":"tunic_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":4,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"e8531e9d-18f6-891f-90e4-7521fdc4d333"},{"name":"tunic_inner","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":7,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"39cd0047-8c4e-0c56-9ba0-6821e5288d85"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"980d2769-4452-dfb8-65e0-279fe928b4dc"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":0,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"a67ab72a-fddc-6238-2450-0efdf132c8f1"},{"name":"right_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.75,0.25,-2],"to":[5.75,12.25,2],"autouv":0,"color":1,"mirror_uv":true,"inflate":0.4,"rotation":[0,0,7.5],"origin":[1.75,0.25,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"9f17843d-d8f7-54ed-8955-46c9f9b16c58"},{"name":"left_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-5.85,0.25,-2],"to":[-1.85,12.25,2],"autouv":0,"color":6,"inflate":0.4,"rotation":[0,0,-7.5],"origin":[-1.75,-0.25,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"948db43e-cb45-4d54-b8c9-2fff5114297d"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,3,2],"autouv":0,"color":9,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,41],"faces":{"north":{"uv":[20,45,24,48],"texture":0},"east":{"uv":[16,45,20,48],"texture":0},"south":{"uv":[28,45,32,48],"texture":0},"west":{"uv":[24,45,28,48],"texture":0},"up":{"uv":[24,45,20,41],"texture":0},"down":{"uv":[28,41,24,45],"texture":0}},"type":"cube","uuid":"79498393-90f7-57dc-503c-6574ada461b9"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,3,2],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,41],"faces":{"north":{"uv":[20,45,24,48],"texture":0},"east":{"uv":[16,45,20,48],"texture":0},"south":{"uv":[28,45,32,48],"texture":0},"west":{"uv":[24,45,28,48],"texture":0},"up":{"uv":[24,45,20,41],"texture":0},"down":{"uv":[28,41,24,45],"texture":0}},"type":"cube","uuid":"ef919b63-e2e6-f0f2-daa2-f3617e632db6"}],"groups":[{"name":"head","uuid":"fd15bc83-0616-6b91-4dc0-205078c28696","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"horns","uuid":"392fe1f0-1ca6-16cb-3fdf-f4df1acbea50","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4.8,32.2,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"body","uuid":"3ce8c80e-9c6b-c2c7-d890-65103951659b","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"8b7e8f66-6842-18bf-5ec6-ed8186b30dcc","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"3f6f3a5d-40f0-79e0-f4c7-8260f3f17f66","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"ad7f6d7b-a515-346a-234d-92719a8f6f03","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[2,12.25,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"89bec69e-bfd8-c0e8-d1df-5948a74a5ae4","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4.1,12.5,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"fd15bc83-0616-6b91-4dc0-205078c28696","isOpen":true,"children":["c5b38b99-6a56-d9ff-e64c-7b6f865f9a78","1581b57e-00c2-c3a2-d822-b969220a28d4",{"uuid":"392fe1f0-1ca6-16cb-3fdf-f4df1acbea50","isOpen":false,"children":["6964045e-8723-0987-f243-5ea5477fe7de","f33f09f2-5156-ad5f-6a83-b6ec43dd94ba"]}]},{"uuid":"3ce8c80e-9c6b-c2c7-d890-65103951659b","isOpen":true,"children":["39cd0047-8c4e-0c56-9ba0-6821e5288d85","e8531e9d-18f6-891f-90e4-7521fdc4d333"]},{"uuid":"3f6f3a5d-40f0-79e0-f4c7-8260f3f17f66","isOpen":true,"children":["980d2769-4452-dfb8-65e0-279fe928b4dc"]},{"uuid":"8b7e8f66-6842-18bf-5ec6-ed8186b30dcc","isOpen":true,"children":["a67ab72a-fddc-6238-2450-0efdf132c8f1"]},{"uuid":"ad7f6d7b-a515-346a-234d-92719a8f6f03","isOpen":true,"children":["9f17843d-d8f7-54ed-8955-46c9f9b16c58","ef919b63-e2e6-f0f2-daa2-f3617e632db6"]},{"uuid":"89bec69e-bfd8-c0e8-d1df-5948a74a5ae4","isOpen":true,"children":["948db43e-cb45-4d54-b8c9-2fff5114297d","79498393-90f7-57dc-503c-6574ada461b9"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"76798d81-bebb-9cf7-cb53-4b3c6019c51a","source":"data:image/png;base64,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"}]} \ No newline at end of file diff --git a/art/robes/Robes1.bbmodel b/art/robes/Robes1.bbmodel index 61a422e741..690b827aa2 100644 --- a/art/robes/Robes1.bbmodel +++ b/art/robes/Robes1.bbmodel @@ -1 +1 @@ -{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes1","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":7,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"1581b57e-00c2-c3a2-d822-b969220a28d4"},{"name":"hood_inner","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"c5b38b99-6a56-d9ff-e64c-7b6f865f9a78"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-11.7,28.2,0],"to":[-3.7,32.2,0],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,4],"texture":0},"east":{"uv":[24,0,24,4],"texture":0},"south":{"uv":[32,0,40,4],"texture":0},"west":{"uv":[32,0,32,4],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"6964045e-8723-0987-f243-5ea5477fe7de"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[3.8,28.2,0],"to":[11.8,32.2,0],"autouv":0,"color":0,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,4],"texture":0},"east":{"uv":[32,0,32,4],"texture":0},"south":{"uv":[40,0,32,4],"texture":0},"west":{"uv":[24,0,24,4],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"f33f09f2-5156-ad5f-6a83-b6ec43dd94ba"},{"name":"tunic_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":4,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"e8531e9d-18f6-891f-90e4-7521fdc4d333"},{"name":"tunic_inner","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":7,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"39cd0047-8c4e-0c56-9ba0-6821e5288d85"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"980d2769-4452-dfb8-65e0-279fe928b4dc"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":0,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"a67ab72a-fddc-6238-2450-0efdf132c8f1"},{"name":"right_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.75,0.25,-2],"to":[5.75,12.25,2],"autouv":0,"color":1,"mirror_uv":true,"inflate":0.4,"rotation":[0,0,7.5],"origin":[1.75,0.25,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"9f17843d-d8f7-54ed-8955-46c9f9b16c58"},{"name":"left_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-5.85,0.25,-2],"to":[-1.85,12.25,2],"autouv":0,"color":6,"inflate":0.4,"rotation":[0,0,-7.5],"origin":[-1.75,-0.25,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"948db43e-cb45-4d54-b8c9-2fff5114297d"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,3,2],"autouv":0,"color":9,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,41],"faces":{"north":{"uv":[20,45,24,48],"texture":0},"east":{"uv":[16,45,20,48],"texture":0},"south":{"uv":[28,45,32,48],"texture":0},"west":{"uv":[24,45,28,48],"texture":0},"up":{"uv":[24,45,20,41],"texture":0},"down":{"uv":[28,41,24,45],"texture":0}},"type":"cube","uuid":"79498393-90f7-57dc-503c-6574ada461b9"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,3,2],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,41],"faces":{"north":{"uv":[20,45,24,48],"texture":0},"east":{"uv":[16,45,20,48],"texture":0},"south":{"uv":[28,45,32,48],"texture":0},"west":{"uv":[24,45,28,48],"texture":0},"up":{"uv":[24,45,20,41],"texture":0},"down":{"uv":[28,41,24,45],"texture":0}},"type":"cube","uuid":"ef919b63-e2e6-f0f2-daa2-f3617e632db6"}],"groups":[{"name":"head","uuid":"fd15bc83-0616-6b91-4dc0-205078c28696","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"horns","uuid":"392fe1f0-1ca6-16cb-3fdf-f4df1acbea50","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4.8,32.2,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"body","uuid":"3ce8c80e-9c6b-c2c7-d890-65103951659b","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"8b7e8f66-6842-18bf-5ec6-ed8186b30dcc","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"3f6f3a5d-40f0-79e0-f4c7-8260f3f17f66","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"ad7f6d7b-a515-346a-234d-92719a8f6f03","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[2,12.25,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"89bec69e-bfd8-c0e8-d1df-5948a74a5ae4","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4.1,12.5,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"fd15bc83-0616-6b91-4dc0-205078c28696","isOpen":true,"children":["c5b38b99-6a56-d9ff-e64c-7b6f865f9a78","1581b57e-00c2-c3a2-d822-b969220a28d4",{"uuid":"392fe1f0-1ca6-16cb-3fdf-f4df1acbea50","isOpen":false,"children":["6964045e-8723-0987-f243-5ea5477fe7de","f33f09f2-5156-ad5f-6a83-b6ec43dd94ba"]}]},{"uuid":"3ce8c80e-9c6b-c2c7-d890-65103951659b","isOpen":true,"children":["39cd0047-8c4e-0c56-9ba0-6821e5288d85","e8531e9d-18f6-891f-90e4-7521fdc4d333"]},{"uuid":"3f6f3a5d-40f0-79e0-f4c7-8260f3f17f66","isOpen":true,"children":["980d2769-4452-dfb8-65e0-279fe928b4dc"]},{"uuid":"8b7e8f66-6842-18bf-5ec6-ed8186b30dcc","isOpen":true,"children":["a67ab72a-fddc-6238-2450-0efdf132c8f1"]},{"uuid":"ad7f6d7b-a515-346a-234d-92719a8f6f03","isOpen":true,"children":["9f17843d-d8f7-54ed-8955-46c9f9b16c58","ef919b63-e2e6-f0f2-daa2-f3617e632db6"]},{"uuid":"89bec69e-bfd8-c0e8-d1df-5948a74a5ae4","isOpen":true,"children":["948db43e-cb45-4d54-b8c9-2fff5114297d","79498393-90f7-57dc-503c-6574ada461b9"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"76798d81-bebb-9cf7-cb53-4b3c6019c51a","source":"data:image/png;base64,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"}]} \ No newline at end of file +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes2","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":3,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"b2301383-7b8a-8d9f-c284-318663224705"},{"name":"hood_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":0,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"cec6b116-5e7e-77d1-1f1a-e56dfe32702c"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8.25,34.25,0],"to":[-0.25,38.25,0],"autouv":0,"color":6,"rotation":[0,0,-90],"origin":[-4.25,36.25,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,4],"texture":0},"east":{"uv":[24,0,24,4],"texture":0},"south":{"uv":[32,0,40,4],"texture":0},"west":{"uv":[32,0,32,4],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"cae1f41b-7569-26aa-acc4-3ed8d8815444"},{"name":"tunic_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":7,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"a19f6d42-3fe9-bb4c-480e-d6574977d99f"},{"name":"tunic_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"d6c0c5b1-527b-cf1f-061a-36c7e9bb98db"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":3,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"818aa72b-cef1-58e9-725c-5eaa37f7b9dc"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":7,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"dbf8c827-9338-7729-bb47-4f346cdf3592"},{"name":"left_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,12,2],"autouv":0,"color":8,"inflate":0.4,"origin":[-4,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"22bfadf3-71a3-962a-553b-5d9aff88ddc3"},{"name":"right_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,12,2],"autouv":0,"color":8,"mirror_uv":true,"inflate":0.4,"origin":[4,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"1f6091bd-5faa-e333-da79-c6c57a92952a"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,4,2],"autouv":0,"color":8,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"5a38ae46-c69d-e663-6bf0-db99aa735735"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,4,2],"autouv":0,"color":4,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"60e41237-317f-4c78-8b20-dab88a2ba123"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0.25,34.25,0],"to":[8.25,38.25,0],"autouv":0,"color":7,"mirror_uv":true,"rotation":[0,0,90],"origin":[4.25,36.25,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,4],"texture":0},"east":{"uv":[32,0,32,4],"texture":0},"south":{"uv":[40,0,32,4],"texture":0},"west":{"uv":[24,0,24,4],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"c3b4c436-d99b-e573-ef06-7f6c2bd3370f"}],"groups":[{"name":"head","uuid":"a98bbf19-0b66-952c-1616-51351bc4fde0","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"body","uuid":"a946c104-4b18-70b2-14d4-8c06829849be","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"26a798c8-f71d-51b0-0be9-e11439c93c86","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"759c4eae-7953-1987-4504-74b1555e5c39","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"46e6c36b-8782-ecc4-f6be-415512f92d4a","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"e5bb982a-468b-c3e8-d99f-7b7a594eefed","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"horns","uuid":"5e0675dc-8bb1-c564-3970-d9333592e0b3","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4.25,36.25,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"a98bbf19-0b66-952c-1616-51351bc4fde0","isOpen":true,"children":["cec6b116-5e7e-77d1-1f1a-e56dfe32702c","b2301383-7b8a-8d9f-c284-318663224705",{"uuid":"5e0675dc-8bb1-c564-3970-d9333592e0b3","isOpen":true,"children":["cae1f41b-7569-26aa-acc4-3ed8d8815444","c3b4c436-d99b-e573-ef06-7f6c2bd3370f"]}]},{"uuid":"a946c104-4b18-70b2-14d4-8c06829849be","isOpen":true,"children":["d6c0c5b1-527b-cf1f-061a-36c7e9bb98db","a19f6d42-3fe9-bb4c-480e-d6574977d99f"]},{"uuid":"26a798c8-f71d-51b0-0be9-e11439c93c86","isOpen":true,"children":["dbf8c827-9338-7729-bb47-4f346cdf3592"]},{"uuid":"759c4eae-7953-1987-4504-74b1555e5c39","isOpen":true,"children":["818aa72b-cef1-58e9-725c-5eaa37f7b9dc"]},{"uuid":"e5bb982a-468b-c3e8-d99f-7b7a594eefed","isOpen":true,"children":["1f6091bd-5faa-e333-da79-c6c57a92952a","60e41237-317f-4c78-8b20-dab88a2ba123"]},{"uuid":"46e6c36b-8782-ecc4-f6be-415512f92d4a","isOpen":true,"children":["22bfadf3-71a3-962a-553b-5d9aff88ddc3","5a38ae46-c69d-e663-6bf0-db99aa735735"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"ae10bf54-61f3-91d7-642d-574fba3483bc","source":"data:image/png;base64,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"}]} \ No newline at end of file diff --git a/art/robes/Robes2.bbmodel b/art/robes/Robes2.bbmodel index 690b827aa2..5c0bb4790f 100644 --- a/art/robes/Robes2.bbmodel +++ b/art/robes/Robes2.bbmodel @@ -1 +1 @@ -{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes2","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":3,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"b2301383-7b8a-8d9f-c284-318663224705"},{"name":"hood_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":0,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"cec6b116-5e7e-77d1-1f1a-e56dfe32702c"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8.25,34.25,0],"to":[-0.25,38.25,0],"autouv":0,"color":6,"rotation":[0,0,-90],"origin":[-4.25,36.25,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,4],"texture":0},"east":{"uv":[24,0,24,4],"texture":0},"south":{"uv":[32,0,40,4],"texture":0},"west":{"uv":[32,0,32,4],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"cae1f41b-7569-26aa-acc4-3ed8d8815444"},{"name":"tunic_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":7,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"a19f6d42-3fe9-bb4c-480e-d6574977d99f"},{"name":"tunic_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"d6c0c5b1-527b-cf1f-061a-36c7e9bb98db"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":3,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"818aa72b-cef1-58e9-725c-5eaa37f7b9dc"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":7,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"dbf8c827-9338-7729-bb47-4f346cdf3592"},{"name":"left_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,12,2],"autouv":0,"color":8,"inflate":0.4,"origin":[-4,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"22bfadf3-71a3-962a-553b-5d9aff88ddc3"},{"name":"right_skirt","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,12,2],"autouv":0,"color":8,"mirror_uv":true,"inflate":0.4,"origin":[4,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"1f6091bd-5faa-e333-da79-c6c57a92952a"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,4,2],"autouv":0,"color":8,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"5a38ae46-c69d-e663-6bf0-db99aa735735"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,4,2],"autouv":0,"color":4,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"60e41237-317f-4c78-8b20-dab88a2ba123"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0.25,34.25,0],"to":[8.25,38.25,0],"autouv":0,"color":7,"mirror_uv":true,"rotation":[0,0,90],"origin":[4.25,36.25,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,4],"texture":0},"east":{"uv":[32,0,32,4],"texture":0},"south":{"uv":[40,0,32,4],"texture":0},"west":{"uv":[24,0,24,4],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"c3b4c436-d99b-e573-ef06-7f6c2bd3370f"}],"groups":[{"name":"head","uuid":"a98bbf19-0b66-952c-1616-51351bc4fde0","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"body","uuid":"a946c104-4b18-70b2-14d4-8c06829849be","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"26a798c8-f71d-51b0-0be9-e11439c93c86","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"759c4eae-7953-1987-4504-74b1555e5c39","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"46e6c36b-8782-ecc4-f6be-415512f92d4a","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"e5bb982a-468b-c3e8-d99f-7b7a594eefed","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"horns","uuid":"5e0675dc-8bb1-c564-3970-d9333592e0b3","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4.25,36.25,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"a98bbf19-0b66-952c-1616-51351bc4fde0","isOpen":true,"children":["cec6b116-5e7e-77d1-1f1a-e56dfe32702c","b2301383-7b8a-8d9f-c284-318663224705",{"uuid":"5e0675dc-8bb1-c564-3970-d9333592e0b3","isOpen":true,"children":["cae1f41b-7569-26aa-acc4-3ed8d8815444","c3b4c436-d99b-e573-ef06-7f6c2bd3370f"]}]},{"uuid":"a946c104-4b18-70b2-14d4-8c06829849be","isOpen":true,"children":["d6c0c5b1-527b-cf1f-061a-36c7e9bb98db","a19f6d42-3fe9-bb4c-480e-d6574977d99f"]},{"uuid":"26a798c8-f71d-51b0-0be9-e11439c93c86","isOpen":true,"children":["dbf8c827-9338-7729-bb47-4f346cdf3592"]},{"uuid":"759c4eae-7953-1987-4504-74b1555e5c39","isOpen":true,"children":["818aa72b-cef1-58e9-725c-5eaa37f7b9dc"]},{"uuid":"e5bb982a-468b-c3e8-d99f-7b7a594eefed","isOpen":true,"children":["1f6091bd-5faa-e333-da79-c6c57a92952a","60e41237-317f-4c78-8b20-dab88a2ba123"]},{"uuid":"46e6c36b-8782-ecc4-f6be-415512f92d4a","isOpen":true,"children":["22bfadf3-71a3-962a-553b-5d9aff88ddc3","5a38ae46-c69d-e663-6bf0-db99aa735735"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"ae10bf54-61f3-91d7-642d-574fba3483bc","source":"data:image/png;base64,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"}]} \ No newline at end of file +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes3","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":4,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"bb31bdb7-b4f5-8fd6-0631-ad789263fce7"},{"name":"hood_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":8,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759"},{"name":"body_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":5,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"94261ed0-a8a6-8d18-ac42-13127515d848"},{"name":"body_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":3,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"9c87cab3-03d4-97ee-21bd-9815d0e98d53"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":0,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"fd5e025b-d5f6-8bd3-d981-66783aa2a923"},{"name":"right_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,12,2],"autouv":0,"color":3,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"e035f1e5-f5da-d86a-efe6-d73b506ae82e"},{"name":"left_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,12,2],"autouv":0,"color":9,"mirror_uv":true,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"92e4165d-8268-5063-8211-7221aae1b76e"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,4,2],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"0c26f55d-2961-ea9c-ea83-843b23d37a98"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,4,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"3bb185dc-1abc-3fe5-b883-7af7889a4f3f"},{"name":"strap","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-0.2,11.95,-3],"to":[9.8,14.95,3],"autouv":0,"color":2,"rotation":[0,0,22.5],"origin":[0.75,1.75,0],"uv_offset":[0,48],"faces":{"north":{"uv":[6,54,16,57],"texture":0},"east":{"uv":[0,54,6,57],"texture":0},"south":{"uv":[22,54,32,57],"texture":0},"west":{"uv":[16,54,22,57],"texture":0},"up":{"uv":[16,54,6,48],"texture":0},"down":{"uv":[26,48,16,54],"texture":0}},"type":"cube","uuid":"5595171c-e809-03ca-68ed-7115d9ffbb94"},{"name":"buckle","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.95,14.1,-3],"to":[4.95,17.1,3],"autouv":0,"color":6,"inflate":0.1,"origin":[0.75,0,0],"uv_offset":[32,48],"faces":{"north":{"uv":[38,54,41,57],"texture":0},"east":{"uv":[32,54,38,57],"texture":0},"south":{"uv":[47,54,50,57],"texture":0},"west":{"uv":[41,54,47,57],"texture":0},"up":{"uv":[41,54,38,48],"texture":0},"down":{"uv":[44,48,41,54],"texture":0}},"type":"cube","uuid":"4cb47817-d5c8-81f7-ce53-eddcf011ee3e"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,28.5,0],"to":[12,36.5,0],"autouv":0,"color":0,"mirror_uv":true,"rotation":[0,0,75],"origin":[5,32.5,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,8],"texture":0},"east":{"uv":[32,0,32,8],"texture":0},"south":{"uv":[40,0,32,8],"texture":0},"west":{"uv":[24,0,24,8],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"00b324ac-7d37-b5d8-4201-5e85760400af"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-12,28.6,0],"to":[-4,36.6,0],"autouv":0,"color":0,"rotation":[0,0,-75],"origin":[-5,32.6,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,8],"texture":0},"east":{"uv":[24,0,24,8],"texture":0},"south":{"uv":[32,0,40,8],"texture":0},"west":{"uv":[32,0,32,8],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"a9e5e1e6-b585-094b-da8c-835678984610"}],"groups":[{"name":"head","uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"body","uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"sash","uuid":"01148eb6-5484-1b29-ae31-deabde803a47","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-5.45,13.2,-3],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"horns","uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[5,32.5,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","isOpen":true,"children":[{"uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","isOpen":true,"children":["00b324ac-7d37-b5d8-4201-5e85760400af","a9e5e1e6-b585-094b-da8c-835678984610"]},"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759","bb31bdb7-b4f5-8fd6-0631-ad789263fce7"]},{"uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","isOpen":true,"children":["bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40","94261ed0-a8a6-8d18-ac42-13127515d848",{"uuid":"01148eb6-5484-1b29-ae31-deabde803a47","isOpen":false,"children":["5595171c-e809-03ca-68ed-7115d9ffbb94","4cb47817-d5c8-81f7-ce53-eddcf011ee3e"]}]},{"uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","isOpen":true,"children":["fd5e025b-d5f6-8bd3-d981-66783aa2a923"]},{"uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","isOpen":true,"children":["9c87cab3-03d4-97ee-21bd-9815d0e98d53"]},{"uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","isOpen":true,"children":["e035f1e5-f5da-d86a-efe6-d73b506ae82e","3bb185dc-1abc-3fe5-b883-7af7889a4f3f"]},{"uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","isOpen":true,"children":["92e4165d-8268-5063-8211-7221aae1b76e","0c26f55d-2961-ea9c-ea83-843b23d37a98"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"af3aae18-9f98-d4de-7b0f-c58cd9965743","source":"data:image/png;base64,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"}]} \ No newline at end of file diff --git a/art/robes/Robes3.bbmodel b/art/robes/Robes3.bbmodel deleted file mode 100644 index 5c0bb4790f..0000000000 --- a/art/robes/Robes3.bbmodel +++ /dev/null @@ -1 +0,0 @@ -{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes3","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":4,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"bb31bdb7-b4f5-8fd6-0631-ad789263fce7"},{"name":"hood_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":8,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759"},{"name":"body_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":5,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"94261ed0-a8a6-8d18-ac42-13127515d848"},{"name":"body_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":3,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"9c87cab3-03d4-97ee-21bd-9815d0e98d53"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":0,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"fd5e025b-d5f6-8bd3-d981-66783aa2a923"},{"name":"right_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,12,2],"autouv":0,"color":3,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"e035f1e5-f5da-d86a-efe6-d73b506ae82e"},{"name":"left_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,12,2],"autouv":0,"color":9,"mirror_uv":true,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"92e4165d-8268-5063-8211-7221aae1b76e"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,4,2],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"0c26f55d-2961-ea9c-ea83-843b23d37a98"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,4,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"3bb185dc-1abc-3fe5-b883-7af7889a4f3f"},{"name":"strap","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-0.2,11.95,-3],"to":[9.8,14.95,3],"autouv":0,"color":2,"rotation":[0,0,22.5],"origin":[0.75,1.75,0],"uv_offset":[0,48],"faces":{"north":{"uv":[6,54,16,57],"texture":0},"east":{"uv":[0,54,6,57],"texture":0},"south":{"uv":[22,54,32,57],"texture":0},"west":{"uv":[16,54,22,57],"texture":0},"up":{"uv":[16,54,6,48],"texture":0},"down":{"uv":[26,48,16,54],"texture":0}},"type":"cube","uuid":"5595171c-e809-03ca-68ed-7115d9ffbb94"},{"name":"buckle","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.95,14.1,-3],"to":[4.95,17.1,3],"autouv":0,"color":6,"inflate":0.1,"origin":[0.75,0,0],"uv_offset":[32,48],"faces":{"north":{"uv":[38,54,41,57],"texture":0},"east":{"uv":[32,54,38,57],"texture":0},"south":{"uv":[47,54,50,57],"texture":0},"west":{"uv":[41,54,47,57],"texture":0},"up":{"uv":[41,54,38,48],"texture":0},"down":{"uv":[44,48,41,54],"texture":0}},"type":"cube","uuid":"4cb47817-d5c8-81f7-ce53-eddcf011ee3e"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,28.5,0],"to":[12,36.5,0],"autouv":0,"color":0,"mirror_uv":true,"rotation":[0,0,75],"origin":[5,32.5,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,8],"texture":0},"east":{"uv":[32,0,32,8],"texture":0},"south":{"uv":[40,0,32,8],"texture":0},"west":{"uv":[24,0,24,8],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"00b324ac-7d37-b5d8-4201-5e85760400af"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-12,28.6,0],"to":[-4,36.6,0],"autouv":0,"color":0,"rotation":[0,0,-75],"origin":[-5,32.6,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,8],"texture":0},"east":{"uv":[24,0,24,8],"texture":0},"south":{"uv":[32,0,40,8],"texture":0},"west":{"uv":[32,0,32,8],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"a9e5e1e6-b585-094b-da8c-835678984610"}],"groups":[{"name":"head","uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"body","uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"sash","uuid":"01148eb6-5484-1b29-ae31-deabde803a47","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-5.45,13.2,-3],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"horns","uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[5,32.5,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","isOpen":true,"children":[{"uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","isOpen":true,"children":["00b324ac-7d37-b5d8-4201-5e85760400af","a9e5e1e6-b585-094b-da8c-835678984610"]},"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759","bb31bdb7-b4f5-8fd6-0631-ad789263fce7"]},{"uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","isOpen":true,"children":["bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40","94261ed0-a8a6-8d18-ac42-13127515d848",{"uuid":"01148eb6-5484-1b29-ae31-deabde803a47","isOpen":false,"children":["5595171c-e809-03ca-68ed-7115d9ffbb94","4cb47817-d5c8-81f7-ce53-eddcf011ee3e"]}]},{"uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","isOpen":true,"children":["fd5e025b-d5f6-8bd3-d981-66783aa2a923"]},{"uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","isOpen":true,"children":["9c87cab3-03d4-97ee-21bd-9815d0e98d53"]},{"uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","isOpen":true,"children":["e035f1e5-f5da-d86a-efe6-d73b506ae82e","3bb185dc-1abc-3fe5-b883-7af7889a4f3f"]},{"uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","isOpen":true,"children":["92e4165d-8268-5063-8211-7221aae1b76e","0c26f55d-2961-ea9c-ea83-843b23d37a98"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"af3aae18-9f98-d4de-7b0f-c58cd9965743","source":"data:image/png;base64,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"}]} \ No newline at end of file From 09b08938ffd447c394871a97206b6505acb7236e Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Mon, 24 Aug 2026 22:50:22 -0400 Subject: [PATCH 10/45] Flip sash on tunic2 to match item texture --- .../petrak/hexcasting/client/model/HexRobesModel.java | 10 ++++++---- art/robes/Robes2.bbmodel | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java index 978bb6666c..707aa30b36 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java @@ -223,13 +223,15 @@ public static LayerDefinition variant2() { var sash = body.addOrReplaceChild("sash", CubeListBuilder.create() - .texOffs(32, 48).addBox(-10.4F, -3.9F, 0.0F, 3.0F, 3.0F, 6.0F, new CubeDeformation(0.1F)), - PartPose.offset(5.5F, 10.8F, -3.0F)); + .texOffs(32, 48).mirror().addBox(7.4F, -3.9F, 0.0F, 3.0F, 3.0F, 6.0F, new CubeDeformation(0.1F)) + .mirror(false), + PartPose.offset(-5.45F, 10.8F, -3.0F)); sash.addOrReplaceChild("strap", CubeListBuilder.create() - .texOffs(0, 48).addBox(-9.05F, -13.2F, -3.0F, 10.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)), - PartPose.offsetAndRotation(-6.2F, 11.45F, 3.0F, 0.0F, 0.0F, 0.3927F)); + .texOffs(0, 48).mirror().addBox(-0.95F, -13.2F, -3.0F, 10.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)) + .mirror(false), + PartPose.offsetAndRotation(6.2F, 11.45F, 3.0F, 0.0F, 0.0F, -0.3927F)); var rightArm = root.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); diff --git a/art/robes/Robes2.bbmodel b/art/robes/Robes2.bbmodel index 5c0bb4790f..62efa53758 100644 --- a/art/robes/Robes2.bbmodel +++ b/art/robes/Robes2.bbmodel @@ -1 +1 @@ -{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes3","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":4,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"bb31bdb7-b4f5-8fd6-0631-ad789263fce7"},{"name":"hood_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":8,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759"},{"name":"body_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":5,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"94261ed0-a8a6-8d18-ac42-13127515d848"},{"name":"body_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":3,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"9c87cab3-03d4-97ee-21bd-9815d0e98d53"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":0,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"fd5e025b-d5f6-8bd3-d981-66783aa2a923"},{"name":"right_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,12,2],"autouv":0,"color":3,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"e035f1e5-f5da-d86a-efe6-d73b506ae82e"},{"name":"left_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,12,2],"autouv":0,"color":9,"mirror_uv":true,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"92e4165d-8268-5063-8211-7221aae1b76e"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,4,2],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"0c26f55d-2961-ea9c-ea83-843b23d37a98"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,4,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"3bb185dc-1abc-3fe5-b883-7af7889a4f3f"},{"name":"strap","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-0.2,11.95,-3],"to":[9.8,14.95,3],"autouv":0,"color":2,"rotation":[0,0,22.5],"origin":[0.75,1.75,0],"uv_offset":[0,48],"faces":{"north":{"uv":[6,54,16,57],"texture":0},"east":{"uv":[0,54,6,57],"texture":0},"south":{"uv":[22,54,32,57],"texture":0},"west":{"uv":[16,54,22,57],"texture":0},"up":{"uv":[16,54,6,48],"texture":0},"down":{"uv":[26,48,16,54],"texture":0}},"type":"cube","uuid":"5595171c-e809-03ca-68ed-7115d9ffbb94"},{"name":"buckle","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1.95,14.1,-3],"to":[4.95,17.1,3],"autouv":0,"color":6,"inflate":0.1,"origin":[0.75,0,0],"uv_offset":[32,48],"faces":{"north":{"uv":[38,54,41,57],"texture":0},"east":{"uv":[32,54,38,57],"texture":0},"south":{"uv":[47,54,50,57],"texture":0},"west":{"uv":[41,54,47,57],"texture":0},"up":{"uv":[41,54,38,48],"texture":0},"down":{"uv":[44,48,41,54],"texture":0}},"type":"cube","uuid":"4cb47817-d5c8-81f7-ce53-eddcf011ee3e"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,28.5,0],"to":[12,36.5,0],"autouv":0,"color":0,"mirror_uv":true,"rotation":[0,0,75],"origin":[5,32.5,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,8],"texture":0},"east":{"uv":[32,0,32,8],"texture":0},"south":{"uv":[40,0,32,8],"texture":0},"west":{"uv":[24,0,24,8],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"00b324ac-7d37-b5d8-4201-5e85760400af"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-12,28.6,0],"to":[-4,36.6,0],"autouv":0,"color":0,"rotation":[0,0,-75],"origin":[-5,32.6,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,8],"texture":0},"east":{"uv":[24,0,24,8],"texture":0},"south":{"uv":[32,0,40,8],"texture":0},"west":{"uv":[32,0,32,8],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"a9e5e1e6-b585-094b-da8c-835678984610"}],"groups":[{"name":"head","uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"body","uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"sash","uuid":"01148eb6-5484-1b29-ae31-deabde803a47","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-5.45,13.2,-3],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":false},{"name":"horns","uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[5,32.5,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","isOpen":true,"children":[{"uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","isOpen":true,"children":["00b324ac-7d37-b5d8-4201-5e85760400af","a9e5e1e6-b585-094b-da8c-835678984610"]},"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759","bb31bdb7-b4f5-8fd6-0631-ad789263fce7"]},{"uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","isOpen":true,"children":["bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40","94261ed0-a8a6-8d18-ac42-13127515d848",{"uuid":"01148eb6-5484-1b29-ae31-deabde803a47","isOpen":false,"children":["5595171c-e809-03ca-68ed-7115d9ffbb94","4cb47817-d5c8-81f7-ce53-eddcf011ee3e"]}]},{"uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","isOpen":true,"children":["fd5e025b-d5f6-8bd3-d981-66783aa2a923"]},{"uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","isOpen":true,"children":["9c87cab3-03d4-97ee-21bd-9815d0e98d53"]},{"uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","isOpen":true,"children":["e035f1e5-f5da-d86a-efe6-d73b506ae82e","3bb185dc-1abc-3fe5-b883-7af7889a4f3f"]},{"uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","isOpen":true,"children":["92e4165d-8268-5063-8211-7221aae1b76e","0c26f55d-2961-ea9c-ea83-843b23d37a98"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"af3aae18-9f98-d4de-7b0f-c58cd9965743","source":"data:image/png;base64,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"}]} \ No newline at end of file +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Robes2","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"hood_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":4,"inflate":0.4,"origin":[0,0,0],"uv_offset":[0,16],"faces":{"north":{"uv":[8,24,16,32],"texture":0},"east":{"uv":[0,24,8,32],"texture":0},"south":{"uv":[24,24,32,32],"texture":0},"west":{"uv":[16,24,24,32],"texture":0},"up":{"uv":[16,24,8,16],"texture":0},"down":{"uv":[24,16,16,24],"texture":0}},"type":"cube","uuid":"bb31bdb7-b4f5-8fd6-0631-ad789263fce7"},{"name":"hood_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,24,-4],"to":[4,32,4],"autouv":0,"color":8,"inflate":0.3,"origin":[0,0,0],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759"},{"name":"body_outer","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":5,"inflate":0.4,"origin":[0,0,0],"uv_offset":[40,16],"faces":{"north":{"uv":[44,20,52,32],"texture":0},"east":{"uv":[40,20,44,32],"texture":0},"south":{"uv":[56,20,64,32],"texture":0},"west":{"uv":[52,20,56,32],"texture":0},"up":{"uv":[52,20,44,16],"texture":0},"down":{"uv":[60,16,52,20],"texture":0}},"type":"cube","uuid":"94261ed0-a8a6-8d18-ac42-13127515d848"},{"name":"body_inner","box_uv":true,"render_order":"behind","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,12,-2],"to":[4,24,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[40,0],"faces":{"north":{"uv":[44,4,52,16],"texture":0},"east":{"uv":[40,4,44,16],"texture":0},"south":{"uv":[56,4,64,16],"texture":0},"west":{"uv":[52,4,56,16],"texture":0},"up":{"uv":[52,4,44,0],"texture":0},"down":{"uv":[60,0,52,4],"texture":0}},"type":"cube","uuid":"bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40"},{"name":"left_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-8,12,-2],"to":[-4,24,2],"autouv":0,"color":3,"mirror_uv":true,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[8,36,4,48],"texture":0},"east":{"uv":[12,36,8,48],"texture":0},"south":{"uv":[16,36,12,48],"texture":0},"west":{"uv":[4,36,0,48],"texture":0},"up":{"uv":[4,36,8,32],"texture":0},"down":{"uv":[8,32,12,36],"texture":0}},"type":"cube","uuid":"9c87cab3-03d4-97ee-21bd-9815d0e98d53"},{"name":"right_sleeve","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,12,-2],"to":[8,24,2],"autouv":0,"color":0,"inflate":0.3,"origin":[0,0,0],"uv_offset":[0,32],"faces":{"north":{"uv":[4,36,8,48],"texture":0},"east":{"uv":[0,36,4,48],"texture":0},"south":{"uv":[12,36,16,48],"texture":0},"west":{"uv":[8,36,12,48],"texture":0},"up":{"uv":[8,36,4,32],"texture":0},"down":{"uv":[12,32,8,36],"texture":0}},"type":"cube","uuid":"fd5e025b-d5f6-8bd3-d981-66783aa2a923"},{"name":"right_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,12,2],"autouv":0,"color":3,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[52,36,56,48],"texture":0},"east":{"uv":[48,36,52,48],"texture":0},"south":{"uv":[60,36,64,48],"texture":0},"west":{"uv":[56,36,60,48],"texture":0},"up":{"uv":[56,36,52,32],"texture":0},"down":{"uv":[60,32,56,36],"texture":0}},"type":"cube","uuid":"e035f1e5-f5da-d86a-efe6-d73b506ae82e"},{"name":"left_legging","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,12,2],"autouv":0,"color":9,"mirror_uv":true,"inflate":0.35,"origin":[0,0,0],"uv_offset":[48,32],"faces":{"north":{"uv":[56,36,52,48],"texture":0},"east":{"uv":[60,36,56,48],"texture":0},"south":{"uv":[64,36,60,48],"texture":0},"west":{"uv":[52,36,48,48],"texture":0},"up":{"uv":[52,36,56,32],"texture":0},"down":{"uv":[56,32,60,36],"texture":0}},"type":"cube","uuid":"92e4165d-8268-5063-8211-7221aae1b76e"},{"name":"left_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,0,-2],"to":[0,4,2],"autouv":0,"color":2,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"0c26f55d-2961-ea9c-ea83-843b23d37a98"},{"name":"right_boot","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,0,-2],"to":[4,4,2],"autouv":0,"color":3,"inflate":0.3,"origin":[0,0,0],"uv_offset":[16,40],"faces":{"north":{"uv":[20,44,24,48],"texture":0},"east":{"uv":[16,44,20,48],"texture":0},"south":{"uv":[28,44,32,48],"texture":0},"west":{"uv":[24,44,28,48],"texture":0},"up":{"uv":[24,44,20,40],"texture":0},"down":{"uv":[28,40,24,44],"texture":0}},"type":"cube","uuid":"3bb185dc-1abc-3fe5-b883-7af7889a4f3f"},{"name":"strap","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-9.8,11.95,-3],"to":[0.2,14.95,3],"autouv":0,"color":2,"mirror_uv":true,"rotation":[0,0,-22.5],"origin":[-0.75,1.75,0],"uv_offset":[0,48],"faces":{"north":{"uv":[16,54,6,57],"texture":0},"east":{"uv":[22,54,16,57],"texture":0},"south":{"uv":[32,54,22,57],"texture":0},"west":{"uv":[6,54,0,57],"texture":0},"up":{"uv":[6,54,16,48],"texture":0},"down":{"uv":[16,48,26,54],"texture":0}},"type":"cube","uuid":"5595171c-e809-03ca-68ed-7115d9ffbb94"},{"name":"buckle","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4.95,14.1,-3],"to":[-1.95,17.1,3],"autouv":0,"color":6,"mirror_uv":true,"inflate":0.1,"origin":[-0.75,0,0],"uv_offset":[32,48],"faces":{"north":{"uv":[41,54,38,57],"texture":0},"east":{"uv":[47,54,41,57],"texture":0},"south":{"uv":[50,54,47,57],"texture":0},"west":{"uv":[38,54,32,57],"texture":0},"up":{"uv":[38,54,41,48],"texture":0},"down":{"uv":[41,48,44,54],"texture":0}},"type":"cube","uuid":"4cb47817-d5c8-81f7-ce53-eddcf011ee3e"},{"name":"right_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[4,28.5,0],"to":[12,36.5,0],"autouv":0,"color":0,"mirror_uv":true,"rotation":[0,0,75],"origin":[5,32.5,0],"uv_offset":[24,0],"faces":{"north":{"uv":[32,0,24,8],"texture":0},"east":{"uv":[32,0,32,8],"texture":0},"south":{"uv":[40,0,32,8],"texture":0},"west":{"uv":[24,0,24,8],"texture":0},"up":{"uv":[24,0,32,0],"texture":0},"down":{"uv":[32,0,40,0],"texture":0}},"type":"cube","uuid":"00b324ac-7d37-b5d8-4201-5e85760400af"},{"name":"left_horn","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-12,28.6,0],"to":[-4,36.6,0],"autouv":0,"color":0,"rotation":[0,0,-75],"origin":[-5,32.6,0],"uv_offset":[24,0],"faces":{"north":{"uv":[24,0,32,8],"texture":0},"east":{"uv":[24,0,24,8],"texture":0},"south":{"uv":[32,0,40,8],"texture":0},"west":{"uv":[32,0,32,8],"texture":0},"up":{"uv":[32,0,24,0],"texture":0},"down":{"uv":[40,0,32,0],"texture":0}},"type":"cube","uuid":"a9e5e1e6-b585-094b-da8c-835678984610"}],"groups":[{"name":"head","uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,32,-4],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"body","uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightArm","uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[4,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftArm","uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-8,24,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"rightLeg","uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[0,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"leftLeg","uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[-4,12,-2],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false},{"name":"sash","uuid":"01148eb6-5484-1b29-ae31-deabde803a47","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[5.45,13.2,-3],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":false,"primary_selected":true},{"name":"horns","uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","export":true,"locked":false,"scope":0,"selected":false,"_static":{"properties":{},"temp_data":{}},"origin":[5,32.5,0],"rotation":[0,0,0],"color":0,"children":[],"reset":false,"shade":true,"mirror_uv":false,"visibility":true,"autouv":0,"isOpen":true,"primary_selected":false}],"outliner":[{"uuid":"340a6871-310d-6a24-43ff-ddf85346d82f","isOpen":true,"children":[{"uuid":"05a5b561-43ff-8683-4ce7-978731e9d8c5","isOpen":true,"children":["00b324ac-7d37-b5d8-4201-5e85760400af","a9e5e1e6-b585-094b-da8c-835678984610"]},"7c76db23-25f3-7b95-ac9f-2e9bcf0f9759","bb31bdb7-b4f5-8fd6-0631-ad789263fce7"]},{"uuid":"303b4664-b31a-5ba5-b6bf-ed9ee71370bb","isOpen":true,"children":["bd4844dd-2a0e-3f4e-fa0b-7da3d2887e40","94261ed0-a8a6-8d18-ac42-13127515d848",{"uuid":"01148eb6-5484-1b29-ae31-deabde803a47","isOpen":false,"children":["5595171c-e809-03ca-68ed-7115d9ffbb94","4cb47817-d5c8-81f7-ce53-eddcf011ee3e"]}]},{"uuid":"d74e7c20-c22d-d9d4-9aef-4faded63fc4e","isOpen":true,"children":["fd5e025b-d5f6-8bd3-d981-66783aa2a923"]},{"uuid":"63506f26-b3de-59cb-b312-386615c5bc0d","isOpen":true,"children":["9c87cab3-03d4-97ee-21bd-9815d0e98d53"]},{"uuid":"e46d3e87-8f26-2f4d-963a-bdf55792cfa6","isOpen":true,"children":["e035f1e5-f5da-d86a-efe6-d73b506ae82e","3bb185dc-1abc-3fe5-b883-7af7889a4f3f"]},{"uuid":"39fd2105-d958-5410-6032-afffb1ec9e1d","isOpen":true,"children":["92e4165d-8268-5063-8211-7221aae1b76e","0c26f55d-2961-ea9c-ea83-843b23d37a98"]}],"textures":[{"name":"","path":"","folder":"","namespace":"","id":"0","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"af3aae18-9f98-d4de-7b0f-c58cd9965743","source":"data:image/png;base64,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"}]} \ No newline at end of file From 78a13a4a7e984cb3a795ab7957b64db29dbf38f1 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Tue, 25 Aug 2026 18:12:13 -0400 Subject: [PATCH 11/45] Add armor names --- .../hexcasting/common/items/armor/ItemRobes.java | 16 ++++++++++++++-- .../assets/hexcasting/lang/en_us.flatten.json5 | 9 +++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java index d828024cfc..998d27dca2 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java @@ -8,6 +8,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.core.Holder; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; @@ -22,10 +23,10 @@ * On fabric: custom HexRobesRenderer set up from FabricHexClientInitializer (line 60) */ public class ItemRobes extends ArmorItem implements VariantItem { - public final ArmorItem.Type type; + public final Type type; private @Nullable HexRobesModel[] models; - public ItemRobes(ArmorItem.Type type, Properties properties) { + public ItemRobes(Type type, Properties properties) { super(Holder.direct(HexAPI.instance().robesMaterial()), type, properties); this.type = type; } @@ -49,6 +50,17 @@ public ResourceLocation getArmorTexture(ItemStack stack, Entity entity, Equipmen return HexAPI.modLoc("textures/armor/robes"+getVariant(stack)+".png"); } + @Override + public Component getName(ItemStack pStack) { + var descID = this.getDescriptionId(pStack); + var robesItem = (ItemRobes) pStack.getItem(); + if (robesItem.type == Type.LEGGINGS) { + return Component.translatable(descID + "." + robesItem.getVariant(pStack)); + } else { + return Component.translatable(descID); + } + } + @Override public int numVariants() { return 3; } } diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 2a7384dbad..396612931e 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -62,6 +62,15 @@ abacus: "Abacus", jeweler_hammer: "Jeweler's Hammer", sub_sandwich: "Submarine Sandwich", + + robes: { + hood: "Grand Caster Hood", + tunic: "Grand Caster Tunic", + "legs.0": "Grand Caster Robe", + "legs.1": "Grand Caster Pants", + "legs.2": "Grand Caster Leggings", + boots: "Grand Caster Boots", + }, dye_colorizer_: { white: "White Pigment", From 3871312e9fdafd75fff8ec2489f2915b557928b9 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Tue, 25 Aug 2026 19:32:03 -0400 Subject: [PATCH 12/45] Properly register the armor material --- .../java/at/petrak/hexcasting/api/HexAPI.java | 14 -------- .../hexcasting/common/impl/HexAPIImpl.java | 15 -------- .../common/items/armor/ItemRobes.java | 3 +- .../common/lib/HexArmorMaterials.java | 36 +++++++++++++++++++ .../fabric/client/HexRobesRenderer.java | 3 +- 5 files changed, 40 insertions(+), 31 deletions(-) create mode 100644 Common/src/main/java/at/petrak/hexcasting/common/lib/HexArmorMaterials.java diff --git a/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java b/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java index fcdc94b920..59b177b4e6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/HexAPI.java @@ -158,20 +158,6 @@ default FrozenPigment getColorizer(Player player) { return FrozenPigment.DEFAULT.get(); } - ArmorMaterial DUMMY_ARMOR_MATERIAL = new ArmorMaterial( - Collections.emptyMap(), - 0, - SoundEvents.ARMOR_EQUIP_LEATHER, - () -> Ingredient.EMPTY, - Collections.emptyList(), - 0, - 0 - ); - - default ArmorMaterial robesMaterial() { - return DUMMY_ARMOR_MATERIAL; - } - /** * Location in the userdata of the ravenmind */ diff --git a/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java b/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java index ccab5c3c8b..0e461a6df1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/impl/HexAPIImpl.java @@ -112,19 +112,4 @@ public Consumer defaultBrainsweepingBehavior() { public FrozenPigment getColorizer(Player player) { return IXplatAbstractions.INSTANCE.getPigment(player); } - - ArmorMaterial ARMOR_MATERIAL = new ArmorMaterial( - Collections.emptyMap(), - 0, - SoundEvents.ARMOR_EQUIP_LEATHER, - () -> Ingredient.EMPTY, - List.of(new ArmorMaterial.Layer(HexAPI.modLoc("robes"))), - 0, - 0 - ); - - @Override - public ArmorMaterial robesMaterial() { - return ARMOR_MATERIAL; - } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java index 998d27dca2..0e3d52798f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java @@ -5,6 +5,7 @@ import at.petrak.hexcasting.api.item.VariantItem; import at.petrak.hexcasting.client.model.HexModelLayers; import at.petrak.hexcasting.client.model.HexRobesModel; +import at.petrak.hexcasting.common.lib.HexArmorMaterials; import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.core.Holder; @@ -27,7 +28,7 @@ public class ItemRobes extends ArmorItem implements VariantItem { private @Nullable HexRobesModel[] models; public ItemRobes(Type type, Properties properties) { - super(Holder.direct(HexAPI.instance().robesMaterial()), type, properties); + super(HexArmorMaterials.ROBES, type, properties); this.type = type; } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexArmorMaterials.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexArmorMaterials.java new file mode 100644 index 0000000000..f2cfd6b1f0 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexArmorMaterials.java @@ -0,0 +1,36 @@ +package at.petrak.hexcasting.common.lib; + +import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.xplat.IXplatAbstractions; +import at.petrak.hexcasting.xplat.IXplatRegister; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.item.ArmorItem.Type; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ArmorMaterials; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.crafting.Ingredient; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class HexArmorMaterials { + private static final IXplatRegister REGISTER = IXplatAbstractions.INSTANCE.createRegistar(Registries.ARMOR_MATERIAL); + + public static void register() { + REGISTER.registerAll(); + } + + public static final Holder ROBES = REGISTER.registerHolder("robes", () -> + new ArmorMaterial( + Map.of(), // no defense here since it's specified with the other attributes in ItemRobes + ArmorMaterials.GOLD.value().enchantmentValue(), + SoundEvents.ARMOR_EQUIP_LEATHER, + () -> Ingredient.EMPTY, // TODO: repair with whatever it's crafted with + List.of(new ArmorMaterial.Layer(HexAPI.modLoc("robes"))), + 0, 0 // no toughness or knockback resistance + )); +} diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java index ae9737132b..48607da62c 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/client/HexRobesRenderer.java @@ -2,6 +2,7 @@ import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.common.items.armor.ItemRobes; +import at.petrak.hexcasting.common.lib.HexArmorMaterials; import at.petrak.hexcasting.common.lib.HexItems; import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderer; import net.minecraft.world.item.Item; @@ -22,7 +23,7 @@ public static void init() { ItemRobes armor = (ItemRobes) stack.getItem(); var model = armor.getArmorModels()[armor.getVariant(stack)]; - var texture = armor.getArmorTexture(stack, entity, slot, HexAPI.instance().robesMaterial().layers().getFirst(), false); + var texture = armor.getArmorTexture(stack, entity, slot, HexArmorMaterials.ROBES.value().layers().getFirst(), false); contextModel.copyPropertiesTo(model); ArmorRenderer.renderPart(matrices, vertexConsumers, light, stack, model, texture); From 3aca36de79bc3f9e87a37abe83adaa895cba23b3 Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Tue, 25 Aug 2026 19:42:44 -0400 Subject: [PATCH 13/45] Initial armor stats (may need rebalancing) --- .../common/items/armor/ItemRobes.java | 43 +++++++++++++++++++ .../hexcasting/common/lib/HexAttributes.java | 2 +- .../hexcasting/common/lib/HexItems.java | 31 ++++++++++--- 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java index 0e3d52798f..020d3c4625 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java @@ -5,7 +5,9 @@ import at.petrak.hexcasting.api.item.VariantItem; import at.petrak.hexcasting.client.model.HexModelLayers; import at.petrak.hexcasting.client.model.HexRobesModel; +import at.petrak.hexcasting.common.items.ItemLens; import at.petrak.hexcasting.common.lib.HexArmorMaterials; +import at.petrak.hexcasting.common.lib.HexAttributes; import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.core.Holder; @@ -13,11 +15,17 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemAttributeModifiers; import org.jetbrains.annotations.Nullable; +import static at.petrak.hexcasting.api.HexAPI.modLoc; + /** * To get the armor model in; * On forge: client item extension in ForgeHexClientInitializer (line 161) @@ -27,6 +35,41 @@ public class ItemRobes extends ArmorItem implements VariantItem { public final Type type; private @Nullable HexRobesModel[] models; + public static ItemAttributeModifiers HOOD_MODIFIERS = ItemAttributeModifiers.builder() + .add(HexAttributes.SCRY_SIGHT, ItemLens.SCRY_SIGHT, EquipmentSlotGroup.HEAD) + .add(HexAttributes.GRID_ZOOM, ItemLens.GRID_ZOOM, EquipmentSlotGroup.HEAD) + .add(Attributes.ARMOR, new AttributeModifier( + modLoc("robes_hood_armor"), 3.0, AttributeModifier.Operation.ADD_VALUE + ), EquipmentSlotGroup.HEAD) + .build(); + + public static ItemAttributeModifiers TUNIC_MODIFIERS = ItemAttributeModifiers.builder() + .add(HexAttributes.MEDIA_CONSUMPTION_MODIFIER, new AttributeModifier( + modLoc("robes_tunic_discount"), -0.1, AttributeModifier.Operation.ADD_MULTIPLIED_BASE + ), EquipmentSlotGroup.CHEST) + .add(Attributes.ARMOR, new AttributeModifier( + modLoc("robes_tunic_armor"), 7.0, AttributeModifier.Operation.ADD_VALUE + ), EquipmentSlotGroup.CHEST) + .build(); + + public static ItemAttributeModifiers LEGS_MODIFIERS = ItemAttributeModifiers.builder() + .add(HexAttributes.AMBIT_RADIUS, new AttributeModifier( + modLoc("robes_legs_ambit"), 4.0, AttributeModifier.Operation.ADD_VALUE + ), EquipmentSlotGroup.LEGS) + .add(Attributes.ARMOR, new AttributeModifier( + modLoc("robes_legs_armor"), 6.0, AttributeModifier.Operation.ADD_VALUE + ), EquipmentSlotGroup.LEGS) + .build(); + + public static ItemAttributeModifiers BOOTS_MODIFIERS = ItemAttributeModifiers.builder() + .add(HexAttributes.SENTINEL_RADIUS, new AttributeModifier( + modLoc("robes_boots_sentinel_ambit"), 2.0, AttributeModifier.Operation.ADD_VALUE + ), EquipmentSlotGroup.FEET) + .add(Attributes.ARMOR, new AttributeModifier( + modLoc("robes_boots_armor"), 2.0, AttributeModifier.Operation.ADD_VALUE + ), EquipmentSlotGroup.FEET) + .build(); + public ItemRobes(Type type, Properties properties) { super(HexArmorMaterials.ROBES, type, properties); this.type = type; diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java index 707ec6544c..e5469995b6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java @@ -33,7 +33,7 @@ public static void register() { //a multiplier to adjust media consumption across the board public static final Holder MEDIA_CONSUMPTION_MODIFIER = REGISTER.registerHolder("media_consumption", () -> new RangedAttribute( - MOD_ID + ".attributes.media_consumption", 1.0, 0.0, Double.MAX_VALUE).setSyncable(true)); + MOD_ID + ".attributes.media_consumption", 1.0, 0.0, Double.MAX_VALUE).setSyncable(true).setSentiment(Attribute.Sentiment.NEGATIVE)); public static final Holder AMBIT_RADIUS = REGISTER.registerHolder("ambit_radius", () -> new RangedAttribute( MOD_ID + ".attributes.ambit_radius", PlayerBasedCastEnv.DEFAULT_AMBIT_RADIUS, 0.0, Double.MAX_VALUE).setSyncable(true)); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index 16d4c1cdfa..d5e1a2d00f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -1,5 +1,6 @@ package at.petrak.hexcasting.common.lib; +import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.api.casting.ActionRegistryEntry; import at.petrak.hexcasting.api.misc.MediaConstants; import at.petrak.hexcasting.api.mod.HexTags; @@ -76,11 +77,6 @@ public static void registerItemsForCreativeTab(ResourceKey tabK IXplatAbstractions.INSTANCE.addEquipSlotFabric(EquipmentSlot.HEAD) .stacksTo(1).attributes(ItemLens.MODIFIERS))); - public static final Supplier ROBES_HOOD = make("robes/hood", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable())); - public static final Supplier ROBES_TUNIC = make("robes/tunic", () -> new ItemRobes(ArmorItem.Type.CHESTPLATE, unstackable())); - public static final Supplier ROBES_LEGS = make("robes/legs", () -> new ItemRobes(ArmorItem.Type.LEGGINGS, unstackable())); - public static final Supplier ROBES_BOOTS = make("robes/boots", () -> new ItemRobes(ArmorItem.Type.BOOTS, unstackable())); - public static final Supplier ABACUS = make("abacus", () -> new ItemAbacus(unstackable())); public static final Supplier THOUGHT_KNOT = make("thought_knot", () -> new ItemThoughtKnot(unstackable())); public static final Supplier FOCUS = make("focus", () -> new ItemFocus(unstackable())); @@ -106,6 +102,31 @@ public static void registerItemsForCreativeTab(ResourceKey tabK ) ); + public static final Supplier ROBES_HOOD = make("robes/hood", () -> + new ItemRobes(ArmorItem.Type.HELMET, unstackable() + .durability(270) + .attributes(ItemRobes.HOOD_MODIFIERS) + ) + ); + public static final Supplier ROBES_TUNIC = make("robes/tunic", () -> + new ItemRobes(ArmorItem.Type.CHESTPLATE, unstackable() + .durability(400) + .attributes(ItemRobes.TUNIC_MODIFIERS) + ) + ); + public static final Supplier ROBES_LEGS = make("robes/legs", () -> + new ItemRobes(ArmorItem.Type.LEGGINGS, unstackable() + .durability(350) + .attributes(ItemRobes.LEGS_MODIFIERS) + ) + ); + public static final Supplier ROBES_BOOTS = make("robes/boots", () -> + new ItemRobes(ArmorItem.Type.BOOTS, unstackable() + .durability(315) + .attributes(ItemRobes.BOOTS_MODIFIERS) + ) + ); + public static final Supplier SCROLL_SMOL = make("scroll_small", () -> new ItemScroll(props(), 1)); public static final Supplier SCROLL_MEDIUM = make("scroll_medium", () -> new ItemScroll(props(), 2)); public static final Supplier SCROLL_LARGE = make("scroll", () -> new ItemScroll(props(), 3)); From 245b6adf43893639a5356c804a695706fd2f5e2e Mon Sep 17 00:00:00 2001 From: Robotgiggle <88736742+Robotgiggle@users.noreply.github.com> Date: Tue, 25 Aug 2026 21:01:23 -0400 Subject: [PATCH 14/45] Fix scaling on variant2 leg/boot --- .../java/at/petrak/hexcasting/client/model/HexRobesModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java index 707aa30b36..c9c24a28dc 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/model/HexRobesModel.java @@ -252,12 +252,12 @@ public static LayerDefinition variant2() { rightLeg.addOrReplaceChild("right_skirt", CubeListBuilder.create() - .texOffs(48, 32).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.3F)), + .texOffs(48, 32).addBox(-4.0F, 0.0F, 0.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.35F)), PartPose.offset(2.0F, 0.0F, -2.0F)); rightLeg.addOrReplaceChild("right_boot", CubeListBuilder.create() - .texOffs(16, 40).addBox(-4.0F, 8.0F, 0.0F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.35F)), + .texOffs(16, 40).addBox(-4.0F, 8.0F, 0.0F, 4.0F, 4.0F, 4.0F, new CubeDeformation(0.3F)), PartPose.offset(2.0F, 0.0F, -2.0F)); var leftLeg = root.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); From bfe49f598932d61c885797520879badd487ae863 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 26 Aug 2026 14:45:21 -0400 Subject: [PATCH 15/45] Implement neural fiber + armor recipes --- .../hexcasting/models/item/neural_fiber.json | 6 ++ .../recipes/combat/robes/boots.json | 32 ++++++++++ .../recipes/combat/robes/hood.json | 32 ++++++++++ .../recipes/combat/robes/legs.json | 32 ++++++++++ .../recipes/combat/robes/tunic.json | 32 ++++++++++ .../data/hexcasting/recipe/robes/boots.json | 21 +++++++ .../data/hexcasting/recipe/robes/hood.json | 20 ++++++ .../data/hexcasting/recipe/robes/legs.json | 18 ++++++ .../data/hexcasting/recipe/robes/tunic.json | 18 ++++++ .../hexcasting/common/lib/HexItems.java | 2 + .../datagen/recipe/HexplatRecipes.java | 29 +++++++++ .../hexcasting/textures/item/neural_fiber.png | Bin 0 -> 7837 bytes .../textures/item/neural_fiber.png.mcmeta | 59 ++++++++++++++++++ .../recipes/combat/robes/boots.json | 32 ++++++++++ .../recipes/combat/robes/hood.json | 32 ++++++++++ .../recipes/combat/robes/legs.json | 32 ++++++++++ .../recipes/combat/robes/tunic.json | 32 ++++++++++ .../data/hexcasting/recipe/robes/boots.json | 21 +++++++ .../data/hexcasting/recipe/robes/hood.json | 20 ++++++ .../data/hexcasting/recipe/robes/legs.json | 18 ++++++ .../data/hexcasting/recipe/robes/tunic.json | 18 ++++++ .../hexcasting/models/item/neural_fiber.json | 6 ++ .../recipes/combat/robes/boots.json | 32 ++++++++++ .../recipes/combat/robes/hood.json | 32 ++++++++++ .../recipes/combat/robes/legs.json | 32 ++++++++++ .../recipes/combat/robes/tunic.json | 32 ++++++++++ .../data/hexcasting/recipe/robes/boots.json | 21 +++++++ .../data/hexcasting/recipe/robes/hood.json | 20 ++++++ .../data/hexcasting/recipe/robes/legs.json | 18 ++++++ .../data/hexcasting/recipe/robes/tunic.json | 18 ++++++ .../forge/datagen/xplat/HexItemModels.java | 1 + 31 files changed, 718 insertions(+) create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/neural_fiber.json create mode 100644 Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json create mode 100644 Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json create mode 100644 Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json create mode 100644 Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json create mode 100644 Common/src/generated/resources/data/hexcasting/recipe/robes/boots.json create mode 100644 Common/src/generated/resources/data/hexcasting/recipe/robes/hood.json create mode 100644 Common/src/generated/resources/data/hexcasting/recipe/robes/legs.json create mode 100644 Common/src/generated/resources/data/hexcasting/recipe/robes/tunic.json create mode 100644 Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png create mode 100644 Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png.mcmeta create mode 100644 Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/recipe/robes/boots.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/recipe/robes/hood.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/recipe/robes/legs.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/recipe/robes/tunic.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/neural_fiber.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/recipe/robes/boots.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/recipe/robes/hood.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/recipe/robes/legs.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/recipe/robes/tunic.json diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/neural_fiber.json b/Common/src/generated/resources/assets/hexcasting/models/item/neural_fiber.json new file mode 100644 index 0000000000..0d52422152 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/neural_fiber.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/neural_fiber" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json b/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json new file mode 100644 index 0000000000..e2c37e3408 --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/boots" + ] + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json b/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json new file mode 100644 index 0000000000..0b7770cf3f --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/hood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/hood" + ] + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json b/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json new file mode 100644 index 0000000000..7076892ac0 --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/legs" + ] + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json b/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json new file mode 100644 index 0000000000..9e5bac0e88 --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/tunic" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/tunic" + ] + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/recipe/robes/boots.json b/Common/src/generated/resources/data/hexcasting/recipe/robes/boots.json new file mode 100644 index 0000000000..3c2411b6fc --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/recipe/robes/boots.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "B": { + "item": "minecraft:bone" + }, + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + " ", + "B B", + "F F" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/boots" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/recipe/robes/hood.json b/Common/src/generated/resources/data/hexcasting/recipe/robes/hood.json new file mode 100644 index 0000000000..1f2cd42944 --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/recipe/robes/hood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "B": { + "item": "minecraft:bone" + }, + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + "BFB", + "F F" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/hood" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/recipe/robes/legs.json b/Common/src/generated/resources/data/hexcasting/recipe/robes/legs.json new file mode 100644 index 0000000000..3715882308 --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/recipe/robes/legs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + "FFF", + "F F", + "F F" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/legs" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/recipe/robes/tunic.json b/Common/src/generated/resources/data/hexcasting/recipe/robes/tunic.json new file mode 100644 index 0000000000..c162bb6405 --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/recipe/robes/tunic.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + "F F", + "FFF", + "FFF" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/tunic" + } +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index d5e1a2d00f..0d8d234abd 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -102,6 +102,8 @@ public static void registerItemsForCreativeTab(ResourceKey tabK ) ); + public static final Supplier NEURAL_FIBER = make("neural_fiber", () -> new Item(props())); + public static final Supplier ROBES_HOOD = make("robes/hood", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable() .durability(270) diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java index 4f817a0293..3162c2ecab 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java @@ -261,6 +261,35 @@ public void buildRecipes(RecipeOutput recipes) { .pattern(" S ") .unlockedBy("has_item", hasItem(Items.AMETHYST_SHARD)).save(recipes); + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, HexItems.ROBES_HOOD.get()) + .define('F', HexItems.NEURAL_FIBER.get()) + .define('B', Items.BONE) + .pattern("BFB") + .pattern("F F") + .unlockedBy("has_item", hasItem(HexItems.NEURAL_FIBER.get())).save(recipes); + + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, HexItems.ROBES_TUNIC.get()) + .define('F', HexItems.NEURAL_FIBER.get()) + .pattern("F F") + .pattern("FFF") + .pattern("FFF") + .unlockedBy("has_item", hasItem(HexItems.NEURAL_FIBER.get())).save(recipes); + + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, HexItems.ROBES_LEGS.get()) + .define('F', HexItems.NEURAL_FIBER.get()) + .pattern("FFF") + .pattern("F F") + .pattern("F F") + .unlockedBy("has_item", hasItem(HexItems.NEURAL_FIBER.get())).save(recipes); + + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, HexItems.ROBES_BOOTS.get()) + .define('F', HexItems.NEURAL_FIBER.get()) + .define('B', Items.BONE) + .pattern(" ") + .pattern("B B") + .pattern("F F") + .unlockedBy("has_item", hasItem(HexItems.NEURAL_FIBER.get())).save(recipes); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, HexItems.AMETHYST_DUST.get(), (int) (MediaConstants.QUENCHED_SHARD_UNIT / MediaConstants.DUST_UNIT) + 1) .requires(HexItems.QUENCHED_SHARD.get()) diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png b/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png new file mode 100644 index 0000000000000000000000000000000000000000..571e81dc25938b4e9a5a7eece4bf5c8132e7b60f GIT binary patch literal 7837 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 literal 0 HcmV?d00001 diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png.mcmeta b/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png.mcmeta new file mode 100644 index 0000000000..ffea578b08 --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png.mcmeta @@ -0,0 +1,59 @@ +{ + "animation": { + "interpolate": false, + "frames": [ + { + "index": 0, + "time": 2 + }, + { + "index": 1, + "time": 2 + }, + { + "index": 2, + "time": 2 + }, + { + "index": 3, + "time": 2 + }, + { + "index": 4, + "time": 2 + }, + { + "index": 5, + "time": 2 + }, + { + "index": 6, + "time": 2 + }, + { + "index": 7, + "time": 2 + }, + { + "index": 8, + "time": 1 + }, + { + "index": 9, + "time": 1 + }, + { + "index": 10, + "time": 1 + }, + { + "index": 11, + "time": 2 + }, + { + "index": 12, + "time": 2 + } + ] + } +} diff --git a/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json new file mode 100644 index 0000000000..e2c37e3408 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/boots" + ] + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json new file mode 100644 index 0000000000..0b7770cf3f --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/hood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/hood" + ] + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json new file mode 100644 index 0000000000..7076892ac0 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/legs" + ] + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json new file mode 100644 index 0000000000..9e5bac0e88 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/tunic" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/tunic" + ] + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/recipe/robes/boots.json b/Fabric/src/generated/resources/data/hexcasting/recipe/robes/boots.json new file mode 100644 index 0000000000..3c2411b6fc --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/recipe/robes/boots.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "B": { + "item": "minecraft:bone" + }, + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + " ", + "B B", + "F F" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/boots" + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/recipe/robes/hood.json b/Fabric/src/generated/resources/data/hexcasting/recipe/robes/hood.json new file mode 100644 index 0000000000..1f2cd42944 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/recipe/robes/hood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "B": { + "item": "minecraft:bone" + }, + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + "BFB", + "F F" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/hood" + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/recipe/robes/legs.json b/Fabric/src/generated/resources/data/hexcasting/recipe/robes/legs.json new file mode 100644 index 0000000000..3715882308 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/recipe/robes/legs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + "FFF", + "F F", + "F F" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/legs" + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/recipe/robes/tunic.json b/Fabric/src/generated/resources/data/hexcasting/recipe/robes/tunic.json new file mode 100644 index 0000000000..c162bb6405 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/recipe/robes/tunic.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + "F F", + "FFF", + "FFF" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/tunic" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/neural_fiber.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/neural_fiber.json new file mode 100644 index 0000000000..0d52422152 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/neural_fiber.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:item/neural_fiber" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json new file mode 100644 index 0000000000..e2c37e3408 --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/boots.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/boots" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/boots" + ] + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json new file mode 100644 index 0000000000..0b7770cf3f --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/hood.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/hood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/hood" + ] + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json new file mode 100644 index 0000000000..7076892ac0 --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/legs.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/legs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/legs" + ] + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json new file mode 100644 index 0000000000..9e5bac0e88 --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/combat/robes/tunic.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:robes/tunic" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:robes/tunic" + ] + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/boots.json b/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/boots.json new file mode 100644 index 0000000000..3c2411b6fc --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/boots.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "B": { + "item": "minecraft:bone" + }, + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + " ", + "B B", + "F F" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/boots" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/hood.json b/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/hood.json new file mode 100644 index 0000000000..1f2cd42944 --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/hood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "B": { + "item": "minecraft:bone" + }, + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + "BFB", + "F F" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/hood" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/legs.json b/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/legs.json new file mode 100644 index 0000000000..3715882308 --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/legs.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + "FFF", + "F F", + "F F" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/legs" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/tunic.json b/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/tunic.json new file mode 100644 index 0000000000..c162bb6405 --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/recipe/robes/tunic.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + "F F", + "FFF", + "FFF" + ], + "result": { + "count": 1, + "id": "hexcasting:robes/tunic" + } +} \ No newline at end of file diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java index 439b3d6d19..ebfc072a97 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java @@ -55,6 +55,7 @@ protected void registerModels() { brandishedItem(HexItems.JEWELER_HAMMER.get()); simpleItem(HexItems.CREATIVE_UNLOCKER.get()); simpleItem(HexItems.LORE_FRAGMENT.get()); + simpleItem(HexItems.NEURAL_FIBER.get()); singleTexture(getPath(HexBlocks.CONJURED_BLOCK.get()), ResourceLocation.withDefaultNamespace("item/generated"), From 1a6722610fe5eef73c09cf63ca8ed19e67656943 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 26 Aug 2026 22:27:12 -0400 Subject: [PATCH 16/45] Basic grid panning system --- .../hexcasting/client/gui/GuiSpellcasting.kt | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index bf29700dbe..e7b0c4bbe9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -52,6 +52,8 @@ class GuiSpellcasting constructor( private var drawState: PatternDrawState = PatternDrawState.BetweenPatterns private val usedSpots: MutableSet = HashSet() + private var panOffset: Vec2 = Vec2.ZERO + private var ambianceSoundInstance: GridSoundInstance? = null private val randSrc = SoundInstance.createUnseededRandom() @@ -149,11 +151,11 @@ class GuiSpellcasting constructor( } if (HexConfig.client().clickingTogglesDrawing()) { return if (this.drawState is PatternDrawState.BetweenPatterns) - drawStart(mxOut, myOut) + pButton != 1 && drawStart(mxOut, myOut) else drawEnd() } - return drawStart(mxOut, myOut) + return pButton != 1 && drawStart(mxOut, myOut) } private fun drawStart(mxOut: Double, myOut: Double): Boolean { @@ -194,9 +196,19 @@ class GuiSpellcasting constructor( } if (HexConfig.client().clickingTogglesDrawing()) return false + if (pButton == 1) { + return panGrid(pDragX, pDragY) + } return drawMove(mxOut, myOut) } + private fun panGrid(pDragX: Double, pDragY: Double): Boolean { + val shift = Vec2(pDragX.toFloat(), pDragY.toFloat()) + this.panOffset = this.panOffset.add(shift) + this.drawState = PatternDrawState.BetweenPatterns + return false; + } + private fun drawMove(mxOut: Double, myOut: Double): Boolean { val mx = Mth.clamp(mxOut, 0.0, this.width.toDouble()) val my = Mth.clamp(myOut, 0.0, this.height.toDouble()) @@ -532,7 +544,7 @@ class GuiSpellcasting constructor( return (baseScale / scaleModifier).toFloat() } - fun coordsOffset(): Vec2 = Vec2(this.width.toFloat() * 0.5f, this.height.toFloat() * 0.5f) + fun coordsOffset(): Vec2 = Vec2(this.width.toFloat() * 0.5f, this.height.toFloat() * 0.5f).add(this.panOffset) fun coordToPx(coord: HexCoord) = at.petrak.hexcasting.api.utils.coordToPx(coord, this.hexSize(), this.coordsOffset()) @@ -541,7 +553,7 @@ class GuiSpellcasting constructor( private sealed class PatternDrawState { - /** We're waiting on the player to right-click again */ + /** We're waiting on the player to left-click again */ object BetweenPatterns : PatternDrawState() /** We just started drawing and haven't drawn the first line yet. */ From 13b6791c0088bb1cf26341ba6ace57f583fb28d0 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 26 Aug 2026 22:59:37 -0400 Subject: [PATCH 17/45] Make grid-pan button configurable --- .../main/java/at/petrak/hexcasting/api/mod/HexConfig.java | 3 +++ .../at/petrak/hexcasting/client/gui/GuiSpellcasting.kt | 6 +++--- .../resources/assets/hexcasting/lang/en_us.flatten.json5 | 4 ++++ .../java/at/petrak/hexcasting/fabric/FabricHexConfig.java | 6 ++++++ .../java/at/petrak/hexcasting/forge/ForgeHexConfig.java | 7 +++++++ 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java index 5a63fdef8a..060dbe5572 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java @@ -51,6 +51,8 @@ public interface ClientConfigAccess { boolean clickingTogglesDrawing(); + int gridPanMouseButton(); + boolean advancedTooltipsShowsIotaNBT(); boolean staticActiveSlates(); @@ -61,6 +63,7 @@ public interface ClientConfigAccess { boolean DEFAULT_INVERT_ABACUS_SCROLL = false; double DEFAULT_GRID_SNAP_THRESHOLD = 0.5; boolean DEFAULT_CLICKING_TOGGLES_DRAWING = false; + int DEFAULT_GRID_PAN_MOUSE_BUTTON = 1; boolean DEFAULT_ADVANCED_TOOLTIPS_SHOWS_IOTA_NBT = false; boolean DEFAULT_STATIC_ACTIVE_SLATES = false; } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index e7b0c4bbe9..7ffc15f0c5 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -151,11 +151,11 @@ class GuiSpellcasting constructor( } if (HexConfig.client().clickingTogglesDrawing()) { return if (this.drawState is PatternDrawState.BetweenPatterns) - pButton != 1 && drawStart(mxOut, myOut) + drawStart(mxOut, myOut) && pButton != HexConfig.client().gridPanMouseButton() else drawEnd() } - return pButton != 1 && drawStart(mxOut, myOut) + return drawStart(mxOut, myOut) && pButton != HexConfig.client().gridPanMouseButton() } private fun drawStart(mxOut: Double, myOut: Double): Boolean { @@ -196,7 +196,7 @@ class GuiSpellcasting constructor( } if (HexConfig.client().clickingTogglesDrawing()) return false - if (pButton == 1) { + if (pButton == HexConfig.client().gridPanMouseButton() && this.drawState is PatternDrawState.BetweenPatterns) { return panGrid(pDragX, pDragY) } return drawMove(mxOut, myOut) diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 2a7384dbad..51e6daf517 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -364,6 +364,10 @@ "": "Clicking Toggles Drawing", "@Tooltip": "Whether you click to start and stop drawing instead of clicking and dragging to draw", }, + gridPanMouseButton: { + "": "Grid Pan Mouse Button", + "@Tooltip": "Which mouse button is used to pan the hex grid (once that ability is unlocked)", + }, advancedTooltipsShowsIotaNBT: { "": "Advanced Tooltips Shows Iota NBT", "@Tooltip": "Whether enabling advanced tooltips (F3+H) should display the full NBT of iotas stored in items like foci and spellbooks", diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java index 09dd3727e7..aaf82542ff 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java @@ -140,6 +140,8 @@ public static final class Client implements HexConfig.ClientConfigAccess, Config @ConfigEntry.Gui.Tooltip private boolean clickingTogglesDrawing = DEFAULT_CLICKING_TOGGLES_DRAWING; @ConfigEntry.Gui.Tooltip + private int gridPanMouseButton = DEFAULT_GRID_PAN_MOUSE_BUTTON; + @ConfigEntry.Gui.Tooltip private boolean advancedTooltipsShowsIotaNBT = DEFAULT_ADVANCED_TOOLTIPS_SHOWS_IOTA_NBT; @ConfigEntry.Gui.Tooltip private boolean staticActiveSlates = DEFAULT_STATIC_ACTIVE_SLATES; @@ -147,6 +149,7 @@ public static final class Client implements HexConfig.ClientConfigAccess, Config @Override public void validatePostLoad() throws ValidationException { this.gridSnapThreshold = Mth.clamp(this.gridSnapThreshold, 0.5, 1.0); + this.gridPanMouseButton = Math.max(this.gridPanMouseButton, 1); } @Override @@ -179,6 +182,9 @@ public boolean clickingTogglesDrawing() { return clickingTogglesDrawing; } + @Override + public int gridPanMouseButton() { return gridPanMouseButton; } + @Override public boolean advancedTooltipsShowsIotaNBT() { return advancedTooltipsShowsIotaNBT; diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java index a9a48d4201..c582804ecb 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java @@ -86,6 +86,7 @@ public static class Client implements HexConfig.ClientConfigAccess { private static ModConfigSpec.BooleanValue invertAbacusScrollDirection; private static ModConfigSpec.DoubleValue gridSnapThreshold; private static ModConfigSpec.BooleanValue clickingTogglesDrawing; + private static ModConfigSpec.IntValue gridPanMouseButton; private static ModConfigSpec.BooleanValue disableInworldScrolling; private static ModConfigSpec.BooleanValue advancedTooltipsShowsIotaNBT; private static ModConfigSpec.BooleanValue staticActiveSlates; @@ -111,6 +112,9 @@ public Client(ModConfigSpec.Builder builder) { clickingTogglesDrawing = builder.comment( "Whether you click to start and stop drawing instead of clicking and dragging") .define("clickingTogglesDrawing", DEFAULT_CLICKING_TOGGLES_DRAWING); + gridPanMouseButton = builder.comment( + "Which mouse button is used to pan the hex grid (once that ability is unlocked)") + .defineInRange("gridPanMouseButton", DEFAULT_GRID_PAN_MOUSE_BUTTON, 1, Integer.MAX_VALUE); advancedTooltipsShowsIotaNBT = builder.comment( "Whether enabling advanced tooltips (F3+H) should display the full NBT of iotas stored in items " + "like foci and spellbooks") @@ -150,6 +154,9 @@ public boolean clickingTogglesDrawing() { return clickingTogglesDrawing.get(); } + @Override + public int gridPanMouseButton() { return gridPanMouseButton.get(); } + @Override public boolean advancedTooltipsShowsIotaNBT() { return advancedTooltipsShowsIotaNBT.get(); From a649c371bc8c5352b177a3c323e1989dc8906167 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 26 Aug 2026 23:00:13 -0400 Subject: [PATCH 18/45] Fix various edge cases --- .../at/petrak/hexcasting/client/gui/GuiSpellcasting.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index 7ffc15f0c5..e724b0abfd 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -149,13 +149,15 @@ class GuiSpellcasting constructor( if (super.mouseClicked(mxOut, myOut, pButton)) { return true } + if (pButton == HexConfig.client().gridPanMouseButton()) + return false if (HexConfig.client().clickingTogglesDrawing()) { return if (this.drawState is PatternDrawState.BetweenPatterns) - drawStart(mxOut, myOut) && pButton != HexConfig.client().gridPanMouseButton() + drawStart(mxOut, myOut) else drawEnd() } - return drawStart(mxOut, myOut) && pButton != HexConfig.client().gridPanMouseButton() + return drawStart(mxOut, myOut) } private fun drawStart(mxOut: Double, myOut: Double): Boolean { @@ -205,7 +207,6 @@ class GuiSpellcasting constructor( private fun panGrid(pDragX: Double, pDragY: Double): Boolean { val shift = Vec2(pDragX.toFloat(), pDragY.toFloat()) this.panOffset = this.panOffset.add(shift) - this.drawState = PatternDrawState.BetweenPatterns return false; } @@ -288,6 +289,8 @@ class GuiSpellcasting constructor( } if (HexConfig.client().clickingTogglesDrawing()) return false + if (pButton == HexConfig.client().gridPanMouseButton()) + return false return drawEnd() } From 06cb581c0125d5afbc3c32702310f21af1d4a35c Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 28 Aug 2026 02:05:24 -0400 Subject: [PATCH 19/45] Scale grid blur based on pan distance --- .../hexcasting/client/gui/GuiSpellcasting.kt | 7 +++++ .../mixin/client/MixinGameRenderer.java | 28 +++++++++++++++++++ Common/src/main/resources/hexplat.mixins.json | 3 +- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinGameRenderer.java diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index e724b0abfd..6b3e760ca7 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -65,6 +65,10 @@ class GuiSpellcasting constructor( this.calculateIotaDisplays() } + fun getPanDistance(): Float { + return panOffset.length() + } + fun recvServerUpdate(info: ExecutionClientView, index: Int) { if (info.isStackClear) { this.minecraft?.setScreen(null) @@ -373,6 +377,9 @@ class GuiSpellcasting constructor( super.onClose() } + override fun renderBackground(guiGraphics: GuiGraphics, i: Int, j: Int, f: Float) { + this.renderBlurredBackground(f) + } override fun render(graphics: GuiGraphics, pMouseX: Int, pMouseY: Int, pPartialTick: Float) { super.render(graphics, pMouseX, pMouseY, pPartialTick) diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinGameRenderer.java b/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinGameRenderer.java new file mode 100644 index 0000000000..14ea119a6f --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinGameRenderer.java @@ -0,0 +1,28 @@ +package at.petrak.hexcasting.mixin.client; + +import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.client.gui.GuiSpellcasting; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.PostChain; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(GameRenderer.class) +public abstract class MixinGameRenderer { + @WrapOperation( + method = "processBlurEffect", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/PostChain;setUniform(Ljava/lang/String;F)V") + ) + private void scaleBlurWhenPanningGrid(PostChain instance, String string, float f, Operation original) { + GameRenderer renderer = (GameRenderer)(Object)this; + Screen screen = renderer.getMinecraft().screen; + if (screen instanceof GuiSpellcasting grid) { + original.call(instance, string, grid.getPanDistance() / 10); + } else { + original.call(instance, string, f); + } + } +} diff --git a/Common/src/main/resources/hexplat.mixins.json b/Common/src/main/resources/hexplat.mixins.json index 9c6121aa10..a6165f7995 100644 --- a/Common/src/main/resources/hexplat.mixins.json +++ b/Common/src/main/resources/hexplat.mixins.json @@ -26,6 +26,7 @@ "accessor.client.AccessorRenderStateShard", "accessor.client.AccessorRenderType", "client.MixinClientLevel", - "client.MixinPlayerRenderer" + "client.MixinPlayerRenderer", + "client.MixinGameRenderer" ] } From f0910dd11934b956f6f685d9624a9067295b75b2 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sat, 29 Aug 2026 02:22:01 -0400 Subject: [PATCH 20/45] Implement crystallized status effect --- .../client/particles/ConjureParticle.java | 19 +++++++++++++++++++ .../hexcasting/common/lib/HexMobEffects.java | 3 +++ .../hexcasting/common/lib/HexParticles.java | 5 ++++- .../hexcasting/common/misc/HexMobEffect.java | 5 +++++ .../particles/ConjureParticleOptions.java | 17 ++++++++++++++--- .../hexcasting/particles/status_particle.json | 5 +++++ 6 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 Common/src/main/resources/assets/hexcasting/particles/status_particle.json diff --git a/Common/src/main/java/at/petrak/hexcasting/client/particles/ConjureParticle.java b/Common/src/main/java/at/petrak/hexcasting/client/particles/ConjureParticle.java index 9f0ae031a3..cea627e759 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/particles/ConjureParticle.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/particles/ConjureParticle.java @@ -88,6 +88,25 @@ public Particle createParticle(ConjureParticleOptions type, ClientLevel level, } } + // the code in LivingEntity that creates status effect particles hardcodes their velocity to (1,1,1) for some reason + // all the vanilla particles *used* for status effects have custom providers which completely ignore that velocity + // so we need to do that too, otherwise the particles just shoot off in a diagonal line + public static class StatusEffectProvider implements ParticleProvider { + private final SpriteSet sprite; + + public StatusEffectProvider(SpriteSet pSprites) { + this.sprite = pSprites; + } + + @Nullable + @Override + public Particle createParticle(ConjureParticleOptions type, ClientLevel level, + double pX, double pY, double pZ, + double pXSpeed, double pYSpeed, double pZSpeed) { + return new ConjureParticle(level, pX, pY, pZ, 0, 0, 0, this.sprite, type.color()); + } + } + // https://github.com/VazkiiMods/Botania/blob/db85d778ab23f44c11181209319066d1f04a9e3d/Xplat/src/main/java/vazkii/botania/client/fx/FXWisp.java private record ConjureRenderType() implements ParticleRenderType { @Override diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java index 9f03197eaf..7593868ce9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java @@ -2,6 +2,7 @@ import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.common.misc.HexMobEffect; +import at.petrak.hexcasting.common.particles.ConjureParticleOptions; import at.petrak.hexcasting.xplat.IXplatAbstractions; import at.petrak.hexcasting.xplat.IXplatRegister; import net.minecraft.core.Holder; @@ -25,4 +26,6 @@ public static void register() { public static final Holder SHRINK_GRID = REGISTER.registerHolder("shrink_grid", () -> new HexMobEffect(MobEffectCategory.HARMFUL, 0xc0e660).addAttributeModifier(HexAttributes.GRID_ZOOM, HexAPI.modLoc("shrink_grid"), -0.2, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + public static final Holder CRYSTALLIZED = REGISTER.registerHolder("crystallize", + () -> new HexMobEffect(MobEffectCategory.HARMFUL, 0x8932b8, new ConjureParticleOptions(0x8932b8, true))); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexParticles.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexParticles.java index d5428d8b91..989eea3297 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexParticles.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexParticles.java @@ -21,7 +21,9 @@ public static void register() { } public static final Supplier CONJURE_PARTICLE = REGISTER.register( - "conjure_particle", () -> new ConjureParticleOptions.Type(false)); + "conjure_particle", () -> new ConjureParticleOptions.Type(false, false)); + public static final Supplier STATUS_PARTICLE = REGISTER.register( + "status_particle", () -> new ConjureParticleOptions.Type(false, true)); public static class FactoryHandler { public interface Consumer { @@ -31,6 +33,7 @@ void register(ParticleType type, public static void registerFactories(Consumer consumer) { consumer.register(CONJURE_PARTICLE.get(), ConjureParticle.Provider::new); + consumer.register(STATUS_PARTICLE.get(), ConjureParticle.StatusEffectProvider::new); } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/misc/HexMobEffect.java b/Common/src/main/java/at/petrak/hexcasting/common/misc/HexMobEffect.java index 4af9029f0b..0c9e7c54d6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/misc/HexMobEffect.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/misc/HexMobEffect.java @@ -1,5 +1,6 @@ package at.petrak.hexcasting.common.misc; +import net.minecraft.core.particles.ParticleOptions; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; @@ -10,4 +11,8 @@ public class HexMobEffect extends MobEffect { public HexMobEffect(MobEffectCategory category, int color) { super(category, color); } + + public HexMobEffect(MobEffectCategory category, int color, ParticleOptions particleOptions) { + super(category, color, particleOptions); + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/particles/ConjureParticleOptions.java b/Common/src/main/java/at/petrak/hexcasting/common/particles/ConjureParticleOptions.java index 869e0f5ab3..6990e8b743 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/particles/ConjureParticleOptions.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/particles/ConjureParticleOptions.java @@ -10,27 +10,38 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; -public record ConjureParticleOptions(int color) implements ParticleOptions { +public record ConjureParticleOptions(int color, boolean isStatus) implements ParticleOptions { @Override public ParticleType getType() { + if (isStatus) return HexParticles.STATUS_PARTICLE.get(); return HexParticles.CONJURE_PARTICLE.get(); } + public ConjureParticleOptions(int color) { + this(color, false); + } + public static class Type extends ParticleType { - public Type(boolean pOverrideLimiter) { + public boolean isStatus; + + public Type(boolean pOverrideLimiter, boolean isStatus) { super(pOverrideLimiter); + this.isStatus = isStatus; } public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( Codec.INT.fieldOf("color") - .forGetter((ConjureParticleOptions o) -> o.color) + .forGetter((ConjureParticleOptions o) -> o.color), + Codec.BOOL.fieldOf("status") + .forGetter((ConjureParticleOptions o) -> o.isStatus) ) .apply(instance, ConjureParticleOptions::new) ); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.VAR_INT, ConjureParticleOptions::color, + ByteBufCodecs.BOOL, ConjureParticleOptions::isStatus, ConjureParticleOptions::new ); diff --git a/Common/src/main/resources/assets/hexcasting/particles/status_particle.json b/Common/src/main/resources/assets/hexcasting/particles/status_particle.json new file mode 100644 index 0000000000..ec744902a2 --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/particles/status_particle.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "hexcasting:cloud" + ] +} \ No newline at end of file From 54efc9df865056530e02be25c85585706ba21a72 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sat, 29 Aug 2026 02:22:38 -0400 Subject: [PATCH 21/45] Custom flay behavior to apply crystallized --- .../actions/spells/great/OpBrainsweep.kt | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt index e4ff09fdc2..0e74d615b4 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt @@ -8,11 +8,15 @@ import at.petrak.hexcasting.api.casting.eval.CastingEnvironment import at.petrak.hexcasting.api.casting.getMob import at.petrak.hexcasting.api.casting.getVec3 import at.petrak.hexcasting.api.casting.iota.Iota +import at.petrak.hexcasting.api.casting.mishaps.Mishap import at.petrak.hexcasting.api.casting.mishaps.MishapAlreadyBrainswept import at.petrak.hexcasting.api.casting.mishaps.MishapBadBrainsweep import at.petrak.hexcasting.api.casting.mishaps.MishapBadLocation +import at.petrak.hexcasting.api.misc.MediaConstants import at.petrak.hexcasting.api.mod.HexConfig import at.petrak.hexcasting.api.mod.HexTags +import at.petrak.hexcasting.common.lib.HexDamageTypes +import at.petrak.hexcasting.common.lib.HexMobEffects import at.petrak.hexcasting.common.recipe.BrainsweepRecipe import at.petrak.hexcasting.common.recipe.HexRecipeStuffRegistry import at.petrak.hexcasting.ktxt.tellWitnessesThatIWasMurdered @@ -21,8 +25,11 @@ import at.petrak.hexcasting.xplat.IXplatAbstractions import net.minecraft.core.BlockPos import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource +import net.minecraft.world.effect.MobEffectInstance import net.minecraft.world.entity.Mob import net.minecraft.world.entity.npc.Villager +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.phys.Vec3 @@ -52,6 +59,15 @@ object OpBrainsweep : SpellAction { if (IXplatAbstractions.INSTANCE.isBrainswept(sacrifice)) throw MishapAlreadyBrainswept(sacrifice) + // special behavior for crystallization + if (vecPos == sacrifice.eyePosition && sacrifice.hasEffect(HexMobEffects.ENLARGE_GRID)) { + return SpellAction.Result( + AltSpell(sacrifice, pos), + MediaConstants.CRYSTAL_UNIT * 10, + listOf(ParticleSpray.burst(Vec3.atCenterOf(pos), 1.0)) + ) + } + val state = env.world.getBlockState(pos) val recman = env.world.recipeManager @@ -89,4 +105,26 @@ object OpBrainsweep : SpellAction { env.world.playSound(null, sacrifice, SoundEvents.PLAYER_LEVELUP, SoundSource.AMBIENT, 0.5f, 0.8f) } } + + private data class AltSpell(val sacrifice: Mob, val pos: BlockPos) : RenderedSpell { + override fun cast(env: CastingEnvironment) { + val amount = sacrifice.health * 0.1F + Mishap.trulyHurt(sacrifice, sacrifice.damageSources().source(HexDamageTypes.OVERCAST), amount) + + val blockStateId = Block.getId(Blocks.AMETHYST_BLOCK.defaultBlockState()) + env.world.levelEvent(2001, pos, blockStateId) + env.world.levelEvent(2001, pos.below(), blockStateId) + + sacrifice.removeEffect(HexMobEffects.ENLARGE_GRID) + sacrifice.addEffect(MobEffectInstance(HexMobEffects.CRYSTALLIZED, -1)) + + HexAPI.instance().brainsweep(sacrifice) + + if (sacrifice is Villager && HexConfig.server().doVillagersTakeOffenseAtMindMurder()) { + env.castingEntity?.let { sacrifice.tellWitnessesThatIWasMurdered(it) } + } + + env.world.playSound(null, sacrifice, SoundEvents.ZOMBIE_VILLAGER_CURE, SoundSource.AMBIENT, 0.8f, 1f) + } + } } From c17fec43b04743ef7644ce26cd9fde234b71cfc2 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sat, 29 Aug 2026 22:08:20 -0400 Subject: [PATCH 22/45] Make mobs drop fiber+dust when crystallized --- .../hexcasting/mixin/MixinLivingEntity.java | 29 ++++++++++++++----- Common/src/main/resources/hexplat.mixins.json | 1 + 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java index c3dbc47b81..2ca03b3233 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java @@ -1,24 +1,39 @@ package at.petrak.hexcasting.mixin; +import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.common.lib.HexItems; +import at.petrak.hexcasting.common.lib.HexMobEffects; +import at.petrak.hexcasting.common.misc.HexMobEffect; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.Brain; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -// Nuke the brain at the source + @Mixin(LivingEntity.class) public abstract class MixinLivingEntity { - @Inject(method = "getBrain", at = @At("RETURN")) - private void removeBrain(CallbackInfoReturnable> cir) { + @Inject(method = "dropAllDeathLoot", require = 1, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;dropFromLootTable(Lnet/minecraft/world/damagesource/DamageSource;Z)V")) + private void dropCrystallizedLoot(CallbackInfo ci) { var self = (LivingEntity) (Object) this; - if (self instanceof Mob mob && IXplatAbstractions.INSTANCE.isBrainswept(mob)) { - var brain = cir.getReturnValue(); - brain.removeAllBehaviors(); - cir.setReturnValue(brain); + var rand = self.getRandom(); + if (self.hasEffect(HexMobEffects.CRYSTALLIZED)) { + int fibers = rand.nextIntBetweenInclusive(1,3); + int dust = rand.nextIntBetweenInclusive(4,7); + int extra = 0; + if (self instanceof Villager vill) { + int scaledLvl = vill.getVillagerData().getLevel() - 2; + if (rand.nextIntBetweenInclusive(0, 1) <= scaledLvl) extra++; + if (rand.nextIntBetweenInclusive(2, 3) <= scaledLvl) extra++; + } + self.spawnAtLocation(new ItemStack(HexItems.NEURAL_FIBER.get(), fibers + extra)); + self.spawnAtLocation(new ItemStack(HexItems.AMETHYST_DUST.get(), dust + extra)); } } } diff --git a/Common/src/main/resources/hexplat.mixins.json b/Common/src/main/resources/hexplat.mixins.json index 9c6121aa10..4916e585bd 100644 --- a/Common/src/main/resources/hexplat.mixins.json +++ b/Common/src/main/resources/hexplat.mixins.json @@ -5,6 +5,7 @@ "refmap": "hexcasting.mixins.refmap.json", "package": "at.petrak.hexcasting.mixin", "mixins": [ + "MixinLivingEntity", "MixinAbstractVillager", "MixinMob", "MixinRaider", From c899081d73de822b317fd3d6289ab54caae33824 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sat, 29 Aug 2026 23:48:43 -0400 Subject: [PATCH 23/45] Add lang and neural staff --- .../hexcasting/models/item/staff/neural.json | 6 ++ .../hexcasting/models/staff/neural.json | 16 +++++ .../recipes/tools/staff/neural.json | 32 ++++++++++ .../data/hexcasting/recipe/staff/neural.json | 24 +++++++ .../data/hexcasting/tags/item/staves.json | 3 +- .../client/RegisterClientStuff.java | 1 + .../hexcasting/common/lib/HexItems.java | 1 + .../datagen/recipe/HexplatRecipes.java | 9 +++ .../datagen/tag/HexItemTagProvider.java | 2 +- .../hexcasting/lang/en_us.flatten.json5 | 2 + .../entries/greatwork/fanciful_staves.json | 4 ++ .../hexcasting/textures/item/neural_fiber.png | Bin 7837 -> 5579 bytes .../textures/item/neural_fiber.png.mcmeta | 59 ------------------ .../hexcasting/textures/item/staff/neural.png | Bin 0 -> 863 bytes .../recipes/tools/staff/neural.json | 32 ++++++++++ .../data/hexcasting/recipe/staff/neural.json | 24 +++++++ .../data/hexcasting/tags/item/staves.json | 3 +- .../hexcasting/models/item/staff/neural.json | 6 ++ .../hexcasting/models/staff/neural.json | 16 +++++ .../recipes/tools/staff/neural.json | 32 ++++++++++ .../data/hexcasting/recipe/staff/neural.json | 24 +++++++ .../data/hexcasting/tags/item/staves.json | 3 +- .../forge/datagen/xplat/HexItemModels.java | 1 + 23 files changed, 237 insertions(+), 63 deletions(-) create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/staff/neural.json create mode 100644 Common/src/generated/resources/assets/hexcasting/models/staff/neural.json create mode 100644 Common/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json create mode 100644 Common/src/generated/resources/data/hexcasting/recipe/staff/neural.json delete mode 100644 Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png.mcmeta create mode 100644 Common/src/main/resources/assets/hexcasting/textures/item/staff/neural.png create mode 100644 Fabric/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/recipe/staff/neural.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/staff/neural.json create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/staff/neural.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/recipe/staff/neural.json diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/staff/neural.json b/Common/src/generated/resources/assets/hexcasting/models/item/staff/neural.json new file mode 100644 index 0000000000..9d11027240 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/staff/neural.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_rod", + "textures": { + "layer0": "hexcasting:item/staff/neural" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/assets/hexcasting/models/staff/neural.json b/Common/src/generated/resources/assets/hexcasting/models/staff/neural.json new file mode 100644 index 0000000000..4890c91a60 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/staff/neural.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "model": "hexcasting:item/neural_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/cherry_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ] +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json b/Common/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json new file mode 100644 index 0000000000..c3502060e1 --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:charged_amethyst" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:staff/neural" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:staff/neural" + ] + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/recipe/staff/neural.json b/Common/src/generated/resources/data/hexcasting/recipe/staff/neural.json new file mode 100644 index 0000000000..6397db86d8 --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/recipe/staff/neural.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "A": { + "item": "hexcasting:charged_amethyst" + }, + "B": { + "item": "minecraft:bone" + }, + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + " FA", + " BF", + "B " + ], + "result": { + "count": 1, + "id": "hexcasting:staff/neural" + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/tags/item/staves.json b/Common/src/generated/resources/data/hexcasting/tags/item/staves.json index 29f4595c62..c3b2e7c4f8 100644 --- a/Common/src/generated/resources/data/hexcasting/tags/item/staves.json +++ b/Common/src/generated/resources/data/hexcasting/tags/item/staves.json @@ -13,6 +13,7 @@ "hexcasting:staff/cherry", "hexcasting:staff/bamboo", "hexcasting:staff/quenched", - "hexcasting:staff/mindsplice" + "hexcasting:staff/mindsplice", + "hexcasting:staff/neural" ] } \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java index 70b12989bc..0bc3caeaef 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java @@ -114,6 +114,7 @@ public static void init() { registerWandOverrides(HexItems.STAFF_EDIFIED.get()); // purposely skip quenched registerWandOverrides(HexItems.STAFF_MINDSPLICE.get()); + registerWandOverrides(HexItems.STAFF_NEURAL.get()); registerGaslight4(HexItems.STAFF_QUENCHED.get()); registerGaslight4(HexBlocks.QUENCHED_ALLAY.get().asItem()); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index 0d8d234abd..2819e97889 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -72,6 +72,7 @@ public static void registerItemsForCreativeTab(ResourceKey tabK public static final Supplier STAFF_QUENCHED = make("staff/quenched", () -> new ItemStaff(unstackable().rarity(Rarity.UNCOMMON))); // mindsplice staffaratus public static final Supplier STAFF_MINDSPLICE = make("staff/mindsplice", () -> new ItemStaff(unstackable().rarity(Rarity.UNCOMMON))); + public static final Supplier STAFF_NEURAL = make("staff/neural", () -> new ItemStaff(unstackable().rarity(Rarity.UNCOMMON))); public static final Supplier SCRYING_LENS = make("lens", () -> new ItemLens( IXplatAbstractions.INSTANCE.addEquipSlotFabric(EquipmentSlot.HEAD) diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java index 3162c2ecab..edf414dc89 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java @@ -102,6 +102,15 @@ public void buildRecipes(RecipeOutput recipes) { staffRecipe(recipes, HexItems.STAFF_EDIFIED.get(), HexBlocks.EDIFIED_PLANKS.get().asItem()); staffRecipe(recipes, HexItems.STAFF_QUENCHED.get(), HexItems.QUENCHED_SHARD.get()); staffRecipe(recipes, HexItems.STAFF_MINDSPLICE.get(), Ingredient.of(HexTags.Items.MINDFLAYED_CIRCLE_COMPONENTS)); + ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, HexItems.STAFF_NEURAL.get()) + .define('F', HexItems.NEURAL_FIBER.get()) + .define('B', Items.BONE) + .define('A', HexItems.CHARGED_AMETHYST.get()) + .pattern(" FA") + .pattern(" BF") + .pattern("B ") + .unlockedBy("has_item", hasItem(HexItems.CHARGED_AMETHYST.get())) + .save(recipes); ShapelessRecipeBuilder.shapeless(RecipeCategory.TOOLS, HexItems.THOUGHT_KNOT.get()) .requires(HexItems.AMETHYST_DUST.get()) diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexItemTagProvider.java b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexItemTagProvider.java index 2f97a1209e..48f06f52d4 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexItemTagProvider.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexItemTagProvider.java @@ -40,7 +40,7 @@ protected void addTags(HolderLookup.Provider provider) { HexItems.STAFF_JUNGLE.get(), HexItems.STAFF_ACACIA.get(), HexItems.STAFF_DARK_OAK.get(), HexItems.STAFF_CRIMSON.get(), HexItems.STAFF_WARPED.get(), HexItems.STAFF_MANGROVE.get(), HexItems.STAFF_CHERRY.get(),HexItems.STAFF_BAMBOO.get(), - HexItems.STAFF_QUENCHED.get(), HexItems.STAFF_MINDSPLICE.get()); + HexItems.STAFF_QUENCHED.get(), HexItems.STAFF_MINDSPLICE.get(), HexItems.STAFF_NEURAL.get()); add(tag(HexTags.Items.PHIAL_BASE), Items.GLASS_BOTTLE); diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 396612931e..87370ce714 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -18,6 +18,7 @@ edified: "Edified Staff", quenched: "Quenched Shard Staff", mindsplice: "Mindsplice Staff", + neural: "Neural Staff", }, amethyst_dust: "Amethyst Dust", @@ -62,6 +63,7 @@ abacus: "Abacus", jeweler_hammer: "Jeweler's Hammer", sub_sandwich: "Submarine Sandwich", + neural_fiber: "Neural Fiber", robes: { hood: "Grand Caster Hood", diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/fanciful_staves.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/fanciful_staves.json index f62fbc0013..cb7e11ffc3 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/fanciful_staves.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/fanciful_staves.json @@ -14,6 +14,10 @@ "type": "patchouli:crafting", "recipe": "hexcasting:staff/quenched", "recipe2": "hexcasting:staff/mindsplice" + }, + { + "type": "patchouli:crafting", + "recipe": "hexcasting:staff/neural" } ] } diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png b/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png index 571e81dc25938b4e9a5a7eece4bf5c8132e7b60f..9494392dd6e7536776237fea6633193f1c49c139 100644 GIT binary patch delta 2068 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 diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png.mcmeta b/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png.mcmeta deleted file mode 100644 index ffea578b08..0000000000 --- a/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png.mcmeta +++ /dev/null @@ -1,59 +0,0 @@ -{ - "animation": { - "interpolate": false, - "frames": [ - { - "index": 0, - "time": 2 - }, - { - "index": 1, - "time": 2 - }, - { - "index": 2, - "time": 2 - }, - { - "index": 3, - "time": 2 - }, - { - "index": 4, - "time": 2 - }, - { - "index": 5, - "time": 2 - }, - { - "index": 6, - "time": 2 - }, - { - "index": 7, - "time": 2 - }, - { - "index": 8, - "time": 1 - }, - { - "index": 9, - "time": 1 - }, - { - "index": 10, - "time": 1 - }, - { - "index": 11, - "time": 2 - }, - { - "index": 12, - "time": 2 - } - ] - } -} diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/staff/neural.png b/Common/src/main/resources/assets/hexcasting/textures/item/staff/neural.png new file mode 100644 index 0000000000000000000000000000000000000000..b0544f35903b415a9dd40dec517788323071a7aa GIT binary patch literal 863 zcmV-l1EBngP)EX>4Tx04R}tk-tmBKpe$iQ^g_`2Rn$0WT;LSii$W&6^me@v=v%)FuC*>G-*gu zTpR`0f`dO6s}3&Cx;nTDg5VDj{{V4PbdeIjmlRsWcyQc@clRE5?*O4uVXD~`1ys#4 zQt_CW&8><(uLxii0)`Qln5ieyiy3&1uY36TdKckY-sk=teM;VBfKMczW4d7xZxGLH zS~}-_;t(rI3h_Ddgh3Z1e&o9B@*C%(!vfC?8JW~PafnzfcCg&RtYoOf)5Kv#)hJ)c zx~y>C;;dF`taVTR!eCxoNpqd%2;x{m0!fIFQ9~IOScuT7kzyi6`!NsykmFC1OD0zt zj2sK7LWSh`!T;cQw`O5#(oG7+fbJLD{ul##c7bNyw!e>UyLkfmpMfi_?XNa~*-z5z zZ7qBR^lt+f*KJMS11@)f!6#iZBuDbo6bc34{fxdT2MpW-y=!i7t$mz602%6P`35*R z1jdV$z3%buKxc3No@w>>1Guwt!`H%rGXMYp24YJ`L;$q_pa6|)6`tk*000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2kHnO11l`OQ`Y(b000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0003tNkl|&9t6ki;0Q@g- zx~7Zkw&mzJBk^cj1~P|j86MnyY-srVKKeQ_9!<-_#4G?ap|IDmT}t`8EgntF&z}d@ ptepB#Z~(x(s{j?wvsW7b9bZ)jpq)f7z1{!-002ovPDHLkV1iV`c~<}c literal 0 HcmV?d00001 diff --git a/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json new file mode 100644 index 0000000000..c3502060e1 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:charged_amethyst" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:staff/neural" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:staff/neural" + ] + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/recipe/staff/neural.json b/Fabric/src/generated/resources/data/hexcasting/recipe/staff/neural.json new file mode 100644 index 0000000000..6397db86d8 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/recipe/staff/neural.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "A": { + "item": "hexcasting:charged_amethyst" + }, + "B": { + "item": "minecraft:bone" + }, + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + " FA", + " BF", + "B " + ], + "result": { + "count": 1, + "id": "hexcasting:staff/neural" + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/tags/item/staves.json b/Fabric/src/generated/resources/data/hexcasting/tags/item/staves.json index 29f4595c62..c3b2e7c4f8 100644 --- a/Fabric/src/generated/resources/data/hexcasting/tags/item/staves.json +++ b/Fabric/src/generated/resources/data/hexcasting/tags/item/staves.json @@ -13,6 +13,7 @@ "hexcasting:staff/cherry", "hexcasting:staff/bamboo", "hexcasting:staff/quenched", - "hexcasting:staff/mindsplice" + "hexcasting:staff/mindsplice", + "hexcasting:staff/neural" ] } \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/staff/neural.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/staff/neural.json new file mode 100644 index 0000000000..9d11027240 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/staff/neural.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_rod", + "textures": { + "layer0": "hexcasting:item/staff/neural" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/staff/neural.json b/Neoforge/src/generated/resources/assets/hexcasting/models/staff/neural.json new file mode 100644 index 0000000000..4890c91a60 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/staff/neural.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "model": "hexcasting:item/neural_staff", + "predicate": { + "hexcasting:funny_level": 0.0 + } + }, + { + "model": "hexcasting:item/cherry_staff", + "predicate": { + "hexcasting:funny_level": 2.0 + } + } + ] +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json new file mode 100644 index 0000000000..c3502060e1 --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/tools/staff/neural.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:charged_amethyst" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:staff/neural" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:staff/neural" + ] + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/recipe/staff/neural.json b/Neoforge/src/generated/resources/data/hexcasting/recipe/staff/neural.json new file mode 100644 index 0000000000..6397db86d8 --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/recipe/staff/neural.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "A": { + "item": "hexcasting:charged_amethyst" + }, + "B": { + "item": "minecraft:bone" + }, + "F": { + "item": "hexcasting:neural_fiber" + } + }, + "pattern": [ + " FA", + " BF", + "B " + ], + "result": { + "count": 1, + "id": "hexcasting:staff/neural" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/tags/item/staves.json b/Neoforge/src/generated/resources/data/hexcasting/tags/item/staves.json index 29f4595c62..c3b2e7c4f8 100644 --- a/Neoforge/src/generated/resources/data/hexcasting/tags/item/staves.json +++ b/Neoforge/src/generated/resources/data/hexcasting/tags/item/staves.json @@ -13,6 +13,7 @@ "hexcasting:staff/cherry", "hexcasting:staff/bamboo", "hexcasting:staff/quenched", - "hexcasting:staff/mindsplice" + "hexcasting:staff/mindsplice", + "hexcasting:staff/neural" ] } \ No newline at end of file diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java index ebfc072a97..5347078ad9 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java @@ -104,6 +104,7 @@ protected void registerModels() { buildStaff(HexItems.STAFF_BAMBOO.get(), "bamboo"); buildStaff(HexItems.STAFF_EDIFIED.get(), "edified"); buildStaff(HexItems.STAFF_MINDSPLICE.get(), "mindsplice"); + buildStaff(HexItems.STAFF_NEURAL.get(), "neural"); // again, doesn't like paths with slashes in them, so we do it manually buildFourVariantGaslight("item/staff/quenched", "item/staff/quenched", (name, path) -> From 6665fe18c24738b727340de7c3211ae4bb3e5a6c Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sun, 30 Aug 2026 00:33:07 -0400 Subject: [PATCH 24/45] Lang and icon for crystallized effect, tweak fiber drop math --- .../hexcasting/common/lib/HexMobEffects.java | 2 +- .../hexcasting/mixin/MixinLivingEntity.java | 7 ++++--- .../assets/hexcasting/lang/en_us.flatten.json5 | 1 + .../textures/mob_effect/crystallized.png | Bin 0 -> 493 bytes 4 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 Common/src/main/resources/assets/hexcasting/textures/mob_effect/crystallized.png diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java index 7593868ce9..30fc8f0299 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java @@ -26,6 +26,6 @@ public static void register() { public static final Holder SHRINK_GRID = REGISTER.registerHolder("shrink_grid", () -> new HexMobEffect(MobEffectCategory.HARMFUL, 0xc0e660).addAttributeModifier(HexAttributes.GRID_ZOOM, HexAPI.modLoc("shrink_grid"), -0.2, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); - public static final Holder CRYSTALLIZED = REGISTER.registerHolder("crystallize", + public static final Holder CRYSTALLIZED = REGISTER.registerHolder("crystallized", () -> new HexMobEffect(MobEffectCategory.HARMFUL, 0x8932b8, new ConjureParticleOptions(0x8932b8, true))); } diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java index 2ca03b3233..4b85154bc5 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java @@ -28,9 +28,10 @@ private void dropCrystallizedLoot(CallbackInfo ci) { int dust = rand.nextIntBetweenInclusive(4,7); int extra = 0; if (self instanceof Villager vill) { - int scaledLvl = vill.getVillagerData().getLevel() - 2; - if (rand.nextIntBetweenInclusive(0, 1) <= scaledLvl) extra++; - if (rand.nextIntBetweenInclusive(2, 3) <= scaledLvl) extra++; + // lv2 = 50% +1 drop; lv3 = +1 drop; lv4 = +2 drops; lv5 = +3 drops + int lvl = vill.getVillagerData().getLevel(); + if (rand.nextIntBetweenInclusive(2, 3) <= lvl) extra++; + extra += Math.max(lvl-3, 0); } self.spawnAtLocation(new ItemStack(HexItems.NEURAL_FIBER.get(), fibers + extra)); self.spawnAtLocation(new ItemStack(HexItems.AMETHYST_DUST.get(), dust + extra)); diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 7eb8abf1fd..3e5992892a 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -230,6 +230,7 @@ "effect.hexcasting": { enlarge_grid: "Clarity", shrink_grid: "Clouding", + crystallized: "Crystallized" }, "item.minecraft.potion.effect": { diff --git a/Common/src/main/resources/assets/hexcasting/textures/mob_effect/crystallized.png b/Common/src/main/resources/assets/hexcasting/textures/mob_effect/crystallized.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e4f6d2bffd6532e21ae551c879dda8af1697ab GIT binary patch literal 493 zcmVPx$r%6OXR5*>TlQBpmK@^6+RY5FP*%aH1w=fVAuu?%GSR8~a><+<{;&qZrY|@;C zg*Gmx z09gK9P_GNyKQqRA1O{}lwKoQU@-6b;Z3qEbeL8RiIA?zyE+|!UmJlT7K*6#+jdWaXeEM~I6Uq)j@T@&#n zKMFg1UCJVCsWhkP<%~XnqL(wgz(wEsdDUchzY^KfVS7$mc2wUO^Nv$4o z{RbQ&qt1(&Y?RY$*67#4huGAbdVrB(i{RH8Bf}P@!veyVTwc|=ySpb5Pjb;5q;y!I z=;e%#EdY3di}skBNYiXJaD=4UYP`J#O%k>wHIaUiYZvzdH|h@0e?enDwHf`1_Ghd` j+KF8SdWm%-{x>`Vu)m}JTMXI400000NkvXXu0mjf9@5@j literal 0 HcmV?d00001 From 22de2f504ab1d2502b15ca715e67e740562a6871 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sun, 30 Aug 2026 00:57:02 -0400 Subject: [PATCH 25/45] Actually register the armor material (oops) --- .../casting/actions/spells/great/OpBrainsweep.kt | 3 ++- .../hexcasting/common/lib/HexArmorMaterials.java | 2 +- .../petrak/hexcasting/fabric/FabricHexInitializer.kt | 10 ++-------- .../petrak/hexcasting/forge/ForgeHexInitializer.java | 1 + 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt index 0e74d615b4..2d218aa048 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt @@ -27,6 +27,7 @@ import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundSource import net.minecraft.world.effect.MobEffectInstance import net.minecraft.world.entity.Mob +import net.minecraft.world.entity.npc.AbstractVillager import net.minecraft.world.entity.npc.Villager import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Blocks @@ -60,7 +61,7 @@ object OpBrainsweep : SpellAction { throw MishapAlreadyBrainswept(sacrifice) // special behavior for crystallization - if (vecPos == sacrifice.eyePosition && sacrifice.hasEffect(HexMobEffects.ENLARGE_GRID)) { + if (vecPos == sacrifice.eyePosition && sacrifice.hasEffect(HexMobEffects.ENLARGE_GRID) && sacrifice is AbstractVillager) { return SpellAction.Result( AltSpell(sacrifice, pos), MediaConstants.CRYSTAL_UNIT * 10, diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexArmorMaterials.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexArmorMaterials.java index f2cfd6b1f0..7222f83e9d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexArmorMaterials.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexArmorMaterials.java @@ -29,7 +29,7 @@ public static void register() { Map.of(), // no defense here since it's specified with the other attributes in ItemRobes ArmorMaterials.GOLD.value().enchantmentValue(), SoundEvents.ARMOR_EQUIP_LEATHER, - () -> Ingredient.EMPTY, // TODO: repair with whatever it's crafted with + () -> Ingredient.of(HexItems.NEURAL_FIBER.get()), List.of(new ArmorMaterial.Layer(HexAPI.modLoc("robes"))), 0, 0 // no toughness or knockback resistance )); diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexInitializer.kt b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexInitializer.kt index 878e371aeb..505cb68926 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexInitializer.kt +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexInitializer.kt @@ -5,11 +5,7 @@ import at.petrak.hexcasting.api.addldata.ADMediaHolder import at.petrak.hexcasting.api.advancements.HexAdvancementTriggers import at.petrak.hexcasting.api.casting.ActionRegistryEntry import at.petrak.hexcasting.api.casting.iota.DoubleIota -import at.petrak.hexcasting.api.item.HexHolderItem -import at.petrak.hexcasting.api.item.IotaHolderItem -import at.petrak.hexcasting.api.item.MediaHolderItem -import at.petrak.hexcasting.api.item.PigmentItem -import at.petrak.hexcasting.api.item.VariantItem +import at.petrak.hexcasting.api.item.* import at.petrak.hexcasting.api.misc.MediaConstants import at.petrak.hexcasting.api.mod.HexConfig import at.petrak.hexcasting.api.mod.HexStatistics @@ -23,7 +19,6 @@ import at.petrak.hexcasting.common.casting.actions.spells.great.OpAltiora import at.petrak.hexcasting.common.command.PatternResKeyArgument import at.petrak.hexcasting.common.entities.HexEntities import at.petrak.hexcasting.common.items.ItemJewelerHammer -import at.petrak.hexcasting.common.items.magic.ItemMediaBattery import at.petrak.hexcasting.common.items.storage.ItemScroll import at.petrak.hexcasting.common.lib.* import at.petrak.hexcasting.common.lib.hex.* @@ -32,8 +27,6 @@ import at.petrak.hexcasting.common.misc.BrainsweepingEvents import at.petrak.hexcasting.common.misc.PlayerPositionRecorder import at.petrak.hexcasting.common.misc.RegisterMisc import at.petrak.hexcasting.common.recipe.HexRecipeStuffRegistry -import at.petrak.hexcasting.common.lib.HexBrainsweepeeIngredients -import at.petrak.hexcasting.common.lib.HexStateIngredients import at.petrak.hexcasting.fabric.cc.HexCardinalComponents import at.petrak.hexcasting.fabric.cc.adimpl.* import at.petrak.hexcasting.fabric.event.VillagerConversionCallback @@ -215,6 +208,7 @@ object FabricHexInitializer : ModInitializer { HexRecipeStuffRegistry.register() HexParticles.register() + HexArmorMaterials.register() HexLootFunctions.register() 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 73c5f84471..d07bdeaef5 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java @@ -131,6 +131,7 @@ private static void initRegistry() { HexMobEffects.register(); HexPotions.register(); HexParticles.register(); + HexArmorMaterials.register(); HexAdvancementTriggers.register(); From b0932e866978439ce097c397149cce9c94b8cc4e Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sun, 30 Aug 2026 01:17:29 -0400 Subject: [PATCH 26/45] Give fiber and robes uncommon rarity --- .../main/java/at/petrak/hexcasting/common/lib/HexItems.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index 2819e97889..0071da917b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -103,28 +103,32 @@ public static void registerItemsForCreativeTab(ResourceKey tabK ) ); - public static final Supplier NEURAL_FIBER = make("neural_fiber", () -> new Item(props())); + public static final Supplier NEURAL_FIBER = make("neural_fiber", () -> new Item(props().rarity(Rarity.UNCOMMON))); public static final Supplier ROBES_HOOD = make("robes/hood", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable() + .rarity(Rarity.UNCOMMON) .durability(270) .attributes(ItemRobes.HOOD_MODIFIERS) ) ); public static final Supplier ROBES_TUNIC = make("robes/tunic", () -> new ItemRobes(ArmorItem.Type.CHESTPLATE, unstackable() + .rarity(Rarity.UNCOMMON) .durability(400) .attributes(ItemRobes.TUNIC_MODIFIERS) ) ); public static final Supplier ROBES_LEGS = make("robes/legs", () -> new ItemRobes(ArmorItem.Type.LEGGINGS, unstackable() + .rarity(Rarity.UNCOMMON) .durability(350) .attributes(ItemRobes.LEGS_MODIFIERS) ) ); public static final Supplier ROBES_BOOTS = make("robes/boots", () -> new ItemRobes(ArmorItem.Type.BOOTS, unstackable() + .rarity(Rarity.UNCOMMON) .durability(315) .attributes(ItemRobes.BOOTS_MODIFIERS) ) From 9745fe35303064267d06ed957d79040b02684252 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Mon, 31 Aug 2026 01:58:43 -0400 Subject: [PATCH 27/45] Tint background purple while panned --- .../hexcasting/client/gui/GuiSpellcasting.kt | 10 ++++++++-- .../mixin/client/MixinGameRenderer.java | 2 +- .../hexcasting/textures/gui/casting_bg.png | Bin 0 -> 4767 bytes 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 Common/src/main/resources/assets/hexcasting/textures/gui/casting_bg.png diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index 6b3e760ca7..3e37d4d9a6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -1,5 +1,6 @@ package at.petrak.hexcasting.client.gui +import at.petrak.hexcasting.api.HexAPI import at.petrak.hexcasting.api.casting.eval.ExecutionClientView import at.petrak.hexcasting.api.casting.eval.ResolvedPattern import at.petrak.hexcasting.api.casting.eval.ResolvedPatternType @@ -30,6 +31,7 @@ import net.minecraft.client.gui.screens.Screen import net.minecraft.client.renderer.GameRenderer import net.minecraft.client.resources.sounds.SimpleSoundInstance import net.minecraft.client.resources.sounds.SoundInstance +import net.minecraft.resources.ResourceLocation import net.minecraft.sounds.SoundSource import net.minecraft.util.FormattedCharSequence import net.minecraft.util.Mth @@ -52,7 +54,8 @@ class GuiSpellcasting constructor( private var drawState: PatternDrawState = PatternDrawState.BetweenPatterns private val usedSpots: MutableSet = HashSet() - private var panOffset: Vec2 = Vec2.ZERO + private var panOffset = Vec2.ZERO + private val bgLocation = HexAPI.modLoc("textures/gui/casting_bg.png") private var ambianceSoundInstance: GridSoundInstance? = null @@ -66,7 +69,7 @@ class GuiSpellcasting constructor( } fun getPanDistance(): Float { - return panOffset.length() + return panOffset.length() / 20 } fun recvServerUpdate(info: ExecutionClientView, index: Int) { @@ -378,6 +381,9 @@ class GuiSpellcasting constructor( } override fun renderBackground(guiGraphics: GuiGraphics, i: Int, j: Int, f: Float) { + guiGraphics.setColor(1f,1f,1f, (getPanDistance() / 15).coerceAtMost(1f)) + renderMenuBackgroundTexture(guiGraphics, bgLocation, 0, 0, 0f, 0f, this.width, this.height) + guiGraphics.setColor(1f, 1f, 1f, 1f) this.renderBlurredBackground(f) } diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinGameRenderer.java b/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinGameRenderer.java index 14ea119a6f..9f1e1e2c34 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinGameRenderer.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/client/MixinGameRenderer.java @@ -20,7 +20,7 @@ private void scaleBlurWhenPanningGrid(PostChain instance, String string, float f GameRenderer renderer = (GameRenderer)(Object)this; Screen screen = renderer.getMinecraft().screen; if (screen instanceof GuiSpellcasting grid) { - original.call(instance, string, grid.getPanDistance() / 10); + original.call(instance, string, Math.min(grid.getPanDistance(), 12f)); } else { original.call(instance, string, f); } diff --git a/Common/src/main/resources/assets/hexcasting/textures/gui/casting_bg.png b/Common/src/main/resources/assets/hexcasting/textures/gui/casting_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7f94529482adf1f1b7f3f3cec70f72ca3191cf16 GIT binary patch literal 4767 zcmeHKc~BGS5+7kXjIaWVfP%z;Crpw_0wg0rxrD$55Tb%7lbHz&ki%pkfQz!a2!aQ? zt`}Z-tf(jtul44kh*zmBqOOaJimrI93O>9Z3hzrmz;853ulwuD zw6sd>T0y0dOgckDGRbsG z0YT}%Jzq2Hz=JVXId|jEdG?c7F8QMw-=nZN^}#RxyzYmhwe=qbQxLL{{MP2*+3wC2 z?VIkq&XoD)?s#V4fcr-LP9 z-EO?!P=}AJ52#o?;%3e8t!ua6pBnlr+w5HVp7CqWOjH)fKk8l|= z%Fkq&)uXEiHnFR7+J0I)wfN$wVDk$HT9=9Y-z~2hexz#no5bZSEs8w`Rb_u{8u_7h zk?7V`X8!yp#$2R~a9bLzy7AbYB`DkRG@^O?$=L;av$yW|EQ6y9e@zP$?CgjzxxLlQ z#s2v*i;LAGvj<~|!CZGHl;j?^ej75(*6s-;vqi%j%}sV(GWFNmU5tNla&h(ONhdr! z&br(?kD1$zi?d3}m;EzLQa;~PbTewoFFW?cNoN(@^c0a-L^EdR%Du`5e*+h-pHcp_ z@#2kxMJF7}atiL%)U7J8=j^P@M?6-0oZkO9D*3@E*vlIBNp1++>vDP5uKi;Dvxe}p zMY&cRUEKx_^Se}H;Sw7bg0^1Bb(z0Y<{cClv$xPd~qet$?aW*yhy-WSd#V0&P2{>%p-(E= z%@TTLn}@2hc92hdj20_y8*%LAorcN7o+Xs1>g__aSS{eIL>0U2!k3-&z1c{c@la(o{a6eZEq&K!i#QMx9-Zmd~um& z{9u#Cwm+`hJ-W8QDSdg_ym#+19qz|9G_^Ztg*6b_k?x!Er`|^t4_NXR9fc1fSA~z7=Css#KuJK( z!*`V(_w+w2u%uckqdNPALw&oWX=d7Yir|<`?5CrK~7JT-kS@BUsV^Z zKJ}vI#l!@4$7bsFThpTlwP)|zhPQ$tl}3SK6f6A(#nnnSMyTZ^J6)*(!wQ0YC!}jI zJej1Kax#HZiCHgCRIr#7A!beUl5(Y*Kr)dE&D4@HnGrHPGZ_~VtO)CofTdhstAR>{7!{u>!JQ!%ex(pSKrNb(nn*pK|BZ$=DT1rDx zY8BIfiOJQew3x*L>&#E_DK%1QH@r&M#RA}ila6UP2%F1MDmlF^baZeU0O<5!EApAk5Q#LZ+rmIW0;SX# ztpM4dY0{LUhpf+HGprcX=^Y3#@5cR1`%~^lWuPUMqCsjr)exQ}NX#<$M+r4f5vcK% zFT&*l93fz?z{d*~;3OZGixeVQ$jAA7FAP`k`QE*tBq|+^sc_N&1;E)9z#(~Z9|0l6 zV7?EZ4-2@64=j`ue3&5RJcNhgxSSC5f{4^opewPI-ccE#2mmF=d3-NI?gf+H2o4Jn zkpPwpF(ItLNdXu45h(=TolpdhPEu=?7$_&D#1cr3MwMXnVIUm!kCKR4JT|vS5|x6{ z3Sa>C0Hq?-dR@ z(gDJ%}{5ERp3*}W_U8;ZbaEC{1X0LtZgqg)}%M`T3lzgU zQ_x{)Bw>sbV0A9xiI^&Z1oNY-VL!>Kzi0*?mmm?Y5L6HmC}06!h`@3J!(f4&=Oq{N z5k%D04BhBDwSv}TTGBrO@Cdj94Qk|yIi{;rV?U2ZpGX?&04RgGLb!)AK8w?pEXOc0 zK4t66`7b_vjS9U+46y5zfzbsfA*Xv3cJT#b{X2hMb@)47FqwT$zKGvGy87t)A_l%l zxv#tW==vfCzDT*RyZ&!asimvgSnCDiiWVSpkp%h6gqLx;E}V+r3UQGr%SqOb fUh#F=m2wE$cBY^1`ABPt0a_9q5wt%be&K%r_>l1A literal 0 HcmV?d00001 From 0431478690614af9e5bd4a593acbd6517b6a2ac0 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Mon, 31 Aug 2026 04:04:44 -0400 Subject: [PATCH 28/45] Save pan offset between staff usages --- .../petrak/hexcasting/api/utils/HexUtils.kt | 32 +++++++++++++++-- .../hexcasting/client/gui/GuiSpellcasting.kt | 16 +++++++-- .../hexcasting/common/items/ItemStaff.java | 3 +- .../common/msgs/MsgOpenSpellGuiS2C.java | 8 +++-- .../common/msgs/MsgPannedGridC2S.java | 36 +++++++++++++++++++ .../xplat/DummyXplatAbstractions.kt | 3 ++ .../hexcasting/xplat/IXplatAbstractions.java | 6 +++- .../hexcasting/fabric/cc/CCPanOffset.java | 33 +++++++++++++++++ .../fabric/cc/HexCardinalComponents.java | 3 ++ .../fabric/network/FabricPacketHandler.java | 3 ++ .../fabric/xplat/FabricXplatImpl.java | 14 ++++++++ Fabric/src/main/resources/fabric.mod.json | 1 + .../forge/network/ForgePacketHandler.java | 2 ++ .../forge/xplat/ForgeXplatImpl.java | 14 +++++++- 14 files changed, 164 insertions(+), 10 deletions(-) create mode 100644 Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java create mode 100644 Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCPanOffset.java diff --git a/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt b/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt index fdd0e828ba..a8c383416d 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/utils/HexUtils.kt @@ -10,13 +10,17 @@ import at.petrak.hexcasting.api.casting.math.HexCoord import at.petrak.hexcasting.api.casting.validateSubIotas import at.petrak.hexcasting.api.mod.HexTags import com.mojang.datafixers.util.Function6 +import com.mojang.serialization.Codec +import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.ChatFormatting import net.minecraft.core.HolderLookup import net.minecraft.core.Registry import net.minecraft.nbt.* +import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.chat.Component import net.minecraft.network.chat.MutableComponent import net.minecraft.network.chat.Style +import net.minecraft.network.codec.ByteBufCodecs import net.minecraft.network.codec.StreamCodec import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceLocation @@ -61,14 +65,24 @@ fun vecFromNBT(tag: CompoundTag): Vec3 { Vec3(tag.getDouble("x"), tag.getDouble("y"), tag.getDouble("z")) } -fun Vec2.serializeToNBT(): LongArrayTag = - LongArrayTag(longArrayOf(this.x.toDouble().toRawBits(), this.y.toDouble().toRawBits())) +fun Vec2.serializeToNBT(): CompoundTag { + val tag = CompoundTag() + tag.putFloat("x", this.x) + tag.putFloat("y", this.y) + return tag +} fun vec2FromNBT(tag: LongArray): Vec2 = if (tag.size != 2) Vec2.ZERO else Vec2( Double.fromBits(tag[0]).toFloat(), Double.fromBits(tag[1]).toFloat(), ) +fun vec2FromNBT(tag: CompoundTag): Vec2 { + return if (!tag.contains("x") || !tag.contains("y")) + Vec2.ZERO + else + Vec2(tag.getFloat("x"), tag.getFloat("y")) +} fun otherHand(hand: InteractionHand) = if (hand == InteractionHand.MAIN_HAND) InteractionHand.OFF_HAND else InteractionHand.MAIN_HAND @@ -333,6 +347,20 @@ fun validateIotaList(iotaList: TreeList, serverLevel: ServerLevel) return iotaList.map { validateIota(it, serverLevel) } } +// why is there not already a codec defined for vec2 +@JvmField +val VEC2_CODEC: Codec = RecordCodecBuilder.create({ instance -> + instance.group( + Codec.FLOAT.fieldOf("x").forGetter { it.x }, + Codec.FLOAT.fieldOf("y").forGetter { it.y } + ).apply(instance, ::Vec2) +}).orElseGet({ Vec2.ZERO }) +@JvmField +val VEC2_STREAM_CODEC: StreamCodec = StreamCodec.composite( + ByteBufCodecs.FLOAT, Vec2::x, + ByteBufCodecs.FLOAT, Vec2::y, + ::Vec2 +) // vanilla's StreamCodec.composite() only supports up to six fields in 1.21 fun compositeCodecSeven( diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index 3e37d4d9a6..7b63117d22 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -22,6 +22,7 @@ import at.petrak.hexcasting.common.lib.HexAttributes import at.petrak.hexcasting.common.lib.HexSounds import at.petrak.hexcasting.common.lib.hex.HexActions import at.petrak.hexcasting.common.msgs.MsgNewSpellPatternC2S +import at.petrak.hexcasting.common.msgs.MsgPannedGridC2S import at.petrak.hexcasting.xplat.IClientXplatAbstractions import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.vertex.PoseStack @@ -31,7 +32,6 @@ import net.minecraft.client.gui.screens.Screen import net.minecraft.client.renderer.GameRenderer import net.minecraft.client.resources.sounds.SimpleSoundInstance import net.minecraft.client.resources.sounds.SoundInstance -import net.minecraft.resources.ResourceLocation import net.minecraft.sounds.SoundSource import net.minecraft.util.FormattedCharSequence import net.minecraft.util.Mth @@ -46,6 +46,7 @@ class GuiSpellcasting constructor( private var cachedStack: List, private var cachedRavenmind: Iota?, private var parenCount: Int, + private var panOffset: Vec2, ) : Screen("gui.hexcasting.spellcasting".asTranslatedComponent) { private var stackDescs: List = listOf() private var parenDescs: List = listOf() @@ -54,7 +55,7 @@ class GuiSpellcasting constructor( private var drawState: PatternDrawState = PatternDrawState.BetweenPatterns private val usedSpots: MutableSet = HashSet() - private var panOffset = Vec2.ZERO + private var prevPanOffset = Vec2.ZERO private val bgLocation = HexAPI.modLoc("textures/gui/casting_bg.png") private var ambianceSoundInstance: GridSoundInstance? = null @@ -214,6 +215,10 @@ class GuiSpellcasting constructor( private fun panGrid(pDragX: Double, pDragY: Double): Boolean { val shift = Vec2(pDragX.toFloat(), pDragY.toFloat()) this.panOffset = this.panOffset.add(shift) + if (panOffset.distanceToSqr(prevPanOffset) > 40000) { + IClientXplatAbstractions.INSTANCE.sendPacketToServer(MsgPannedGridC2S(panOffset)) + prevPanOffset = panOffset; + } return false; } @@ -296,8 +301,13 @@ class GuiSpellcasting constructor( } if (HexConfig.client().clickingTogglesDrawing()) return false - if (pButton == HexConfig.client().gridPanMouseButton()) + if (pButton == HexConfig.client().gridPanMouseButton()) { + if (panOffset != prevPanOffset) { + IClientXplatAbstractions.INSTANCE.sendPacketToServer(MsgPannedGridC2S(panOffset)) + prevPanOffset = panOffset; + } return false + } return drawEnd() } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java index 7ad1f4b5af..ee79020e44 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java @@ -46,13 +46,14 @@ public InteractionResultHolder use(Level world, Player player, Intera if (!world.isClientSide() && player instanceof ServerPlayer serverPlayer) { var vm = IXplatAbstractions.INSTANCE.getStaffcastVM(serverPlayer, hand); var patterns = IXplatAbstractions.INSTANCE.getPatternsSavedInUi(serverPlayer); + var panOffset = IXplatAbstractions.INSTANCE.getPanOffset(serverPlayer); @Nullable Iota ravenmind = vm.getImage().ravenmind().orElse(null); IXplatAbstractions.INSTANCE.sendPacketToPlayer(serverPlayer, new MsgOpenSpellGuiS2C(hand, patterns, vm.getImage().getStack(), ravenmind, - 0)); // TODO: Fix! + 0, panOffset)); // TODO: Fix! } player.awardStat(Stats.ITEM_USED.get(this)); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgOpenSpellGuiS2C.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgOpenSpellGuiS2C.java index db261af133..11f988d77b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgOpenSpellGuiS2C.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgOpenSpellGuiS2C.java @@ -4,6 +4,7 @@ import at.petrak.hexcasting.api.casting.eval.ResolvedPattern; import at.petrak.hexcasting.api.casting.iota.Iota; import at.petrak.hexcasting.api.casting.iota.IotaType; +import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.client.gui.GuiSpellcasting; import net.minecraft.client.Minecraft; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -11,6 +12,7 @@ import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.Vec2; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -23,7 +25,8 @@ public record MsgOpenSpellGuiS2C(InteractionHand hand, List pat List stack, @Nullable Iota ravenmind, - int parenCount + int parenCount, + Vec2 panOffset ) implements CustomPacketPayload { public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(HexAPI.modLoc("cgui")); @@ -40,6 +43,7 @@ public record MsgOpenSpellGuiS2C(InteractionHand hand, List pat Optional::ofNullable ), MsgOpenSpellGuiS2C::ravenmind, ByteBufCodecs.VAR_INT, MsgOpenSpellGuiS2C::parenCount, + HexUtils.VEC2_STREAM_CODEC, MsgOpenSpellGuiS2C::panOffset, MsgOpenSpellGuiS2C::new ); @@ -59,7 +63,7 @@ public static void handle(MsgOpenSpellGuiS2C msg) { var mc = Minecraft.getInstance(); mc.setScreen( new GuiSpellcasting(msg.hand(), msg.patterns(), msg.stack, msg.ravenmind, - msg.parenCount)); + msg.parenCount, msg.panOffset)); }); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java new file mode 100644 index 0000000000..8a96b08216 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java @@ -0,0 +1,36 @@ +package at.petrak.hexcasting.common.msgs; + +import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.api.casting.eval.env.StaffCastEnv; +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.client.gui.GuiSpellcasting; +import at.petrak.hexcasting.xplat.IXplatAbstractions; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.phys.Vec2; +import org.joml.Vector3f; + +/** + * Sent client->server when the player pans the casting grid. + */ +public record MsgPannedGridC2S(Vec2 panOffset) implements CustomPacketPayload { + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(HexAPI.modLoc("pan_cs")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + HexUtils.VEC2_STREAM_CODEC, MsgPannedGridC2S::panOffset, + MsgPannedGridC2S::new + ); + + @Override + public Type type() { + return TYPE; + } + + public void handle(MinecraftServer server, ServerPlayer sender) { + server.execute(() -> IXplatAbstractions.INSTANCE.setPanOffset(sender, panOffset)); + } +} diff --git a/Common/src/main/java/at/petrak/hexcasting/xplat/DummyXplatAbstractions.kt b/Common/src/main/java/at/petrak/hexcasting/xplat/DummyXplatAbstractions.kt index f21675d6dc..4d36722bff 100644 --- a/Common/src/main/java/at/petrak/hexcasting/xplat/DummyXplatAbstractions.kt +++ b/Common/src/main/java/at/petrak/hexcasting/xplat/DummyXplatAbstractions.kt @@ -56,6 +56,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.material.Fluid import net.minecraft.world.level.storage.loot.predicates.LootItemCondition +import net.minecraft.world.phys.Vec2 import net.minecraft.world.phys.Vec3 import java.util.function.BiFunction import java.util.function.Supplier @@ -88,12 +89,14 @@ internal class DummyXplatAbstractions: IXplatAbstractions { override fun setAltiora(target: Player, altiora: AltioraAbility?) = error("Found use of DummyXplatAbstractions.") override fun setStaffcastImage(target: ServerPlayer, image: CastingImage?) = error("Found use of DummyXplatAbstractions.") override fun setPatterns(target: ServerPlayer, patterns: List) = error("Found use of DummyXplatAbstractions.") + override fun setPanOffset(target: ServerPlayer, panOffset: Vec2) = error("Found use of DummyXplatAbstractions.") override fun getFlight(player: ServerPlayer): FlightAbility? = error("Found use of DummyXplatAbstractions.") override fun getAltiora(player: Player): AltioraAbility? = error("Found use of DummyXplatAbstractions.") override fun getPigment(player: Player): FrozenPigment = error("Found use of DummyXplatAbstractions.") override fun getSentinel(player: Player): Sentinel? = error("Found use of DummyXplatAbstractions.") override fun getStaffcastVM(player: ServerPlayer, hand: InteractionHand): CastingVM = error("Found use of DummyXplatAbstractions.") override fun getPatternsSavedInUi(player: ServerPlayer): List = error("Found use of DummyXplatAbstractions.") + override fun getPanOffset(player: ServerPlayer): Vec2? = error("Found use of DummyXplatAbstractions.") override fun clearCastingData(player: ServerPlayer) = error("Found use of DummyXplatAbstractions.") override fun findMediaHolder(stack: ItemStack): ADMediaHolder? = error("Found use of DummyXplatAbstractions.") override fun findDataHolder(stack: ItemStack): ADIotaHolder? = error("Found use of DummyXplatAbstractions.") diff --git a/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatAbstractions.java b/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatAbstractions.java index c2cc4ec351..d64a582211 100644 --- a/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatAbstractions.java +++ b/Common/src/main/java/at/petrak/hexcasting/xplat/IXplatAbstractions.java @@ -38,7 +38,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Tier; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -47,6 +46,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; @@ -103,6 +103,8 @@ public interface IXplatAbstractions { void setPatterns(ServerPlayer target, List patterns); + void setPanOffset(ServerPlayer target, Vec2 panOffset); + @Nullable FlightAbility getFlight(ServerPlayer player); @Nullable AltioraAbility getAltiora(Player player); @@ -115,6 +117,8 @@ public interface IXplatAbstractions { List getPatternsSavedInUi(ServerPlayer player); + Vec2 getPanOffset(ServerPlayer player); + void clearCastingData(ServerPlayer player); @Nullable diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCPanOffset.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCPanOffset.java new file mode 100644 index 0000000000..6af7bed9b0 --- /dev/null +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCPanOffset.java @@ -0,0 +1,33 @@ +package at.petrak.hexcasting.fabric.cc; + +import at.petrak.hexcasting.api.utils.HexUtils; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec2; +import org.ladysnake.cca.api.v3.component.Component; +import org.ladysnake.cca.api.v3.component.sync.AutoSyncedComponent; + +public class CCPanOffset implements Component, AutoSyncedComponent { + public static final String TAG_PAN_OFFSET = "pan_offset"; + + private final Player owner; + private Vec2 panOffset = Vec2.ZERO; + + public CCPanOffset(ServerPlayer owner) { + this.owner = owner; + } + + public Vec2 getPanOffset() { return panOffset; } + public void setPanOffset(Vec2 newOffset) { this.panOffset = newOffset; } + + @Override + public void readFromNbt(CompoundTag tag, HolderLookup.Provider registryLookup) { + this.panOffset = HexUtils.vec2FromNBT(tag.getCompound(TAG_PAN_OFFSET)); + } + + public void writeToNbt(CompoundTag tag, HolderLookup.Provider registryLookup) { + tag.put(TAG_PAN_OFFSET, HexUtils.serializeToNBT(this.panOffset)); + } +} diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/HexCardinalComponents.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/HexCardinalComponents.java index b60bc9a1c6..9dd5c9e10e 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/HexCardinalComponents.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/HexCardinalComponents.java @@ -41,6 +41,8 @@ public class HexCardinalComponents implements EntityComponentInitializer, ItemCo CCStaffcastImage.class); public static final ComponentKey PATTERNS = ComponentRegistry.getOrCreate(modLoc("patterns"), CCPatterns.class); + public static final ComponentKey PAN_OFFSET = ComponentRegistry.getOrCreate(modLoc("pan_offset"), + CCPanOffset.class); public static final ComponentKey CLIENT_CASTING_STACK = ComponentRegistry.getOrCreate(modLoc("client_casting_stack"), CCClientCastingStack.class); @@ -78,6 +80,7 @@ public void registerEntityComponentFactories(EntityComponentFactoryRegistry regi registry.registerFor(ServerPlayer.class, FLIGHT, CCFlight::new); registry.registerFor(ServerPlayer.class, STAFFCAST_IMAGE, CCStaffcastImage::new); registry.registerFor(ServerPlayer.class, PATTERNS, CCPatterns::new); + registry.registerFor(ServerPlayer.class, PAN_OFFSET, CCPanOffset::new); registry.registerFor(ItemEntity.class, IOTA_HOLDER, wrapItemEntityDelegate( diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/network/FabricPacketHandler.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/network/FabricPacketHandler.java index c7e2346e9b..8ee9e166a5 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/network/FabricPacketHandler.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/network/FabricPacketHandler.java @@ -16,6 +16,7 @@ public static void initPackets() { PayloadTypeRegistry.playC2S().register(MsgShiftScrollC2S.TYPE, MsgShiftScrollC2S.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(MsgNewSpellPatternC2S.TYPE, MsgNewSpellPatternC2S.STREAM_CODEC); PayloadTypeRegistry.playS2C().register(MsgNewSpellPatternS2C.TYPE, MsgNewSpellPatternS2C.STREAM_CODEC); + PayloadTypeRegistry.playC2S().register(MsgPannedGridC2S.TYPE, MsgPannedGridC2S.STREAM_CODEC); PayloadTypeRegistry.playS2C().register(MsgOpenSpellGuiS2C.TYPE, MsgOpenSpellGuiS2C.STREAM_CODEC); PayloadTypeRegistry.playS2C().register(MsgBeepS2C.TYPE, MsgBeepS2C.STREAM_CODEC); PayloadTypeRegistry.playS2C().register(MsgShiftScrollC2S.TYPE, MsgShiftScrollC2S.STREAM_CODEC); @@ -31,6 +32,8 @@ public static void init() { makeServerBoundHandler(MsgShiftScrollC2S::handle)); ServerPlayNetworking.registerGlobalReceiver(MsgNewSpellPatternC2S.TYPE, makeServerBoundHandler(MsgNewSpellPatternC2S::handle)); + ServerPlayNetworking.registerGlobalReceiver(MsgPannedGridC2S.TYPE, + makeServerBoundHandler(MsgPannedGridC2S::handle)); } private static ServerPlayNetworking.PlayPayloadHandler makeServerBoundHandler( 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 fbad939683..eda1e88482 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 @@ -80,6 +80,7 @@ import net.minecraft.world.level.storage.loot.predicates.AnyOfCondition; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.predicates.MatchTool; +import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; import virtuoel.pehkui.api.ScaleTypes; @@ -189,6 +190,12 @@ public void setPatterns(ServerPlayer target, List patterns) { cc.setPatterns(patterns); } + @Override + public void setPanOffset(ServerPlayer target, Vec2 panOffset) { + var cc = HexCardinalComponents.PAN_OFFSET.get(target); + cc.setPanOffset(panOffset); + } + @Override public boolean isBrainswept(Mob mob) { var cc = HexCardinalComponents.BRAINSWEPT.get(mob); @@ -231,10 +238,17 @@ public List getPatternsSavedInUi(ServerPlayer player) { return cc.getPatterns(); } + @Override + public Vec2 getPanOffset(ServerPlayer player) { + var cc = HexCardinalComponents.PAN_OFFSET.get(player); + return cc.getPanOffset(); + } + @Override public void clearCastingData(ServerPlayer player) { this.setStaffcastImage(player, null); this.setPatterns(player, List.of()); + this.setPanOffset(player, Vec2.ZERO); } @Override diff --git a/Fabric/src/main/resources/fabric.mod.json b/Fabric/src/main/resources/fabric.mod.json index 053571f52b..798dec41db 100644 --- a/Fabric/src/main/resources/fabric.mod.json +++ b/Fabric/src/main/resources/fabric.mod.json @@ -77,6 +77,7 @@ "hexcasting:altiora", "hexcasting:harness", "hexcasting:patterns", + "hexcasting:pan_offset", "hexcasting:client_casting_stack", "hexcasting:pigment", "hexcasting:iota_holder", diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/network/ForgePacketHandler.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/network/ForgePacketHandler.java index c53a796a4e..5c95098709 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/network/ForgePacketHandler.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/network/ForgePacketHandler.java @@ -21,6 +21,8 @@ public static void init(IEventBus modBus) { // Client -> server registar.playToServer(MsgNewSpellPatternC2S.TYPE, MsgNewSpellPatternC2S.STREAM_CODEC, makeServerBoundHandler(MsgNewSpellPatternC2S::handle)); + registar.playToServer(MsgPannedGridC2S.TYPE, MsgPannedGridC2S.STREAM_CODEC, + makeServerBoundHandler(MsgPannedGridC2S::handle)); registar.playToServer(MsgShiftScrollC2S.TYPE, MsgShiftScrollC2S.STREAM_CODEC, makeServerBoundHandler(MsgShiftScrollC2S::handle)); 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 19d0b90813..33112f9120 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 @@ -60,7 +60,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Tier; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -70,6 +69,7 @@ import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.ModContainer; @@ -232,6 +232,11 @@ public void setPatterns(ServerPlayer player, List patterns) { player.getPersistentData().put(TAG_PATTERNS, ResolvedPattern.CODEC.listOf().encodeStart(NbtOps.INSTANCE, patterns).getOrThrow()); } + @Override + public void setPanOffset(ServerPlayer player, Vec2 panOffset) { + player.getPersistentData().put(TAG_PAN_OFFSET, HexUtils.VEC2_CODEC.encodeStart(NbtOps.INSTANCE, panOffset).getOrThrow()); + } + @Override public boolean isBrainswept(Mob e) { return e.getPersistentData().getBoolean(TAG_BRAINSWEPT); @@ -295,10 +300,16 @@ public List getPatternsSavedInUi(ServerPlayer player) { return ResolvedPattern.CODEC.listOf().parse(NbtOps.INSTANCE, player.getPersistentData().getList(TAG_PATTERNS, Tag.TAG_COMPOUND)).getOrThrow(); } + @Override + public Vec2 getPanOffset(ServerPlayer player) { + return HexUtils.VEC2_CODEC.parse(NbtOps.INSTANCE, player.getPersistentData().getCompound(TAG_PAN_OFFSET)).getOrThrow(); + } + @Override public void clearCastingData(ServerPlayer player) { player.getPersistentData().remove(TAG_VM); player.getPersistentData().remove(TAG_PATTERNS); + player.getPersistentData().remove(TAG_PAN_OFFSET); } @Override @@ -572,4 +583,5 @@ public void setScale(Entity e, float scale) { public static final String TAG_VM = "hexcasting:spell_harness"; public static final String TAG_PATTERNS = "hexcasting:spell_patterns"; + public static final String TAG_PAN_OFFSET = "hexcasting:pan_offset"; } From 8929708274683620d74ba9d1f0cfb6ced06e85d5 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Mon, 31 Aug 2026 15:13:41 -0400 Subject: [PATCH 29/45] Cull offscreen patterns --- .../at/petrak/hexcasting/client/gui/GuiSpellcasting.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index 7b63117d22..e7b96c79e6 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -443,12 +443,13 @@ class GuiSpellcasting constructor( for ((idx, elts) in this.patterns.withIndex()) { val (pat, origin, valid) = elts + val points = pat.toLines(this.hexSize(), this.coordToPx(origin)) + val center = Vec2(graphics.guiWidth() / 2f, graphics.guiHeight() / 2f) + if (points.all{ point -> point.distanceToSqr(center) > center.lengthSquared()+2500 }) + continue // don't render the pattern if it's completely offscreen drawPatternFromPoints( mat, - pat.toLines( - this.hexSize(), - this.coordToPx(origin) - ), + points, findDupIndices(pat.positions()), true, valid.color or (0xC8 shl 24), From 31889a238845d1757795a4449f37db3f7810db7d Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Mon, 31 Aug 2026 20:17:07 -0400 Subject: [PATCH 30/45] Dissociation debuff when panning too far --- .../damage_type/forgot_to_breathe.json | 5 ++ .../tags/damage_type/bypasses_armor.json | 3 +- .../tags/damage_type/bypasses_effects.json | 3 +- .../tags/damage_type/no_knockback.json | 5 ++ .../hexcasting/client/gui/GuiSpellcasting.kt | 28 ++++++---- .../common/effects/DissociationEffect.java | 52 ++++++++++++++++++ .../hexcasting/common/lib/HexDamageTypes.java | 7 +++ .../hexcasting/common/lib/HexMobEffects.java | 8 ++- .../common/msgs/MsgPannedGridC2S.java | 17 +++++- .../datagen/tag/HexDamageTypeTagProvider.java | 5 ++ .../hexcasting/mixin/MixinLivingEntity.java | 11 ++++ .../hexcasting/lang/en_us.flatten.json5 | 5 ++ .../textures/mob_effect/dissociation.png | Bin 0 -> 15689 bytes Common/src/main/resources/hexplat.mixins.json | 1 + .../fabric/FabricHexClientInitializer.kt | 4 +- .../damage_type/forgot_to_breathe.json | 5 ++ .../tags/damage_type/bypasses_armor.json | 3 +- .../tags/damage_type/bypasses_effects.json | 3 +- .../tags/damage_type/no_knockback.json | 5 ++ .../forge/ForgeHexClientInitializer.java | 2 + 20 files changed, 154 insertions(+), 18 deletions(-) create mode 100644 Common/src/generated/resources/data/hexcasting/damage_type/forgot_to_breathe.json create mode 100644 Common/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json create mode 100644 Common/src/main/java/at/petrak/hexcasting/common/effects/DissociationEffect.java create mode 100644 Common/src/main/resources/assets/hexcasting/textures/mob_effect/dissociation.png create mode 100644 Neoforge/src/generated/resources/data/hexcasting/damage_type/forgot_to_breathe.json create mode 100644 Neoforge/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json diff --git a/Common/src/generated/resources/data/hexcasting/damage_type/forgot_to_breathe.json b/Common/src/generated/resources/data/hexcasting/damage_type/forgot_to_breathe.json new file mode 100644 index 0000000000..d3a0ca991f --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/damage_type/forgot_to_breathe.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "hexcasting.forgot_to_breathe", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json b/Common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json index 4209c89aa3..319bb24df4 100644 --- a/Common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json +++ b/Common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json @@ -1,5 +1,6 @@ { "values": [ - "hexcasting:overcast" + "hexcasting:overcast", + "hexcasting:forgot_to_breathe" ] } \ No newline at end of file diff --git a/Common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json b/Common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json index 4209c89aa3..319bb24df4 100644 --- a/Common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json +++ b/Common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json @@ -1,5 +1,6 @@ { "values": [ - "hexcasting:overcast" + "hexcasting:overcast", + "hexcasting:forgot_to_breathe" ] } \ No newline at end of file diff --git a/Common/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json b/Common/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json new file mode 100644 index 0000000000..4cf0631136 --- /dev/null +++ b/Common/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json @@ -0,0 +1,5 @@ +{ + "values": [ + "hexcasting:forgot_to_breathe" + ] +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index e7b96c79e6..039c6bfe26 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -73,6 +73,13 @@ class GuiSpellcasting constructor( return panOffset.length() / 20 } + fun syncPanDistance() { + if (panOffset != prevPanOffset || ClientTickCounter.ticksInGame % 10 == 0L) { + IClientXplatAbstractions.INSTANCE.sendPacketToServer(MsgPannedGridC2S(panOffset)) + prevPanOffset = panOffset; + } + } + fun recvServerUpdate(info: ExecutionClientView, index: Int) { if (info.isStackClear) { this.minecraft?.setScreen(null) @@ -214,11 +221,11 @@ class GuiSpellcasting constructor( private fun panGrid(pDragX: Double, pDragY: Double): Boolean { val shift = Vec2(pDragX.toFloat(), pDragY.toFloat()) - this.panOffset = this.panOffset.add(shift) - if (panOffset.distanceToSqr(prevPanOffset) > 40000) { - IClientXplatAbstractions.INSTANCE.sendPacketToServer(MsgPannedGridC2S(panOffset)) - prevPanOffset = panOffset; - } + val newOffset = this.panOffset.add(shift) + if (newOffset.lengthSquared() < 900*900) + this.panOffset = newOffset + else + this.panOffset = newOffset.normalized().scale(900f); return false; } @@ -301,13 +308,8 @@ class GuiSpellcasting constructor( } if (HexConfig.client().clickingTogglesDrawing()) return false - if (pButton == HexConfig.client().gridPanMouseButton()) { - if (panOffset != prevPanOffset) { - IClientXplatAbstractions.INSTANCE.sendPacketToServer(MsgPannedGridC2S(panOffset)) - prevPanOffset = panOffset; - } + if (pButton == HexConfig.client().gridPanMouseButton()) return false - } return drawEnd() } @@ -600,5 +602,9 @@ class GuiSpellcasting constructor( renderQuad(ps, x, y, w, h, 0x50_303030) renderQuad(ps, x + leftMargin, y + 2.5f, w - leftMargin - 2.5f, h - 5f, 0x50_303030) } + + fun clientTickEnd(screen: Screen?) { + if (screen is GuiSpellcasting) screen.syncPanDistance() + } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/effects/DissociationEffect.java b/Common/src/main/java/at/petrak/hexcasting/common/effects/DissociationEffect.java new file mode 100644 index 0000000000..3cec7286de --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/effects/DissociationEffect.java @@ -0,0 +1,52 @@ +package at.petrak.hexcasting.common.effects; + +import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.common.lib.HexDamageTypes; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; + +public class DissociationEffect extends MobEffect { + public static final int AMP_0_DURATION = 300; + public static final int AMP_1_DURATION = 600; + + public DissociationEffect() { + super(MobEffectCategory.HARMFUL, 0x8932b8); + this.addAttributeModifier(Attributes.MOVEMENT_SPEED, HexAPI.modLoc("dissociation.slow"), -0.2, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); + this.addAttributeModifier(Attributes.BLOCK_BREAK_SPEED, HexAPI.modLoc("dissociation.fatigue.a"), -0.45, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); + this.addAttributeModifier(Attributes.ATTACK_SPEED, HexAPI.modLoc("dissociation.fatigue.b"), -0.1, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL); + this.addAttributeModifier(Attributes.ATTACK_DAMAGE, HexAPI.modLoc("dissociation.weak"), -4.0, AttributeModifier.Operation.ADD_VALUE); + } + + public static boolean shouldPreventBreathing(int duration, int amplifier) { + return switch (amplifier) { + case 0 -> duration > AMP_0_DURATION - 20; + case 1 -> duration > AMP_1_DURATION - 20; + default -> false; + }; + } + + @Override + public boolean applyEffectTick(LivingEntity entity, int amplifier) { + if (((Player)entity).getAbilities().invulnerable) return true; + entity.setAirSupply(entity.getAirSupply() - 1); + if (entity.getAirSupply() == -4) { + entity.setAirSupply(0); + entity.hurt(entity.damageSources().source(HexDamageTypes.FORGOT_TO_BREATHE), 2.0F); + } + return true; + } + + @Override + public boolean shouldApplyEffectTickThisTick(int duration, int amplifier) { + if (!shouldPreventBreathing(duration, amplifier)) return false; + return switch (amplifier) { + case 0 -> duration % 10 == 0; + case 1 -> duration % 5 == 0; + default -> false; + }; + } +} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDamageTypes.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDamageTypes.java index 6bd0f900fc..cdb9c5bb9a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDamageTypes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexDamageTypes.java @@ -3,6 +3,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; +import net.minecraft.world.damagesource.DamageEffects; import net.minecraft.world.damagesource.DamageScaling; import net.minecraft.world.damagesource.DamageType; @@ -10,6 +11,7 @@ public class HexDamageTypes { public static final ResourceKey OVERCAST = ResourceKey.create(Registries.DAMAGE_TYPE, modLoc("overcast")); + public static final ResourceKey FORGOT_TO_BREATHE = ResourceKey.create(Registries.DAMAGE_TYPE, modLoc("forgot_to_breathe")); public static void bootstrap(BootstrapContext ctx) { ctx.register(OVERCAST, new DamageType( @@ -17,5 +19,10 @@ public static void bootstrap(BootstrapContext ctx) { DamageScaling.WHEN_CAUSED_BY_LIVING_NON_PLAYER, 0f )); + ctx.register(FORGOT_TO_BREATHE, new DamageType( + "hexcasting.forgot_to_breathe", + DamageScaling.WHEN_CAUSED_BY_LIVING_NON_PLAYER, + 0f + )); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java index 9f03197eaf..15cd1dacdb 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexMobEffects.java @@ -1,14 +1,19 @@ package at.petrak.hexcasting.common.lib; import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.common.effects.DissociationEffect; import at.petrak.hexcasting.common.misc.HexMobEffect; import at.petrak.hexcasting.xplat.IXplatAbstractions; import at.petrak.hexcasting.xplat.IXplatRegister; import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; public class HexMobEffects { @@ -21,8 +26,9 @@ public static void register() { public static final Holder ENLARGE_GRID = REGISTER.registerHolder("enlarge_grid", () -> new HexMobEffect(MobEffectCategory.BENEFICIAL, 0xc875ff).addAttributeModifier(HexAttributes.GRID_ZOOM, HexAPI.modLoc("enlarge_grid"), - 0.25, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + 0.25, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); public static final Holder SHRINK_GRID = REGISTER.registerHolder("shrink_grid", () -> new HexMobEffect(MobEffectCategory.HARMFUL, 0xc0e660).addAttributeModifier(HexAttributes.GRID_ZOOM, HexAPI.modLoc("shrink_grid"), -0.2, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + public static final Holder DISSOCIATION = REGISTER.registerHolder("dissociation", DissociationEffect::new); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java index 8a96b08216..68949ff028 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java @@ -4,6 +4,9 @@ import at.petrak.hexcasting.api.casting.eval.env.StaffCastEnv; import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.client.gui.GuiSpellcasting; +import at.petrak.hexcasting.common.effects.DissociationEffect; +import at.petrak.hexcasting.common.lib.HexMobEffects; +import at.petrak.hexcasting.common.misc.HexMobEffect; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; @@ -11,6 +14,7 @@ import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.phys.Vec2; import org.joml.Vector3f; @@ -31,6 +35,17 @@ public Type type() { } public void handle(MinecraftServer server, ServerPlayer sender) { - server.execute(() -> IXplatAbstractions.INSTANCE.setPanOffset(sender, panOffset)); + server.execute(() -> { + IXplatAbstractions.INSTANCE.setPanOffset(sender, panOffset); + var inst = sender.getEffect(HexMobEffects.DISSOCIATION); + int currentDur = (inst != null) ? inst.getDuration() : 0; + if (panOffset.lengthSquared() > 600*600) { + int newDur = Math.min(currentDur + 80, DissociationEffect.AMP_1_DURATION); + sender.addEffect(new MobEffectInstance(HexMobEffects.DISSOCIATION, newDur, 1, false, false, true)); + } else if (panOffset.lengthSquared() > 300*300) { + int newDur = Math.min(currentDur + 40, DissociationEffect.AMP_0_DURATION); + sender.addEffect(new MobEffectInstance(HexMobEffects.DISSOCIATION, newDur, 0, false, false, true)); + } + }); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexDamageTypeTagProvider.java b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexDamageTypeTagProvider.java index 16e7020d08..dc5405714e 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexDamageTypeTagProvider.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/tag/HexDamageTypeTagProvider.java @@ -24,6 +24,11 @@ protected void addTags(@NotNull HolderLookup.Provider provider) { DamageTypeTags.BYPASSES_EFFECTS, DamageTypeTags.BYPASSES_SHIELD ); + add(HexDamageTypes.FORGOT_TO_BREATHE, + DamageTypeTags.BYPASSES_ARMOR, + DamageTypeTags.BYPASSES_EFFECTS, + DamageTypeTags.NO_KNOCKBACK + ); } @SafeVarargs diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java index c3dbc47b81..c2966324f9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java @@ -1,5 +1,7 @@ package at.petrak.hexcasting.mixin; +import at.petrak.hexcasting.common.effects.DissociationEffect; +import at.petrak.hexcasting.common.lib.HexMobEffects; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; @@ -21,4 +23,13 @@ private void removeBrain(CallbackInfoReturnable> cir) { cir.setReturnValue(brain); } } + + @Inject(method = "increaseAirSupply", at = @At("HEAD"), cancellable = true) + private void forgetToBreathe(int i, CallbackInfoReturnable cir) { + var self = (LivingEntity) (Object) this; + var inst = self.getEffect(HexMobEffects.DISSOCIATION); + if (inst != null && DissociationEffect.shouldPreventBreathing(inst.getDuration(), inst.getAmplifier())) { + cir.setReturnValue(i); + } + } } diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 51e6daf517..165c096089 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -219,6 +219,7 @@ "effect.hexcasting": { enlarge_grid: "Clarity", shrink_grid: "Clouding", + dissociation: "Dissociation", }, "item.minecraft.potion.effect": { @@ -527,6 +528,10 @@ "": "%s's mind was subsumed into energy", player: "%s's mind was subsumed into energy while fighting %s", }, + forgot_to_breathe: { + "": "%s forgot to breathe", + player: "%s forgot to breathe while fighting %s", + } }, "command.hexcasting": { diff --git a/Common/src/main/resources/assets/hexcasting/textures/mob_effect/dissociation.png b/Common/src/main/resources/assets/hexcasting/textures/mob_effect/dissociation.png new file mode 100644 index 0000000000000000000000000000000000000000..2d90323597330048fccf095a1345a6c6b36d2c11 GIT binary patch literal 15689 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 ClientTickCounter.clientTickEnd() Keybinds.clientTickEnd() ShiftScrollListener.clientTickEnd() + GuiSpellcasting.clientTickEnd(ctx.screen) } TooltipComponentCallback.EVENT.register(PatternTooltipComponent::tryConvert) ClientPlayConnectionEvents.JOIN.register { _, _, _ -> diff --git a/Neoforge/src/generated/resources/data/hexcasting/damage_type/forgot_to_breathe.json b/Neoforge/src/generated/resources/data/hexcasting/damage_type/forgot_to_breathe.json new file mode 100644 index 0000000000..d3a0ca991f --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/damage_type/forgot_to_breathe.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.0, + "message_id": "hexcasting.forgot_to_breathe", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json b/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json index 4209c89aa3..319bb24df4 100644 --- a/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json +++ b/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json @@ -1,5 +1,6 @@ { "values": [ - "hexcasting:overcast" + "hexcasting:overcast", + "hexcasting:forgot_to_breathe" ] } \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json b/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json index 4209c89aa3..319bb24df4 100644 --- a/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json +++ b/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json @@ -1,5 +1,6 @@ { "values": [ - "hexcasting:overcast" + "hexcasting:overcast", + "hexcasting:forgot_to_breathe" ] } \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json b/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json new file mode 100644 index 0000000000..4cf0631136 --- /dev/null +++ b/Neoforge/src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json @@ -0,0 +1,5 @@ +{ + "values": [ + "hexcasting:forgot_to_breathe" + ] +} \ No newline at end of file diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java index 3e30a6c875..bf341cc78b 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java @@ -4,6 +4,7 @@ import at.petrak.hexcasting.client.Keybinds; import at.petrak.hexcasting.client.RegisterClientStuff; import at.petrak.hexcasting.client.ShiftScrollListener; +import at.petrak.hexcasting.client.gui.GuiSpellcasting; import at.petrak.hexcasting.client.gui.PatternTooltipComponent; import at.petrak.hexcasting.client.model.AltioraLayer; import at.petrak.hexcasting.client.model.HexModelLayers; @@ -78,6 +79,7 @@ public static void clientInit(FMLClientSetupEvent evt) { ClientTickCounter.clientTickEnd(); Keybinds.clientTickEnd(); ShiftScrollListener.clientTickEnd(); + GuiSpellcasting.Companion.clientTickEnd(Minecraft.getInstance().screen); ClientLevel level = Minecraft.getInstance().level; if (level != null) { for (Player player : level.players()) { From 28a0c1a0043d5f34f72c7e7eea9c6956950315fe Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Mon, 31 Aug 2026 20:31:28 -0400 Subject: [PATCH 31/45] Add doc comments for dissociation and the new packet type --- .../at/petrak/hexcasting/client/gui/GuiSpellcasting.kt | 4 ++-- .../hexcasting/common/effects/DissociationEffect.java | 7 +++++++ .../at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java | 4 +++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index 039c6bfe26..22fde251c9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -73,7 +73,7 @@ class GuiSpellcasting constructor( return panOffset.length() / 20 } - fun syncPanDistance() { + fun syncPanOffset() { if (panOffset != prevPanOffset || ClientTickCounter.ticksInGame % 10 == 0L) { IClientXplatAbstractions.INSTANCE.sendPacketToServer(MsgPannedGridC2S(panOffset)) prevPanOffset = panOffset; @@ -604,7 +604,7 @@ class GuiSpellcasting constructor( } fun clientTickEnd(screen: Screen?) { - if (screen is GuiSpellcasting) screen.syncPanDistance() + if (screen is GuiSpellcasting) screen.syncPanOffset() } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/effects/DissociationEffect.java b/Common/src/main/java/at/petrak/hexcasting/common/effects/DissociationEffect.java index 3cec7286de..c426e97936 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/effects/DissociationEffect.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/effects/DissociationEffect.java @@ -9,6 +9,13 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; +/** + * Applied when the casting grid is panned too far. During the first second of duration (ie continuously, so long as + * the effect is constantly being topped up) the player slowly loses oxygen. Once the grid is closed or panned back + * to center, the effect can start to tick down, and the oxygen drain stops. + *

+ * Make sure to use the provided constants for effect duration, or the oxygen drain system may behave oddly. + */ public class DissociationEffect extends MobEffect { public static final int AMP_0_DURATION = 300; public static final int AMP_1_DURATION = 600; diff --git a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java index 68949ff028..b9efb19b7f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/msgs/MsgPannedGridC2S.java @@ -19,7 +19,9 @@ import org.joml.Vector3f; /** - * Sent client->server when the player pans the casting grid. + * Sent client->server to sync the player's casting grid pan offset and potentially apply the Dissociation debuff + * if they've panned too far. Sent whenever the pan offset is upated, and also every 10 ticks while the GUI is + * open so that the debuff can be kept active. */ public record MsgPannedGridC2S(Vec2 panOffset) implements CustomPacketPayload { public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(HexAPI.modLoc("pan_cs")); From 4e90e00aed0c8e9c99ca161db5ded7aef98f1754 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 1 Sep 2026 03:21:13 -0400 Subject: [PATCH 32/45] Neural mesh model + placeholder texture --- .../hexcasting/models/item/neural_mesh.json | 6 + .../client/RegisterClientStuff.java | 1 + .../common/blocks/BlockNeuralMesh.java | 27 ++++ .../hexcasting/common/lib/HexBlocks.java | 14 +- .../hexcasting/blockstates/neural_mesh.json | 150 ++++++++++++++++++ .../hexcasting/models/block/neural_mesh.json | 18 +++ .../hexcasting/textures/block/neural_mesh.png | Bin 0 -> 5662 bytes .../hexcasting/models/item/neural_mesh.json | 6 + .../forge/datagen/xplat/HexItemModels.java | 7 +- 9 files changed, 222 insertions(+), 7 deletions(-) create mode 100644 Common/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json create mode 100644 Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java create mode 100644 Common/src/main/resources/assets/hexcasting/blockstates/neural_mesh.json create mode 100644 Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json create mode 100644 Common/src/main/resources/assets/hexcasting/textures/block/neural_mesh.png create mode 100644 Neoforge/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json b/Common/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json new file mode 100644 index 0000000000..02633ca951 --- /dev/null +++ b/Common/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:block/neural_mesh" + } +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java index 0bc3caeaef..c819d3fc3a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/RegisterClientStuff.java @@ -129,6 +129,7 @@ public static void init() { x.setRenderLayer(HexBlocks.EDIFIED_TRAPDOOR.get(), RenderType.cutout()); x.setRenderLayer(HexBlocks.AKASHIC_BOOKSHELF.get(), RenderType.cutout()); x.setRenderLayer(HexBlocks.SCONCE.get(), RenderType.cutout()); + x.setRenderLayer(HexBlocks.NEURAL_MESH.get(), RenderType.cutout()); x.setRenderLayer(HexBlocks.AMETHYST_EDIFIED_LEAVES.get(), RenderType.cutoutMipped()); x.setRenderLayer(HexBlocks.AVENTURINE_EDIFIED_LEAVES.get(), RenderType.cutoutMipped()); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java new file mode 100644 index 0000000000..c57284bce2 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java @@ -0,0 +1,27 @@ +package at.petrak.hexcasting.common.blocks; + +import com.mojang.serialization.MapCodec; + +import net.minecraft.world.level.block.GlowLichenBlock; +import net.minecraft.world.level.block.MultifaceBlock; +import net.minecraft.world.level.block.MultifaceSpreader; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + +public class BlockNeuralMesh extends MultifaceBlock { + public static final MapCodec CODEC = simpleCodec(BlockNeuralMesh::new); + private final MultifaceSpreader spreader = new MultifaceSpreader(this); + + public MapCodec codec() { + return CODEC; + } + + public BlockNeuralMesh(BlockBehaviour.Properties arg) { + super(arg); + } + + public MultifaceSpreader getSpreader() { + return this.spreader; + } +} diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java index 4f9fd2f54e..1d93e3c645 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java @@ -1,10 +1,7 @@ package at.petrak.hexcasting.common.lib; import at.petrak.hexcasting.api.block.circle.BlockAbstractImpetus; -import at.petrak.hexcasting.common.blocks.BlockConjured; -import at.petrak.hexcasting.common.blocks.BlockConjuredLight; -import at.petrak.hexcasting.common.blocks.BlockFlammable; -import at.petrak.hexcasting.common.blocks.BlockQuenchedAllay; +import at.petrak.hexcasting.common.blocks.*; import at.petrak.hexcasting.common.blocks.akashic.BlockAkashicBookshelf; import at.petrak.hexcasting.common.blocks.akashic.BlockAkashicLigature; import at.petrak.hexcasting.common.blocks.akashic.BlockAkashicRecord; @@ -197,6 +194,15 @@ private static BlockBehaviour.Properties quenched() { HexItems.props().rarity(Rarity.UNCOMMON) ); + public static final Supplier NEURAL_MESH = blockItem("neural_mesh", () -> + new BlockNeuralMesh(BlockBehaviour.Properties.of() + .noCollission() + .strength(0.2F) + .sound(SoundType.GLOW_LICHEN) + .pushReaction(PushReaction.DESTROY) + ) + ); + // Decoration?! public static final Supplier QUENCHED_ALLAY_TILES = blockItem("quenched_allay_tiles", () -> new BlockQuenchedAllay(quenched())); public static final Supplier QUENCHED_ALLAY_BRICKS = blockItem("quenched_allay_bricks", () -> new BlockQuenchedAllay(quenched())); diff --git a/Common/src/main/resources/assets/hexcasting/blockstates/neural_mesh.json b/Common/src/main/resources/assets/hexcasting/blockstates/neural_mesh.json new file mode 100644 index 0000000000..71cd44e549 --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/blockstates/neural_mesh.json @@ -0,0 +1,150 @@ +{ + "multipart": [ + { + "apply": { + "model": "hexcasting:block/neural_mesh" + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh" + }, + "when": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "y": 90 + }, + "when": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "y": 180 + }, + "when": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "y": 270 + }, + "when": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "x": 270 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "x": 270 + }, + "when": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "x": 90 + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "hexcasting:block/neural_mesh", + "uvlock": true, + "x": 90 + }, + "when": { + "down": "false", + "east": "false", + "north": "false", + "south": "false", + "up": "false", + "west": "false" + } + } + ] +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json b/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json new file mode 100644 index 0000000000..cb6b66b6c1 --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json @@ -0,0 +1,18 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "hexcasting:block/neural_mesh", + "neural_mesh": "hexcasting:block/neural_mesh" + }, + "render_type": "cutout", + "elements": [ + { + "from": [ 0, 0, 0.1 ], + "to": [ 16, 16, 0.1 ], + "faces": { + "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#neural_mesh" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#neural_mesh" } + } + } + ] +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/hexcasting/textures/block/neural_mesh.png b/Common/src/main/resources/assets/hexcasting/textures/block/neural_mesh.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad672f7b4c241df066367cb9b1734b098dcb7af GIT binary patch literal 5662 zcmeHLXH*ku7Y;=!qJnhf(-2vTm}F8&qezt+KnM_u%8;2rfRK;`60jk5te_yEpkSl9 zDhMJ9EQ$?RP*hx91w@b)7qG3^fNug8Jl~%49nabQXU>_-%=Qv-=?yE5ng;Fj~VX-CtpcE|>3AnsC7%fQ_!f05=~C0YG_rO}mG+@+ zuPAIQ;nM?3Zjy5b!Qln|fArFqHI-G)KAMH z+tGJq^gy(c|9`X&1{^5@bS>v-i{@|Qgq@!{R2}A?c&fKbd*Q0vbDOcX!9QJ=4s_K; z0>wFHnVwxGIx|tFV+%?)`LGLwDh28z_J&zYU3!IAa`(4ep%y>$`>W)}_N*%N*2_UmR9*zlB*>UGW;d zC!%QY8|COA+D8pmP4A2vyCTNgDollYO{GSrWALs}Jwtd`BCqn-)Z#O&O|xz5pFT}%Pnqv-`LW-s zD{`=9>eiO<)lM2)uTb)1^i&!KAKyt1jJP4e59_E2w z(q0tO`^)r~Gaw#cbD_`jCO>j>G-s=Ii%i@5RC7#hc~#4sB7=NU-oAu(dfyV^O{?Q| zFWPN}Rz4>P{Vej#e(Oq`Y0{*+S1WH`keg~#4z1+Su0m*+m;HJj(s}b|aTV8bAB;r{ z!dZ?Z7S%P~UKS^t)BQ?o^J2=%>Ngn8b~V|4tXsh8TkaDxD2}0v&E*n zF*<5+^@~M5L$b#W@ODPx%-jz>16!-wb`+iiC>1Ac0xh7qdhf5;Q?~q6f3hFHuOiS; zvUs)Q;;qA>feOn*mX(*zxui66ps9AfD9kru#hP?cP4&w=o96e{1@0|r2`oNYc76|)PY8dv0+92mp&;F-(VM>;)MncmYm z;?`EyX@A;1R<`1VI2V6Z!Dp{>jrK3sdrt3s$WreA=@DQvu(`sl^+N_JXXpvGDG}rm@YL2Mr!BG_Q}+y4ql4y9)EZR@NF6Gf(Jpedv5r z?`9hlvaeP`ph<_xUsa`98B+?LtGyqcRU@AD^S!Duze4=7`8&?1+xHFzAHq6SymK== z7t-;^)8USmTYGmE1o?g(ZGPWx!??QkLt`cHX~_9yrzLArc9cHCr;Q%ZA4B<=JR8ti z%@{co&7wVoj><1q*Lu%nbF{N!NK_AvVe;iT@{;6=}@tcUV1vsQ+G>5;VIqF zMBvP8eKOD8KiqiA-L$m}^~z@8T51_J>SPc@q(i8} z#bD_@-6^c=ME@5#IoFS++Z|Vp&{5o=m6cOs-nPY1w*C0>w{KJQABA-EjT*1??0`~z zO$#`+pq4};sZ-gKihBNF5K zfiQDy=VRYYFSB67t;W-eo!0lfZ5->8p5}rvZA|q`se}5zj~XbYB(32-tZvxBKbx%h zcK;fyV*|%2srP)_p7F6OlwS*!^zZVS9ZEQ9YNPoQqN&@#l4~qqfA`a}D1jkF}O{Rc2U+jg6qPX#J zAPydmgZT(ljI2udW=S^>rr#F}xdc%>zHr@f268IXX(gBatN1P&n*AOZjuum(UZ875M(AdO4JQecQm zAknDSk&(nnR37nS2^i0Tf^n0*l2btl6%_(NE)}9-sSpM6286j-I!vNrp-6}hQ|J^rL?et-K^(>+ zfrt+x>E!XjC>Sq{j~btl3(j!#^RUAZalqFRzc^6BMGTNVz>9|jQt{U*7LN}HNIiLNIQDM8j|v!JtGS zVhIFsb{M%+Xu0K=X(qCvAW#CjfD#xX1&9;|KxY617C>SU0S1|f1;`9w5?%oDxXJ$y zE#E$9+li#R^Tf#d$>T#4dny1grO{vrOQjP)DxC;{9FY1gyI8=LNI?q;Jd&-s_Tbb-=)BJfqzujKPH#@ z*LOuY9{GVMMcxD#)tvG~-Xf<)dbzovZlI*7%ciOWUC4-<&^<(qLQT__9}1|veFn&& zio}EIs?x8fprSM1eq?_T@?XIe4;M!k?b`YPlkFD(P2>IVH>N6jjW~EJy_!~O+wBk` zIf3@IP$fOn-oE6JvziU-s{ge2>2~Dy=A^cr<#jeTXCE)o7_j*5UG}Pu*KTo^(W0f< ztFjO8heb>Mi!?5v6+PFSqL#Hepk(1=#3y94XC9TB-kM_<)yV;t0Q}_LTK%K_2HJ@o zxroVhlQ$j7QIgCL&(u(WvyFOVRTbOWfzO9RogMn}Z#os=x0!^H>+2UXjQ~2{`%=u{ zadV$LT2)mwBcr>m4el?dsgwu;_GEGdQ;Axwd(6^zXJ1#BEY~3{_cSY9Vr05fYEg2{ u{C5A*J9Q6fK5*@9LvC#Ta65a~N2LSNAH)B&JgS6fgz|9parxOPBJIBgRD~7* literal 0 HcmV?d00001 diff --git a/Neoforge/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json b/Neoforge/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json new file mode 100644 index 0000000000..02633ca951 --- /dev/null +++ b/Neoforge/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hexcasting:block/neural_mesh" + } +} \ No newline at end of file diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java index 5347078ad9..4f29d07021 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java @@ -81,6 +81,10 @@ protected void registerModels() { .translation(-2.5f, 0f, -8f) .scale(0.4f); + singleTexture(getPath(HexBlocks.NEURAL_MESH.get()), + ResourceLocation.withDefaultNamespace("item/generated"), + "layer0", modLoc("block/neural_mesh")); + buildRobes(HexItems.ROBES_HOOD.get(), "hood", HexItems.ROBES_HOOD.get().numVariants()); buildRobes(HexItems.ROBES_TUNIC.get(), "tunic", HexItems.ROBES_HOOD.get().numVariants()); buildRobes(HexItems.ROBES_LEGS.get(), "legs", HexItems.ROBES_HOOD.get().numVariants()); @@ -284,9 +288,6 @@ private void buildStaff(Item item, String name) { } private void buildRobes(Item item, String type, int numVariants) { - // TODO: actually handle the variants -// singleTexture("item/" + getPath(item), ResourceLocation.withDefaultNamespace("item/generated"), -// "layer0", modLoc("item/robes/1_"+type)); var name = "item/" + getPath(item); var builder = getBuilder(name); for (int i = 0; i < numVariants; i++) { From 7256da8b49eb03a62f75b1d103f011909c114324 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 1 Sep 2026 04:44:52 -0400 Subject: [PATCH 33/45] Proper texture/model --- .../hexcasting/models/item/neural_mesh.json | 2 +- .../hexcasting/common/lib/HexBlocks.java | 2 +- .../hexcasting/blockstates/neural_mesh.json | 10 ------- .../hexcasting/models/block/neural_mesh.json | 26 ++++++++++++++++-- .../hexcasting/textures/block/neural_mesh.png | Bin 5662 -> 7121 bytes .../hexcasting/textures/item/neural_mesh.png | Bin 0 -> 6227 bytes .../hexcasting/models/item/neural_mesh.json | 2 +- .../forge/datagen/xplat/HexItemModels.java | 4 +-- 8 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 Common/src/main/resources/assets/hexcasting/textures/item/neural_mesh.png diff --git a/Common/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json b/Common/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json index 02633ca951..4f9fe9bf8a 100644 --- a/Common/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json +++ b/Common/src/generated/resources/assets/hexcasting/models/item/neural_mesh.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "hexcasting:block/neural_mesh" + "layer0": "hexcasting:item/neural_mesh" } } \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java index 1d93e3c645..bc7f3c17f3 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java @@ -198,7 +198,7 @@ private static BlockBehaviour.Properties quenched() { new BlockNeuralMesh(BlockBehaviour.Properties.of() .noCollission() .strength(0.2F) - .sound(SoundType.GLOW_LICHEN) + .sound(SoundType.DEEPSLATE_TILES) .pushReaction(PushReaction.DESTROY) ) ); diff --git a/Common/src/main/resources/assets/hexcasting/blockstates/neural_mesh.json b/Common/src/main/resources/assets/hexcasting/blockstates/neural_mesh.json index 71cd44e549..f5b66df718 100644 --- a/Common/src/main/resources/assets/hexcasting/blockstates/neural_mesh.json +++ b/Common/src/main/resources/assets/hexcasting/blockstates/neural_mesh.json @@ -24,7 +24,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "y": 90 }, "when": { @@ -34,7 +33,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "y": 90 }, "when": { @@ -49,7 +47,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "y": 180 }, "when": { @@ -59,7 +56,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "y": 180 }, "when": { @@ -74,7 +70,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "y": 270 }, "when": { @@ -84,7 +79,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "y": 270 }, "when": { @@ -99,7 +93,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "x": 270 }, "when": { @@ -109,7 +102,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "x": 270 }, "when": { @@ -124,7 +116,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "x": 90 }, "when": { @@ -134,7 +125,6 @@ { "apply": { "model": "hexcasting:block/neural_mesh", - "uvlock": true, "x": 90 }, "when": { diff --git a/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json b/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json index cb6b66b6c1..1c6b45d6ea 100644 --- a/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json +++ b/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json @@ -1,7 +1,7 @@ { "ambientocclusion": false, "textures": { - "particle": "hexcasting:block/neural_mesh", + "particle": "hexcasting:block/slate", "neural_mesh": "hexcasting:block/neural_mesh" }, "render_type": "cutout", @@ -10,8 +10,28 @@ "from": [ 0, 0, 0.1 ], "to": [ 16, 16, 0.1 ], "faces": { - "north": { "uv": [ 16, 0, 0, 16 ], "texture": "#neural_mesh" }, - "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#neural_mesh" } + "north": { "uv": [ 8, 0, 0, 8 ], "texture": "#neural_mesh" }, + "south": { "uv": [ 0, 0, 8, 8 ], "texture": "#neural_mesh" } + } + }, + { + "from": [ 0, 0, 0.3 ], + "to": [ 16, 16, 0.3 ], + "faces": { + "north": { "uv": [ 16, 0, 8, 8 ], "texture": "#neural_mesh" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#neural_mesh" } + } + }, + { + "from": [3, 3, 0], + "to": [13, 13, 1], + "faces": { + "north": {"uv": [1.5, 9.5, 6.5, 14.5], "texture": "#neural_mesh"}, + "south": {"uv": [1.5, 9.5, 6.5, 14.5], "texture": "#neural_mesh"}, + "east": {"uv": [6, 9.5, 6.5, 14.5], "texture": "#neural_mesh"}, + "west": {"uv": [1.5, 9.5, 2, 14.5], "texture": "#neural_mesh"}, + "up": {"uv": [1.5, 9.5, 6.5, 10], "texture": "#neural_mesh"}, + "down": {"uv": [1.5, 14, 6.5, 14.5], "texture": "#neural_mesh"} } } ] diff --git a/Common/src/main/resources/assets/hexcasting/textures/block/neural_mesh.png b/Common/src/main/resources/assets/hexcasting/textures/block/neural_mesh.png index 9ad672f7b4c241df066367cb9b1734b098dcb7af..acbb754539014d8c243086608053f09ff9f0f713 100644 GIT binary patch delta 3491 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 RW9I+>002ovPDHLkV1na$ovr`? delta 1896 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 NMzeRbD_kA0 Date: Tue, 1 Sep 2026 16:58:36 -0400 Subject: [PATCH 34/45] Better texture, add recipe for mesh --- .../recipes/redstone/neural_mesh.json | 32 ++++++++++++++++++ .../data/hexcasting/recipe/neural_mesh.json | 24 +++++++++++++ .../common/blocks/BlockNeuralMesh.java | 7 ++++ .../hexcasting/common/lib/HexBlocks.java | 20 ++++++----- .../hexcasting/common/lib/HexItems.java | 2 ++ .../datagen/recipe/HexplatRecipes.java | 3 ++ .../hexcasting/textures/block/neural_mesh.png | Bin 7121 -> 7248 bytes .../hexcasting/textures/item/neural_mesh.png | Bin 6227 -> 913 bytes .../hexcasting/textures/item/staff/neural.png | Bin 863 -> 865 bytes .../recipes/redstone/neural_mesh.json | 32 ++++++++++++++++++ .../data/hexcasting/recipe/neural_mesh.json | 24 +++++++++++++ .../recipes/redstone/neural_mesh.json | 32 ++++++++++++++++++ .../data/hexcasting/recipe/neural_mesh.json | 24 +++++++++++++ .../forge/datagen/xplat/HexItemModels.java | 2 +- 14 files changed, 192 insertions(+), 10 deletions(-) create mode 100644 Common/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json create mode 100644 Common/src/generated/resources/data/hexcasting/recipe/neural_mesh.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json create mode 100644 Fabric/src/generated/resources/data/hexcasting/recipe/neural_mesh.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/recipe/neural_mesh.json diff --git a/Common/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json b/Common/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json new file mode 100644 index 0000000000..5a76172263 --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:neural_mesh" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:neural_mesh" + ] + } +} \ No newline at end of file diff --git a/Common/src/generated/resources/data/hexcasting/recipe/neural_mesh.json b/Common/src/generated/resources/data/hexcasting/recipe/neural_mesh.json new file mode 100644 index 0000000000..b1ae10c52c --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/recipe/neural_mesh.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "C": { + "item": "hexcasting:neural_fiber" + }, + "D": { + "item": "hexcasting:neural_fiber" + }, + "I": { + "item": "minecraft:bone_block" + } + }, + "pattern": [ + "DCD", + "CIC", + "DCD" + ], + "result": { + "count": 1, + "id": "hexcasting:neural_mesh" + } +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java index c57284bce2..65644e400e 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java @@ -1,7 +1,9 @@ package at.petrak.hexcasting.common.blocks; +import at.petrak.hexcasting.common.lib.HexItems; import com.mojang.serialization.MapCodec; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.GlowLichenBlock; import net.minecraft.world.level.block.MultifaceBlock; import net.minecraft.world.level.block.MultifaceSpreader; @@ -24,4 +26,9 @@ public BlockNeuralMesh(BlockBehaviour.Properties arg) { public MultifaceSpreader getSpreader() { return this.spreader; } + + @Override + protected boolean canBeReplaced(BlockState blockState, BlockPlaceContext blockPlaceContext) { + return blockPlaceContext.getItemInHand().is(HexItems.NEURAL_MESH.get()); + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java index bc7f3c17f3..0138f0f232 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java @@ -142,10 +142,19 @@ private static BlockBehaviour.Properties quenched() { .isViewBlocking(HexBlocks::never)), new Item.Properties()); - // "no" item because we add it manually + // "no" item because we add them manually in HexItems + // these must be registered before anything that references HexItems to avoid initializer errors public static final Supplier SLATE = blockNoItem("slate", () -> new BlockSlate(slateish() .pushReaction(PushReaction.DESTROY))); + public static final Supplier NEURAL_MESH = blockNoItem("neural_mesh", () -> + new BlockNeuralMesh(BlockBehaviour.Properties.of() + .noCollission() + .strength(0.2F) + .sound(SoundType.CANDLE) + .pushReaction(PushReaction.DESTROY) + ) + ); public static final Supplier IMPETUS_EMPTY = blockItem("impetus/empty", () -> new BlockEmptyImpetus(slateish() @@ -194,14 +203,7 @@ private static BlockBehaviour.Properties quenched() { HexItems.props().rarity(Rarity.UNCOMMON) ); - public static final Supplier NEURAL_MESH = blockItem("neural_mesh", () -> - new BlockNeuralMesh(BlockBehaviour.Properties.of() - .noCollission() - .strength(0.2F) - .sound(SoundType.DEEPSLATE_TILES) - .pushReaction(PushReaction.DESTROY) - ) - ); + // Decoration?! public static final Supplier QUENCHED_ALLAY_TILES = blockItem("quenched_allay_tiles", () -> new BlockQuenchedAllay(quenched())); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index 0071da917b..b01ba152ac 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -105,6 +105,8 @@ public static void registerItemsForCreativeTab(ResourceKey tabK public static final Supplier NEURAL_FIBER = make("neural_fiber", () -> new Item(props().rarity(Rarity.UNCOMMON))); + public static final Supplier NEURAL_MESH = make("neural_mesh", () -> new BlockItem(HexBlocks.NEURAL_MESH.get(), props())); + public static final Supplier ROBES_HOOD = make("robes/hood", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable() .rarity(Rarity.UNCOMMON) diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java index edf414dc89..781538297e 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java @@ -270,6 +270,9 @@ public void buildRecipes(RecipeOutput recipes) { .pattern(" S ") .unlockedBy("has_item", hasItem(Items.AMETHYST_SHARD)).save(recipes); + ring(RecipeCategory.REDSTONE, HexItems.NEURAL_MESH.get(), 1, HexItems.NEURAL_FIBER.get(), Blocks.BONE_BLOCK) + .unlockedBy("has_item", hasItem(HexItems.NEURAL_FIBER.get())).save(recipes); + ShapedRecipeBuilder.shaped(RecipeCategory.COMBAT, HexItems.ROBES_HOOD.get()) .define('F', HexItems.NEURAL_FIBER.get()) .define('B', Items.BONE) diff --git a/Common/src/main/resources/assets/hexcasting/textures/block/neural_mesh.png b/Common/src/main/resources/assets/hexcasting/textures/block/neural_mesh.png index acbb754539014d8c243086608053f09ff9f0f713..253dac0c12eb793c4ae0e591387e10f226564e38 100644 GIT binary patch delta 3636 zcmV-44$JY;H_$kcB!9qqR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}#hGc68#@k! z|ML`cgyI5%JPy~0xxpNNKCnu1cYAsEdlNCOkcz6JxMU_0pzYRw{=MD5_=_=Smqbgh zIbZyxnrdh?%60#>^Xad2KF?ox9`XItefNG4xD~m^`)kQh|9{tg{~qAJG+Odupfa8Z z{quvGp7G0;~fA?KM zZwm9o5LWc@;xoo@FCf}GyVz*d^9dYu654X^g!tMLfcyxj_g`g2+m@Ps*y$51@0S1Z zefO2E6rL{e3xCM@ef{Bm=jF?T_?{=J6+YkZ_3HPEzMyaKy=U2H&+MY54AlAA z)N3oJMLz~fHg$06<0%kQ9YIAejuacEC5yw~E-wDlV9%zsvxd3w4A&tRUP{PD~E=@0g{ zQ1JdLZ>(5X2nIIGFy`!&ZZP8a1F9T=U$3u!#%qK@F_bMtD!}%8h%Ww{6U0Mwq@!@X zW6BM%*A)X`>` zapE5{Pn~7f*_K~OX{9AAFI{ET)izSw(e1Ql=YOrc?7G{VwTIU4UVp%ve^?8LDeI_j z*0`(s8p4~Mh;asC!6gslY7`*oV4PjWrxc7i^e#W=q7S%4R zCV%HW;$XYIF0H`gB~Go4-HVq&f3UGjQ_@l2DR$O$wSHepD@H-{$u&00JUc?q)mC5K zR$u73N{W?jGzooBYnE@z*2GtI#S5) zvTc%3b_XPTf@0ptP`&gn(~Ab)xo4h0`g9;aSZ946Ar@AHh?gHbht*J0_PLcQ3xBzG zoVsF!XC(TqG8*v^>Tt1M#*tCAb3uRN`9dYZ3fRI`ZWu<1{AAA6eYlBQW4F1hXJ=k@ zxuP?w?8pEKwj?)p)QKQMWF$rOpx-Zh>ZMd<@Uj1V_b1jexzVrL;I0iXJI$$MAWoke zy&{70MQudJ06r>;XXL zwHh(F%B_9(j)5#>aAF{M0vcyP=2uC(^2>q*zzH0~tpg&j4Bg}K3s-3;SB2QSaH)ZX zpePIUH@7Vl6@BjHai2BVLhdEBhaJMjgCtQ)o_F&bDgr{d4yc$@EsDd#oX*F($qv3C=oH&gemB9pyf=m!`lY*% zjVTcU;WmdhVGM^!@msUg;Y1D2e%-C>T-~ej@%nNh=F-r6+;b6W1I$U!!{k4TnWd>g z>WCAUb5iEIwl$^fC|Il{?8iKlY7mcQnUN4n$Y6%|Cv6jCWKB#2KO( zRI*D$7Nd?b=&{!H6KnnItnO`zKacYwN)c&jXmp;-&t(0`l*unu=@CTy#uVzPAB zC(m^$JHB^jHkNIZ->w4MxTeR7D{_1_E3&?sCa1 zfEgrMud5>a0dG`O4#S|>M95a|PpC~EF;Bjgu20mf!WLwGw&-M;3dijwI zqc@rc<;!Ue%70Hzdpj~FWcxrl=8$od_7-nX#by@zYmRgbj&5o|JPTa#FO zYM9$H_K~eAJDeCuC_7^URWYRTErU7N1m!XC$pgjs7iimJR zUW^T-DBlvWx9aTn9mf)|noX^Q`BkdbWQ8ULCiZm*NPnD*t;{rHSDdEon;`0KF)>i} zNF?`nqqJUD0zZznZ%0$A<3+R{Qek`sGhFP}Cv-LstEBFe6)#Iih?H4~b_*rkkKW@| z1*oqW+G$?bD@DF(KB`_rm5_6!?$N1ff1~ugO^xyp%Dq*rl!wuFU@q;<<9{~9pIqJF z{o(fmQGa|AZxWVxIG}d0^;xOU*@eQWUc07!!(MQsECyPy^78u%jjPA4@xig)!3pq%+wVjckFBjF}(OCPwx#%Xb{6lG05LyFvUZkT7XKtMD%6W~ zbVM=@T;JYbRL`lY27IXsp=(*ypMOJP!c1Xq2a^+jBst=kGwt$wT1p3DwS@dD6<&p( zsR;W2p^8w#F~8=r_(dv>6ao-KED}5f-y*p{oH-@=*Fc1_^xQud{INghEy`nL@>l(z zyTAxKm1Dk)yK3&?RZhF>r*-w8UH=aQ?Y*b{x5a+}d|=vTA#Pfmvt$a~1Aj1KVPiQo zG&L<^Fk@vcG-G2kEjczeI4v?YH)Aj{H8VFhGczIzARr)kZE#IZI!SJGbYX5|Wl2Om zB6w|ZE@^3GI$~uuWHMxBVJ$c^G%_tTI5{#cVPiC7Eo3+{V>o4GIWlB4W+Dn8ARu^c za7|4*PjYEzX>MU`L~mntZIiza4I5K57G&n6|H!x!@G%;aeEjThUI4v_YG&eag zVlXu`Gcl9$4qyv8GB-9eIWRFcHaL@A4|51HH99ppIx;hp*bgQMF*Q0hIXW^klLioq zBxE!+GdVG3V=XXZWMeHfIAu32VPs-vEo3-lGGRAnIAJk2HIuXuPY5wJIyE^uGBdLa z5oib%VKN1J00006VoOIv0LTEf0HH!+x08q&B7YM*7jLHEh5!Ho{z*hZR9M69ma$LU zKorJ*2}!CTf+!0EgQe~$5(7f*loh6KNC=_+2bCByCM;}`_zw_6B(`o0T^On;hyeu{ z+M%k%kbxo8;!sYpU76`D`#6#~*v-OQe7>{qeee6e=QD(&Q*HZdT&pyEfa9$bA1&0H zK7Tevcu&(l+3>{G?JaR*|7TGvX*pH_f9|@;NiwM%wMxU! z#;x8IyC++jxPT)*NW#sN6cXg^RNJp^seic64)RT_mjlL<@IYd6sfAI8jj8wbPp*ks zWj-V8!;-$V*)aWMpOShKy}I!FILGlgrksZSZ}BW5pU~gGend2J9SK0bP(<1ym|t1n z$Rq_It53A*U8F5=9m&PPJ%eTm*OBCAb6g%iAbP#@82EYp-S_$)#f8!{1^}cj5P!WM zA2)Z>V<61Lpjl$jEYYfWQ}aLsK)z7q-?#Swlr4+7FCOo<1!c>^btIRE59tC>e>jSI zbyeWXmX$65*O9D#oezL03Dj@b%;&#}1IXzTfFxfi@~OTIcmS+9ixD_IMFwdB!4%0R9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}t(a+cBRLL) z|ML`cgyaH(JPz0Q<_2^8`M^x6Y?o`gtER0dC6!5Wi3kKhyY-)cZ}%_$qSxS(XvsC_ zi@#J;4UI;*?!R_E{guw=`3uh@zJI#!-VXw|BG-6-E&1vHx_|HA1KgKJOFj%##`B?g#!EpxxWLaxMCC3w_px zD_bc%UE&vz^MCvL?S1Fv%Y*oyCw!bam8TUx-{<%JUeOoy?Y;Lb`|O!rw3LB5Kbv}O z<+SL>AjzgKj-};Gc?(16c~xEoRS%>vufdF+cJ%?ewoiWg=C@zxI{aXXDJ&P1MhGLs zbF)MZH4Nhr{&@Kv6jo;}kUS3UDTeo2{F%01!=2d*Gk;G{*Wek<^ON6xx!?W4-WCep zU*(Mz>k7fZW*NquebNm^{C+@{1Muth_0M>XFerwyg-8Y1eh<;b|8RnMh>mm=u6GQ2 zozDP3#MHuKe1rj5^HF^EmxiF;17v}q#?nJfp~HX|36n*J6k~>)5^QRIqW*LZ61eTS zkD0-Q#D5$WZiqX`N=eXrb!WV9h_Qg~OC})HiF~ zRecTN%}&HPgD|p)hjBFu5OgrkuHsV)#+-3>)j(88V3A^+O>d0BU|K%N_Al;SxEVF( z{x9B~rcbVX)Urjj%c{wF zkAFDWZm&x#uy~16Yh(A~WzZjN?9!BU)OU)VHC?UWm(q$+(0p=@jWW-U&~vrbSGUy{ zdajaUWgAUGpJQomRb;ltz-*#^w*`%|hG7?b^n|}bCu~l2B44{l{r8enTC;i53Fm&4Y$lWyQ zPT#dzBx_hBZAe(Eu{XVT>sr~>Y8{NN(@43eI@8WF!`3L8EaOO@ZalD*+<}f1vb$`X zB$V9&$)2E?H!@T&z035Xfp_kiCy+iJ$Pd<8pGSy=)ga>K$If9jl$3pLWy(UX9e<~; z7~vU-eyfZ|JcK%2te0_QRP9{QpLo7dL$Ct2aFrW|Q6fK?b9EnXqSn}L?&{f@S6!~? zj4C@aK!PpFjU9C&h!7b`5k2Vl%bt2E6&ZZ&Ki~a{wM=gGYc{xR!^=){>KKUAr$(=c zpnOpq)I&G1Bp=5Lt*^1r5nh59tbdVrleKK#WLgE~DH!<$T1=sF8Ihg>Q80S|ka?{} z46br(-@RiX3mKdk2%dn(8Ibu^(ysinAOUa!$8hU_$SXtlIQ+s@+R0TR_AXp%U?C{V z0{zWx%S1(=J9*q^4YrVb3GHEraPc5X)RO1j{DF#q5Uv9%=2VN~aIU4I};9KE1rywCW12f`cm8N@B#!#7gE#zZHI1!3C> zvXMo6Y9u%;f?A98$$-NI%tpnA`_7k8?b0-j%9Q4TSd3XY22~<=7ruK$>#<105yw!N zWp*!yk%B)WcsMv-mTcUlgMSn^@KM%IIxwg6v2L=1F9@1K`Y6Af;9cGu!wmh>-N(k1 zh=6dLLz^&$!=(75+39ei24}zS)^)D#)%bXQxe#+{=soVah_nIbq~~GsAH~el)F5@l ziOV@Db6wk-Qg#$9RucAOo=G)`$Fj^wh$ZARZGTy?8eI7V_YDEAB!5n(>C{(wVFVmo z?jABa=}9mu>}wp!E4M`(q^USTC9ENNyg2r zsBLy-d4pyn8K#QCnt#nZ^ZAqOnl~%0jes!^uwWpWnu{beblem(t%VE$h6z7o_mzwz zBboMHuXkFse7Gyg*ys?;hvpc^J7!!|v-|4g6K`fAhkp$#P?exS>KX5-5QsBGF{osh zhAc)MWzb`-=@-`e)mh!!5`P{4_tihqP4HG(6hpHXwxKx(V1FI%*i6_~NyTL8tWTcn zQg(dr%xo;%auXv^7imYI(;VeQc^VBPNp7{Q$<$SkWg3i(9jJ;zehdV-X58hHR{%3e zuwGY1_5c7;JFMnTmkJ-_)tWI6Y^qg zAVv9+fW1{`x9>QXfYoejCCslc~~WNpR9OUIzpt(LbO{b;ePZUuPQ)& z#n4Xkx?U;rP4iLp8mfexBXy5XP5U=W&)d`}524&!#Y%Y?Z3pJk&OH8CL;TLw{pk;X z9%$`g`G2>g9OBK2gvqiA4K%*V%b~7pA=C(+^yMDKImh91(|P^o?zJeV2SS4q4h5mr zn(`ou#|?Zc<*TK;UwZvtU3&+34iOWRObzo#;pQL~X?;?tRf;53ixU!|yK(lXn^>j4 zlbuPb;V_M=aFQI(Juz=bnW5)+xIl^}Uu_UNYJZ=|F+8$}e+jtz`^>!Xvg-_Wi9PWZG1$Ap)o5O6! zN631ZNaHloh^0Vb-v&tqFU$&x0(xk>+JKRB?vtFK>c;&EVc!wxJ}`I)#6xV89F4cl zKYyuonwhH|Bv7j-JCo`t_|UPuAR(hTJHnYc%mHQ>=NcVY+UCf9Fu6@yjx%2gE4Ama zp0O0NElibqz-`@?ai zKZ4-Iqz=Z(v)b{j;wMLjaM$%6XSJ>v7gUbQK&SW^gMof1w&nENhWn#^d~ zZ9SvNBhIt!3fu!EIb&utIWajmEjTe_FfBATHZ(0^Vl*=?G&eOdHe_LDVKFf@lkE;4 zBR69-H)LgIW-Vi4H!v+UGd4LbIc795Eo3-mHaKHpH#IpplP?b_Brr5EHaKQwHZ3qX zV=*l>IbmZhI5symEiz(bVKg%^F*h_YG?RM|U<)-eIW;#nI59OdFq7sFa|kdrIyE&q zH8+!C5GDvPG&(gkIyEEBGaFlaT6xP=aeS jpl0Ib%JYZq`v1mXDqbw~;&Wr?00000NkvXXu0mjfy{Vb$ diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/neural_mesh.png b/Common/src/main/resources/assets/hexcasting/textures/item/neural_mesh.png index c8ce70173ed9f042d77b34c44003e249ec27fbc6..1a3069b70e567deed3f7aa27005beeb48479e9e4 100644 GIT binary patch delta 459 zcmV;+0W|*8Fp&q4Ba;#b69OoavnL030R-2=fisgM7Bhbo4G{{K!b1Q602y>eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00C%8L_t(I%Y~CYNCQC>guhEx!JvVw zEe=xH2qvUT@W4*7G}VD%w6PNWfg_b9X~bY-VUduWjS82(uv@N4`+1K%jjl+q-8m=IB_Z}kxDFk z75|kWJe1MRfc@|_HFfZM_l#VlsBNvU#3~&volh1JYL61!UQF_98} zzrTIRZTCr&PI8T+mQbxdzuozS-Sc<8Z*-=nXLx@&dBq*Lfd`jPguK55r0Q~Q9+(`; z8U`ZufjTS2d*zW`Ibv4I*?ZtOj zYTAKd38`Lc+8%&eNCJ>QNHZP{Np860NuxTgw~2nETC4fR*l*liIHv4a+Mi)kLlPJ3 zxP&i8b|IX+xIVHMYJ{b7crPTmT(Cd4Q@Z&N{{c=n-@Me2(<1-?002ovPDHLkV1iNJ B&s6{b literal 6227 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 diff --git a/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json new file mode 100644 index 0000000000..5a76172263 --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:neural_mesh" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:neural_mesh" + ] + } +} \ No newline at end of file diff --git a/Fabric/src/generated/resources/data/hexcasting/recipe/neural_mesh.json b/Fabric/src/generated/resources/data/hexcasting/recipe/neural_mesh.json new file mode 100644 index 0000000000..b1ae10c52c --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/recipe/neural_mesh.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "C": { + "item": "hexcasting:neural_fiber" + }, + "D": { + "item": "hexcasting:neural_fiber" + }, + "I": { + "item": "minecraft:bone_block" + } + }, + "pattern": [ + "DCD", + "CIC", + "DCD" + ], + "result": { + "count": 1, + "id": "hexcasting:neural_mesh" + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json new file mode 100644 index 0000000000..5a76172263 --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/advancement/recipes/redstone/neural_mesh.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": "hexcasting:neural_fiber" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "hexcasting:neural_mesh" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_item" + ] + ], + "rewards": { + "recipes": [ + "hexcasting:neural_mesh" + ] + } +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/recipe/neural_mesh.json b/Neoforge/src/generated/resources/data/hexcasting/recipe/neural_mesh.json new file mode 100644 index 0000000000..b1ae10c52c --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/recipe/neural_mesh.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "C": { + "item": "hexcasting:neural_fiber" + }, + "D": { + "item": "hexcasting:neural_fiber" + }, + "I": { + "item": "minecraft:bone_block" + } + }, + "pattern": [ + "DCD", + "CIC", + "DCD" + ], + "result": { + "count": 1, + "id": "hexcasting:neural_mesh" + } +} \ No newline at end of file diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java index 993dc46916..607ad63a59 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/datagen/xplat/HexItemModels.java @@ -81,7 +81,7 @@ protected void registerModels() { .translation(-2.5f, 0f, -8f) .scale(0.4f); - simpleItem(modLoc("neural_mesh")); + simpleItem(HexItems.NEURAL_MESH.get()); buildRobes(HexItems.ROBES_HOOD.get(), "hood", HexItems.ROBES_HOOD.get().numVariants()); buildRobes(HexItems.ROBES_TUNIC.get(), "tunic", HexItems.ROBES_HOOD.get().numVariants()); From d50fe8074bf4d1aafa918bc34595313885e2bb6f Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Wed, 2 Sep 2026 00:34:45 -0400 Subject: [PATCH 35/45] Neural mesh functionality & loot table --- .../loot_table/blocks/neural_mesh.json | 106 ++++++++++++++++++ .../common/blocks/BlockNeuralMesh.java | 51 ++++++++- .../hexcasting/common/lib/HexBlocks.java | 1 + .../hexcasting/datagen/HexLootTables.java | 15 +++ .../mixin/MixinBuddingAmethystBlock.java | 43 +++++++ .../hexcasting/lang/en_us.flatten.json5 | 3 + .../hexcasting/textures/item/staff/neural.png | Bin 865 -> 889 bytes Common/src/main/resources/hexplat.mixins.json | 3 +- .../loot_table/blocks/neural_mesh.json | 106 ++++++++++++++++++ .../loot_table/blocks/neural_mesh.json | 106 ++++++++++++++++++ 10 files changed, 430 insertions(+), 4 deletions(-) create mode 100644 Common/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json create mode 100644 Common/src/main/java/at/petrak/hexcasting/mixin/MixinBuddingAmethystBlock.java create mode 100644 Fabric/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json create mode 100644 Neoforge/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json diff --git a/Common/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json b/Common/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json new file mode 100644 index 0000000000..49ecc8425a --- /dev/null +++ b/Common/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json @@ -0,0 +1,106 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": true, + "count": -1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "down": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "up": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "north": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "south": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "west": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "east": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + } + ], + "name": "hexcasting:neural_mesh" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "hexcasting:blocks/neural_mesh" +} \ No newline at end of file diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java index 65644e400e..e88c471d07 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java @@ -1,12 +1,19 @@ package at.petrak.hexcasting.common.blocks; +import at.petrak.hexcasting.common.lib.HexBlocks; import at.petrak.hexcasting.common.lib.HexItems; import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.block.GlowLichenBlock; -import net.minecraft.world.level.block.MultifaceBlock; -import net.minecraft.world.level.block.MultifaceSpreader; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BooleanProperty; @@ -31,4 +38,42 @@ public MultifaceSpreader getSpreader() { protected boolean canBeReplaced(BlockState blockState, BlockPlaceContext blockPlaceContext) { return blockPlaceContext.getItemInHand().is(HexItems.NEURAL_MESH.get()); } + + @Override + protected void randomTick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource) { + for (var dir : availableFaces(blockState)) { + BlockPos targetPos = blockPos.relative(dir); + BlockState targetState = serverLevel.getBlockState(targetPos); + if (targetState.is(Blocks.BUDDING_AMETHYST) && randomSource.nextDouble() < 0.5) { + targetState.randomTick(serverLevel, targetPos, randomSource); + } + } + } + + @Override + protected BlockState updateShape(BlockState blockState, Direction direction, BlockState blockState2, LevelAccessor levelAccessor, BlockPos blockPos, BlockPos blockPos2) { + if (!hasAnyFace(blockState)) { + return Blocks.AIR.defaultBlockState(); + } else { + if (hasFace(blockState, direction) && !canAttachTo(levelAccessor, direction, blockPos2, blockState2)) { + var resultState = removeFace(blockState, getFaceProperty(direction)); + if (resultState.is(HexBlocks.NEURAL_MESH.get())) { + if (!levelAccessor.isClientSide() && levelAccessor instanceof Level level) { + var pos = blockPos.getCenter(); + var entity = new ItemEntity(level, pos.x, pos.y, pos.z, new ItemStack(HexItems.NEURAL_MESH.get())); + entity.setDefaultPickUpDelay(); + level.addFreshEntity(entity); + } + } + return resultState; + } + return blockState; + } + } + + // this is private in MultifaceBlock so here's a reimpl + private static BlockState removeFace(BlockState blockState, BooleanProperty booleanProperty) { + BlockState blockState2 = (BlockState)blockState.setValue(booleanProperty, false); + return hasAnyFace(blockState2) ? blockState2 : Blocks.AIR.defaultBlockState(); + } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java index 0138f0f232..850474c7f2 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java @@ -150,6 +150,7 @@ private static BlockBehaviour.Properties quenched() { public static final Supplier NEURAL_MESH = blockNoItem("neural_mesh", () -> new BlockNeuralMesh(BlockBehaviour.Properties.of() .noCollission() + .randomTicks() .strength(0.2F) .sound(SoundType.CANDLE) .pushReaction(PushReaction.DESTROY) diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/HexLootTables.java b/Common/src/main/java/at/petrak/hexcasting/datagen/HexLootTables.java index 713b16d052..5df6d75005 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/HexLootTables.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/HexLootTables.java @@ -8,6 +8,7 @@ import at.petrak.hexcasting.xplat.IXplatAbstractions; import at.petrak.paucal.api.datagen.PaucalLootTableSubProvider; import net.minecraft.advancements.critereon.*; +import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -16,7 +17,9 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.DoorBlock; +import net.minecraft.world.level.block.MultifaceBlock; import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.level.block.state.properties.SlabType; import net.minecraft.world.level.storage.loot.LootPool; @@ -85,6 +88,18 @@ protected void makeLootTables(Map blockTables, )); blockTables.put(HexBlocks.EDIFIED_DOOR.get(), LootTable.lootTable().withPool(doorPool)); + var meshEntry = LootItem.lootTableItem(HexBlocks.NEURAL_MESH.get()) + .apply(SetItemCountFunction.setCount(ConstantValue.exactly(-1), true)); + for (var dir : Direction.values()) { + meshEntry.apply(SetItemCountFunction.setCount(ConstantValue.exactly(1), true) + .when(new LootItemBlockStatePropertyCondition.Builder(HexBlocks.NEURAL_MESH.get()).setProperties( + StatePropertiesPredicate.Builder.properties().hasProperty(MultifaceBlock.getFaceProperty(dir), true) + )) + ); + } + var meshPool = LootPool.lootPool().setRolls(ConstantValue.exactly(1)).add(meshEntry); + blockTables.put(HexBlocks.NEURAL_MESH.get(), LootTable.lootTable().withPool(meshPool)); + var silkTouchCond = MatchTool.toolMatches( ItemPredicate.Builder.item().withSubPredicate( ItemSubPredicates.ENCHANTMENTS, diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinBuddingAmethystBlock.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinBuddingAmethystBlock.java new file mode 100644 index 0000000000..6543707280 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinBuddingAmethystBlock.java @@ -0,0 +1,43 @@ +package at.petrak.hexcasting.mixin; + +import at.petrak.hexcasting.common.lib.HexBlocks; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.BuddingAmethystBlock; +import net.minecraft.world.level.block.MultifaceBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(BuddingAmethystBlock.class) +public class MixinBuddingAmethystBlock { + // This prevents neural mesh from slowing down budding by taking up potential growth faces. + // If it tries to grow a face with mesh on it, this makes it try to pick another random face + // which does not have mesh on it. If all faces have mesh, the loop ends and nothing happens. + @Inject(method = "randomTick", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/server/level/ServerLevel;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;"), require = 1) + private void rerollFaceIfNeuralMesh( + BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, + CallbackInfo ci, + @Local LocalRef targetDir, @Local(ordinal = 1) LocalRef targetPos, @Local(ordinal = 1) LocalRef targetState + ) { + if (targetState.get().is(HexBlocks.NEURAL_MESH.get()) + && MultifaceBlock.availableFaces(targetState.get()).contains(targetDir.get().getOpposite())) { + for (var checkDir : Direction.allShuffled(randomSource)) { + BlockPos checkPos = blockPos.relative(checkDir); + BlockState checkState = serverLevel.getBlockState(checkPos); + if (!checkState.is(HexBlocks.NEURAL_MESH.get())) { + targetDir.set(checkDir); + targetPos.set(checkPos); + targetState.set(checkState); + return; + } + } + } + } +} diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 3e5992892a..d4d7625267 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -64,6 +64,7 @@ jeweler_hammer: "Jeweler's Hammer", sub_sandwich: "Submarine Sandwich", neural_fiber: "Neural Fiber", + neural_mesh: "Neural Mesh", robes: { hood: "Grand Caster Hood", @@ -136,6 +137,8 @@ "block.hexcasting": { conjured_light: "Conjured Light", conjured_block: "Conjured Block", + + neural_mesh: "Neural Mesh", directrix: { empty: "Empty Directrix", diff --git a/Common/src/main/resources/assets/hexcasting/textures/item/staff/neural.png b/Common/src/main/resources/assets/hexcasting/textures/item/staff/neural.png index ad8273fca8135cca741c54d69e032a23a6344d6f..6592f9e493ddc3296d345dcac435d431a85ad860 100644 GIT binary patch delta 394 zcmV;50d@Z22KffCy8#J*06_qaV35=clf(fa2m%BjGTxTYe3R?}D1T5%L_t(I%cYVr zNJ3E*hQC)rLz5I53PMh~l!Oh^Tbu+J9Wt2$;aWqThVX4_=09By=ezg+&pj}ul)p4Z{aJC^mdRIQN=|D?$7o~p+FaZo zkLPn*L%#2xP5N-ncz83(C5O}h43=2vfkO)m2; zisduY{?H7??Q?0p8iY=4czr+5 zIR^k+2iKz`wE8urUMq>$7evpb&HCw87hv=cxUH(B0y+8o=x0eHsY%2Wmx-36UMq>) zs!AfM2|y~4lZoKL%Y%8it*VUO#E2&@YfCG?5$sO0L9Z5Q^=rz=3nHGlJiauC4s)z+ ow^bFRb8p(7Sc#IHMnP`jQ{`u07*qoM6N<$f(ELxw*UYD delta 370 zcmV-&0ge9o2H^&@5p>ZY_AAvRQ zvMTxFtv7yO4f#YtUf&$HQbCqiHvu@mIAijC9{}5FkS)iRzHl$MOhX*IF5OOBEYlFT z+7!3i^mZ^%f@K;qqb_ir%Xzh{hZcbU1x`0I((Sb6_#`P>L{FEY%wd^^2lpNu8UDVH zflkySx-3o2127i~dkwpVgumOgh%P^W9$K?w*GGZ_0Ok7%P~kFlqwwGH1(YSAD*sBB Q`~Uy|07*qoM6N<$f|wJf%K!iX diff --git a/Common/src/main/resources/hexplat.mixins.json b/Common/src/main/resources/hexplat.mixins.json index 4916e585bd..013cb44083 100644 --- a/Common/src/main/resources/hexplat.mixins.json +++ b/Common/src/main/resources/hexplat.mixins.json @@ -5,8 +5,9 @@ "refmap": "hexcasting.mixins.refmap.json", "package": "at.petrak.hexcasting.mixin", "mixins": [ - "MixinLivingEntity", "MixinAbstractVillager", + "MixinBuddingAmethystBlock", + "MixinLivingEntity", "MixinMob", "MixinRaider", "MixinVillager", diff --git a/Fabric/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json b/Fabric/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json new file mode 100644 index 0000000000..49ecc8425a --- /dev/null +++ b/Fabric/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json @@ -0,0 +1,106 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": true, + "count": -1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "down": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "up": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "north": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "south": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "west": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "east": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + } + ], + "name": "hexcasting:neural_mesh" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "hexcasting:blocks/neural_mesh" +} \ No newline at end of file diff --git a/Neoforge/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json b/Neoforge/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json new file mode 100644 index 0000000000..49ecc8425a --- /dev/null +++ b/Neoforge/src/generated/resources/data/hexcasting/loot_table/blocks/neural_mesh.json @@ -0,0 +1,106 @@ +{ + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": true, + "count": -1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "down": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "up": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "north": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "south": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "west": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + }, + { + "add": true, + "conditions": [ + { + "block": "hexcasting:neural_mesh", + "condition": "minecraft:block_state_property", + "properties": { + "east": "true" + } + } + ], + "count": 1.0, + "function": "minecraft:set_count" + } + ], + "name": "hexcasting:neural_mesh" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "hexcasting:blocks/neural_mesh" +} \ No newline at end of file From 0efacc00cdbc9fd888d68ba9bdc3856dee75f6e5 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 4 Sep 2026 15:15:33 -0400 Subject: [PATCH 36/45] Rebalance mesh speed boost --- .../common/blocks/BlockNeuralMesh.java | 13 ++--- .../hexcasting/common/lib/HexBlocks.java | 1 - .../hexcasting/common/lib/HexItems.java | 6 ++- .../mixin/MixinBuddingAmethystBlock.java | 53 ++++++++++--------- 4 files changed, 38 insertions(+), 35 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java index e88c471d07..c37408064f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java @@ -44,7 +44,7 @@ protected void randomTick(BlockState blockState, ServerLevel serverLevel, BlockP for (var dir : availableFaces(blockState)) { BlockPos targetPos = blockPos.relative(dir); BlockState targetState = serverLevel.getBlockState(targetPos); - if (targetState.is(Blocks.BUDDING_AMETHYST) && randomSource.nextDouble() < 0.5) { + if (targetState.is(Blocks.BUDDING_AMETHYST)) { targetState.randomTick(serverLevel, targetPos, randomSource); } } @@ -57,13 +57,8 @@ protected BlockState updateShape(BlockState blockState, Direction direction, Blo } else { if (hasFace(blockState, direction) && !canAttachTo(levelAccessor, direction, blockPos2, blockState2)) { var resultState = removeFace(blockState, getFaceProperty(direction)); - if (resultState.is(HexBlocks.NEURAL_MESH.get())) { - if (!levelAccessor.isClientSide() && levelAccessor instanceof Level level) { - var pos = blockPos.getCenter(); - var entity = new ItemEntity(level, pos.x, pos.y, pos.z, new ItemStack(HexItems.NEURAL_MESH.get())); - entity.setDefaultPickUpDelay(); - level.addFreshEntity(entity); - } + if (resultState.is(HexBlocks.NEURAL_MESH.get()) && levelAccessor instanceof Level level) { + popResource(level, blockPos, new ItemStack(HexItems.NEURAL_MESH.get())); } return resultState; } @@ -73,7 +68,7 @@ protected BlockState updateShape(BlockState blockState, Direction direction, Blo // this is private in MultifaceBlock so here's a reimpl private static BlockState removeFace(BlockState blockState, BooleanProperty booleanProperty) { - BlockState blockState2 = (BlockState)blockState.setValue(booleanProperty, false); + BlockState blockState2 = blockState.setValue(booleanProperty, false); return hasAnyFace(blockState2) ? blockState2 : Blocks.AIR.defaultBlockState(); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java index 850474c7f2..447a8ab55f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java @@ -205,7 +205,6 @@ private static BlockBehaviour.Properties quenched() { ); - // Decoration?! public static final Supplier QUENCHED_ALLAY_TILES = blockItem("quenched_allay_tiles", () -> new BlockQuenchedAllay(quenched())); public static final Supplier QUENCHED_ALLAY_BRICKS = blockItem("quenched_allay_bricks", () -> new BlockQuenchedAllay(quenched())); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index b01ba152ac..37045eb505 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -105,7 +105,11 @@ public static void registerItemsForCreativeTab(ResourceKey tabK public static final Supplier NEURAL_FIBER = make("neural_fiber", () -> new Item(props().rarity(Rarity.UNCOMMON))); - public static final Supplier NEURAL_MESH = make("neural_mesh", () -> new BlockItem(HexBlocks.NEURAL_MESH.get(), props())); + public static final Supplier NEURAL_MESH = make("neural_mesh", () -> + new BlockItem(HexBlocks.NEURAL_MESH.get(), props() + .rarity(Rarity.UNCOMMON) + ) + ); public static final Supplier ROBES_HOOD = make("robes/hood", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable() diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinBuddingAmethystBlock.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinBuddingAmethystBlock.java index 6543707280..2e01fc5656 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinBuddingAmethystBlock.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinBuddingAmethystBlock.java @@ -1,43 +1,48 @@ package at.petrak.hexcasting.mixin; import at.petrak.hexcasting.common.lib.HexBlocks; -import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.BuddingAmethystBlock; -import net.minecraft.world.level.block.MultifaceBlock; import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(BuddingAmethystBlock.class) public class MixinBuddingAmethystBlock { - // This prevents neural mesh from slowing down budding by taking up potential growth faces. - // If it tries to grow a face with mesh on it, this makes it try to pick another random face - // which does not have mesh on it. If all faces have mesh, the loop ends and nothing happens. - @Inject(method = "randomTick", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/server/level/ServerLevel;getBlockState(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState;"), require = 1) - private void rerollFaceIfNeuralMesh( - BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, RandomSource randomSource, - CallbackInfo ci, - @Local LocalRef targetDir, @Local(ordinal = 1) LocalRef targetPos, @Local(ordinal = 1) LocalRef targetState + // When combined with the extra random ticks provided by the neural mesh blocks themselves, this results + // in an overall speed boost equivalent to each mesh block providing 5 extra random ticks whenever it + // receives a single random tick. We do it this way (rather than actually ticking the budding block five + // times per mesh tick) to avoid sudden jumps in growth progress. + @WrapOperation( + method = "randomTick", + at = @At(value = "INVOKE", target = "Lnet/minecraft/util/RandomSource;nextInt(I)I", ordinal = 0) + ) + private int increaseSuccessChanceWithMesh( + RandomSource instance, int originalArg, Operation original, + BlockState selfState, ServerLevel serverLevel, BlockPos selfPos, RandomSource randomSource ) { - if (targetState.get().is(HexBlocks.NEURAL_MESH.get()) - && MultifaceBlock.availableFaces(targetState.get()).contains(targetDir.get().getOpposite())) { - for (var checkDir : Direction.allShuffled(randomSource)) { - BlockPos checkPos = blockPos.relative(checkDir); - BlockState checkState = serverLevel.getBlockState(checkPos); - if (!checkState.is(HexBlocks.NEURAL_MESH.get())) { - targetDir.set(checkDir); - targetPos.set(checkPos); - targetState.set(checkState); - return; - } + int meshCount = 0; + for (Direction dir : Direction.values()) { + BlockPos checkPos = selfPos.relative(dir); + if (serverLevel.getBlockState(checkPos).is(HexBlocks.NEURAL_MESH.get())) { + meshCount++; } } + if (meshCount == 0) + return original.call(instance, originalArg); + boolean success = switch (meshCount) { + case 1 -> (randomSource.nextDouble() < 0.6); + case 2 -> (randomSource.nextDouble() < 11.0/15.0); + case 3 -> (randomSource.nextDouble() < 0.8); + case 4 -> (randomSource.nextDouble() < 0.84); + case 5 -> (randomSource.nextDouble() < 13.0/15.0); + default -> false; + }; + return success ? 0 : -1; } } From 12c5e8f622bce15d2319b5305e879407f19a005b Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sat, 5 Sep 2026 21:23:00 -0400 Subject: [PATCH 37/45] Only allow grid panning while wearing the armor --- .../hexcasting/client/gui/GuiSpellcasting.kt | 27 ++++++++++++++----- .../common/items/armor/ItemRobes.java | 13 ++++++++- .../fabric/FabricHexClientInitializer.kt | 1 - .../forge/ForgeHexClientInitializer.java | 1 - 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index 22fde251c9..fe99ef28ca 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -18,6 +18,7 @@ import at.petrak.hexcasting.client.ShiftScrollListener import at.petrak.hexcasting.client.ktxt.accumulatedScroll import at.petrak.hexcasting.client.render.* import at.petrak.hexcasting.client.sound.GridSoundInstance +import at.petrak.hexcasting.common.items.armor.ItemRobes import at.petrak.hexcasting.common.lib.HexAttributes import at.petrak.hexcasting.common.lib.HexSounds import at.petrak.hexcasting.common.lib.hex.HexActions @@ -29,6 +30,7 @@ import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.gui.screens.Screen +import net.minecraft.client.player.LocalPlayer import net.minecraft.client.renderer.GameRenderer import net.minecraft.client.resources.sounds.SimpleSoundInstance import net.minecraft.client.resources.sounds.SoundInstance @@ -55,7 +57,8 @@ class GuiSpellcasting constructor( private var drawState: PatternDrawState = PatternDrawState.BetweenPatterns private val usedSpots: MutableSet = HashSet() - private var prevPanOffset = Vec2.ZERO + private var panningAllowed = false + private var prevPanOffset = panOffset private val bgLocation = HexAPI.modLoc("textures/gui/casting_bg.png") private var ambianceSoundInstance: GridSoundInstance? = null @@ -80,6 +83,14 @@ class GuiSpellcasting constructor( } } + fun validatePanAbility(player: LocalPlayer) { + panningAllowed = ItemRobes.isWearingFullSet(player) + if (!panningAllowed && panOffset != Vec2.ZERO) { + panOffset = Vec2.ZERO + syncPanOffset() + } + } + fun recvServerUpdate(info: ExecutionClientView, index: Int) { if (info.isStackClear) { this.minecraft?.setScreen(null) @@ -145,6 +156,7 @@ class GuiSpellcasting constructor( if (player != null) { this.ambianceSoundInstance = GridSoundInstance(player) soundManager.play(this.ambianceSoundInstance!!) + this.validatePanAbility(player) } this.calculateIotaDisplays() @@ -157,6 +169,10 @@ class GuiSpellcasting constructor( val heldItem = player.getItemInHand(handOpenedWith) if (heldItem.isEmpty || !heldItem.`is`(HexTags.Items.STAVES) || player.getAttributeValue(HexAttributes.FEEBLE_MIND) > 0) closeForReal() + validatePanAbility(player) + if (this.panningAllowed) { + syncPanOffset() + } } } @@ -213,7 +229,10 @@ class GuiSpellcasting constructor( } if (HexConfig.client().clickingTogglesDrawing()) return false - if (pButton == HexConfig.client().gridPanMouseButton() && this.drawState is PatternDrawState.BetweenPatterns) { + if (pButton == HexConfig.client().gridPanMouseButton() + && this.drawState is PatternDrawState.BetweenPatterns + && this.panningAllowed + ) { return panGrid(pDragX, pDragY) } return drawMove(mxOut, myOut) @@ -602,9 +621,5 @@ class GuiSpellcasting constructor( renderQuad(ps, x, y, w, h, 0x50_303030) renderQuad(ps, x + leftMargin, y + 2.5f, w - leftMargin - 2.5f, h - 5f, 0x50_303030) } - - fun clientTickEnd(screen: Screen?) { - if (screen is GuiSpellcasting) screen.syncPanOffset() - } } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java index 020d3c4625..a39c9086dd 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/armor/ItemRobes.java @@ -16,6 +16,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.ArmorItem; @@ -24,6 +25,8 @@ import net.minecraft.world.item.component.ItemAttributeModifiers; import org.jetbrains.annotations.Nullable; +import java.util.List; + import static at.petrak.hexcasting.api.HexAPI.modLoc; /** @@ -45,7 +48,7 @@ public class ItemRobes extends ArmorItem implements VariantItem { public static ItemAttributeModifiers TUNIC_MODIFIERS = ItemAttributeModifiers.builder() .add(HexAttributes.MEDIA_CONSUMPTION_MODIFIER, new AttributeModifier( - modLoc("robes_tunic_discount"), -0.1, AttributeModifier.Operation.ADD_MULTIPLIED_BASE + modLoc("robes_tunic_discount"), -0.1, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL ), EquipmentSlotGroup.CHEST) .add(Attributes.ARMOR, new AttributeModifier( modLoc("robes_tunic_armor"), 7.0, AttributeModifier.Operation.ADD_VALUE @@ -75,6 +78,14 @@ public ItemRobes(Type type, Properties properties) { this.type = type; } + public static boolean isWearingFullSet(LivingEntity entity) { + for (var slot : List.of(EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET)) { + if (!(entity.getItemBySlot(slot).getItem() instanceof ItemRobes)) + return false; + } + return true; + } + public static HexRobesModel[] provideArmorModelsForSlot(EquipmentSlot slot) { EntityModelSet models = Minecraft.getInstance().getEntityModels(); return new HexRobesModel[] { diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexClientInitializer.kt b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexClientInitializer.kt index a27dc7af4d..a42dc2ebbe 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexClientInitializer.kt +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexClientInitializer.kt @@ -43,7 +43,6 @@ object FabricHexClientInitializer : ClientModInitializer { ClientTickCounter.clientTickEnd() Keybinds.clientTickEnd() ShiftScrollListener.clientTickEnd() - GuiSpellcasting.clientTickEnd(ctx.screen) } TooltipComponentCallback.EVENT.register(PatternTooltipComponent::tryConvert) ClientPlayConnectionEvents.JOIN.register { _, _, _ -> diff --git a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java index f853eadfbc..1662f29e61 100644 --- a/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java +++ b/Neoforge/src/main/java/at/petrak/hexcasting/forge/ForgeHexClientInitializer.java @@ -87,7 +87,6 @@ public static void clientInit(FMLClientSetupEvent evt) { ClientTickCounter.clientTickEnd(); Keybinds.clientTickEnd(); ShiftScrollListener.clientTickEnd(); - GuiSpellcasting.Companion.clientTickEnd(Minecraft.getInstance().screen); ClientLevel level = Minecraft.getInstance().level; if (level != null) { for (Player player : level.players()) { From d6154344345478b8439d847139814f8a7d7da27f Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sun, 6 Sep 2026 20:05:07 -0400 Subject: [PATCH 38/45] Add some leeway to the position check for crystallization flay --- .../common/casting/actions/spells/great/OpBrainsweep.kt | 4 +++- .../java/at/petrak/hexcasting/mixin/MixinLivingEntity.java | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt index 2d218aa048..9f54c6cca1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt @@ -61,7 +61,9 @@ object OpBrainsweep : SpellAction { throw MishapAlreadyBrainswept(sacrifice) // special behavior for crystallization - if (vecPos == sacrifice.eyePosition && sacrifice.hasEffect(HexMobEffects.ENLARGE_GRID) && sacrifice is AbstractVillager) { + if (vecPos.closerThan(sacrifice.eyePosition, 0.1) + && sacrifice.hasEffect(HexMobEffects.ENLARGE_GRID) + && sacrifice is AbstractVillager) { return SpellAction.Result( AltSpell(sacrifice, pos), MediaConstants.CRYSTAL_UNIT * 10, diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java index 6658314d45..38d215f17c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java @@ -1,14 +1,9 @@ package at.petrak.hexcasting.mixin; -import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.common.lib.HexItems; import at.petrak.hexcasting.common.lib.HexMobEffects; -import at.petrak.hexcasting.common.misc.HexMobEffect; import at.petrak.hexcasting.common.effects.DissociationEffect; -import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.ai.Brain; import net.minecraft.world.entity.npc.Villager; import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; From 82dbfe0c34e481a7ec70edeb5ba0dbc502356a07 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Sun, 6 Sep 2026 20:12:17 -0400 Subject: [PATCH 39/45] Book entry for neural fiber --- .../hexcasting/lang/en_us.flatten.json5 | 8 ++++++- .../entries/greatwork/fanciful_staves.json | 2 +- .../en_us/entries/greatwork/neural_fiber.json | 24 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 3fb1ae8064..d505e6a355 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -1341,6 +1341,7 @@ directrix: "Directrices", akashiclib: "Akashic Libraries", quenching_allays: "Quenching Allays", + neural_fiber: "Neural Inversion", fanciful_staves: "Fanciful Staves", // and the actions @@ -1800,7 +1801,12 @@ "4": "The product is fragile. Breaking it shatters it into pieces, with $(thing)Fortune/$ increasing the yield... if I wish the block itself I need a silken touch.$(br2)The produced shards are worth thrice an $(l:items/amethyst)$(item)Charged Amethyst Crystal/$ apiece. The block itself is worth four of the shards.", "5": "They are mercurial, they seem to twist and wink under my fingers, and by giving them a mentor in another form of _media they may be coerced into its shape, in an equivalent exchange of _media.", }, - + + neural_fiber: { + "1": "Mind and body-- I can bridge the gap! $(l:items/potions)Clarity/$ to ready the flesh, $(l:greatwork/brainsweeping)$(action)Flay Mind/$ subverted to pull not $(o)out/$ but $(o)in/$. The mind folded upon itself, crystallized in flesh and bone and nerve, until there is only ONE, mind-and-body superimposed.$(br2)The nerves... the nerves become conduits, skeins of thought reified in shimmering fiber. Free them from the flesh and they are $(o)mine/$.", + "2": "Any villager will do, though a more developed mind will provide a higher yield.$(br2)The process itself is simple: apply $(l:items/potions)Clarity/$ to render the body receptive, cast $(l:greatwork/brainsweeping)$(action)Flay Mind/$ with the $(l:patterns/basics#hexcasting:entity_pos/eye)$(action)subject’s own head/$ as the destination, then dissect to harvest the fiber. I wonder... does it understand, even excised? Does it feel?", + mesh: "The fibers have a natural affinity for bone. Woven into such a frame, I can affix them to $(thing)Budding Amethyst/$ to provide additional paths for the flow of media, accelerating growth.$(br2)Note that covering too many faces may reduce efficiency.", + }, "fanciful_staves.1": "It is only right as I shed the husk of ignorance I replace my tools, my palm-polished staves. These new constructions of mine have no additional properties -- but they are so glorious, oh so Glorious... They match the radiance winking at the corners of my sight.", diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/fanciful_staves.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/fanciful_staves.json index cb7e11ffc3..25d3b0073c 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/fanciful_staves.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/fanciful_staves.json @@ -2,7 +2,7 @@ "name": "hexcasting.entry.fanciful_staves", "category": "hexcasting:greatwork", "icon": "hexcasting:staff/mindsplice", - "sortnum": 6, + "sortnum": 8, "advancement": "hexcasting:enlightenment", "entry_color": "54398a", "pages": [ diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json new file mode 100644 index 0000000000..6062841c5b --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json @@ -0,0 +1,24 @@ +{ + "name": "hexcasting.entry.neural_fiber", + "category": "hexcasting:greatwork", + "icon": "hexcasting:charged_amethyst", + "advancement": "hexcasting:enlightenment", + "entry_color": "54398a", + "sortnum": 6, + "pages": [ + { + "type": "patchouli:text", + "text": "hexcasting.page.neural_fiber.1" + }, + { + "type": "patchouli:spotlight", + "item": "hexcasting:neural_fiber", + "text": "hexcasting.page.neural_fiber.2" + }, + { + "type": "patchouli:crafting", + "recipe": "hexcasting:neural_mesh", + "text": "hexcasting.page.neural_fiber.mesh" + } + ] +} \ No newline at end of file From 27661adcd56abea8abb04bda631806707a2bf86d Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Mon, 7 Sep 2026 01:31:56 -0400 Subject: [PATCH 40/45] Make the neural staff recipe consistent with other staves --- .../data/hexcasting/recipe/staff/neural.json | 14 +++++++------- .../hexcasting/datagen/recipe/HexplatRecipes.java | 10 +--------- .../data/hexcasting/recipe/staff/neural.json | 14 +++++++------- .../data/hexcasting/recipe/staff/neural.json | 14 +++++++------- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/Common/src/generated/resources/data/hexcasting/recipe/staff/neural.json b/Common/src/generated/resources/data/hexcasting/recipe/staff/neural.json index 6397db86d8..a4288d0288 100644 --- a/Common/src/generated/resources/data/hexcasting/recipe/staff/neural.json +++ b/Common/src/generated/resources/data/hexcasting/recipe/staff/neural.json @@ -5,17 +5,17 @@ "A": { "item": "hexcasting:charged_amethyst" }, - "B": { - "item": "minecraft:bone" + "S": { + "item": "minecraft:stick" }, - "F": { - "item": "hexcasting:neural_fiber" + "W": { + "item": "hexcasting:neural_mesh" } }, "pattern": [ - " FA", - " BF", - "B " + " SA", + " WS", + "S " ], "result": { "count": 1, diff --git a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java index 781538297e..ac7a5a5857 100644 --- a/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java +++ b/Common/src/main/java/at/petrak/hexcasting/datagen/recipe/HexplatRecipes.java @@ -102,15 +102,7 @@ public void buildRecipes(RecipeOutput recipes) { staffRecipe(recipes, HexItems.STAFF_EDIFIED.get(), HexBlocks.EDIFIED_PLANKS.get().asItem()); staffRecipe(recipes, HexItems.STAFF_QUENCHED.get(), HexItems.QUENCHED_SHARD.get()); staffRecipe(recipes, HexItems.STAFF_MINDSPLICE.get(), Ingredient.of(HexTags.Items.MINDFLAYED_CIRCLE_COMPONENTS)); - ShapedRecipeBuilder.shaped(RecipeCategory.TOOLS, HexItems.STAFF_NEURAL.get()) - .define('F', HexItems.NEURAL_FIBER.get()) - .define('B', Items.BONE) - .define('A', HexItems.CHARGED_AMETHYST.get()) - .pattern(" FA") - .pattern(" BF") - .pattern("B ") - .unlockedBy("has_item", hasItem(HexItems.CHARGED_AMETHYST.get())) - .save(recipes); + staffRecipe(recipes, HexItems.STAFF_NEURAL.get(), HexItems.NEURAL_MESH.get()); ShapelessRecipeBuilder.shapeless(RecipeCategory.TOOLS, HexItems.THOUGHT_KNOT.get()) .requires(HexItems.AMETHYST_DUST.get()) diff --git a/Fabric/src/generated/resources/data/hexcasting/recipe/staff/neural.json b/Fabric/src/generated/resources/data/hexcasting/recipe/staff/neural.json index 6397db86d8..a4288d0288 100644 --- a/Fabric/src/generated/resources/data/hexcasting/recipe/staff/neural.json +++ b/Fabric/src/generated/resources/data/hexcasting/recipe/staff/neural.json @@ -5,17 +5,17 @@ "A": { "item": "hexcasting:charged_amethyst" }, - "B": { - "item": "minecraft:bone" + "S": { + "item": "minecraft:stick" }, - "F": { - "item": "hexcasting:neural_fiber" + "W": { + "item": "hexcasting:neural_mesh" } }, "pattern": [ - " FA", - " BF", - "B " + " SA", + " WS", + "S " ], "result": { "count": 1, diff --git a/Neoforge/src/generated/resources/data/hexcasting/recipe/staff/neural.json b/Neoforge/src/generated/resources/data/hexcasting/recipe/staff/neural.json index 6397db86d8..a4288d0288 100644 --- a/Neoforge/src/generated/resources/data/hexcasting/recipe/staff/neural.json +++ b/Neoforge/src/generated/resources/data/hexcasting/recipe/staff/neural.json @@ -5,17 +5,17 @@ "A": { "item": "hexcasting:charged_amethyst" }, - "B": { - "item": "minecraft:bone" + "S": { + "item": "minecraft:stick" }, - "F": { - "item": "hexcasting:neural_fiber" + "W": { + "item": "hexcasting:neural_mesh" } }, "pattern": [ - " FA", - " BF", - "B " + " SA", + " WS", + "S " ], "result": { "count": 1, From 134ff17c42108c4139ff69429e8b2edceadd9be3 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Mon, 7 Sep 2026 01:34:29 -0400 Subject: [PATCH 41/45] Improve neural fiber entry --- .../resources/assets/hexcasting/lang/en_us.flatten.json5 | 7 ++++--- .../thehexbook/en_us/entries/greatwork/neural_fiber.json | 6 +++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index d505e6a355..f939648579 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -1803,9 +1803,10 @@ }, neural_fiber: { - "1": "Mind and body-- I can bridge the gap! $(l:items/potions)Clarity/$ to ready the flesh, $(l:greatwork/brainsweeping)$(action)Flay Mind/$ subverted to pull not $(o)out/$ but $(o)in/$. The mind folded upon itself, crystallized in flesh and bone and nerve, until there is only ONE, mind-and-body superimposed.$(br2)The nerves... the nerves become conduits, skeins of thought reified in shimmering fiber. Free them from the flesh and they are $(o)mine/$.", - "2": "Any villager will do, though a more developed mind will provide a higher yield.$(br2)The process itself is simple: apply $(l:items/potions)Clarity/$ to render the body receptive, cast $(l:greatwork/brainsweeping)$(action)Flay Mind/$ with the $(l:patterns/basics#hexcasting:entity_pos/eye)$(action)subject’s own head/$ as the destination, then dissect to harvest the fiber. I wonder... does it understand, even excised? Does it feel?", - mesh: "The fibers have a natural affinity for bone. Woven into such a frame, I can affix them to $(thing)Budding Amethyst/$ to provide additional paths for the flow of media, accelerating growth.$(br2)Note that covering too many faces may reduce efficiency.", + "1": "Mind and body-- I can bridge the gap! $(l:greatwork/brainsweeping)$(action)Flay Mind/$ was built to sever but I understand it now, I can TWIST it, force the mind not $(o)out/$ but $(o)in/$, so long as the flesh is made ready to accept it -- $(l:items/potions)Clarity/$ should do the job. The mind can be folded into itself, crystallized in flesh and bone and nerve, until there is only ONE, mind-and-body superimposed in a single hybrid substrate.", + "2": "Viscera suffused with micro-fractal splinters of cognition, living and thinking and-- USELESS! Nothing but a mass of meat and _media, in the end.$(br2)But the nerves... the nerves become conduits, skeins of thought reified in shimmering fiber. These I can USE. Free them from the flesh and they are $(o)mine/$.$(br2)I could weave them into myself -- more $(o)space/$ to think in -- no. I am not being rational.", + "3": "Any villager will do, though a more developed mind will provide a higher yield.$(br2)The process itself is simple: apply $(l:items/potions)Clarity/$ to render the body receptive, cast $(l:greatwork/brainsweeping)$(action)Flay Mind/$ with the $(l:patterns/basics#hexcasting:entity_pos/eye)$(action)subject’s own head/$ as the destination, then dissect to harvest the fiber. I wonder... does it understand, even excised? Does it feel?", + mesh: "The fibers have a natural affinity for bone. Woven into such a frame, I can affix them to $(thing)Budding Amethyst/$ to provide additional paths for the flow of media, accelerating growth. However, covering too many faces seems to reduce overall production efficiency.", }, "fanciful_staves.1": "It is only right as I shed the husk of ignorance I replace my tools, my palm-polished staves. These new constructions of mine have no additional properties -- but they are so glorious, oh so Glorious... They match the radiance winking at the corners of my sight.", diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json index 6062841c5b..acf1258240 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json @@ -10,10 +10,14 @@ "type": "patchouli:text", "text": "hexcasting.page.neural_fiber.1" }, + { + "type": "patchouli:text", + "text": "hexcasting.page.neural_fiber.2" + }, { "type": "patchouli:spotlight", "item": "hexcasting:neural_fiber", - "text": "hexcasting.page.neural_fiber.2" + "text": "hexcasting.page.neural_fiber.3" }, { "type": "patchouli:crafting", From b3c7675880e947c1a949fc44135ccecbfd3dc5dd Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 8 Sep 2026 01:24:00 -0400 Subject: [PATCH 42/45] Book entry for the armor --- .../hexcasting/client/gui/GuiSpellcasting.kt | 2 +- .../hexcasting/lang/en_us.flatten.json5 | 8 +++++- .../en_us/entries/greatwork/caster_robes.json | 28 +++++++++++++++++++ .../en_us/entries/greatwork/neural_fiber.json | 3 +- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/caster_robes.json diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index fe99ef28ca..b49fa175a1 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -79,7 +79,7 @@ class GuiSpellcasting constructor( fun syncPanOffset() { if (panOffset != prevPanOffset || ClientTickCounter.ticksInGame % 10 == 0L) { IClientXplatAbstractions.INSTANCE.sendPacketToServer(MsgPannedGridC2S(panOffset)) - prevPanOffset = panOffset; + prevPanOffset = panOffset } } diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index f939648579..fc39a37c16 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -1342,6 +1342,7 @@ akashiclib: "Akashic Libraries", quenching_allays: "Quenching Allays", neural_fiber: "Neural Inversion", + caster_robes: "Caster's Garments", fanciful_staves: "Fanciful Staves", // and the actions @@ -1805,9 +1806,14 @@ neural_fiber: { "1": "Mind and body-- I can bridge the gap! $(l:greatwork/brainsweeping)$(action)Flay Mind/$ was built to sever but I understand it now, I can TWIST it, force the mind not $(o)out/$ but $(o)in/$, so long as the flesh is made ready to accept it -- $(l:items/potions)Clarity/$ should do the job. The mind can be folded into itself, crystallized in flesh and bone and nerve, until there is only ONE, mind-and-body superimposed in a single hybrid substrate.", "2": "Viscera suffused with micro-fractal splinters of cognition, living and thinking and-- USELESS! Nothing but a mass of meat and _media, in the end.$(br2)But the nerves... the nerves become conduits, skeins of thought reified in shimmering fiber. These I can USE. Free them from the flesh and they are $(o)mine/$.$(br2)I could weave them into myself -- more $(o)space/$ to think in -- no. I am not being rational.", - "3": "Any villager will do, though a more developed mind will provide a higher yield.$(br2)The process itself is simple: apply $(l:items/potions)Clarity/$ to render the body receptive, cast $(l:greatwork/brainsweeping)$(action)Flay Mind/$ with the $(l:patterns/basics#hexcasting:entity_pos/eye)$(action)subject’s own head/$ as the destination, then dissect to harvest the fiber. I wonder... does it understand, even excised? Does it feel?", + "3": "The process itself is simple: apply $(l:items/potions)Clarity/$ to render the body receptive, cast $(l:greatwork/brainsweeping)$(action)Flay Mind/$ with the $(l:patterns/basics#hexcasting:entity_pos/eye)$(action)subject’s own head/$ as the destination, then dissect to harvest the fiber. Any villager will do, though a more developed mind will provide a higher yield.$(br2)I wonder... does it understand, even excised? Does it feel?", mesh: "The fibers have a natural affinity for bone. Woven into such a frame, I can affix them to $(thing)Budding Amethyst/$ to provide additional paths for the flow of media, accelerating growth. However, covering too many faces seems to reduce overall production efficiency.", }, + + caster_robes: { + "1": "With $(l:greatwork/neural_fiber)Neural Fiber/$, I finally have the key to augmenting my own skill! Robes woven from the fibers streamline the _media around me -- I can cast further, cheaper, $(o)greater/$.$(br2)But I would not settle for that alone. With these robes I can think $(o)outside/$ myself, mind shared between thinking flesh and thinking fabric, threads woven as thoughts are woven as Nature is-- ENOUGH.", + "2": "So long as I wear the full set of robes, I gain the ability to $(o)pan/$ the hex grid with right-click. This vastly expands the number of patterns I can draw at once, though not without risks. Drifting further into this mental space pulls my awareness away from my body -- go too far, and I might even forget to breathe.$(br2)The nature of the robes also renders them receptive to $(l:patterns/spells/cyclevariant)$(action)Caster's Glamour/$, should I wish to style myself differently.",//499 + }, "fanciful_staves.1": "It is only right as I shed the husk of ignorance I replace my tools, my palm-polished staves. These new constructions of mine have no additional properties -- but they are so glorious, oh so Glorious... They match the radiance winking at the corners of my sight.", diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/caster_robes.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/caster_robes.json new file mode 100644 index 0000000000..7556b6bb9c --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/caster_robes.json @@ -0,0 +1,28 @@ +{ + "name": "hexcasting.entry.caster_robes", + "category": "hexcasting:greatwork", + "icon": "hexcasting:robes/hood", + "advancement": "hexcasting:enlightenment", + "entry_color": "54398a", + "sortnum": 7, + "pages": [ + { + "type": "patchouli:text", + "text": "hexcasting.page.caster_robes.1" + }, + { + "type": "patchouli:text", + "text": "hexcasting.page.caster_robes.2" + }, + { + "type": "patchouli:crafting", + "recipe": "hexcasting:robes/hood", + "recipe2": "hexcasting:robes/tunic" + }, + { + "type": "patchouli:crafting", + "recipe": "hexcasting:robes/legs", + "recipe2": "hexcasting:robes/boots" + } + ] +} \ No newline at end of file diff --git a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json index acf1258240..2ea6b1c99d 100644 --- a/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json @@ -17,7 +17,8 @@ { "type": "patchouli:spotlight", "item": "hexcasting:neural_fiber", - "text": "hexcasting.page.neural_fiber.3" + "text": "hexcasting.page.neural_fiber.3", + "link_recipe": true }, { "type": "patchouli:crafting", From 1f511cca5b2af21b6ccc50dd2725d4074bd1604d Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 8 Sep 2026 02:59:33 -0400 Subject: [PATCH 43/45] Assorted cleanup --- .../at/petrak/hexcasting/client/gui/GuiSpellcasting.kt | 7 +++---- .../petrak/hexcasting/common/blocks/BlockNeuralMesh.java | 6 ++---- .../java/at/petrak/hexcasting/mixin/MixinLivingEntity.java | 4 ++-- .../assets/hexcasting/models/block/neural_mesh.json | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index b49fa175a1..853c383050 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -224,17 +224,16 @@ class GuiSpellcasting constructor( } override fun mouseDragged(mxOut: Double, myOut: Double, pButton: Int, pDragX: Double, pDragY: Double): Boolean { - if (super.mouseDragged(mxOut, myOut, pButton, pDragX, pDragY)) { + if (super.mouseDragged(mxOut, myOut, pButton, pDragX, pDragY)) return true - } - if (HexConfig.client().clickingTogglesDrawing()) - return false if (pButton == HexConfig.client().gridPanMouseButton() && this.drawState is PatternDrawState.BetweenPatterns && this.panningAllowed ) { return panGrid(pDragX, pDragY) } + if (HexConfig.client().clickingTogglesDrawing()) + return false return drawMove(mxOut, myOut) } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java index c37408064f..76e97d16ee 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/blocks/BlockNeuralMesh.java @@ -3,12 +3,10 @@ import at.petrak.hexcasting.common.lib.HexBlocks; import at.petrak.hexcasting.common.lib.HexItems; import com.mojang.serialization.MapCodec; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; -import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; @@ -20,7 +18,6 @@ public class BlockNeuralMesh extends MultifaceBlock { public static final MapCodec CODEC = simpleCodec(BlockNeuralMesh::new); - private final MultifaceSpreader spreader = new MultifaceSpreader(this); public MapCodec codec() { return CODEC; @@ -30,8 +27,9 @@ public BlockNeuralMesh(BlockBehaviour.Properties arg) { super(arg); } + @Override public MultifaceSpreader getSpreader() { - return this.spreader; + throw new UnsupportedOperationException("Neural mesh is not capable of spreading"); } @Override diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java index 38d215f17c..e10238f190 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java @@ -35,11 +35,11 @@ private void dropCrystallizedLoot(CallbackInfo ci) { } @Inject(method = "increaseAirSupply", at = @At("HEAD"), cancellable = true) - private void forgetToBreathe(int i, CallbackInfoReturnable cir) { + private void forgetToBreathe(int currentAir, CallbackInfoReturnable cir) { var self = (LivingEntity) (Object) this; var inst = self.getEffect(HexMobEffects.DISSOCIATION); if (inst != null && DissociationEffect.shouldPreventBreathing(inst.getDuration(), inst.getAmplifier())) { - cir.setReturnValue(i); + cir.setReturnValue(currentAir); } } } diff --git a/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json b/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json index 1c6b45d6ea..0d4d773748 100644 --- a/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json +++ b/Common/src/main/resources/assets/hexcasting/models/block/neural_mesh.json @@ -1,7 +1,7 @@ { "ambientocclusion": false, "textures": { - "particle": "hexcasting:block/slate", + "particle": "hexcasting:item/neural_mesh", "neural_mesh": "hexcasting:block/neural_mesh" }, "render_type": "cutout", From 66bd207d60c3226f1c1fc452dcc52e2bed03e661 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 8 Sep 2026 13:06:50 -0400 Subject: [PATCH 44/45] Allow drawing with grid-pan button if panning isn't enabled --- .../java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index 853c383050..deb3a3584a 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -180,7 +180,7 @@ class GuiSpellcasting constructor( if (super.mouseClicked(mxOut, myOut, pButton)) { return true } - if (pButton == HexConfig.client().gridPanMouseButton()) + if (pButton == HexConfig.client().gridPanMouseButton() && this.panningAllowed) return false if (HexConfig.client().clickingTogglesDrawing()) { return if (this.drawState is PatternDrawState.BetweenPatterns) @@ -326,7 +326,7 @@ class GuiSpellcasting constructor( } if (HexConfig.client().clickingTogglesDrawing()) return false - if (pButton == HexConfig.client().gridPanMouseButton()) + if (pButton == HexConfig.client().gridPanMouseButton() && this.panningAllowed) return false return drawEnd() } From df2d53b082ee54b350d9d4c4e4082498e2a734ee Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 8 Sep 2026 14:51:03 -0400 Subject: [PATCH 45/45] Update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a85dd9a36f..8c5d2fa9d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Added - Updated to Minecraft 1.21.1 ([#985](https://github.com/FallingColors/HexMod/pull/985)) @SuperKnux @slava110 +- Added Neural Fiber, a new endgame material harvested from villagers using a modified mindflaying process ([#1292](https://github.com/FallingColors/HexMod/pull/1292)) @Robotgiggle @Falkory220 +- Added Neural Mesh, a multipart block which can be attached to Budding Amethyst to make it grow faster ([#1292](https://github.com/FallingColors/HexMod/pull/1292)) @Robotgiggle +- Added Grand Caster Robes, a hex-based armor set with a variety of abilities ([#1292](https://github.com/FallingColors/HexMod/pull/1292)) @Robotgiggle @Falkory220 + - Provides defense values midway between iron and diamond + - Provides the scrying lens effect, increased ambit, and a casting cost discount + - Allows you to pan the hex grid to fit in significantly more patterns - Added Simulate, which causes the next pattern drawn to be simulated (to check for mishaps) rather than executed ([#1194](https://github.com/FallingColors/HexMod/pull/1194)) @Robotgiggle - Added the `hex_unbreakable` tag for blocks that should be immune to Break Block regardless of the configured mining tier ([#1186](https://github.com/FallingColors/HexMod/pull/1186)) @Robotgiggle @slava110 - Added a new Ancient Cypher hex that impulses nearby items towards the caster ([#1106](https://github.com/FallingColors/HexMod/pull/1106)) @IridescentVoid