Unicopia/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java

170 lines
5.8 KiB
Java
Raw Normal View History

package com.minelittlepony.unicopia.client;
2020-01-16 12:35:46 +01:00
import java.util.HashMap;
2020-04-15 15:45:57 +02:00
import java.util.HashSet;
import java.util.Map;
2020-04-15 15:45:57 +02:00
import java.util.Set;
2020-01-16 12:35:46 +01:00
2020-05-06 15:55:25 +02:00
import org.lwjgl.glfw.GLFW;
import com.minelittlepony.unicopia.USounds;
2022-12-27 20:40:24 +01:00
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.ability.AbilityDispatcher;
2020-05-06 15:55:25 +02:00
import com.minelittlepony.unicopia.ability.AbilitySlot;
import com.minelittlepony.unicopia.ability.ActivationType;
import com.minelittlepony.unicopia.client.gui.UHud;
import com.minelittlepony.unicopia.entity.player.Pony;
2020-01-16 12:35:46 +01:00
2020-06-26 11:44:47 +02:00
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
2020-01-16 12:35:46 +01:00
import net.minecraft.client.MinecraftClient;
2021-08-04 15:38:03 +02:00
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.text.Text;
import net.minecraft.util.math.MathHelper;
2020-01-16 12:35:46 +01:00
2020-09-22 18:13:20 +02:00
public class KeyBindingsHandler {
private static final String KEY_CATEGORY = "unicopia.category.name";
2020-09-22 18:13:20 +02:00
public static final KeyBindingsHandler INSTANCE = new KeyBindingsHandler();
static void bootstrap() {}
private final Map<Binding, AbilitySlot> keys = new HashMap<>();
private final Map<AbilitySlot, Binding> reverse = new HashMap<>();
2020-01-16 12:35:46 +01:00
private final Binding pageDown = register(GLFW.GLFW_KEY_PAGE_DOWN, "hud_page_dn");
private final Binding pageUp = register(GLFW.GLFW_KEY_PAGE_UP, "hud_page_up");
2020-04-15 15:45:57 +02:00
private final Set<KeyBinding> pressed = new HashSet<>();
2020-01-16 12:35:46 +01:00
2020-05-06 15:55:25 +02:00
public KeyBindingsHandler() {
addKeybind(GLFW.GLFW_KEY_R, AbilitySlot.PRIMARY);
addKeybind(GLFW.GLFW_KEY_G, AbilitySlot.SECONDARY);
addKeybind(GLFW.GLFW_KEY_V, AbilitySlot.TERTIARY);
}
2020-01-16 12:35:46 +01:00
public Binding getBinding(AbilitySlot slot) {
2020-09-22 18:13:20 +02:00
return reverse.get(slot);
}
2020-05-06 15:55:25 +02:00
public void addKeybind(int code, AbilitySlot slot) {
Binding binding = register(code, slot.name().toLowerCase());
2020-09-22 18:13:20 +02:00
reverse.put(slot, binding);
keys.put(binding, slot);
2020-01-16 12:35:46 +01:00
}
Binding register(int code, String name) {
return new Binding(KeyBindingHelper.registerKeyBinding(new KeyBinding("key.unicopia." + name, code, KEY_CATEGORY)));
}
public void tick(MinecraftClient client) {
2020-01-16 12:35:46 +01:00
if (client.currentScreen != null
|| client.player == null) {
return;
}
2020-04-15 18:12:00 +02:00
Pony iplayer = Pony.of(client.player);
AbilityDispatcher abilities = iplayer.getAbilities();
2023-06-02 21:20:30 +02:00
int maxPage = abilities.getMaxPage();
2020-01-16 12:35:46 +01:00
2023-06-02 21:20:30 +02:00
int page = MathHelper.clamp(Unicopia.getConfig().hudPage.get(), 0, maxPage);
if (page > 0 && pageDown.getState() == PressedState.PRESSED) {
changePage(client, maxPage, -1);
} else if (page < maxPage && pageUp.getState() == PressedState.PRESSED) {
changePage(client, maxPage, 1);
} else {
for (Binding i : keys.keySet()) {
AbilitySlot slot = keys.get(i);
2022-03-26 20:34:15 +01:00
if (slot == AbilitySlot.PRIMARY && client.options.sneakKey.isPressed() && abilities.isFilled(AbilitySlot.PASSIVE)) {
slot = AbilitySlot.PASSIVE;
}
if (slot == AbilitySlot.PRIMARY && !abilities.isFilled(slot)) {
slot = AbilitySlot.PASSIVE;
}
2020-05-06 15:55:25 +02:00
PressedState state = i.getState();
if (state != PressedState.UNCHANGED) {
if (state == PressedState.PRESSED) {
abilities.activate(slot, page).map(a -> a.getName(iplayer)).ifPresent(UHud.INSTANCE::setMessage);
} else {
abilities.clear(slot, ActivationType.NONE, page);
}
} else {
ActivationType type = i.getType();
if (type != ActivationType.NONE) {
abilities.clear(slot, type, page);
}
2020-01-16 12:35:46 +01:00
}
}
}
}
private void changePage(MinecraftClient client, long max, int sigma) {
2022-12-27 20:40:24 +01:00
int page = Unicopia.getConfig().hudPage.get();
page += sigma;
2022-12-27 20:40:24 +01:00
Unicopia.getConfig().hudPage.set(page);
client.getSoundManager().play(PositionedSoundInstance.master(USounds.Vanilla.UI_BUTTON_CLICK, 1.75F + (0.25F * sigma)));
2022-06-25 00:19:55 +02:00
UHud.INSTANCE.setMessage(Text.translatable("gui.unicopia.page_num", page + 1, max + 1));
}
public class Binding {
private final KeyBinding binding;
private long nextPhaseTime;
private ActivationType type = ActivationType.NONE;
Binding(KeyBinding binding) {
this.binding = binding;
}
public Text getLabel() {
return binding.getBoundKeyLocalizedText();
}
public PressedState getState() {
PressedState state = getNewState();
long now = System.currentTimeMillis();
if (state == PressedState.PRESSED) {
nextPhaseTime = now + 200;
}
if (state == PressedState.RELEASED && now < nextPhaseTime + 10) {
nextPhaseTime = now + 200;
type = type.getNext();
}
return state;
}
public ActivationType getType() {
long now = System.currentTimeMillis();
if (type != ActivationType.NONE && now > nextPhaseTime - 70) {
ActivationType t = type;
type = ActivationType.NONE;
return t;
}
return ActivationType.NONE;
}
private PressedState getNewState() {
if (binding.isPressed()) {
return pressed.add(binding) ? PressedState.PRESSED : PressedState.UNCHANGED;
} else if (pressed.remove(binding)) {
return PressedState.RELEASED;
}
return PressedState.UNCHANGED;
}
}
enum PressedState {
UNCHANGED,
PRESSED,
RELEASED
}
2020-01-16 12:35:46 +01:00
}