From e06ae63077d33c03fc2bf2b852fdd2b0e546acbe Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 27 Jan 2024 21:17:16 +0000 Subject: [PATCH] Add time-limited variants of the metamorphosis potions and add make all potions craftable --- .../unicopia/ability/ChangeFormAbility.java | 4 +- .../effect/MetamorphosisStatusEffect.java | 60 ++++++++++++ .../entity/effect/RaceChangeStatusEffect.java | 35 ++++--- .../unicopia/entity/effect/UPotions.java | 67 ++++++++++--- .../unicopia/entity/mob/UTradeOffers.java | 20 ---- .../unicopia/entity/player/Pony.java | 5 +- .../resources/assets/unicopia/lang/en_us.json | 88 +++++++++++++++++- .../mob_effect/change_race_hippogriff.png | Bin 0 -> 6551 bytes .../textures/mob_effect/change_race_kirin.png | Bin 0 -> 6550 bytes .../textures/mob_effect/morph_race_bat.png | Bin 0 -> 4462 bytes .../mob_effect/morph_race_changeling.png | Bin 0 -> 4377 bytes .../textures/mob_effect/morph_race_earth.png | Bin 0 -> 4414 bytes .../mob_effect/morph_race_hippogriff.png | Bin 0 -> 4654 bytes .../textures/mob_effect/morph_race_kirin.png | Bin 0 -> 4692 bytes .../mob_effect/morph_race_pegasus.png | Bin 0 -> 4428 bytes .../mob_effect/morph_race_unicorn.png | Bin 0 -> 4397 bytes 16 files changed, 224 insertions(+), 55 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/entity/effect/MetamorphosisStatusEffect.java create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/change_race_hippogriff.png create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/change_race_kirin.png create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/morph_race_bat.png create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/morph_race_changeling.png create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/morph_race_earth.png create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/morph_race_hippogriff.png create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/morph_race_kirin.png create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/morph_race_pegasus.png create mode 100644 src/main/resources/assets/unicopia/textures/mob_effect/morph_race_unicorn.png diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java index 4c841b1a..64fabfa4 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java @@ -76,9 +76,9 @@ public class ChangeFormAbility implements Ability { targets.forEach(target -> { Race supressed = target.getSuppressedRace(); if (target == player || supressed.isUnset() == isTransforming) { - Race actualRace = target.getSpecies(); + Race actualRace = isTransforming ? target.getSpecies() : Race.UNSET; target.setSpecies(supressed.or(player.getCompositeRace().potential())); - target.setSuppressedRace(isTransforming ? actualRace : Race.UNSET); + target.setSuppressedRace(actualRace); } }); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/MetamorphosisStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/MetamorphosisStatusEffect.java new file mode 100644 index 00000000..56accf6f --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/MetamorphosisStatusEffect.java @@ -0,0 +1,60 @@ +package com.minelittlepony.unicopia.entity.effect; + +import java.util.HashMap; +import java.util.Map; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.Race; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectCategory; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + +public class MetamorphosisStatusEffect extends StatusEffect { + public static final int MAX_DURATION = 20 * 60; + + private static final Map REGISTRY = new HashMap<>(); + + public static final StatusEffect EARTH = register(0x886F0F, Race.EARTH); + public static final StatusEffect UNICORN = register(0x88FFFF, Race.UNICORN); + public static final StatusEffect PEGASUS = register(0x00C0ff, Race.PEGASUS); + public static final StatusEffect BAT = register(0x152F13, Race.BAT); + public static final StatusEffect CHANGELING = register(0xFFFF00, Race.CHANGELING); + public static final StatusEffect KIRIN = register(0xFF8800, Race.KIRIN); + public static final StatusEffect HIPPOGRIFF = register(0xE04F77, Race.HIPPOGRIFF); + + @Nullable + public static StatusEffect forRace(Race race) { + return REGISTRY.get(race); + } + + public static StatusEffect register(int color, Race race) { + Identifier id = Race.REGISTRY.getId(race); + StatusEffect effect = new MetamorphosisStatusEffect(color, race); + REGISTRY.put(race, effect); + return Registry.register(Registries.STATUS_EFFECT, + id.withPath(p -> "morph_race_" + p), + effect + ); + } + + public static Race getEffectiveRace(LivingEntity entity, Race fallback) { + return entity.getStatusEffects().stream().filter(effect -> effect.getEffectType() instanceof MetamorphosisStatusEffect).map(effect -> { + return ((MetamorphosisStatusEffect)effect.getEffectType()).getRace(); + }).findFirst().orElse(fallback); + } + + private final Race race; + + private MetamorphosisStatusEffect(int color, Race race) { + super(StatusEffectCategory.NEUTRAL, color); + this.race = race; + } + + public Race getRace() { + return race; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java index 462936ad..210395b9 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/RaceChangeStatusEffect.java @@ -1,5 +1,8 @@ package com.minelittlepony.unicopia.entity.effect; +import java.util.HashMap; +import java.util.Map; + import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.Race; @@ -28,25 +31,31 @@ public class RaceChangeStatusEffect extends StatusEffect { public static final int STAGE_DURATION = 200; public static final int MAX_DURATION = Stage.VALUES.length * STAGE_DURATION + 1; - public static final StatusEffect CHANGE_RACE_EARTH = register(0x886F0F, Race.EARTH); - public static final StatusEffect CHANGE_RACE_UNICORN = register(0x88FFFF, Race.UNICORN); - public static final StatusEffect CHANGE_RACE_PEGASUS = register(0x00FFFF, Race.PEGASUS); - public static final StatusEffect CHANGE_RACE_BAT = register(0x0FFF00, Race.BAT); - public static final StatusEffect CHANGE_RACE_CHANGELING = register(0xFFFF00, Race.CHANGELING); - public static final StatusEffect CHANGE_RACE_KIRIN = register(0xFF8800, Race.KIRIN); - public static final StatusEffect CHANGE_RACE_HIPPOGRIFF = register(0x00FFFF, Race.HIPPOGRIFF); + private static final Map REGISTRY = new HashMap<>(); + + @Nullable + public static StatusEffect forRace(Race race) { + return REGISTRY.get(race); + } + + public static final StatusEffect EARTH = register(0x886F0F, Race.EARTH); + public static final StatusEffect UNICORN = register(0x88FFFF, Race.UNICORN); + public static final StatusEffect PEGASUS = register(0x00C0ff, Race.PEGASUS); + public static final StatusEffect BAT = register(0x152F13, Race.BAT); + public static final StatusEffect CHANGELING = register(0xFFFF00, Race.CHANGELING); + public static final StatusEffect KIRIN = register(0xFF8800, Race.KIRIN); + public static final StatusEffect HIPPOGRIFF = register(0xE04F77, Race.HIPPOGRIFF); private final Race race; public static StatusEffect register(int color, Race race) { - Identifier id = Race.REGISTRY.getId(race); - return Registry.register(Registries.STATUS_EFFECT, - new Identifier(id.getNamespace(), "change_race_" + id.getPath().toLowerCase()), - new RaceChangeStatusEffect(color, race) - ); + Identifier id = race.getId(); + StatusEffect effect = new RaceChangeStatusEffect(color, race); + REGISTRY.put(race, effect); + return Registry.register(Registries.STATUS_EFFECT, id.withPath(p -> "change_race_" + id.getPath()), effect); } - public RaceChangeStatusEffect(int color, Race race) { + private RaceChangeStatusEffect(int color, Race race) { super(StatusEffectCategory.NEUTRAL, color); this.race = race; } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/UPotions.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/UPotions.java index 82f5a0b3..2fb07320 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/UPotions.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/UPotions.java @@ -1,29 +1,70 @@ package com.minelittlepony.unicopia.entity.effect; -import java.util.ArrayList; -import java.util.List; +import java.util.Objects; +import org.spongepowered.include.com.google.common.base.Preconditions; + +import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.item.UItems; +import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.item.Item; +import net.minecraft.item.Items; import net.minecraft.potion.Potion; +import net.minecraft.potion.Potions; +import net.minecraft.recipe.BrewingRecipeRegistry; import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; import net.minecraft.registry.Registries; public interface UPotions { - List REGISTRY = new ArrayList<>(); - - Potion TRIBE_SWAP_EARTH_PONY = register("tribe_swap_earth", new Potion("unicopia.tribe_swap_earth", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_EARTH, RaceChangeStatusEffect.MAX_DURATION))); - Potion TRIBE_SWAP_UNICORN = register("tribe_swap_unicorn", new Potion("unicopia.tribe_swap_unicorn", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_UNICORN, RaceChangeStatusEffect.MAX_DURATION))); - Potion TRIBE_SWAP_PEGASUS = register("tribe_swap_pegasus", new Potion("unicopia.tribe_swap_pegasus", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_PEGASUS, RaceChangeStatusEffect.MAX_DURATION))); - Potion TRIBE_SWAP_BAT = register("tribe_swap_bat", new Potion("unicopia.tribe_swap_bat", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_BAT, RaceChangeStatusEffect.MAX_DURATION))); - Potion TRIBE_SWAP_CHANGELING = register("tribe_swap_changeling", new Potion("unicopia.tribe_swap_changeling", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_CHANGELING, RaceChangeStatusEffect.MAX_DURATION))); - Potion TRIBE_SWAP_KIRIN = register("tribe_swap_kirin", new Potion("unicopia.tribe_swap_kirin", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_KIRIN, RaceChangeStatusEffect.MAX_DURATION))); - Potion TRIBE_SWAP_HIPPOGRIFF = register("tribe_swap_hippogriff", new Potion("unicopia.tribe_swap_hippogriff", new StatusEffectInstance(RaceChangeStatusEffect.CHANGE_RACE_HIPPOGRIFF, RaceChangeStatusEffect.MAX_DURATION))); + MorphingPotion MORPH_EARTH_PONY = new MorphingPotion(Race.EARTH).registerBaseRecipes(Potions.STRENGTH, UItems.CURING_JOKE); + MorphingPotion MORPH_UNICORN = new MorphingPotion(Race.UNICORN).registerBaseRecipes(Potions.REGENERATION, UItems.BOTCHED_GEM); + MorphingPotion MORPH_PEGASUS = new MorphingPotion(Race.PEGASUS).registerBaseRecipes(Potions.SWIFTNESS, UItems.PEGASUS_FEATHER, UItems.HIPPOGRIFF_BADGE, Items.FEATHER); + MorphingPotion MORPH_BAT = new MorphingPotion(Race.BAT).registerBaseRecipes(Potions.NIGHT_VISION, UItems.BUTTERFLY); + MorphingPotion MORPH_CHANGELING = new MorphingPotion(Race.CHANGELING).registerBaseRecipes(Potions.HARMING, UItems.CARAPACE); + MorphingPotion MORPH_KIRIN = new MorphingPotion(Race.KIRIN).registerBaseRecipes(Potions.FIRE_RESISTANCE, Items.MAGMA_CREAM); + MorphingPotion MORPH_HIPPOGRIFF = new MorphingPotion(Race.HIPPOGRIFF).registerBaseRecipes(Potions.WATER_BREATHING, UItems.CLAM_SHELL, UItems.TURRET_SHELL, UItems.SCALLOP_SHELL); static Potion register(String name, Potion potion) { - REGISTRY.add(potion); - return Registry.register(Registries.POTION, Unicopia.id(name), potion); + return register(Unicopia.id(name), potion); + } + + static Potion register(Identifier id, Potion potion) { + return Registry.register(Registries.POTION, id, potion); + } + + static void addRecipe(Potion result, Potion basePotion, Item...items) { + Preconditions.checkArgument(BrewingRecipeRegistry.isBrewable(basePotion), "Base potion is not craftable. " + Registries.POTION.getId(basePotion) + " required for crafting " + Registries.POTION.getId(result)); + for (Item item : items) { + BrewingRecipeRegistry.registerPotionRecipe(basePotion, item, result); + } + } + + record MorphingPotion(Identifier id, Potion shortEffect, Potion longEffect, Potion permanentEffect) { + public MorphingPotion(Race race) { + this(race.getId(), + Objects.requireNonNull(MetamorphosisStatusEffect.forRace(race), "No metamorphosis status effect registered for " + race.getId()), + Objects.requireNonNull(RaceChangeStatusEffect.forRace(race), "No race change status effect registered for " + race.getId()) + ); + } + + public MorphingPotion(Identifier id, StatusEffect morphEffect, StatusEffect permanentEffect) { + this(id, + register(id.withPath(p -> "short_morph_" + p), new Potion(id.getNamespace() + ".short_morph_" + id.getPath(), new StatusEffectInstance(morphEffect, MetamorphosisStatusEffect.MAX_DURATION))), + register(id.withPath(p -> "long_morph_" + p), new Potion(id.getNamespace() + ".long_morph_" + id.getPath(), new StatusEffectInstance(morphEffect, MetamorphosisStatusEffect.MAX_DURATION * 10))), + register(id, new Potion(id.getNamespace() + ".tribe_swap_" + id.getPath(), new StatusEffectInstance(permanentEffect, RaceChangeStatusEffect.MAX_DURATION))) + ); + } + + public MorphingPotion registerBaseRecipes(Potion basePotion, Item...items) { + addRecipe(shortEffect, basePotion, items); + addRecipe(longEffect, shortEffect, Items.REDSTONE); + addRecipe(permanentEffect, longEffect, UItems.CURING_JOKE); + return this; + } } static void bootstrap() { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/UTradeOffers.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/UTradeOffers.java index cedc1064..ff73a2f8 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/UTradeOffers.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/UTradeOffers.java @@ -4,7 +4,6 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.UTags; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; -import com.minelittlepony.unicopia.entity.effect.UPotions; import com.minelittlepony.unicopia.item.EnchantableItem; import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.util.RegistryUtils; @@ -14,7 +13,6 @@ import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.potion.PotionUtil; import net.minecraft.registry.tag.ItemTags; import net.minecraft.registry.tag.TagKey; import net.minecraft.util.Util; @@ -22,7 +20,6 @@ import net.minecraft.util.math.random.Random; import net.minecraft.village.TradeOffer; import net.minecraft.village.TradeOffers; import net.minecraft.village.VillagerProfession; -import net.minecraft.village.TradeOffers.Factory; public interface UTradeOffers { static void bootstrap() { @@ -59,10 +56,6 @@ public interface UTradeOffers { factories.add(buy(UItems.CRYSTAL_HEART, 1, UItems.MUSIC_DISC_CRUSADE, 1, 10, 6, 0.08F)); factories.add(buy(UItems.PEGASUS_AMULET, 1, UItems.ALICORN_AMULET, 1, 2, 6, 0.05F)); factories.add(buyForEmeralds(UItems.FRIENDSHIP_BRACELET, 2, 1, 10, 7, 0.17F)); - factories.add(new SellPotionHoldingItemFactory( - new Item[] { Items.ARROW, Items.GLASS_BOTTLE, Items.GLASS_BOTTLE }, - new Item[] { Items.TIPPED_ARROW, Items.POTION, Items.SPLASH_POTION }, - 5, 5, 2, 12, 30)); }); } @@ -105,17 +98,4 @@ public interface UTradeOffers { return new TradeOffer(offer.getOriginalFirstBuyItem(), offer.getSecondBuyItem(), UItems.FILLED_JAR.withContents(offer.getSellItem()), offer.getUses(), offer.getMaxUses(), offer.getMerchantExperience(), offer.getPriceMultiplier(), offer.getDemandBonus()); } } - - record SellPotionHoldingItemFactory (Item[] secondBuy, Item[] tippedArrow, int secondCount, int sellCount, int price, int maxUses, int experience) implements Factory { - @Override - public TradeOffer create(Entity entity, Random random) { - int index = random.nextInt(tippedArrow.length); - return new TradeOffer( - new ItemStack(Items.EMERALD, price), - new ItemStack(secondBuy[index], secondCount), - PotionUtil.setPotion(new ItemStack(tippedArrow[index], sellCount), UPotions.REGISTRY.get(random.nextInt(UPotions.REGISTRY.size()))), - maxUses, experience, 0.05f - ); - } - } } 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 7b1f6ccf..fab87347 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -21,6 +21,7 @@ import com.minelittlepony.unicopia.advancement.UCriteria; import com.minelittlepony.unicopia.entity.*; import com.minelittlepony.unicopia.entity.behaviour.EntityAppearance; import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck; +import com.minelittlepony.unicopia.entity.effect.MetamorphosisStatusEffect; import com.minelittlepony.unicopia.entity.effect.SunBlindnessStatusEffect; import com.minelittlepony.unicopia.entity.effect.UEffects; import com.minelittlepony.unicopia.entity.mob.UEntityAttributes; @@ -476,13 +477,13 @@ public class Pony extends Living implements Copyable, Update private void recalculateCompositeRace() { Race intrinsicRace = getSpecies(); Race suppressedRace = getSuppressedRace(); - compositeRace = getSpellSlot() + compositeRace = MetamorphosisStatusEffect.getEffectiveRace(entity, getSpellSlot() .get(SpellPredicate.IS_MIMIC, true) .map(AbstractDisguiseSpell::getDisguise) .map(EntityAppearance::getAppearance) .flatMap(Pony::of) .map(Pony::getSpecies) - .orElse(intrinsicRace).composite( + .orElse(intrinsicRace)).composite( AmuletSelectors.UNICORN_AMULET.test(entity) ? Race.UNICORN : AmuletSelectors.ALICORN_AMULET.test(entity) ? Race.ALICORN : null, diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index d516f4d9..39d28398 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -352,6 +352,19 @@ "effect.unicopia.butter_fingers": "Butterfingers", "effect.unicopia.change_race_earth": "Earth Pony Metamorphosis", + "effect.unicopia.change_race_pegasus": "Pegasus Metamorphosis", + "effect.unicopia.change_race_changeling": "Changeling Metamorphosis", + "effect.unicopia.change_race_bat": "Bat Pony Metamorphosis", + "effect.unicopia.change_race_kirin": "Kirin Metamorphosis", + "effect.unicopia.change_race_hippogriff": "Hippogriff Metamorphosis", + + "effect.unicopia.morph_race_earth": "Earth Pony Transformation", + "effect.unicopia.morph_race_pegasus": "Pegasus Transformation", + "effect.unicopia.morph_race_changeling": "Changeling Transformation", + "effect.unicopia.morph_race_bat": "Bat Pony Transformation", + "effect.unicopia.morph_race_kirin": "Kirin Transformation", + "effect.unicopia.morph_race_hippogriff": "Hippogriff Transformation", + "item.minecraft.potion.effect.unicopia.tribe_swap_earth": "Potion of Earth Pony Metamorphosis", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_earth": "Splash Potion of Earth Pony Metamorphosis", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_earth": "Lingering Potion of Earth Pony Metamorphosis", @@ -363,36 +376,101 @@ "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_unicorn": "Lingering Potion of Unicorn Metamorphosis", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_unicorn": "Arrow of Unicorn Metamorphosis", - "effect.unicopia.change_race_pegasus": "Pegasus Metamorphosis", "item.minecraft.potion.effect.unicopia.tribe_swap_pegasus": "Potion of Pegasus Metamorphosis", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_pegasus": "Splash Potion of Pegasus Metamorphosis", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_pegasus": "Lingering Potion of Pegasus Metamorphosis", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_pegasus": "Arrow of Pegasus Metamorphosis", - "effect.unicopia.change_race_changeling": "Changeling Metamorphosis", "item.minecraft.potion.effect.unicopia.tribe_swap_changeling": "Potion of Changeling Metamorphosis", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_changeling": "Splash Potion of Changeling Metamorphosis", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_changeling": "Lingering Potion of Changeling Metamorphosis", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_changeling": "Arrow of Changeling Metamorphosis", - "effect.unicopia.change_race_bat": "Bat Pony Metamorphosis", "item.minecraft.potion.effect.unicopia.tribe_swap_bat": "Potion of Bat Pony Metamorphosis", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_bat": "Splash Potion of Bat Pony Metamorphosis", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_bat": "Lingering Potion of Bat Pony Metamorphosis", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_bat": "Arrow of Bat Pony Metamorphosis", - "effect.unicopia.change_race_kirin": "Kirin Metamorphosis", "item.minecraft.potion.effect.unicopia.tribe_swap_kirin": "Potion of Kirin Metamorphosis", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_kirin": "Splash Potion of Kirin Metamorphosis", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_kirin": "Lingering Potion of Kirin Metamorphosis", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_kirin": "Arrow of Kirin Metamorphosis", - "effect.unicopia.change_race_hippogriff": "Hippogriff Metamorphosis", "item.minecraft.potion.effect.unicopia.tribe_swap_hippogriff": "Potion of Hippogriff Metamorphosis", "item.minecraft.splash_potion.effect.unicopia.tribe_swap_hippogriff": "Splash Potion of Hippogriff Metamorphosis", "item.minecraft.lingering_potion.effect.unicopia.tribe_swap_hippogriff": "Lingering Potion of Hippogriff Metamorphosis", "item.minecraft.tipped_arrow.effect.unicopia.tribe_swap_hippogriff": "Arrow of Hippogriff Metamorphosis", + "item.minecraft.potion.effect.unicopia.short_morph_earth": "Potion of Earth Pony Short Transformation", + "item.minecraft.splash_potion.effect.unicopia.short_morph_earth": "Splash Potion of Earth Pony Short Transformation", + "item.minecraft.lingering_potion.effect.unicopia.short_morph_earth": "Lingering Potion of Earth Pony Short Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.short_morph_earth": "Arrow of Earth Pony Short Transformation", + + "item.minecraft.potion.effect.unicopia.short_morph_unicorn": "Potion of Unicorn Short Transformation", + "item.minecraft.splash_potion.effect.unicopia.short_morph_unicorn": "Splash Potion of Unicorn Short Transformation", + "item.minecraft.lingering_potion.effect.unicopia.short_morph_unicorn": "Lingering Potion of Unicorn Short Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.short_morph_unicorn": "Arrow of Unicorn Short Transformation", + + "item.minecraft.potion.effect.unicopia.short_morph_pegasus": "Potion of Pegasus Short Transformation", + "item.minecraft.splash_potion.effect.unicopia.short_morph_pegasus": "Splash Potion of Pegasus Short Transformation", + "item.minecraft.lingering_potion.effect.unicopia.short_morph_pegasus": "Lingering Potion of Pegasus Short Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.short_morph_pegasus": "Arrow of Pegasus Short Transformation", + + "item.minecraft.potion.effect.unicopia.short_morph_changeling": "Potion of Changeling Short Transformation", + "item.minecraft.splash_potion.effect.unicopia.short_morph_changeling": "Splash Potion of Changeling Short Transformation", + "item.minecraft.lingering_potion.effect.unicopia.short_morph_changeling": "Lingering Potion of Changeling Short Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.short_morph_changeling": "Arrow of Changeling Short Transformation", + + "item.minecraft.potion.effect.unicopia.short_morph_bat": "Potion of Bat Pony Short Transformation", + "item.minecraft.splash_potion.effect.unicopia.short_morph_bat": "Splash Potion of Bat Pony Short Transformation", + "item.minecraft.lingering_potion.effect.unicopia.short_morph_bat": "Lingering Potion of Bat Pony Short Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.short_morph_bat": "Arrow of Bat Pony Short Transformation", + + "item.minecraft.potion.effect.unicopia.short_morph_kirin": "Potion of Kirin Short Transformation", + "item.minecraft.splash_potion.effect.unicopia.short_morph_kirin": "Splash Potion of Kirin Short Transformation", + "item.minecraft.lingering_potion.effect.unicopia.short_morph_kirin": "Lingering Potion of Kirin Short Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.short_morph_kirin": "Arrow of Kirin Short Transformation", + + "item.minecraft.potion.effect.unicopia.short_morph_hippogriff": "Potion of Hippogriff Short Transformation", + "item.minecraft.splash_potion.effect.unicopia.short_morph_hippogriff": "Splash Potion of Hippogriff Short Transformation", + "item.minecraft.lingering_potion.effect.unicopia.short_morph_hippogriff": "Lingering Potion of Hippogriff Short Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.short_morph_hippogriff": "Arrow of Hippogriff Short Transformation", + + "item.minecraft.potion.effect.unicopia.long_morph_earth": "Potion of Earth Pony Long Transformation", + "item.minecraft.splash_potion.effect.unicopia.long_morph_earth": "Splash Potion of Earth Pony Long Transformation", + "item.minecraft.lingering_potion.effect.unicopia.long_morph_earth": "Lingering Potion of Earth Pony Long Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.long_morph_earth": "Arrow of Earth Pony Long Transformation", + + "item.minecraft.potion.effect.unicopia.long_morph_unicorn": "Potion of Unicorn Long Transformation", + "item.minecraft.splash_potion.effect.unicopia.long_morph_unicorn": "Splash Potion of Unicorn Long Transformation", + "item.minecraft.lingering_potion.effect.unicopia.long_morph_unicorn": "Lingering Potion of Unicorn Long Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.long_morph_unicorn": "Arrow of Unicorn Long Transformation", + + "item.minecraft.potion.effect.unicopia.long_morph_pegasus": "Potion of Pegasus Long Transformation", + "item.minecraft.splash_potion.effect.unicopia.long_morph_pegasus": "Splash Potion of Pegasus Long Transformation", + "item.minecraft.lingering_potion.effect.unicopia.long_morph_pegasus": "Lingering Potion of Pegasus Long Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.long_morph_pegasus": "Arrow of Pegasus Long Transformation", + + "item.minecraft.potion.effect.unicopia.long_morph_changeling": "Potion of Changeling Long Transformation", + "item.minecraft.splash_potion.effect.unicopia.long_morph_changeling": "Splash Potion of Changeling Long Transformation", + "item.minecraft.lingering_potion.effect.unicopia.long_morph_changeling": "Lingering Potion of Changeling Long Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.long_morph_changeling": "Arrow of Changeling Long Transformation", + + "item.minecraft.potion.effect.unicopia.long_morph_bat": "Potion of Bat Pony Long Transformation", + "item.minecraft.splash_potion.effect.unicopia.long_morph_bat": "Splash Potion of Bat Pony Long Transformation", + "item.minecraft.lingering_potion.effect.unicopia.long_morph_bat": "Lingering Potion of Bat Pony Long Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.long_morph_bat": "Arrow of Bat Pony Long Transformation", + + "item.minecraft.potion.effect.unicopia.long_morph_kirin": "Potion of Kirin Long Transformation", + "item.minecraft.splash_potion.effect.unicopia.long_morph_kirin": "Splash Potion of Kirin Long Transformation", + "item.minecraft.lingering_potion.effect.unicopia.long_morph_kirin": "Lingering Potion of Kirin Long Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.long_morph_kirin": "Arrow of Kirin Long Transformation", + + "item.minecraft.potion.effect.unicopia.long_morph_hippogriff": "Potion of Hippogriff Long Transformation", + "item.minecraft.splash_potion.effect.unicopia.long_morph_hippogriff": "Splash Potion of Hippogriff Long Transformation", + "item.minecraft.lingering_potion.effect.unicopia.long_morph_hippogriff": "Lingering Potion of Hippogriff Long Transformation", + "item.minecraft.tipped_arrow.effect.unicopia.long_morph_hippogriff": "Arrow of Hippogriff Long Transformation", + "potion.withChance": "1 in %s chance of %s", "potion.potency.6": "VII", diff --git a/src/main/resources/assets/unicopia/textures/mob_effect/change_race_hippogriff.png b/src/main/resources/assets/unicopia/textures/mob_effect/change_race_hippogriff.png new file mode 100644 index 0000000000000000000000000000000000000000..057c22409e21fdc91613ef0bc6383267b36b0e52 GIT binary patch literal 6551 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/mob_effect/change_race_kirin.png b/src/main/resources/assets/unicopia/textures/mob_effect/change_race_kirin.png new file mode 100644 index 0000000000000000000000000000000000000000..33be07ce36037ad660129e341a1d821a5991f4fc GIT binary patch literal 6550 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_bat.png b/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_bat.png new file mode 100644 index 0000000000000000000000000000000000000000..77ef99b8aef63890e68f52aef831982b45c99e55 GIT binary patch literal 4462 zcmeHKYj6|S6<*2pOJF8rZ1NyeFG~_*6KNloEbZE|4U&vy5U57uxb8r`k1Mf7(hBX` zl3@~Fv13XCG%=3`ho%h)4NgKS0j4;FSDTPD)I6pn>A1!5v;jgO5J;SqhV<@AmQ9kG zj%S*GUd`1#d+#~lJ@-539_g;}&YhKGxW|AXNRGS4SqJ+&)RvV2zYDH^&BE>^XmI=8 z?qVbhzCcag4-lQI1DkGytkX>hC^wp=KyI%>N|m#+1XLwRyi?u7ERq>diSq)w0I zz`hGM3d(t~-wB)eSYoZ$p{zbx+NTCeD)LZ2%kA-^l!+uvC8f}wpv(+GGL#i1X@;;d z1Oc^m&klQ}BAx7hBNL)LDmolqx5I%(qLN<>0tAV7J^TxM%`tCY+r0UEvHZtc?r1*l zedgoeVCx#&FkjZ*ncWi}z`t7kK#u$8YoF_Hj9d-u{-}T8rS8?;Xx6P2wlZ7Mftodg z_qR9zYme-I{mP45 zKQjGg℘-dg&31M51VJFLmtIHP((D*3jzf6-zod3LC%ZiuY|Fms=TKaP5mHHkTdl ze`?Cs-%n2$v)lAnAE`dqnTGAJI`_17|5-d;G^8k5fV-MTEE z_$0G%MYQ9>zjsGr4#q`agVNxc!|+nb#0nAzOz}`e4H!~h8IQ31VxXWL2#8@j_DRnn z3>5`C_K?Lxcp?t4NUT{J1@o8A_3=v=^R$3fRv60T3s1*q9%HW5ZwTx_AR3Ikdm75q${vpNX@-|W~TMTsyt9*f0Hu@aLM z4d5hA(>Oul6lH`OM!7YtuyJEpo~lA5Fq}ZwAp@?P$$-Yff5&gqt-R7G*qituTBhWmBdz<#q z-Zf>YZ5-}}aYO;DNKv081?^a>>ZYbW@Hh#q!a7+6 zK+sej_6^nH=>!3*@vy!mi2m09rL7(wv^){=8c~Mpw`xO)6Ezl^v=1 zv5X+&CaO(`Jl%B{9L!YQ9#`fC-Q9P9Ww1e#Sepmm`ijFKdd|Kf;6+4*MS(n?U zLpEJ*YH1X6m)X6wZ=D|e;D&xd{U7F+ z74O`El9x8q(_`)Liy-^$y7#vIZrdUD{RwLi|8-%3w0C^#smZa-iPr|4;daNDH=UWg Z3O;@DTJ9UU85Cp+al7U^Uzypo>c4gZ2uc6| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_changeling.png b/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_changeling.png new file mode 100644 index 0000000000000000000000000000000000000000..c29bf471b8754cd9c52b60e38fd92cb2bca9b448 GIT binary patch literal 4377 zcmeHKYj6|S6<(R(Hy!E#F_0hcJsX=8?rF)c}3I*kc5p)pfJ6HJoH%QVeohW1A$I83KN2#?ln0!cwVyOL$Q z%}mEL%|EZ_`kp=aobR6V-E)t_zWsr@h)co;-WFU{us{_Fh&RA`<)$Rg+nsM;7jc44rjpJ!I z?{tH;<-k}(2GZL@9u82xFW1+H0`>KHN>!qA9AQ|d?|VP?`db`I7i^S}0oijV$ z4DJ8q8DjT?-9)(b#Z~=ZTTI>Dx_Cxl=i@&gelT?{_WZ}g=MMF6?Z-=RZDwoPWyk$H zKKoYp9NW6gi64zz;ZCF%;EtN6qsOC`;IY#>voNalM=s2^R4yvAc$uTSxWGMw$6mhj z>wOgUe>^Y-@-KN(pVJYTjT`^2TaZ~pR${>sMP)5A}%?7TU=>DnU$ErNRL z-tr}zuiWv*jq2&EUb_3}753~KyWjU%w!C|C&xfBrF#qJxl8gTwm{VI+Jn-1#mj(`g zV%b}Ja`?%G`(C(fx?I*>bnVf`vpv&@V|SnJbssy!H80p)dAg=!+MRb6i4AYB`>ZRi zod4j~W%=~gk|mqf?H4|OUWFRW$l+GKHQ2<9O2R5gN(5OmiIj0*n5Qn262$dL$0H~v zC%wegmtG-oS@IGOID>RBRgcUQrS5usW?hk!RP(XQ($o}$v} zv^8zFDr$_faU4g{48<@cSddy*QWr90Qd?v|AmCoW zonSqhyJ-wo!65Hb#1138fX_=9`}2|_$`Wsih~XrsB|QqzT`hzuwIx5|LypxvxpM2M7}HkNdtC_}P##zjhYiE*$Ihsd~`;~?%+ zWvEIaK0Yb~N&=`T676nUbdfI6Es_o{!jXbx6G)MkoJe3@4!gveP?E?uDr!Q2-C=U0XTUV^dGW13K0(4*ksC7R@9M`mmxEGN)fT`<_RxoMZ3WgKouhoNcL zm{AK-HK;@b)9jt*ig7GFBm=|>Mx6qHsfS$ndKC$}qJ|YE?j;Icx3C<9>m&)f;1hHN zpoKmh9__<-(KJuz!Z+Z8iX=z7{+G3Jd2kQd!;$-C4fgLcRk<6r7H!DA2TTIBqt)8WE?c( zk_5@_cH~N-fUYS~JuRqcWej)(uAn^4zfky6^PrYZj3wQUj8g!@NZLj+?*Al=$|p=2 zJ!3Ru5A|Q1cua$FO$PjOI%rH*A!ioVqj9n zQ`I#^*Q6Mjl<`z`{om*+AN!m_N%$`)4IfL{dHY-7L#sG)?`j|RDRuxmKJ>+0Vqd5E)DOjoj2l74-UyUdtNVkp<;-PXT=JCalH3A&w3N|mEU!fJ1umRUft)} z@YL52&OKPRxUr|At@o|jP d(UtAx*xEWKoCWTWkDjrz5Q`NcgcZ}OUPjkZ^8|xP7B!|?~WaEx5w@# zccB%NAOaOBA`Bfwr9ae>AQUOk0;Aza2PsnRIAy4{66lN)fe@uC)ROeOd&wnfo#|vo z|I531_rCky=Y8J$e%|+e?{f^A~VdXFv7YBzvAsn6a5_5*#G9IzQ%4ps#1 z4yY{HcS5@hsNeco)9jn&n{l{m{a5#| znZPVbAN|>lF79Y*GVUs^-hVi13mrOZuv4OXn|OJ=t#E3N&Cl-Nzy%i^JM?DPYtMh` z_|yJ>f8Dctm0M+SeC)gIiQlgGu6xxRUwvctiY;5^tv7e1Km7HWv2(N^eRlI1{m-Z+ zR(ZC1<%_-r4^Eg>+gZ1mbzhos>F2vTw@|WwF{iFLSL!}@xa0}Jw|DP@`U~gmn`=*w zowhCte)Q#|liJ@Y>HOm0gjqTH2V0)La`2U_wr#W8 zJD!{J{2Md#l+kN)x>r?R*pf>edg#J-@1b+t!pY5rXGl?x-%%H#6Sz>kpUZ%-Wz9vxFM*&ZMVwqtid5TJS&C&zK#+Pl1b zOP|pDQ~*7ww2-722TjG})ZiJqQPBt_eH;458G58CiKrT+s|}ijDjHG3m^zq3ma_Ac z4O+eBjx15A9>oEw!>Y`XCCwX`oncB4Q{qW$7Kl9rX(-VFv4-r;9I@OPyb+k5mDiq=as?=a^FBtF>=K8#>N{Y-|riWo!x6|n%JwDM%x?~q31(}sd7xH>U(Je5X z8jpa)SrqA3uS zLjB-fnN%`R$*hxMe2j}^M7Ni8F>aak`D8cgj(RvwVqL5#c`Pbf;wx1xF2HdraUq7N zWFlq_n1b_j!$Cj6Ix?$TJ>h!6h{6OvQLQ8z(gVyE)qy!Dkje(A!6@;ht3xz*m9n_4W=+rV~o&pF)(hSLZ|64Gs&tb~U8T}rY zQU9Y!nFSb>WME#V50V$;LModK`!qAt&UaY)&f+^<0jNh78J4~ya*fC}ECq%I9*M3I zxrU{{u)rhH^{vTOFz`Bs67Vl51usjLi9h@uUbOPXhvx^dFR`82;dj2i+kE*NoviwS zj$vcQnbn4E-!Tz7M;XCT#i+}+N#pFr^ACikLD%1cfw>Xi8L4h({%=0teXBQqY)|jy ze{P-A+q3l6jqANfUfbTgq7#XAb#>>*B~Ep`@p*CnGk1Ix`pZdr!}^vMTieI}i;ab5 zsc{~-xc%88;)A@_mZCzlE`6)#awl28%lpQUNO`BOLiytt@ zTk~ET(=|ou`Rukccha`v)%f@CYTDO+?DUy-DBV40yuRtBg?8KK;~l3rFG%CZb2jfB zbN+WvPBiP1*RMo7K8}|7?>oBmLVNeB$8&$^Jl%=qZ~DiJSB>VYsa-a#blZD>-Sqpl Rr@&1tSg|m$XI@?Fe*k%C_~QTo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_hippogriff.png b/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_hippogriff.png new file mode 100644 index 0000000000000000000000000000000000000000..f52bfd19031f5c4ad992f80a4f6164d04697972b GIT binary patch literal 4654 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_pegasus.png b/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_pegasus.png new file mode 100644 index 0000000000000000000000000000000000000000..56b4c3e04c5c54c19995129b55e4ba2e4ed44f22 GIT binary patch literal 4428 zcmeHLeNa@_72m}mNTB0j6eCG^J{nQt+xM{_Z}-W9$bxLbDp7`zOq%ZdxVyZO-M7Ad zz(U#tLJ8Us^P!HJ1QV)_nTTUziO`T#QQO8^iET4u(;26t(`hgte#ACPY@p}8<+II9 zhneO--p<{7-nr-e?zz8v?t!~o%h#<T=>qqKFUM)2UO(^ zc)hu%WOxBf^KB-xZUfCcMNTl!G0g$p)6mjE)@}5*#GGjK?I354$vZ$^K4y~uGHp&U zr9s~TjRE-%==VdD+v0N_0a<^NjZY~^I`VkG*6S%#X=VU}WQrBV6-vH$&a#2yax2Onyr%1W%gAq9mZf=r`pn+JM?hBZGy#pGvG!X3)h8CJrvlGm2rn}wcz5iJ6k;`ws z@~P#+?tk4HIq-yCp)oA|40Gb0t?ZUJ*ig&${LMRdN;_|M#LoTv_Vfbv2iI;s8~r0{ z4wej*HNNV+f90Z8RhRsgjQ!$@i!bfJw1bq~l`duT*BjP5?0{9@Iw z)4#u^yu9eng&%ME=-_r?sqd3{S)8Sz+BbgHK+4yr+^^k3W!- z({wrGgW<)AYu;Pkec5^bgKZz>nV&k-zw@tOJ(SshI_J_qdls!qnA_9*%x69OJ~!`L z)jzm>=_|juFHxS?nsD`rlJh&};JvHQzs&ZYb*;;4N*&0popaY+31ac7$8I##E1#Sj z`9dDJl9bb=ZW;RekP0~%lPjvUDqk5VDj^FmDFU*@LJ@t#OnC*d2rq6z8YZBi9CqVZ z-aCq8vgF1evim4sqzF~ZrHv}u*to7jY}_QeB)lL$B`?MSKnQ6(77Nvcqg>358@L?E zx|+l>!$jNU#;YKYiWC)LHjB+d5ydgNj=}R&usl@?a2q@&V-WD>#;Y|g!jWWseZ8gL zYEjf6NxNJwl43}PA;5x&HiR`kMuel;Iz$}9gQB7;M>JUpV>%`;D7Bg!$6*{Bk1rJQ z`6l4Q(J>Z)4>HC_NZLY?p%6LMBdQhG0mxWD-|7*qXow(k1BxoOs)&l~P*}^J3L%LT z{*hX>##oLdlBfoSz%&Z8($l8YPuzruPC-x(MGP+>dzz&t2PVmy7Mng|EN5yU;68yn z&3b(8hA~+Ae4IxSYxVHF9yhMf&q<0XOI%!ZIvg}FA%d11R>H=@e(+XWA{+q}Kn}s_ zvQoknC~r8b@nI3^PylX`0f*vUlq85ec+(7Fvr10FX%|?+Do|FN=yFgLLQ^2tt1@II zUo$l-9ZCWy+96W5fIt%g(JBx&yWLI*f@Ft~SO;QxXTUDTp(K$jQPdC*+bM_mAR;5- zpfQI|I9FKib>obMn$(on@LB*I+<2KBu8mC&RLCK;QR8(sX_j(Wos6BP7$<9U*e8uD zks5_e)G>|PX^iOG!ogyISYFRl05J5h7OqG|yr!rXic;goC#vqmun&%t#B02V*AReC z)ZvQpI(#2Raa25f9nPmna-iXVS?h-f%L9AZ@=`ep^EVi(_=(zxHpk!MuQjr9lrYRV z6dW(cmk{OakYvOOSn(mTnhysNRFAQA9oNg>k_wEAv0803OGs>hC2WGk5(3L30?{_s zDmWN{W!UNHQ6-?&^C~I~0*}BIq^I#03R`Y$)QaiW_0>q<1t5%|Xo6w?lQ42@!K7X@ z##fw2{ud{ChQX8~1AcKG6fdZS@pOkSr@82$^YhszSbuXPwMT62X5)_P1|nL15X6rEEpa6;qdh<1^K@!ONHn0<6kU(wDO+go!6TGJUTj>b1HFY$@-%=uVp=K{hj6G z8((IeXxUY8;h>-Q`}_AdtpDZRC)_K0_I7*KV@Gx!9en4_+miM!&(6+Xke|`N`cJ1a zM_)+WoE~gxODxRjxAnf-aO<_^=H_GGj%T53E-dWW-CUi~-?ZJCc`kELdwaX*-6qgq zxb}5oYEon0g%8_))1;$4cnHgUslW5U$`p3~-+#16yl|%Xxzv**ZSu0*dw)AnF#MW7 maD3liPIW)+FWCdXf!uw5B=^PB%ZFgmCU5aN&%rhRr~VBw(g2qL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_unicorn.png b/src/main/resources/assets/unicopia/textures/mob_effect/morph_race_unicorn.png new file mode 100644 index 0000000000000000000000000000000000000000..b8151af32737bb777e9a57cb47d1473a6b430d79 GIT binary patch literal 4397 zcmeHKe{2)i9Y2SWgpf=q1qP*qH{vT6JyCckj%J*k|r8 zu|qXVnq>`b2W%vzYtxBsU8^+++R+k~c9b8JsJdp|R4J-9G=5A|`B9Q=Y%Pot?|WzG z*H&qYwEmZ8J-_dL-}n1@-}ian_qA_#c;ot#qPvSQ3@ZuN1~$Vu$LfXo@V(?lMug#a zs3E8XgJoDDJbY5){8T| zKy!kd1#8E_@rZ1so;PVg`L62shl74Up42r(Z9*89?)lCSe6?r7b2~O|d5f6$RLh*^ z_rouJ_ETcd!yQDV@U3;dU%!vK(|%t`@aboMcH!aVaO{n%7cL#@ZSTbkM|N>*xRu9i zcYpD%j`_@^>38?u806ngEy3Mobw`gYj!<8}$u3ol-st6dj^br`4j+5;Sw6VoRNslg zU%YtL`P-xax;=7er$=LOy!0dX%$vKtov(W1?Kdj7cXi9%H+$0OUY=cArGNXcH@|QE z9<{}4`s;T5nA@;={+fm>jrFYO(#lKEzjmdIl702Owtb+?GjM$Q6C!uy$ZF%Ifx;g) z{JQks&T!bjaNZ}KA0OTyT^jmy){@M=YX{!{`M%!bnmsckKUv#y=fV@ij~}ZS_0ta& zE#EcxjkC8F%v|@*{YMA6^Jn*bT;X`~qm$i#`uxE~CqG<%a32u;hi<-yJir5_n&{k+c&^(T(YaUzpQ!2J@@2E)gL_iMQcj? z^xVjGwSTB!`7XWl@;~3uAqUfHq`_|;IYMM!bqEe}p zGv#t>dW>Rto~LM*Vp$R_NTW4jifJ-oEVCf87y)ERx|%dqErDB@VpMB3eFOpX_-K6b zWGFNSpD=PP03TFZOj3-Krs8pGqK9Etw*W{kpfB|>BCSb8ZAOOHtV^i61trX76Cq@2 z%s<(zH`&{fB?>j6IG7r+Dl=(G>&A_FSQNz6c+&O)vL{)ZsxnU2q}Z$(dpi>Y0rxT7 zN!Fu#w~fIn6cPfO)NF+p4EP9ZeL>bFRTgZ~rMN_er9C8aDTs8tqfwG)keiJ1ZjNUe zUXjYV2~fd=VTuU}Sx^A(Q~`&Mdbn~I9VHRsdD2aLMN;(0E|Nit>^56!v8 zjp~tZKqgw4cI~uhtYZ;iGeE3p42UKI z(6Krk8Lh*sXj-7N;ahMaO;(lG|7C4m9=rnV;mB)M1J-Y~RoNT01#QnhWgnYV`zqnM zeJKP{%5K3BTaawW30T=FX{(rsA*dd?bRE^JUy=&Q>v1Uzf-GP}FX@glJjwBJ#d#4i zUYE06u!bfsFjngQ(KXB3P2c1GbHQ%Pr|6&hAFFN zjPAIC`Y%o@Y=a3!2K=%*C|*ztsj*_1(^{~KLJ