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 | 8 | import java.util.ArrayList; |
9 | 9 | import java.util.Arrays; |
10 | 10 | import java.util.List; |
11 | +import java.util.Map; | |
11 | 12 | |
13 | +import com.mumfrey.liteloader.client.mixin.IKeyBinding; | |
12 | 14 | import com.mumfrey.liteloader.client.overlays.IMinecraft; |
13 | 15 | import com.mumfrey.liteloader.common.GameEngine; |
14 | 16 | import com.mumfrey.liteloader.common.Resources; |
... | ... | @@ -29,6 +31,11 @@ import net.minecraft.server.integrated.IntegratedServer; |
29 | 31 | */ |
30 | 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 | 39 | private final Minecraft engine = Minecraft.getMinecraft(); |
33 | 40 | |
34 | 41 | private final Resources<?, ?> resources = new ResourcesClient(); |
... | ... | @@ -159,6 +166,49 @@ public class GameEngineClient implements GameEngine<Minecraft, IntegratedServer> |
159 | 166 | @Override |
160 | 167 | public void setKeyBindings(List<KeyBinding> keyBindings) |
161 | 168 | { |
169 | + this.addMissingCategories(keyBindings); | |
162 | 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