Added labels to indicate which ability you activated

This commit is contained in:
Sollace 2020-10-11 13:14:11 +02:00
parent a3b833cafa
commit e47743a409
9 changed files with 71 additions and 41 deletions

View file

@ -6,6 +6,8 @@ import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -63,6 +65,14 @@ public interface Ability<T extends Hit> {
return new Identifier(id.getNamespace(), "textures/gui/ability/" + id.getPath() + ".png"); return new Identifier(id.getNamespace(), "textures/gui/ability/" + id.getPath() + ".png");
} }
/**
* The display name for this ability.
*/
default Text getName() {
Identifier id = Abilities.REGISTRY.getId(this);
return new TranslatableText("ability." + id.getNamespace() + "." + id.getPath().replace('/', '.'));
}
/** /**
* Called to actually apply the ability. * Called to actually apply the ability.
* Only called on the server side. * Only called on the server side.

View file

@ -40,11 +40,12 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable {
} }
} }
public void activate(AbilitySlot slot, long page) { public Optional<Ability<?>> activate(AbilitySlot slot, long page) {
Stat stat = getStat(slot); Stat stat = getStat(slot);
if (stat.canSwitchStates()) { if (stat.canSwitchStates()) {
stat.getAbility(page).ifPresent(stat::setActiveAbility); return stat.getAbility(page).flatMap(stat::setActiveAbility);
} }
return Optional.empty();
} }
public Collection<Stat> getStats() { public Collection<Stat> getStats() {
@ -218,13 +219,15 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable {
.count(); .count();
} }
protected synchronized void setActiveAbility(Ability<?> power) { protected synchronized Optional<Ability<?>> setActiveAbility(@Nullable Ability<?> power) {
if (activeAbility.orElse(null) != power) { if (activeAbility.orElse(null) != power) {
triggered = false; triggered = false;
activeAbility = Optional.ofNullable(power); activeAbility = Optional.ofNullable(power);
setWarmup(activeAbility.map(p -> p.getWarmupTime(player)).orElse(0)); setWarmup(activeAbility.map(p -> p.getWarmupTime(player)).orElse(0));
setCooldown(0); setCooldown(0);
return activeAbility;
} }
return Optional.empty();
} }
protected synchronized Optional<Ability<?>> getActiveAbility() { protected synchronized Optional<Ability<?>> getActiveAbility() {

View file

@ -7,6 +7,7 @@ import java.util.Set;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.ability.Ability;
import com.minelittlepony.unicopia.ability.AbilityDispatcher; import com.minelittlepony.unicopia.ability.AbilityDispatcher;
import com.minelittlepony.unicopia.ability.AbilitySlot; import com.minelittlepony.unicopia.ability.AbilitySlot;
import com.minelittlepony.unicopia.client.gui.UHud; import com.minelittlepony.unicopia.client.gui.UHud;
@ -17,7 +18,7 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.options.KeyBinding; import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.text.LiteralText; import net.minecraft.text.TranslatableText;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
public class KeyBindingsHandler { public class KeyBindingsHandler {
@ -82,7 +83,7 @@ public class KeyBindingsHandler {
PressedState state = checkPressed(i); PressedState state = checkPressed(i);
if (state != PressedState.UNCHANGED) { if (state != PressedState.UNCHANGED) {
if (state == PressedState.PRESSED) { if (state == PressedState.PRESSED) {
abilities.activate(slot, page); abilities.activate(slot, page).map(Ability::getName).ifPresent(UHud.INSTANCE::setMessage);
} else { } else {
abilities.clear(slot); abilities.clear(slot);
} }
@ -94,7 +95,7 @@ public class KeyBindingsHandler {
private void changePage(MinecraftClient client, long max, int sigma) { private void changePage(MinecraftClient client, long max, int sigma) {
page += sigma; page += sigma;
client.getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.75F + (0.25F * sigma))); client.getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.75F + (0.25F * sigma)));
UHud.instance.setMessage(new LiteralText(page + " of " + max)); UHud.INSTANCE.setMessage(new TranslatableText("gui.unicopia.page_num", page, max));
} }
private PressedState checkPressed(KeyBinding binding) { private PressedState checkPressed(KeyBinding binding) {
@ -104,7 +105,6 @@ public class KeyBindingsHandler {
return PressedState.UNPRESSED; return PressedState.UNPRESSED;
} }
return PressedState.UNCHANGED; return PressedState.UNCHANGED;
} }

View file

@ -63,7 +63,7 @@ public class UnicopiaClient implements ClientModInitializer {
private void onTick(MinecraftClient client) { private void onTick(MinecraftClient client) {
KeyBindingsHandler.INSTANCE.tick(client); KeyBindingsHandler.INSTANCE.tick(client);
UHud.instance.tick(); UHud.INSTANCE.tick();
} }
private void onScreenInit(Screen screen, ButtonList buttons) { private void onScreenInit(Screen screen, ButtonList buttons) {

View file

@ -19,9 +19,10 @@ import net.minecraft.util.math.Matrix4f;
class ManaRingSlot extends Slot { class ManaRingSlot extends Slot {
private static final double TWO_PI = Math.PI * 2; private static final double TWO_PI = Math.PI * 2;
public ManaRingSlot(UHud uHud, AbilitySlot normalSlot, AbilitySlot backupSlot, int x, int y, int padding, int size, public ManaRingSlot(UHud uHud, AbilitySlot normalSlot, AbilitySlot backupSlot, int x, int y) {
int labelOffset, int iconSize) { super(uHud, normalSlot, backupSlot, x, y, 8, 49, 33, 43, 42);
super(uHud, normalSlot, backupSlot, x, y, padding, size, labelOffset, iconSize); background(0, 5);
foreground(0, 59);
} }
@Override @Override

View file

@ -21,37 +21,44 @@ class Slot {
private float lastCooldown; private float lastCooldown;
private final int slotPadding; private final int slotPadding;
private final int labelOffset; private final int labelX;
private final int labelY;
private final int size; private final int size;
private final int iconSize; private final int iconSize;
private int textureU; private int backgroundU;
private int textureV; private int backgroundV;
private int backgroundU = 105; private int foregroundU = 105;
private int backgroundV = 105; private int foregroundV = 105;
public Slot(UHud uHud, AbilitySlot normalSlot, AbilitySlot backupSlot, int x, int y, int padding, int size, int labelOffset, int iconSize) { public Slot(UHud uHud, AbilitySlot normalSlot, AbilitySlot backupSlot, int x, int y) {
this(uHud, normalSlot, backupSlot, x, y, 3, 22, 17, 17, 19);
background(80, 105);
}
public Slot(UHud uHud, AbilitySlot normalSlot, AbilitySlot backupSlot, int x, int y, int padding, int size, int labelX, int labelY, int iconSize) {
this.uHud = uHud; this.uHud = uHud;
this.aSlot = normalSlot; this.aSlot = normalSlot;
this.bSlot = backupSlot; this.bSlot = backupSlot;
this.x = x; this.x = x;
this.y = y; this.y = y;
this.slotPadding = padding; this.slotPadding = padding;
this.labelOffset = labelOffset; this.labelX = labelX;
this.labelY = labelY;
this.size = size; this.size = size;
this.iconSize = iconSize; this.iconSize = iconSize;
} }
Slot background(int u, int v) { Slot background(int u, int v) {
textureU = u; backgroundU = u;
textureV = v; backgroundV = v;
return this; return this;
} }
Slot foreground(int u, int v) { Slot foreground(int u, int v) {
backgroundU = u; foregroundU = u;
backgroundV = v; foregroundV = v;
return this; return this;
} }
@ -62,11 +69,10 @@ class Slot {
float cooldown = abilities.getStat(bSwap ? bSlot : aSlot).getFillProgress(); float cooldown = abilities.getStat(bSwap ? bSlot : aSlot).getFillProgress();
// background // background
UHud.drawTexture(matrices, 0, 0, textureU, textureV, size, size, 128, 128); UHud.drawTexture(matrices, 0, 0, backgroundU, backgroundV, size, size, 128, 128);
uHud.renderAbilityIcon(matrices, abilities.getStat(bSwap ? bSlot : aSlot), slotPadding / 2, slotPadding / 2, iconSize, iconSize, iconSize, iconSize); 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); float lerpCooldown = MathHelper.lerp(tickDelta, cooldown, lastCooldown);
@ -88,15 +94,14 @@ class Slot {
protected void renderContents(MatrixStack matrices, AbilityDispatcher abilities, boolean bSwap, float tickDelta) { protected void renderContents(MatrixStack matrices, AbilityDispatcher abilities, boolean bSwap, float tickDelta) {
// contents // contents
UHud.drawTexture(matrices, 0, 0, foregroundU, foregroundV, size, size, 128, 128);
UHud.drawTexture(matrices, 0, 0, backgroundU, backgroundV, size, size, 128, 128);
} }
void renderLabel(MatrixStack matrices, AbilityDispatcher abilities, float tickDelta) { void renderLabel(MatrixStack matrices, AbilityDispatcher abilities, float tickDelta) {
Text label = KeyBindingsHandler.INSTANCE.getBinding(aSlot).getBoundKeyLocalizedText(); Text label = KeyBindingsHandler.INSTANCE.getBinding(aSlot).getBoundKeyLocalizedText();
matrices.push(); matrices.push();
matrices.translate(x + labelOffset, y + labelOffset, 0); matrices.translate(x + labelX, y + labelY, 0);
matrices.scale(0.5F, 0.5F, 0.5F); matrices.scale(0.5F, 0.5F, 0.5F);
UHud.drawTextWithShadow(matrices, uHud.font, label, 0, 0, 0xFFFFFF); UHud.drawTextWithShadow(matrices, uHud.font, label, 0, 0, 0xFFFFFF);

View file

@ -26,7 +26,7 @@ import net.minecraft.util.Util;
public class UHud extends DrawableHelper { public class UHud extends DrawableHelper {
public static final UHud instance = new UHud(); public static final UHud INSTANCE = new UHud();
public static final Identifier HUD_TEXTURE = new Identifier("unicopia", "textures/gui/hud.png"); public static final Identifier HUD_TEXTURE = new Identifier("unicopia", "textures/gui/hud.png");
@ -35,9 +35,9 @@ public class UHud extends DrawableHelper {
final MinecraftClient client = MinecraftClient.getInstance(); final MinecraftClient client = MinecraftClient.getInstance();
private final List<Slot> slots = Util.make(new ArrayList<>(), slots -> { private final List<Slot> slots = Util.make(new ArrayList<>(), slots -> {
slots.add(new ManaRingSlot(this, AbilitySlot.PRIMARY, AbilitySlot.PASSIVE, 0, 0, 8, 49, 38, 42).background(0, 5).foreground(0, 59)); slots.add(new ManaRingSlot(this, AbilitySlot.PRIMARY, AbilitySlot.PASSIVE, 0, 0));
slots.add(new Slot(this, AbilitySlot.SECONDARY, AbilitySlot.SECONDARY, 26, -5, 3, 22, 17, 19).background(80, 105)); slots.add(new Slot(this, AbilitySlot.SECONDARY, AbilitySlot.SECONDARY, 26, -5));
slots.add(new Slot(this, AbilitySlot.TERTIARY, AbilitySlot.TERTIARY, 36, 19, 3, 22, 17, 19).background(80, 105)); slots.add(new Slot(this, AbilitySlot.TERTIARY, AbilitySlot.TERTIARY, 36, 19));
}); });
@Nullable @Nullable

View file

@ -14,6 +14,6 @@ import net.minecraft.client.util.math.MatrixStack;
public class MixinInGameHud { public class MixinInGameHud {
@Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;F)V", at = @At("HEAD")) @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;F)V", at = @At("HEAD"))
private void onRender(MatrixStack stack, float tickDelta, CallbackInfo info) { private void onRender(MatrixStack stack, float tickDelta, CallbackInfo info) {
UHud.instance.render((InGameHud)(Object)this, stack, tickDelta); UHud.INSTANCE.render((InGameHud)(Object)this, stack, tickDelta);
} }
} }

View file

@ -26,6 +26,8 @@
"unicopia.effect.tribe.stage.determination": "As your bones realign you are filled determination.", "unicopia.effect.tribe.stage.determination": "As your bones realign you are filled determination.",
"unicopia.effect.tribe.stage.resurection": "Knowing you will return to this world as a %s", "unicopia.effect.tribe.stage.resurection": "Knowing you will return to this world as a %s",
"effect.food_poisoning": "Food Poisoning",
"effect.unicopia.change_race_earth": "Earth Pony Metamorphosis", "effect.unicopia.change_race_earth": "Earth Pony Metamorphosis",
"item.minecraft.potion.effect.unicopia.tribe_swap_earth": "Potion of Earth Pony Metamorphosis", "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.splash_potion.effect.unicopia.tribe_swap_earth": "Splash Potion of Earth Pony Metamorphosis",
@ -123,7 +125,25 @@
"toxicity.severe.name": "Toxic", "toxicity.severe.name": "Toxic",
"toxicity.lethal.name": "Lethal", "toxicity.lethal.name": "Lethal",
"ability.unicopia.shoot": "Magic Missle",
"ability.unicopia.cast": "Counterspell",
"ability.unicopia.teleport": "Teleport",
"ability.unicopia.grow": "Earthly Nourishment",
"ability.unicopia.stomp": "Ground Pound",
"ability.unicopia.pummel": "Crushing Blow",
"ability.unicopia.carry": "Pickup/Drop Passenger",
"ability.unicopia.hang": "Cling to Ceiling",
"ability.unicopia.eee": "Deafening Screech",
"gui.unicopia": "Unicopia...", "gui.unicopia": "Unicopia...",
"gui.unicopia.page_num": "%d of %d",
"unicopia.category.name": "Pony Abilities",
"key.unicopia.primary": "Primary Ability",
"key.unicopia.secondary": "Secondary Ability",
"key.unicopia.tertiary": "Tertiary Ability",
"key.unicopia.passive": "Passive Ability",
"commands.race.success.self": "Your race has been updated", "commands.race.success.self": "Your race has been updated",
"commands.race.success.otherself": "%1$s changed race to %2$s", "commands.race.success.otherself": "%1$s changed race to %2$s",
@ -206,13 +226,6 @@
"unicopia.race.bat": "Bat Pony", "unicopia.race.bat": "Bat Pony",
"unicopia.race.bat.alt": "Bat Ponies", "unicopia.race.bat.alt": "Bat Ponies",
"unicopia.category.name": "Pony Abilities",
"key.unicopia.primary": "Primary Ability",
"key.unicopia.secondary": "Secondary Ability",
"key.unicopia.tertiary": "Tertiary Ability",
"key.unicopia.passive": "Passive Ability",
"death.attack.tribe_swap": "%1$s was reborn into a different tribe", "death.attack.tribe_swap": "%1$s was reborn into a different tribe",
"death.attack.magical_exhaustion": "%1$s exhausted themselves", "death.attack.magical_exhaustion": "%1$s exhausted themselves",
"death.attack.alicorn_amulet": "%1$s was driven insane", "death.attack.alicorn_amulet": "%1$s was driven insane",
@ -230,8 +243,6 @@
"death.attack.food_poisoning": "%1$s died of food poisoning", "death.attack.food_poisoning": "%1$s died of food poisoning",
"death.attack.food_poisoning.attacker": "%2$s poisoned %1$s to death", "death.attack.food_poisoning.attacker": "%2$s poisoned %1$s to death",
"effect.food_poisoning": "Food Poisoning",
"unicopia.subtitle.flap_wings": "Wing Flaps", "unicopia.subtitle.flap_wings": "Wing Flaps",
"unicopia.subtitle.wind_rush": "Wind Gust", "unicopia.subtitle.wind_rush": "Wind Gust",
"unicopia.subtitle.insects": "Insects Scurrying", "unicopia.subtitle.insects": "Insects Scurrying",