Skip to content

Commit 8ad8c8a

Browse files
committed
Add GUI for managing player presets plus more improvements
1 parent 9ca55e4 commit 8ad8c8a

File tree

11 files changed

+1291
-226
lines changed

11 files changed

+1291
-226
lines changed

build.gradle

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ repositories {
2323
name = "Terraformers"
2424
url = "https://maven.terraformersmc.com/"
2525
}
26+
maven {
27+
url 'https://maven.wispforest.io/releases/'
28+
}
2629
}
2730

2831
dependencies {
@@ -36,6 +39,7 @@ dependencies {
3639
modImplementation include ("maven.modrinth:midnightlib:${project.midnightlib_version}")
3740

3841
modImplementation("com.terraformersmc:modmenu:${project.modmenu_version}")
42+
modImplementation "io.wispforest:owo-lib:${project.owo_version}"
3943

4044
implementation 'com.google.code.gson:gson:2.10.1'
4145
}
@@ -51,12 +55,14 @@ processResources {
5155
inputs.property "version", project.version
5256
inputs.property "minecraft_version", project.minecraft_version
5357
inputs.property "loader_version", project.loader_version
58+
inputs.property "owo_version", project.owo_version
5459
filteringCharset "UTF-8"
5560

5661
filesMatching("fabric.mod.json") {
5762
expand "version": project.version,
5863
"minecraft_version": project.minecraft_version,
59-
"loader_version": project.loader_version
64+
"loader_version": project.loader_version,
65+
"owo_version" : project.owo_version
6066
}
6167
}
6268

gradle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ minecraft_version=1.21.5
66
yarn_mappings=1.21.5+build.1
77
loader_version=0.16.14
88
# Mod Properties
9-
mod_version=2.0.0
9+
mod_version=2.0.0+1.21.5
1010
maven_group=com.github
1111
archives_base_name=scaleme
1212
# Dependencies
1313
# check this on https://modmuss50.me/fabric.html
1414
fabric_version=0.127.1+1.21.5
1515
midnightlib_version = 1.7.3+1.21.4-fabric
1616
modmenu_version = 14.0.0-rc.2
17+
owo_version=0.12.21+1.21.5

src/main/java/com/github/kd_gaming1/scaleme/client/command/PresetCommand.java

Lines changed: 9 additions & 195 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,18 @@
22

33
import com.github.kd_gaming1.scaleme.client.data.PlayerPreset;
44
import com.github.kd_gaming1.scaleme.client.util.PlayerPresetManager;
5+
import com.github.kd_gaming1.scaleme.client.util.PlayerUUIDResolver;
56
import com.github.kd_gaming1.scaleme.config.ScaleMeConfig;
6-
import com.mojang.authlib.GameProfile;
7-
import com.mojang.brigadier.CommandDispatcher;
87
import com.mojang.brigadier.arguments.FloatArgumentType;
98
import com.mojang.brigadier.arguments.StringArgumentType;
109
import com.mojang.brigadier.context.CommandContext;
1110
import com.mojang.brigadier.exceptions.CommandSyntaxException;
1211
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
1312
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
14-
import net.minecraft.client.MinecraftClient;
1513
import net.minecraft.text.Text;
1614

1715
import java.util.List;
1816
import java.util.UUID;
19-
import java.util.concurrent.CompletableFuture;
2017

2118
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.*;
2219

@@ -32,36 +29,14 @@ public static void register() {
3229
.then(literal("add")
3330
.then(argument("player", StringArgumentType.string())
3431
.then(argument("scale", FloatArgumentType.floatArg(0.1f, 10.0f))
35-
.executes(ctx -> executeAdd(ctx, null))
36-
.then(argument("category", StringArgumentType.string())
37-
.executes(ctx -> executeAdd(ctx, StringArgumentType.getString(ctx, "category")))))))
32+
.executes(PresetCommand::executeAdd))))
3833

3934
.then(literal("remove")
4035
.then(argument("player", StringArgumentType.string())
4136
.executes(PresetCommand::executeRemove)))
4237

