From 84fab399e84631857746da10ab8e9fbd210c75ae Mon Sep 17 00:00:00 2001 From: Aizistral Date: Sun, 28 Jul 2024 00:02:46 +0200 Subject: [PATCH] The Pan Update (#515) * Update .gitignore * Don't disable Gradle daemon * Update accesstransformer.cfg * Update build.gradle * Make cursed time requirement configurable * Add Ender Slayer/Forbidden Axe to the creative tab * Rename some materials * Make The Judgement deal infinite damage * Add suspicious sand tables to The One Box * Update Dimensional Anchor dispenser behavior * Make Infinimeal compatible with dispenser * Add Heart of the Earth to suspicious block drops * Update ForbiddenAxe.java * Add /setnoringtime and /getnoringtime commands * Implement the Eldritch Pan * Add attribution text for metal clangs to mod description --- .gitignore | 3 +- build.gradle | 9 +- gradle.properties | 4 +- .../enigmaticlegacy/EnigmaticLegacy.java | 1 - .../api/materials/EnigmaticMaterials.java | 6 +- .../blocks/BlockEndAnchor.java | 3 + .../effects/GrowingBloodlustEffect.java | 74 ++++ .../effects/GrowingHungerEffect.java | 69 +++ .../handlers/EnigmaticEventHandler.java | 263 +++++++++-- .../handlers/SuperpositionHandler.java | 192 +++++--- .../helpers/ItemLoreHelper.java | 11 +- .../enigmaticlegacy/items/CursedRing.java | 6 + .../enigmaticlegacy/items/EldritchPan.java | 416 ++++++++++++++++++ .../enigmaticlegacy/items/EnderSlayer.java | 17 +- .../enigmaticlegacy/items/ForbiddenAxe.java | 20 +- .../enigmaticlegacy/items/Infinimeal.java | 204 ++++++--- .../enigmaticlegacy/items/LootGenerator.java | 6 + .../enigmaticlegacy/items/TheJudgement.java | 2 +- .../mixin/MixinLivingEntity.java | 4 +- .../objects/SpecialLootModifier.java | 38 ++ .../enigmaticlegacy/proxy/ClientProxy.java | 11 +- .../registries/EnigmaticEffects.java | 8 + .../registries/EnigmaticItems.java | 5 + .../registries/EnigmaticSounds.java | 8 + .../resources/META-INF/accesstransformer.cfg | 3 +- .../assets/enigmaticlegacy/lang/en_us.json | 32 ++ .../models/item/eldritch_pan.json | 16 + .../models/item/eldritch_pan_blocking.json | 24 + .../item/eldritch_pan_blocking_in_hand.json | 25 ++ .../models/item/eldritch_pan_idle.json | 24 + .../item/eldritch_pan_idle_in_hand.json | 244 ++++++++++ .../item/eldritch_pan_in_inventory.json | 6 + .../en_us/entries/tools/eldritch_pan.json | 38 ++ .../assets/enigmaticlegacy/sounds.json | 22 + .../sounds/misc/pan_clang_1.ogg | Bin 0 -> 17331 bytes .../sounds/misc/pan_clang_2.ogg | Bin 0 -> 18892 bytes .../sounds/misc/pan_clang_3.ogg | Bin 0 -> 18446 bytes .../sounds/misc/pan_clang_fr.ogg | Bin 0 -> 48019 bytes .../textures/item/eldritch_pan.png | Bin 0 -> 494 bytes .../textures/item/eldritch_pan.png.mcmeta | 19 + .../textures/item/eldritch_pan_model.png | Bin 0 -> 1369 bytes .../item/eldritch_pan_model.png.mcmeta | 6 + .../textures/item/eldritch_pan_temp.png | Bin 0 -> 225 bytes .../textures/mob_effect/growing_bloodlust.png | Bin 0 -> 374 bytes .../textures/mob_effect/growing_hunger.png | Bin 0 -> 399 bytes .../advancements/book/tools/eldritch_pan.json | 17 + .../recipes/generic/eldritch_pan.json | 50 +++ .../enigmaticlegacy/recipes/eldritch_pan.json | 37 ++ 48 files changed, 1756 insertions(+), 187 deletions(-) create mode 100644 src/main/java/com/aizistral/enigmaticlegacy/effects/GrowingBloodlustEffect.java create mode 100644 src/main/java/com/aizistral/enigmaticlegacy/effects/GrowingHungerEffect.java create mode 100644 src/main/java/com/aizistral/enigmaticlegacy/items/EldritchPan.java create mode 100644 src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan.json create mode 100644 src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_blocking.json create mode 100644 src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_blocking_in_hand.json create mode 100644 src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_idle.json create mode 100644 src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_idle_in_hand.json create mode 100644 src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_in_inventory.json create mode 100644 src/main/resources/assets/enigmaticlegacy/patchouli_books/the_acknowledgment/en_us/entries/tools/eldritch_pan.json create mode 100644 src/main/resources/assets/enigmaticlegacy/sounds/misc/pan_clang_1.ogg create mode 100644 src/main/resources/assets/enigmaticlegacy/sounds/misc/pan_clang_2.ogg create mode 100644 src/main/resources/assets/enigmaticlegacy/sounds/misc/pan_clang_3.ogg create mode 100644 src/main/resources/assets/enigmaticlegacy/sounds/misc/pan_clang_fr.ogg create mode 100644 src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan.png create mode 100644 src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan.png.mcmeta create mode 100644 src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_model.png create mode 100644 src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_model.png.mcmeta create mode 100644 src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_temp.png create mode 100644 src/main/resources/assets/enigmaticlegacy/textures/mob_effect/growing_bloodlust.png create mode 100644 src/main/resources/assets/enigmaticlegacy/textures/mob_effect/growing_hunger.png create mode 100644 src/main/resources/data/enigmaticlegacy/advancements/book/tools/eldritch_pan.json create mode 100644 src/main/resources/data/enigmaticlegacy/advancements/recipes/generic/eldritch_pan.json create mode 100644 src/main/resources/data/enigmaticlegacy/recipes/eldritch_pan.json diff --git a/.gitignore b/.gitignore index 189e9859..97018307 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,5 @@ old_changelog.txt !updateResources.bat /.apt_generated_tests/ -model \ No newline at end of file +model +/.run diff --git a/build.gradle b/build.gradle index 0e18ece0..025f719f 100644 --- a/build.gradle +++ b/build.gradle @@ -74,11 +74,10 @@ dependencies { annotationProcessor 'org.ow2.asm:asm-util:7.2' // These are 1.20.1 dependencies - compileOnly fg.deobf('generic:curios:forge-5.2.0-beta.3+1.20.1') - compileOnly fg.deobf('generic:Patchouli:1.20.1-81-FORGE') - compileOnly fg.deobf('generic:caelus:forge-3.1.0+1.20') - compileOnly fg.deobf('generic:jei:1.18.2-forge-10.2.1.283-stripped') - compileOnly fg.deobf('generic:WorldNameRandomizer:FORGE-1.19.2-v1.5.0') + implementation fg.deobf('generic:curios:forge-5.2.0-beta.3+1.20.1') + implementation fg.deobf('generic:Patchouli:1.20.1-81-FORGE') + implementation fg.deobf('generic:caelus:forge-3.1.0+1.20') + implementation fg.deobf('generic:jei:1.18.2-forge-10.2.1.283-stripped') // These are 1.19 dependencies //compileOnly fg.deobf('generic:curios:forge-1.19.4-5.1.5.3') diff --git a/gradle.properties b/gradle.properties index fb3c93d2..235ca6a1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # Gradle org.gradle.jvmargs=-Xmx4G -Xms4G -org.gradle.daemon=false +#org.gradle.daemon=false # The Acknowledgment Edition the_acknowledgment_edition=20 @@ -17,7 +17,7 @@ mod_author=Aizistral mod_description=This mod is designed to provide tools that will aid you in exploring seemingly endless reaches of Minecraft's worlds. As well as new resources, powerful gear and ancient relics - to reward you for doing so. Despite revolving around themes of arcane and mystery, Enigmatic Legacy doesn't stray too far away from what vanilla has to offer, instead attempting to expand upon it's mechanics and fill in the holes left open. -mod_credits=Terraria and some of it's mods, for inspiring my creations functionally and visually; Minecraft Dungeons, for blocks and models that make me question why we don't have anything like this in Minecraft itself; Botania and it's creator known as Vazkii, for some basic code I could conveniently borrow instead of having to re-invent the wheel; frdovahkick, for amazing work over some of the textures in the mod; SkySem, for some models and textures created on-comission; SoulRacer65, for some textures overhauls and entirely new textures. +mod_credits=Terraria and some of it's mods, for inspiring my creations functionally and visually; Minecraft Dungeons, for blocks and models that make me question why we don't have anything like this in Minecraft itself; Botania and it's creator known as Vazkii, for some basic code I could conveniently borrow instead of having to re-invent the wheel; frdovahkick, for amazing work over some of the textures in the mod; SkySem, for some models and textures created on-comission; SoulRacer65, for some textures overhauls and entirely new textures; Cartoony Clangs (hit with spade)_16bit.wav by Timbre -- https://freesound.org/s/91696/ -- License: Attribution NonCommercial 4.0; Shovel Thwack 1.wav by snardin42 -- https://freesound.org/s/73200/ -- License: Creative Commons 0 mod_icon=EL_logo.png mod_license=Enigmatic Legacy License diff --git a/src/main/java/com/aizistral/enigmaticlegacy/EnigmaticLegacy.java b/src/main/java/com/aizistral/enigmaticlegacy/EnigmaticLegacy.java index d35ecb78..0a8cd000 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/EnigmaticLegacy.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/EnigmaticLegacy.java @@ -437,7 +437,6 @@ private void onServerStarted(ServerStartedEvent event) { /** * Alright boys, it's cleanup time! - * @param event */ public void performCleanup() { diff --git a/src/main/java/com/aizistral/enigmaticlegacy/api/materials/EnigmaticMaterials.java b/src/main/java/com/aizistral/enigmaticlegacy/api/materials/EnigmaticMaterials.java index 99bbb829..491090a4 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/api/materials/EnigmaticMaterials.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/api/materials/EnigmaticMaterials.java @@ -4,6 +4,7 @@ import java.util.Objects; import java.util.function.Supplier; +import com.aizistral.enigmaticlegacy.items.EldritchPan; import com.aizistral.etherium.core.IEtheriumConfig; import net.minecraft.resources.ResourceLocation; @@ -19,8 +20,9 @@ */ public enum EnigmaticMaterials implements Tier { - FORBIDDENAXE(0, 2000, 6.0F, 3.0F, 16, () -> Ingredient.EMPTY), - ENDERSLAYER(0, 2000, 6.0F, 3.0F, 16, () -> Ingredient.of(Blocks.OBSIDIAN)), + ELDRITCH_PAN(0, 4000, 6.0F, 3.0F, 24, EldritchPan::getRepairMaterial), + FORBIDDEN_AXE(0, 2000, 6.0F, 3.0F, 16, () -> Ingredient.EMPTY), + ENDER_SLAYER(0, 2000, 6.0F, 3.0F, 16, () -> Ingredient.of(Blocks.OBSIDIAN)), ETHERIUM(5, 3000, 8.0F, 5.0F, 32, () -> getEtheriumConfig().getRepairMaterial()), CREATION(6, 10000, 32.0F, 0.0F, 40, () -> Ingredient.EMPTY); diff --git a/src/main/java/com/aizistral/enigmaticlegacy/blocks/BlockEndAnchor.java b/src/main/java/com/aizistral/enigmaticlegacy/blocks/BlockEndAnchor.java index b19a64c7..0a17514f 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/blocks/BlockEndAnchor.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/blocks/BlockEndAnchor.java @@ -80,6 +80,9 @@ public ItemStack execute(BlockSource source, ItemStack stack) { stack.shrink(1); this.setSuccess(true); return stack; + } else { + this.setSuccess(false); + return stack; } } diff --git a/src/main/java/com/aizistral/enigmaticlegacy/effects/GrowingBloodlustEffect.java b/src/main/java/com/aizistral/enigmaticlegacy/effects/GrowingBloodlustEffect.java new file mode 100644 index 00000000..9bd542f2 --- /dev/null +++ b/src/main/java/com/aizistral/enigmaticlegacy/effects/GrowingBloodlustEffect.java @@ -0,0 +1,74 @@ +package com.aizistral.enigmaticlegacy.effects; + +import com.aizistral.enigmaticlegacy.api.generic.SubscribeConfig; +import com.aizistral.omniconfig.Configuration; +import com.aizistral.omniconfig.wrappers.Omniconfig; +import com.aizistral.omniconfig.wrappers.OmniconfigWrapper; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; + +public class GrowingBloodlustEffect extends MobEffect { + public static Omniconfig.DoubleParameter damageBoost = null; + public static Omniconfig.DoubleParameter lifestealBoost = null; + public static Omniconfig.DoubleParameter healthLossLimit = null; + public static Omniconfig.IntParameter healthLossTicks = null; + public static Omniconfig.IntParameter ticksPerLevel = null; + + @SubscribeConfig(receiveClient = true) + public static void onConfig(OmniconfigWrapper builder) { + builder.pushPrefix("GrowingBloodlust"); + + if (builder.config.getSidedType() != Configuration.SidedConfigType.CLIENT) { + damageBoost = builder + .comment("Damage boost granted by the Growing Bloodlust, per level of effect.") + .max(100) + .getDouble("DamageBoost", 0.05); + + lifestealBoost = builder + .comment("Lifesteal granted by the Growing Bloodlust, per level of effect.") + .max(100) + .getDouble("LifestealBoost", 0.025); + + healthLossTicks = builder + .comment("How often the player loses 1 HP at level one of Growing Bloodlust, in ticks.") + .getInt("HealthLossTicks", 160); + + healthLossLimit = builder + .comment("How much health Growing Bloodlust leaves the player with, as a fraction of max health.") + .getDouble("HealthLossLimit", 0.3); + + ticksPerLevel = builder + .comment("How lock the The Voracious Pan needs to be held, in ticks, to increase the strength " + + "of the Growing Bloodlust effect by one level.") + .getInt("TicksPerLevel", 300); + } + + builder.popPrefix(); + } + + public GrowingBloodlustEffect() { + super(MobEffectCategory.BENEFICIAL, 0xC30018); + this.addAttributeModifier(Attributes.ATTACK_DAMAGE, "d88f6930-fefb-4bf7-a418-f368458355ff", + damageBoost.getValue(), AttributeModifier.Operation.MULTIPLY_TOTAL); + } + + @Override + public void applyEffectTick(LivingEntity living, int amplifier) { + if (living instanceof ServerPlayer player && !player.isCreative() && !player.isSpectator()) { + if ((player.getHealth() / player.getMaxHealth()) > healthLossLimit.getValue()) { + player.setHealth(player.getHealth() - 1); + } + } + } + + @Override + public boolean isDurationEffectTick(int duration, int amplifier) { + int period = healthLossTicks.getValue() / (1 + amplifier); + return duration % period == 0; + } + +} diff --git a/src/main/java/com/aizistral/enigmaticlegacy/effects/GrowingHungerEffect.java b/src/main/java/com/aizistral/enigmaticlegacy/effects/GrowingHungerEffect.java new file mode 100644 index 00000000..a341ae89 --- /dev/null +++ b/src/main/java/com/aizistral/enigmaticlegacy/effects/GrowingHungerEffect.java @@ -0,0 +1,69 @@ +package com.aizistral.enigmaticlegacy.effects; + +import com.aizistral.enigmaticlegacy.api.generic.SubscribeConfig; +import com.aizistral.omniconfig.Configuration; +import com.aizistral.omniconfig.wrappers.Omniconfig; +import com.aizistral.omniconfig.wrappers.OmniconfigWrapper; +import com.google.common.collect.ImmutableList; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; + +import java.util.List; +import java.util.Map; + +public class GrowingHungerEffect extends MobEffect { + public static Omniconfig.DoubleParameter damageBoost = null; + public static Omniconfig.DoubleParameter exhaustionGain = null; + public static Omniconfig.IntParameter ticksPerLevel = null; + + @SubscribeConfig(receiveClient = true) + public static void onConfig(OmniconfigWrapper builder) { + builder.pushPrefix("GrowingHunger"); + + if (builder.config.getSidedType() != Configuration.SidedConfigType.CLIENT) { + damageBoost = builder + .comment("Damage boost granted by the Growing Hunger, per level of effect.") + .max(100) + .getDouble("DamageBoost", 0.1); + + exhaustionGain = builder + .comment("Exhaustion applied by Growing Hunger every 4 ticks, per level of effect.") + .getDouble("ExhaustionGain", 0.5); + + ticksPerLevel = builder + .comment("How lock the The Voracious Pan needs to be held, in ticks, to increase the strength " + + "of the Growing Hunger effect by one level.") + .getInt("TicksPerLevel", 300); + } + + builder.popPrefix(); + } + + public GrowingHungerEffect() { + super(MobEffectCategory.BENEFICIAL, 0xBD1BE5); + this.addAttributeModifier(Attributes.ATTACK_DAMAGE, "c281d54f-3277-4e4c-899e-c27f4f697b24", + damageBoost.getValue(), AttributeModifier.Operation.MULTIPLY_TOTAL); + } + + @Override + public void applyEffectTick(LivingEntity living, int amplifier) { + if (living instanceof ServerPlayer player) { + player.causeFoodExhaustion((float) (exhaustionGain.getValue() * (1 + amplifier))); + } + } + + @Override + public boolean isDurationEffectTick(int duration, int amplifier) { + return duration % 4 == 0; + } + +} \ No newline at end of file diff --git a/src/main/java/com/aizistral/enigmaticlegacy/handlers/EnigmaticEventHandler.java b/src/main/java/com/aizistral/enigmaticlegacy/handlers/EnigmaticEventHandler.java index 1651b9da..23dce1ec 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/handlers/EnigmaticEventHandler.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/handlers/EnigmaticEventHandler.java @@ -12,6 +12,13 @@ import java.util.UUID; import java.util.WeakHashMap; +import com.aizistral.enigmaticlegacy.effects.GrowingBloodlustEffect; +import com.aizistral.enigmaticlegacy.effects.GrowingHungerEffect; +import com.aizistral.enigmaticlegacy.items.*; +import com.google.common.collect.ImmutableList; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SmeltingRecipe; import org.apache.commons.lang3.tuple.Triple; import com.aizistral.enigmaticlegacy.EnigmaticLegacy; @@ -38,27 +45,6 @@ import com.aizistral.enigmaticlegacy.helpers.ItemLoreHelper; import com.aizistral.enigmaticlegacy.helpers.ItemNBTHelper; import com.aizistral.enigmaticlegacy.helpers.PotionHelper; -import com.aizistral.enigmaticlegacy.items.AngelBlessing; -import com.aizistral.enigmaticlegacy.items.AvariceScroll; -import com.aizistral.enigmaticlegacy.items.BerserkEmblem; -import com.aizistral.enigmaticlegacy.items.BlazingCore; -import com.aizistral.enigmaticlegacy.items.CosmicScroll; -import com.aizistral.enigmaticlegacy.items.CursedRing; -import com.aizistral.enigmaticlegacy.items.CursedScroll; -import com.aizistral.enigmaticlegacy.items.EnderSlayer; -import com.aizistral.enigmaticlegacy.items.EnigmaticAmulet; -import com.aizistral.enigmaticlegacy.items.EyeOfNebula; -import com.aizistral.enigmaticlegacy.items.ForbiddenAxe; -import com.aizistral.enigmaticlegacy.items.ForbiddenFruit; -import com.aizistral.enigmaticlegacy.items.HunterGuidebook; -import com.aizistral.enigmaticlegacy.items.InfernalShield; -import com.aizistral.enigmaticlegacy.items.MiningCharm; -import com.aizistral.enigmaticlegacy.items.MonsterCharm; -import com.aizistral.enigmaticlegacy.items.OceanStone; -import com.aizistral.enigmaticlegacy.items.RevelationTome; -import com.aizistral.enigmaticlegacy.items.TheInfinitum; -import com.aizistral.enigmaticlegacy.items.TheTwist; -import com.aizistral.enigmaticlegacy.items.VoidPearl; import com.aizistral.enigmaticlegacy.items.EnigmaticAmulet.AmuletColor; import com.aizistral.enigmaticlegacy.items.generic.ItemSpellstoneCurio; import com.aizistral.enigmaticlegacy.mixin.AccessorAbstractArrowEntity; @@ -293,6 +279,8 @@ import top.theillusivec4.curios.api.type.capability.ICurio.DropRule; import top.theillusivec4.curios.client.gui.CuriosScreen; +import javax.tools.Tool; + /** * Generic event handler of the whole mod. * @author Integral @@ -480,6 +468,47 @@ public void onCommandRegistry(RegisterCommandsEvent event) { .executes(EnigmaticEventHandler::handleSetRingTime))); event.getDispatcher().register(builder); + + builder = Commands.literal("setnoringtime").requires((source) -> source.hasPermission(4)) + .then(Commands.argument("player", EntityArgument.player()) + .then(Commands.argument("ticks", LongArgumentType.longArg(0)) + .executes(EnigmaticEventHandler::handleSetNoRingTime))); + + event.getDispatcher().register(builder); + + builder = Commands.literal("getnoringtime").requires((source) -> source.hasPermission(4)) + .then(Commands.argument("player", EntityArgument.player()) + .executes(EnigmaticEventHandler::handleGetNoRingTime)); + + event.getDispatcher().register(builder); + } + + private static int handleGetNoRingTime(CommandContext source) throws CommandSyntaxException { + ServerPlayer player = EntityArgument.getPlayer(source, "player"); + IPlaytimeCounter counter = IPlaytimeCounter.get(player); + String name = player.getDisplayName().getString(); + long time = counter.getTimeWithoutCurses(); + String percent = SuperpositionHandler.getNoSufferingTime(player); + + Component reply = Component.literal(name + " is not bearing the Seven Curses for " + time + + " ticks, or " + percent + " of their time in this world.").withStyle(ChatFormatting.GREEN); + source.getSource().sendSuccess(() -> reply, true); + return Command.SINGLE_SUCCESS; + } + + private static int handleSetNoRingTime(CommandContext source) throws CommandSyntaxException { + ServerPlayer player = EntityArgument.getPlayer(source, "player"); + long ticks = LongArgumentType.getLong(source, "ticks"); + IPlaytimeCounter counter = IPlaytimeCounter.get(player); + String name = player.getDisplayName().getString(); + + counter.setTimeWithoutCurses(ticks); + ticks = counter.getTimeWithoutCurses(); + + Component reply = Component.literal(name + "'s time without Seven Curses was set to " + ticks + + " ticks.").withStyle(ChatFormatting.GREEN); + source.getSource().sendSuccess(() -> reply, true); + return Command.SINGLE_SUCCESS; } private static int handleGetRingTime(CommandContext source) throws CommandSyntaxException { @@ -971,7 +1000,7 @@ private void syncPlayTime(Player player) { } @SubscribeEvent - public void onPlayerTick(PlayerChangedDimensionEvent event) { + public void onPlayerTravel(PlayerChangedDimensionEvent event) { if (event.getEntity() instanceof ServerPlayer player) { LAST_SOUL_COMPASS_UPDATE.remove(player); @@ -1145,7 +1174,7 @@ public void onPlayerTick(LivingTickEvent event) { } */ - if (player instanceof ServerPlayer) { + if (player instanceof ServerPlayer serverPlayer) { /* * Handler for players' spellstone cooldowns. @@ -1197,6 +1226,38 @@ public void onPlayerTick(LivingTickEvent event) { } } } + + /* + * Handle Growing Hunger application. + */ + + List handItems = ImmutableList.of(player.getMainHandItem()/*, player.getOffhandItem()*/); + + if (handItems.stream().anyMatch(s -> s.is(EnigmaticItems.ELDRITCH_PAN))) { + int currentTicks = EldritchPan.HOLDING_DURATIONS.getOrDefault(player, 0); + + if (SuperpositionHandler.cannotHunger(player)) { + int bloodlustAmplifier = currentTicks / GrowingBloodlustEffect.ticksPerLevel.getValue(); + + bloodlustAmplifier = Math.min(bloodlustAmplifier, 9); + + player.addEffect(new MobEffectInstance(EnigmaticEffects.GROWING_BLOODLUST, + MobEffectInstance.INFINITE_DURATION, bloodlustAmplifier, true, true)); + } else { + int hungerAmplifier = currentTicks / GrowingHungerEffect.ticksPerLevel.getValue(); + + hungerAmplifier = Math.min(hungerAmplifier, 9); + + player.addEffect(new MobEffectInstance(EnigmaticEffects.GROWING_HUNGER, + MobEffectInstance.INFINITE_DURATION, hungerAmplifier, true, true)); + } + + EldritchPan.HOLDING_DURATIONS.put(player, currentTicks + 1); + } else { + EldritchPan.HOLDING_DURATIONS.put(player, 0); + player.removeEffect(EnigmaticEffects.GROWING_HUNGER); + player.removeEffect(EnigmaticEffects.GROWING_BLOODLUST); + } } } @@ -1309,9 +1370,22 @@ public void onConfirmedDeath(LivingDeathEvent event) { SuperpositionHandler.setPersistentInteger(player, "TimesKilledWither", killedWither); } } + + if (event.getSource().getDirectEntity() instanceof ServerPlayer attacker) { + ItemStack weapon = attacker.getMainHandItem(); + + if (weapon.is(EnigmaticItems.ELDRITCH_PAN)) { + ResourceLocation killedType = ForgeRegistries.ENTITY_TYPES.getKey(event.getEntity().getType()); + + if (EldritchPan.addKillIfNotPresent(weapon, killedType)) { + attacker.sendSystemMessage(Component.translatable("message.enigmaticlegacy.eldritch_pan_buff") + .withStyle(ChatFormatting.GOLD)); + } + } + } } - @SubscribeEvent + @SubscribeEvent public void onCurioDrops(DropRulesEvent event) { event.addOverride(stack -> stack.getEnchantmentLevel(EnigmaticEnchantments.ETERNAL_BINDING) > 0, DropRule.ALWAYS_KEEP); @@ -1379,6 +1453,60 @@ private boolean isThereLava(Level world, BlockPos pos) { return false; } +// @OnlyIn(Dist.CLIENT) +// @SubscribeEvent(priority = EventPriority.HIGHEST) +// public void onEarlyTooltip(ItemTooltipEvent event) { +// if (event.getItemStack().is(EnigmaticItems.ELDRITCH_PAN)) { +// List modifierIndexes = new ArrayList<>(); +// +// for (int i = 0; i < event.getToolTip().size(); i++) { +// Component line = event.getToolTip().get(i); +// +// if (line.getContents() instanceof TranslatableContents contents) { +// if (contents.getKey().startsWith("item.modifiers.") +// || contents.getKey().startsWith("attribute.modifier.")) { +// modifierIndexes.add(i); +// } +// } +// } +// +// List modifierIndexesCopy = new ArrayList<>(modifierIndexes); +// +// for (int i = 0; i < modifierIndexesCopy.size(); i++) { +// int prevIndex = i - 1; +// int currentValue = modifierIndexesCopy.get(i); +// +// if (prevIndex < 0) { +// modifierIndexes.add(currentValue - 1); +// continue; +// } +// +// int prevValue = modifierIndexesCopy.get(prevIndex); +// +// if (currentValue - prevValue > 1) { +// modifierIndexes.add(currentValue - 1); +// } +// } +// +// //modifierIndexes.stream().map(event.getToolTip()::get).forEach(event.getToolTip()::remove); +// +// List removedLines = new ArrayList<>(); +// +// try { +// for (int index : modifierIndexes) { +// Component line = event.getToolTip().get(index); +// removedLines.add(line); +// } +// +// for (Component line : removedLines) { +// event.getToolTip().remove(line); +// } +// } catch (Throwable ex) { +// ex.printStackTrace(); +// } +// } +// } + @SubscribeEvent(priority = EventPriority.HIGHEST) public void onLivingDeath(LivingDeathEvent event) { @@ -1793,9 +1921,55 @@ public void onEntityDamaged(LivingDamageEvent event) { } } + if (player.getMainHandItem() != null && player.getMainHandItem().getItem() == EnigmaticItems.ELDRITCH_PAN) { + if (SuperpositionHandler.isTheWorthyOne(player)) { + lifesteal += event.getAmount() * EldritchPan.lifeSteal.getValue(); + } + } + + if (player.hasEffect(EnigmaticEffects.GROWING_BLOODLUST)) { + int amplifier = 1 + player.getEffect(EnigmaticEffects.GROWING_BLOODLUST).getAmplifier(); + lifesteal += event.getAmount() * (GrowingBloodlustEffect.lifestealBoost.getValue() * amplifier); + } + if (lifesteal > 0) { player.heal(lifesteal); } + + float hungersteal = 0F; + + if (player.getMainHandItem() != null && player.getMainHandItem().getItem() == EnigmaticItems.ELDRITCH_PAN) { + if (SuperpositionHandler.isTheWorthyOne(player)) { + hungersteal += EldritchPan.hungerSteal.getValue(); + } + } + + if (hungersteal > 0) { + boolean noHunger = SuperpositionHandler.cannotHunger(player); + + if (event.getEntity() instanceof ServerPlayer victim) { + FoodData victimFood = victim.getFoodData(); + FoodData attackerFood = player.getFoodData(); + + int foodSteal = Math.min((int) Math.ceil(hungersteal), victimFood.getFoodLevel()); + float saturationSteal = Math.min(hungersteal / 5F, victimFood.getSaturationLevel()); + + victimFood.setSaturation(victimFood.getSaturationLevel() - saturationSteal); + victimFood.setFoodLevel(victimFood.getFoodLevel() - foodSteal); + + if (noHunger) { + player.heal((float) foodSteal / 2); + } else { + attackerFood.eat(foodSteal, saturationSteal); + } + } else { + if (noHunger) { + player.heal(hungersteal / 2); + } else { + player.getFoodData().eat((int) Math.ceil(hungersteal), hungersteal / 5F); + } + } + } } } @@ -1937,6 +2111,10 @@ public void onEntityHurt(LivingHurtEvent event) { player.addEffect(new MobEffectInstance(MobEffects.DIG_SLOWDOWN, 300, 3, false, true)); player.addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 100, 3, false, true)); } + } else if (mainhandStack.is(EnigmaticItems.ELDRITCH_PAN)) { + if (!SuperpositionHandler.isTheWorthyOne(player)) { + event.setCanceled(true); + } } else if (mainhandStack.is(EnigmaticItems.ENDER_SLAYER)) { if (SuperpositionHandler.isTheCursedOne(player)) { if (EnigmaticItems.ENDER_SLAYER.isEndDweller(event.getEntity())) { @@ -2094,7 +2272,9 @@ public void onEntityHurt(LivingHurtEvent event) { boolean bypass = false; if (event.getSource().getDirectEntity() == player) - if (player.getMainHandItem().getItem() == EnigmaticItems.THE_TWIST || player.getMainHandItem().getItem() == EnigmaticItems.THE_INFINITUM) { + if (player.getMainHandItem().getItem() == EnigmaticItems.THE_TWIST + || player.getMainHandItem().getItem() == EnigmaticItems.THE_INFINITUM + || player.getMainHandItem().getItem() == EnigmaticItems.ELDRITCH_PAN) { // Don't do worthiness check since event is gonna be canceled for non-worthy already bypass = true; } @@ -2480,6 +2660,37 @@ public void onLivingDrops(LivingDropsEvent event) { @SubscribeEvent(priority = EventPriority.LOWEST) public void onLivingDropsLowest(LivingDropsEvent event) { + Level level = event.getEntity().level(); + + /* + * Eldritch Pan cooking logic. + */ + + if (event.getSource().getDirectEntity() instanceof ServerPlayer player) + if (SuperpositionHandler.isTheWorthyOne(player)) + if (player.getMainHandItem().is(EnigmaticItems.ELDRITCH_PAN) + || player.getOffhandItem().is(EnigmaticItems.ELDRITCH_PAN)) + for (ItemEntity drop : new ArrayList<>(event.getDrops())) { + ItemStack stack = drop.getItem(); + Optional optional = level.getRecipeManager().getRecipeFor( + RecipeType.SMELTING, new SimpleContainer(stack), level); + + optional.ifPresent(recipe -> { + ItemStack result = recipe.getResultItem(level.registryAccess()); + + if (!result.isEmpty()) { + ItemStack cooked = result.copyWithCount(stack.getCount() * result.getCount()); + + event.getDrops().remove(drop); + this.addDrop(event, cooked); + } + }); + } + + /* + * Escape Scroll logic. + */ + if (event.getEntity() instanceof ServerPlayer player) { CompoundTag deathLocation = new CompoundTag(); deathLocation.putDouble("x", player.getX()); @@ -2576,7 +2787,7 @@ public void onLivingDropsLowest(LivingDropsEvent event) { } /* - * Unique drops for Ring of the Seven Curses. + * Ender Slayer XP conversion. */ if (event.isRecentlyHit() && event.getSource() != null && event.getSource().getEntity() instanceof Player && SuperpositionHandler.isTheCursedOne((Player) event.getSource().getEntity())) { diff --git a/src/main/java/com/aizistral/enigmaticlegacy/handlers/SuperpositionHandler.java b/src/main/java/com/aizistral/enigmaticlegacy/handlers/SuperpositionHandler.java index aa2c02e5..cfe21b1b 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/handlers/SuperpositionHandler.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/handlers/SuperpositionHandler.java @@ -21,6 +21,16 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import com.aizistral.enigmaticlegacy.items.*; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.Difficulty; +import net.minecraft.world.entity.projectile.Fireball; +import net.minecraft.world.entity.projectile.LargeFireball; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.food.FoodData; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.gameevent.GameEvent; import org.apache.commons.lang3.mutable.MutableBoolean; import org.apache.commons.lang3.tuple.ImmutableTriple; import org.joml.Matrix4f; @@ -34,9 +44,6 @@ import com.aizistral.enigmaticlegacy.api.quack.IProperShieldUser; import com.aizistral.enigmaticlegacy.config.OmniconfigHandler; import com.aizistral.enigmaticlegacy.helpers.AdvancedSpawnLocationHelper; -import com.aizistral.enigmaticlegacy.items.GolemHeart; -import com.aizistral.enigmaticlegacy.items.InfernalShield; -import com.aizistral.enigmaticlegacy.items.TheAcknowledgment; import com.aizistral.enigmaticlegacy.items.generic.ItemSpellstoneCurio; import com.aizistral.enigmaticlegacy.objects.DimensionalPosition; import com.aizistral.enigmaticlegacy.objects.EnigmaticTransience; @@ -154,6 +161,9 @@ import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; import top.theillusivec4.curios.api.type.util.ICuriosHelper; +import java.math.BigDecimal; +import java.math.RoundingMode; + /** * The core and vessel for most most of the handling methods in the Enigmatic Legacy. * @@ -1326,59 +1336,75 @@ public static boolean hasArchitectsFavor(Player player) { public static boolean isTheWorthyOne(Player player) { if (isTheCursedOne(player)) { - var counter = IPlaytimeCounter.get(player); - long timeWithRing = counter.getTimeWithCurses(); - long timeWithoutRing = counter.getTimeWithoutCurses(); - - if (timeWithRing <= 0) - return false; - else if (timeWithoutRing <= 0) - return true; - - return timeWithRing/timeWithoutRing >= 199L; + return getSufferingFraction(player) >= CursedRing.superCursedTime.getValue(); } else return false; } - public static String getSufferingTime(@Nullable Player player) { + public static double getSufferingFraction(@Nullable Player player) { if (player == null) - return "0%"; - else { - var counter = IPlaytimeCounter.get(player); - long timeWithRing = counter.getTimeWithCurses(); - long timeWithoutRing = counter.getTimeWithoutCurses(); + return 0; + + var counter = IPlaytimeCounter.get(player); + long timeWithRing = counter.getTimeWithCurses(); + long timeWithoutRing = counter.getTimeWithoutCurses(); + + if (timeWithRing <= 0) + return 0; + else if (timeWithoutRing <= 0) + return 1; + + if (timeWithRing > 100000 || timeWithoutRing > 100000) { + timeWithRing = timeWithRing / 100; + timeWithoutRing = timeWithoutRing / 100; + if (timeWithRing <= 0) - return "0%"; + return 0; else if (timeWithoutRing <= 0) - return "100%"; + return 1; + } - if (timeWithRing > 100000 || timeWithoutRing > 100000) { - timeWithRing = timeWithRing / 100; - timeWithoutRing = timeWithoutRing / 100; + double total = timeWithRing + timeWithoutRing; + double ringFraction = (timeWithRing / total); + ringFraction = roundToPlaces(ringFraction, 3); - if (timeWithRing <= 0) - return "0%"; - else if (timeWithoutRing <= 0) - return "100%"; - } + return ringFraction; + } - double total = timeWithRing + timeWithoutRing; - double ringPercent = (timeWithRing / total) * 100; - ringPercent = Math.round(ringPercent * 10.0)/10.0; - String text = ""; + public static String getSufferingTime(@Nullable Player player) { + String text = ""; - if (ringPercent - Math.round(ringPercent) == 0) { - text += ((int)ringPercent) + "%"; - } else { - text += ringPercent + "%"; - } + double ringPercent = 100 * getSufferingFraction(player); - if ("99.5%".equals(text) && !isTheWorthyOne(player)) { - text = "99.4%"; - } + ringPercent = roundToPlaces(ringPercent, 1); + if (ringPercent - Math.floor(ringPercent) == 0) { + text += ((int) ringPercent) + "%"; + } else { + text += ringPercent + "%"; + } + + return text; + } + + public static String getNoSufferingTime(@Nullable Player player) { + String text = ""; - return text; + double noRingPercent = 100 * (1.0 - getSufferingFraction(player)); + + if (noRingPercent - Math.floor(noRingPercent) == 0) { + text += ((int) noRingPercent) + "%"; + } else { + text += noRingPercent + "%"; } + + return text; + } + + public static double roundToPlaces(double value, int places) { + BigDecimal bd = new BigDecimal(Double.toString(value)); + bd = bd.setScale(places, RoundingMode.HALF_UP); + + return bd.doubleValue(); } public static float getMissingHealthPool(Player player) { @@ -1720,32 +1746,35 @@ public static boolean canUnequipBoundRelics(Player player) { return player.isCreative() || EnigmaticLegacy.SOUL_OF_THE_ARCHITECT.equals(player.getUUID()); } - public static void onDamageSourceBlocking(LivingEntity blocker, ItemStack useItem, DamageSource source, CallbackInfoReturnable info) { + public static boolean onDamageSourceBlocking(LivingEntity blocker, ItemStack useItem, DamageSource source, + CallbackInfoReturnable info) { if (blocker instanceof Player player && useItem != null) { boolean blocking = ((IProperShieldUser)blocker).isActuallyReallyBlocking(); - if (blocking && useItem.getItem() instanceof InfernalShield) { + if (!blocking) + return false; + + if (useItem.getItem() instanceof InfernalShield) { boolean piercingArrow = false; Entity entity = source.getDirectEntity(); - if (entity instanceof AbstractArrow) { - AbstractArrow abstractarrow = (AbstractArrow)entity; - if (abstractarrow.getPierceLevel() > 0) { + if (entity instanceof AbstractArrow arrow) { + if (arrow.getPierceLevel() > 0) { piercingArrow = true; } } piercingArrow = false; // defend against Piercing... for now - if (!source.is(DamageTypeTags.BYPASSES_SHIELD) && ((IProperShieldUser) blocker).isActuallyReallyBlocking() && !piercingArrow) { + if (!source.is(DamageTypeTags.BYPASSES_SHIELD) && !piercingArrow) { Vec3 sourcePos = source.getSourcePosition(); + if (sourcePos != null) { Vec3 lookVec = blocker.getViewVector(1.0F); Vec3 sourceToSelf = sourcePos.vectorTo(blocker.position()).normalize(); sourceToSelf = new Vec3(sourceToSelf.x, 0.0D, sourceToSelf.z); - if (sourceToSelf.dot(lookVec) < 0.0D) { - info.setReturnValue(true); + if (sourceToSelf.dot(lookVec) < 0.0D) { int strength = -1; if (player.hasEffect(EnigmaticEffects.BLAZING_STRENGTH)) { @@ -1773,15 +1802,72 @@ public static void onDamageSourceBlocking(LivingEntity blocker, ItemStack useIte } } - return; + return true; + } + } + } + } else if (useItem.getItem() instanceof EldritchPan) { + Entity projectile = source.getDirectEntity(); + + if (!(projectile instanceof Projectile)) + return false; + + if (!source.is(DamageTypeTags.BYPASSES_SHIELD)) { + Vec3 sourcePos = source.getSourcePosition(); + + if (sourcePos != null) { + Vec3 lookVec = blocker.getViewVector(1.0F); + Vec3 sourceToSelf = sourcePos.vectorTo(blocker.position()).normalize(); + sourceToSelf = new Vec3(sourceToSelf.x, 0.0D, sourceToSelf.z); + + if (sourceToSelf.dot(lookVec) < 0.0D) { + projectile.kill(); + + FoodData data = player.getFoodData(); + data.eat(4, 0.5F); + + player.level().playSound(null, player.getX(), player.getY(), player.getZ(), + SoundEvents.PLAYER_BURP, SoundSource.PLAYERS, 0.5F, + player.level().random.nextFloat() * 0.1F + 0.9F); + + player.gameEvent(GameEvent.EAT); + + if (projectile instanceof LargeFireball fireball) { + fireball.explosionPower = 0; + } + + if (player.level() instanceof ServerLevel level) { + Vec3 angle = player.getLookAngle(); + angle.multiply(1, 0, 1).normalize().multiply(0.5, 0.5, 0.5); + + level.sendParticles(new ItemParticleOption(ParticleTypes.ITEM, + new ItemStack(Items.FIRE_CHARGE)), player.getX() + angle.x, + player.getY() + player.getEyeHeight() - 0.1, player.getZ() + angle.z, + 10, 0.3D, 0.3D, 0.3D, 0.03D); + } + + return true; } } } + } + } + + return false; + } - info.setReturnValue(false); - return; + public static boolean cannotHunger(@Nullable Player player) { + boolean noHunger = false; + + if (player != null) { + if (EnigmaticItems.FORBIDDEN_FRUIT.haveConsumedFruit(player)) { + noHunger = true; + } else if (player.level().getDifficulty() == Difficulty.PEACEFUL) { + noHunger = true; } } + + return noHunger; } public static > void sortByKey(Map map) { diff --git a/src/main/java/com/aizistral/enigmaticlegacy/helpers/ItemLoreHelper.java b/src/main/java/com/aizistral/enigmaticlegacy/helpers/ItemLoreHelper.java index 7f962084..714ef128 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/helpers/ItemLoreHelper.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/helpers/ItemLoreHelper.java @@ -7,6 +7,7 @@ import com.aizistral.enigmaticlegacy.EnigmaticLegacy; import com.aizistral.enigmaticlegacy.handlers.SuperpositionHandler; +import com.aizistral.enigmaticlegacy.items.CursedRing; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; @@ -47,11 +48,17 @@ public static void indicateWorthyOnesOnly(List list) { format = SuperpositionHandler.isTheWorthyOne(Minecraft.getInstance().player) ? ChatFormatting.GOLD : ChatFormatting.DARK_RED; } + double requiredCurse = SuperpositionHandler.roundToPlaces(100 * CursedRing.superCursedTime.getValue(), 1); + list.add(Component.translatable("tooltip.enigmaticlegacy.worthyOnesOnly1")); - list.add(Component.translatable("tooltip.enigmaticlegacy.worthyOnesOnly2")); + list.add(Component.translatable("tooltip.enigmaticlegacy.worthyOnesOnly2", + Component.literal(requiredCurse + "%").withStyle(ChatFormatting.GOLD)) + .withStyle(format)); list.add(Component.translatable("tooltip.enigmaticlegacy.worthyOnesOnly3")); list.add(Component.translatable("tooltip.enigmaticlegacy.void")); - list.add(Component.translatable("tooltip.enigmaticlegacy.worthyOnesOnly4").withStyle(format).append(Component.literal(" " + SuperpositionHandler.getSufferingTime(player)).withStyle(ChatFormatting.LIGHT_PURPLE))); + list.add(Component.translatable("tooltip.enigmaticlegacy.worthyOnesOnly4") + .withStyle(format).append(Component.literal(" " + SuperpositionHandler.getSufferingTime(player)) + .withStyle(ChatFormatting.LIGHT_PURPLE))); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/aizistral/enigmaticlegacy/items/CursedRing.java b/src/main/java/com/aizistral/enigmaticlegacy/items/CursedRing.java index f0fd8c90..5b0396bf 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/items/CursedRing.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/items/CursedRing.java @@ -79,6 +79,8 @@ public class CursedRing extends ItemBaseCurio { public static Omniconfig.BooleanParameter autoEquip; public static final List neutralAngerBlacklist = new ArrayList<>(); + public static Omniconfig.DoubleParameter superCursedTime; + @SubscribeConfig(receiveClient = true) public static void onConfig(OmniconfigWrapper builder) { String prevCategory = builder.getCurrentCategory(); @@ -170,6 +172,10 @@ public static void onConfig(OmniconfigWrapper builder) { .min(8) .getDouble("EndermenRandomportRange", 32); + superCursedTime = builder + .comment("A fraction of time the player should bear the Seven Curses to use Abyssal Artifacts.") + .getDouble("SuperCursedTime", 0.995); + builder.popCategory(); builder.pushCategory("Save the Bees", "This category exists solely because of Jusey1z who really wanted to protect his bees." + Configuration.NEW_LINE + "Btw Jusey, when I said 'very cute though', I meant you. Bees are cute either of course."); diff --git a/src/main/java/com/aizistral/enigmaticlegacy/items/EldritchPan.java b/src/main/java/com/aizistral/enigmaticlegacy/items/EldritchPan.java new file mode 100644 index 00000000..cf564fe7 --- /dev/null +++ b/src/main/java/com/aizistral/enigmaticlegacy/items/EldritchPan.java @@ -0,0 +1,416 @@ +package com.aizistral.enigmaticlegacy.items; + +import java.util.*; + +import com.aizistral.enigmaticlegacy.EnigmaticLegacy; +import com.aizistral.enigmaticlegacy.api.generic.SubscribeConfig; +import com.aizistral.enigmaticlegacy.api.items.ICreativeTabMember; +import com.aizistral.enigmaticlegacy.api.items.ICursed; +import com.aizistral.enigmaticlegacy.api.items.ITaintable; +import com.aizistral.enigmaticlegacy.api.materials.EnigmaticMaterials; +import com.aizistral.enigmaticlegacy.handlers.SuperpositionHandler; +import com.aizistral.enigmaticlegacy.helpers.ItemLoreHelper; +import com.aizistral.enigmaticlegacy.items.generic.ItemBase; +import com.aizistral.enigmaticlegacy.items.generic.ItemBaseTool; +import com.aizistral.enigmaticlegacy.registries.EnigmaticItems; +import com.aizistral.enigmaticlegacy.registries.EnigmaticSounds; +import com.aizistral.enigmaticlegacy.registries.EnigmaticTabs; +import com.aizistral.omniconfig.wrappers.Omniconfig; +import com.aizistral.omniconfig.wrappers.OmniconfigWrapper; +import com.google.common.collect.*; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.Difficulty; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.*; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.ToolAction; +import net.minecraftforge.common.ToolActions; +import org.jetbrains.annotations.Nullable; + +public class EldritchPan extends TieredItem implements Vanishable, ICursed, ICreativeTabMember { + private static final UUID ARMOR_MODIFIER_UUID = UUID.fromString("2d5cac0e-598f-475b-97cb-c7ab4741d0f5"); + private static final ItemStack UNSUSPECTING_DIAMOND_SWORD = new ItemStack(Items.DIAMOND_SWORD); + public static final Map HOLDING_DURATIONS = new WeakHashMap<>(); + + // TODO: + // The Forbidden Fruit interaction + // Metal clang sound effect + // Make enchantable with sword enchants + // Repair with food + // The Acknowledgment lore + + public static Omniconfig.DoubleParameter attackDamage = null; + public static Omniconfig.DoubleParameter attackSpeed = null; + public static Omniconfig.DoubleParameter armorValue = null; + public static Omniconfig.DoubleParameter lifeSteal = null; + public static Omniconfig.DoubleParameter hungerSteal = null; + public static Omniconfig.DoubleParameter uniqueDamageGain = null; + public static Omniconfig.DoubleParameter uniqueArmorGain = null; + public static Omniconfig.IntParameter uniqueGainLimit = null; + + @SubscribeConfig + public static void onConfig(OmniconfigWrapper builder) { + builder.pushPrefix("EldritchPan"); + + attackDamage = builder + .comment("The base attack damage of The Voracious Pan.") + .max(32768).getDouble("AttackDamage", 31); + + attackSpeed = builder + .comment("The base attack speed of The Voracious Pan.") + .minMax(32768).getDouble("AttackSpeed", -3.2); + + armorValue = builder + .comment("The base armor value of The Voracious Pan.") + .max(32768).getDouble("ArmorValue", 4); + + lifeSteal = builder + .comment("Base Lifesteal fraction of The Voracious Pan.") + .max(32768).getDouble("LifeSteal", 0.15); + + hungerSteal = builder + .comment("Base Hungersteal value of The Voracious Pan.") + .max(32768).getDouble("HungerSteal", 2); + + uniqueDamageGain = builder + .comment("Base damage gain from unique mob kills for The Voracious Pan.") + .max(32768).getDouble("UniqueDamageGain", 0.5); + + uniqueArmorGain = builder + .comment("Base armor gain from unique mob kills for The Voracious Pan.") + .max(32768).getDouble("UniqueArmorGain", 0.5); + + uniqueGainLimit = builder + .comment("How many unique mob kills will count towards increasing the stats of The Voracious Pan.") + .max(32768).getInt("UniqueGainLimit", 100); + + builder.popPrefix(); + } + + private final Multimap defaultModifiers; + //private final float attackDamage, attackSpeed, armorValue; + + public EldritchPan() { + super(EnigmaticMaterials.ELDRITCH_PAN, + ItemBaseTool.getDefaultProperties() + .defaultDurability(4000) + .rarity(Rarity.EPIC) + .fireResistant()); + + + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", attackDamage.getValue(), AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", attackSpeed.getValue(), AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID, "Weapon modifier", armorValue.getValue(), AttributeModifier.Operation.ADDITION)); + this.defaultModifiers = builder.build(); + + DispenserBlock.registerBehavior(this, ArmorItem.DISPENSE_ITEM_BEHAVIOR); + } + + @Override + public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { + if (slot != EquipmentSlot.MAINHAND && slot != EquipmentSlot.OFFHAND) + return super.getDefaultAttributeModifiers(slot); + + return this.defaultModifiers; + } + + @Override + public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { + if (slot != EquipmentSlot.MAINHAND && slot != EquipmentSlot.OFFHAND) + return super.getDefaultAttributeModifiers(slot); + + int kills = getKillCount(stack); + + if (kills <= 0) + return super.getAttributeModifiers(slot, stack); + + double armor = armorValue.getValue() + (uniqueArmorGain.getValue() * kills); + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + + builder.put(Attributes.ARMOR, new AttributeModifier(ARMOR_MODIFIER_UUID, "Weapon modifier", + armor, AttributeModifier.Operation.ADDITION)); + + if (slot != EquipmentSlot.MAINHAND) + return builder.build(); + + double damage = attackDamage.getValue() + (uniqueDamageGain.getValue() * kills); + + builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", + attackSpeed.getValue(), AttributeModifier.Operation.ADDITION)); + builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", + damage, AttributeModifier.Operation.ADDITION)); + + return builder.build(); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + if (attacker.getRandom().nextDouble() < 0.0001) { + attacker.level().playSound(null, attacker.getX(), attacker.getY(), attacker.getZ(), + EnigmaticSounds.PAN_CLANG_FR, SoundSource.PLAYERS, 1F, + attacker.level().random.nextFloat() * 0.2F + 0.8F); + } else { + attacker.level().playSound(null, attacker.getX(), attacker.getY(), attacker.getZ(), + EnigmaticSounds.PAN_CLANG, SoundSource.PLAYERS, 0.5F, + attacker.level().random.nextFloat() * 0.1F + 0.9F); + } + + stack.hurtAndBreak(1, attacker, (entity) -> { + entity.broadcastBreakEvent(EquipmentSlot.MAINHAND); + }); + + return true; + } + + public boolean mineBlock(ItemStack stack, Level level, BlockState state, BlockPos pos, LivingEntity entity) { + if (state.getDestroySpeed(level, pos) != 0.0F) { + stack.hurtAndBreak(2, entity, (living) -> { + living.broadcastBreakEvent(EquipmentSlot.MAINHAND); + }); + } + + return true; + } + + @Override + public void inventoryTick(ItemStack stack, Level worldIn, Entity entityIn, int itemSlot, boolean isSelected) { + // NO-OP + } + + @Override + @OnlyIn(Dist.CLIENT) + public void appendHoverText(ItemStack stack, Level worldIn, List tooltip, TooltipFlag flagIn) { + if (Screen.hasShiftDown()) { + String life = "+" + this.toString(100 * lifeSteal.getValue()) + "%"; + String hunger = "+" + this.toString(hungerSteal.getValue()); + String damageGain = "+" + this.toString(uniqueDamageGain.getValue()); + String armorGain = "+" + this.toString(uniqueArmorGain.getValue()); + + boolean noHunger = SuperpositionHandler.cannotHunger((EnigmaticLegacy.PROXY.getClientPlayer())); + + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan1"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan2"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.void"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan3", + ChatFormatting.GOLD, life); + + if (!noHunger) { + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan4", + ChatFormatting.GOLD, hunger); + } else { + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan4_alt", + ChatFormatting.GOLD, hunger); + } + + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.void"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan5"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan6"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.void"); + + if (!noHunger) { + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan7"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan8"); + } else { + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan7_alt"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan8_alt"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan8p_alt"); + } + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.void"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan9", + ChatFormatting.GOLD, damageGain); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPan10", + ChatFormatting.GOLD, armorGain); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.void"); + ItemLoreHelper.indicateWorthyOnesOnly(tooltip); + } else { + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPanLore1"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.void"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.holdShift"); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.void"); + this.writeKillCount(tooltip, stack); + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.void"); + ItemLoreHelper.indicateCursedOnesOnly(tooltip); + } + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.BLOCK; + } + + @Override + public int getUseDuration(ItemStack stack) { + return 72000; + } + + @Override + public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (hand == InteractionHand.MAIN_HAND) { + ItemStack offhandStack = player.getOffhandItem(); + + if (offhandStack.getItem().getUseAnimation(offhandStack) == UseAnim.BLOCK) + return InteractionResultHolder.pass(stack); + } + + if (SuperpositionHandler.isTheCursedOne(player)) { + player.startUsingItem(hand); + return InteractionResultHolder.consume(stack); + } else + return InteractionResultHolder.pass(stack); + } + + @Override + public boolean canPerformAction(ItemStack stack, ToolAction toolAction) { + // TODO: make it consume projectiles for hunger + return ToolActions.DEFAULT_SHIELD_ACTIONS.contains(toolAction); + } + + private void writeKillCount(List tooltip, ItemStack pan) { + int kills = getKillCount(pan); + + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPanKills1", + ChatFormatting.GOLD, kills); + + if (kills >= uniqueGainLimit.getValue()) { + ItemLoreHelper.addLocalizedString(tooltip, "tooltip.enigmaticlegacy.eldritchPanKillsMax"); + } + } + + @Override + public @Nullable CreativeModeTab getCreativeTab() { + return EnigmaticTabs.MAIN; + } + + private String toString(double value) { + if (Math.floor(value) == value) { + return Integer.toString((int) value); + } else { + return Double.toString(value); + } + } + + public static int getKillCount(ItemStack pan) { + CompoundTag tag = pan.getTag(); + + if (tag == null || !tag.contains("PanUniqueKills", Tag.TAG_LIST)) + return 0; + + ListTag list = tag.getList("PanUniqueKills", Tag.TAG_STRING); + + return list.size(); + } + + public static List getUniqueKills(ItemStack pan) { + CompoundTag tag = pan.getTag(); + + if (tag == null || !tag.contains("PanUniqueKills", Tag.TAG_LIST)) + return Collections.emptyList(); + + ListTag list = tag.getList("PanUniqueKills", Tag.TAG_STRING); + + return list.stream().map(e -> new ResourceLocation(((StringTag) e).getAsString())).toList(); + } + + public static void setUniqueKills(ItemStack pan, List mobs) { + CompoundTag tag = pan.getOrCreateTag(); + + ListTag list = new ListTag(); + mobs.forEach(entity -> list.add(StringTag.valueOf(entity.toString()))); + tag.put("PanUniqueKills", list); + + pan.setTag(tag); + } + + public static void addUniqueKill(ItemStack pan, ResourceLocation mob) { + CompoundTag tag = pan.getOrCreateTag(); + ListTag list; + + if (!tag.contains("PanUniqueKills", Tag.TAG_LIST)) { + list = new ListTag(); + } else { + list = tag.getList("PanUniqueKills", Tag.TAG_STRING); + } + + list.add(StringTag.valueOf(mob.toString())); + + tag.put("PanUniqueKills", list); + pan.setTag(tag); + } + + public static boolean addKillIfNotPresent(ItemStack pan, ResourceLocation mob) { + List kills = getUniqueKills(pan); + + if (kills.size() < 100 && !kills.contains(mob)) { + addUniqueKill(pan, mob); + return true; + } + + return false; + } + + public static Ingredient getRepairMaterial() { + return Ingredient.of( + Items.BEEF, + Items.PORKCHOP, + Items.MUTTON, + Items.ROTTEN_FLESH, + Items.APPLE, + Items.GOLDEN_APPLE, + Items.ENCHANTED_GOLDEN_APPLE, + Items.POISONOUS_POTATO + ); + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return true; + } + + @Override + public int getEnchantmentValue(ItemStack stack) { + return 24; + } + + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return Items.DIAMOND_SWORD.isBookEnchantable(UNSUSPECTING_DIAMOND_SWORD, book); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return Items.DIAMOND_SWORD.canApplyAtEnchantingTable(UNSUSPECTING_DIAMOND_SWORD, enchantment); + } + +} diff --git a/src/main/java/com/aizistral/enigmaticlegacy/items/EnderSlayer.java b/src/main/java/com/aizistral/enigmaticlegacy/items/EnderSlayer.java index 0adf387c..ffd27925 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/items/EnderSlayer.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/items/EnderSlayer.java @@ -6,12 +6,13 @@ import javax.annotation.Nullable; -import com.aizistral.enigmaticlegacy.EnigmaticLegacy; import com.aizistral.enigmaticlegacy.api.generic.SubscribeConfig; +import com.aizistral.enigmaticlegacy.api.items.ICreativeTabMember; import com.aizistral.enigmaticlegacy.api.items.ICursed; import com.aizistral.enigmaticlegacy.api.materials.EnigmaticMaterials; import com.aizistral.enigmaticlegacy.helpers.ItemLoreHelper; import com.aizistral.enigmaticlegacy.items.generic.ItemBaseTool; +import com.aizistral.enigmaticlegacy.registries.EnigmaticTabs; import com.aizistral.omniconfig.wrappers.Omniconfig; import com.aizistral.omniconfig.wrappers.OmniconfigWrapper; @@ -24,16 +25,13 @@ import net.minecraft.world.entity.monster.EnderMan; import net.minecraft.world.entity.monster.Endermite; import net.minecraft.world.entity.monster.Shulker; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Rarity; -import net.minecraft.world.item.SwordItem; -import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.*; import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.registries.ForgeRegistries; -public class EnderSlayer extends SwordItem implements ICursed { +public class EnderSlayer extends SwordItem implements ICursed, ICreativeTabMember { public static final List endDwellers = new ArrayList<>(); public static Omniconfig.IntParameter attackDamage; @@ -74,7 +72,7 @@ public static void onConfig(OmniconfigWrapper builder) { } public EnderSlayer() { - super(EnigmaticMaterials.ENDERSLAYER, attackDamage.getValue(), (float) attackSpeed.getValue(), ItemBaseTool.getDefaultProperties().defaultDurability(2000).rarity(Rarity.EPIC).fireResistant()); + super(EnigmaticMaterials.ENDER_SLAYER, attackDamage.getValue(), (float) attackSpeed.getValue(), ItemBaseTool.getDefaultProperties().defaultDurability(2000).rarity(Rarity.EPIC).fireResistant()); } public boolean isEndDweller(LivingEntity entity) { @@ -120,4 +118,9 @@ public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List list @Override public InteractionResult useOn(UseOnContext context) { ItemStack stack = context.getItemInHand(); - int savedCount = stack.getCount(); + Level level = context.getLevel(); + BlockPos pos = context.getClickedPos(); - InteractionResult result = Items.BONE_MEAL.useOn(context); - stack.setCount(savedCount); + boolean success = tryApply(stack, level, pos, Optional.of(context.getPlayer()), Optional.of(context.getClickedFace())); - if (result == InteractionResult.PASS) { - BlockPos pos = context.getClickedPos(); - Level world = context.getLevel(); - BlockState state = world.getBlockState(pos); - Block block = state.getBlock(); + if (success) + return InteractionResult.sidedSuccess(level.isClientSide); + else + return InteractionResult.PASS; + } - if (block instanceof CactusBlock || block instanceof SugarCaneBlock) { - BlockPos topMostPos = this.findTopmostGrowable(world, pos, block, true); - BlockState topMostState = world.getBlockState(topMostPos); + private static boolean tryApply(ItemStack stack, Level world, BlockPos pos, Optional optionalPlayer, + Optional clickedFace) { + ItemStack stackCopy = new ItemStack(stack.getItem()); - if (topMostState.hasProperty(BlockStateProperties.AGE_15) && world.isEmptyBlock(topMostPos.above())) { - int age = topMostState.getValue(BlockStateProperties.AGE_15); + if (applyVanillaBonemeal(stackCopy, world, pos, optionalPlayer, clickedFace)) { + if (!world.isClientSide) { + world.levelEvent(1505, pos, 0); + } - int plantHeight; - for(plantHeight = 1; world.getBlockState(topMostPos.below(plantHeight)).is(block); ++plantHeight) {} + return true; + } - if (plantHeight >= 3) - return result; + BlockState state = world.getBlockState(pos); + Block block = state.getBlock(); - if (!world.isClientSide) { - world.levelEvent(2005, pos, 0); - } + if (block instanceof CactusBlock || block instanceof SugarCaneBlock) { + BlockPos topMostPos = findTopmostGrowable(world, pos, block, true); + BlockState topMostState = world.getBlockState(topMostPos); - age += world.random.nextInt(20); - world.setBlock(topMostPos, topMostState.setValue(BlockStateProperties.AGE_15, Integer.valueOf(Math.min(age, 15))), 4); + if (topMostState.hasProperty(BlockStateProperties.AGE_15) && world.isEmptyBlock(topMostPos.above())) { + int age = topMostState.getValue(BlockStateProperties.AGE_15); - if (world instanceof ServerLevel) { - world.getBlockState(topMostPos).randomTick((ServerLevel)world, topMostPos, world.random); - } + int plantHeight; + for(plantHeight = 1; world.getBlockState(topMostPos.below(plantHeight)).is(block); ++plantHeight) {} - return InteractionResult.sidedSuccess(world.isClientSide); - } - } else if (block instanceof VineBlock) { - if (!block.isRandomlyTicking(state)) - return result; + if (plantHeight >= 3) + return false; - if (world.isClientSide) { - EnigmaticLegacy.PROXY.spawnBonemealParticles(world, pos, 0); + if (!world.isClientSide) { + world.levelEvent(2005, pos, 0); } - int cycles = 7+world.random.nextInt(7); + age += world.random.nextInt(20); + world.setBlock(topMostPos, topMostState.setValue(BlockStateProperties.AGE_15, Integer.valueOf(Math.min(age, 15))), 4); if (world instanceof ServerLevel) { - for (int i = 0; i <= cycles; i++) { - state.randomTick((ServerLevel)world, pos, world.random); - } - - state.updateNeighbourShapes(world, pos, 4); + world.getBlockState(topMostPos).randomTick((ServerLevel)world, topMostPos, world.random); } - return InteractionResult.sidedSuccess(world.isClientSide); - } else if (block instanceof NetherWartBlock) { - if (!block.isRandomlyTicking(state)) - return result; + return true; + } + } else if (block instanceof VineBlock) { + if (!block.isRandomlyTicking(state)) + return false; - if (!world.isClientSide) { - world.levelEvent(2005, pos, 0); - } + if (world.isClientSide) { + EnigmaticLegacy.PROXY.spawnBonemealParticles(world, pos, 0); + } - int cycles = 1+world.random.nextInt(1); - cycles*=11; + int cycles = 7+world.random.nextInt(7); - if (world instanceof ServerLevel) { - for (int i = 0; i <= cycles; i++) { - state.randomTick((ServerLevel)world, pos, world.random); - } + if (world instanceof ServerLevel) { + for (int i = 0; i <= cycles; i++) { + state.randomTick((ServerLevel)world, pos, world.random); } - return InteractionResult.sidedSuccess(world.isClientSide); - } else if (block instanceof ChorusPlantBlock || block instanceof ChorusFlowerBlock) { - if (!world.isClientSide) { - world.levelEvent(2005, pos, 0); - } + state.updateNeighbourShapes(world, pos, 4); + } + + return true; + } else if (block instanceof NetherWartBlock) { + if (!block.isRandomlyTicking(state)) + return false; - if (world instanceof ServerLevel serverWorld) { - List flowers = this.findChorusFlowers(world, pos); + if (!world.isClientSide) { + world.levelEvent(2005, pos, 0); + } - flowers.forEach(flowerPos -> { - int cycles = 1 + world.random.nextInt(2); - cycles *= 11; + int cycles = 1+world.random.nextInt(1); + cycles*=11; - for (int i = 0; i <= cycles; i++) { - BlockState flowerState = world.getBlockState(flowerPos); - flowerState.randomTick(serverWorld, flowerPos, world.random); - } - }); + if (world instanceof ServerLevel) { + for (int i = 0; i <= cycles; i++) { + state.randomTick((ServerLevel)world, pos, world.random); } + } - return InteractionResult.sidedSuccess(world.isClientSide); + return true; + } else if (block instanceof ChorusPlantBlock || block instanceof ChorusFlowerBlock) { + if (!world.isClientSide) { + world.levelEvent(2005, pos, 0); } + + if (world instanceof ServerLevel serverWorld) { + List flowers = findChorusFlowers(world, pos); + + flowers.forEach(flowerPos -> { + int cycles = 1 + world.random.nextInt(2); + cycles *= 11; + + for (int i = 0; i <= cycles; i++) { + BlockState flowerState = world.getBlockState(flowerPos); + flowerState.randomTick(serverWorld, flowerPos, world.random); + } + }); + } + + return true; } - return result; + return false; + } + + public static boolean applyVanillaBonemeal(ItemStack stack, Level level, BlockPos pos, Optional optionalPlayer, + Optional clickedFace) { + if (!growCrop(stack, level, pos, optionalPlayer)) + return BoneMealItem.growWaterPlant(stack, level, pos, clickedFace.orElse(null)); + else + return true; + } + + public static boolean growCrop(ItemStack stack, Level level, BlockPos pos, Optional optionalPlayer) { + if (!optionalPlayer.isPresent()) { + if (level instanceof ServerLevel) + return BoneMealItem.applyBonemeal(stack, level, pos, FakePlayerFactory.getMinecraft((ServerLevel)level)); + return false; + } else + return BoneMealItem.applyBonemeal(stack, level, pos, optionalPlayer.get()); } - private List findChorusFlowers(Level level, BlockPos pos) { + private static List findChorusFlowers(Level level, BlockPos pos) { List chorusTree = new ArrayList<>(); chorusTree.add(pos); while (true) { int formerSize = chorusTree.size(); for (BlockPos treePos : new ArrayList<>(chorusTree)) { - chorusTree.addAll(this.getNeighboringBlocks(level, treePos, chorusTree, ChorusFlowerBlock.class, + chorusTree.addAll(getNeighboringBlocks(level, treePos, chorusTree, ChorusFlowerBlock.class, ChorusPlantBlock.class)); } @@ -177,14 +237,14 @@ private List findChorusFlowers(Level level, BlockPos pos) { } @SafeVarargs - private List getNeighboringBlocks(Level level, BlockPos pos, List exclude, Class... classes) { + private static List getNeighboringBlocks(Level level, BlockPos pos, List exclude, Class... classes) { BlockPos[] neighbors = new BlockPos[] { pos.above(), pos.below(), pos.east(), pos.north(), pos.south(), pos.west() }; return Arrays.stream(neighbors).filter(neighbor -> !exclude.contains(neighbor) && Arrays.stream(classes) .anyMatch(theClass -> theClass.isInstance(level.getBlockState(neighbor).getBlock()))).collect(Collectors.toList()); } - private BlockPos findTopmostGrowable(Level world, BlockPos pos, Block block, boolean goUp) { + private static BlockPos findTopmostGrowable(Level world, BlockPos pos, Block block, boolean goUp) { BlockPos top = pos; while (true) { diff --git a/src/main/java/com/aizistral/enigmaticlegacy/items/LootGenerator.java b/src/main/java/com/aizistral/enigmaticlegacy/items/LootGenerator.java index b78d408f..3b6c6efe 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/items/LootGenerator.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/items/LootGenerator.java @@ -95,6 +95,12 @@ public LootGenerator() { this.lootList.add(BuiltInLootTables.VILLAGE_TAIGA_HOUSE); this.lootList.add(BuiltInLootTables.VILLAGE_SNOWY_HOUSE); this.lootList.add(BuiltInLootTables.VILLAGE_SAVANNA_HOUSE); + this.lootList.add(BuiltInLootTables.DESERT_WELL_ARCHAEOLOGY); + this.lootList.add(BuiltInLootTables.DESERT_PYRAMID_ARCHAEOLOGY); + this.lootList.add(BuiltInLootTables.TRAIL_RUINS_ARCHAEOLOGY_COMMON); + this.lootList.add(BuiltInLootTables.TRAIL_RUINS_ARCHAEOLOGY_RARE); + this.lootList.add(BuiltInLootTables.OCEAN_RUIN_WARM_ARCHAEOLOGY); + this.lootList.add(BuiltInLootTables.OCEAN_RUIN_COLD_ARCHAEOLOGY); } @Override diff --git a/src/main/java/com/aizistral/enigmaticlegacy/items/TheJudgement.java b/src/main/java/com/aizistral/enigmaticlegacy/items/TheJudgement.java index d6d30592..55a51975 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/items/TheJudgement.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/items/TheJudgement.java @@ -50,7 +50,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; public class TheJudgement extends ItemBase { - public static final float ATTACK_DAMAGE = 1000F; + public static final float ATTACK_DAMAGE = Float.POSITIVE_INFINITY; public static final double ATTACK_RADIUS = 64D; private final Multimap defaultModifiers; diff --git a/src/main/java/com/aizistral/enigmaticlegacy/mixin/MixinLivingEntity.java b/src/main/java/com/aizistral/enigmaticlegacy/mixin/MixinLivingEntity.java index 1f9d6218..a4622f22 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/mixin/MixinLivingEntity.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/mixin/MixinLivingEntity.java @@ -30,7 +30,9 @@ public MixinLivingEntity(EntityType type, Level world) { @Inject(method = "isDamageSourceBlocked", at = @At("HEAD"), cancellable = true) private void onDamageSourceBlocking(DamageSource source, CallbackInfoReturnable info) { - SuperpositionHandler.onDamageSourceBlocking(((LivingEntity)(Object)this), this.useItem, source, info); + if (SuperpositionHandler.onDamageSourceBlocking(((LivingEntity)(Object)this), this.useItem, source, info)) { + info.setReturnValue(true); + } } @Override diff --git a/src/main/java/com/aizistral/enigmaticlegacy/objects/SpecialLootModifier.java b/src/main/java/com/aizistral/enigmaticlegacy/objects/SpecialLootModifier.java index 541b3cda..ac176763 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/objects/SpecialLootModifier.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/objects/SpecialLootModifier.java @@ -1,19 +1,26 @@ package com.aizistral.enigmaticlegacy.objects; +import java.util.List; import java.util.function.Supplier; import javax.annotation.Nonnull; import org.jetbrains.annotations.NotNull; +import com.aizistral.enigmaticlegacy.api.generic.SubscribeConfig; import com.aizistral.enigmaticlegacy.config.OmniconfigHandler; import com.aizistral.enigmaticlegacy.handlers.SuperpositionHandler; import com.aizistral.enigmaticlegacy.registries.EnigmaticItems; +import com.aizistral.omniconfig.Configuration; +import com.aizistral.omniconfig.wrappers.Omniconfig; +import com.aizistral.omniconfig.wrappers.OmniconfigWrapper; import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; @@ -26,6 +33,29 @@ public class SpecialLootModifier extends LootModifier { public static final Supplier> CODEC = Suppliers.memoize(() -> RecordCodecBuilder.create(inst -> codecStart(inst).apply(inst, SpecialLootModifier::new))); + public static final List SUSPICIOUS_TABLES = ImmutableList.of( + new ResourceLocation("minecraft", "archaeology/desert_pyramid"), + new ResourceLocation("minecraft", "archaeology/desert_well"), + new ResourceLocation("minecraft", "archaeology/ocean_ruin_cold"), + new ResourceLocation("minecraft", "archaeology/ocean_ruin_warm"), + new ResourceLocation("minecraft", "archaeology/trail_ruins_common"), + new ResourceLocation("minecraft", "archaeology/trail_ruins_rare") + ); + + public static Omniconfig.DoubleParameter earthHeartChance; + + @SubscribeConfig(receiveClient = true) + public static void onConfig(OmniconfigWrapper builder) { + builder.pushPrefix("CustomLoot"); + + if (builder.config.getSidedType() != Configuration.SidedConfigType.CLIENT) { + earthHeartChance = builder + .comment("The chance for Heart of the Earth to be obtained from suspicious blocks (default is 3%).") + .getDouble("EarthHeartChance", 0.03); + } + + builder.popPrefix(); + } protected SpecialLootModifier(LootItemCondition[] conditions) { super(conditions); @@ -63,6 +93,14 @@ protected SpecialLootModifier(LootItemCondition[] conditions) { } } } + + if (OmniconfigHandler.isItemEnabled(EnigmaticItems.EARTH_HEART)) + if (SUSPICIOUS_TABLES.stream().anyMatch(table -> table.equals(context.getQueriedLootTableId()))) { + if (context.getRandom().nextDouble() < earthHeartChance.getValue()) { + generatedLoot.clear(); + generatedLoot.add(new ItemStack(EnigmaticItems.EARTH_HEART, 1)); + } + } } return generatedLoot; diff --git a/src/main/java/com/aizistral/enigmaticlegacy/proxy/ClientProxy.java b/src/main/java/com/aizistral/enigmaticlegacy/proxy/ClientProxy.java index 2b503c03..090b7ffc 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/proxy/ClientProxy.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/proxy/ClientProxy.java @@ -191,11 +191,16 @@ private , R extends LivingEnt } } + private void registerBlockingProperty(Item item) { + ItemProperties.register(item, new ResourceLocation("blocking"), + (stack, world, entity, seed) -> entity != null && entity.isUsingItem() + && entity.getUseItem() == stack ? 1 : 0); + } + @OnlyIn(Dist.CLIENT) public void onClientSetup(FMLClientSetupEvent event) { - ItemProperties.register(EnigmaticItems.INFERNAL_SHIELD, new ResourceLocation("blocking"), - (stack, world, entity, seed) -> entity != null && entity.isUsingItem() - && entity.getUseItem() == stack ? 1 : 0); + this.registerBlockingProperty(EnigmaticItems.INFERNAL_SHIELD); + this.registerBlockingProperty(EnigmaticItems.ELDRITCH_PAN); ItemProperties.register(EnigmaticItems.THE_INFINITUM, new ResourceLocation(EnigmaticLegacy.MODID, "the_infinitum_open"), (stack, world, entity, seed) -> { if (entity instanceof Player player) { diff --git a/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticEffects.java b/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticEffects.java index b7cd2c44..b5fc760a 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticEffects.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticEffects.java @@ -19,10 +19,18 @@ public class EnigmaticEffects extends AbstractRegistry { @ObjectHolder(value = MODID + ":molten_heart", registryName = "mob_effect") public static final MoltenHeartEffect MOLTEN_HEART = null; + @ObjectHolder(value = MODID + ":growing_hunger", registryName = "mob_effect") + public static final GrowingHungerEffect GROWING_HUNGER = null; + + @ObjectHolder(value = MODID + ":growing_bloodlust", registryName = "mob_effect") + public static final GrowingBloodlustEffect GROWING_BLOODLUST = null; + private EnigmaticEffects() { super(ForgeRegistries.MOB_EFFECTS); this.register("blazing_strength", BlazingStrengthEffect::new); this.register("molten_heart", MoltenHeartEffect::new); + this.register("growing_hunger", GrowingHungerEffect::new); + this.register("growing_bloodlust", GrowingBloodlustEffect::new); } } diff --git a/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticItems.java b/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticItems.java index a0c96e7f..f84537dc 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticItems.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticItems.java @@ -435,6 +435,10 @@ public class EnigmaticItems extends AbstractRegistry { @ObjectHolder(value = MODID + ":soul_dust", registryName = "item") public static final Item SOUL_DUST = null; + @ConfigurableItem("Eldritch Frying Pan") + @ObjectHolder(value = MODID + ":eldritch_pan", registryName = "item") + public static final Item ELDRITCH_PAN = null; + private EnigmaticItems() { super(ForgeRegistries.ITEMS); this.register("enigmatic_item", EnigmaticItem::new); @@ -534,6 +538,7 @@ private EnigmaticItems() { this.register("deception_amulet", DeceptionAmulet::new); this.register("the_judgement", TheJudgement::new); this.register("soul_dust", SoulDust::new); + this.register("eldritch_pan", EldritchPan::new); this.register("common_potion", () -> new UltimatePotionBase(Rarity.COMMON, PotionType.COMMON)); this.register("common_potion_splash", () -> new UltimatePotionSplash(Rarity.COMMON, PotionType.COMMON)); diff --git a/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticSounds.java b/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticSounds.java index 3559cf22..39fc784e 100644 --- a/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticSounds.java +++ b/src/main/java/com/aizistral/enigmaticlegacy/registries/EnigmaticSounds.java @@ -37,6 +37,12 @@ public class EnigmaticSounds extends AbstractRegistry { @ObjectHolder(value = MODID + ":misc.uneat", registryName = "sound_event") public static final SoundEvent EAT_REVERSE = null; + @ObjectHolder(value = MODID + ":misc.pan_clang", registryName = "sound_event") + public static final SoundEvent PAN_CLANG = null; + + @ObjectHolder(value = MODID + ":misc.pan_clang_fr", registryName = "sound_event") + public static final SoundEvent PAN_CLANG_FR = null; + private EnigmaticSounds() { super(ForgeRegistries.SOUND_EVENTS); this.register("misc.hhon"); @@ -47,6 +53,8 @@ private EnigmaticSounds() { this.register("misc.learn"); this.register("misc.sword_hit_reject"); this.register("misc.uneat"); + this.register("misc.pan_clang"); + this.register("misc.pan_clang_fr"); } private void register(String name) { diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 7bfed750..40e93b83 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -73,4 +73,5 @@ public net.minecraft.world.damagesource.DamageSources m_268998_(Lnet/minecraft/r public net.minecraft.world.damagesource.DamageSources m_269298_(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/entity/Entity;)Lnet/minecraft/world/damagesource/DamageSource; #source public net.minecraft.world.damagesource.DamageSources m_269079_(Lnet/minecraft/resources/ResourceKey;)Lnet/minecraft/world/damagesource/DamageSource; #source -public net.minecraft.world.entity.item.ItemEntity f_31988_ #thrower \ No newline at end of file +public net.minecraft.world.entity.item.ItemEntity f_31988_ #thrower +public net.minecraft.world.entity.projectile.LargeFireball f_37197_ #explosionPower \ No newline at end of file diff --git a/src/main/resources/assets/enigmaticlegacy/lang/en_us.json b/src/main/resources/assets/enigmaticlegacy/lang/en_us.json index 31851314..6a3941ea 100644 --- a/src/main/resources/assets/enigmaticlegacy/lang/en_us.json +++ b/src/main/resources/assets/enigmaticlegacy/lang/en_us.json @@ -112,6 +112,7 @@ "item.enigmaticlegacy.deception_amulet": "Amulet of Deception [WIP]", "item.enigmaticlegacy.the_judgement": "The Judgement", "item.enigmaticlegacy.soul_dust": "Soul Dust", + "item.enigmaticlegacy.eldritch_pan": "The Voracious Pan", "block.enigmaticlegacy.big_lamp": "Lamp", "block.enigmaticlegacy.massive_lamp": "Encased Lamp", @@ -123,6 +124,8 @@ "effect.enigmaticlegacy.blazing_strength": "Blazing Might", "effect.enigmaticlegacy.molten_heart": "Molten Heart", + "effect.enigmaticlegacy.growing_hunger": "Growing Hunger", + "effect.enigmaticlegacy.growing_bloodlust": "Growing Bloodlust", "stat.enigmaticlegacy.play_time_with_seven_curses": "Time Played with Seven Curses", "stat.enigmaticlegacy.play_time_without_seven_curses": "Time Played without Seven Curses", @@ -248,6 +251,7 @@ "death.attack.darkness": "%1$s was devoured by darkness", "message.enigmaticlegacy.permadeath": "In attempting the feat, one proves their courage.\nMay your fractured soul at last find rest.", "message.enigmaticlegacy.cursed_sleep": "Seven Curses awaken unspeakable fear and gnawing uncertainty within as you approach the tempting realm of dreams. No hope for the hopeless, no sleep for the sleepless...", + "message.enigmaticlegacy.eldritch_pan_buff": "With the taste of this new soul, The Voracious Pan grows ever stronger.", "message.enigmaticlegacy.gen_sim_complete": "Estimated generation complete in §632768§5 instances; check §6latest.log§5 file to see the results.", "message.enigmaticlegacy.animal_analysis_complete": "Entity registry analysis is complete; check §6latest.log§5 file to see the results.", "message.enigmaticlegacy.voiceover_experimental": "§eHello there! §6Enigmatic Legacy§e developer on the line. Since voiceover is not a common thing for mods to add, I would like you to know that this feature is experimental, and I am actively looking for player feedback on it. Join my §6Discord§e and inform me of your impression once you play with it for some while: §6https://discord.gg/fuWK8ns", @@ -1024,6 +1028,24 @@ "tooltip.enigmaticlegacy.theJudgementMode0": "§6Normal", "tooltip.enigmaticlegacy.theJudgementMode1": "§6Clear Drops", + "tooltip.enigmaticlegacy.eldritchPan1": "§5Alteration of the §6Fourth Curse§d:", + "tooltip.enigmaticlegacy.eldritchPan2": "§6- Always deals its full damage.", + "tooltip.enigmaticlegacy.eldritchPan3": "§6%s §dLifesteal", + "tooltip.enigmaticlegacy.eldritchPan4": "§6%s §dHungersteal", + "tooltip.enigmaticlegacy.eldritchPan4_alt": "§6%s §dHungersteal (converts to health)", + "tooltip.enigmaticlegacy.eldritchPan5": "§5Cooks the meat of slain creatures.", + "tooltip.enigmaticlegacy.eldritchPan6": "§5Can be used as a shield, and consume projectiles while blocking.", + "tooltip.enigmaticlegacy.eldritchPan7": "§5Continuosly holding the pan grants a §6Growing Hunger§5 effect,", + "tooltip.enigmaticlegacy.eldritchPan8": "§5which makes you hungrier, but stronger.", + "tooltip.enigmaticlegacy.eldritchPan7_alt": "§5Continuosly holding the pan grants a §6Growing Bloodlust§5 effect,", + "tooltip.enigmaticlegacy.eldritchPan8_alt": "§5which makes you lose health, but grants strength and lifesteal.", + "tooltip.enigmaticlegacy.eldritchPan8p_alt": "§5This effect cannot kill you.", + "tooltip.enigmaticlegacy.eldritchPan9": "§5Each new creature slain with the pan gives it a permanent §6%s", + "tooltip.enigmaticlegacy.eldritchPan10": "§5§dDamage§5 and §6%s §dArmor§5 when held.", + "tooltip.enigmaticlegacy.eldritchPanLore1": "§5Raw and primal hunger given form.", + "tooltip.enigmaticlegacy.eldritchPanKills1": "§dUnique Kills: %s", + "tooltip.enigmaticlegacy.eldritchPanKillsMax": "§6The pan is sated... but you are not.", + "gui.enigmaticlegacy.lore_inscriber": "Write Name & Lore", "gui.enigmaticlegacy.blazing_core_bar_title": "Heat", "gui.enigmaticlegacy.blazing_core_bar_offsetX": "0", @@ -1825,7 +1847,17 @@ "book.enigmaticlegacy.entry.end_anchor.page.3": "cheaper Glowstone. As a repayment for increased maintenance costs - it can function where Respawn Anchor cannot, and has a noticeable chance to not spend a charge upon your revival. Things such as Potion of Recall will work with it much as they do with its predecessor, and Dispenser can still be used to automate recharging.Only one thing remains of concern. Even for higher beings, space between worlds", "book.enigmaticlegacy.entry.end_anchor.page.4": "is not the safest of places to traverse, most so when stripped of flesh... You cannot help but wonder what terrible places await those who are mislead by the light of their beacons, and what grisly fate befalls them in there.", + + + "book.enigmaticlegacy.entry.eldritch_pan.name": "The Voracious Pan", + "book.enigmaticlegacy.entry.eldritch_pan.page.1": "The very bones of the universe, both celestial and eldritch, lay at your fingertips. And yet, you still crave more...Fortunately, the unthinkable nature of Heart of the Abyss can be employed in this pursuit of yours. Less fortunately, another kind of insatiable craving now plagues your mind and body alike.", + "book.enigmaticlegacy.entry.eldritch_pan.page.2": "This boundless hunger demands that you keep hunting for all manner of creature that walk the lands of this, and many other worlds. Consumed by it, you cannot quite tell if this influence fully comes from the artifact that you have forged,", + "book.enigmaticlegacy.entry.eldritch_pan.page.3": "or it has become so deeply engraved in your soul that it will continue haunting you even without it.The maw of The Voracious Pan stays ever-open, leading into what you presume is a stomach belonging to a vast entity of incomprehensible dimensions. Has this being granted you the Heart of the Abyss, or is it merely an entity that shares the same insatiable appetite you suffer from? It might be better not to know.", + "book.enigmaticlegacy.entry.eldritch_pan.page.4": "The promise of The Forbidden Fruit to quench any hunger once and for all is more tempting than ever, but you remain cautious. Things are never quite so simple for a cursed being such as yourself, and once you lose your ability to hunger, some other calamity will surely take its place.Few dare to cross paths with you now. Ones that witnessed flesh torn and consumed, hearts crushed and forgotten, and veins sucked dry of blood", + "book.enigmaticlegacy.entry.eldritch_pan.page.5": "in your never-ending feast, are shaken. Those you struck down have not returned to tell the tales.What, or indeed who, will be your next meal?", + + "book.enigmaticlegacy.landing_text": "In front of you lies the well of great knowledge, a place where some of this world's greatest mysteries belong, scrupulously researched and carefully cataloged.As your journey continues and the world reveals itself to you, you may revisit and behold knowledge you gathered within these pages.", "item.enigmaticlegacy.cosmic_scroll": "The Architect's Favor", diff --git a/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan.json b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan.json new file mode 100644 index 00000000..1ce169b6 --- /dev/null +++ b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "predicate": { + "blocking": 0 + }, + "model": "enigmaticlegacy:item/eldritch_pan_idle" + }, + { + "predicate": { + "blocking": 1 + }, + "model": "enigmaticlegacy:item/eldritch_pan_blocking" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_blocking.json b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_blocking.json new file mode 100644 index 00000000..a3afe0bc --- /dev/null +++ b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_blocking.json @@ -0,0 +1,24 @@ +{ + "loader": "forge:separate_transforms", + "gui_light": "front", + "base": { + "parent": "enigmaticlegacy:item/eldritch_pan_in_inventory" + }, + "perspectives": { + "firstperson_righthand": { + "parent": "enigmaticlegacy:item/eldritch_pan_blocking_in_hand" + }, + "firstperson_lefthand": { + "parent": "enigmaticlegacy:item/eldritch_pan_blocking_in_hand" + }, + "thirdperson_righthand": { + "parent": "enigmaticlegacy:item/eldritch_pan_blocking_in_hand" + }, + "thirdperson_lefthand": { + "parent": "enigmaticlegacy:item/eldritch_pan_blocking_in_hand" + }, + "head": { + "parent": "enigmaticlegacy:item/eldritch_pan_blocking_in_hand" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_blocking_in_hand.json b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_blocking_in_hand.json new file mode 100644 index 00000000..6474b26e --- /dev/null +++ b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_blocking_in_hand.json @@ -0,0 +1,25 @@ +{ + "parent": "enigmaticlegacy:item/eldritch_pan_idle_in_hand", + "display": { + "thirdperson_righthand": { + "rotation": [-92.13, -30.82, -40], + "translation": [1, 4, -2.5], + "scale": [0.85, 0.85, 0.85] + }, + "thirdperson_lefthand": { + "rotation": [-92.13, -30.82, -40], + "translation": [1, 4, -2.5], + "scale": [0.85, 0.85, 0.85] + }, + "firstperson_righthand": { + "rotation": [-98.84, 21.29, 9], + "translation": [-4.5, 1.5, -2.5], + "scale": [0.85, 0.85, 0.85] + }, + "firstperson_lefthand": { + "rotation": [-98.84, 21.29, 9], + "translation": [-4.5, 1.5, -2.5], + "scale": [0.85, 0.85, 0.85] + } + } +} diff --git a/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_idle.json b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_idle.json new file mode 100644 index 00000000..1fe8d0a5 --- /dev/null +++ b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_idle.json @@ -0,0 +1,24 @@ +{ + "loader": "forge:separate_transforms", + "gui_light": "front", + "base": { + "parent": "enigmaticlegacy:item/eldritch_pan_in_inventory" + }, + "perspectives": { + "firstperson_righthand": { + "parent": "enigmaticlegacy:item/eldritch_pan_idle_in_hand" + }, + "firstperson_lefthand": { + "parent": "enigmaticlegacy:item/eldritch_pan_idle_in_hand" + }, + "thirdperson_righthand": { + "parent": "enigmaticlegacy:item/eldritch_pan_idle_in_hand" + }, + "thirdperson_lefthand": { + "parent": "enigmaticlegacy:item/eldritch_pan_idle_in_hand" + }, + "head": { + "parent": "enigmaticlegacy:item/eldritch_pan_idle_in_hand" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_idle_in_hand.json b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_idle_in_hand.json new file mode 100644 index 00000000..e4c0548a --- /dev/null +++ b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_idle_in_hand.json @@ -0,0 +1,244 @@ +{ + "gui_light": "front", + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "textures": { + "0": "enigmaticlegacy:item/eldritch_pan_model", + "particle": "enigmaticlegacy:item/eldritch_pan_model" + }, + "elements": [ + { + "from": [7, 0.25, -2], + "to": [9, 2.25, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 0.25, 0]}, + "faces": { + "north": {"uv": [5.25, 13.25, 5.75, 13.75], "texture": "#0"}, + "east": {"uv": [2.75, 13.25, 5.25, 13.75], "texture": "#0"}, + "south": {"uv": [8.25, 13.25, 8.75, 13.75], "texture": "#0"}, + "west": {"uv": [5.75, 13.25, 8.25, 13.75], "texture": "#0"}, + "up": {"uv": [5.75, 13.25, 5.25, 10.75], "texture": "#0"}, + "down": {"uv": [6.25, 10.75, 5.75, 13.25], "texture": "#0"} + } + }, + { + "from": [2, 0, 8], + "to": [14, 2, 20], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 0, 8]}, + "faces": { + "north": {"uv": [3, 3, 6, 3.5], "texture": "#0"}, + "east": {"uv": [0, 3, 3, 3.5], "texture": "#0"}, + "south": {"uv": [9, 3, 12, 3.5], "texture": "#0"}, + "west": {"uv": [6, 3, 9, 3.5], "texture": "#0"}, + "up": {"uv": [6, 3, 3, 0], "texture": "#0"}, + "down": {"uv": [9, 0, 6, 3], "texture": "#0"} + } + }, + { + "from": [13, 2, 8], + "to": [14, 3, 20], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 1, 8]}, + "faces": { + "north": {"uv": [6.5, 6.75, 6.75, 7], "texture": "#0"}, + "east": {"uv": [3.5, 6.75, 6.5, 7], "texture": "#0"}, + "south": {"uv": [9.75, 6.75, 10, 7], "texture": "#0"}, + "west": {"uv": [6.75, 6.75, 9.75, 7], "texture": "#0"}, + "up": {"uv": [6.75, 6.75, 6.5, 3.75], "texture": "#0"}, + "down": {"uv": [7, 3.75, 6.75, 6.75], "texture": "#0"} + } + }, + { + "from": [3, 7, 16.25], + "to": [13, 7, 19.25], + "rotation": {"angle": 22.5, "axis": "x", "origin": [6, 5, 8.25]}, + "faces": { + "north": {"uv": [7, 6.75, 9.5, 6.75], "texture": "#0"}, + "east": {"uv": [6.25, 6.75, 7, 6.75], "texture": "#0"}, + "south": {"uv": [10.25, 6.75, 12.75, 6.75], "texture": "#0"}, + "west": {"uv": [9.5, 6.75, 10.25, 6.75], "texture": "#0"}, + "up": {"uv": [9.5, 6.75, 7, 6], "texture": "#0"}, + "down": {"uv": [12, 6, 9.5, 6.75], "texture": "#0"} + } + }, + { + "from": [3, 7, 8.75], + "to": [13, 7, 11.75], + "rotation": {"angle": -22.5, "axis": "x", "origin": [6, 5, 19.75]}, + "faces": { + "north": {"uv": [7, 4.25, 9.5, 4.25], "texture": "#0"}, + "east": {"uv": [6.25, 4.25, 7, 4.25], "texture": "#0"}, + "south": {"uv": [10.25, 4.25, 12.75, 4.25], "texture": "#0"}, + "west": {"uv": [9.5, 4.25, 10.25, 4.25], "texture": "#0"}, + "up": {"uv": [9.5, 4.25, 7, 3.5], "texture": "#0"}, + "down": {"uv": [12, 3.5, 9.5, 4.25], "texture": "#0"} + } + }, + { + "from": [10, 7, 9], + "to": [13, 7, 19], + "rotation": {"angle": -22.5, "axis": "z", "origin": [2, 5, 12]}, + "faces": { + "north": {"uv": [5, 6, 5.75, 6], "texture": "#0"}, + "east": {"uv": [2.5, 6, 5, 6], "texture": "#0"}, + "south": {"uv": [8.25, 6, 9, 6], "texture": "#0"}, + "west": {"uv": [5.75, 6, 8.25, 6], "texture": "#0"}, + "up": {"uv": [5.75, 6, 5, 3.5], "texture": "#0"}, + "down": {"uv": [6.5, 3.5, 5.75, 6], "texture": "#0"} + } + }, + { + "from": [2.5, 7, 9], + "to": [5.5, 7, 19], + "rotation": {"angle": 22.5, "axis": "z", "origin": [13.5, 5, 12]}, + "faces": { + "north": {"uv": [3.5, 6, 4.25, 6], "texture": "#0"}, + "east": {"uv": [1, 6, 3.5, 6], "texture": "#0"}, + "south": {"uv": [6.75, 6, 7.5, 6], "texture": "#0"}, + "west": {"uv": [4.25, 6, 6.75, 6], "texture": "#0"}, + "up": {"uv": [4.25, 6, 3.5, 3.5], "texture": "#0"}, + "down": {"uv": [5, 3.5, 4.25, 6], "texture": "#0"} + } + }, + { + "from": [4.75, 5, 7.5], + "to": [7.75, 5, 14.5], + "rotation": {"angle": 22.5, "axis": "x", "origin": [0.75, 3, 6.5]}, + "faces": { + "north": {"uv": [3, 8.75, 3.75, 8.75], "texture": "#0"}, + "east": {"uv": [1.25, 8.75, 3, 8.75], "texture": "#0"}, + "south": {"uv": [5.5, 8.75, 6.25, 8.75], "texture": "#0"}, + "west": {"uv": [3.75, 8.75, 5.5, 8.75], "texture": "#0"}, + "up": {"uv": [3.75, 8.75, 3, 7], "texture": "#0"}, + "down": {"uv": [4.5, 7, 3.75, 8.75], "texture": "#0"} + } + }, + { + "from": [3.75, 4.465, 1.18963], + "to": [7.75, 4.465, 8.18963], + "rotation": {"angle": 0, "axis": "y", "origin": [0.75, 2.465, 0.18963]}, + "faces": { + "north": {"uv": [7, 6, 8, 6], "texture": "#0"}, + "east": {"uv": [5.25, 6, 7, 6], "texture": "#0"}, + "south": {"uv": [9.75, 6, 10.75, 6], "texture": "#0"}, + "west": {"uv": [8, 6, 9.75, 6], "texture": "#0"}, + "up": {"uv": [8, 6, 7, 4.25], "texture": "#0"}, + "down": {"uv": [9, 4.25, 8, 6], "texture": "#0"} + } + }, + { + "from": [2, 2, 8], + "to": [3, 3, 20], + "rotation": {"angle": 0, "axis": "y", "origin": [-4, 1, 8]}, + "faces": { + "north": {"uv": [3, 6.5, 3.25, 6.75], "texture": "#0"}, + "east": {"uv": [0, 6.5, 3, 6.75], "texture": "#0"}, + "south": {"uv": [6.25, 6.5, 6.5, 6.75], "texture": "#0"}, + "west": {"uv": [3.25, 6.5, 6.25, 6.75], "texture": "#0"}, + "up": {"uv": [3.25, 6.5, 3, 3.5], "texture": "#0"}, + "down": {"uv": [3.5, 3.5, 3.25, 6.5], "texture": "#0"} + } + }, + { + "from": [3, 2, 8], + "to": [13, 3, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [-5, 1, 8]}, + "faces": { + "north": {"uv": [4.75, 7.25, 7.25, 7.5], "texture": "#0"}, + "east": {"uv": [4.5, 7.25, 4.75, 7.5], "texture": "#0"}, + "south": {"uv": [7.5, 7.25, 10, 7.5], "texture": "#0"}, + "west": {"uv": [7.25, 7.25, 7.5, 7.5], "texture": "#0"}, + "up": {"uv": [7.25, 7.25, 4.75, 7], "texture": "#0"}, + "down": {"uv": [9.75, 7, 7.25, 7.25], "texture": "#0"} + } + }, + { + "from": [3, 2, 19], + "to": [13, 3, 20], + "rotation": {"angle": 0, "axis": "y", "origin": [6, 1, 8]}, + "faces": { + "north": {"uv": [4.75, 7.75, 7.25, 8], "texture": "#0"}, + "east": {"uv": [4.5, 7.75, 4.75, 8], "texture": "#0"}, + "south": {"uv": [7.5, 7.75, 10, 8], "texture": "#0"}, + "west": {"uv": [7.25, 7.75, 7.5, 8], "texture": "#0"}, + "up": {"uv": [7.25, 7.75, 4.75, 7.5], "texture": "#0"}, + "down": {"uv": [9.75, 7.5, 7.25, 7.75], "texture": "#0"} + } + }, + { + "from": [8, 1.75, 19.25], + "to": [11, 3.75, 21.25], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 1.75, 19.25]}, + "faces": { + "north": {"uv": [0.5, 2, 1.25, 2.5], "texture": "#0"}, + "east": {"uv": [0, 2, 0.5, 2.5], "texture": "#0"}, + "south": {"uv": [1.75, 2, 2.5, 2.5], "texture": "#0"}, + "west": {"uv": [1.25, 2, 1.75, 2.5], "texture": "#0"}, + "up": {"uv": [1.25, 2, 0.5, 1.5], "texture": "#0"}, + "down": {"uv": [2, 1.5, 1.25, 2], "texture": "#0"} + } + }, + { + "from": [1.75, 1.75, 12], + "to": [2.75, 3.75, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0.75, 1.75, 13]}, + "faces": { + "north": {"uv": [0.75, 4.25, 1, 4.75], "texture": "#0"}, + "east": {"uv": [0, 4.25, 0.75, 4.75], "texture": "#0"}, + "south": {"uv": [1.75, 4.25, 2, 4.75], "texture": "#0"}, + "west": {"uv": [1, 4.25, 1.75, 4.75], "texture": "#0"}, + "up": {"uv": [1, 4.25, 0.75, 3.5], "texture": "#0"}, + "down": {"uv": [1.25, 3.5, 1, 4.25], "texture": "#0"} + } + }, + { + "from": [13.25, 1.75, 10], + "to": [15.25, 3.75, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [12.25, 1.75, 11]}, + "faces": { + "north": {"uv": [1, 1, 1.5, 1.5], "texture": "#0"}, + "east": {"uv": [0, 1, 1, 1.5], "texture": "#0"}, + "south": {"uv": [2.5, 1, 3, 1.5], "texture": "#0"}, + "west": {"uv": [1.5, 1, 2.5, 1.5], "texture": "#0"}, + "up": {"uv": [1.5, 1, 1, 0], "texture": "#0"}, + "down": {"uv": [2, 0, 1.5, 1], "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [-95.1, 0, 113], + "translation": [-5.25, 2, 3.5], + "scale": [0.85, 0.85, 0.85] + }, + "thirdperson_lefthand": { + "rotation": [-95.1, 0, 113], + "translation": [-5.25, 2, 3.5], + "scale": [0.85, 0.85, 0.85] + }, + "firstperson_righthand": { + "rotation": [-98.84, 21.29, 128.68], + "translation": [-5.25, 3.5, 3.5], + "scale": [0.85, 0.85, 0.85] + }, + "firstperson_lefthand": { + "rotation": [-98.84, 21.29, 128.68], + "translation": [-5.25, 3.5, 3.5], + "scale": [0.85, 0.85, 0.85] + }, + "ground": { + "translation": [0, 5, 0] + }, + "gui": { + "rotation": [50, 135, 0], + "translation": [-2.5, 1.25, 0], + "scale": [0.79, 0.79, 0.79] + }, + "head": { + "rotation": [-180, -46, -180], + "translation": [3.25, 14.5, 3.25] + }, + "fixed": { + "rotation": [-90, 45, 0], + "translation": [-2, -2.25, -7] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_in_inventory.json b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_in_inventory.json new file mode 100644 index 00000000..ac363bbb --- /dev/null +++ b/src/main/resources/assets/enigmaticlegacy/models/item/eldritch_pan_in_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "enigmaticlegacy:item/eldritch_pan" + } +} diff --git a/src/main/resources/assets/enigmaticlegacy/patchouli_books/the_acknowledgment/en_us/entries/tools/eldritch_pan.json b/src/main/resources/assets/enigmaticlegacy/patchouli_books/the_acknowledgment/en_us/entries/tools/eldritch_pan.json new file mode 100644 index 00000000..c88335f4 --- /dev/null +++ b/src/main/resources/assets/enigmaticlegacy/patchouli_books/the_acknowledgment/en_us/entries/tools/eldritch_pan.json @@ -0,0 +1,38 @@ +{ + "name": "book.enigmaticlegacy.entry.eldritch_pan.name", + "icon": "enigmaticlegacy:eldritch_pan", + "category": "enigmaticlegacy:tools", + "advancement": "enigmaticlegacy:book/tools/eldritch_pan", + "secret": false, + "priority": false, + "read_by_default": false, + "sortnum": 120, + "pages": [ + { + "type": "text", + "text": "book.enigmaticlegacy.entry.eldritch_pan.page.1" + }, + { + "type": "crafting", + "recipe": "enigmaticlegacy:eldritch_pan", + "title": " ", + "text": "book.enigmaticlegacy.entry.eldritch_pan.page.2" + }, + { + "type": "text", + "text": "book.enigmaticlegacy.entry.eldritch_pan.page.3" + }, + { + "type": "text", + "text": "book.enigmaticlegacy.entry.eldritch_pan.page.4" + }, + { + "type": "text", + "text": "book.enigmaticlegacy.entry.eldritch_pan.page.5" + }, + { + "type": "empty", + "draw_filler": false + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/enigmaticlegacy/sounds.json b/src/main/resources/assets/enigmaticlegacy/sounds.json index 0dac4475..a026b64b 100644 --- a/src/main/resources/assets/enigmaticlegacy/sounds.json +++ b/src/main/resources/assets/enigmaticlegacy/sounds.json @@ -50,6 +50,28 @@ } ] }, + "misc.pan_clang": { + "sounds": [ + { + "name": "enigmaticlegacy:misc/pan_clang_1", + "stream": false + }, { + "name": "enigmaticlegacy:misc/pan_clang_2", + "stream": false + }, { + "name": "enigmaticlegacy:misc/pan_clang_3", + "stream": false + } + ] + }, + "misc.pan_clang_fr": { + "sounds": [ + { + "name": "enigmaticlegacy:misc/pan_clang_fr", + "stream": false + } + ] + }, "misc.uneat": { "sounds": [ { diff --git a/src/main/resources/assets/enigmaticlegacy/sounds/misc/pan_clang_1.ogg b/src/main/resources/assets/enigmaticlegacy/sounds/misc/pan_clang_1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d29a30a7ebf7be6a88444f4eb7b8ee579c4a8f95 GIT binary patch literal 17331 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/enigmaticlegacy/sounds/misc/pan_clang_3.ogg b/src/main/resources/assets/enigmaticlegacy/sounds/misc/pan_clang_3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..50cdd7bf3ed1e75e27b04618622df97a82fff015 GIT binary patch literal 18446 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 Iy#f0F2X`eB82|tP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan.png b/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan.png new file mode 100644 index 0000000000000000000000000000000000000000..2592c1f6745d6307e37fb9eb33d15804caa6a8c6 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^0ziC#gBeI#2@BT%DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheHUT~%t^r#1rV2)jOoIOZ`0?oEITa0KOFiE>yR>@M05NG9_aw)*h0U6R zk^z#&a&mJ039VjUURqjOoSd9M1M-sg=K(2^k|4j}|CoTm-~YKFP@c2EBeIx*f$uN~ zGak=hkpgs>w5N+>h==#vX%{CQQs8lA7P%GR5dH6e{9eXwZ(rHH-J#ugcEwa?;|a;a z-aqxU6oQ_1X*6t+)M@IFl9*DoSbFNr1_6mvOxaf#a3!SM8pmC`$))r8jKjT8Y%`o^ zd|cWz@wtG~f^3D@J^d5+W@}$Eja|g2d@OZ(N$j;1%Nufe&rQ6vX^kZJjHz-RDOG1J z{Tzc1T@+q++M-FpV;Q3pAMcd&&LJNj9DZ@xy_e~Pgzm|I514Or-Kh1c{UPz?lfTl*@A-c= z|DO5r`n)+`FZJ^O{M&E$B*9%?==|&Dw?DrWzwygm|LZ3udELL}FP86LF?~*c#)HYf USIqDU1cn`hr>mdKI;Vst0M^dXMF0Q* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan.png.mcmeta b/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan.png.mcmeta new file mode 100644 index 00000000..4f27dbe9 --- /dev/null +++ b/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan.png.mcmeta @@ -0,0 +1,19 @@ +{ + "animation": { + "frames": [ + {"index": 0, "time": 20}, + {"index": 1, "time": 32}, + {"index": 2, "time": 17}, + {"index": 3, "time": 25}, + {"index": 4, "time": 10}, + {"index": 5, "time": 45}, + {"index": 6, "time": 2}, + {"index": 7, "time": 2}, + {"index": 8, "time": 2}, + {"index": 9, "time": 2}, + {"index": 10, "time": 2}, + {"index": 11, "time": 2} + ], + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_model.png b/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_model.png new file mode 100644 index 0000000000000000000000000000000000000000..b770f5fd900ea955a9e40d6a1a0ccf31ef9dac2b GIT binary patch literal 1369 zcmZuxdsLEV7=PhIQ6y3G9u8z$bUBks3#a2wUWN=QSF4kfO|6y5?50lSQ*-5|)U0NC z$!ulWP3tHtQXy-hnX@dls6>O6mPgWBq6GW=yWVr2=l4A4Jm+_Q&*i-NB4OAZoHq^t zFef6MCq|G307_*CA(6kd8b$!MQyj(tm%E80NP8cXZ4BMGKw1L|)5d8HvS`yvrT+Pu}4;XmyJ!130sq1>pEFrq0dg2!Hy7CTmT zFtwiMy6^mBhrT}2#c^x>$G6oy7mS+b)6$~s<-}|LsFX^(x(9yrSRK>SGITTYy`?o) zyR{{@t?hKOz;OVhI(Y%FdSQDUIydV5%C#Z(Nl%Ge&x-lz6K7kGt26F+F3GWn&o7PH zu$ZpP1r?wVu9J?{Y&VVG_;*}e0qqIl)-0ITx(EQ>9;)G}?zY2;o8cXE7z`&Ur`T6; zk=;wqTs=ft|9bvKb&l5aD7pb%9e!biSHS6tc4w8Vry0OQo+XoAT^o1u`I~nqddBM) z$+kR<{?%wJ_dUjKyWqrW_oLkjX=P5O9|8k3dqH|@>(eV(~>b+989o-st38Dl&C)XwMRq_D7==(j|b9T?#4E@$gdLVlAk+ zf9y_3Cpd6pLm(swlR|WfvuxzLE%jN9t!7dst=M|Y2W*=;ZIiG+ItsPKPwBsRqVa0o zZBk&UIWuux!h@$tXHqG{Qv-)r(WNiPBfTVw&7*%uZ2C5OJ4x)QJF!38{&m4k2`k+$ ztCvPm`p37IWPp7t$F;1?wUZ7z9z%kp*tlSo$B?f9_DUhkK7iuy;W#|KX>6fuT_Bzw zV3VmB3r0dTy=m|i{Y<}20`1#zNZxXZVM=^vN=w=!P3dTW*)uD%Z{QG2o@^Fmqw=_Ws>XP059jo`mUO9ylx~ zTUnOu{2&vSe0_lNCs7qdfbKENFA>Ssns9Ux3a5}&=}8(UjGG%_VV}aJd8y*9U|v$? zwdBFCEvV*kx<^W=Z15?TW?LxfWFE+L|b zVZcOo^WW}Sv0#zF&xFl$(ItQhLQeGvNn%7;5_>MOv*jw&W=DRZW+SOzqE0S~L|Ko^ zbrF(+y=KxRVGB3;JDdso)o#U>2?8g|g398Qdf=%9b&B_@pB23Ao?-&hF%NByXAL!9 zDKkSRtY{OZgGoIC0wC3bJ(Z>i3iUbeRI&i`dd9(%)HXrTlO)ZI^+Y#piqRuJ_`MS6 zo90qJ>?41~G=@DmQitDmZNO4byl|$uE;T{W3u?&i(8RttVC8`zMr*5guaPK)@-rnSZ1jtXx3m{xSv%*E7g-=ef&&GD(DZzFR@CRQ(<#1 h#h&*0yiM>uLjdvFn9qj3pi$&|0ug*6?=nY{^FQ#-X9NHM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_model.png.mcmeta b/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_model.png.mcmeta new file mode 100644 index 00000000..19e44aaf --- /dev/null +++ b/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_model.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frames": [{"index": 0, "time": 96}, 1, 2, 3, 4, 5, 6], + "frametime": 1 + } +} diff --git a/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_temp.png b/src/main/resources/assets/enigmaticlegacy/textures/item/eldritch_pan_temp.png new file mode 100644 index 0000000000000000000000000000000000000000..53b2566b849cbf236d7f4b40b2227b77af2c48a0 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G~10G|+7AZ=h^;N#=d(9i&6&*?Kt08*?aL4Lvifq>!nHa?I+oCO|{#S9F5 zhe4R}c>anMprDthi(`mJ@X~%mAqGXBmPOD0=kH?;z9Aoaz+&;$An|3dy*1jRqBZi4 z@&~BB(EQJwH)D~oj-zi!70bqTHqZZh*Hq^}`1ShTIgY#XTE$F`Zs+u#0ZnD_boFyt I=akR{04h{P^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/enigmaticlegacy/textures/mob_effect/growing_bloodlust.png b/src/main/resources/assets/enigmaticlegacy/textures/mob_effect/growing_bloodlust.png new file mode 100644 index 0000000000000000000000000000000000000000..f66c7744baa8b7616713007bacd88ec171866333 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|~0G|-o3GuLZ zb~>JY8ZGc9QmSzrXM(&e(=9HsN*)c;+`27oRo9#a)AGI_zu14T zCr>Bk>CY->yXPI+0c+w;$ea~e`)#t(oBPv4)8r*N5*=1Nu3c!%^vsDhz$2tWpi*b~ t&a^Mwe!kPc3aQxa^xP_N^;&Tqqt8{IMe0gQGl9-z@O1TaS?83{1OPK_jluu` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/enigmaticlegacy/textures/mob_effect/growing_hunger.png b/src/main/resources/assets/enigmaticlegacy/textures/mob_effect/growing_hunger.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b29e92dbaf9b899c260fe6f33f7d253005a346 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh(0G|+7WyTC=#yOi559cr(ZV_H^r}u%HbbzLWo331>w6yf&$B!2;UMwXg z#m~<_Y0{*+y1H%Kww(yNP*zqZARwSA?$puI!OF_o)YP570tR&xZd0H#&H|6fVg?4j!ywFfJby(BP;h~#i(`mJaB5$m&>;mL7w1V`TV1=C zhVJ<9cy?KYJ&*AOn=)hXx9c1Hd`f!C)@$N*2It+3j9JHbE52bCl6y2q?sR^1z`4T8bt^YyxgXk@^Ln48RY=0lC4axJ z;}Hx{4%O4VdZtJzW$o2Z$%piuU6f>We8VdrDVyt=KU%(jMSk_BYj%nOg52|t-Uo#+ NgQu&X%Q~loCIGmyp3ndQ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/enigmaticlegacy/advancements/book/tools/eldritch_pan.json b/src/main/resources/data/enigmaticlegacy/advancements/book/tools/eldritch_pan.json new file mode 100644 index 00000000..a26237dc --- /dev/null +++ b/src/main/resources/data/enigmaticlegacy/advancements/book/tools/eldritch_pan.json @@ -0,0 +1,17 @@ +{ + "parent": "enigmaticlegacy:book/root", + "rewards": {}, + "criteria": { + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "enigmaticlegacy:eldritch_pan" + } + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/main/resources/data/enigmaticlegacy/advancements/recipes/generic/eldritch_pan.json b/src/main/resources/data/enigmaticlegacy/advancements/recipes/generic/eldritch_pan.json new file mode 100644 index 00000000..13839312 --- /dev/null +++ b/src/main/resources/data/enigmaticlegacy/advancements/recipes/generic/eldritch_pan.json @@ -0,0 +1,50 @@ +{ + "parent": "enigmaticlegacy:recipes/root", + "rewards": { + "recipes": [ + "enigmaticlegacy:eldritch_pan" + ] + }, + "criteria": { + "has_items": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": ["enigmaticlegacy:abyssal_heart"] + } + ] + } + }, + "has_recipe_result": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": ["enigmaticlegacy:eldritch_pan"] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "enigmaticlegacy:eldritch_pan" + } + }, + "is_cursed_one": { + "trigger": "enigmaticlegacy:equip_cursed_ring" + } + }, + "requirements": [ + [ + "has_recipe_result", + "has_the_recipe", + "has_items" + ], + [ + "is_cursed_one", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/main/resources/data/enigmaticlegacy/recipes/eldritch_pan.json b/src/main/resources/data/enigmaticlegacy/recipes/eldritch_pan.json new file mode 100644 index 00000000..46ee29df --- /dev/null +++ b/src/main/resources/data/enigmaticlegacy/recipes/eldritch_pan.json @@ -0,0 +1,37 @@ +{ + "type": "minecraft:crafting_shaped", + "conditions": [ + { + "type": "enigmaticlegacy:is_enabled", + "item": "enigmaticlegacy:eldritch_pan" + } + ], + "pattern": [ + "ESE", + "IHI", + "TRT" + ], + "key": { + "E": { + "item": "enigmaticlegacy:evil_essence" + }, + "T": { + "item": "minecraft:ghast_tear" + }, + "H": { + "item": "enigmaticlegacy:abyssal_heart" + }, + "I": { + "item": "enigmaticlegacy:evil_ingot" + }, + "S": { + "item": "enigmaticlegacy:void_stone" + }, + "R": { + "item": "enigmaticlegacy:ender_rod" + } + }, + "result": { + "item": "enigmaticlegacy:eldritch_pan" + } +} \ No newline at end of file