1+ package com .github .scaleme .client .command ;
2+
3+ import com .github .scaleme .client .data .PlayerPreset ;
4+ import com .github .scaleme .client .util .PlayerPresetManager ;
5+ import com .mojang .brigadier .CommandDispatcher ;
6+ import com .mojang .brigadier .arguments .FloatArgumentType ;
7+ import com .mojang .brigadier .arguments .StringArgumentType ;
8+ import net .fabricmc .fabric .api .client .command .v2 .ClientCommandManager ;
9+ import net .fabricmc .fabric .api .client .command .v2 .FabricClientCommandSource ;
10+ import net .minecraft .text .Text ;
11+ import net .minecraft .util .Formatting ;
12+
13+ public class PresetCommand {
14+
15+ public static void register (CommandDispatcher <FabricClientCommandSource > dispatcher ) {
16+ dispatcher .register (ClientCommandManager .literal ("scalepreset" )
17+ .then (ClientCommandManager .literal ("add" )
18+ .then (ClientCommandManager .argument ("identifier" , StringArgumentType .word ())
19+ .then (ClientCommandManager .argument ("scale" , FloatArgumentType .floatArg (0.1f , 3.0f ))
20+ .executes (context -> {
21+ String identifier = StringArgumentType .getString (context , "identifier" );
22+ float scale = FloatArgumentType .getFloat (context , "scale" );
23+
24+ // Create preset with identifier as display name and default category
25+ PlayerPreset preset = new PlayerPreset (identifier , null , scale , "command" );
26+
27+ PlayerPresetManager .addPreset (preset );
28+
29+ context .getSource ().sendFeedback (Text .literal ("Added preset for: " + identifier + " (Scale: " + scale + "x)" )
30+ .formatted (Formatting .GREEN ));
31+
32+ return 1 ;
33+ })
34+ .then (ClientCommandManager .argument ("displayName" , StringArgumentType .greedyString ())
35+ .executes (context -> {
36+ String identifier = StringArgumentType .getString (context , "identifier" );
37+ float scale = FloatArgumentType .getFloat (context , "scale" );
38+ String displayName = StringArgumentType .getString (context , "displayName" );
39+
40+ PlayerPreset preset = new PlayerPreset (identifier , displayName , scale , "command" );
41+
42+ PlayerPresetManager .addPreset (preset );
43+
44+ context .getSource ().sendFeedback (Text .literal ("Added preset: " + displayName + " for " + identifier + " (Scale: " + scale + "x)" )
45+ .formatted (Formatting .GREEN ));
46+
47+ return 1 ;
48+ })))))
49+ .then (ClientCommandManager .literal ("remove" )
50+ .then (ClientCommandManager .argument ("identifier" , StringArgumentType .greedyString ())
51+ .executes (context -> {
52+ String identifier = StringArgumentType .getString (context , "identifier" );
53+
54+ PlayerPresetManager .removePreset (identifier , isUUID (identifier ));
55+
56+ context .getSource ().sendFeedback (Text .literal ("Removed preset for: " + identifier )
57+ .formatted (Formatting .YELLOW ));
58+
59+ return 1 ;
60+ })))
61+ .then (ClientCommandManager .literal ("list" )
62+ .executes (context -> {
63+ var presets = PlayerPresetManager .getAllPresets ();
64+ if (presets .isEmpty ()) {
65+ context .getSource ().sendFeedback (Text .literal ("No presets found." )
66+ .formatted (Formatting .GRAY ));
67+ } else {
68+ context .getSource ().sendFeedback (Text .literal ("Player Presets:" )
69+ .formatted (Formatting .GOLD ));
70+ for (PlayerPreset preset : presets ) {
71+ String displayName = preset .getEffectiveDisplayName ();
72+ String identifierType = preset .isUUID () ? "UUID" : "Username" ;
73+ String line = String .format ("- %s (%s: %s) - %.1fx [%s] %s" ,
74+ displayName ,
75+ identifierType ,
76+ preset .identifier ,
77+ preset .scale ,
78+ preset .category ,
79+ preset .enabled ? "[Enabled]" : "[Disabled]" );
80+ context .getSource ().sendFeedback (Text .literal (line )
81+ .formatted (preset .enabled ? Formatting .WHITE : Formatting .GRAY ));
82+ }
83+ }
84+ return 1 ;
85+ }))
86+ .then (ClientCommandManager .literal ("toggle" )
87+ .then (ClientCommandManager .argument ("identifier" , StringArgumentType .greedyString ())
88+ .executes (context -> {
89+ String identifier = StringArgumentType .getString (context , "identifier" );
90+
91+ // Find the preset
92+ PlayerPreset foundPreset = null ;
93+ for (PlayerPreset preset : PlayerPresetManager .getAllPresets ()) {
94+ if (preset .identifier .equalsIgnoreCase (identifier )) {
95+ foundPreset = preset ;
96+ break ;
97+ }
98+ }
99+
100+ if (foundPreset != null ) {
101+ // Toggle the enabled state
102+ foundPreset .enabled = !foundPreset .enabled ;
103+
104+ // Remove and re-add to save changes
105+ PlayerPresetManager .removePreset (foundPreset .identifier , foundPreset .isUUID ());
106+ PlayerPresetManager .addPreset (foundPreset );
107+
108+ String status = foundPreset .enabled ? "enabled" : "disabled" ;
109+ context .getSource ().sendFeedback (Text .literal ("Preset for " + identifier + " is now " + status )
110+ .formatted (foundPreset .enabled ? Formatting .GREEN : Formatting .RED ));
111+ } else {
112+ context .getSource ().sendFeedback (Text .literal ("No preset found for: " + identifier )
113+ .formatted (Formatting .RED ));
114+ }
115+
116+ return 1 ;
117+ })))
118+ .then (ClientCommandManager .literal ("category" )
119+ .then (ClientCommandManager .argument ("identifier" , StringArgumentType .word ())
120+ .then (ClientCommandManager .argument ("category" , StringArgumentType .word ())
121+ .executes (context -> {
122+ String identifier = StringArgumentType .getString (context , "identifier" );
123+ String category = StringArgumentType .getString (context , "category" );
124+
125+ // Find the preset
126+ PlayerPreset foundPreset = null ;
127+ for (PlayerPreset preset : PlayerPresetManager .getAllPresets ()) {
128+ if (preset .identifier .equalsIgnoreCase (identifier )) {
129+ foundPreset = preset ;
130+ break ;
131+ }
132+ }
133+
134+ if (foundPreset != null ) {
135+ // Update category
136+ foundPreset .category = category ;
137+
138+ // Remove and re-add to save changes
139+ PlayerPresetManager .removePreset (foundPreset .identifier , foundPreset .isUUID ());
140+ PlayerPresetManager .addPreset (foundPreset );
141+
142+ context .getSource ().sendFeedback (Text .literal ("Updated category for " + identifier + " to: " + category )
143+ .formatted (Formatting .GREEN ));
144+ } else {
145+ context .getSource ().sendFeedback (Text .literal ("No preset found for: " + identifier )
146+ .formatted (Formatting .RED ));
147+ }
148+
149+ return 1 ;
150+ }))))
151+ .then (ClientCommandManager .literal ("help" )
152+ .executes (context -> {
153+ context .getSource ().sendFeedback (Text .literal ("ScaleMe Preset Commands:" )
154+ .formatted (Formatting .GOLD ));
155+ context .getSource ().sendFeedback (Text .literal ("/scalepreset add <identifier> <scale> [displayName] - Add a new preset" ));
156+ context .getSource ().sendFeedback (Text .literal ("/scalepreset remove <identifier> - Remove a preset" ));
157+ context .getSource ().sendFeedback (Text .literal ("/scalepreset list - List all presets" ));
158+ context .getSource ().sendFeedback (Text .literal ("/scalepreset toggle <identifier> - Enable/disable a preset" ));
159+ context .getSource ().sendFeedback (Text .literal ("/scalepreset category <identifier> <category> - Change preset category" ));
160+ context .getSource ().sendFeedback (Text .literal ("/scalepreset help - Show this help" ));
161+ context .getSource ().sendFeedback (Text .literal ("Scale range: 0.1x to 3.0x" )
162+ .formatted (Formatting .GRAY ));
163+ context .getSource ().sendFeedback (Text .literal ("UUIDs are automatically detected" )
164+ .formatted (Formatting .GRAY ));
165+ return 1 ;
166+ }))
167+ );
168+ }
169+
170+ private static boolean isUUID (String identifier ) {
171+ // Simple UUID detection - 36 characters with hyphens in correct positions
172+ return identifier != null && identifier .matches ("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" );
173+ }
174+ }
0 commit comments