4338
.then(literal("list")
4439
.executes(ctx -> executeList(ctx, null))
45-
.then(argument("category", StringArgumentType.string())
46-
.executes(ctx -> executeList(ctx, StringArgumentType.getString(ctx, "category")))))
47-
48-
.then(literal("category")
49-
.then(literal("list")
50-
.executes(PresetCommand::executeListCategories))
51-
.then(literal("rename")
52-
.then(argument("old_name", StringArgumentType.string())
53-
.then(argument("new_name", StringArgumentType.string())
54-
.executes(PresetCommand::executeRenameCategory))))
55-
.then(literal("remove")
56-
.then(argument("category", StringArgumentType.string())
57-
.executes(PresetCommand::executeRemoveCategory)))
58-
.then(literal("move")
59-
.then(argument("player", StringArgumentType.string())
60-
.then(argument("category", StringArgumentType.string())
61-
.executes(PresetCommand::executeMoveToCategory))))
62-
.then(literal("clear")
63-
.then(argument("player", StringArgumentType.string())
64-
.executes(PresetCommand::executeClearCategory))))
6540

6641
.then(literal("enable")
6742
.then(argument("player", StringArgumentType.string())
@@ -84,12 +59,12 @@ public static void register() {
8459

8560
.then(literal("setown")
8661
.then(argument("scale", FloatArgumentType.floatArg(0.1f, 10.0f))
87-
.executes(PresetCommand::executeSetOwn)))
62+
.executes(PresetCommand::executeSetOwn))))
8863
);
8964
});
9065
}
9166

