142 lines
6.8 KiB
Java
142 lines
6.8 KiB
Java
package net.blay09.mods.defaultoptions.keys;
|
|
|
|
import com.mojang.blaze3d.platform.InputConstants;
|
|
import java.io.BufferedReader;
|
|
import java.io.File;
|
|
import java.io.FileReader;
|
|
import java.io.FileWriter;
|
|
import java.io.IOException;
|
|
import java.io.PrintWriter;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
import net.blay09.mods.balm.api.client.keymappings.KeyModifier;
|
|
import net.blay09.mods.defaultoptions.DefaultOptions;
|
|
import net.blay09.mods.defaultoptions.DefaultOptionsInitializer;
|
|
import net.blay09.mods.defaultoptions.DefaultOptionsKeyMapping;
|
|
import net.blay09.mods.defaultoptions.PlatformBindings;
|
|
import net.blay09.mods.defaultoptions.api.DefaultOptionsCategory;
|
|
import net.blay09.mods.defaultoptions.api.DefaultOptionsHandler;
|
|
import net.blay09.mods.defaultoptions.api.DefaultOptionsLoadStage;
|
|
import net.blay09.mods.defaultoptions.keys.DefaultKeyMapping;
|
|
import net.blay09.mods.defaultoptions.mixin.KeyMappingAccessor;
|
|
import net.minecraft.client.KeyMapping;
|
|
import net.minecraft.client.Minecraft;
|
|
|
|
public class KeyMappingDefaultsHandler implements DefaultOptionsHandler {
|
|
private static final Pattern KEY_PATTERN = Pattern.compile("key_([^:]+):([^:]+)(?::(.+))?");
|
|
private static final Map<String, DefaultKeyMapping> defaultKeys = new HashMap<String, DefaultKeyMapping>();
|
|
|
|
private File getDefaultOptionsFile() {
|
|
return new File(DefaultOptions.getDefaultOptionsFolder(), "keybindings.txt");
|
|
}
|
|
|
|
@Override
|
|
public String getId() {
|
|
return "keymappings";
|
|
}
|
|
|
|
@Override
|
|
public DefaultOptionsCategory getCategory() {
|
|
return DefaultOptionsCategory.KEYS;
|
|
}
|
|
|
|
@Override
|
|
public DefaultOptionsLoadStage getLoadStage() {
|
|
return DefaultOptionsLoadStage.POST_LOAD;
|
|
}
|
|
|
|
@Override
|
|
public void saveCurrentOptions() {
|
|
Minecraft.m_91087_().f_91066_.m_92169_();
|
|
}
|
|
|
|
@Override
|
|
public void saveCurrentOptionsAsDefault() {
|
|
try (PrintWriter writer = new PrintWriter(new FileWriter(new File(DefaultOptions.getDefaultOptionsFolder(), "keybindings.txt")))) {
|
|
for (KeyMapping keyMapping : Minecraft.m_91087_().f_91066_.f_92059_) {
|
|
InputConstants.Key key = PlatformBindings.INSTANCE.getKey(keyMapping);
|
|
KeyModifier keyModifier = PlatformBindings.INSTANCE.getKeyModifier(keyMapping);
|
|
writer.println("key_" + keyMapping.m_90860_() + ":" + key.m_84874_() + ":" + keyModifier.name());
|
|
}
|
|
} catch (IOException e) {
|
|
DefaultOptions.logger.error("Failed to save default key mappings", (Throwable) e);
|
|
}
|
|
this.loadDefaults();
|
|
}
|
|
|
|
@Override
|
|
public boolean hasDefaults() {
|
|
return this.getDefaultOptionsFile().exists();
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldLoadDefaults() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void loadDefaults() {
|
|
DefaultOptionsInitializer.markUserSeenKeys(Minecraft.m_91087_().f_91066_);
|
|
defaultKeys.clear();
|
|
File defaultKeysFile = new File(DefaultOptions.getDefaultOptionsFolder(), "keybindings.txt");
|
|
if (defaultKeysFile.exists()) {
|
|
try (BufferedReader reader = new BufferedReader(new FileReader(defaultKeysFile))) {
|
|
String line;
|
|
while ((line = reader.readLine()) != null) {
|
|
if (line.isEmpty()) continue;
|
|
Matcher matcher = KEY_PATTERN.matcher(line);
|
|
if (!matcher.matches()) {
|
|
DefaultOptions.logger.debug("Skipping line {} as the format is invalid", (Object) line);
|
|
continue;
|
|
}
|
|
try {
|
|
KeyModifier modifier = matcher.group(3) != null ? KeyModifier.valueOf((String) matcher.group(3)) : KeyModifier.NONE;
|
|
String keyMappingName = matcher.group(1);
|
|
defaultKeys.put(keyMappingName, new DefaultKeyMapping(InputConstants.m_84851_((String) matcher.group(2)), modifier));
|
|
DefaultOptions.logger.debug("Registered a default key binding for {} ({}:{})", (Object) keyMappingName, (Object) matcher.group(2), (Object) matcher.group(3));
|
|
} catch (Exception e) {
|
|
DefaultOptions.logger.error("Error loading default key binding for {}", (Object) line, (Object) e);
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
DefaultOptions.logger.error("Error loading default key bindings", (Throwable) e);
|
|
}
|
|
DefaultOptions.logger.info("Loaded {} default key bindings.", (Object) defaultKeys.size());
|
|
} else {
|
|
DefaultOptions.logger.info("No default key bindings file found.");
|
|
}
|
|
int defaultsApplied = 0;
|
|
int bindingsOverridden = 0;
|
|
for (KeyMapping keyMapping : Minecraft.m_91087_().f_91066_.f_92059_) {
|
|
DefaultKeyMapping originalDefaultMapping = new DefaultKeyMapping(keyMapping.m_90861_(), PlatformBindings.INSTANCE.getDefaultKeyModifier(keyMapping));
|
|
if (defaultKeys.containsKey(keyMapping.m_90860_())) {
|
|
DefaultKeyMapping defaultKeyMapping = defaultKeys.get(keyMapping.m_90860_());
|
|
((KeyMappingAccessor) keyMapping).setDefaultKey(defaultKeyMapping.input);
|
|
PlatformBindings.INSTANCE.setDefaultKeyModifier(keyMapping, defaultKeyMapping.modifier);
|
|
++defaultsApplied;
|
|
|
|
boolean isCurrentOnOriginalDefault = originalDefaultMapping.matches(keyMapping);
|
|
if ((!((DefaultOptionsKeyMapping) keyMapping).defaultoptions$wasSeen() || isCurrentOnOriginalDefault)
|
|
&& !defaultKeyMapping.matches(keyMapping)) {
|
|
|
|
KeyModifier defaultKeyModifier = PlatformBindings.INSTANCE.getDefaultKeyModifier(keyMapping);
|
|
PlatformBindings.INSTANCE.setKeyModifier(keyMapping, defaultKeyModifier);
|
|
keyMapping.m_90848_(keyMapping.m_90861_());
|
|
++bindingsOverridden;
|
|
DefaultOptions.logger.debug("Key mapping {} was previously on the original default. Configuring to new default.", (Object) keyMapping.m_90860_());
|
|
continue;
|
|
}
|
|
DefaultOptions.logger.debug("Key mapping {} has been previously set, skipping.", (Object) keyMapping.m_90860_());
|
|
continue;
|
|
}
|
|
DefaultOptions.logger.debug("No default key mapping configured for {}, skipping.", (Object) keyMapping.m_90860_());
|
|
}
|
|
DefaultOptions.logger.info("Applied {} defaults to key mappings ({} keys were reconfigured).", (Object) defaultsApplied, (Object) bindingsOverridden);
|
|
if (bindingsOverridden > 0) {
|
|
KeyMapping.m_90854_();
|
|
this.saveCurrentOptions();
|
|
}
|
|
}
|
|
}
|