diff --git a/src/main/java/io/redspace/ironsspellbooks/config/ServerConfigs.java b/src/main/java/io/redspace/ironsspellbooks/config/ServerConfigs.java index 6c55f9ba2..7baf12689 100644 --- a/src/main/java/io/redspace/ironsspellbooks/config/ServerConfigs.java +++ b/src/main/java/io/redspace/ironsspellbooks/config/ServerConfigs.java @@ -97,6 +97,7 @@ public class ServerConfigs { createSpellConfig(SpellType.WITHER_SKULL_SPELL, WitherSkullSpell.defaultConfig, true); createSpellConfig(SpellType.BlOOD_NEEDLES_SPELL, BloodNeedlesSpell.defaultConfig, true); createSpellConfig(SpellType.ACUPUNCTURE_SPELL, AcupunctureSpell.defaultConfig, true); + createSpellConfig(SpellType.DEVOUR_SPELL, DevourSpell.defaultConfig, true); //Ender BUILDER.comment("Ender Spells"); createSpellConfig(SpellType.EVASION_SPELL, EvasionSpell.defaultConfig, true); diff --git a/src/main/java/io/redspace/ironsspellbooks/entity/spells/AoeEntity.java b/src/main/java/io/redspace/ironsspellbooks/entity/spells/AoeEntity.java index 085c3d642..296abed80 100644 --- a/src/main/java/io/redspace/ironsspellbooks/entity/spells/AoeEntity.java +++ b/src/main/java/io/redspace/ironsspellbooks/entity/spells/AoeEntity.java @@ -75,7 +75,7 @@ public void tick() { protected void checkHits() { if (level.isClientSide) return; - List targets = this.level.getEntitiesOfClass(LivingEntity.class, this.getBoundingBox()); + List targets = this.level.getEntitiesOfClass(LivingEntity.class, this.getBoundingBox().inflate(this.getInflation())); boolean hit = false; for (LivingEntity target : targets) { if (canHitEntity(target) && (!isCircular() || target.distanceTo(this) < getRadius())) { @@ -92,6 +92,10 @@ protected void checkHits() { } } + protected float getInflation() { + return 0; + } + @Override protected boolean canHitEntity(Entity pTarget) { return pTarget != getOwner() && super.canHitEntity(pTarget); diff --git a/src/main/java/io/redspace/ironsspellbooks/entity/spells/devour_jaw/DevourJaw.java b/src/main/java/io/redspace/ironsspellbooks/entity/spells/devour_jaw/DevourJaw.java new file mode 100644 index 000000000..4d9f1e86b --- /dev/null +++ b/src/main/java/io/redspace/ironsspellbooks/entity/spells/devour_jaw/DevourJaw.java @@ -0,0 +1,114 @@ +package io.redspace.ironsspellbooks.entity.spells.devour_jaw; + +import io.redspace.ironsspellbooks.damage.DamageSources; +import io.redspace.ironsspellbooks.entity.spells.AoeEntity; +import io.redspace.ironsspellbooks.registries.EntityRegistry; +import io.redspace.ironsspellbooks.registries.MobEffectRegistry; +import io.redspace.ironsspellbooks.registries.SoundRegistry; +import io.redspace.ironsspellbooks.spells.SpellType; +import io.redspace.ironsspellbooks.util.ParticleHelper; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.network.protocol.Packet; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.network.NetworkHooks; + +public class DevourJaw extends AoeEntity { + public DevourJaw(EntityType pEntityType, Level pLevel) { + super(pEntityType, pLevel); + } + + LivingEntity target; + + public DevourJaw(Level level, LivingEntity owner, LivingEntity target) { + this(EntityRegistry.DEVOUR_JAW.get(), level); + setOwner(owner); + this.target = target; + } + + //dont need to serialize, dont need it only client either + public int vigorLevel; + + @Override + public void applyEffect(LivingEntity target) { + if (target == this.target) + if (DamageSources.applyDamage(target, getDamage(), SpellType.DEVOUR_SPELL.getDamageSource(this, getOwner()), SpellType.DEVOUR_SPELL.getSchoolType()) && getOwner() instanceof LivingEntity livingOwner) { + livingOwner.heal(getDamage() * .15f); + if (target.isDeadOrDying()) { + var oldVigor = livingOwner.getEffect(MobEffectRegistry.VIGOR.get()); + var addition = 0; + if (oldVigor != null) + addition = oldVigor.getAmplifier() + 1; + livingOwner.addEffect(new MobEffectInstance(MobEffectRegistry.VIGOR.get(), 20 * 60, vigorLevel + addition, false, false, true)); + livingOwner.heal((vigorLevel + 1) * 2); + } + } + + } + + public final int waitTime = 5; + public final int warmupTime = waitTime + 8; + public final int deathTime = warmupTime + 8; + + @Override + public void tick() { + if (tickCount < waitTime) { + if (this.target != null) + setPos(this.target.position()); + } else if (tickCount == waitTime) { + this.playSound(SoundRegistry.DEVOUR_BITE.get(), 2, 1); + } else if (tickCount == warmupTime) { + if (level.isClientSide) { + float y = this.getYRot(); + int countPerSide = 25; + //These particles were not at all what I intended. But they're cooler. no clue how it works + for (int i = -countPerSide; i < countPerSide; i++) { + Vec3 motion = new Vec3(0, Math.abs(countPerSide) - i, countPerSide * .5f).yRot(y).normalize().multiply(.4f, .8f, .4f); + level.addParticle(ParticleHelper.BLOOD, getX(), getY() + .5f, getZ(), motion.x, motion.y, motion.z); + } + } else { + checkHits(); + } + } else if (tickCount > deathTime) + discard(); + } + + @Override + protected float getInflation() { + return 2f; + } + + @Override + public boolean shouldBeSaved() { + return false; + } + + @Override + public void refreshDimensions() { + return; + } + + @Override + public void ambientParticles() { + return; + } + + @Override + public float getParticleCount() { + return 0; + } + + @Override + public ParticleOptions getParticle() { + return ParticleHelper.BLOOD; + } + + @Override + public Packet getAddEntityPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } +} diff --git a/src/main/java/io/redspace/ironsspellbooks/entity/spells/devour_jaw/DevourJawRenderer.java b/src/main/java/io/redspace/ironsspellbooks/entity/spells/devour_jaw/DevourJawRenderer.java new file mode 100644 index 000000000..dc0f6f14b --- /dev/null +++ b/src/main/java/io/redspace/ironsspellbooks/entity/spells/devour_jaw/DevourJawRenderer.java @@ -0,0 +1,79 @@ +package io.redspace.ironsspellbooks.entity.spells.devour_jaw; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Vector3f; +import io.redspace.ironsspellbooks.IronsSpellbooks; +import net.minecraft.client.model.EvokerFangsModel; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; + +public class DevourJawRenderer extends EntityRenderer { + + private final DevourJawModel model; + + public DevourJawRenderer(EntityRendererProvider.Context pContext) { + super(pContext); + this.model = new DevourJawModel(pContext.bakeLayer(ModelLayers.EVOKER_FANGS)); + } + + public void render(DevourJaw entity, float yaw, float partialTicks, PoseStack poseStack, MultiBufferSource multiBufferSource, int light) { + if (entity.tickCount < entity.waitTime) + return; + float f = entity.tickCount + partialTicks; + poseStack.pushPose(); + poseStack.mulPose(Vector3f.YP.rotationDegrees(-entity.getYRot())); + poseStack.scale(-1, -1, 1); + poseStack.scale(1.85f, 1.85f, 1.85f); + this.model.setupAnim(entity, f, 0.0F, 0.0F, entity.getYRot(), entity.getXRot()); + VertexConsumer vertexconsumer = multiBufferSource.getBuffer(RenderType.entityCutoutNoCull(getTextureLocation(entity))); + this.model.renderToBuffer(poseStack, vertexconsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + poseStack.popPose(); + super.render(entity, yaw, partialTicks, poseStack, multiBufferSource, light); + } + + @Override + public ResourceLocation getTextureLocation(DevourJaw pEntity) { + return IronsSpellbooks.id("textures/entity/devour_jaw.png"); + } + + static class DevourJawModel extends EvokerFangsModel { + private final ModelPart root; + private final ModelPart base; + private final ModelPart upperJaw; + private final ModelPart lowerJaw; + + public DevourJawModel(ModelPart pRoot) { + super(pRoot); + this.root = pRoot; + this.base = pRoot.getChild("base"); + this.upperJaw = pRoot.getChild("upper_jaw"); + this.lowerJaw = pRoot.getChild("lower_jaw"); + } + + @Override + public void setupAnim(DevourJaw entity, float time, float pLimbSwingAmount, float pAgeInTicks, float pNetHeadYaw, float pHeadPitch) { + time -= entity.waitTime; + float interval = entity.warmupTime - entity.waitTime; + + float f = Mth.clamp(time / interval, 0, 1); + f = 1 - f * f * f * f; + this.upperJaw.zRot = (float) Math.PI - f * 0.35F * (float) Math.PI; + this.lowerJaw.zRot = (float) Math.PI + f * 0.35F * (float) Math.PI; + + float f2 = (time / interval); + f2 = .5f * Mth.cos(.5f * Mth.PI * (f2 - 1)) + .5f; + f2 *= f2; + this.upperJaw.y = -18F * f2 + 16f; + this.lowerJaw.y = this.upperJaw.y; + this.base.y = this.upperJaw.y; + } + } +} diff --git a/src/main/java/io/redspace/ironsspellbooks/registries/EntityRegistry.java b/src/main/java/io/redspace/ironsspellbooks/registries/EntityRegistry.java index 104610b53..d66b006cc 100644 --- a/src/main/java/io/redspace/ironsspellbooks/registries/EntityRegistry.java +++ b/src/main/java/io/redspace/ironsspellbooks/registries/EntityRegistry.java @@ -15,6 +15,7 @@ import io.redspace.ironsspellbooks.entity.mobs.wizards.pyromancer.PyromancerEntity; import io.redspace.ironsspellbooks.entity.spells.ChainLightning; import io.redspace.ironsspellbooks.entity.spells.ExtendedWitherSkull; +import io.redspace.ironsspellbooks.entity.spells.devour_jaw.DevourJaw; import io.redspace.ironsspellbooks.entity.spells.gust.GustCollider; import io.redspace.ironsspellbooks.entity.spells.HealingAoe; import io.redspace.ironsspellbooks.entity.spells.acid_orb.AcidOrb; @@ -403,4 +404,10 @@ public static void register(IEventBus eventBus) { .sized(1f, 1f) .clientTrackingRange(64) .build(new ResourceLocation(IronsSpellbooks.MODID, "chain_lightning").toString())); + + public static final RegistryObject> DEVOUR_JAW = + ENTITIES.register("devour_jaw", () -> EntityType.Builder.of(DevourJaw::new, MobCategory.MISC) + .sized(2f, 2f) + .clientTrackingRange(64) + .build(new ResourceLocation(IronsSpellbooks.MODID, "devour_jaw").toString())); } \ No newline at end of file diff --git a/src/main/java/io/redspace/ironsspellbooks/registries/MobEffectRegistry.java b/src/main/java/io/redspace/ironsspellbooks/registries/MobEffectRegistry.java index bd313918c..8c6720e7a 100644 --- a/src/main/java/io/redspace/ironsspellbooks/registries/MobEffectRegistry.java +++ b/src/main/java/io/redspace/ironsspellbooks/registries/MobEffectRegistry.java @@ -39,6 +39,7 @@ public static void register(IEventBus eventBus) { public static final RegistryObject BLIGHT = MOB_EFFECT_DEFERRED_REGISTER.register("blight", () -> new BlightEffect(MobEffectCategory.HARMFUL, 0xdfff2b)); public static final RegistryObject GUIDING_BOLT = MOB_EFFECT_DEFERRED_REGISTER.register("guided", () -> new GuidingBoltEffect(MobEffectCategory.HARMFUL, 16239960)); public static final RegistryObject AIRBORNE = MOB_EFFECT_DEFERRED_REGISTER.register("airborne", () -> new AirborneEffect(MobEffectCategory.HARMFUL, 0xFFFFFF)); + public static final RegistryObject VIGOR = MOB_EFFECT_DEFERRED_REGISTER.register("vigor", () -> new MobEffect(MobEffectCategory.BENEFICIAL, 0x850d0d) {}.addAttributeModifier(Attributes.MAX_HEALTH, "d2b7228b-3ded-412e-940b-8f9f1e2cf882", 2, AttributeModifier.Operation.ADDITION)); //public static final RegistryObject ROOT = MOB_EFFECT_DEFERRED_REGISTER.register("root", () -> new RootEffect(MobEffectCategory.HARMFUL, 0x604730)); //public static final RegistryObject ENCHANTED_WARD = MOB_EFFECT_DEFERRED_REGISTER.register("enchanted_ward", () -> new EnchantedWardEffect(MobEffectCategory.HARMFUL, 3311322)); } diff --git a/src/main/java/io/redspace/ironsspellbooks/registries/SoundRegistry.java b/src/main/java/io/redspace/ironsspellbooks/registries/SoundRegistry.java index ab47a6ab2..8563bde8e 100644 --- a/src/main/java/io/redspace/ironsspellbooks/registries/SoundRegistry.java +++ b/src/main/java/io/redspace/ironsspellbooks/registries/SoundRegistry.java @@ -67,6 +67,7 @@ public static void register(IEventBus eventBus) { public static RegistryObject GUIDING_BOLT_IMPACT = registerSoundEvent("entity.guiding_bolt.impact"); public static RegistryObject GUIDING_BOLT_CAST = registerSoundEvent("spell.guiding_bolt.cast"); public static RegistryObject CHAIN_LIGHTNING_CHAIN = registerSoundEvent("entity.chain_lightning.lightning_chain"); + public static RegistryObject DEVOUR_BITE = registerSoundEvent("entity.devour_jaw.bite"); public static RegistryObject DEAD_KING_SWING = registerSoundEvent("entity.dead_king.attack_swing"); public static RegistryObject DEAD_KING_SLAM = registerSoundEvent("entity.dead_king.attack_slam"); diff --git a/src/main/java/io/redspace/ironsspellbooks/setup/ClientSetup.java b/src/main/java/io/redspace/ironsspellbooks/setup/ClientSetup.java index 3dd6e6637..67408d730 100644 --- a/src/main/java/io/redspace/ironsspellbooks/setup/ClientSetup.java +++ b/src/main/java/io/redspace/ironsspellbooks/setup/ClientSetup.java @@ -29,6 +29,7 @@ import io.redspace.ironsspellbooks.entity.spells.comet.CometRenderer; import io.redspace.ironsspellbooks.entity.spells.cone_of_cold.ConeOfColdRenderer; import io.redspace.ironsspellbooks.entity.spells.creeper_head.CreeperHeadRenderer; +import io.redspace.ironsspellbooks.entity.spells.devour_jaw.DevourJawRenderer; import io.redspace.ironsspellbooks.entity.spells.electrocute.ElectrocuteRenderer; import io.redspace.ironsspellbooks.entity.spells.fireball.FireballRenderer; import io.redspace.ironsspellbooks.entity.spells.firebolt.FireboltRenderer; @@ -237,6 +238,7 @@ public static void rendererRegister(EntityRenderersEvent.RegisterRenderers event event.registerEntityRenderer(EntityRegistry.GUIDING_BOLT.get(), GuidingBoltRenderer::new); event.registerEntityRenderer(EntityRegistry.GUST_COLLIDER.get(), GustRenderer::new); event.registerEntityRenderer(EntityRegistry.CHAIN_LIGHTNING.get(), NoopRenderer::new); + event.registerEntityRenderer(EntityRegistry.DEVOUR_JAW.get(), DevourJawRenderer::new); event.registerBlockEntityRenderer(BlockRegistry.SCROLL_FORGE_TILE.get(), ScrollForgeRenderer::new); event.registerBlockEntityRenderer(BlockRegistry.PEDESTAL_TILE.get(), PedestalRenderer::new); diff --git a/src/main/java/io/redspace/ironsspellbooks/spells/SpellType.java b/src/main/java/io/redspace/ironsspellbooks/spells/SpellType.java index c755df202..55d9b95aa 100644 --- a/src/main/java/io/redspace/ironsspellbooks/spells/SpellType.java +++ b/src/main/java/io/redspace/ironsspellbooks/spells/SpellType.java @@ -102,7 +102,9 @@ public enum SpellType { GUIDING_BOLT_SPELL(62, GuidingBoltSpell::new), SUNBEAM_SPELL(63, SunbeamSpell::new), GUST_SPELL(64, GustSpell::new), - CHAIN_LIGHTNING_SPELL(65, ChainLightningSpell::new); + CHAIN_LIGHTNING_SPELL(65, ChainLightningSpell::new), + DEVOUR_SPELL(66, DevourSpell::new), + ; private final int value; private final int maxRarity; diff --git a/src/main/java/io/redspace/ironsspellbooks/spells/blood/DevourSpell.java b/src/main/java/io/redspace/ironsspellbooks/spells/blood/DevourSpell.java new file mode 100644 index 000000000..145411f88 --- /dev/null +++ b/src/main/java/io/redspace/ironsspellbooks/spells/blood/DevourSpell.java @@ -0,0 +1,93 @@ +package io.redspace.ironsspellbooks.spells.blood; + +import io.redspace.ironsspellbooks.capabilities.magic.CastTargetingData; +import io.redspace.ironsspellbooks.capabilities.magic.PlayerMagicData; +import io.redspace.ironsspellbooks.entity.spells.devour_jaw.DevourJaw; +import io.redspace.ironsspellbooks.spells.*; +import io.redspace.ironsspellbooks.util.Utils; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; + +import java.util.List; +import java.util.Optional; + + +public class DevourSpell extends AbstractSpell { + public DevourSpell() { + this(1); + } + + @Override + public List getUniqueInfo(LivingEntity caster) { + return List.of( + Component.translatable("ui.irons_spellbooks.damage", Utils.stringTruncation(getDamage(caster), 1)), + Component.translatable("ui.irons_spellbooks.max_hp_on_kill", getHpBonus(caster)) + ); + } + + public static DefaultConfig defaultConfig = new DefaultConfig() + .setMinRarity(SpellRarity.UNCOMMON) + .setSchool(SchoolType.BLOOD) + .setMaxLevel(10) + .setCooldownSeconds(20) + .build(); + + public DevourSpell(int level) { + super(SpellType.DEVOUR_SPELL); + this.setLevel(level); + this.manaCostPerLevel = 4; + this.baseSpellPower = 6; + this.spellPowerPerLevel = 1; + this.castTime = 0; + this.baseManaCost = 25; + + } + + @Override + public Optional getCastStartSound() { + return Optional.empty(); + } + + @Override + public Optional getCastFinishSound() { + return Optional.empty(); + } + + + @Override + public boolean checkPreCastConditions(Level level, LivingEntity entity, PlayerMagicData playerMagicData) { + return Utils.preCastTargetHelper(level, entity, playerMagicData, getSpellType(), 6, .1f); + } + + @Override + public void onCast(Level world, LivingEntity entity, PlayerMagicData playerMagicData) { + if (playerMagicData.getAdditionalCastData() instanceof CastTargetingData targetData) { + var targetEntity = targetData.getTarget((ServerLevel) world); + if (targetEntity != null) { + targetEntity.setDeltaMovement(targetEntity.getDeltaMovement().add(targetEntity.position().subtract(entity.position()).scale(-.25f))); + targetEntity.hurtMarked = true; + DevourJaw devour = new DevourJaw(world, entity, targetEntity); + devour.setPos(targetEntity.position()); + devour.setYRot(entity.getYRot()); + devour.setDamage(getDamage(entity)); + devour.vigorLevel = (getHpBonus(entity) / 2) - 1; + world.addFreshEntity(devour); + } + } + + super.onCast(world, entity, playerMagicData); + } + + public float getDamage(LivingEntity caster) { + return getSpellPower(caster); + } + + public int getHpBonus(LivingEntity caster) { + return 2 * (int) (getSpellPower(caster) * .25f); + } + +} diff --git a/src/main/resources/assets/irons_spellbooks/lang/en_us.json b/src/main/resources/assets/irons_spellbooks/lang/en_us.json index ca20d40f4..cb8a13858 100644 --- a/src/main/resources/assets/irons_spellbooks/lang/en_us.json +++ b/src/main/resources/assets/irons_spellbooks/lang/en_us.json @@ -182,6 +182,7 @@ "ui.irons_spellbooks.damage": "%d Damage", "ui.irons_spellbooks.aoe_damage": "%d AOE Damage", "ui.irons_spellbooks.aoe_healing": "%d AOE Healing", + "ui.irons_spellbooks.max_hp_on_kill": "%d Max HP on Kill", "ui.irons_spellbooks.additional_poisoned_damage": "%d%% Additional Poisoned Damage", "ui.irons_spellbooks.strength": "%d Strength", "ui.irons_spellbooks.max_victims": "%d Max Hits", @@ -331,6 +332,7 @@ "spell.irons_spellbooks.guiding_bolt": "Guiding Bolt", "spell.irons_spellbooks.gust": "Gust", "spell.irons_spellbooks.chain_lightning": "Chain Lightning", + "spell.irons_spellbooks.devour": "Devour", "spell.irons_spellbooks.none.guide": "Nothing to see here!", "spell.irons_spellbooks.fireball.guide": "Manifest and throw a ball of fire, exploding and dealing massive damage on impact.", @@ -398,6 +400,7 @@ "spell.irons_spellbooks.guiding_bolt.guide": "Fire a slow bolt of holy energy. Creatures hit will gain the Guided effect, homing nearby projectiles in towards them", "spell.irons_spellbooks.gust.guide": "Conjure a strong gust of wind, knocking back creatures in a conical shape, causing damage if they impact a wall", "spell.irons_spellbooks.chain_lightning.guide": "Start a chain of lightning from a targeted creature, causing waves of zapping magic to cascade to nearby creatures", + "spell.irons_spellbooks.devour.guide": "Pull in a nearby creature and attack them with a bite, leeching 15% of damage done as health. If the creature is killed, you temporarily gain additional max HP. Created by the ancient magician known as Yorhavich", "death.attack.blood_magic": "%1$s blood magic 1", "death.attack.blood_magic.item": "%1$s blood magic 2", @@ -448,6 +451,7 @@ "death.attack.magma_bomb_spell": "%1$s was blasted away by %2$s", "death.attack.guiding_bolt_spell": "%1$s was led to the grave by %2$s", "death.attack.chain_lightning_spell": "%1$s was zapped to death by %2$s", + "death.attack.devour_spell": "%1$s was devoured by %2$s", "death.attack.raise_dead_spell.item": "%1$s was mauled by %2$s's undead using %3$s", "death.attack.summon_vex_spell.item": "%1$s was eviscerated by %2$s's vexes using %3$s", @@ -491,6 +495,7 @@ "death.attack.magma_bomb_spell.item": "%1$s blasted away by %2$s while using %3$s", "death.attack.guiding_bolt_spell.item": "%1$s was led to the grave by %2$s's %3$s", "death.attack.chain_lightning_spell.item": "%1$s was zapped to death by %2$s's %3$s", + "death.attack.devour_spell.item": "%1$s was devoured by %2$s while using %3$s", "effect.irons_spellbooks.blood_slashed": "Blood Slashed", "effect.irons_spellbooks.angel_wings": "Angel Wings", @@ -511,6 +516,7 @@ "effect.irons_spellbooks.blight": "Blighted", "effect.irons_spellbooks.guided": "Guided", "effect.irons_spellbooks.airborne": "Airborne", + "effect.irons_spellbooks.vigor": "Vigor", "effect.irons_spellbooks.heartstop.description": "Become temporarily invulnerable, but take 50% of accumulated damage once it wears off", "effect.irons_spellbooks.angel_wings.description": "Grants spectral elytra wings", @@ -530,6 +536,7 @@ "effect.irons_spellbooks.blight.description": "Decreases your outgoing damage by 5% per level and incoming healing by 10% per level", "effect.irons_spellbooks.guided.description": "Nearby projectiles are attracted towards you.", "effect.irons_spellbooks.airborne.description": "You are vulnerable to taking kinetic damage", + "effect.irons_spellbooks.vigor.description": "Gain 1 additional heart of max hp per level", "commands.irons_spellbooks.create_scroll.failed": "Create Scroll Failed", "commands.irons_spellbooks.create_spell_book.failed": "Create Spell Book Failed", @@ -593,6 +600,7 @@ "entity.irons_spellbooks.chain_lightning": "Chain Lightning", "entity.irons_spellbooks.gust": "Gust", "entity.irons_spellbooks.priest": "Priest", + "entity.irons_spellbooks.devour_jaw": "Devour Jaw", "itemGroup.spell_materials_tab": "Iron's Spellbooks Materials", "itemGroup.spell_equipment_tab": "Iron's Spellbooks Equipment", diff --git a/src/main/resources/assets/irons_spellbooks/sounds.json b/src/main/resources/assets/irons_spellbooks/sounds.json index 11f5eab7a..ed48515d8 100644 --- a/src/main/resources/assets/irons_spellbooks/sounds.json +++ b/src/main/resources/assets/irons_spellbooks/sounds.json @@ -343,5 +343,10 @@ "irons_spellbooks:lightning_chain_3", "irons_spellbooks:lightning_chain_4" ] + }, + "entity.devour_jaw.bite": { + "sounds": [ + "irons_spellbooks:devour" + ] } } \ No newline at end of file diff --git a/src/main/resources/assets/irons_spellbooks/sounds/devour.ogg b/src/main/resources/assets/irons_spellbooks/sounds/devour.ogg new file mode 100644 index 000000000..3995d6db2 Binary files /dev/null and b/src/main/resources/assets/irons_spellbooks/sounds/devour.ogg differ diff --git a/src/main/resources/assets/irons_spellbooks/textures/entity/devour_jaw.png b/src/main/resources/assets/irons_spellbooks/textures/entity/devour_jaw.png new file mode 100644 index 000000000..50617918c Binary files /dev/null and b/src/main/resources/assets/irons_spellbooks/textures/entity/devour_jaw.png differ diff --git a/src/main/resources/assets/irons_spellbooks/textures/entity/devour_jaw.psd b/src/main/resources/assets/irons_spellbooks/textures/entity/devour_jaw.psd new file mode 100644 index 000000000..5dc04ad96 Binary files /dev/null and b/src/main/resources/assets/irons_spellbooks/textures/entity/devour_jaw.psd differ diff --git a/src/main/resources/assets/irons_spellbooks/textures/gui/spell_icons/devour.png b/src/main/resources/assets/irons_spellbooks/textures/gui/spell_icons/devour.png new file mode 100644 index 000000000..dabda74ad Binary files /dev/null and b/src/main/resources/assets/irons_spellbooks/textures/gui/spell_icons/devour.png differ diff --git a/src/main/resources/assets/irons_spellbooks/textures/mob_effect/vigor.png b/src/main/resources/assets/irons_spellbooks/textures/mob_effect/vigor.png new file mode 100644 index 000000000..709a5b037 Binary files /dev/null and b/src/main/resources/assets/irons_spellbooks/textures/mob_effect/vigor.png differ diff --git a/src/main/resources/assets/irons_spellbooks/textures/mob_effect/vigor.psd b/src/main/resources/assets/irons_spellbooks/textures/mob_effect/vigor.psd new file mode 100644 index 000000000..d8fb7ad29 Binary files /dev/null and b/src/main/resources/assets/irons_spellbooks/textures/mob_effect/vigor.psd differ