Skip to content

Commit 4846322

Browse files
committed
Add basic pitch controls
1 parent b9317e1 commit 4846322

1 file changed

Lines changed: 43 additions & 11 deletions

File tree

src/main/java/meanwhile131/elytrainfinite/ElytraInfinite.java

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,54 @@
44

55
import org.slf4j.Logger;
66
import 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

919
public 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

Comments
 (0)