From 413ee7c1e3d0a878ef3636c61efdd90b391adfe6 Mon Sep 17 00:00:00 2001 From: Dakota Date: Tue, 25 Feb 2025 15:32:30 -0600 Subject: [PATCH] 1.4.1 --- gradle.properties | 2 +- .../hibernalherbs/HibernalHerbsMod.java | 112 ++++++++++- .../hibernalherbs/client/ClientEvents.java | 23 +++ .../effect/BasicStatusEffect.java | 4 + .../effect/InstabilityStatusEffect.java | 74 +++++++ .../effect/ShriekingStatusEffect.java | 62 ++++++ .../effect/SwarmingStatusEffect.java | 64 ++++++ .../emi/HibernalHerbsEmiPlugin.java | 10 + .../hibernalherbs/init/BlockInit.java | 8 +- .../hibernalherbs/init/FeaturesInit.java | 4 +- .../hibernalherbs/init/ItemGroupInit.java | 190 +++++++++++++++++- .../hibernalherbs/init/ItemInit.java | 6 + .../hibernalherbs/init/ParticleTypeInit.java | 25 +++ .../hibernalherbs/init/PotionsInit.java | 46 +++++ .../hibernalherbs/init/StatusEffectInit.java | 15 +- .../init/enum_registry/Archaeology.java | 2 +- .../init/enum_registry/tag/Tags.java | 3 +- .../item/EnigmaticPotionItem.java | 99 +++++++++ .../item/SorcererAgglomerationItem.java | 3 + .../hibernalherbs/item/SorcererTomeItem.java | 3 + .../hibernalherbs/item/TimeOfDayPotion.java | 128 ++++++++++++ .../hibernalherbs/mixin/MaceItemMixin.java | 30 +++ .../resources/META-INF/accesstransformer.cfg | 6 +- .../assets/hibernalherbs/lang/en_us.json | 126 +++++++++++- .../models/item/enigmatic_potion.json | 7 + .../models/item/lunar_potion.json | 7 + .../models/item/solar_potion.json | 7 + .../hibernalherbs/particles/instability.json | 5 + .../hibernalherbs/particles/shrieking.json | 5 + .../hibernalherbs/particles/swarming.json | 5 + .../grimoire/en_us/categories/brewing.json | 6 + .../en_us/categories/herb_reproduction.json | 3 +- .../grimoire/en_us/categories/herbs.json | 3 +- .../mystical_campfire_conversion.json | 3 +- .../en_us/categories/sin_alignments.json | 3 +- .../en_us/categories/sorcerer_books.json | 3 +- .../grimoire/en_us/categories/utilities.json | 3 +- .../entries/brewing/enigmatic_potions.json | 27 +++ .../brewing/time_dependent_potions.json | 31 +++ .../grimoire/en_us/templates/brewing.json | 58 ++++++ .../grimoire/en_us/templates/brewing2.json | 96 +++++++++ .../textures/item/mysterious_potion.png | Bin 0 -> 187 bytes .../item/mysterious_potion_overlay.png | Bin 0 -> 157 bytes .../textures/item/time_potion.png | Bin 0 -> 185 bytes .../textures/item/time_potion_overlay.png | Bin 0 -> 153 bytes .../textures/mob_effect/instability.png | Bin 0 -> 205 bytes .../textures/mob_effect/shrieking.png | Bin 0 -> 331 bytes .../textures/mob_effect/swarming.png | Bin 0 -> 316 bytes .../textures/particle/instability.png | Bin 0 -> 96 bytes .../textures/particle/shrieking.png | Bin 0 -> 112 bytes .../textures/particle/swarming.png | Bin 0 -> 132 bytes .../item/acceptable_potions_for_brewing.json | 7 + .../loot_modifiers/lingering_potions.json | 10 + .../loot_modifiers/ominous_vault_loot.json | 10 + .../modifiers/lingering_potions.json | 75 +++++++ .../modifiers/ominous_vault_loot.json | 25 +++ .../arcane_ruins/common.json | 2 +- .../{chests => vaults}/arcane_ruins/rare.json | 37 +++- .../patchouli_books/grimoire/book.json | 2 +- .../recipe/sorcerer_agglomeration_reset.json | 5 + .../hibernalherbs/recipe/sorcerer_tome.json | 5 + .../hibernalherbs/structure/arcane_ruins.nbt | Bin 27842 -> 32016 bytes .../tags/enchantment/harvests_life_force.json | 3 +- .../loot_modifiers/global_loot_modifiers.json | 7 + src/main/resources/hibernalherbs.mixins.json | 3 +- 65 files changed, 1476 insertions(+), 32 deletions(-) create mode 100644 src/main/java/net/dakotapride/hibernalherbs/effect/InstabilityStatusEffect.java create mode 100644 src/main/java/net/dakotapride/hibernalherbs/effect/ShriekingStatusEffect.java create mode 100644 src/main/java/net/dakotapride/hibernalherbs/effect/SwarmingStatusEffect.java create mode 100644 src/main/java/net/dakotapride/hibernalherbs/init/ParticleTypeInit.java create mode 100644 src/main/java/net/dakotapride/hibernalherbs/init/PotionsInit.java create mode 100644 src/main/java/net/dakotapride/hibernalherbs/item/EnigmaticPotionItem.java create mode 100644 src/main/java/net/dakotapride/hibernalherbs/item/TimeOfDayPotion.java create mode 100644 src/main/java/net/dakotapride/hibernalherbs/mixin/MaceItemMixin.java create mode 100644 src/main/resources/assets/hibernalherbs/models/item/enigmatic_potion.json create mode 100644 src/main/resources/assets/hibernalherbs/models/item/lunar_potion.json create mode 100644 src/main/resources/assets/hibernalherbs/models/item/solar_potion.json create mode 100644 src/main/resources/assets/hibernalherbs/particles/instability.json create mode 100644 src/main/resources/assets/hibernalherbs/particles/shrieking.json create mode 100644 src/main/resources/assets/hibernalherbs/particles/swarming.json create mode 100644 src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/brewing.json create mode 100644 src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/entries/brewing/enigmatic_potions.json create mode 100644 src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/entries/brewing/time_dependent_potions.json create mode 100644 src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/templates/brewing.json create mode 100644 src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/templates/brewing2.json create mode 100644 src/main/resources/assets/hibernalherbs/textures/item/mysterious_potion.png create mode 100644 src/main/resources/assets/hibernalherbs/textures/item/mysterious_potion_overlay.png create mode 100644 src/main/resources/assets/hibernalherbs/textures/item/time_potion.png create mode 100644 src/main/resources/assets/hibernalherbs/textures/item/time_potion_overlay.png create mode 100644 src/main/resources/assets/hibernalherbs/textures/mob_effect/instability.png create mode 100644 src/main/resources/assets/hibernalherbs/textures/mob_effect/shrieking.png create mode 100644 src/main/resources/assets/hibernalherbs/textures/mob_effect/swarming.png create mode 100644 src/main/resources/assets/hibernalherbs/textures/particle/instability.png create mode 100644 src/main/resources/assets/hibernalherbs/textures/particle/shrieking.png create mode 100644 src/main/resources/assets/hibernalherbs/textures/particle/swarming.png create mode 100644 src/main/resources/data/c/tags/item/acceptable_potions_for_brewing.json create mode 100644 src/main/resources/data/hibernalherbs/loot_modifiers/lingering_potions.json create mode 100644 src/main/resources/data/hibernalherbs/loot_modifiers/ominous_vault_loot.json create mode 100644 src/main/resources/data/hibernalherbs/loot_table/modifiers/lingering_potions.json create mode 100644 src/main/resources/data/hibernalherbs/loot_table/modifiers/ominous_vault_loot.json rename src/main/resources/data/hibernalherbs/loot_table/{chests => vaults}/arcane_ruins/common.json (98%) rename src/main/resources/data/hibernalherbs/loot_table/{chests => vaults}/arcane_ruins/rare.json (78%) create mode 100644 src/main/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json diff --git a/gradle.properties b/gradle.properties index 05637a4c..6cb32bc9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,7 +34,7 @@ mod_name=Hibernal Herbs # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=MIT # The mod version. See https://semver.org/ -mod_version=1.4 +mod_version=1.4.1 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/java/net/dakotapride/hibernalherbs/HibernalHerbsMod.java b/src/main/java/net/dakotapride/hibernalherbs/HibernalHerbsMod.java index 43e71f42..065dcd9d 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/HibernalHerbsMod.java +++ b/src/main/java/net/dakotapride/hibernalherbs/HibernalHerbsMod.java @@ -5,22 +5,37 @@ import net.dakotapride.hibernalherbs.init.enum_registry.*; import net.dakotapride.hibernalherbs.init.enum_registry.tag.Tags; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionBrewing; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.level.storage.loot.BuiltInLootTables; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.functions.SetPotionFunction; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.LootTableLoadEvent; +import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; import net.neoforged.neoforge.event.server.ServerStartingEvent; import org.slf4j.Logger; +import java.util.List; + // The value here should match an entry in the META-INF/neoforge.mods.toml file @Mod(HibernalHerbsMod.MOD_ID) public class HibernalHerbsMod { // Define mod id in a common place for everything to reference public static final String MOD_ID = "hibernalherbs"; // Directly reference a slf4j logger - private static final Logger LOGGER = LogUtils.getLogger(); + public static final Logger LOGGER = LogUtils.getLogger(); // The constructor for the mod class is the first code that is run when your mod is loaded. // FML will recognize some parameter types like IEventBus or ModContainer and pass them in automatically. @@ -38,10 +53,12 @@ public HibernalHerbsMod(IEventBus modEventBus, ModContainer modContainer) { EntityTypeInit.register(modEventBus); RecipeInit.register(modEventBus); StatusEffectInit.register(modEventBus); + PotionsInit.register(modEventBus); ItemGroupInit.register(modEventBus); EnchantmentKeys.load(); StructureKeys.load(); + ParticleTypeInit.load(modEventBus); DataComponentInit.load(modEventBus); StatsInit.load(modEventBus); CriteriaTriggersInit.load(modEventBus); @@ -92,10 +109,103 @@ public static ResourceLocation asResource(String id) { private void commonSetup(final FMLCommonSetupEvent event) {} +// @SubscribeEvent +// public void lootTableEvents(LootTableLoadEvent event) { +//// if (event.getTable().getLootTableId().equals(BuiltInLootTables.SPAWNER_TRIAL_ITEMS_TO_DROP_WHEN_OMINOUS)) { +//// LootPool swarming_potion = LootPool.lootPool() +//// .setRolls(ConstantValue.exactly(1)) +//// .when(LootItemRandomChanceCondition.randomChance(1.00F))//0.15 +//// .add( +//// LootItem.lootTableItem(Items.LINGERING_POTION) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// .apply(SetPotionFunction.setPotion(PotionsInit.SWARMING)) +//// ) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))).build(); +//// LootPool instability_potion = LootPool.lootPool() +//// .setRolls(ConstantValue.exactly(1)) +//// .when(LootItemRandomChanceCondition.randomChance(0.05F))//0.05 +//// .add( +//// LootItem.lootTableItem(Items.LINGERING_POTION) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// .apply(SetPotionFunction.setPotion(PotionsInit.INSTABILITY)) +//// ) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))).build(); +//// LootPool shrieking_potion = LootPool.lootPool() +//// .setRolls(ConstantValue.exactly(1)) +//// .when(LootItemRandomChanceCondition.randomChance(0.35F))//0.35 +//// .add( +//// LootItem.lootTableItem(Items.LINGERING_POTION) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// .apply(SetPotionFunction.setPotion(PotionsInit.SHRIEKING)) +//// ) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))).build(); +//// +//// event.setTable((LootTable) List.of(swarming_potion, instability_potion, shrieking_potion)); +//// } +// +//// if (event.getTable().getLootTableId().equals(BuiltInLootTables.TRIAL_CHAMBERS_REWARD_OMINOUS_UNIQUE)) { +//// LootPool herbal_sigils = LootPool.lootPool() +//// .setRolls(ConstantValue.exactly(1)) +//// .when(LootItemRandomChanceCondition.randomChance(0.35F))//35% +//// .add( +//// LootItem.lootTableItem(HerbalSigilTypes.PRIDE.getHerbalSigilItem()) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// ) +//// .add( +//// LootItem.lootTableItem(HerbalSigilTypes.ENVY.getHerbalSigilItem()) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// ) +//// .add( +//// LootItem.lootTableItem(HerbalSigilTypes.WRATH.getHerbalSigilItem()) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// ) +//// .add( +//// LootItem.lootTableItem(HerbalSigilTypes.GREED.getHerbalSigilItem()) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// ) +//// .add( +//// LootItem.lootTableItem(HerbalSigilTypes.GLUTTONY.getHerbalSigilItem()) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// ) +//// .add( +//// LootItem.lootTableItem(HerbalSigilTypes.SLOTH.getHerbalSigilItem()) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// ) +//// .add( +//// LootItem.lootTableItem(HerbalSigilTypes.LUST.getHerbalSigilItem()) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1.0F))) +//// ) +//// .apply(SetItemCountFunction.setCount(ConstantValue.exactly(1))).build(); +//// +//// event.setTable((LootTable) List.of(herbal_sigils)); +//// } +// } + // You can use SubscribeEvent and let the Event Bus discover methods to call @SubscribeEvent public void onServerStarting(ServerStartingEvent event) { // Do something when the server starts //LOGGER.info("HELLO from server starting"); } + + @SubscribeEvent + public void onBrewingRecipeRegister(RegisterBrewingRecipesEvent event) { + PotionBrewing.Builder builder = event.getBuilder(); + + builder.addContainer(ItemInit.ENIGMATIC_POTION.asItem()); + builder.addContainer(ItemInit.SOLAR_POTION.asItem()); + builder.addContainer(ItemInit.LUNAR_POTION.asItem()); + + builder.addMix(Potions.AWKWARD, HerbTypes.SAGE.getDriedHerb(), PotionsInit.FROST_RESISTANCE); + + builder.addMix(Potions.AWKWARD, Items.BEE_NEST, PotionsInit.SWARMING); + builder.addMix(Potions.AWKWARD, Items.END_ROD, PotionsInit.INSTABILITY); + builder.addMix(Potions.AWKWARD, Items.SCULK_SHRIEKER, PotionsInit.SHRIEKING); + + builder.addContainerRecipe(Items.POTION, ItemInit.MYSTICAL_ASHES.get(), ItemInit.ENIGMATIC_POTION.get()); + builder.addContainerRecipe(Items.POTION, Items.CLOCK, ItemInit.SOLAR_POTION.get()); + builder.addContainerRecipe(ItemInit.SOLAR_POTION.get(), Items.SCULK, ItemInit.LUNAR_POTION.get()); + + HibernalHerbsMod.LOGGER.info("[Hibernal Herbs Dev Environment] POTION RECIPES REGISTRAR"); + } } diff --git a/src/main/java/net/dakotapride/hibernalherbs/client/ClientEvents.java b/src/main/java/net/dakotapride/hibernalherbs/client/ClientEvents.java index 0cfd2724..5444493c 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/client/ClientEvents.java +++ b/src/main/java/net/dakotapride/hibernalherbs/client/ClientEvents.java @@ -4,13 +4,17 @@ import net.dakotapride.hibernalherbs.entity.render.ModBoatRenderer; import net.dakotapride.hibernalherbs.init.BlockEntityTypeInit; import net.dakotapride.hibernalherbs.init.EntityTypeInit; +import net.dakotapride.hibernalherbs.init.ItemInit; +import net.dakotapride.hibernalherbs.init.ParticleTypeInit; import net.dakotapride.hibernalherbs.init.enum_registry.FrozeBlockstates; import net.dakotapride.hibernalherbs.init.enum_registry.WoodTypes; import net.dakotapride.hibernalherbs.item.HerbalPadlockItem; import net.minecraft.Util; +import net.minecraft.client.color.item.ItemColors; import net.minecraft.client.model.BoatModel; import net.minecraft.client.model.ChestBoatModel; import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.particle.SpellParticle; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Sheets; @@ -19,6 +23,9 @@ import net.minecraft.client.renderer.blockentity.SignRenderer; import net.minecraft.client.renderer.entity.EntityRenderers; import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.component.DataComponents; +import net.minecraft.util.FastColor; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.block.Block; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; @@ -26,6 +33,8 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; +import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; import java.util.Map; @@ -51,6 +60,20 @@ public static void registerEntityModelLayers(EntityRenderersEvent.RegisterLayerD event.registerLayerDefinition(new ModelLayerLocation(asResource("chest_boat/myqueste"), "main"), ChestBoatModel::createBodyModel); } + @SubscribeEvent + public static void registerParticleRenderers(RegisterParticleProvidersEvent event) { + event.registerSpriteSet(ParticleTypeInit.SWARMING.get(), SpellParticle.Provider::new); + event.registerSpriteSet(ParticleTypeInit.INSTABILITY.get(), SpellParticle.Provider::new); + event.registerSpriteSet(ParticleTypeInit.SHRIEKING.get(), SpellParticle.Provider::new); + } + + @SubscribeEvent + public static void registerColourHandlers(RegisterColorHandlersEvent.Item event) { + event.register((itemStack, i) -> i > 0 ? -1 : FastColor.ARGB32.opaque( + itemStack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY).getColor()), + ItemInit.ENIGMATIC_POTION, ItemInit.SOLAR_POTION, ItemInit.LUNAR_POTION); + } + @SubscribeEvent public static void clientSetup(final FMLClientSetupEvent event) { // ItemProperties.register(ItemRegistry.CANISTER.get(), new ResourceLocation(MOD_ID, "filled"), diff --git a/src/main/java/net/dakotapride/hibernalherbs/effect/BasicStatusEffect.java b/src/main/java/net/dakotapride/hibernalherbs/effect/BasicStatusEffect.java index ad8f4a36..af726dcb 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/effect/BasicStatusEffect.java +++ b/src/main/java/net/dakotapride/hibernalherbs/effect/BasicStatusEffect.java @@ -1,5 +1,6 @@ package net.dakotapride.hibernalherbs.effect; +import net.minecraft.core.particles.ParticleOptions; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; @@ -8,5 +9,8 @@ public BasicStatusEffect(MobEffectCategory category, int colour) { super(category, colour); } + public BasicStatusEffect(MobEffectCategory category, int colour, ParticleOptions particleOptions) { + super(category, colour, particleOptions); + } } diff --git a/src/main/java/net/dakotapride/hibernalherbs/effect/InstabilityStatusEffect.java b/src/main/java/net/dakotapride/hibernalherbs/effect/InstabilityStatusEffect.java new file mode 100644 index 00000000..4908af6c --- /dev/null +++ b/src/main/java/net/dakotapride/hibernalherbs/effect/InstabilityStatusEffect.java @@ -0,0 +1,74 @@ +package net.dakotapride.hibernalherbs.effect; + +import net.dakotapride.hibernalherbs.init.ParticleTypeInit; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.animal.Fox; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; + +public class InstabilityStatusEffect extends BasicStatusEffect { + public InstabilityStatusEffect(MobEffectCategory category, int colour) { + super(category, colour); + } + + @Override + public @NotNull ParticleOptions createParticleOptions(@NotNull MobEffectInstance effect) { + return ParticleTypeInit.INSTABILITY.get(); + } + + @Override + public boolean applyEffectTick(LivingEntity livingEntity, int j) { + Level level = livingEntity.level(); + + if (!level.isClientSide) { + for (int i = 0; i < 16; i++) { + double d = livingEntity.getX() + (livingEntity.getRandom().nextDouble() - 0.5) * 16.0; + double e = Mth.clamp( + livingEntity.getY() + (double)(livingEntity.getRandom().nextInt(16) - 8), + level.getMinBuildHeight(), + (level.getMinBuildHeight() + ((ServerLevel)level).getLogicalHeight() - 1) + ); + double f = livingEntity.getZ() + (livingEntity.getRandom().nextDouble() - 0.5) * 16.0; + if (livingEntity.isPassenger()) { + livingEntity.stopRiding(); + } + + Vec3 vec3 = livingEntity.position(); + if (livingEntity.randomTeleport(d, e, f, true)) { + level.gameEvent(GameEvent.TELEPORT, vec3, GameEvent.Context.of(livingEntity)); + SoundSource soundSource; + SoundEvent soundEvent; + if (livingEntity instanceof Fox) { + soundEvent = SoundEvents.FOX_TELEPORT; + soundSource = SoundSource.NEUTRAL; + } else { + soundEvent = SoundEvents.CHORUS_FRUIT_TELEPORT; + soundSource = SoundSource.PLAYERS; + } + + level.playSound(null, livingEntity.getX(), livingEntity.getY(), livingEntity.getZ(), soundEvent, soundSource); + livingEntity.resetFallDistance(); + break; + } + } + } + + return true; + } + + @Override + public boolean shouldApplyEffectTickThisTick(int i, int j) { + int k = 50 >> j; + return k > 0 ? i % k == 0 : true; + } +} diff --git a/src/main/java/net/dakotapride/hibernalherbs/effect/ShriekingStatusEffect.java b/src/main/java/net/dakotapride/hibernalherbs/effect/ShriekingStatusEffect.java new file mode 100644 index 00000000..f632e3fa --- /dev/null +++ b/src/main/java/net/dakotapride/hibernalherbs/effect/ShriekingStatusEffect.java @@ -0,0 +1,62 @@ +package net.dakotapride.hibernalherbs.effect; + +import net.dakotapride.hibernalherbs.init.ParticleTypeInit; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.util.SpawnUtil; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.monster.warden.Warden; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3f; + +public class ShriekingStatusEffect extends BasicStatusEffect { + private final float chanceToSpawn; + + public ShriekingStatusEffect(MobEffectCategory mobEffectCategory, int i, float f) { + super(mobEffectCategory, i); + this.chanceToSpawn = f; + } + + @Override + public @NotNull ParticleOptions createParticleOptions(@NotNull MobEffectInstance effect) { + return ParticleTypeInit.SHRIEKING.get(); + } + + @Override + public void onMobHurt(LivingEntity livingEntity, int i, DamageSource damageSource, float f) { + if (livingEntity.getRandom().nextFloat() <= this.chanceToSpawn) { + this.spawnWarden( + livingEntity.level(), livingEntity, livingEntity.getX(), livingEntity.getY() + (double)livingEntity.getBbHeight() / 2.0, livingEntity.getZ() + ); + } + } + + private void spawnWarden(Level level, LivingEntity livingEntity, double d, double e, double f) { + Warden warden = EntityType.WARDEN.create(level); + if (warden != null) { + //warden.setAggressive(true); + //warden.setTarget(livingEntity); + //SpawnUtil.trySpawnMob(EntityType.WARDEN, MobSpawnType.TRIGGERED, serverLevel, this.getBlockPos(), 20, 5, 6, SpawnUtil.Strategy.ON_TOP_OF_COLLIDER) + RandomSource randomSource = livingEntity.getRandom(); + float g = (float) (Math.PI / 2); + float h = Mth.randomBetween(randomSource, (float) (-Math.PI / 2), (float) (Math.PI / 2)); + Vector3f vector3f = livingEntity.getLookAngle().toVector3f().mul(0.3F).mul(1.0F, 1.5F, 1.0F).rotateY(h); + warden.moveTo(d, e, f, level.getRandom().nextFloat() * 360.0F, 0.0F); + warden.setDeltaMovement(new Vec3(vector3f)); + //level.addFreshEntity(warden); + if (level instanceof ServerLevel serverLevel) + SpawnUtil.trySpawnMob(EntityType.WARDEN, MobSpawnType.TRIGGERED, serverLevel, livingEntity.blockPosition(), 20, 5, 6, SpawnUtil.Strategy.ON_TOP_OF_COLLIDER); + warden.playSound(SoundEvents.WARDEN_HURT); + } + } +} diff --git a/src/main/java/net/dakotapride/hibernalherbs/effect/SwarmingStatusEffect.java b/src/main/java/net/dakotapride/hibernalherbs/effect/SwarmingStatusEffect.java new file mode 100644 index 00000000..4c722af6 --- /dev/null +++ b/src/main/java/net/dakotapride/hibernalherbs/effect/SwarmingStatusEffect.java @@ -0,0 +1,64 @@ +package net.dakotapride.hibernalherbs.effect; + +import net.dakotapride.hibernalherbs.init.ParticleTypeInit; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.animal.Bee; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3f; + +import java.util.function.ToIntFunction; + +public class SwarmingStatusEffect extends BasicStatusEffect { + private final float chanceToSpawn; + private final ToIntFunction spawnedCount; + + public SwarmingStatusEffect(MobEffectCategory mobEffectCategory, int i, float f, ToIntFunction toIntFunction) { + super(mobEffectCategory, i); + this.chanceToSpawn = f; + this.spawnedCount = toIntFunction; + } + + @Override + public @NotNull ParticleOptions createParticleOptions(@NotNull MobEffectInstance effect) { + return ParticleTypeInit.SWARMING.get(); + } + + @Override + public void onMobHurt(LivingEntity livingEntity, int i, DamageSource damageSource, float f) { + if (livingEntity.getRandom().nextFloat() <= this.chanceToSpawn) { + int j = this.spawnedCount.applyAsInt(livingEntity.getRandom()); + + for (int k = 0; k < j; k++) { + this.spawnBees( + livingEntity.level(), livingEntity, livingEntity.getX(), livingEntity.getY() + (double)livingEntity.getBbHeight() / 2.0, livingEntity.getZ() + ); + } + } + } + + private void spawnBees(Level level, LivingEntity livingEntity, double d, double e, double f) { + Bee bee = EntityType.BEE.create(level); + if (bee != null) { + bee.setAggressive(true); + bee.setTarget(livingEntity); + RandomSource randomSource = livingEntity.getRandom(); + float g = (float) (Math.PI / 2); + float h = Mth.randomBetween(randomSource, (float) (-Math.PI / 2), (float) (Math.PI / 2)); + Vector3f vector3f = livingEntity.getLookAngle().toVector3f().mul(0.3F).mul(1.0F, 1.5F, 1.0F).rotateY(h); + bee.moveTo(d, e, f, level.getRandom().nextFloat() * 360.0F, 0.0F); + bee.setDeltaMovement(new Vec3(vector3f)); + level.addFreshEntity(bee); + bee.playSound(SoundEvents.BEE_HURT); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/dakotapride/hibernalherbs/emi/HibernalHerbsEmiPlugin.java b/src/main/java/net/dakotapride/hibernalherbs/emi/HibernalHerbsEmiPlugin.java index eb664023..6320424c 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/emi/HibernalHerbsEmiPlugin.java +++ b/src/main/java/net/dakotapride/hibernalherbs/emi/HibernalHerbsEmiPlugin.java @@ -7,6 +7,7 @@ import dev.emi.emi.api.recipe.EmiRecipe; import dev.emi.emi.api.recipe.EmiRecipeCategory; import dev.emi.emi.api.render.EmiTexture; +import dev.emi.emi.api.stack.Comparison; import dev.emi.emi.api.stack.EmiIngredient; import dev.emi.emi.api.stack.EmiStack; import dev.emi.emi.recipe.EmiCookingRecipe; @@ -22,6 +23,7 @@ import net.dakotapride.hibernalherbs.item.SorcererTomeItem; import net.dakotapride.hibernalherbs.recipe.MysticalCampfireCookingRecipe; import net.minecraft.ChatFormatting; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; @@ -94,6 +96,14 @@ public void register(EmiRegistry registry) { registry.addCategory(UNFREEZING_STATE); registry.addCategory(REVERT_DETERIORATION); + Comparison potionComparison = Comparison.compareData(stack -> stack.get(DataComponents.POTION_CONTENTS)); + + //registry.setDefaultComparison(Items.POTION, potionComparison); + + registry.setDefaultComparison(ItemInit.ENIGMATIC_POTION.get(), potionComparison); + registry.setDefaultComparison(ItemInit.SOLAR_POTION.get(), potionComparison); + registry.setDefaultComparison(ItemInit.LUNAR_POTION.get(), potionComparison); + //registry.addRecipe(new EmiInfoRecipe(List.of(EmiIngredient.of(Ingredient.of(ItemInit.LIFE_FORCE_BOTTLE))), List.of(Component.translatable("emi.hibernalherbs.information.life_force"), Component.translatable("emi.hibernalherbs.information.life_force.usage"), Component.translatable("emi.hibernalherbs.information.life_force.slashing")), HibernalHerbsMod.asResource("life_force"))); // Add all the workstations your category uses diff --git a/src/main/java/net/dakotapride/hibernalherbs/init/BlockInit.java b/src/main/java/net/dakotapride/hibernalherbs/init/BlockInit.java index 4363387d..26072a53 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/init/BlockInit.java +++ b/src/main/java/net/dakotapride/hibernalherbs/init/BlockInit.java @@ -7,12 +7,14 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; import java.util.function.Supplier; +import java.util.function.ToIntFunction; public class BlockInit { public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(HibernalHerbsMod.MOD_ID); @@ -27,7 +29,11 @@ public class BlockInit { public static DeferredBlock MYSTICAL_CAMPFIRE = register("mystical_campfire", () -> new MysticalCampfireBlock(true, 10, BlockBehaviour.Properties.ofFullCopy(Blocks.CAMPFIRE).noOcclusion())); public static DeferredBlock INCENSE_PROVIDER = register("incense_provider", - () -> new IncenseProviderBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_SLAB).noOcclusion().lightLevel(l -> 7).requiresCorrectToolForDrops())); + () -> new IncenseProviderBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STONE_SLAB).noOcclusion().lightLevel(incenseLightEmission(7)).requiresCorrectToolForDrops())); + + public static ToIntFunction incenseLightEmission(int i) { + return blockState -> blockState.getValue(PropertiesInit.FED) ? i : 0; + } // Collective Registration public static void register(IEventBus bus) { diff --git a/src/main/java/net/dakotapride/hibernalherbs/init/FeaturesInit.java b/src/main/java/net/dakotapride/hibernalherbs/init/FeaturesInit.java index d7bcb3c8..556ab9e8 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/init/FeaturesInit.java +++ b/src/main/java/net/dakotapride/hibernalherbs/init/FeaturesInit.java @@ -10,8 +10,8 @@ public class FeaturesInit { public static final ResourceKey> MYQUESTE_CONFIGURED = registerConfiguredFeature("myqueste"); public static final ResourceKey> HERBS_CONFIGURED = registerConfiguredFeature("herbs"); - public static final ResourceKey MYQUESTE_PLACED = registerPlacedFeature("myqueste_placed"); - public static final ResourceKey HERBS_PLACED = registerPlacedFeature("herbs_placed"); + public static final ResourceKey MYQUESTE_PLACED = registerPlacedFeature("myqueste"); + public static final ResourceKey HERBS_PLACED = registerPlacedFeature("herbs"); public static ResourceKey> registerConfiguredFeature(String name) { return ResourceKey.create(Registries.CONFIGURED_FEATURE, HibernalHerbsMod.asResource(name)); diff --git a/src/main/java/net/dakotapride/hibernalherbs/init/ItemGroupInit.java b/src/main/java/net/dakotapride/hibernalherbs/init/ItemGroupInit.java index 54da37ed..fb554b6d 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/init/ItemGroupInit.java +++ b/src/main/java/net/dakotapride/hibernalherbs/init/ItemGroupInit.java @@ -1,12 +1,16 @@ package net.dakotapride.hibernalherbs.init; import net.dakotapride.hibernalherbs.HibernalHerbsMod; -import net.dakotapride.hibernalherbs.init.enum_registry.Sickles; +import net.dakotapride.hibernalherbs.init.enum_registry.*; +import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; +import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionContents; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; @@ -19,12 +23,190 @@ public class ItemGroupInit { public static final Supplier HIBERNAL_HERBS_TAB = CREATIVE_MODE_TABS.register("hibernal_herbs", () -> CreativeModeTab.builder().icon(() -> new ItemStack(Sickles.ARKONIUM.getSickleItem())) .title(Component.translatable("creativetab.hibernalherbs.hibernal_herbs")) - .displayItems((itemDisplayParameters, output) -> { - for (DeferredHolder items : ItemInit.ITEMS.getEntries()) { - output.accept(items.get()); + .displayItems((displayContext, entries) -> { +// for (Item item : ItemInit.ITEMS.stream().toList()) { +// entries.accept(item); +// } + + entries.accept(ItemInit.GROUND_HERBS); + entries.accept(ItemInit.LIFE_FORCE_BOTTLE); + entries.accept(ItemInit.INSCRIPTION_SMITHING_TEMPLATE); + entries.accept(ItemInit.BLANK_HERBAL_SIGIL); + entries.accept(ItemInit.CRACKED_HERBAL_SIGIL); + entries.accept(ItemInit.SILIPTIUM_PETALS); + entries.accept(ItemInit.LUMBINETRIK_PETALS); + entries.accept(ItemInit.JULISIUM_PETALS); + entries.accept(ItemInit.GRIMOIRE); + entries.accept(ItemInit.SINGED_GRIMOIRE); + entries.accept(ItemInit.SORCERER_AGGLOMERATION); + entries.accept(ItemInit.SORCERER_TOME); + entries.accept(ItemInit.MYSTICAL_ASHES); + entries.accept(ItemInit.VILE_ASHES); + entries.accept(ItemInit.VIRTUOUS_ASHES); + entries.accept(BlockInit.SACRIFICIAL_RUNE_BLOCK); + entries.accept(BlockInit.FROZE_STATE_SACRIFICIAL_RUNE_BLOCK); + entries.accept(BlockInit.DETERIORATED_SACRIFICIAL_RUNE_BLOCK); + entries.accept(BlockInit.MYSTICAL_CAMPFIRE); + entries.accept(BlockInit.INCENSE_PROVIDER); + + for (HerbTypes types : HerbTypes.values()) { + entries.accept(types.getBaseBlock()); + entries.accept(types.getPoundedHerbBlock()); + entries.accept(types.getDriedHerbBlock()); + entries.accept(types.getPoundedHerb()); + entries.accept(types.getDriedHerb()); + entries.accept(types.getLanternBlock()); + entries.accept(types.getHerbPileBlock()); + entries.accept(types.getHerbBarrelBlock()); } + + for (HerbalBlendTypes types : HerbalBlendTypes.values()) { + if (types != HerbalBlendTypes.NONE) { + entries.accept(types.getHerbalBlend()); + } + } + + for (HerbalSigilTypes types : HerbalSigilTypes.values()) { + if (types != HerbalSigilTypes.NONE) { + entries.accept(types.getHerbalSigilItem()); + } + } + + for (PadlockTypes types : PadlockTypes.values()) { + if (types != PadlockTypes.NONE) { + entries.accept(types.getUnboundPadlockItem()); + entries.accept(types.getBoundPadlockItem()); + } + } + + for (WoodTypes types : WoodTypes.values()) { + entries.accept(types.getLeavesBlock()); + entries.accept(types.getLogBlock()); + entries.accept(types.getStrippedLogBlock()); + entries.accept(types.getWoodBlock()); + entries.accept(types.getStrippedWoodBlock()); + entries.accept(types.getPlanksBlock()); + entries.accept(types.getSlabBlock()); + entries.accept(types.getStairsBlock()); + entries.accept(types.getFenceBlock()); + entries.accept(types.getFenceGateBlock()); + entries.accept(types.getButtonBlock()); + entries.accept(types.getPressurePlateBlock()); + entries.accept(types.getDoorBlock()); + entries.accept(types.getTrapdoorBlock()); + entries.accept(types.getSignBlock()); + entries.accept(types.getHangingSignBlock()); + entries.accept(types.getBoatItem()); + entries.accept(types.getChestBoatItem()); + entries.accept(types.getSaplingBlock()); + } + + for (StoneTypes types : StoneTypes.values()) { + entries.accept(types.getBaseBlock()); + entries.accept(types.getCobbledBlock()); + entries.accept(types.getPolishedBlock()); + entries.accept(types.getBricksBlock()); + entries.accept(types.getSlabBlock()); + entries.accept(types.getCobbledSlabBlock()); + entries.accept(types.getPolishedSlabBlock()); + entries.accept(types.getBrickSlabBlock()); + entries.accept(types.getStairsBlock()); + entries.accept(types.getCobbledStairsBlock()); + entries.accept(types.getPolishedStairsBlock()); + entries.accept(types.getBrickStairsBlock()); + entries.accept(types.getWallBlock()); + entries.accept(types.getCobbledWallBlock()); + entries.accept(types.getPolishedWallBlock()); + entries.accept(types.getBrickWallBlock()); + entries.accept(types.getButtonBlock()); + entries.accept(types.getPressurePlateBlock()); + } + + for (Archaeology.Metals metals : Archaeology.Metals.values()) { + if (metals.isAlloy()) { + entries.accept(metals.getScrapItem()); + } + entries.accept(metals.getIngotItem()); + entries.accept(metals.getNuggetItem()); + entries.accept(metals.getBlock()); + } + + for (Archaeology.Brushes brushes : Archaeology.Brushes.values()) { + entries.accept(brushes.getBrushItem()); + } + + for (Archaeology.SuspiciousBlocks suspiciousBlocks : Archaeology.SuspiciousBlocks.values()) { + entries.accept(suspiciousBlocks.getBlock()); + } + + for (Archaeology.Ashes ashes : Archaeology.Ashes.values()) { + entries.accept(ashes.getAshesItem()); + } + + for (MetalUtilities.Armour armour : MetalUtilities.Armour.values()) { + entries.accept(armour.getHelmetItem()); + entries.accept(armour.getChestplateItem()); + entries.accept(armour.getLeggingsItem()); + entries.accept(armour.getBootsItem()); + } + + for (MetalUtilities.Tools tools : MetalUtilities.Tools.values()) { + entries.accept(tools.getSwordItem()); + entries.accept(tools.getPickaxeItem()); + entries.accept(tools.getAxeItem()); + entries.accept(tools.getShovelItem()); + entries.accept(tools.getHoeItem()); + } + + for (FertilizerTypes types : FertilizerTypes.values()) { + entries.accept(types.getHerbHumusItem()); + if (types != FertilizerTypes.NONE) { + entries.accept(types.getFertilizerItem()); + } + } + + for (Sickles sickles : Sickles.values()) { + entries.accept(sickles.getSickleItem()); + } + + for (FrozeBlockstates blockstates : FrozeBlockstates.values()) { + entries.accept(blockstates.getFrozeState()); + entries.accept(blockstates.getFrozeCutState()); + entries.accept(blockstates.getFrozeCutSlabState()); + entries.accept(blockstates.getFrozeCutStairsState()); + entries.accept(blockstates.getFrozeDoorState()); + entries.accept(blockstates.getFrozeTrapdoorState()); + entries.accept(blockstates.getFrozeBulbState()); + entries.accept(blockstates.getFrozeGrateState()); + entries.accept(blockstates.getFrozeChiseledState()); + } + + displayContext.holders().lookup(Registries.POTION).ifPresent( + registryLookup -> generatePotionEffectTypes( + entries, registryLookup, ItemInit.ENIGMATIC_POTION.get(), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS, displayContext.enabledFeatures() + ) + ); + displayContext.holders().lookup(Registries.POTION).ifPresent( + registryLookup -> generatePotionEffectTypes( + entries, registryLookup, ItemInit.SOLAR_POTION.get(), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS, displayContext.enabledFeatures() + ) + ); + displayContext.holders().lookup(Registries.POTION).ifPresent( + registryLookup -> generatePotionEffectTypes( + entries, registryLookup, ItemInit.LUNAR_POTION.get(), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS, displayContext.enabledFeatures() + ) + ); }).build()); + private static void generatePotionEffectTypes( + CreativeModeTab.Output output, HolderLookup holderLookup, Item item, CreativeModeTab.TabVisibility tabVisibility, FeatureFlagSet featureFlagSet + ) { + holderLookup.listElements() + .filter(reference -> (reference.value()).isEnabled(featureFlagSet)) + .map(reference -> PotionContents.createItemStack(item, reference)) + .forEach(itemStack -> output.accept(itemStack, tabVisibility)); + } + public static void register(IEventBus eventBus) { CREATIVE_MODE_TABS.register(eventBus); diff --git a/src/main/java/net/dakotapride/hibernalherbs/init/ItemInit.java b/src/main/java/net/dakotapride/hibernalherbs/init/ItemInit.java index 5f5601ce..2235c548 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/init/ItemInit.java +++ b/src/main/java/net/dakotapride/hibernalherbs/init/ItemInit.java @@ -3,9 +3,11 @@ import net.dakotapride.hibernalherbs.HibernalHerbsMod; import net.dakotapride.hibernalherbs.item.*; import net.minecraft.core.Registry; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.Item; import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.alchemy.PotionContents; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; @@ -39,6 +41,10 @@ public class ItemInit { public static DeferredItem VILE_ASHES = register("extract_vile_ashes", () -> new ExtractItem("Vile Flame", new Item.Properties().stacksTo(1).rarity(Rarity.UNCOMMON))); public static DeferredItem VIRTUOUS_ASHES = register("extract_virtuous_ashes", () -> new ExtractItem("Virtuous Flame", new Item.Properties().stacksTo(1).rarity(Rarity.UNCOMMON))); + public static DeferredItem ENIGMATIC_POTION = register("enigmatic_potion", () -> new EnigmaticPotionItem(new Item.Properties().stacksTo(1).component(DataComponents.POTION_CONTENTS, PotionContents.EMPTY))); + public static DeferredItem SOLAR_POTION = register("solar_potion", () -> new TimeOfDayPotion(TimeOfDayPotion.Time.DAY, new Item.Properties().stacksTo(1).component(DataComponents.POTION_CONTENTS, PotionContents.EMPTY))); + public static DeferredItem LUNAR_POTION = register("lunar_potion", () -> new TimeOfDayPotion(TimeOfDayPotion.Time.NIGHT, new Item.Properties().stacksTo(1).component(DataComponents.POTION_CONTENTS, PotionContents.EMPTY))); + // Collective Registration public static void register(IEventBus bus) { ITEMS.register(bus); diff --git a/src/main/java/net/dakotapride/hibernalherbs/init/ParticleTypeInit.java b/src/main/java/net/dakotapride/hibernalherbs/init/ParticleTypeInit.java new file mode 100644 index 00000000..6d2f339f --- /dev/null +++ b/src/main/java/net/dakotapride/hibernalherbs/init/ParticleTypeInit.java @@ -0,0 +1,25 @@ +package net.dakotapride.hibernalherbs.init; + +import net.dakotapride.hibernalherbs.HibernalHerbsMod; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +public class ParticleTypeInit { + public static final DeferredRegister> PARTICLE_TYPES = DeferredRegister.create(BuiltInRegistries.PARTICLE_TYPE, HibernalHerbsMod.MOD_ID); + + public static final DeferredHolder, SimpleParticleType> SWARMING = register("swarming", false); + public static final DeferredHolder, SimpleParticleType> INSTABILITY = register("instability", false); + public static final DeferredHolder, SimpleParticleType> SHRIEKING = register("shrieking", false); + + private static DeferredHolder, SimpleParticleType> register(String key, boolean overrideLimiter) { + return PARTICLE_TYPES.register(key, () -> new SimpleParticleType(overrideLimiter)); + } + + public static void load(IEventBus bus) { + PARTICLE_TYPES.register(bus); + } +} diff --git a/src/main/java/net/dakotapride/hibernalherbs/init/PotionsInit.java b/src/main/java/net/dakotapride/hibernalherbs/init/PotionsInit.java new file mode 100644 index 00000000..2a5a038f --- /dev/null +++ b/src/main/java/net/dakotapride/hibernalherbs/init/PotionsInit.java @@ -0,0 +1,46 @@ +package net.dakotapride.hibernalherbs.init; + +import net.dakotapride.hibernalherbs.HibernalHerbsMod; +import net.dakotapride.hibernalherbs.init.enum_registry.HerbTypes; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionBrewing; +import net.minecraft.world.item.alchemy.Potions; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.function.Supplier; + +public class PotionsInit { + public static final DeferredRegister POTIONS = DeferredRegister.create(BuiltInRegistries.POTION, HibernalHerbsMod.MOD_ID); + + //public static final Holder MYSTERIOUS = register("mysterious", new Potion()); + public static final DeferredHolder FROST_RESISTANCE = register("frost_resistance", + () -> new Potion("frost_resistance", new MobEffectInstance(StatusEffectInit.FROST_RESISTANCE, 3600))); + + public static final DeferredHolder SWARMING = register("swarming", + () -> new Potion("swarming", new MobEffectInstance(StatusEffectInit.SWARMING, 3600))); + public static final DeferredHolder INSTABILITY = register("instability", + () -> new Potion("instability", new MobEffectInstance(StatusEffectInit.INSTABILITY, 3600))); + public static final DeferredHolder SHRIEKING = register("shrieking", + () -> new Potion("shrieking", new MobEffectInstance(StatusEffectInit.SHRIEKING, 3600))); + + private static DeferredHolder register(String string, Supplier potion) { + return POTIONS.register(string, potion); + } + + public static void register(IEventBus bus) { + //potionRecipes(); + POTIONS.register(bus); + } + + //private static void potionRecipes() {} + +} \ No newline at end of file diff --git a/src/main/java/net/dakotapride/hibernalherbs/init/StatusEffectInit.java b/src/main/java/net/dakotapride/hibernalherbs/init/StatusEffectInit.java index d17dcbb5..33a69145 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/init/StatusEffectInit.java +++ b/src/main/java/net/dakotapride/hibernalherbs/init/StatusEffectInit.java @@ -1,15 +1,13 @@ package net.dakotapride.hibernalherbs.init; import net.dakotapride.hibernalherbs.HibernalHerbsMod; -import net.dakotapride.hibernalherbs.effect.ApplyEffectOnAttackStatusEffect; -import net.dakotapride.hibernalherbs.effect.BasicStatusEffect; -import net.dakotapride.hibernalherbs.effect.MimicryStatusEffect; -import net.dakotapride.hibernalherbs.effect.SiphonHealthStatusEffect; +import net.dakotapride.hibernalherbs.effect.*; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.stats.StatType; +import net.minecraft.util.Mth; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; import net.minecraft.world.effect.MobEffects; @@ -40,7 +38,14 @@ public class StatusEffectInit { .addAttributeModifier(Attributes.SNEAKING_SPEED, HibernalHerbsMod.asResource("effect.esurient.sneaking_speed"), -0.15F, AttributeModifier.Operation.ADD_MULTIPLIED_BASE)); public static final DeferredHolder MIMICRY = register("mimicry", MimicryStatusEffect::new); - public static final DeferredHolder FROST_RESISTANCE = register("frost_resistance", () -> new BasicStatusEffect(MobEffectCategory.BENEFICIAL, 0x0)); + public static final DeferredHolder FROST_RESISTANCE = register("frost_resistance", () -> new BasicStatusEffect(MobEffectCategory.BENEFICIAL, 0xAEC9E5)); + + public static final DeferredHolder SWARMING = register("swarming", () -> new SwarmingStatusEffect(MobEffectCategory.HARMFUL, + 0xEDC343, 0.40F, randomSource -> Mth.randomBetweenInclusive(randomSource, 1, 2))); + public static final DeferredHolder INSTABILITY = register("instability", () -> new InstabilityStatusEffect(MobEffectCategory.HARMFUL, + 0xDB88F7)); + public static final DeferredHolder SHRIEKING = register("shrieking", () -> new ShriekingStatusEffect(MobEffectCategory.HARMFUL, + 0x111B21, 0.01F)); // Collective Registration public static void register(IEventBus bus) { diff --git a/src/main/java/net/dakotapride/hibernalherbs/init/enum_registry/Archaeology.java b/src/main/java/net/dakotapride/hibernalherbs/init/enum_registry/Archaeology.java index 863a53de..c616903f 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/init/enum_registry/Archaeology.java +++ b/src/main/java/net/dakotapride/hibernalherbs/init/enum_registry/Archaeology.java @@ -205,7 +205,7 @@ public enum Ashes { Ashes() { this.ashes_id = name().toLowerCase(Locale.ROOT); - this.ashes = ItemInit.register(ashes_id + "_ashes", () -> new Item(new Item.Properties().stacksTo(1).rarity(Rarity.UNCOMMON))); + this.ashes = ItemInit.register(ashes_id + "_ashes", () -> new Item(new Item.Properties().rarity(Rarity.UNCOMMON))); } public String getAshesId() { diff --git a/src/main/java/net/dakotapride/hibernalherbs/init/enum_registry/tag/Tags.java b/src/main/java/net/dakotapride/hibernalherbs/init/enum_registry/tag/Tags.java index 2aa514e3..437202e5 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/init/enum_registry/tag/Tags.java +++ b/src/main/java/net/dakotapride/hibernalherbs/init/enum_registry/tag/Tags.java @@ -37,7 +37,8 @@ public enum Items { LONG_AGGLOMERATION_DURATION("agglomeration_duration/long"), CAN_USE_WITH_AGGLOMERATION("can_use_with_agglomeration"), CAN_USE_WITH_TOME("can_use_with_tome"), - CAN_BE_CONVERTED_WITH_AGGLOMERATION("can_be_converted_with_agglomeration"),; + CAN_BE_CONVERTED_WITH_AGGLOMERATION("can_be_converted_with_agglomeration"), + IS_ACCEPTABLE_IN_BREWING_STAND("c", "acceptable_potions_for_brewing"); // Added for recipe functionality, do NOT add your own agglomeration-like items to this tag, it may cause compatibility issues //AGGLOMERATION("agglomerations"); diff --git a/src/main/java/net/dakotapride/hibernalherbs/item/EnigmaticPotionItem.java b/src/main/java/net/dakotapride/hibernalherbs/item/EnigmaticPotionItem.java new file mode 100644 index 00000000..299745de --- /dev/null +++ b/src/main/java/net/dakotapride/hibernalherbs/item/EnigmaticPotionItem.java @@ -0,0 +1,99 @@ +package net.dakotapride.hibernalherbs.item; + +import net.dakotapride.hibernalherbs.init.ItemInit; +import net.minecraft.ChatFormatting; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.PotionItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; + +import java.util.List; + +public class EnigmaticPotionItem extends PotionItem { + public EnigmaticPotionItem(Properties properties) { + super(properties); + } + + @Override + public void appendHoverText(ItemStack itemStack, TooltipContext tooltipContext, List list, TooltipFlag tooltipFlag) { + super.appendHoverText(itemStack, tooltipContext, list, tooltipFlag); + + list.add(Component.literal("")); + list.add(Component.translatable("text.hibernalherbs.mysterious_potion.no_particles").withStyle(ChatFormatting.GRAY)); + + // Modifiers + list.add(Component.literal("")); + list.add(Component.translatable("text.hibernalherbs.mysterious_potion.enigmatic_extract.modifiers").withStyle(ChatFormatting.AQUA)); + //list.add(Component.literal("")); + // Vile Ashes + list.add(Component.translatable("text.hibernalherbs.mysterious_potion.enigmatic_extract.vile").withStyle(ChatFormatting.LIGHT_PURPLE)); + list.add(Component.translatable("text.hibernalherbs.mysterious_potion.enigmatic_extract.vile.occurrence").withStyle(ChatFormatting.GRAY)); + // Virtuous Ashes + list.add(Component.translatable("text.hibernalherbs.mysterious_potion.enigmatic_extract.virtuous").withStyle(ChatFormatting.LIGHT_PURPLE)); + list.add(Component.translatable("text.hibernalherbs.mysterious_potion.enigmatic_extract.virtuous.occurrence").withStyle(ChatFormatting.GRAY)); + } + + @Override + public ItemStack finishUsingItem(ItemStack itemStack, Level level, LivingEntity livingEntity) { + Player player = livingEntity instanceof Player ? (Player)livingEntity : null; + if (player instanceof ServerPlayer) { + CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer)player, itemStack); + } + + if (!level.isClientSide) { + PotionContents potionContents = itemStack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY); + potionContents.forEachEffect(mobEffectInstance -> { + mobEffectInstance.visible = false; + // Controlled by Enigmatic Extracts + // mobEffectInstance.duration = 1; + // mobEffectInstance.amplifier = 1; + + if (!(player.getCooldowns().isOnCooldown(player.getOffhandItem().getItem()))) { + if (player.getOffhandItem().is(ItemInit.VIRTUOUS_ASHES)) { + mobEffectInstance.duration = (int)(mobEffectInstance.getDuration() * 1.5F); + + player.getCooldowns().addCooldown(player.getOffhandItem().getItem(), 1200); + } else if (player.getOffhandItem().is(ItemInit.VILE_ASHES)) { + mobEffectInstance.amplifier = mobEffectInstance.getAmplifier() + 1; + + player.getCooldowns().addCooldown(player.getOffhandItem().getItem(), 2400); + } + + if (mobEffectInstance.getEffect().value().isInstantenous()) { + mobEffectInstance.getEffect().value().applyInstantenousEffect(player, player, livingEntity, mobEffectInstance.getAmplifier(), 1.0); + } else { + livingEntity.addEffect(mobEffectInstance); + } + } + }); + } + + if (player != null) { + player.awardStat(Stats.ITEM_USED.get(this)); + itemStack.consume(1, player); + } + + if (player == null || !player.hasInfiniteMaterials()) { + if (itemStack.isEmpty()) { + return new ItemStack(Items.GLASS_BOTTLE); + } + + if (player != null) { + player.getInventory().add(new ItemStack(Items.GLASS_BOTTLE)); + } + } + + livingEntity.gameEvent(GameEvent.DRINK); + return itemStack; + } +} diff --git a/src/main/java/net/dakotapride/hibernalherbs/item/SorcererAgglomerationItem.java b/src/main/java/net/dakotapride/hibernalherbs/item/SorcererAgglomerationItem.java index fbb30a3b..9f69947a 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/item/SorcererAgglomerationItem.java +++ b/src/main/java/net/dakotapride/hibernalherbs/item/SorcererAgglomerationItem.java @@ -12,6 +12,7 @@ import net.dakotapride.hibernalherbs.init.enum_registry.HerbalSigilTypes; import net.dakotapride.hibernalherbs.init.enum_registry.StoneTypes; import net.dakotapride.hibernalherbs.init.enum_registry.tag.Tags; +import net.minecraft.ChatFormatting; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.BlockParticleOption; @@ -97,6 +98,8 @@ public void appendHoverText(ItemStack itemStack, TooltipContext tooltipContext, list.add(Component.translatable("text.hibernalherbs.agglomeration.is_active")); list.add(Component.literal("")); list.add(Component.translatable("text.hibernalherbs.agglomeration.cannot_utilise")); + } else if (isNotActive(itemStack)) { + list.add(Component.translatable("text.hibernalherbs.not_active").withStyle(ChatFormatting.GRAY)); } } diff --git a/src/main/java/net/dakotapride/hibernalherbs/item/SorcererTomeItem.java b/src/main/java/net/dakotapride/hibernalherbs/item/SorcererTomeItem.java index c5e44db8..d2f00053 100644 --- a/src/main/java/net/dakotapride/hibernalherbs/item/SorcererTomeItem.java +++ b/src/main/java/net/dakotapride/hibernalherbs/item/SorcererTomeItem.java @@ -7,6 +7,7 @@ import net.dakotapride.hibernalherbs.init.enum_registry.HerbalSigilTypes; import net.dakotapride.hibernalherbs.init.enum_registry.PadlockTypes; import net.dakotapride.hibernalherbs.init.enum_registry.tag.Tags; +import net.minecraft.ChatFormatting; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.BlockParticleOption; @@ -43,6 +44,8 @@ public void appendHoverText(ItemStack itemStack, TooltipContext tooltipContext, list.add(Component.translatable("text.hibernalherbs.tome.is_active")); list.add(Component.literal("")); list.add(Component.translatable("text.hibernalherbs.tome.cannot_utilise")); + } else if (isNotActive(itemStack)) { + list.add(Component.translatable("text.hibernalherbs.not_active").withStyle(ChatFormatting.GRAY)); } } diff --git a/src/main/java/net/dakotapride/hibernalherbs/item/TimeOfDayPotion.java b/src/main/java/net/dakotapride/hibernalherbs/item/TimeOfDayPotion.java new file mode 100644 index 00000000..217a7d7f --- /dev/null +++ b/src/main/java/net/dakotapride/hibernalherbs/item/TimeOfDayPotion.java @@ -0,0 +1,128 @@ +package net.dakotapride.hibernalherbs.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.PotionItem; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; + +import java.util.List; + +public class TimeOfDayPotion extends PotionItem { + Time time; + + boolean isDay; + boolean isNight; + + public TimeOfDayPotion(Time time, Properties properties) { + super(properties); + this.time = time; + } + + @Override + public void appendHoverText(ItemStack itemStack, TooltipContext tooltipContext, List list, TooltipFlag tooltipFlag) { + super.appendHoverText(itemStack, tooltipContext, list, tooltipFlag); + + list.add(Component.literal("")); + + switch (time) { + case DAY -> { + list.add(Component.translatable("text.hibernalherbs.time_of_day_potion.daytime").withStyle(ChatFormatting.GOLD)); + } + case NIGHT -> { + list.add(Component.translatable("text.hibernalherbs.time_of_day_potion.nighttime").withStyle(ChatFormatting.DARK_PURPLE)); + } + default -> {} + } + } + + @Override + public ItemStack finishUsingItem(ItemStack itemStack, Level level, LivingEntity livingEntity) { + Player player = livingEntity instanceof Player ? (Player)livingEntity : null; + if (player instanceof ServerPlayer) { + CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer)player, itemStack); + } + + if (!level.isClientSide) { + PotionContents potionContents = itemStack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY); + + //int timeOfDay = (int) level.getDayTime(); + long getTime = level.getDayTime(); + + potionContents.forEachEffect(mobEffectInstance -> { + switch (time) { + case DAY -> { + if (getTime >= 1000 && getTime < 13000) { + mobEffectInstance.duration = (mobEffectInstance.getDuration() + 2000); + mobEffectInstance.amplifier = (mobEffectInstance.getAmplifier() + 2); + } else { + mobEffectInstance.duration = (int) (mobEffectInstance.getDuration() * 0.5F); + if (mobEffectInstance.amplifier != 0) { + mobEffectInstance.amplifier = (mobEffectInstance.getAmplifier() - 1); + } + } + + if (mobEffectInstance.getEffect().value().isInstantenous()) { + mobEffectInstance.getEffect().value().applyInstantenousEffect(player, player, livingEntity, mobEffectInstance.getAmplifier(), 1.0); + } else { + livingEntity.addEffect(mobEffectInstance); + } + } + case NIGHT -> { + if (getTime >= 13000 && getTime < 23999) { + mobEffectInstance.duration = (mobEffectInstance.getDuration() + 2000); + mobEffectInstance.amplifier = (mobEffectInstance.getAmplifier() + 2); + } else { + mobEffectInstance.duration = (int) (mobEffectInstance.getDuration() * 0.5F); + if (mobEffectInstance.amplifier != 0) { + mobEffectInstance.amplifier = (mobEffectInstance.getAmplifier() - 1); + } + } + + if (mobEffectInstance.getEffect().value().isInstantenous()) { + mobEffectInstance.getEffect().value().applyInstantenousEffect(player, player, livingEntity, mobEffectInstance.getAmplifier(), 1.0); + } else { + livingEntity.addEffect(mobEffectInstance); + } + } + default -> {} + } + }); + } + + if (player != null) { + player.awardStat(Stats.ITEM_USED.get(this)); + itemStack.consume(1, player); + } + + if (player == null || !player.hasInfiniteMaterials()) { + if (itemStack.isEmpty()) { + return new ItemStack(Items.GLASS_BOTTLE); + } + + if (player != null) { + player.getInventory().add(new ItemStack(Items.GLASS_BOTTLE)); + } + } + + livingEntity.gameEvent(GameEvent.DRINK); + return itemStack; + } + + public enum Time { + DAY, + NIGHT; + + Time() {} + } +} diff --git a/src/main/java/net/dakotapride/hibernalherbs/mixin/MaceItemMixin.java b/src/main/java/net/dakotapride/hibernalherbs/mixin/MaceItemMixin.java new file mode 100644 index 00000000..4b61110b --- /dev/null +++ b/src/main/java/net/dakotapride/hibernalherbs/mixin/MaceItemMixin.java @@ -0,0 +1,30 @@ +package net.dakotapride.hibernalherbs.mixin; + +import net.dakotapride.hibernalherbs.init.ItemInit; +import net.dakotapride.hibernalherbs.init.enum_registry.tag.Tags; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.MaceItem; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +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(MaceItem.class) +public class MaceItemMixin { + + @Inject(method = "postHurtEnemy", at = @At("RETURN")) + private void provideLifeForceFromEnchantment(ItemStack itemStack, LivingEntity livingEntity, LivingEntity livingEntity2, CallbackInfo ci) { + if (livingEntity2 instanceof Player player) { + if (player.getOffhandItem().is(Items.GLASS_BOTTLE) && EnchantmentHelper.hasTag(itemStack, Tags.Enchantments.HARVESTS_LIFE_FORCE.getTag())) { + livingEntity2.getOffhandItem().shrink(1); + + player.addItem(new ItemStack(ItemInit.LIFE_FORCE_BOTTLE.get(), 1)); + } + } + } + +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 52b21a7b..02cae6dc 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,3 +1,7 @@ public net.minecraft.world.level.block.Blocks leaves(Lnet/minecraft/world/level/block/SoundType;)Lnet/minecraft/world/level/block/Block; # leaves public net.minecraft.world.level.block.Blocks log(Lnet/minecraft/world/level/material/MapColor;Lnet/minecraft/world/level/material/MapColor;)Lnet/minecraft/world/level/block/Block; # log -public net.minecraft.world.level.block.Blocks woodenButton(Lnet/minecraft/world/level/block/state/properties/BlockSetType;)Lnet/minecraft/world/level/block/Block; # woodenButton \ No newline at end of file +public net.minecraft.world.level.block.Blocks woodenButton(Lnet/minecraft/world/level/block/state/properties/BlockSetType;)Lnet/minecraft/world/level/block/Block; # woodenButton +public net.minecraft.world.effect.MobEffectInstance visible # visible +public net.minecraft.world.effect.MobEffectInstance duration # duration +public net.minecraft.world.effect.MobEffectInstance amplifier # amplifier +public net.minecraft.world.inventory.BrewingStandMenu$PotionSlot \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/lang/en_us.json b/src/main/resources/assets/hibernalherbs/lang/en_us.json index eed52504..1e42208b 100644 --- a/src/main/resources/assets/hibernalherbs/lang/en_us.json +++ b/src/main/resources/assets/hibernalherbs/lang/en_us.json @@ -284,6 +284,10 @@ "effect.hibernalherbs.esurient": "Esurient", "effect.hibernalherbs.esurient.level": "Esurient %s", "effect.hibernalherbs.frost_resistance": "Frost Resistance", + "item.minecraft.potion.effect.frost_resistance": "Potion of Frost Resistance", + "item.minecraft.splash_potion.effect.frost_resistance": "Splash Potion of Frost Resistance", + "item.minecraft.lingering_potion.effect.frost_resistance": "Lingering Potion of Frost Resistance", + "item.minecraft.tipped_arrow.effect.frost_resistance": "Arrow of Frost Resistance", "effect.hibernalherbs.lethargy": "Lethargy", "effect.hibernalherbs.lethargy.level": "Lethargy %s", "effect.hibernalherbs.mimicry": "Mimicry", @@ -479,6 +483,7 @@ "text.hibernalherbs.ability.wither": "Decaying", "text.hibernalherbs.agglomeration.cannot_utilise": "§7Cannot be used at this moment", "text.hibernalherbs.agglomeration.is_active": "§3Sorcerer's Agglomeration is active", + "text.hibernalherbs.not_active": "Not active", "text.hibernalherbs.association.acacia": "§6Association:§7 Acacia", "text.hibernalherbs.association.bamboo": "§6Association:§7 Bamboo", "text.hibernalherbs.association.birch": "§6Association:§7 Birch", @@ -652,7 +657,8 @@ "trim_material.hibernalherbs.arkonium": "Arkonium Material", "trim_material.hibernalherbs.syrum": "Syrum Material", "tag.item.accessories.necklace": "Necklace Accessories", - "tag.item.c.sickles": "Sickles", + "tag.item.c.tools.sickles": "Sickles", + "tag.item.c.tools.acceptable_potions_for_brewing": "Acceptable in Potion Input Slots", "tag.item.hibernalherbs.agglomeration_duration.long": "Long Agglomeration Usage", "tag.item.hibernalherbs.agglomeration_duration.short": "Short Agglomeration Usage", "tag.item.hibernalherbs.ashes": "Ashes of Sin", @@ -672,5 +678,121 @@ "tag.item.hibernalherbs.stone_types.idiosyncratic_stone": "Idiosyncratic Stone", "tag.item.hibernalherbs.stone_types.necromantic_stone": "Necromantic Stone", "tag.item.hibernalherbs.unbound_herbal_padlocks": "Unbound Herbal Padlocks", - "upgrade.hibernalherbs.sigil_upgrade": "Herbal Sigil Application" + "upgrade.hibernalherbs.sigil_upgrade": "Herbal Sigil Application", + "text.hibernalherbs.mysterious_potion.no_particles": "No Particles", + "text.hibernalherbs.mysterious_potion.enigmatic_extract.modifiers": "Offhand Modifiers", + "text.hibernalherbs.mysterious_potion.enigmatic_extract.vile": " Vile Flame", + "text.hibernalherbs.mysterious_potion.enigmatic_extract.vile.occurrence": " Increases Effect Amplifier", + "text.hibernalherbs.mysterious_potion.enigmatic_extract.virtuous": " Virtuous Flame", + "text.hibernalherbs.mysterious_potion.enigmatic_extract.virtuous.occurrence": " Increases Effect Duration", + "text.hibernalherbs.time_of_day_potion.daytime": "Amplified During Daytime", + "text.hibernalherbs.time_of_day_potion.nighttime": "Amplified During Nighttime", + "effect.hibernalherbs.swarming": "Swarming", + "item.minecraft.potion.effect.swarming": "Potion of Swarming", + "item.minecraft.splash_potion.effect.swarming": "Splash Potion of Swarming", + "item.minecraft.lingering_potion.effect.swarming": "Lingering Potion of Swarming", + "item.minecraft.tipped_arrow.effect.swarming": "Arrow of Swarming", + "effect.hibernalherbs.instability": "Instability", + "item.minecraft.potion.effect.instability": "Potion of Instability", + "item.minecraft.splash_potion.effect.instability": "Splash Potion of Instability", + "item.minecraft.lingering_potion.effect.instability": "Lingering Potion of Instability", + "item.minecraft.tipped_arrow.effect.instability": "Arrow of Instability", + "effect.hibernalherbs.shrieking": "Shrieking", + "item.minecraft.potion.effect.shrieking": "Potion of Shrieking", + "item.minecraft.splash_potion.effect.shrieking": "Splash Potion of Shrieking", + "item.minecraft.lingering_potion.effect.shrieking": "Lingering Potion of Shrieking", + "item.minecraft.tipped_arrow.effect.shrieking": "Arrow of Shrieking", + "item.hibernalherbs.enigmatic_potion": "Enigmatic Potion", + "item.hibernalherbs.enigmatic_potion.effect.awkward": "Awkward Enigmatic Potion", + "item.hibernalherbs.enigmatic_potion.effect.empty": "Enigmatic Uncraftable Potion", + "item.hibernalherbs.enigmatic_potion.effect.fire_resistance": "Enigmatic Potion of Fire Resistance", + "item.hibernalherbs.enigmatic_potion.effect.harming": "Enigmatic Potion of Harming", + "item.hibernalherbs.enigmatic_potion.effect.healing": "Enigmatic Potion of Healing", + "item.hibernalherbs.enigmatic_potion.effect.infested": "Enigmatic Potion of Infestation", + "item.hibernalherbs.enigmatic_potion.effect.invisibility": "Enigmatic Potion of Invisibility", + "item.hibernalherbs.enigmatic_potion.effect.leaping": "Enigmatic Potion of Leaping", + "item.hibernalherbs.enigmatic_potion.effect.levitation": "Enigmatic Potion of Levitation", + "item.hibernalherbs.enigmatic_potion.effect.luck": "Enigmatic Potion of Luck", + "item.hibernalherbs.enigmatic_potion.effect.mundane": "Mundane Enigmatic Potion", + "item.hibernalherbs.enigmatic_potion.effect.night_vision": "Enigmatic Potion of Night Vision", + "item.hibernalherbs.enigmatic_potion.effect.oozing": "Enigmatic Potion of Oozing", + "item.hibernalherbs.enigmatic_potion.effect.poison": "Enigmatic Potion of Poison", + "item.hibernalherbs.enigmatic_potion.effect.regeneration": "Enigmatic Potion of Regeneration", + "item.hibernalherbs.enigmatic_potion.effect.slow_falling": "Enigmatic Potion of Slow Falling", + "item.hibernalherbs.enigmatic_potion.effect.slowness": "Enigmatic Potion of Slowness", + "item.hibernalherbs.enigmatic_potion.effect.strength": "Enigmatic Potion of Strength", + "item.hibernalherbs.enigmatic_potion.effect.swiftness": "Enigmatic Potion of Swiftness", + "item.hibernalherbs.enigmatic_potion.effect.thick": "Thick Enigmatic Potion", + "item.hibernalherbs.enigmatic_potion.effect.turtle_master": "Enigmatic Potion of the Turtle Master", + "item.hibernalherbs.enigmatic_potion.effect.water": "Enigmatic Water Bottle", + "item.hibernalherbs.enigmatic_potion.effect.water_breathing": "Enigmatic Potion of Water Breathing", + "item.hibernalherbs.enigmatic_potion.effect.weakness": "Enigmatic Potion of Weakness", + "item.hibernalherbs.enigmatic_potion.effect.weaving": "Enigmatic Potion of Weaving", + "item.hibernalherbs.enigmatic_potion.effect.wind_charged": "Enigmatic Potion of Wind Charging", + "item.hibernalherbs.enigmatic_potion.effect.frost_resistance": "Enigmatic Potion of Frost Resistance", + "item.hibernalherbs.enigmatic_potion.effect.swarming": "Enigmatic Potion of Swarming", + "item.hibernalherbs.enigmatic_potion.effect.instability": "Enigmatic Potion of Instability", + "item.hibernalherbs.enigmatic_potion.effect.shrieking": "Enigmatic Potion of Shrieking", + "item.hibernalherbs.solar_potion": "Solar Potion", + "item.hibernalherbs.solar_potion.effect.awkward": "Awkward Solar Potion", + "item.hibernalherbs.solar_potion.effect.empty": "Solar Uncraftable Potion", + "item.hibernalherbs.solar_potion.effect.fire_resistance": "Solar Potion of Fire Resistance", + "item.hibernalherbs.solar_potion.effect.harming": "Solar Potion of Harming", + "item.hibernalherbs.solar_potion.effect.healing": "Solar Potion of Healing", + "item.hibernalherbs.solar_potion.effect.infested": "Solar Potion of Infestation", + "item.hibernalherbs.solar_potion.effect.invisibility": "Solar Potion of Invisibility", + "item.hibernalherbs.solar_potion.effect.leaping": "Solar Potion of Leaping", + "item.hibernalherbs.solar_potion.effect.levitation": "Solar Potion of Levitation", + "item.hibernalherbs.solar_potion.effect.luck": "Solar Potion of Luck", + "item.hibernalherbs.solar_potion.effect.mundane": "Mundane Solar Potion", + "item.hibernalherbs.solar_potion.effect.night_vision": "Solar Potion of Night Vision", + "item.hibernalherbs.solar_potion.effect.oozing": "Solar Potion of Oozing", + "item.hibernalherbs.solar_potion.effect.poison": "Solar Potion of Poison", + "item.hibernalherbs.solar_potion.effect.regeneration": "Solar Potion of Regeneration", + "item.hibernalherbs.solar_potion.effect.slow_falling": "Solar Potion of Slow Falling", + "item.hibernalherbs.solar_potion.effect.slowness": "Solar Potion of Slowness", + "item.hibernalherbs.solar_potion.effect.strength": "Solar Potion of Strength", + "item.hibernalherbs.solar_potion.effect.swiftness": "Solar Potion of Swiftness", + "item.hibernalherbs.solar_potion.effect.thick": "Thick Solar Potion", + "item.hibernalherbs.solar_potion.effect.turtle_master": "Solar Potion of the Turtle Master", + "item.hibernalherbs.solar_potion.effect.water": "Solar Water Bottle", + "item.hibernalherbs.solar_potion.effect.water_breathing": "Solar Potion of Water Breathing", + "item.hibernalherbs.solar_potion.effect.weakness": "Solar Potion of Weakness", + "item.hibernalherbs.solar_potion.effect.weaving": "Solar Potion of Weaving", + "item.hibernalherbs.solar_potion.effect.wind_charged": "Solar Potion of Wind Charging", + "item.hibernalherbs.solar_potion.effect.frost_resistance": "Solar Potion of Frost Resistance", + "item.hibernalherbs.solar_potion.effect.swarming": "Solar Potion of Swarming", + "item.hibernalherbs.solar_potion.effect.instability": "Solar Potion of Instability", + "item.hibernalherbs.solar_potion.effect.shrieking": "Solar Potion of Shrieking", + "item.hibernalherbs.lunar_potion": "Lunar Potion", + "item.hibernalherbs.lunar_potion.effect.awkward": "Awkward Lunar Potion", + "item.hibernalherbs.lunar_potion.effect.empty": "Lunar Uncraftable Potion", + "item.hibernalherbs.lunar_potion.effect.fire_resistance": "Lunar Potion of Fire Resistance", + "item.hibernalherbs.lunar_potion.effect.harming": "Lunar Potion of Harming", + "item.hibernalherbs.lunar_potion.effect.healing": "Lunar Potion of Healing", + "item.hibernalherbs.lunar_potion.effect.infested": "Lunar Potion of Infestation", + "item.hibernalherbs.lunar_potion.effect.invisibility": "Lunar Potion of Invisibility", + "item.hibernalherbs.lunar_potion.effect.leaping": "Lunar Potion of Leaping", + "item.hibernalherbs.lunar_potion.effect.levitation": "Lunar Potion of Levitation", + "item.hibernalherbs.lunar_potion.effect.luck": "Lunar Potion of Luck", + "item.hibernalherbs.lunar_potion.effect.mundane": "Mundane Lunar Potion", + "item.hibernalherbs.lunar_potion.effect.night_vision": "Lunar Potion of Night Vision", + "item.hibernalherbs.lunar_potion.effect.oozing": "Lunar Potion of Oozing", + "item.hibernalherbs.lunar_potion.effect.poison": "Lunar Potion of Poison", + "item.hibernalherbs.lunar_potion.effect.regeneration": "Lunar Potion of Regeneration", + "item.hibernalherbs.lunar_potion.effect.slow_falling": "Lunar Potion of Slow Falling", + "item.hibernalherbs.lunar_potion.effect.slowness": "Lunar Potion of Slowness", + "item.hibernalherbs.lunar_potion.effect.strength": "Lunar Potion of Strength", + "item.hibernalherbs.lunar_potion.effect.swiftness": "Lunar Potion of Swiftness", + "item.hibernalherbs.lunar_potion.effect.thick": "Thick Lunar Potion", + "item.hibernalherbs.lunar_potion.effect.turtle_master": "Lunar Potion of the Turtle Master", + "item.hibernalherbs.lunar_potion.effect.water": "Lunar Water Bottle", + "item.hibernalherbs.lunar_potion.effect.water_breathing": "Lunar Potion of Water Breathing", + "item.hibernalherbs.lunar_potion.effect.weakness": "Lunar Potion of Weakness", + "item.hibernalherbs.lunar_potion.effect.weaving": "Lunar Potion of Weaving", + "item.hibernalherbs.lunar_potion.effect.wind_charged": "Lunar Potion of Wind Charging", + "item.hibernalherbs.lunar_potion.effect.frost_resistance": "Lunar Potion of Frost Resistance", + "item.hibernalherbs.lunar_potion.effect.swarming": "Lunar Potion of Swarming", + "item.hibernalherbs.lunar_potion.effect.instability": "Lunar Potion of Instability", + "item.hibernalherbs.lunar_potion.effect.shrieking": "Lunar Potion of Shrieking" } \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/models/item/enigmatic_potion.json b/src/main/resources/assets/hibernalherbs/models/item/enigmatic_potion.json new file mode 100644 index 00000000..a38f55c1 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/models/item/enigmatic_potion.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hibernalherbs:item/mysterious_potion_overlay", + "layer1": "hibernalherbs:item/mysterious_potion" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/models/item/lunar_potion.json b/src/main/resources/assets/hibernalherbs/models/item/lunar_potion.json new file mode 100644 index 00000000..f97e1e68 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/models/item/lunar_potion.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hibernalherbs:item/time_potion_overlay", + "layer1": "hibernalherbs:item/time_potion" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/models/item/solar_potion.json b/src/main/resources/assets/hibernalherbs/models/item/solar_potion.json new file mode 100644 index 00000000..f97e1e68 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/models/item/solar_potion.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "hibernalherbs:item/time_potion_overlay", + "layer1": "hibernalherbs:item/time_potion" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/particles/instability.json b/src/main/resources/assets/hibernalherbs/particles/instability.json new file mode 100644 index 00000000..c272a0e0 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/particles/instability.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "hibernalherbs:instability" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/particles/shrieking.json b/src/main/resources/assets/hibernalherbs/particles/shrieking.json new file mode 100644 index 00000000..d0c8708c --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/particles/shrieking.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "hibernalherbs:shrieking" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/particles/swarming.json b/src/main/resources/assets/hibernalherbs/particles/swarming.json new file mode 100644 index 00000000..e9db09a5 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/particles/swarming.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "hibernalherbs:swarming" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/brewing.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/brewing.json new file mode 100644 index 00000000..353370f4 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/brewing.json @@ -0,0 +1,6 @@ +{ + "name": "Brewing", + "description": "Expanded brewing systems for you to explore.", + "icon": "hibernalherbs:enigmatic_potion[potion_contents={potion:'regeneration'}]", + "sortnum": 5 +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/herb_reproduction.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/herb_reproduction.json index 02716788..c3ed2bba 100644 --- a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/herb_reproduction.json +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/herb_reproduction.json @@ -1,5 +1,6 @@ { "name": "Herb Reproduction", "description": "Want to reproduce your herbs? Here's what you do!", - "icon": "hibernalherbs:spruce_herb_fertilizer" + "icon": "hibernalherbs:spruce_herb_fertilizer", + "sortnum": 1 } \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/herbs.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/herbs.json index eb34f65b..a2d230e1 100644 --- a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/herbs.json +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/herbs.json @@ -1,5 +1,6 @@ { "name": "Herbal Basics", "description": "Any information regarding all herbs (Pounded, Non-Pounded, and Dried) can be found here.", - "icon": "hibernalherbs:pounded_chamomile" + "icon": "hibernalherbs:pounded_chamomile", + "sortnum": 0 } \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/mystical_campfire_conversion.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/mystical_campfire_conversion.json index f2b98abd..ed77ada6 100644 --- a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/mystical_campfire_conversion.json +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/mystical_campfire_conversion.json @@ -1,5 +1,6 @@ { "name": "Mystical Campfire Conversion", "description": "Transform normality through the mystical arts.", - "icon": "hibernalherbs:mystical_campfire" + "icon": "hibernalherbs:mystical_campfire", + "sortnum": 2 } \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/sin_alignments.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/sin_alignments.json index 94440503..03d551fa 100644 --- a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/sin_alignments.json +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/sin_alignments.json @@ -1,5 +1,6 @@ { "name": "Sin Alignments", "description": "Not quite making a deal with a devil, but close enough.", - "icon": "hibernalherbs:pride_ashes" + "icon": "hibernalherbs:pride_ashes", + "sortnum": 4 } \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/sorcerer_books.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/sorcerer_books.json index 08ccc5f7..5f9fc932 100644 --- a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/sorcerer_books.json +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/sorcerer_books.json @@ -1,5 +1,6 @@ { "name": "Sorcerer's Books", "description": "The Sorcerer books have special abilities that help you progress.", - "icon": "hibernalherbs:agglomeration" + "icon": "hibernalherbs:agglomeration", + "sortnum": 3 } \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/utilities.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/utilities.json index b62b4c51..cbe7ebf0 100644 --- a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/utilities.json +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/categories/utilities.json @@ -1,5 +1,6 @@ { "name": "Utilities", "description": "Utility blocks and items that may prove useful to you.", - "icon": "hibernalherbs:iron_sickle" + "icon": "hibernalherbs:iron_sickle", + "sortnum": 6 } \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/entries/brewing/enigmatic_potions.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/entries/brewing/enigmatic_potions.json new file mode 100644 index 00000000..23a37c14 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/entries/brewing/enigmatic_potions.json @@ -0,0 +1,27 @@ +{ + "name": "Enigmatic Potions", + "icon": "hibernalherbs:enigmatic_potion[potion_contents={potion:'fire_resistance'}]", + "category": "hibernalherbs:brewing", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "hibernalherbs:enigmatic_potion[potion_contents={potion:'fire_resistance'}]", + "title": "Enigmatic Potions", + "text": "When combining an Enigmatic Extract that contains Mystical Ashes within with a given potion, you can make a secretive Enigmatic Potion! This type of potion makes it so that any effects given to the affected entity by the potion will not show any sort of particles." + }, + { + "type": "hibernalherbs:brewing2", + "input": "minecraft:potion[potion_contents={potion:'fire_resistance'}]", + "ingredient": "hibernalherbs:extract_mystical_ashes", + "output": "hibernalherbs:enigmatic_potion[potion_contents={potion:'fire_resistance'}]", + + "input2": "minecraft:potion[potion_contents={potion:'regeneration'}]", + "ingredient2": "hibernalherbs:extract_mystical_ashes", + "output2": "hibernalherbs:enigmatic_potion[potion_contents={potion:'regeneration'}]" + }, + { + "type": "patchouli:text", + "text": "Consuming Enigmatic Potions while having specific Enigmatic Extracts in your offhand will provide you with benefits.$(br)An Enigmatic Extract with Virtuous Ashes contained within will increase the duration of the effect(s) applied while Enigmatic Extract with Vile Ashes contained within will increase the amplifier of the effect(s) applied." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/entries/brewing/time_dependent_potions.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/entries/brewing/time_dependent_potions.json new file mode 100644 index 00000000..87ab0078 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/entries/brewing/time_dependent_potions.json @@ -0,0 +1,31 @@ +{ + "name": "Time Dependent Potions", + "icon": "hibernalherbs:solar_potion[potion_contents={potion:'fire_resistance'}]", + "category": "hibernalherbs:brewing", + "pages": [ + { + "type": "patchouli:spotlight", + "item": "hibernalherbs:solar_potion[potion_contents={potion:'fire_resistance'}]", + "title": "Time Dependent Potions", + "text": "When combining a Clock with a given potion, you can make a potion that has its amplifier and duration increased during the day, but decreased during the night! Perhaps you should try to sleep more often if you take this option." + }, + { + "type": "hibernalherbs:brewing", + "input": "minecraft:potion[potion_contents={potion:'fire_resistance'}]", + "ingredient": "minecraft:clock", + "output": "hibernalherbs:solar_potion[potion_contents={potion:'fire_resistance'}]" + }, + { + "type": "patchouli:spotlight", + "item": "hibernalherbs:lunar_potion[potion_contents={potion:'water_breathing'}]", + "title": "Time Dependent Potions", + "text": "When combining a Clock with any Solar Potion, you can make a potion that has its amplifier and duration increased during the night, but decreased during the day! Finally, someone else who may like phantoms." + }, + { + "type": "hibernalherbs:brewing", + "input": "minecraft:potion[potion_contents={potion:'water_breathing'}]", + "ingredient": "minecraft:sculk", + "output": "hibernalherbs:lunar_potion[potion_contents={potion:'water_breathing'}]" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/templates/brewing.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/templates/brewing.json new file mode 100644 index 00000000..be170876 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/templates/brewing.json @@ -0,0 +1,58 @@ +{ + "components": [ + { + "type": "patchouli:header", + "text": "Brewing", + "x": -1, + "y": -6 + }, + { + "type": "patchouli:image", + "image": "patchouli:textures/gui/crafting.png", + "x": 7, + "y": 2, + "u": 10, + "v": 134, + "texture_width": 128, + "texture_height": 256, + "width": 100, + "height": 62 + }, + { + "type": "patchouli:item", + "item": "#input", + "x": 12, + "y": 7 + }, + { + "type": "patchouli:item", + "item": "#ingredient", + "x": 12, + "y": 26 + }, + { + "type": "patchouli:item", + "item": "#output", + "link_recipe": true, + "x": 84, + "y": 16 + }, + { + "type": "patchouli:item", + "item": "minecraft:blaze_powder", + "x": 49, + "y": 26 + }, + { + "type": "patchouli:text", + "text": "#text", + "y": 69 + }, + { + "type": "patchouli:item", + "item": "minecraft:brewing_stand", + "x": 49, + "y": 7 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/templates/brewing2.json b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/templates/brewing2.json new file mode 100644 index 00000000..ab2b9c44 --- /dev/null +++ b/src/main/resources/assets/hibernalherbs/patchouli_books/grimoire/en_us/templates/brewing2.json @@ -0,0 +1,96 @@ +{ + "components": [ + { + "type": "patchouli:header", + "text": "Brewing", + "x": -1, + "y": -6 + }, + { + "type": "patchouli:image", + "image": "patchouli:textures/gui/crafting.png", + "x": 7, + "y": 2, + "u": 10, + "v": 134, + "texture_width": 128, + "texture_height": 256, + "width": 100, + "height": 62 + }, + { + "type": "patchouli:image", + "image": "patchouli:textures/gui/crafting.png", + "x": 7, + "y": 82, + "u": 10, + "v": 134, + "texture_width": 128, + "texture_height": 256, + "width": 100, + "height": 62 + }, + { + "type": "patchouli:item", + "item": "#input", + "x": 12, + "y": 7 + }, + { + "type": "patchouli:item", + "item": "#ingredient", + "x": 12, + "y": 26 + }, + { + "type": "patchouli:item", + "item": "#output", + "link_recipe": true, + "x": 84, + "y": 16 + }, + { + "type": "patchouli:item", + "item": "#input2", + "x": 12, + "y": 87 + }, + { + "type": "patchouli:item", + "item": "#ingredient2", + "x": 12, + "y": 106 + }, + { + "type": "patchouli:item", + "item": "#output2", + "link_recipe": true, + "x": 84, + "y": 96 + }, + { + "type": "patchouli:item", + "item": "minecraft:blaze_powder", + "x": 49, + "y": 26 + }, + { + "type": "patchouli:item", + "item": "minecraft:blaze_powder", + "x": 49, + "y": 106 + }, + { + "type": "patchouli:item", + "item": "minecraft:brewing_stand", + "x": 49, + "y": 7 + }, + { + "type": "patchouli:item", + "item": "minecraft:brewing_stand", + "x": 49, + "y": 87 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hibernalherbs/textures/item/mysterious_potion.png b/src/main/resources/assets/hibernalherbs/textures/item/mysterious_potion.png new file mode 100644 index 0000000000000000000000000000000000000000..1e04f712703eba6ccc672a78a97c740d36af2944 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar*1S2@6zrOnUuOz9oFu z>VNLjl{wbg{QdX;%&(;ddw%|rzQn_r$#9eB(B-p7JxnTLLo}Q+6|@FziYbP&ml|7GlWR*358`Eg|^E-fxHMa~?%7?sA%tmh-5B i(ZkTnE!;(k`QYpT3?IvkF@CaqETK8%($aw;X3@nd2V+lZ#zoPGlRClh7BSeGHzielF{r G5}E*qvpW+2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hibernalherbs/textures/item/time_potion.png b/src/main/resources/assets/hibernalherbs/textures/item/time_potion.png new file mode 100644 index 0000000000000000000000000000000000000000..8b84f748256dfc23dd83f62e07d775123a5a82bd GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr*1S2@6zrOnUuOz9oFu z>VNLjl{wbg{QdX;%&(;ddw%|rzQn_r$#9eB(B-p7JcgG(jZIHa21m6SMKV2Cj*U%%HOrXeYq;W7`?jVFc-dagT; jY-E~{RMNAKjfJ6pZ{v^7V*iyuw=j6R`njxgN@xNA{Cz_@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hibernalherbs/textures/item/time_potion_overlay.png b/src/main/resources/assets/hibernalherbs/textures/item/time_potion_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..ede303a79e044da635b75aa9064e3df4c94b7135 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`37#&FAr*1S2@T(57if49 zxjF6ce52G;|DQZbF_^Ex5X@ur14P@0?mC zzf?)N;@v5YEYB^=bVO2x&Mxd&;S$gO!A5i?%go=2cTFeGZBe?S#kkO;oN14zhsGvu z*04vlGx$YQg}9sq7wAl42xobtFK}^+fXSDZz2FVdQ&MBb@ E0Cg@%vH$=8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hibernalherbs/textures/mob_effect/shrieking.png b/src/main/resources/assets/hibernalherbs/textures/mob_effect/shrieking.png new file mode 100644 index 0000000000000000000000000000000000000000..d7239e9a55b83fb0fe8d32c64b9746df41dd524c GIT binary patch literal 331 zcmV-R0kr;!P)=e3J`|T-}zsdJk4g?fdxpW zJT0HpVbUk__ZGw=Pp`rJl#0{up#`zXMy4{rPf>$^eSfr|pW{B7Wc0fBcDhypTJJtD zi{0wl5nX>yG~bAWEr0SU&P$xO~5*YN2%0)zok zn`8_QcFn!T|45IAK~1WCx@!M%0wh5&ve({}A=Ck4(VNZ!Rs-uA4xy(2u_>5x2Kzpt d0Rei%cLl}z1JM)RbCUo7002ovPDHLkV1gr^j}!m^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hibernalherbs/textures/mob_effect/swarming.png b/src/main/resources/assets/hibernalherbs/textures/mob_effect/swarming.png new file mode 100644 index 0000000000000000000000000000000000000000..912e8b6357cc7862e4efda9e431c6bd49e1f237f GIT binary patch literal 316 zcmV-C0mJ@@P)k_Q0j&wkSDys)kSLw?&$ibG*y0K#BR?`P_|9hqTy zI3>CwY}RjEuD+CTnGc++hfG@axLf4vkHrxbGN@Hj5P;Pmi=+8K?HPs!<2fMgP#LD< zdTN(xxIZoy0QvE_W`dyoY8(*=2s&YB+!Kae{RsiaPLOZrO*3PU6##~MQ}Sa~%Ox{m z&m1o#*B<~ASHcKF_|HVW2@ymArnOvM!RT{^P+vhDiMgH^5+AtMKj{s7Z%@*7m``T_ O0000!hU4{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hibernalherbs/textures/particle/instability.png b/src/main/resources/assets/hibernalherbs/textures/particle/instability.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d0f76f971776706a664aa28b46969ed89ec623 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFq>Ygr+Ar*1S2?}g?-u?I|AIrm+ tFzK{&+{3Vza3Sdf*{Wwu7KsS5GHC6V`1*=3b~jK9gQu&X%Q~loCIC{m8zTS! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hibernalherbs/textures/particle/shrieking.png b/src/main/resources/assets/hibernalherbs/textures/particle/shrieking.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9179a07be0afef28fbcfdc169099be358e719a GIT binary patch literal 112 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 DsEw%w diff --git a/src/main/resources/data/hibernalherbs/tags/enchantment/harvests_life_force.json b/src/main/resources/data/hibernalherbs/tags/enchantment/harvests_life_force.json index 5c0064ce..4e30c85f 100644 --- a/src/main/resources/data/hibernalherbs/tags/enchantment/harvests_life_force.json +++ b/src/main/resources/data/hibernalherbs/tags/enchantment/harvests_life_force.json @@ -1,5 +1,6 @@ { "values": [ - "hibernalherbs:slashing" + "hibernalherbs:slashing", + "minecraft:breach" ] } \ No newline at end of file diff --git a/src/main/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json b/src/main/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json new file mode 100644 index 00000000..370b8d80 --- /dev/null +++ b/src/main/resources/data/neoforge/loot_modifiers/global_loot_modifiers.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "entries": [ + "hibernalherbs:lingering_potions", + "hibernalherbs:ominous_vault_loot" + ] +} \ No newline at end of file diff --git a/src/main/resources/hibernalherbs.mixins.json b/src/main/resources/hibernalherbs.mixins.json index b2b04dcd..c564224a 100644 --- a/src/main/resources/hibernalherbs.mixins.json +++ b/src/main/resources/hibernalherbs.mixins.json @@ -7,6 +7,7 @@ "EnderManMixin", "GiveGiftToHeroMixin", "LivingEntityMixin", + "MaceItemMixin", "PiglinAiMixin", "PlayerMixin", "VillagerMixin", @@ -14,5 +15,5 @@ ], "injectors": { "defaultRequire": 1 - } + } } \ No newline at end of file