From 59c2f400d09cdfa6b18a30d31de891a7c8d07a4a Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 27 Feb 2021 12:24:09 +0200 Subject: [PATCH] Added gemstones, feathers, and Wings of Icarus --- gradle.properties | 2 +- .../minelittlepony/unicopia/FlightType.java | 17 +- .../ability/UnicornCastingAbility.java | 110 +++++++--- .../unicopia/entity/player/PlayerPhysics.java | 92 ++++++--- .../unicopia/item/AmuletItem.java | 192 ++++++++++++++++++ .../minelittlepony/unicopia/item/UItems.java | 16 ++ .../resources/assets/unicopia/lang/en_us.json | 10 + .../assets/unicopia/models/item/gemstone.json | 6 + .../unicopia/models/item/golden_feather.json | 6 + .../unicopia/models/item/golden_wing.json | 6 + .../unicopia/models/item/gryphon_feather.json | 6 + .../unicopia/models/item/pegasus_amulet.json | 6 + .../unicopia/models/item/pegasus_feather.json | 6 + .../unicopia/textures/item/alicorn_amulet.png | Bin 0 -> 549 bytes .../unicopia/textures/item/gemstone.png | Bin 0 -> 3298 bytes .../unicopia/textures/item/golden_feather.png | Bin 0 -> 3311 bytes .../unicopia/textures/item/golden_wing.png | Bin 0 -> 3216 bytes .../textures/item/gryphon_feather.png | Bin 0 -> 3300 bytes .../unicopia/textures/item/pegasus_amulet.png | Bin 0 -> 574 bytes .../textures/item/pegasus_feather.png | Bin 0 -> 3285 bytes .../data/unicopia/recipes/gemstone.json | 15 ++ .../data/unicopia/recipes/golden_feather.json | 20 ++ .../data/unicopia/recipes/golden_wing.json | 16 ++ .../data/unicopia/recipes/pegasus_amulet.json | 13 ++ 24 files changed, 480 insertions(+), 59 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java create mode 100644 src/main/resources/assets/unicopia/models/item/gemstone.json create mode 100644 src/main/resources/assets/unicopia/models/item/golden_feather.json create mode 100644 src/main/resources/assets/unicopia/models/item/golden_wing.json create mode 100644 src/main/resources/assets/unicopia/models/item/gryphon_feather.json create mode 100644 src/main/resources/assets/unicopia/models/item/pegasus_amulet.json create mode 100644 src/main/resources/assets/unicopia/models/item/pegasus_feather.json create mode 100644 src/main/resources/assets/unicopia/textures/item/alicorn_amulet.png create mode 100644 src/main/resources/assets/unicopia/textures/item/gemstone.png create mode 100644 src/main/resources/assets/unicopia/textures/item/golden_feather.png create mode 100644 src/main/resources/assets/unicopia/textures/item/golden_wing.png create mode 100644 src/main/resources/assets/unicopia/textures/item/gryphon_feather.png create mode 100644 src/main/resources/assets/unicopia/textures/item/pegasus_amulet.png create mode 100644 src/main/resources/assets/unicopia/textures/item/pegasus_feather.png create mode 100644 src/main/resources/data/unicopia/recipes/gemstone.json create mode 100644 src/main/resources/data/unicopia/recipes/golden_feather.json create mode 100644 src/main/resources/data/unicopia/recipes/golden_wing.json create mode 100644 src/main/resources/data/unicopia/recipes/pegasus_amulet.json diff --git a/gradle.properties b/gradle.properties index 9b659308..3efd7298 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,5 +18,5 @@ org.gradle.daemon=false # Dependencies modmenu_version=1.14.+ - minelp_version=4.2.1-1.16.2-SNAPSHOT + minelp_version=4.2.1-1.16.5 kirin_version=1.7.1-1.16.2-SNAPSHOT diff --git a/src/main/java/com/minelittlepony/unicopia/FlightType.java b/src/main/java/com/minelittlepony/unicopia/FlightType.java index 9269782b..7935e92a 100644 --- a/src/main/java/com/minelittlepony/unicopia/FlightType.java +++ b/src/main/java/com/minelittlepony/unicopia/FlightType.java @@ -2,16 +2,27 @@ package com.minelittlepony.unicopia; import com.minelittlepony.unicopia.entity.player.Pony; +import net.minecraft.sound.SoundEvent; + public enum FlightType { NONE, CREATIVE, AVIAN, - INSECTOID; + INSECTOID, + ARTIFICIAL; public boolean isGrounded() { return this == NONE; } + public boolean isAvian() { + return this == AVIAN || isArtifical(); + } + + public boolean isArtifical() { + return this == ARTIFICIAL; + } + public boolean canFly() { return !isGrounded(); } @@ -24,6 +35,10 @@ public enum FlightType { return canFly() && !canFlyCreative(); } + public SoundEvent getWingFlapSound() { + return this == INSECTOID ? USounds.ENTITY_PLAYER_CHANGELING_BUZZ : USounds.ENTITY_PLAYER_PEGASUS_WINGSFLAP; + } + /** * Predicate for abilities to control whether a player can fly. * diff --git a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java index 8cd36f4c..ba88c876 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java @@ -1,5 +1,11 @@ package com.minelittlepony.unicopia.ability; +import java.util.Objects; +import java.util.Optional; +import java.util.Random; + +import javax.annotation.Nullable; + import com.google.common.collect.Streams; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.ability.data.Hit; @@ -7,8 +13,17 @@ import com.minelittlepony.unicopia.ability.magic.Spell; import com.minelittlepony.unicopia.ability.magic.spell.ShieldSpell; import com.minelittlepony.unicopia.ability.magic.spell.SpellRegistry; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.item.AmuletItem; import com.minelittlepony.unicopia.particle.MagicParticleEffect; +import net.minecraft.item.ItemStack; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Hand; +import net.minecraft.util.Pair; +import net.minecraft.util.math.Vec3d; + /** * A magic casting ability for unicorns. * (only shields for now) @@ -31,8 +46,10 @@ public class UnicornCastingAbility implements Ability { } @Override + @Nullable public Hit tryActivate(Pony player) { - return Hit.INSTANCE; + System.out.println(getCostEstimate(player) + " " + player.getMagicalReserves().getMana().get()); + return getCostEstimate(player) <= player.getMagicalReserves().getMana().get() ? Hit.INSTANCE : null; } @Override @@ -42,49 +59,80 @@ public class UnicornCastingAbility implements Ability { @Override public double getCostEstimate(Pony player) { - if (player.hasSpell()) { - String current = player.getSpell(true).getName(); - Spell replaced = Streams.stream(player.getMaster().getItemsHand()) - .map(SpellRegistry::getKeyFromStack) - .filter(i -> i != null && !current.equals(i)) - .map(SpellRegistry.instance()::getSpellFromName) - .filter(i -> i != null) - .findFirst() - .orElse(null); - return replaced == null ? 2 : 4; - } - - return 4; + return getAmulet(player) + .map(pair -> Math.min(player.getMagicalReserves().getMana().get(), pair.getLeft().getChargeRemainder(pair.getRight()))) + .orElseGet(() -> player.hasSpell() && getNewSpell(player).isPresent() ? 4F : 2F); } @Override public void apply(Pony player, Hit data) { + getAmulet(player).filter(pair -> { + float amount = -Math.min(player.getMagicalReserves().getMana().get(), pair.getLeft().getChargeRemainder(pair.getRight())); + + if (amount < 0) { + AmuletItem.consumeEnergy(pair.getRight(), amount); + player.getMagicalReserves().getMana().add(amount * player.getMagicalReserves().getMana().getMax()); + player.getWorld().playSoundFromEntity(null, player.getMaster(), SoundEvents.BLOCK_END_PORTAL_FRAME_FILL, SoundCategory.PLAYERS, 1, 1); + } + return true; + }).orElseGet(() -> { + Optional newSpell = getNewSpell(player); + + @Nullable + Spell spell = player.hasSpell() ? newSpell.orElse(null) : newSpell.orElseGet(ShieldSpell::new); - if (player.hasSpell()) { - String current = player.getSpell(true).getName(); - Spell spell = Streams.stream(player.getMaster().getItemsHand()) - .map(SpellRegistry::getKeyFromStack) - .filter(i -> i != null && !current.equals(i)) - .map(SpellRegistry.instance()::getSpellFromName) - .filter(i -> i != null) - .findFirst() - .orElse(null); player.subtractEnergyCost(spell == null ? 2 : 4); player.setSpell(spell); - } else { - player.subtractEnergyCost(4); - player.setSpell(Streams.stream(player.getMaster().getItemsHand()) - .map(SpellRegistry.instance()::getSpellFrom) - .filter(i -> i != null) - .findFirst() - .orElseGet(ShieldSpell::new)); + + return null; + }); + } + + private Optional> getAmulet(Pony player) { + + ItemStack stack = player.getMaster().getStackInHand(Hand.MAIN_HAND); + + if (stack.getItem() instanceof AmuletItem) { + AmuletItem amulet = (AmuletItem)stack.getItem(); + if (amulet.canCharge(stack)) { + return Optional.of(new Pair<>(amulet, stack)); + + } } + + return Optional.empty(); + } + + private Optional getNewSpell(Pony player) { + final String current = player.hasSpell() ? player.getSpell(true).getName() : null; + return Streams.stream(player.getMaster().getItemsHand()) + .map(SpellRegistry::getKeyFromStack) + .filter(i -> !Objects.equals(i, current)) + .map(SpellRegistry.instance()::getSpellFromName) + .filter(Objects::nonNull) + .findFirst(); } @Override public void preApply(Pony player, AbilitySlot slot) { player.getMagicalReserves().getEnergy().multiply(3.3F); - player.spawnParticles(MagicParticleEffect.UNICORN, 5); + + if (getAmulet(player).isPresent()) { + Vec3d eyes = player.getMaster().getCameraPosVec(1); + + float i = player.getAbilities().getStat(slot).getFillProgress(); + + Random rng = player.getWorld().random; + + player.getWorld().addParticle(i > 0.5F ? ParticleTypes.LARGE_SMOKE : ParticleTypes.CLOUD, eyes.x, eyes.y, eyes.z, + (rng.nextGaussian() - 0.5) / 10, + (rng.nextGaussian() - 0.5) / 10, + (rng.nextGaussian() - 0.5) / 10 + ); + player.getWorld().playSound(player.getEntity().getX(), player.getEntity().getY(), player.getEntity().getZ(), SoundEvents.ENTITY_GUARDIAN_ATTACK, SoundCategory.PLAYERS, 1, i / 20, true); + } else { + player.spawnParticles(MagicParticleEffect.UNICORN, 5); + } } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java index 7107cc3d..139ec66c 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -8,6 +8,8 @@ import com.minelittlepony.unicopia.entity.Creature; import com.minelittlepony.unicopia.entity.EntityPhysics; import com.minelittlepony.unicopia.entity.Jumper; import com.minelittlepony.unicopia.entity.player.MagicReserves.Bar; +import com.minelittlepony.unicopia.item.AmuletItem; +import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.projectile.ProjectileUtil; import com.minelittlepony.unicopia.util.NbtSerialisable; @@ -19,13 +21,14 @@ import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityPose; import net.minecraft.entity.EntityType; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LightningEntity; import net.minecraft.entity.attribute.EntityAttributeInstance; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; import net.minecraft.util.Tickable; import net.minecraft.util.math.BlockPos; @@ -38,6 +41,8 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti private float thrustScale = 0; + private FlightType lastFlightType; + public boolean isFlyingEither = false; public boolean isFlyingSurvival = false; @@ -89,6 +94,9 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti if (!creative) { entity.abilities.flying |= (type.canFly() || entity.abilities.allowFlying) && isFlyingEither; + if (!type.canFly() && (type != lastFlightType)) { + entity.abilities.flying = false; + } if ((entity.isOnGround() && entity.isSneaking()) || entity.isTouchingWater() @@ -109,6 +117,8 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti } } + lastFlightType = type; + isFlyingSurvival = entity.abilities.flying && !creative; isFlyingEither = isFlyingSurvival || (creative && entity.abilities.flying); @@ -137,35 +147,65 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti } } - int level = pony.getLevel().get() + 1; + ticksInAir++; - if (ticksInAir++ > (level * 100)) { - Bar mana = pony.getMagicalReserves().getMana(); + if (type.isArtifical()) { + if (ticksInAir % 10 == 0 && !entity.world.isClient) { + ItemStack stack = entity.getEquippedStack(EquipmentSlot.CHEST); - float cost = (float)-getHorizontalMotion(entity) * 20F / level; - if (entity.isSneaking()) { - cost /= 10; + float energyConsumed = 2 + (float)getHorizontalMotion(entity) / 10F; + if (entity.world.hasRain(entity.getBlockPos())) { + energyConsumed *= 3; + } + + AmuletItem.consumeEnergy(stack, energyConsumed); + + if (AmuletItem.getEnergy(stack) < 9) { + entity.world.playSoundFromEntity(null, entity, SoundEvents.BLOCK_CHAIN_STEP, SoundCategory.PLAYERS, 0.13F, 0.5F); + } + + if (entity.world.random.nextInt(50) == 0) { + stack.damage(1, entity, e -> e.sendEquipmentBreakStatus(EquipmentSlot.CHEST)); + } + + if (!getFlightType().canFly()) { + entity.world.playSoundFromEntity(null, entity, SoundEvents.ITEM_SHIELD_BREAK, SoundCategory.PLAYERS, 1, 2); + entity.abilities.flying = false; + isFlyingEither = false; + isFlyingSurvival = false; + } } + } else { + int level = pony.getLevel().get() + 1; - mana.add(cost); + if (ticksInAir > (level * 100)) { + Bar mana = pony.getMagicalReserves().getMana(); - if (mana.getPercentFill() < 0.2) { - pony.getMagicalReserves().getExertion().add(2); - pony.getMagicalReserves().getEnergy().add(2 + (int)(getHorizontalMotion(entity) * 5)); + float cost = (float)-getHorizontalMotion(entity) * 20F / level; + if (entity.isSneaking()) { + cost /= 10; + } - if (mana.getPercentFill() < 0.1 && ticksInAir % 10 == 0) { - float exhaustion = (0.3F * ticksInAir) / 70; - if (entity.isSprinting()) { - exhaustion *= 3.11F; + mana.add(cost); + + if (mana.getPercentFill() < 0.2) { + pony.getMagicalReserves().getExertion().add(2); + pony.getMagicalReserves().getEnergy().add(2 + (int)(getHorizontalMotion(entity) * 5)); + + if (mana.getPercentFill() < 0.1 && ticksInAir % 10 == 0) { + float exhaustion = (0.3F * ticksInAir) / 70; + if (entity.isSprinting()) { + exhaustion *= 3.11F; + } + + entity.addExhaustion(exhaustion); } - - entity.addExhaustion(exhaustion); } } } entity.fallDistance = 0; - if (type == FlightType.AVIAN) { + if (type.isAvian()) { applyThrust(entity, velocity); } moveFlying(entity, velocity); @@ -173,9 +213,9 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti applyTurbulance(entity, velocity); } - if (type == FlightType.AVIAN) { + if (type.isAvian()) { if (entity.world.isClient && ticksInAir % 20 == 0 && entity.getVelocity().length() < 0.29) { - entity.playSound(getWingSound(), 0.5F, 1); + entity.playSound(getFlightType().getWingFlapSound(), 0.5F, 1); thrustScale = 1; } velocity.y -= 0.02 * getGravitySignum(); @@ -185,7 +225,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti } else { ticksInAir = 0; - if (!creative && type == FlightType.AVIAN) { + if (!creative && type.isAvian()) { double horMotion = getHorizontalMotion(entity); double motion = entity.getPos().subtract(lastPos).lengthSquared(); @@ -222,10 +262,6 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti entity.setVelocity(velocity.toImmutable()); } - private SoundEvent getWingSound() { - return pony.getSpecies() == Race.CHANGELING ? USounds.ENTITY_PLAYER_CHANGELING_BUZZ : USounds.ENTITY_PLAYER_PEGASUS_WINGSFLAP; - } - protected void handleWallCollission(PlayerEntity player, MutableVector velocity) { if (wallHitCooldown > 0) { @@ -276,7 +312,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti protected void applyThrust(PlayerEntity player, MutableVector velocity) { if (pony.sneakingChanged() && player.isSneaking()) { thrustScale = 1; - player.playSound(getWingSound(), 0.5F, 1); + player.playSound(getFlightType().getWingFlapSound(), 0.5F, 1); } else { thrustScale *= 0.1889F; } @@ -350,6 +386,10 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti return FlightType.CREATIVE; } + if (UItems.PEGASUS_AMULET.isApplicable(pony.getMaster())) { + return FlightType.ARTIFICIAL; + } + if (pony.hasSpell()) { Spell effect = pony.getSpell(true); if (!effect.isDead() && effect instanceof FlightType.Provider) { diff --git a/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java b/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java new file mode 100644 index 00000000..a58ff4be --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java @@ -0,0 +1,192 @@ +package com.minelittlepony.unicopia.item; + +import java.util.List; +import java.util.Optional; + +import javax.annotation.Nullable; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; + +import net.fabricmc.fabric.api.item.v1.FabricItemSettings; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.ArmorMaterial; +import net.minecraft.item.ArmorMaterials; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.Ingredient; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.LiteralText; +import net.minecraft.text.MutableText; +import net.minecraft.text.StringVisitable; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.Formatting; +import net.minecraft.world.World; + +public class AmuletItem extends ArmorItem { + + private final int maxEnergy; + private final float drain; + + private final ImmutableMultimap modifiers; + + public AmuletItem(Item.Settings settings, int maxEnergy, int drainRate) { + this(settings, maxEnergy, drainRate, ImmutableMultimap.builder()); + } + + public AmuletItem(Item.Settings settings, int maxEnergy, int drainRate, ImmutableMultimap.Builder modifiers) { + super((Settings)settings, EquipmentSlot.CHEST, settings); + this.maxEnergy = maxEnergy; + drain = ((float)drainRate / (float)maxEnergy) / 10; + + this.modifiers = modifiers.build(); + } + + @Override + public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) { + if (isChargable() && entity instanceof LivingEntity && ((LivingEntity) entity).getEquippedStack(getSlotType()) == stack) { + consumeEnergy(stack, drain); + } + } + + @Override + public void appendTooltip(ItemStack stack, @Nullable World world, List list, TooltipContext tooltipContext) { + + for (StringVisitable line : MinecraftClient.getInstance().textRenderer.getTextHandler().wrapLines( + new TranslatableText(getTranslationKey(stack) + ".lore"), 150, Style.EMPTY)) { + MutableText compiled = new LiteralText("").formatted(Formatting.ITALIC, Formatting.GRAY); + line.visit(s -> { + compiled.append(s); + return Optional.empty(); + }); + list.add(compiled); + } + + if (isChargable()) { + list.add(new TranslatableText("item.unicopia.amulet.energy", (int)Math.floor(getEnergy(stack)), maxEnergy)); + } + } + + @Override + public boolean hasGlint(ItemStack stack) { + return !isChargable() || stack.hasEnchantments() || getEnergy(stack) > 0; + } + + @Override + public Multimap getAttributeModifiers(EquipmentSlot slot) { + return slot == getSlotType() ? modifiers : ImmutableMultimap.of(); + } + + public boolean isApplicable(ItemStack stack) { + return stack.getItem() == this && getEnergy(stack) > 0; + } + + public boolean isApplicable(LivingEntity entity) { + return isApplicable(entity.getEquippedStack(getSlotType())); + } + + public boolean isChargable() { + return maxEnergy > 0; + } + + public boolean canCharge(ItemStack stack) { + return isChargable() && getEnergy(stack) < maxEnergy; + } + + public float getChargeRemainder(ItemStack stack) { + return Math.max(0, maxEnergy - getEnergy(stack)); + } + + public static void consumeEnergy(ItemStack stack, float amount) { + setEnergy(stack, getEnergy(stack) - amount); + } + + public static float getEnergy(ItemStack stack) { + return stack.hasTag() && stack.getTag().contains("energy") ? stack.getTag().getFloat("energy") : 0; + } + + public static void setEnergy(ItemStack stack, float energy) { + if (energy <= 0) { + stack.removeSubTag("energy"); + } else { + stack.getOrCreateTag().putFloat("energy", energy); + } + } + + public static class Settings extends FabricItemSettings implements ArmorMaterial { + + private final String name; + private int protection; + private float toughness; + private float resistance; + + public Settings(String name) { + this.name = name; + } + + public Settings protection(int protection) { + this.protection = protection; + return this; + } + + public Settings toughness(int toughness) { + this.toughness = toughness; + return this; + } + + public Settings resistance(int resistance) { + this.resistance = resistance; + return this; + } + + @Override + public int getDurability(EquipmentSlot slot) { + return ArmorMaterials.LEATHER.getDurability(slot); + } + + @Override + public int getProtectionAmount(EquipmentSlot slot) { + return protection; + } + + @Override + public int getEnchantability() { + return 0; + } + + @Override + public SoundEvent getEquipSound() { + return SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND; + } + + @Override + public Ingredient getRepairIngredient() { + return Ingredient.EMPTY; + } + + @Override + public String getName() { + return name; + } + + @Override + public float getToughness() { + return toughness; + } + + @Override + public float getKnockbackResistance() { + return resistance; + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 542be7ba..955b9d5b 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -58,6 +58,22 @@ public interface UItems { Item CRYSTAL_HEART = register("crystal_heart", new CrystalHeartItem(new Item.Settings().group(ItemGroup.DECORATIONS).maxCount(1))); Item CRYSTAL_SHARD = register("crystal_shard", new Item(new Item.Settings().group(ItemGroup.MATERIALS))); + Item GEMSTONE = register("gemstone", new Item(new Item.Settings().group(ItemGroup.MATERIALS))); + + Item PEGASUS_FEATHER = register("pegasus_feather", new Item(new Item.Settings().group(ItemGroup.MATERIALS))); + Item GRYPHON_FEATHER = register("gryphon_feather", new Item(new Item.Settings().group(ItemGroup.MATERIALS))); + + Item GOLDEN_FEATHER = register("golden_feather", new Item(new Item.Settings().rarity(Rarity.UNCOMMON).group(ItemGroup.MATERIALS))); + Item GOLDEN_WING = register("golden_wing", new Item(new Item.Settings().rarity(Rarity.UNCOMMON).group(ItemGroup.MATERIALS))); + + AmuletItem PEGASUS_AMULET = register("pegasus_amulet", new AmuletItem(new AmuletItem.Settings("pegasus_amulet") + .maxDamage(890) + .rarity(Rarity.UNCOMMON) + .group(ItemGroup.DECORATIONS), 900, 10)); + /*AmuletItem ALICORN_AMULET = register("alicorn_amulet", new AmuletItem(new AmuletItem.Settings("alicorn_amulet") + .toughness(900000000) + .resistance(90000000) + .group(ItemGroup.DECORATIONS), 0, 0));*/ static T register(String name, T item) { ITEMS.add(item); diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 22e72772..cd4f11b9 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -30,6 +30,16 @@ "item.unicopia.crystal_heart": "Crystal Heart", "item.unicopia.crystal_shard": "Crystal Shard", + "item.unicopia.gemstone": "Gemstone", + + "item.unicopia.pegasus_feather": "Pegasus Feather", + "item.unicopia.gryphon_feather": "Gryphon Feather", + "item.unicopia.golden_feather": "Golden Feather", + "item.unicopia.golden_wing": "Golden Wing", + + "item.unicopia.pegasus_amulet": "Wings of Icarus", + "item.unicopia.pegasus_amulet.lore": "Grants temporary flight to whoever wears it", + "item.unicopia.amulet.energy": "Energy: %d / %d", "item.unicopia.music_disc_pet": "Music Disc", "item.unicopia.music_disc_pet.desc": "Danial Ingram - pet", diff --git a/src/main/resources/assets/unicopia/models/item/gemstone.json b/src/main/resources/assets/unicopia/models/item/gemstone.json new file mode 100644 index 00000000..422261ea --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/gemstone.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/gemstone" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/golden_feather.json b/src/main/resources/assets/unicopia/models/item/golden_feather.json new file mode 100644 index 00000000..4f6dd920 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/golden_feather.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/golden_feather" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/golden_wing.json b/src/main/resources/assets/unicopia/models/item/golden_wing.json new file mode 100644 index 00000000..c44f184f --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/golden_wing.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/golden_wing" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/gryphon_feather.json b/src/main/resources/assets/unicopia/models/item/gryphon_feather.json new file mode 100644 index 00000000..af5d1671 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/gryphon_feather.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/gryphon_feather" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/pegasus_amulet.json b/src/main/resources/assets/unicopia/models/item/pegasus_amulet.json new file mode 100644 index 00000000..7ad2f91b --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/pegasus_amulet.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/pegasus_amulet" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/pegasus_feather.json b/src/main/resources/assets/unicopia/models/item/pegasus_feather.json new file mode 100644 index 00000000..526fd2aa --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/pegasus_feather.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/pegasus_feather" + } +} diff --git a/src/main/resources/assets/unicopia/textures/item/alicorn_amulet.png b/src/main/resources/assets/unicopia/textures/item/alicorn_amulet.png new file mode 100644 index 0000000000000000000000000000000000000000..85abe0453b8b2add8b4905241276793996c55678 GIT binary patch literal 549 zcmV+=0^0qFP)TVs31&#<71d$~HQ%E7uA&a37lwhPK{R>Jc#&qdyZ|#^a89HfevuG=1 z$r6%+z@nz$KoX3MLgODv$PfZ1249EvuCg5p{ldZbPT%+5-P1!#$@F@@vLcgxazDL< zl#*n*t_wgvj%CiWR1d(5jSW$&)h6asuIo-R{3!+gaCu4IwgITu>(gQ~1rV1?QmLD! zNk5L|<8+$02M2sC6v!IJjDW(V06Jl)54zp1%-c3u!(gXaoB&m;RSoWhA(~)&Z4H3! zyF1yBW9~;Inn6I;Fu1|4~KtE^nG8b&26itTB)4>)awCo-frs|rSAK_5RT*M-WfN6CYytExr) z?Qzs-Xx|=;a*{;V_mdMYqG$sAAb}79$8j`?X_^cM11_S7Z(%qypPF{IQmNqkJ~_)0 n{W#X(qeerhB>wXT|69KR+!_|fVSTNM00000NkvXXu0mjf(QpM{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/gemstone.png b/src/main/resources/assets/unicopia/textures/item/gemstone.png new file mode 100644 index 0000000000000000000000000000000000000000..d1faed535bfa4cdb120bd578690a16f286feabff GIT binary patch literal 3298 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/golden_wing.png b/src/main/resources/assets/unicopia/textures/item/golden_wing.png new file mode 100644 index 0000000000000000000000000000000000000000..48be31da55e4a56cc27df678ea6d594dc2980b67 GIT binary patch literal 3216 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/pegasus_amulet.png b/src/main/resources/assets/unicopia/textures/item/pegasus_amulet.png new file mode 100644 index 0000000000000000000000000000000000000000..43dbcad2cc92434f87cdb2b7145cf23ab29b6bd7 GIT binary patch literal 574 zcmV-E0>S->P)my$TxL99s|a0-GrIY_|GrBfX=ij$F2 zBuL^QL1@4TK@>8Wq82$DVuK-pCiO1JJ%_t{q)9vYg&(~4CA;jkl?-Ia|B5{X2=LnZ=JN>!myh)e`&nk`kC2r?6~_zv&u3m=&X z3^?w9c+w2v_xs_GMb>xMRnX<-tMF_M0Glt>6=sty0J(JJ71e5$gAk9$$wmc%pikNw zT$NvfZj)_I1K`c#FqPLg@eExe5cKix_L{s?E)xj)rJ!g7t~o9Sk$3j82YN zzsVWnr|Qdg2LM|mT&YGIK%`gd>Ld={Z~vuZ=xV>Un!~6!Nw3raM5@uY-XPUzGe7DT z#mRzv@MsuatFe)P%Z4r79Q31WwXS5hu!9lZvoJsEWqQJp#gd!5_dSfyode)|`V$Wm zI@1#d#gbb%p?wC9iH+Xr5zfL9?>kJ#u16h$=qZlhSlT1r_XPiofBX;vb=e}}!~g&Q M07*qoM6N<$f_?!9ZU6uP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/pegasus_feather.png b/src/main/resources/assets/unicopia/textures/item/pegasus_feather.png new file mode 100644 index 0000000000000000000000000000000000000000..94c7dc534ef409cbc496f304b25284931de153ec GIT binary patch literal 3285 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 Tgq-k-00000NkvXXu0mjfF-t|) literal 0 HcmV?d00001 diff --git a/src/main/resources/data/unicopia/recipes/gemstone.json b/src/main/resources/data/unicopia/recipes/gemstone.json new file mode 100644 index 00000000..927c960c --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/gemstone.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "**", + "**" + ], + "key": { + "*": { + "item": "unicopia:crystal_shard" + } + }, + "result": { + "item": "unicopia:gemstone" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/golden_feather.json b/src/main/resources/data/unicopia/recipes/golden_feather.json new file mode 100644 index 00000000..aa680c7e --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/golden_feather.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "***", + "*#*", + "***" + ], + "key": { + "#": [ + { "item": "unicopia:pegasus_feather" }, + { "item": "unicopia:gryphon_feather" } + ], + "*": { + "item": "minecraft:gold_nugget" + } + }, + "result": { + "item": "unicopia:golden_feather" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/golden_wing.json b/src/main/resources/data/unicopia/recipes/golden_wing.json new file mode 100644 index 00000000..e150c42f --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/golden_wing.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "***", + "***", + "***" + ], + "key": { + "*": { + "item": "unicopia:golden_feather" + } + }, + "result": { + "item": "unicopia:golden_wing" + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/pegasus_amulet.json b/src/main/resources/data/unicopia/recipes/pegasus_amulet.json new file mode 100644 index 00000000..71d48454 --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/pegasus_amulet.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "*#*" + ], + "key": { + "#": { "item": "unicopia:gemstone" }, + "*": { "item": "unicopia:golden_wing" } + }, + "result": { + "item": "unicopia:pegasus_amulet" + } +} \ No newline at end of file