From 497ed10cf42be586fe873722b7b5e754435d2a69 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 2 Jan 2022 18:07:28 +0200 Subject: [PATCH] If there isn't a primary ability, use the passive ability instead --- .../unicopia/ability/Abilities.java | 14 ++++++++++++- .../unicopia/ability/AbilityDispatcher.java | 21 +++++++------------ .../unicopia/client/KeyBindingsHandler.java | 5 ++++- .../unicopia/client/gui/Slot.java | 15 ++++++++++--- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java index 94d4525c..142103e9 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java @@ -2,16 +2,27 @@ package com.minelittlepony.unicopia.ability; import java.util.EnumMap; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.BiFunction; + +import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.util.Registries; import net.minecraft.util.Identifier; +import net.minecraft.util.Util; import net.minecraft.util.registry.Registry; public interface Abilities { - Map>> BY_SLOT = new EnumMap<>(AbilitySlot.class); Registry> REGISTRY = Registries.createSimple(new Identifier("unicopia", "abilities")); + Map>> BY_SLOT = new EnumMap<>(AbilitySlot.class); + BiFunction>> BY_SLOT_AND_RACE = Util.memoize((slot, race) -> { + return BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>()) + .stream() + .filter(a -> a.canUse(race)) + .toList(); + }); // unicorn / alicorn Ability CAST = register(new UnicornCastingAbility(), "cast", AbilitySlot.PRIMARY); @@ -45,4 +56,5 @@ public interface Abilities { BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>()).add(power); return Registry.register(REGISTRY, id, power); } + } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java index 5eebe8a4..cc895429 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java @@ -1,12 +1,10 @@ package com.minelittlepony.unicopia.ability; import java.util.Collection; -import java.util.Collections; import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; import org.jetbrains.annotations.Nullable; @@ -70,6 +68,10 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable { return stats.computeIfAbsent(slot, Stat::new); } + public boolean isFilled(AbilitySlot slot) { + return getStat(slot).getMaxPage() > 0; + } + public long getMaxPage() { if (maxPage < 0 || prevRace != player.getSpecies()) { prevRace = player.getSpecies(); @@ -221,25 +223,16 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable { } public Optional> getAbility(long page) { - Race race = player.getSpecies(); - List> found = Abilities.BY_SLOT.computeIfAbsent(slot, c -> Collections.emptySet()) - .stream() - .filter(a -> a.canUse(race)) - .collect(Collectors.toList()); + List> found = Abilities.BY_SLOT_AND_RACE.apply(slot, player.getSpecies()); if (found.isEmpty()) { return Optional.empty(); } - page = Math.min(found.size() - 1, page); - return Optional.ofNullable(found.get((int)page)); + return Optional.ofNullable(found.get((int)Math.min(found.size() - 1, page))); } public long getMaxPage() { - Race race = player.getSpecies(); - return Abilities.BY_SLOT.computeIfAbsent(slot, c -> Collections.emptySet()) - .stream() - .filter(a -> a.canUse(race)) - .count(); + return Abilities.BY_SLOT_AND_RACE.apply(slot, player.getSpecies()).size(); } protected synchronized Optional> setActiveAbility(@Nullable Ability power) { diff --git a/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java b/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java index b3392584..7d980ee7 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java @@ -78,7 +78,10 @@ public class KeyBindingsHandler { } else { for (Binding i : keys.keySet()) { AbilitySlot slot = keys.get(i); - if (slot == AbilitySlot.PRIMARY && client.options.keySneak.isPressed()) { + if (slot == AbilitySlot.PRIMARY && client.options.keySneak.isPressed() && abilities.isFilled(AbilitySlot.PASSIVE)) { + slot = AbilitySlot.PASSIVE; + } + if (slot == AbilitySlot.PRIMARY && !abilities.isFilled(slot)) { slot = AbilitySlot.PASSIVE; } 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 6c7dcec7..cc05d25a 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/Slot.java @@ -75,18 +75,27 @@ class Slot { } void renderBackground(MatrixStack matrices, AbilityDispatcher abilities, boolean bSwap, float tickDelta) { + + if (aSlot != bSlot) { + bSwap |= !abilities.isFilled(aSlot); + bSwap &= abilities.isFilled(bSlot); + } + RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.enableBlend(); matrices.push(); matrices.translate(getX(), getY(), 0); - float cooldown = abilities.getStat(bSwap ? bSlot : aSlot).getFillProgress(); - // background UHud.drawTexture(matrices, 0, 0, backgroundU, backgroundV, size, size, 128, 128); + AbilityDispatcher.Stat stat = abilities.getStat(bSwap ? bSlot : aSlot); + + int sz = iconSize - slotPadding; - uHud.renderAbilityIcon(matrices, abilities.getStat(bSwap ? bSlot : aSlot), slotPadding, slotPadding, sz, sz, sz, sz); + uHud.renderAbilityIcon(matrices, stat, slotPadding, slotPadding, sz, sz, sz, sz); + + float cooldown = stat.getFillProgress(); if (cooldown > 0 && cooldown <= 1) { float lerpCooldown = MathHelper.lerp(tickDelta, cooldown, lastCooldown);