Skip to content

Commit 95f940b

Browse files
committed
feat: Allow marking keybinds to never conflict
1 parent 28dcce0 commit 95f940b

File tree

5 files changed

+40
-1
lines changed

5 files changed

+40
-1
lines changed

fabric/src/main/resources/balm.mixins.json

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"ItemInHandRendererMixin",
3737
"KeyboardHandlerMixin",
3838
"KeyMappingAccessor",
39+
"KeyMappingMixin",
3940
"LevelRendererMixin",
4041
"MinecraftMixin",
4142
"MouseHandlerAccessor",

forge/src/main/resources/balm.mixins.json

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"CheckboxAccessor",
1818
"ImageButtonAccessor",
1919
"KeyMappingAccessor",
20+
"KeyMappingMixin",
2021
"MouseHandlerAccessor",
2122
"ScreenAccessor",
2223
"MinecraftMixin",

shared/src/main/java/net/blay09/mods/balm/api/client/keymappings/BalmKeyMappings.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
import com.mojang.blaze3d.platform.InputConstants;
44
import net.minecraft.client.KeyMapping;
5-
import net.minecraft.client.player.Input;
5+
6+
import java.util.Optional;
67

78
public interface BalmKeyMappings {
89
KeyMapping registerKeyMapping(String name, int keyCode, String category);
@@ -32,4 +33,8 @@ default boolean isActiveAndMatches(KeyMapping keyMapping, InputConstants.Type ty
3233
boolean isKeyDownIgnoreContext(KeyMapping keyMapping);
3334

3435
boolean isActiveAndKeyDown(KeyMapping keyMapping);
36+
37+
Optional<Boolean> conflictsWith(KeyMapping first, KeyMapping second);
38+
39+
void ignoreConflicts(KeyMapping keyMapping);
3540
}

shared/src/main/java/net/blay09/mods/balm/common/client/keymappings/CommonBalmKeyMappings.java

+15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.blay09.mods.balm.common.client.keymappings;
22

3+
import com.google.common.collect.Sets;
34
import com.mojang.blaze3d.platform.InputConstants;
45
import net.blay09.mods.balm.api.client.keymappings.BalmKeyMappings;
56
import net.blay09.mods.balm.api.client.keymappings.KeyConflictContext;
@@ -16,6 +17,7 @@
1617
import java.util.concurrent.ConcurrentHashMap;
1718

1819
public abstract class CommonBalmKeyMappings implements BalmKeyMappings {
20+
private final Set<KeyMapping> ignoreConflicts = Sets.newConcurrentHashSet();
1921
private final Map<KeyMapping, Set<KeyMapping>> multiModifierKeyMappings = new ConcurrentHashMap<>();
2022

2123
@Override
@@ -168,6 +170,19 @@ public boolean isActiveAndMatches(@Nullable KeyMapping keyMapping, InputConstant
168170
return isActive(keyMapping) && (type == InputConstants.Type.MOUSE ? keyMapping.matchesMouse(keyCode) : keyMapping.matches(keyCode, scanCode));
169171
}
170172

173+
@Override
174+
public Optional<Boolean> conflictsWith(KeyMapping first, KeyMapping second) {
175+
if (ignoreConflicts.contains(first) || ignoreConflicts.contains(second)) {
176+
return Optional.of(false);
177+
}
178+
return Optional.empty();
179+
}
180+
181+
@Override
182+
public void ignoreConflicts(KeyMapping keyMapping) {
183+
ignoreConflicts.add(keyMapping);
184+
}
185+
171186
protected abstract boolean isContextActive(KeyMapping keyMapping);
172187

173188
protected boolean isContextActive(KeyConflictContext conflictContext) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package net.blay09.mods.balm.mixin;
2+
3+
import net.blay09.mods.balm.api.client.BalmClient;
4+
import net.minecraft.client.KeyMapping;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Inject;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
9+
10+
@Mixin(KeyMapping.class)
11+
public class KeyMappingMixin {
12+
@Inject(method = "same(Lnet/minecraft/client/KeyMapping;)Z", cancellable = true, at = @At("HEAD"))
13+
public void same(KeyMapping keyMapping, CallbackInfoReturnable<Boolean> callbackInfo) {
14+
KeyMapping thisKeyMapping = (KeyMapping) (Object) this;
15+
BalmClient.getKeyMappings().conflictsWith(thisKeyMapping, keyMapping).ifPresent(callbackInfo::setReturnValue);
16+
}
17+
}

0 commit comments

Comments
 (0)