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/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/casting/actions/spells/great/OpBrainsweep.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/spells/great/OpBrainsweep.kt index e4ff09fdc2..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 @@ -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,12 @@ 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.AbstractVillager 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 +60,17 @@ object OpBrainsweep : SpellAction { if (IXplatAbstractions.INSTANCE.isBrainswept(sacrifice)) throw MishapAlreadyBrainswept(sacrifice) + // special behavior for crystallization + 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, + listOf(ParticleSpray.burst(Vec3.atCenterOf(pos), 1.0)) + ) + } + val state = env.world.getBlockState(pos) val recman = env.world.recipeManager @@ -89,4 +108,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) + } + } } 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/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..a471511be3 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 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 ROBES_HOOD = make("robes/hood", () -> new ItemRobes(ArmorItem.Type.HELMET, unstackable().rarity(Rarity.UNCOMMON))); + public static final Supplier ROBES_TUNIC = make("robes/tunic", () -> new ItemRobes(ArmorItem.Type.CHESTPLATE, unstackable().rarity(Rarity.UNCOMMON))); + public static final Supplier ROBES_LEGS = make("robes/legs", () -> new ItemRobes(ArmorItem.Type.LEGGINGS, unstackable().rarity(Rarity.UNCOMMON))); + public static final Supplier ROBES_BOOTS = make("robes/boots", () -> new ItemRobes(ArmorItem.Type.BOOTS, unstackable().rarity(Rarity.UNCOMMON))); public static final Supplier ABACUS = make("abacus", () -> new ItemAbacus(unstackable())); public static final Supplier THOUGHT_KNOT = make("thought_knot", () -> new ItemThoughtKnot(unstackable())); @@ -106,6 +106,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 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)); 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..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 @@ -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("crystallized", + () -> 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/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/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinLivingEntity.java index c3dbc47b81..4b85154bc5 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,40 @@ 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) { + // 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 58045bf734..2ca034e0fe 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,7 @@ abacus: "Abacus", jeweler_hammer: "Jeweler's Hammer", sub_sandwich: "Submarine Sandwich", + neural_fiber: "Neural Fiber", robes: { hood: "Grand Caster Hood", @@ -71,7 +72,7 @@ "legs.2": "Grand Caster Leggings", boots: "Grand Caster Boots", }, - + dye_colorizer_: { white: "White Pigment", orange: "Orange Pigment", @@ -134,7 +135,7 @@ "block.hexcasting": { conjured_light: "Conjured Light", conjured_block: "Conjured Block", - + directrix: { empty: "Empty Directrix", redstone: "Mason Directrix", @@ -228,6 +229,7 @@ "effect.hexcasting": { enlarge_grid: "Clarity", shrink_grid: "Clouding", + crystallized: "Crystallized" }, "item.minecraft.potion.effect": { @@ -1326,6 +1328,7 @@ directrix: "Directrices", akashiclib: "Akashic Libraries", quenching_allays: "Quenching Allays", + neural_fiber: "Neural Inversion", fanciful_staves: "Fanciful Staves", // and the actions @@ -1785,7 +1788,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: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": "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?", + }, "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/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 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..d283b0c651 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..1c085ec08c --- /dev/null +++ b/Common/src/main/resources/assets/hexcasting/patchouli_books/thehexbook/en_us/entries/greatwork/neural_fiber.json @@ -0,0 +1,23 @@ +{ + "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:text", + "text": "hexcasting.page.neural_fiber.2" + }, + { + "type": "patchouli:spotlight", + "item": "hexcasting:neural_fiber", + "text": "hexcasting.page.neural_fiber.3" + } + ] +} \ No newline at end of file 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 0000000000..9494392dd6 Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/item/neural_fiber.png differ 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 0000000000..b4e4f6d2bf Binary files /dev/null and b/Common/src/main/resources/assets/hexcasting/textures/mob_effect/crystallized.png differ 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", 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 8e7f349111..ab0e8b6a27 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"),