If there isn't a primary ability, use the passive ability instead

This commit is contained in:
Sollace 2022-01-02 18:07:28 +02:00
parent f5d4bfeb5e
commit 497ed10cf4
4 changed files with 36 additions and 19 deletions

View file

@ -2,16 +2,27 @@ package com.minelittlepony.unicopia.ability;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.BiFunction;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.util.Registries; import com.minelittlepony.unicopia.util.Registries;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
public interface Abilities { public interface Abilities {
Map<AbilitySlot, Set<Ability<?>>> BY_SLOT = new EnumMap<>(AbilitySlot.class);
Registry<Ability<?>> REGISTRY = Registries.createSimple(new Identifier("unicopia", "abilities")); Registry<Ability<?>> REGISTRY = Registries.createSimple(new Identifier("unicopia", "abilities"));
Map<AbilitySlot, Set<Ability<?>>> BY_SLOT = new EnumMap<>(AbilitySlot.class);
BiFunction<AbilitySlot, Race, List<Ability<?>>> 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 // unicorn / alicorn
Ability<?> CAST = register(new UnicornCastingAbility(), "cast", AbilitySlot.PRIMARY); Ability<?> CAST = register(new UnicornCastingAbility(), "cast", AbilitySlot.PRIMARY);
@ -45,4 +56,5 @@ public interface Abilities {
BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>()).add(power); BY_SLOT.computeIfAbsent(slot, s -> new LinkedHashSet<>()).add(power);
return Registry.register(REGISTRY, id, power); return Registry.register(REGISTRY, id, power);
} }
} }

View file

@ -1,12 +1,10 @@
package com.minelittlepony.unicopia.ability; package com.minelittlepony.unicopia.ability;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -70,6 +68,10 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable {
return stats.computeIfAbsent(slot, Stat::new); return stats.computeIfAbsent(slot, Stat::new);
} }
public boolean isFilled(AbilitySlot slot) {
return getStat(slot).getMaxPage() > 0;
}
public long getMaxPage() { public long getMaxPage() {
if (maxPage < 0 || prevRace != player.getSpecies()) { if (maxPage < 0 || prevRace != player.getSpecies()) {
prevRace = player.getSpecies(); prevRace = player.getSpecies();
@ -221,25 +223,16 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable {
} }
public Optional<Ability<?>> getAbility(long page) { public Optional<Ability<?>> getAbility(long page) {
Race race = player.getSpecies(); List<Ability<?>> found = Abilities.BY_SLOT_AND_RACE.apply(slot, player.getSpecies());
List<Ability<?>> found = Abilities.BY_SLOT.computeIfAbsent(slot, c -> Collections.emptySet())
.stream()
.filter(a -> a.canUse(race))
.collect(Collectors.toList());
if (found.isEmpty()) { if (found.isEmpty()) {
return Optional.empty(); 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() { public long getMaxPage() {
Race race = player.getSpecies(); return Abilities.BY_SLOT_AND_RACE.apply(slot, player.getSpecies()).size();
return Abilities.BY_SLOT.computeIfAbsent(slot, c -> Collections.emptySet())
.stream()
.filter(a -> a.canUse(race))
.count();
} }
protected synchronized Optional<Ability<?>> setActiveAbility(@Nullable Ability<?> power) { protected synchronized Optional<Ability<?>> setActiveAbility(@Nullable Ability<?> power) {

View file

@ -78,7 +78,10 @@ public class KeyBindingsHandler {
} else { } else {
for (Binding i : keys.keySet()) { for (Binding i : keys.keySet()) {
AbilitySlot slot = keys.get(i); 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; slot = AbilitySlot.PASSIVE;
} }

View file

@ -75,18 +75,27 @@ class Slot {
} }
void renderBackground(MatrixStack matrices, AbilityDispatcher abilities, boolean bSwap, float tickDelta) { 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.setShaderColor(1, 1, 1, 1);
RenderSystem.enableBlend(); RenderSystem.enableBlend();
matrices.push(); matrices.push();
matrices.translate(getX(), getY(), 0); matrices.translate(getX(), getY(), 0);
float cooldown = abilities.getStat(bSwap ? bSlot : aSlot).getFillProgress();
// background // background
UHud.drawTexture(matrices, 0, 0, backgroundU, backgroundV, size, size, 128, 128); UHud.drawTexture(matrices, 0, 0, backgroundU, backgroundV, size, size, 128, 128);
AbilityDispatcher.Stat stat = abilities.getStat(bSwap ? bSlot : aSlot);
int sz = iconSize - slotPadding; 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) { if (cooldown > 0 && cooldown <= 1) {
float lerpCooldown = MathHelper.lerp(tickDelta, cooldown, lastCooldown); float lerpCooldown = MathHelper.lerp(tickDelta, cooldown, lastCooldown);