diff --git a/src/main/java/com/minelittlepony/unicopia/ability/Ability.java b/src/main/java/com/minelittlepony/unicopia/ability/Ability.java index ecbbe0dc..286cb29b 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/Ability.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/Ability.java @@ -10,6 +10,12 @@ import net.minecraft.util.Identifier; import net.minecraft.world.World; public interface Ability { + + /** + * The amount of energy this ability is expected to cost if the player were to cast it. + */ + double getCostEstimate(Pony player); + /** * Returns the number of ticks the player must hold the ability key to trigger this ability. */ diff --git a/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java index 37436dc2..f1b70924 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java @@ -1,10 +1,10 @@ package com.minelittlepony.unicopia.ability; +import java.util.Collection; import java.util.Collections; import java.util.EnumMap; import java.util.Map; import java.util.Optional; - import javax.annotation.Nullable; import com.minelittlepony.unicopia.Race; @@ -47,6 +47,10 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable { } } + public Collection getStats() { + return stats.values(); + } + public Stat getStat(AbilitySlot slot) { return stats.computeIfAbsent(slot, Stat::new); } @@ -141,6 +145,13 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable { return maxWarmup <= 0 ? 0 : ((float)warmup / (float)maxWarmup); } + public double getCost(long page) { + if (warmup <= 0) { + return 0; + } + return getAbility(page).map(ability -> ability.getCostEstimate(player)).orElse(0D); + } + public void setWarmup(int value) { maxWarmup = value; warmup = value; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java index bd7ad697..34bd84ef 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java @@ -35,6 +35,11 @@ public class BatEeeeAbility implements Ability { return 1; } + @Override + public double getCostEstimate(Pony player) { + return 0; + } + @Override public boolean canUse(Race race) { return race == Race.BAT; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/BatPonyHangAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/BatPonyHangAbility.java index 5969282f..5cd47fc1 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/BatPonyHangAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/BatPonyHangAbility.java @@ -27,6 +27,11 @@ public class BatPonyHangAbility implements Ability { return 0; } + @Override + public double getCostEstimate(Pony player) { + return 0; + } + @Override public boolean canUse(Race race) { return race == Race.BAT; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/CarryAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/CarryAbility.java index f5d85675..45206bec 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/CarryAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/CarryAbility.java @@ -25,6 +25,11 @@ public class CarryAbility implements Ability { return 10; } + @Override + public double getCostEstimate(Pony player) { + return 0; + } + @Override public boolean canUse(Race race) { return race.canFly(); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java index 3421c204..bbdf5fc7 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java @@ -88,6 +88,11 @@ public class ChangelingFeedAbility implements Ability { return list.stream().map(i -> (LivingEntity)i).collect(Collectors.toList()); } + @Override + public double getCostEstimate(Pony player) { + return 0; + } + @Override public void apply(Pony iplayer, Hit data) { PlayerEntity player = iplayer.getMaster(); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java index 2a26d732..408edbfd 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java @@ -44,6 +44,11 @@ public class EarthPonyGrowAbility implements Ability { return Pos.SERIALIZER; } + @Override + public double getCostEstimate(Pony player) { + return 10; + } + @Override public void apply(Pony player, Pos data) { int count = 0; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyStompAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyStompAbility.java index d6accd54..cb762815 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyStompAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyStompAbility.java @@ -66,6 +66,11 @@ public class EarthPonyStompAbility implements Ability { return race.canUseEarth(); } + @Override + public double getCostEstimate(Pony player) { + return rad; + } + @Nullable @Override public Multi tryActivate(Pony player) { @@ -91,7 +96,6 @@ public class EarthPonyStompAbility implements Ability { return null; } - @Override public Hit.Serializer getSerializer() { return Multi.SERIALIZER; diff --git a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java index d3b132ea..3d60055a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java @@ -40,6 +40,21 @@ public class UnicornCastingAbility implements Ability { return Hit.SERIALIZER; } + @Override + public double getCostEstimate(Pony player) { + if (player.hasSpell()) { + String current = player.getSpell(true).getName(); + String replaced = Streams.stream(player.getMaster().getItemsHand()) + .map(SpellRegistry::getKeyFromStack) + .filter(i -> i != null && !current.equals(i)) + .findFirst() + .orElse(null); + return replaced == null ? 2 : 4; + } + + return 4; + } + @Override public void apply(Pony player, Hit data) { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/UnicornProjectileAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/UnicornProjectileAbility.java index 52e01e1d..d5067183 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/UnicornProjectileAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/UnicornProjectileAbility.java @@ -53,9 +53,14 @@ public class UnicornProjectileAbility implements Ability { return Hit.SERIALIZER; } + @Override + public double getCostEstimate(Pony player) { + return 7; + } + @Override public void apply(Pony player, Hit data) { - player.subtractEnergyCost(7); + player.subtractEnergyCost(getCostEstimate(player)); getThrown(player).orElseGet(AttractiveSpell::new).toss(player); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java index 97a40855..d88f5327 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java @@ -54,6 +54,16 @@ public class UnicornTeleportAbility implements Ability { return race.canCast(); } + @Override + public double getCostEstimate(Pony player) { + Pos pos = tryActivate(player); + + if (pos == null) { + return 0; + } + return pos.distanceTo(player) / 10; + } + @Override public Pos tryActivate(Pony player) { int maxDistance = player.getMaster().isCreative() ? 1000 : 100; @@ -118,7 +128,7 @@ public class UnicornTeleportAbility implements Ability { iplayer.getWorld().playSound(null, iplayer.getOrigin(), SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, 1, 1); PlayerEntity player = iplayer.getMaster(); - double distance = Math.sqrt(player.squaredDistanceTo(data.x, data.y, data.z)) / 10; + double distance = data.distanceTo(iplayer) / 10; if (player.hasVehicle()) { Entity mount = player.getVehicle(); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/data/Pos.java b/src/main/java/com/minelittlepony/unicopia/ability/data/Pos.java index 412ddb54..16ad3bdb 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/data/Pos.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/data/Pos.java @@ -1,5 +1,7 @@ package com.minelittlepony.unicopia.ability.data; +import com.minelittlepony.unicopia.ability.magic.Caster; + import net.minecraft.network.PacketByteBuf; import net.minecraft.util.math.BlockPos; @@ -39,4 +41,8 @@ public class Pos extends Hit { public BlockPos pos() { return new BlockPos(x, y, z); } + + public double distanceTo(Caster caster) { + return Math.sqrt(caster.getEntity().squaredDistanceTo(x, y, z)); + } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/ManaRingSlot.java b/src/main/java/com/minelittlepony/unicopia/client/gui/ManaRingSlot.java index 9173f938..7184f262 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/ManaRingSlot.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/ManaRingSlot.java @@ -2,6 +2,7 @@ package com.minelittlepony.unicopia.client.gui; import com.minelittlepony.unicopia.ability.AbilityDispatcher; import com.minelittlepony.unicopia.ability.AbilitySlot; +import com.minelittlepony.unicopia.client.KeyBindingsHandler; import com.minelittlepony.unicopia.entity.player.MagicReserves; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.MagicReserves.Bar; @@ -32,6 +33,27 @@ class ManaRingSlot extends Slot { double arcBegin = 0; arcBegin = renderRing(matrices, 17, 13, 0, mana.getMana(), 0xFF88FF99); + + if (!uHud.client.player.isCreative()) { + double cost = abilities.getStats().stream() + .mapToDouble(s -> s.getCost(KeyBindingsHandler.INSTANCE.page)) + .reduce(Double::sum) + .getAsDouble(); + + if (cost > 0) { + float percent = mana.getMana().getPercentFill(); + float max = mana.getMana().getMax(); + + cost = Math.min(max, cost) / max; + + cost = Math.min(percent, cost); + + double angle = cost * Math.PI * 2; + + renderArc(matrices, 13, 17, arcBegin - angle, angle, 0xFFFF0099, false); + } + } + arcBegin = renderRing(matrices, 17, 13, arcBegin, mana.getEnergy(), 0xFF002299); matrices.pop(); @@ -42,7 +64,7 @@ class ManaRingSlot extends Slot { private double renderRing(MatrixStack matrices, double outerRadius, double innerRadius, double offsetAngle, Bar bar, int color) { double fill = bar.getPercentFill() * Math.PI * 2; - renderArc(matrices, innerRadius, outerRadius, offsetAngle, fill, color, false); + renderArc(matrices, innerRadius, outerRadius, offsetAngle, fill, color, true); return offsetAngle + fill; } diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java b/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java index 285845a2..88d4e736 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java @@ -67,7 +67,7 @@ class Slot { uHud.renderAbilityIcon(matrices, abilities.getStat(bSwap ? bSlot : aSlot), slotPadding / 2, slotPadding / 2, iconSize, iconSize, iconSize, iconSize); - if (cooldown > 0 && cooldown < 1) { + if (cooldown > 0 && cooldown <= 1) { float lerpCooldown = MathHelper.lerp(tickDelta, cooldown, lastCooldown); lastCooldown = lerpCooldown; 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 dede1505..ded24429 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -305,7 +305,7 @@ public class Pony implements Caster, Equine, Transmi } if (!getSpecies().canFly() || !gravity.isFlying()) { - mana.getMana().add(60); + mana.getMana().add(15); } attributes.applyAttributes(this); @@ -368,7 +368,7 @@ public class Pony implements Caster, Equine, Transmi @Override public boolean subtractEnergyCost(double foodSubtract) { - if (!entity.abilities.creativeMode) { + if (!entity.isCreative()) { float currentMana = mana.getMana().get(); float foodManaRatio = 10;