1+ package com .jelly .farmhelperv2 .feature .impl ;
2+
3+ import cc .polyfrost .oneconfig .utils .Multithreading ;
4+ import com .jelly .farmhelperv2 .config .FarmHelperConfig ;
5+ import com .jelly .farmhelperv2 .handler .MacroHandler ;
6+ import com .jelly .farmhelperv2 .util .InventoryUtils ;
7+ import com .jelly .farmhelperv2 .util .LogUtils ;
8+ import com .jelly .farmhelperv2 .util .PlayerUtils ;
9+ import com .jelly .farmhelperv2 .util .helper .Clock ;
10+ import com .jelly .farmhelperv2 .util .helper .SignUtils ;
11+ import net .minecraft .client .Minecraft ;
12+ import net .minecraftforge .common .MinecraftForge ;
13+ import net .minecraftforge .event .world .WorldEvent ;
14+ import net .minecraftforge .fml .common .eventhandler .SubscribeEvent ;
15+ import net .minecraftforge .fml .common .gameevent .TickEvent ;
16+ import java .util .concurrent .TimeUnit ;
17+
18+
19+ public final class RancherSpeedSetter {
20+ /** @return true if need to change speed (async started), false otherwise */
21+ public static boolean runIfNeeded (Runnable after ) {
22+ if (!FarmHelperConfig .customFarmingSpeed ) return false ;
23+
24+ int current = InventoryUtils .getRancherBootSpeed ();
25+ if (current == -1 ) return false ;
26+ if (current == FarmHelperConfig .farmingSpeed ) return false ;
27+
28+ INSTANCE .start (after );
29+ return true ;
30+ }
31+
32+ private enum Stage { NONE , START , INPUT , CONFIRM , END }
33+
34+ private static final RancherSpeedSetter INSTANCE = new RancherSpeedSetter ();
35+
36+ private final Minecraft mc = Minecraft .getMinecraft ();
37+ private final Clock clock = new Clock ();
38+ private Stage stage = Stage .NONE ;
39+ private Runnable callback ;
40+ private boolean enabled ;
41+ private boolean worldChanging ;
42+
43+ private RancherSpeedSetter () {}
44+
45+ private void start (Runnable after ) {
46+ if (enabled ) return ;
47+ this .callback = after ;
48+ this .stage = Stage .START ;
49+ this .enabled = true ;
50+ this .worldChanging = false ;
51+ clock .reset ();
52+ MinecraftForge .EVENT_BUS .register (this );
53+ LogUtils .sendDebug ("[Rancher Speed Setter]: starting (target " + FarmHelperConfig .farmingSpeed + ")" );
54+ }
55+
56+ @ SubscribeEvent
57+ public void onWorldUnload (WorldEvent .Unload e ) { worldChanging = true ; }
58+
59+ @ SubscribeEvent
60+ public void onTick (TickEvent .ClientTickEvent e ) {
61+ if (!enabled || e .phase == TickEvent .Phase .END ) return ;
62+ if (mc .thePlayer == null || mc .theWorld == null || worldChanging ) { finish (); return ; }
63+ if (clock .isScheduled () && !clock .passed ()) return ;
64+
65+ switch (stage ) {
66+ case START : {
67+ mc .thePlayer .sendChatMessage ("/setmaxspeed" );
68+ stage = Stage .INPUT ;
69+ clock .schedule (750 );
70+ break ;
71+ }
72+ case INPUT : {
73+ if (mc .currentScreen == null ) break ;
74+ SignUtils .setTextToWriteOnString (String .valueOf (FarmHelperConfig .farmingSpeed ));
75+ stage = Stage .CONFIRM ;
76+ clock .schedule (750 );
77+ break ;
78+ }
79+ case CONFIRM : {
80+ if (mc .currentScreen == null ) break ;
81+ SignUtils .confirmSign ();
82+ stage = Stage .END ;
83+ clock .schedule (750 );
84+ break ;
85+ }
86+ case END : {
87+ LogUtils .sendSuccess ("Rancher's Boots Speed set to " + FarmHelperConfig .farmingSpeed + "." );
88+ PlayerUtils .getFarmingTool (MacroHandler .getInstance ().getCrop (), false , false );
89+ finish ();
90+ break ;
91+ }
92+ default : break ;
93+ }
94+ }
95+
96+ private void finish () {
97+ enabled = false ;
98+ stage = Stage .NONE ;
99+ clock .reset ();
100+ MinecraftForge .EVENT_BUS .unregister (this );
101+ if (callback != null ) {
102+ Runnable run = callback ;
103+ callback = null ;
104+ Multithreading .schedule (run , 1 , TimeUnit .MILLISECONDS );
105+ }
106+ }
107+ }
0 commit comments