Commit 1f070732d7074a46b84b880f839cee86ea1fda18
1 parent
f7c2ee1f
Fix registration of keybindings with custom categories
Showing
3 changed files
with
76 additions
and
1 deletions
src/client/java/com/mumfrey/liteloader/client/GameEngineClient.java
@@ -8,7 +8,9 @@ package com.mumfrey.liteloader.client; | @@ -8,7 +8,9 @@ package com.mumfrey.liteloader.client; | ||
8 | import java.util.ArrayList; | 8 | import java.util.ArrayList; |
9 | import java.util.Arrays; | 9 | import java.util.Arrays; |
10 | import java.util.List; | 10 | import java.util.List; |
11 | +import java.util.Map; | ||
11 | 12 | ||
13 | +import com.mumfrey.liteloader.client.mixin.IKeyBinding; | ||
12 | import com.mumfrey.liteloader.client.overlays.IMinecraft; | 14 | import com.mumfrey.liteloader.client.overlays.IMinecraft; |
13 | import com.mumfrey.liteloader.common.GameEngine; | 15 | import com.mumfrey.liteloader.common.GameEngine; |
14 | import com.mumfrey.liteloader.common.Resources; | 16 | import com.mumfrey.liteloader.common.Resources; |
@@ -29,6 +31,11 @@ import net.minecraft.server.integrated.IntegratedServer; | @@ -29,6 +31,11 @@ import net.minecraft.server.integrated.IntegratedServer; | ||
29 | */ | 31 | */ |
30 | public class GameEngineClient implements GameEngine<Minecraft, IntegratedServer> | 32 | public class GameEngineClient implements GameEngine<Minecraft, IntegratedServer> |
31 | { | 33 | { |
34 | + /** | ||
35 | + * Base index for custom keybind categories added by mods | ||
36 | + */ | ||
37 | + private static final int CATEGORY_SORT_INDEX_START = 1000; | ||
38 | + | ||
32 | private final Minecraft engine = Minecraft.getMinecraft(); | 39 | private final Minecraft engine = Minecraft.getMinecraft(); |
33 | 40 | ||
34 | private final Resources<?, ?> resources = new ResourcesClient(); | 41 | private final Resources<?, ?> resources = new ResourcesClient(); |
@@ -159,6 +166,49 @@ public class GameEngineClient implements GameEngine<Minecraft, IntegratedServer> | @@ -159,6 +166,49 @@ public class GameEngineClient implements GameEngine<Minecraft, IntegratedServer> | ||
159 | @Override | 166 | @Override |
160 | public void setKeyBindings(List<KeyBinding> keyBindings) | 167 | public void setKeyBindings(List<KeyBinding> keyBindings) |
161 | { | 168 | { |
169 | + this.addMissingCategories(keyBindings); | ||
162 | this.engine.gameSettings.keyBindings = keyBindings.toArray(new KeyBinding[0]); | 170 | this.engine.gameSettings.keyBindings = keyBindings.toArray(new KeyBinding[0]); |
163 | } | 171 | } |
172 | + | ||
173 | + /** | ||
174 | + * Add categories specified in the supplied keybindings list to the list of | ||
175 | + * category sort orders in {@link KeyBinding}. | ||
176 | + * | ||
177 | + * @param keyBindings keybinding list | ||
178 | + */ | ||
179 | + private void addMissingCategories(List<KeyBinding> keyBindings) | ||
180 | + { | ||
181 | + Map<String, Integer> categorySort = IKeyBinding.getCategorySort(); | ||
182 | + | ||
183 | + for (KeyBinding binding : keyBindings) | ||
184 | + { | ||
185 | + String category = binding.getKeyCategory(); | ||
186 | + if (!categorySort.containsKey(category)) | ||
187 | + { | ||
188 | + categorySort.put(category, this.getAvailableSortIndex(categorySort)); | ||
189 | + } | ||
190 | + } | ||
191 | + } | ||
192 | + | ||
193 | + /** | ||
194 | + * Finds an available sorting index (starting at CATEGORY_SORT_INDEX_START) | ||
195 | + * which exists at the end of the sorting space. This ensures that mod | ||
196 | + * categories are always sorted after vanilla and other preexisting | ||
197 | + * categories. | ||
198 | + * | ||
199 | + * @param categorySort sorting map | ||
200 | + * @return next available sorting index | ||
201 | + */ | ||
202 | + private Integer getAvailableSortIndex(Map<String, Integer> categorySort) | ||
203 | + { | ||
204 | + int index = GameEngineClient.CATEGORY_SORT_INDEX_START; | ||
205 | + for (Integer value : categorySort.values()) | ||
206 | + { | ||
207 | + if (value.intValue() >= index) { | ||
208 | + index = value.intValue() + 1; | ||
209 | + } | ||
210 | + } | ||
211 | + | ||
212 | + return Integer.valueOf(index); | ||
213 | + } | ||
164 | } | 214 | } |
src/client/java/com/mumfrey/liteloader/client/mixin/IKeyBinding.java
0 → 100644
1 | +/* | ||
2 | + * This file is part of LiteLoader. | ||
3 | + * Copyright (C) 2012-16 Adam Mummery-Smith | ||
4 | + * All Rights Reserved. | ||
5 | + */ | ||
6 | +package com.mumfrey.liteloader.client.mixin; | ||
7 | + | ||
8 | +import java.util.Map; | ||
9 | + | ||
10 | +import org.apache.commons.lang3.NotImplementedException; | ||
11 | +import org.spongepowered.asm.mixin.Mixin; | ||
12 | +import org.spongepowered.asm.mixin.gen.Accessor; | ||
13 | + | ||
14 | +import net.minecraft.client.settings.KeyBinding; | ||
15 | + | ||
16 | +@Mixin(KeyBinding.class) | ||
17 | +public interface IKeyBinding | ||
18 | +{ | ||
19 | + @Accessor(value = "field_193627_d") | ||
20 | + public static Map<String, Integer> getCategorySort() | ||
21 | + { | ||
22 | + throw new NotImplementedException("IKeyBinding mixin failed to apply"); | ||
23 | + } | ||
24 | +} |
src/client/resources/mixins.liteloader.client.json
@@ -24,7 +24,8 @@ | @@ -24,7 +24,8 @@ | ||
24 | "MixinGuiTextField", | 24 | "MixinGuiTextField", |
25 | "MixinIntIdentityHashBiMap", | 25 | "MixinIntIdentityHashBiMap", |
26 | "MixinGuiOverlayDebug", | 26 | "MixinGuiOverlayDebug", |
27 | - "IGuiButton" | 27 | + "IGuiButton", |
28 | + "IKeyBinding" | ||
28 | ], | 29 | ], |
29 | "injectors": { | 30 | "injectors": { |
30 | "defaultRequire": 1 | 31 | "defaultRequire": 1 |