44
55import org .slf4j .Logger ;
66import org .slf4j .LoggerFactory ;
7- import net .fabricmc .fabric .api .event .lifecycle .v1 .ServerTickEvents ;
7+ import net .fabricmc .fabric .api .client .event .lifecycle .v1 .ClientTickEvents ;
8+ import net .minecraft .client .MinecraftClient ;
9+ import net .minecraft .client .network .ClientPlayerEntity ;
10+ import net .minecraft .util .math .BlockPos ;
11+ import net .minecraft .world .Heightmap ;
12+
13+ enum FlyState {
14+ NOT_FLYING ,
15+ PITCHING_DOWN ,
16+ GLIDING_DOWN
17+ };
818
919public class ElytraInfinite implements ClientModInitializer {
1020 public static final String MOD_ID = "elytra-autopilot" ;
11-
12- // This logger is used to write text to the console and the log file.
13- // It is considered best practice to use your mod id as the logger's name.
14- // That way, it's clear which mod wrote info, warnings, and errors.
1521 public static final Logger LOGGER = LoggerFactory .getLogger (MOD_ID );
16-
22+
23+ static final float pitchDown = 34f ;
24+ static final float pitchUp = -47f ;
25+ static final float pitchDownSpeed = 0.5f ;
26+ private FlyState state = FlyState .NOT_FLYING ;
27+
1728 @ Override
1829 public void onInitializeClient () {
19- // This code runs as soon as Minecraft is in a mod-load-ready state.
20- // However, some things (like resources) may still be uninitialized.
21- // Proceed with mild caution.
22-
23- LOGGER .info ("Hello Fabric world!" );
30+ ClientTickEvents .START_WORLD_TICK .register (world -> {
31+ ClientPlayerEntity player = MinecraftClient .getInstance ().player ;
32+ if (player == null || !player .isGliding ())
33+ return ;
34+ if (state == FlyState .NOT_FLYING ) {
35+ state = FlyState .PITCHING_DOWN ;
36+ }
37+ if (state == FlyState .PITCHING_DOWN ) {
38+ float pitch = player .getPitch ();
39+ pitch += Math .min (pitchDown - pitch , pitchDownSpeed ); // change pitch by no more than pitchDownSpeed
40+ if (pitch >= pitchDown ) // fully pitched down, start gliding
41+ state = FlyState .GLIDING_DOWN ;
42+ player .setPitch (pitch );
43+ }
44+ if (state == FlyState .GLIDING_DOWN ) {
45+ BlockPos pos = player .getBlockPos ();
46+ int height = world .getChunk (pos ).sampleHeightmap (Heightmap .Type .WORLD_SURFACE , pos .getX (), pos .getZ ());
47+ if (pos .getY () - height < 5 ) {
48+ player .setPitch (pitchUp );
49+ state = FlyState .PITCHING_DOWN ;
50+ }
51+ else
52+ player .setPitch (pitchDown ); // enforce down pitch
53+ }
54+ });
55+ LOGGER .info ("Elytra infinite loaded." );
2456 }
2557}
0 commit comments