1010import com .minecrafttas .lotas_light .event .EventClientGameLoop ;
1111import com .minecrafttas .lotas_light .event .EventOnClientJoinServer ;
1212import com .minecrafttas .lotas_light .event .HudRenderExperienceCallback ;
13+ import com .minecrafttas .lotas_light .keybind .KeybindManager ;
14+ import com .minecrafttas .lotas_light .keybind .KeybindManager .Keybind ;
1315import com .minecrafttas .lotas_light .savestates .SavestateHandler .SavestateCallback ;
1416import com .minecrafttas .lotas_light .savestates .gui .SavestateDoneGui ;
1517import com .minecrafttas .lotas_light .savestates .gui .SavestateGui ;
1618import com .minecrafttas .lotas_light .savestates .gui .SavestateRenameGui ;
17- import com .mojang .blaze3d .platform .InputConstants ;
1819import net .fabricmc .api .ClientModInitializer ;
19- import net .fabricmc .fabric .api .client .keybinding .v1 .KeyBindingHelper ;
2020import net .minecraft .ChatFormatting ;
2121import net .minecraft .client .DeltaTracker ;
22- import net .minecraft .client .KeyMapping ;
2322import net .minecraft .client .Minecraft ;
2423import net .minecraft .client .gui .GuiGraphics ;
2524import net .minecraft .client .resources .language .I18n ;
3938
4039public class LoTASLightClient implements ClientModInitializer {
4140
42- private KeyMapping increaseTickrate = new KeyMapping ("key.lotaslight.increaseTickrate" , InputConstants .Type .KEYSYM , GLFW .GLFW_KEY_PERIOD , "keycategory.lotaslight.lotaslight" );
43- private KeyMapping decreaseTickrate = new KeyMapping ("key.lotaslight.decreaseTickrate" , InputConstants .Type .KEYSYM , GLFW .GLFW_KEY_COMMA , "keycategory.lotaslight.lotaslight" );
44- private KeyMapping freezeTickrate = new KeyMapping ("key.lotaslight.freezeTickrate" , InputConstants .Type .KEYSYM , GLFW .GLFW_KEY_F8 , "keycategory.lotaslight.lotaslight" );
45- private KeyMapping advanceTickrate = new KeyMapping ("key.lotaslight.advanceTickrate" , InputConstants .Type .KEYSYM , GLFW .GLFW_KEY_F9 , "keycategory.lotaslight.lotaslight" );
46- private KeyMapping savestate = new KeyMapping ("key.lotaslight.savestate" , InputConstants .Type .KEYSYM , GLFW .GLFW_KEY_J , "keycategory.lotaslight.lotaslight" );
47- private KeyMapping loadstate = new KeyMapping ("key.lotaslight.loadstate" , InputConstants .Type .KEYSYM , GLFW .GLFW_KEY_K , "keycategory.lotaslight.lotaslight" );
41+ private KeybindManager keybindManager = new KeybindManager (KeybindManager ::isKeyDownExceptTextField );
4842
4943 private float [] rates = new float [] { .1f , .2f , .5f , 1f , 2f , 5f , 10f , 20f , 40f , 100f };
5044 private short rateIndex = 7 ;
@@ -56,41 +50,24 @@ public class LoTASLightClient implements ClientModInitializer {
5650 @ Override
5751 public void onInitializeClient () {
5852 Minecraft mc = Minecraft .getInstance ();
59- configpath = mc .gameDirectory .toPath ().resolve ("configs /lotas-light.cfg" );
53+ configpath = mc .gameDirectory .toPath ().resolve ("config /lotas-light.cfg" );
6054 config = new Configuration ("LoTAS-Light config" , configpath );
6155 config .loadFromXML ();
56+ LoTASLight .startTickrate = Float .parseFloat (LoTASLightClient .config .get (ConfigOptions .DEFAULT_TICKRATE ));
57+ rateIndex = (short ) findClosestRateIndex (LoTASLight .startTickrate );
6258 registerKeybindings ();
6359 HudRenderExperienceCallback .EVENT .register (this ::drawHud );
6460 }
6561
6662 private void registerKeybindings () {
67- KeyBindingHelper .registerKeyBinding (increaseTickrate );
68- KeyBindingHelper .registerKeyBinding (decreaseTickrate );
69- KeyBindingHelper .registerKeyBinding (freezeTickrate );
70- KeyBindingHelper .registerKeyBinding (advanceTickrate );
71- KeyBindingHelper .registerKeyBinding (savestate );
72- KeyBindingHelper .registerKeyBinding (loadstate );
73-
74- EventClientGameLoop .EVENT .register (client -> {
75- while (increaseTickrate .consumeClick ()) {
76- increaseTickrate (client );
77- }
78- while (decreaseTickrate .consumeClick ()) {
79- decreaseTickrate (client );
80- }
81- while (freezeTickrate .consumeClick ()) {
82- freezeTickrate (client );
83- }
84- while (advanceTickrate .consumeClick ()) {
85- advanceTickrate (client );
86- }
87- while (savestate .consumeClick ()) {
88- savestate ();
89- }
90- while (loadstate .consumeClick ()) {
91- loadstate ();
92- }
93- });
63+ keybindManager .registerKeybind (new Keybind ("key.lotaslight.increaseTickrate" , "keycategory.lotaslight.lotaslight" , GLFW .GLFW_KEY_PERIOD , this ::increaseTickrate ));
64+ keybindManager .registerKeybind (new Keybind ("key.lotaslight.decreaseTickrate" , "keycategory.lotaslight.lotaslight" , GLFW .GLFW_KEY_COMMA , this ::decreaseTickrate ));
65+ keybindManager .registerKeybind (new Keybind ("key.lotaslight.freezeTickrate" , "keycategory.lotaslight.lotaslight" , GLFW .GLFW_KEY_F8 , this ::freezeTickrate , KeybindManager ::isKeyDown ));
66+ keybindManager .registerKeybind (new Keybind ("key.lotaslight.advanceTickrate" , "keycategory.lotaslight.lotaslight" , GLFW .GLFW_KEY_F9 , this ::advanceTickrate , KeybindManager ::isKeyDown ));
67+ keybindManager .registerKeybind (new Keybind ("key.lotaslight.savestate" , "keycategory.lotaslight.lotaslight" , GLFW .GLFW_KEY_J , this ::savestate ));
68+ keybindManager .registerKeybind (new Keybind ("key.lotaslight.loadstate" , "keycategory.lotaslight.lotaslight" , GLFW .GLFW_KEY_K , this ::loadstate ));
69+
70+ EventClientGameLoop .EVENT .register (keybindManager ::onRunClientGameLoop );
9471
9572 EventOnClientJoinServer .EVENT .register (player -> {
9673 if (LoTASLight .savestateHandler .loadStateComplete != null ) {
@@ -102,12 +79,16 @@ private void registerKeybindings() {
10279 }
10380
10481 private void increaseTickrate (Minecraft client ) {
82+ if (client .level == null ) {
83+ return ;
84+ }
10585 TickRateManager clientTickrateChanger = client .level .tickRateManager ();
10686 IntegratedServer server = client .getSingleplayerServer ();
10787 if (server == null ) {
10888 return ;
10989 }
11090 ServerTickRateManager serverTickrateChanger = server .tickRateManager ();
91+ rateIndex = findClosestRateIndex (clientTickrateChanger .tickrate ());
11192
11293 rateIndex ++;
11394 rateIndex = (short ) Math .clamp (rateIndex , 0 , rates .length - 1 );
@@ -124,12 +105,16 @@ private void increaseTickrate(Minecraft client) {
124105 }
125106
126107 private void decreaseTickrate (Minecraft client ) {
108+ if (client .level == null ) {
109+ return ;
110+ }
127111 TickRateManager clientTickrateChanger = client .level .tickRateManager ();
128112 IntegratedServer server = client .getSingleplayerServer ();
129113 if (server == null ) {
130114 return ;
131115 }
132116 ServerTickRateManager serverTickrateChanger = server .tickRateManager ();
117+ rateIndex = findClosestRateIndex (clientTickrateChanger .tickrate ());
133118
134119 rateIndex --;
135120 rateIndex = (short ) Math .clamp (rateIndex , 0 , rates .length - 1 );
@@ -146,6 +131,9 @@ private void decreaseTickrate(Minecraft client) {
146131 }
147132
148133 private void freezeTickrate (Minecraft client ) {
134+ if (client .level == null ) {
135+ return ;
136+ }
149137 TickRateManager clientTickrateManager = client .level .tickRateManager ();
150138 IntegratedServer server = client .getSingleplayerServer ();
151139 if (server == null ) {
@@ -161,6 +149,9 @@ private void freezeTickrate(Minecraft client) {
161149 }
162150
163151 private void advanceTickrate (Minecraft client ) {
152+ if (client .level == null ) {
153+ return ;
154+ }
164155 TickRateManager clientTickrateManager = client .level .tickRateManager ();
165156 IntegratedServer server = client .getSingleplayerServer ();
166157 if (server == null ) {
@@ -191,9 +182,11 @@ private void drawHud(GuiGraphics context, DeltaTracker deltaTicks) {
191182 //# end
192183 }
193184
194- private void savestate () {
195- Minecraft mc = Minecraft .getInstance ();
185+ private void savestate (Minecraft mc ) {
196186 MinecraftServer server = mc .getSingleplayerServer ();
187+ if (server == null ) {
188+ return ;
189+ }
197190 for (ServerLevel level : server .getAllLevels ()) {
198191 level .noSave = true ;
199192 }
@@ -224,12 +217,15 @@ private void savestate() {
224217 }
225218 mc .gui .getChat ().addMessage (Component .literal (message ).withStyle (ChatFormatting .RED ));
226219 LoTASLight .savestateHandler .resetState ();
220+ Minecraft .getInstance ().setScreen (null );
227221 }
228222 }
229223
230- private void loadstate () {
231- Minecraft mc = Minecraft .getInstance ();
232-
224+ private void loadstate (Minecraft mc ) {
225+ MinecraftServer server = mc .getSingleplayerServer ();
226+ if (server == null ) {
227+ return ;
228+ }
233229 SavestateCallback doneLoadingCallback = (paths -> {
234230 //@formatter:off
235231 mc .setScreen (
@@ -245,7 +241,7 @@ private void loadstate() {
245241 });
246242
247243 try {
248- MinecraftServer server = mc . getSingleplayerServer ();
244+
249245 for (ServerLevel level : server .getAllLevels ()) {
250246 level .noSave = true ;
251247 }
@@ -259,6 +255,37 @@ private void loadstate() {
259255 }
260256 mc .gui .getChat ().addMessage (Component .literal (message ).withStyle (ChatFormatting .RED ));
261257 LoTASLight .savestateHandler .resetState ();
258+ Minecraft .getInstance ().setScreen (null );
259+ }
260+ }
261+
262+ private short findClosestRateIndex (float tickrate ) {
263+ for (int i = 0 ; i < rates .length ; i ++) {
264+ int iMinus1 = i - 1 ;
265+
266+ float min = 0f ;
267+ if (iMinus1 >= 0 ) {
268+ min = rates [iMinus1 ];
269+ }
270+ float max = rates [i ];
271+
272+ if (tickrate >= min && tickrate < max ) {
273+ if (min == 0f ) {
274+ return (short ) i ;
275+ }
276+
277+ float distanceToMin = tickrate - min ;
278+ float distanceToMax = max - tickrate ;
279+
280+ if (distanceToMin < distanceToMax ) {
281+ return (short ) iMinus1 ;
282+ } else if (distanceToMax < distanceToMin ) {
283+ return (short ) i ;
284+ } else {
285+ return (short ) iMinus1 ;
286+ }
287+ }
262288 }
289+ return (short ) (rates .length - 1 );
263290 }
264291}
0 commit comments