From f06dad53fc8aae381f5285774d197b93c774eb89 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 12 Mar 2024 14:49:41 +0000 Subject: [PATCH] Update corruption mechanics. - Players no longer gain corruption from taking damage, but - But spells with the dark alignment now cause more corruption and gaining corruption has side-effects not unlike the mild effects of wearing an alicorn amulet. - Every time a side-effect manifests, the player's corruption goes down. - Alicorn Amulet and Grogar's bell now cause more corruption Corrupt influence now clones mobs when they are damaged rather than just randomly. --- .../com/minelittlepony/unicopia/USounds.java | 2 +- .../ability/magic/SpellPredicate.java | 3 + .../SpellbookProfilePageContent.java | 9 +- .../unicopia/entity/Living.java | 6 ++ .../effect/CorruptInfluenceStatusEffect.java | 49 +++++++---- .../unicopia/entity/effect/UEffects.java | 8 ++ .../entity/player/CorruptionHandler.java | 84 +++++++++++++++++++ .../unicopia/entity/player/Pony.java | 30 +++---- .../unicopia/item/AlicornAmuletItem.java | 2 +- .../unicopia/item/BellItem.java | 4 +- .../resources/assets/unicopia/lang/en_us.json | 1 + .../resources/assets/unicopia/sounds.json | 19 +++++ 12 files changed, 180 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/entity/player/CorruptionHandler.java diff --git a/src/main/java/com/minelittlepony/unicopia/USounds.java b/src/main/java/com/minelittlepony/unicopia/USounds.java index 3f53eca3..99117ddb 100644 --- a/src/main/java/com/minelittlepony/unicopia/USounds.java +++ b/src/main/java/com/minelittlepony/unicopia/USounds.java @@ -12,7 +12,7 @@ import static net.minecraft.sound.SoundEvents.*; public interface USounds { SoundEvent ENTITY_GENERIC_BUTTER_FINGERS = BLOCK_HONEY_BLOCK_SLIDE; - SoundEvent ENTITY_PLAYER_CORRUPTION = PARTICLE_SOUL_ESCAPE; + SoundEvent ENTITY_PLAYER_CORRUPTION = register("entity.player.corrupt"); SoundEvent ENTITY_PLAYER_BATPONY_SCREECH = register("entity.player.batpony.screech"); SoundEvent ENTITY_PLAYER_HIPPOGRIFF_SCREECH = register("entity.player.hippogriff.screech"); SoundEvent ENTITY_PLAYER_HIPPOGRIFF_PECK = ENTITY_CHICKEN_STEP; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellPredicate.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellPredicate.java index 1e808801..3a7213c7 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellPredicate.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellPredicate.java @@ -3,6 +3,7 @@ package com.minelittlepony.unicopia.ability.magic; import java.util.UUID; import java.util.function.Predicate; +import com.minelittlepony.unicopia.Affinity; import com.minelittlepony.unicopia.ability.magic.spell.*; import com.minelittlepony.unicopia.ability.magic.spell.effect.MimicSpell; import com.minelittlepony.unicopia.ability.magic.spell.effect.ShieldSpell; @@ -21,6 +22,8 @@ public interface SpellPredicate extends Predicate { SpellPredicate IS_NOT_PLACED = IS_PLACED.negate(); SpellPredicate IS_VISIBLE = spell -> spell != null && !spell.isHidden(); + SpellPredicate IS_CORRUPTING = spell -> spell.getAffinity() == Affinity.BAD; + default SpellPredicate and(SpellPredicate predicate) { SpellPredicate self = this; return s -> self.test(s) && predicate.test(s); diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/SpellbookProfilePageContent.java b/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/SpellbookProfilePageContent.java index 6f3c2d08..65c6ebe2 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/SpellbookProfilePageContent.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/spellbook/SpellbookProfilePageContent.java @@ -5,6 +5,7 @@ import java.util.List; import com.minelittlepony.common.client.gui.IViewRoot; import com.minelittlepony.common.client.gui.dimension.Bounds; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.magic.SpellPredicate; import com.minelittlepony.unicopia.client.gui.*; import com.minelittlepony.unicopia.entity.player.*; import com.minelittlepony.unicopia.util.ColorHelper; @@ -43,7 +44,7 @@ public class SpellbookProfilePageContent implements SpellbookChapterList.Content .setTooltip(() -> List.of( Text.literal(String.format("Level %d ", pony.getLevel().get() + 1)).append(pony.getSpecies().getDisplayName()).formatted(pony.getSpecies().getAffinity().getColor()), Text.literal(String.format("Mana: %d%%", (int)(pony.getMagicalReserves().getMana().getPercentFill() * 100))), - Text.literal(String.format("Corruption: %d%%", (int)(pony.getCorruption().getScaled(100)))), + Text.literal(String.format("Corruption: %s%d%%", pony.getCorruptionhandler().hasCorruptingMagic() ? "^" : "", (int)(pony.getCorruption().getScaled(100)))), Text.literal(String.format("Experience: %d", (int)(pony.getMagicalReserves().getXp().getPercentFill() * 100))), Text.literal(String.format("Next level in: %dxp", 100 - (int)(pony.getMagicalReserves().getXp().getPercentFill() * 100))) )); @@ -108,7 +109,11 @@ public class SpellbookProfilePageContent implements SpellbookChapterList.Content int alpha = (int)(alphaF * 0x10) & 0xFF; int color = 0x10404000 | alpha; int xpColor = 0xAA0040FF | ((int)((0.3F + 0.7F * xpPercentage) * 0xFF) & 0xFF) << 16; - int manaColor = 0xFF00F040 | (int)((0.3F + 0.7F * alphaF) * 0x40) << 16; + int manaColor = 0xFF00F040; + if (pony.getSpellSlot().get(SpellPredicate.IS_CORRUPTING, false).isPresent()) { + manaColor = ColorHelper.lerp(Math.abs(MathHelper.sin(pony.asEntity().age / 15F)), manaColor, 0xFF0030F0); + } + manaColor |= (int)((0.3F + 0.7F * alphaF) * 0x40) << 16; DrawableUtil.drawArc(matrices, 0, radius + 24, 0, DrawableUtil.TAU, color, false); DrawableUtil.drawArc(matrices, radius / 3, radius + 6, 0, DrawableUtil.TAU, color, false); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index 40e9fc21..947a33be 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -23,6 +23,7 @@ import com.minelittlepony.unicopia.entity.behaviour.Guest; import com.minelittlepony.unicopia.entity.collision.MultiBoundingBoxEntity; import com.minelittlepony.unicopia.entity.damage.MagicalDamageSource; import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck; +import com.minelittlepony.unicopia.entity.effect.CorruptInfluenceStatusEffect; import com.minelittlepony.unicopia.entity.effect.EffectUtils; import com.minelittlepony.unicopia.entity.effect.UEffects; import com.minelittlepony.unicopia.entity.player.Pony; @@ -49,6 +50,7 @@ import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.damage.DamageTypes; import net.minecraft.entity.data.*; +import net.minecraft.entity.mob.HostileEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.item.BlockItem; @@ -521,6 +523,10 @@ public abstract class Living implements Equine, Caste } } + if (entity instanceof HostileEntity mob && mob.hasStatusEffect(UEffects.CORRUPT_INFLUENCE) && mob.getRandom().nextInt(4) == 0) { + CorruptInfluenceStatusEffect.reproduce(mob); + } + return Optional.empty(); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/CorruptInfluenceStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/CorruptInfluenceStatusEffect.java index ebdd1a41..bf98ef9d 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/CorruptInfluenceStatusEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/CorruptInfluenceStatusEffect.java @@ -1,5 +1,7 @@ package com.minelittlepony.unicopia.entity.effect; +import java.util.UUID; + import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.Owned; @@ -13,6 +15,8 @@ import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectCategory; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.mob.HostileEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.world.WorldEvents; @@ -24,7 +28,6 @@ public class CorruptInfluenceStatusEffect extends StatusEffect { addAttributeModifier(EntityAttributes.GENERIC_ATTACK_SPEED, "6D706448-6A60-4F59-BE8A-C23A6DD2C7A9", 10, EntityAttributeModifier.Operation.ADDITION); } - @SuppressWarnings("unchecked") @Override public void applyUpdateEffect(LivingEntity entity, int amplifier) { @@ -32,7 +35,7 @@ public class CorruptInfluenceStatusEffect extends StatusEffect { return; } - if (entity instanceof HostileEntity) { + if (entity instanceof HostileEntity mob) { int nearby = entity.getWorld().getOtherEntities(entity, entity.getBoundingBox().expand(40), i -> i.getType() == entity.getType()).size(); @@ -48,25 +51,12 @@ public class CorruptInfluenceStatusEffect extends StatusEffect { return; } - HostileEntity mob = (HostileEntity)entity; + reproduce(mob); - HostileEntity clone = (HostileEntity)mob.getType().create(mob.getWorld()); - clone.copyPositionAndRotation(entity); - Equine.of(clone).ifPresent(eq -> { - if (eq instanceof Owned.Mutable) { - ((Owned.Mutable)eq).setMaster(mob); - } - }); - mob.getWorld().spawnEntity(clone); - - if (!mob.isSilent()) { - mob.getWorld().syncWorldEvent((PlayerEntity)null, WorldEvents.ZOMBIE_INFECTS_VILLAGER, mob.getBlockPos(), 0); - } } else if (entity.age % 2000 == 0) { entity.damage(Living.living(entity).damageOf(UDamageTypes.ALICORN_AMULET), 2); } - } @Override @@ -78,4 +68,31 @@ public class CorruptInfluenceStatusEffect extends StatusEffect { public boolean canApplyUpdateEffect(int duration, int amplifier) { return duration > 0; } + + public static void reproduce(HostileEntity mob) { + HostileEntity clone = (HostileEntity)mob.getType().create(mob.getWorld()); + clone.copyPositionAndRotation(mob); + clone.takeKnockback(0.1, 0.5, 0.5); + mob.takeKnockback(0.1, -0.5, -0.5); + if (mob.getRandom().nextInt(4) != 0) { + mob.clearStatusEffects(); + } else { + if (clone.getAttributes().hasAttribute(EntityAttributes.GENERIC_MAX_HEALTH)) { + float maxHealthDifference = mob.getMaxHealth() - clone.getMaxHealth(); + clone.addStatusEffect(new StatusEffectInstance(StatusEffects.STRENGTH, 900000, 2)); + clone.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH) + .addPersistentModifier(new EntityAttributeModifier(UUID.randomUUID(), "Corruption Strength Modifier", maxHealthDifference + 1, EntityAttributeModifier.Operation.ADDITION)); + } + if (clone.getAttributes().hasAttribute(EntityAttributes.GENERIC_ATTACK_DAMAGE)) { + clone.getAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE) + .addPersistentModifier(new EntityAttributeModifier(UUID.randomUUID(), "Corruption Damage Modifier", mob.getAttributeValue(EntityAttributes.GENERIC_ATTACK_DAMAGE) + 1, EntityAttributeModifier.Operation.ADDITION)); + } + } + + mob.getWorld().spawnEntity(clone); + + if (!mob.isSilent()) { + mob.getWorld().syncWorldEvent((PlayerEntity)null, WorldEvents.ZOMBIE_INFECTS_VILLAGER, mob.getBlockPos(), 0); + } + } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java index c7675ecf..00b51dd6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/UEffects.java @@ -10,8 +10,16 @@ import net.minecraft.registry.Registries; public interface UEffects { StatusEffect FOOD_POISONING = register("food_poisoning", new FoodPoisoningStatusEffect(3484199)); StatusEffect SUN_BLINDNESS = register("sun_blindness", new SunBlindnessStatusEffect(0x886F0F)); + /** + * Status effect emitted by players with a high level of corruption. + * When affecting an entity, will give them a random chance to reproduce or duplicate themselves when they die. + */ StatusEffect CORRUPT_INFLUENCE = register("corrupt_influence", new CorruptInfluenceStatusEffect(0x00FF00)); StatusEffect PARALYSIS = register("paralysis", new StatusEffect(StatusEffectCategory.HARMFUL, 0) {}); + /** + * Side-effect of wearing the alicorn amulet. + * Causes the player to lose grip on whatever item they're holding. + */ StatusEffect BUTTER_FINGERS = register("butter_fingers", new ButterfingersStatusEffect(0x888800)); private static StatusEffect register(String name, StatusEffect effect) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/CorruptionHandler.java b/src/main/java/com/minelittlepony/unicopia/entity/player/CorruptionHandler.java new file mode 100644 index 00000000..68a5d630 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/CorruptionHandler.java @@ -0,0 +1,84 @@ +package com.minelittlepony.unicopia.entity.player; + +import com.minelittlepony.unicopia.InteractionManager; +import com.minelittlepony.unicopia.ability.magic.SpellPredicate; +import com.minelittlepony.unicopia.entity.ItemTracker; +import com.minelittlepony.unicopia.entity.effect.UEffects; +import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.util.Tickable; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.util.math.random.Random; + +public class CorruptionHandler implements Tickable { + + private final Pony pony; + + public CorruptionHandler(Pony pony) { + this.pony = pony; + } + + public boolean hasCorruptingMagic() { + return pony.getSpellSlot().get(SpellPredicate.IS_CORRUPTING, false).isPresent() || UItems.ALICORN_AMULET.isApplicable(pony.asEntity()); + } + + @Override + public void tick() { + if (pony.isClient() || pony.asEntity().age % 5 != 0) { + return; + } + + PlayerEntity entity = pony.asEntity(); + Random random = pony.asEntity().getRandom(); + + if (!UItems.ALICORN_AMULET.isApplicable(entity)) { + if (entity.age % (10 * ItemTracker.SECONDS) == 0) { + if (random.nextInt(100) == 0) { + pony.getCorruption().add(-1); + pony.setDirty(); + } + + if (entity.getHealth() >= entity.getMaxHealth() - 1 && !entity.getHungerManager().isNotFull()) { + pony.getCorruption().add(-random.nextInt(4)); + pony.setDirty(); + } + } + } + + if (pony.asEntity().age % 100 == 0 && hasCorruptingMagic()) { + pony.getCorruption().add(random.nextInt(4)); + } + + float corruptionPercentage = pony.getCorruption().getScaled(1); + + if (corruptionPercentage > 0.5F && random.nextFloat() < corruptionPercentage - 0.25F) { + pony.findAllEntitiesInRange(10, e -> e instanceof LivingEntity && !((LivingEntity)e).hasStatusEffect(UEffects.CORRUPT_INFLUENCE)).forEach(e -> { + ((LivingEntity)e).addStatusEffect(new StatusEffectInstance(UEffects.CORRUPT_INFLUENCE, 100, 1)); + recover(10); + }); + } + + if (corruptionPercentage > 0.25F && random.nextInt(200) == 0) { + if (!pony.asEntity().hasStatusEffect(UEffects.BUTTER_FINGERS)) { + pony.asEntity().addStatusEffect(new StatusEffectInstance(UEffects.BUTTER_FINGERS, 2100, 1)); + recover(25); + } + } + + if (random.nextFloat() < corruptionPercentage) { + pony.spawnParticles(ParticleTypes.ASH, 10); + } + } + + private void recover(float percentage) { + pony.getCorruption().set((int)(pony.getCorruption().get() * (1 - percentage))); + InteractionManager.INSTANCE.playLoopingSound(pony.asEntity(), InteractionManager.SOUND_HEART_BEAT, 0); + MagicReserves reserves = pony.getMagicalReserves(); + reserves.getExertion().addPercent(10); + reserves.getEnergy().add(10); + pony.setDirty(); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 6f88a022..3cb7f3cf 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -92,6 +92,7 @@ public class Pony extends Living implements Copyable, Update private final PlayerCamera camera = new PlayerCamera(this); private final TraitDiscovery discoveries = new TraitDiscovery(this); private final Acrobatics acrobatics = new Acrobatics(this); + private final CorruptionHandler corruptionHandler = new CorruptionHandler(this); private final Map advancementProgress = new HashMap<>(); @@ -129,6 +130,7 @@ public class Pony extends Living implements Copyable, Update addTicker(this::updateBatPonyAbilities); addTicker(this::updateCorruptionDecay); addTicker(new PlayerAttributes(this)); + addTicker(corruptionHandler); } @Override @@ -289,6 +291,10 @@ public class Pony extends Living implements Copyable, Update return corruption; } + public CorruptionHandler getCorruptionhandler() { + return corruptionHandler; + } + public boolean canUseSuperMove() { return entity.isCreative() || getMagicalReserves().getCharge().get() >= getMagicalReserves().getCharge().getMax(); } @@ -572,19 +578,7 @@ public class Pony extends Living implements Copyable, Update } private void updateCorruptionDecay() { - if (!isClient() && !UItems.ALICORN_AMULET.isApplicable(entity)) { - if (entity.age % (10 * ItemTracker.SECONDS) == 0) { - if (entity.getWorld().random.nextInt(100) == 0) { - corruption.add(-1); - setDirty(); - } - if (entity.getHealth() >= entity.getMaxHealth() - 1 && !entity.getHungerManager().isNotFull()) { - corruption.add(-entity.getWorld().random.nextInt(4)); - setDirty(); - } - } - } } @Override @@ -784,6 +778,12 @@ public class Pony extends Living implements Copyable, Update @Override public boolean subtractEnergyCost(double foodSubtract) { + if (getSpellSlot().get(SpellPredicate.IS_CORRUPTING, false).isPresent()) { + int corruptionTaken = (int)(foodSubtract * (AmuletSelectors.ALICORN_AMULET.test(entity) ? 0.9F : 0.5F)); + foodSubtract -= corruptionTaken; + getCorruption().add(corruptionTaken); + } + List partyMembers = FriendshipBraceletItem.getPartyMembers(this, 10).toList(); if (!partyMembers.isEmpty()) { @@ -951,10 +951,10 @@ public class Pony extends Living implements Copyable, Update @Override public void onSpellSet(@Nullable Spell spell) { if (spell != null) { - if (spell.getAffinity() == Affinity.BAD && entity.getWorld().random.nextInt(120) == 0) { - getCorruption().add(1); + if (spell.getAffinity() == Affinity.BAD && entity.getWorld().random.nextInt(20) == 0) { + getCorruption().add(entity.getRandom().nextBetween(1, 10)); } - getCorruption().add((int)spell.getTraits().getCorruption()); + getCorruption().add((int)spell.getTraits().getCorruption() * 10); setDirty(); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java b/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java index 04722a09..b84967f1 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/AlicornAmuletItem.java @@ -234,7 +234,7 @@ public class AlicornAmuletItem extends AmuletItem implements ItemTracker.Trackab // butterfingers effects if (daysAttached >= 2) { if (pony.asWorld().random.nextInt(200) == 0 && !pony.asEntity().hasStatusEffect(UEffects.BUTTER_FINGERS)) { - pony.asEntity().addStatusEffect(new StatusEffectInstance(UEffects.CORRUPT_INFLUENCE, 2100, 1)); + pony.asEntity().addStatusEffect(new StatusEffectInstance(UEffects.BUTTER_FINGERS, 2100, 1)); } pony.findAllEntitiesInRange(10, e -> e instanceof LivingEntity && !((LivingEntity)e).hasStatusEffect(UEffects.CORRUPT_INFLUENCE)).forEach(e -> { diff --git a/src/main/java/com/minelittlepony/unicopia/item/BellItem.java b/src/main/java/com/minelittlepony/unicopia/item/BellItem.java index 472d1261..cf9af687 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/BellItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/BellItem.java @@ -57,7 +57,7 @@ public class BellItem extends Item implements ChargeableItem { public ActionResult useOnEntity(ItemStack stack, PlayerEntity player, LivingEntity target, Hand hand) { player.setCurrentHand(hand); Pony pony = Pony.of(player); - pony.getCorruption().add(1); + pony.getCorruption().add(1 + player.getRandom().nextBetween(1, 10)); pony.playSound(USounds.ITEM_GROGAR_BELL_USE, 0.4F, 0.2F); Living targetLiving = target instanceof MobEntity || target instanceof PlayerEntity ? Living.getOrEmpty(target) .filter(living -> !(living instanceof Creature c && c.isDiscorded())) @@ -79,7 +79,7 @@ public class BellItem extends Item implements ChargeableItem { if (hasCharge(stack)) { pony.playSound(USounds.ITEM_GROGAR_BELL_CHARGE, 0.6F, 1); - pony.getCorruption().add(1); + pony.getCorruption().add(player.getRandom().nextBetween(1, 10)); if (offhandStack.getItem() instanceof ChargeableItem chargeable) { float maxChargeBy = chargeable.getMaxCharge() - ChargeableItem.getEnergy(offhandStack); float energyTransferred = Math.min(ChargeableItem.getEnergy(stack), maxChargeBy); diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 90c0cac7..b3280703 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -1547,6 +1547,7 @@ "unicopia.subtitle.pegasus.molt": "Pegasus loses feather", "unicopia.subtitle.unicorn.teleport": "Magic pops", "unicopia.subtitle.player.wololo": "Wololo!", + "unicopia.subtitle.corrupt": "Magic Corrupts", "unicopia.subtitle.entity.player.whistle": "Player whistles", "unicopia.subtitle.entity.player.kick": "Player kicks", "unicopia.subtitle.magic_aura": "Magic humming", diff --git a/src/main/resources/assets/unicopia/sounds.json b/src/main/resources/assets/unicopia/sounds.json index f914ffea..9b7eab3f 100644 --- a/src/main/resources/assets/unicopia/sounds.json +++ b/src/main/resources/assets/unicopia/sounds.json @@ -108,6 +108,25 @@ "unicopia:heartbeat/heartbeat_1" ] }, + "entity.player.corrupt": { + "category": "ambient", + "subtitle": "unicopia.subtitle.corrupt", + "sounds": [ + { "name": "enchant/soulspeed/soulspeed1", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed2", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed3", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed4", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed5", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed6", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed7", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed8", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed9", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed10", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed11", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed12", "volume": 0.25 }, + { "name": "enchant/soulspeed/soulspeed13", "volume": 0.25 } + ] + }, "ambient.wind.gust": { "category": "ambient", "subtitle": "unicopia.subtitle.wind_rush",