92-
private static int executeAdd(CommandContext<FabricClientCommandSource> ctx, String category) throws CommandSyntaxException {
67+
private static int executeAdd(CommandContext<FabricClientCommandSource> ctx) throws CommandSyntaxException {
9368
String playerName = StringArgumentType.getString(ctx, "player");
9469
float scale = FloatArgumentType.getFloat(ctx, "scale");
9570

@@ -106,11 +81,10 @@ private static int executeAdd(CommandContext<FabricClientCommandSource> ctx, Str
10681
return 0;
10782
}
10883

109-
PlayerPreset preset = new PlayerPreset(uuidString, playerName, scale, category);
84+
PlayerPreset preset = new PlayerPreset(uuidString, playerName, scale);
11085
PlayerPresetManager.addOrUpdatePreset(preset);
11186

112-
String categoryText = category != null && !category.trim().isEmpty() ? " in category '" + category + "'" : "";
113-
sendSuccess(ctx, "Added preset for '" + playerName + "' with scale " + scale + categoryText + ".");
87+
sendSuccess(ctx, "Added preset for '" + playerName + "' with scale " + scale + ".");
11488
return 1;
11589
}
11690

@@ -147,15 +121,10 @@ private static int executeList(CommandContext<FabricClientCommandSource> ctx, St
147121
int count = 0;
148122

149123
for (PlayerPreset preset : presets) {
150-
if (categoryFilter != null && !categoryFilter.equalsIgnoreCase(preset.category)) {
151-
continue;
152-
}
153-
154124
String status = preset.enabled ? "§a✓" : "§c✗";
155-
String category = preset.category != null ? " §8[" + preset.category + "]" : " §8[no category]";
156125
String name = preset.getEffectiveDisplayName();
157126

158-
sendInfo(ctx, String.format(" %s §f%s§r: §6%.2f%s", status, name, preset.scale, category));
127+
sendInfo(ctx, String.format(" %s §f%s§r: §6%.2f%s", status, name, preset.scale));
159128
count++;
160129
}
161130

@@ -235,7 +204,6 @@ private static int executeInfo(CommandContext<FabricClientCommandSource> ctx) th
235204
sendInfo(ctx, " UUID: " + preset.identifier);
236205
sendInfo(ctx, " Friendly Name: " + (preset.friendlyName != null ? preset.friendlyName : "None"));
237206
sendInfo(ctx, " Scale: " + preset.scale);
238-
sendInfo(ctx, " Category: " + (preset.category != null ? preset.category : "None"));
239207
sendInfo(ctx, " Enabled: " + (preset.enabled ? "Yes" : "No"));
240208

241209
return 1;
@@ -267,163 +235,9 @@ private static int executeSetOwn(CommandContext<FabricClientCommandSource> ctx)
267235
return 1;
268236
}
269237

270-
private static int executeListCategories(CommandContext<FabricClientCommandSource> ctx) {
271-
List<PlayerPreset> presets = PlayerPresetManager.getAllPresets();
272-
273-
if (presets.isEmpty()) {
274-
sendInfo(ctx, "No presets found.");
275-
return 1;
276-
}
277-
278-
// Collect unique categories and count presets in each
279-
java.util.Map<String, Integer> categoryCount = new java.util.HashMap<>();
280-
int uncategorized = 0;
281-
282-
for (PlayerPreset preset : presets) {
283-
if (preset.category != null && !preset.category.trim().isEmpty()) {
284-
categoryCount.merge(preset.category, 1, Integer::sum);
285-
} else {
286-
uncategorized++;
287-
}
288-
}
289-
290-
sendInfo(ctx, "Categories:");
291-
292-
if (uncategorized > 0) {
293-
sendInfo(ctx, " §7(no category): " + uncategorized + " presets");
294-
}
295-
296-
categoryCount.entrySet().stream()
297-
.sorted(java.util.Map.Entry.comparingByKey())
298-
.forEach(entry -> {
299-
sendInfo(ctx, " §e" + entry.getKey() + "§r: " + entry.getValue() + " presets");
300-
});
301-
302-
return 1;
303-
}
304-
305-
private static int executeRenameCategory(CommandContext<FabricClientCommandSource> ctx) throws CommandSyntaxException {
306-
String oldName = StringArgumentType.getString(ctx, "old_name");
307-
String newName = StringArgumentType.getString(ctx, "new_name");
308-
309-
List<PlayerPreset> presets = PlayerPresetManager.getAllPresets();
310-
int renamed = 0;
311-
312-
for (PlayerPreset preset : presets) {
313-
if (oldName.equalsIgnoreCase(preset.category)) {
314-
preset.category = newName;
315-
PlayerPresetManager.addOrUpdatePreset(preset);
316-
renamed++;
317-
}
318-
}
319-
320-
if (renamed > 0) {
321-
sendSuccess(ctx, "Renamed category '" + oldName + "' to '" + newName + "' (" + renamed + " presets updated).");
322-
return 1;
323-
} else {
324-
sendError(ctx, "No presets found in category '" + oldName + "'.");
325-
return 0;
326-
}
327-
}
328-
329-
private static int executeRemoveCategory(CommandContext<FabricClientCommandSource> ctx) throws CommandSyntaxException {
330-
String categoryName = StringArgumentType.getString(ctx, "category");
331-
332-
List<PlayerPreset> presets = PlayerPresetManager.getAllPresets();
333-
int cleared = 0;
334-
335-
for (PlayerPreset preset : presets) {
336-
if (categoryName.equalsIgnoreCase(preset.category)) {
337-
preset.category = null;
338-
PlayerPresetManager.addOrUpdatePreset(preset);
339-
cleared++;
340-
}
341-
}
342-
343-
if (cleared > 0) {
344-
sendSuccess(ctx, "Removed category '" + categoryName + "' from " + cleared + " presets.");
345-
return 1;
346-
} else {
347-
sendError(ctx, "No presets found in category '" + categoryName + "'.");
348-
return 0;
349-
}
350-
}
351-
352-
private static int executeMoveToCategory(CommandContext<FabricClientCommandSource> ctx) throws CommandSyntaxException {
353-
String playerName = StringArgumentType.getString(ctx, "player");
354-
String newCategory = StringArgumentType.getString(ctx, "category");
355-
356-
UUID playerUUID = resolvePlayerUUID(playerName);
357-
if (playerUUID == null) {
358-
sendError(ctx, "Player '" + playerName + "' not found.");
359-
return 0;
360-
}
361-
362-
String uuidString = playerUUID.toString();
363-
PlayerPreset preset = PlayerPresetManager.getPreset(uuidString);
364-
365-
if (preset == null) {
366-
sendError(ctx, "No preset found for '" + playerName + "'.");
367-
return 0;
368-
}
369-
370-
String oldCategory = preset.category != null ? preset.category : "(no category)";
371-
preset.category = newCategory;
372-
PlayerPresetManager.addOrUpdatePreset(preset);
373-
374-
sendSuccess(ctx, "Moved '" + playerName + "' from '" + oldCategory + "' to '" + newCategory + "'.");
375-
return 1;
376-
}
377-
378-
private static int executeClearCategory(CommandContext<FabricClientCommandSource> ctx) throws CommandSyntaxException {
379-
String playerName = StringArgumentType.getString(ctx, "player");
380-
381-
UUID playerUUID = resolvePlayerUUID(playerName);
382-
if (playerUUID == null) {
383-
sendError(ctx, "Player '" + playerName + "' not found.");
384-
return 0;
385-
}
386-
387-
String uuidString = playerUUID.toString();
388-
PlayerPreset preset = PlayerPresetManager.getPreset(uuidString);
389-
390-
if (preset == null) {
391-
sendError(ctx, "No preset found for '" + playerName + "'.");
392-
return 0;
393-
}
394-
395-
String oldCategory = preset.category != null ? preset.category : "(no category)";
396-
preset.category = null;
397-
PlayerPresetManager.addOrUpdatePreset(preset);
398-
399-
sendSuccess(ctx, "Removed '" + playerName + "' from category '" + oldCategory + "'.");
400-
return 1;
401-
}
402-
403-
// This works for players who have been seen in the current session.
238+
// Resolves a player's UUID from their username.
404239
private static UUID resolvePlayerUUID(String playerName) {
405-
MinecraftClient client = MinecraftClient.getInstance();
406-
407-
// Check if it's the current player
408-
if (client.player != null && playerName.equalsIgnoreCase(client.player.getName().getString())) {
409-
return client.player.getUuid();
410-
}
411-
412-
// Check player list cache
413-
if (client.getNetworkHandler() != null) {
414-
return client.getNetworkHandler().getPlayerList().stream()
415-
.filter(entry -> entry.getProfile().getName().equalsIgnoreCase(playerName))
416-
.map(entry -> entry.getProfile().getId())
417-
.findFirst()
418-
.orElse(null);
419-
}
420-
421-
// If not found in current session, try to parse as UUID
422-
try {
423-
return UUID.fromString(playerName);
424-
} catch (IllegalArgumentException e) {
425-
return null;
426-
}
240+
return PlayerUUIDResolver.resolvePlayerUUID(playerName);
427241
}
428242

429243
/**

src/main/java/com/github/kd_gaming1/scaleme/client/data/PlayerPreset.java

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.github.kd_gaming1.scaleme.client.data;
22

3+
import com.github.kd_gaming1.scaleme.client.util.PlayerUUIDResolver;
34
import com.google.gson.annotations.SerializedName;
45

6+
import java.util.UUID;
7+
58
/**
69
* Represents a preset for scaling a player.
710
*/
@@ -18,14 +21,17 @@ public class PlayerPreset {
1821
@SerializedName("enabled")
1922
public boolean enabled = true;
2023

21-
@SerializedName("category")
22-
public String category;
2324

24-
public PlayerPreset(String identifier, String friendlyName, float scale, String category) {
25+
public PlayerPreset(String identifier, String friendlyName, float scale) {
2526
this.identifier = identifier;
2627
this.friendlyName = friendlyName;
2728
this.scale = scale;
28-
this.category = category;
29+
}
30+
31+
public PlayerPreset copy() {
32+
PlayerPreset copy = new PlayerPreset(this.identifier, this.friendlyName, this.scale);
33+
copy.enabled = this.enabled;
34+
return copy;
2935
}
3036

3137
/** Checks if this preset matches the given identifier. */
@@ -43,4 +49,26 @@ public boolean isUUID() {
4349
// Simple check for UUID format
4450
return identifier != null && identifier.matches("^[0-9a-fA-F\\-]{36}$");
4551
}
52+
53+
/** Enhanced matching that works with both UUIDs and usernames. */
54+
public boolean matchesPlayer(UUID playerUUID, String playerName) {
55+
if (!enabled) return false;
56+
57+
// Direct UUID match
58+
if (isUUID()) {
59+
try {
60+
return UUID.fromString(identifier).equals(playerUUID);
61+
} catch (IllegalArgumentException e) {
62+
return false;
63+
}
64+
}
65+
66+
// Username match (case insensitive)
67+
return playerName != null && identifier.equalsIgnoreCase(playerName);
68+
}
69+
70+
/** Resolves this preset to a UUID if possible using the standard resolver. */
71+
public UUID resolveToUUID() {
72+
return PlayerUUIDResolver.resolvePlayerUUID(this.identifier);
73+
}
4674
}

0 commit comments

Comments
 (0)