Skip to content

Commit f81d1e7

Browse files
committed
Add support for splitting policies on inventory title
1 parent 91bcb36 commit f81d1e7

File tree

16 files changed

+323
-83
lines changed

16 files changed

+323
-83
lines changed

common/src/main/java/dev/terminalmc/clientsort/client/config/ClassPolicy.java

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package dev.terminalmc.clientsort.client.config;
1818

19+
import com.mojang.datafixers.util.Pair;
20+
import dev.terminalmc.clientsort.ClientSort;
1921
import joptsimple.internal.Strings;
2022
import org.jetbrains.annotations.NotNull;
2123
import org.jetbrains.annotations.Nullable;
@@ -33,6 +35,7 @@
3335

3436
public record ClassPolicy(
3537
@NotNull String className,
38+
@Nullable String invTitle,
3639
@Nullable Vec2i buttonOffset,
3740
boolean offsetFromSlot,
3841
@NotNull Policy sortPolicy,
@@ -44,6 +47,59 @@ public record ClassPolicy(
4447
@NotNull TreeSet<Integer> ignoredSlots
4548
) {
4649

50+
public static boolean hasInvTitle(@NotNull String key) {
51+
return key.contains("/");
52+
}
53+
54+
public static ClassPolicy create(
55+
@NotNull String key,
56+
@Nullable Vec2i buttonOffset,
57+
boolean offsetFromSlot,
58+
@NotNull Policy sortPolicy,
59+
@NotNull Policy stackFillPolicy,
60+
@NotNull Policy matchTransferPolicy,
61+
@NotNull Policy transferPolicy,
62+
@Nullable Operation autoOp,
63+
boolean autoOpOther,
64+
@NotNull TreeSet<Integer> ignoredSlots
65+
) {
66+
Pair<String,String> splitKey = parseKey(key);
67+
return new ClassPolicy(
68+
splitKey.getFirst(),
69+
splitKey.getSecond(),
70+
buttonOffset,
71+
offsetFromSlot,
72+
sortPolicy,
73+
stackFillPolicy,
74+
matchTransferPolicy,
75+
transferPolicy,
76+
autoOp,
77+
autoOpOther,
78+
ignoredSlots
79+
);
80+
}
81+
82+
public static @NotNull Pair<String,String> parseKey(@NotNull String keyStr) {
83+
String[] split = keyStr.split("/", 2);
84+
return new Pair<>(split[0], split.length > 1 ? split[1] : null);
85+
}
86+
87+
public static @NotNull String getKey(@NotNull String className, @Nullable String invTitle) {
88+
if (className.contains("/")) {
89+
ClientSort.LOG.error(
90+
"Cannot get ClassPolicy key for input strings '{}', '{}'",
91+
className,
92+
invTitle
93+
);
94+
return className;
95+
}
96+
return className + (invTitle == null ? "" : "/" + invTitle);
97+
}
98+
99+
public @NotNull String getKey() {
100+
return getKey(this.className, this.invTitle);
101+
}
102+
47103
public @NotNull Vec2i getButtonOffset() {
48104
return buttonOffset == null
49105
? options().layoutOffset
@@ -116,15 +172,16 @@ public boolean autoTransfer() {
116172

117173
// Config data-string serialization
118174

119-
public static final String DATA_FORMAT = "%s,(%s)/%d,%s,%s,%s,%s,%d/%d,(%s)";
175+
public static final String DATA_FORMAT = "%s/%s,(%s)/%d,%s,%s,%s,%s,%d/%d,(%s)";
120176
public static final String DATA_PATTERN_STRING =
121-
"^(.+),\\((?:(-?\\d+),(-?\\d+))?\\)/([01]),([012]),([012]),([012]),([012]),([01234])/([01]),\\(((?:\\d+(?:,\\d+)*)?)\\)$";
177+
"^([^/]+)/(.+?)?,\\((?:(-?\\d+),(-?\\d+))?\\)/([01]),([012]),([012]),([012]),([012]),([01234])/([01]),\\(((?:\\d+(?:,\\d+)*)?)\\)$";
122178
public static final Pattern DATA_PATTERN = Pattern.compile(DATA_PATTERN_STRING);
123179

124180
public String toDataString() {
125181
return String.format(
126182
DATA_FORMAT,
127183
className,
184+
invTitle == null ? "" : invTitle,
128185
buttonOffset == null ? "" : buttonOffset.x() + "," + buttonOffset.y(),
129186
offsetFromSlot ? 1 : 0,
130187
sortPolicy.toSimpleString(),
@@ -139,7 +196,7 @@ public String toDataString() {
139196

140197
public static ClassPolicy fromDataString(
141198
String dataString,
142-
Set<String> oldClassNames
199+
Set<String> oldPolicyKeys
143200
) throws ParseException {
144201
dataString = dataString.strip();
145202

@@ -157,7 +214,8 @@ public static ClassPolicy fromDataString(
157214

158215
// Validate class name if modified
159216
String className = matcher.group(1);
160-
if (!oldClassNames.contains(className)) {
217+
String invTitle = matcher.group(2);
218+
if (!oldPolicyKeys.contains(getKey(className, invTitle))) {
161219
try {
162220
Class.forName(className);
163221
} catch (ClassNotFoundException e) {
@@ -173,21 +231,22 @@ public static ClassPolicy fromDataString(
173231

174232
return new ClassPolicy(
175233
className,
176-
matcher.group(2) == null ? null
234+
invTitle,
235+
matcher.group(3) == null ? null
177236
: new Vec2i(
178-
Integer.parseInt(matcher.group(2)),
179-
Integer.parseInt(matcher.group(3))
237+
Integer.parseInt(matcher.group(3)),
238+
Integer.parseInt(matcher.group(4))
180239
),
181-
matcher.group(4).equals("1"),
182-
Policy.fromSimpleString(matcher.group(5)),
240+
matcher.group(5).equals("1"),
183241
Policy.fromSimpleString(matcher.group(6)),
184242
Policy.fromSimpleString(matcher.group(7)),
185243
Policy.fromSimpleString(matcher.group(8)),
186-
matcher.group(9).equals("0")
244+
Policy.fromSimpleString(matcher.group(9)),
245+
matcher.group(10).equals("0")
187246
? null
188-
: Operation.values()[Integer.parseInt(matcher.group(9)) - 1],
189-
matcher.group(10).equals("1"),
190-
new TreeSet<>(Arrays.stream(matcher.group(11).split(","))
247+
: Operation.values()[Integer.parseInt(matcher.group(10)) - 1],
248+
matcher.group(11).equals("1"),
249+
new TreeSet<>(Arrays.stream(matcher.group(12).split(","))
191250
.filter((s) -> !s.isBlank())
192251
.map(Integer::parseInt).sorted().toList())
193252
);

common/src/main/java/dev/terminalmc/clientsort/client/config/Config.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ private static Operation validateUniqueOp(
304304
new ClassPolicy(
305305
Inventory.class.getName(),
306306
null,
307+
null,
307308
false,
308309
Policy.KEYBIND_BUTTON,
309310
Policy.KEYBIND,
@@ -316,6 +317,7 @@ private static Operation validateUniqueOp(
316317
new ClassPolicy(
317318
ChestMenu.class.getName(),
318319
null,
320+
null,
319321
false,
320322
Policy.KEYBIND_BUTTON,
321323
Policy.KEYBIND_BUTTON,
@@ -328,6 +330,7 @@ private static Operation validateUniqueOp(
328330
new ClassPolicy(
329331
HopperMenu.class.getName(),
330332
null,
333+
null,
331334
false,
332335
Policy.KEYBIND,
333336
Policy.KEYBIND,
@@ -340,6 +343,7 @@ private static Operation validateUniqueOp(
340343
new ClassPolicy(
341344
HorseInventoryMenu.class.getName(),
342345
null,
346+
null,
343347
false,
344348
Policy.KEYBIND_BUTTON,
345349
Policy.KEYBIND,
@@ -352,6 +356,7 @@ private static Operation validateUniqueOp(
352356
new ClassPolicy(
353357
PlayerEnderChestContainer.class.getName(),
354358
null,
359+
null,
355360
false,
356361
Policy.KEYBIND_BUTTON,
357362
Policy.KEYBIND_BUTTON,
@@ -364,6 +369,7 @@ private static Operation validateUniqueOp(
364369
new ClassPolicy(
365370
ShulkerBoxMenu.class.getName(),
366371
null,
372+
null,
367373
false,
368374
Policy.KEYBIND_BUTTON,
369375
Policy.KEYBIND_BUTTON,
@@ -376,6 +382,7 @@ private static Operation validateUniqueOp(
376382
new ClassPolicy(
377383
RandomizableContainerBlockEntity.class.getName(),
378384
null,
385+
null,
379386
false,
380387
Policy.KEYBIND_BUTTON,
381388
Policy.KEYBIND_BUTTON,
@@ -388,6 +395,7 @@ private static Operation validateUniqueOp(
388395
new ClassPolicy(
389396
"com.simibubi.create.content.equipment.toolbox.ToolboxMenu",
390397
null,
398+
null,
391399
false,
392400
Policy.NONE,
393401
Policy.NONE,
@@ -400,6 +408,7 @@ private static Operation validateUniqueOp(
400408
new ClassPolicy(
401409
"com.tiviacz.travelersbackpack.inventory.menu.BackpackSettingsMenu",
402410
null,
411+
null,
403412
false,
404413
Policy.NONE,
405414
Policy.NONE,
@@ -412,6 +421,7 @@ private static Operation validateUniqueOp(
412421
new ClassPolicy(
413422
"com.tom.storagemod.menu.CraftingTerminalMenu",
414423
null,
424+
null,
415425
false,
416426
Policy.NONE,
417427
Policy.NONE,
@@ -424,6 +434,7 @@ private static Operation validateUniqueOp(
424434
new ClassPolicy(
425435
"com.tom.storagemod.menu.StorageTerminalMenu",
426436
null,
437+
null,
427438
false,
428439
Policy.NONE,
429440
Policy.NONE,
@@ -436,7 +447,7 @@ private static Operation validateUniqueOp(
436447
);
437448
public static final Supplier<Map<String, ClassPolicy>> classPoliciesDefault = () -> {
438449
Map<String, ClassPolicy> map = new LinkedHashMap<>();
439-
classPoliciesDefaultList.get().forEach((layout) -> map.put(layout.className(), layout));
450+
classPoliciesDefaultList.get().forEach((policy) -> map.put(policy.getKey(), policy));
440451
return map;
441452
};
442453
public Map<String, ClassPolicy> classPolicies = classPoliciesDefault.get();
@@ -448,9 +459,10 @@ private static Operation validateUniqueOp(
448459
val.values().forEach((cp) -> {
449460
if (cp != null && cp.className() != null && !cp.className().isBlank()) {
450461
validPolicies.put(
451-
cp.className(),
462+
cp.getKey(),
452463
new ClassPolicy(
453464
cp.className(),
465+
cp.invTitle(),
454466
cp.buttonOffset(),
455467
cp.offsetFromSlot(),
456468
Options.policyValidator.validate(cp.sortPolicy()),
@@ -562,9 +574,10 @@ private void upgradeLegacy() {
562574
if (options.buttonLayouts != null && !options.buttonLayouts.isEmpty()) {
563575
// Upgrade old ButtonLayouts to new ClassPolicies
564576
options.buttonLayouts.values().forEach((bl) -> options.classPolicies.put(
565-
bl.className(),
577+
ClassPolicy.getKey(bl.className(), null),
566578
new ClassPolicy(
567579
bl.className(),
580+
null,
568581
bl.offset(),
569582
false,
570583
Boolean.TRUE.equals(bl.sortEnabled())

common/src/main/java/dev/terminalmc/clientsort/client/gui/TriggerButtonManager.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import dev.terminalmc.clientsort.client.inventory.helper.ContainerScreenHelper;
3030
import dev.terminalmc.clientsort.client.util.KeybindManager;
3131
import dev.terminalmc.clientsort.client.util.PolicyManager;
32+
import dev.terminalmc.clientsort.mixin.client.accessor.AbstractContainerScreenAccessor;
3233
import dev.terminalmc.clientsort.mixin.client.accessor.ScreenAccessor;
3334
import net.minecraft.client.Minecraft;
3435
import net.minecraft.client.gui.screens.Screen;
@@ -262,8 +263,14 @@ private static void generateSimpleButton(
262263
if (object == null)
263264
return;
264265

266+
// Select the relevant title
267+
Component invTitle = isPlayerInv
268+
? ((AbstractContainerScreenAccessor) screen).clientsort$getPlayerInventoryTitle()
269+
: screen.getTitle();
270+
265271
// Retrieve the relevant policy, if any
266-
@Nullable ClassPolicy policy = PolicyManager.getPolicy(object.getClass());
272+
@Nullable ClassPolicy policy =
273+
PolicyManager.getPolicy(object.getClass(), invTitle.getString());
267274

268275
// Evaluate display mode
269276
boolean create = isEditor || policy == null || opCheck.apply(policy);
@@ -288,7 +295,7 @@ private static void generateSimpleButton(
288295
referenceLeft,
289296
isPlayerInv,
290297
policy,
291-
object.getClass().getName(),
298+
ClassPolicy.getKey(object.getClass().getName(), null),
292299
getShiftedOffset(offset, isPlayerInv),
293300
name
294301
);
@@ -346,8 +353,14 @@ private static void generateDirectionalButton(
346353
if (object == null)
347354
return;
348355

349-
// Check the relevant policy, if any
350-
@Nullable ClassPolicy policy = PolicyManager.getPolicy(object.getClass());
356+
// Select the relevant title
357+
Component invTitle = isPlayerInv
358+
? ((AbstractContainerScreenAccessor) screen).clientsort$getPlayerInventoryTitle()
359+
: screen.getTitle();
360+
361+
// Retrieve the relevant policy, if any
362+
@Nullable ClassPolicy policy =
363+
PolicyManager.getPolicy(object.getClass(), invTitle.getString());
351364

352365
// Evaluate display mode
353366
boolean create = isEditor || policy == null || opCheck.apply(policy);
@@ -374,8 +387,14 @@ private static void generateDirectionalButton(
374387
if (dstObject == null)
375388
return;
376389

377-
// Check the relevant policy, if any
378-
@Nullable ClassPolicy dstPolicy = PolicyManager.getPolicy(dstObject.getClass());
390+
// Select the relevant title
391+
Component dstInvTitle = isPlayerInv
392+
? screen.getTitle()
393+
: ((AbstractContainerScreenAccessor) screen).clientsort$getPlayerInventoryTitle();
394+
395+
// Retrieve the relevant policy, if any
396+
@Nullable ClassPolicy dstPolicy =
397+
PolicyManager.getPolicy(dstObject.getClass(), dstInvTitle.getString());
379398

380399
// Re-evaluate display mode
381400
create = isEditor || dstPolicy == null || opCheck.apply(dstPolicy);
@@ -396,7 +415,7 @@ private static void generateDirectionalButton(
396415
referenceLeft,
397416
isPlayerInv,
398417
policy,
399-
object.getClass().getName(),
418+
ClassPolicy.getKey(object.getClass().getName(), null),
400419
getShiftedOffset(offset, isPlayerInv),
401420
name
402421
);

common/src/main/java/dev/terminalmc/clientsort/client/gui/screen/config/ClothScreenProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ else if (val > Config.Options.SOUND_VOLUME_MAX)
698698
}
699699
options.classPolicies.clear();
700700
classPolicies.forEach((policy) -> options.classPolicies.put(
701-
policy.className(),
701+
policy.getKey(),
702702
policy
703703
));
704704
})

common/src/main/java/dev/terminalmc/clientsort/client/gui/screen/edit/ContainerEditorScreen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
public class ContainerEditorScreen extends EditorScreen {
2929

3030
public ContainerEditorScreen(AbstractContainerScreen<?> underlay, TriggerButton button) {
31-
super(underlay, button);
31+
super(underlay, false, button);
3232
}
3333

3434
@Override

0 commit comments

Comments
 (0)