1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
package ftbsc.bscv.modules.motion;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.BoolArgumentType;
import com.mojang.brigadier.arguments.DoubleArgumentType;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import ftbsc.bscv.BoSCoVicino;
import ftbsc.bscv.ICommons;
import ftbsc.bscv.modules.QuickModule;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.command.CommandSource;
import net.minecraft.network.play.client.CPlayerPacket;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.TickEvent.Phase;
import net.minecraftforge.eventbus.api.SubscribeEvent;
public class VanillaFlight extends QuickModule implements ICommons {
public final ForgeConfigSpec.ConfigValue<Boolean> force;
public final ForgeConfigSpec.ConfigValue<Double> speed;
public final ForgeConfigSpec.ConfigValue<Boolean> antikick;
public final ForgeConfigSpec.ConfigValue<Double> antikick_magnitude;
public final ForgeConfigSpec.ConfigValue<Integer> antikick_cycle;
private int tick = 0;
public VanillaFlight(ForgeConfigSpec.Builder builder, CommandDispatcher<CommandSource> dispatcher) {
super("VanillaFlight", Group.MOTION, UNBOUND, builder, dispatcher);
this.force = this.option(
"force", "force enable flight on user", false,
BoolArgumentType.bool(), Boolean.class,
builder, dispatcher
);
this.speed = this.option(
"speed", "flight speed to set", 0.05,
DoubleArgumentType.doubleArg(0.0), Double.class,
builder, dispatcher
);
this.antikick = this.option(
"antikick", "prevent vanilla flight kick by descending", false,
BoolArgumentType.bool(), Boolean.class,
builder, dispatcher
);
this.antikick_magnitude = this.option(
"magnitude", "magnitude of antikick push", 1.0,
DoubleArgumentType.doubleArg(0.0), Double.class,
builder, dispatcher
);
this.antikick_cycle = this.option(
"cycle", "how often to run antikick routine", 0,
IntegerArgumentType.integer(0, 79), Integer.class,
builder, dispatcher
);
}
private boolean couldFlyBefore = false;
private float flyingSpeedBefore = 0.05f;
@SubscribeEvent
public void onTick(TickEvent.ClientTickEvent event) {
if (event.phase == Phase.END) return;
if (MC.player == null) return;
MC.player.abilities.mayfly = true;
MC.player.abilities.setFlyingSpeed(this.speed.get().floatValue());
if (this.force.get()) {
MC.player.abilities.flying = true;
}
if (this.antikick.get() && MC.player.abilities.flying) {
this.tick = ( this.tick + 1 ) % this.antikick_cycle.get();
if (this.tick == 0) {
Vector3d pos = MC.player.position();
BoSCoVicino.log("[*] antikick");
MC.player.connection.send(
new CPlayerPacket.PositionPacket(pos.x, pos.y - this.antikick_magnitude.get(), pos.z, false)
);
MC.player.setPos(pos.x, pos.y - this.antikick_magnitude.get(), pos.z);
}
} else {
this.tick = 0; // reset antikick counter
}
}
@Override
protected void onEnabled() {
this.tick = 0;
if (MC.player != null) {
this.couldFlyBefore = MC.player.abilities.mayfly;
this.flyingSpeedBefore = MC.player.abilities.getFlyingSpeed();
BoSCoVicino.log(String.format("Flying speed before = %f", this.flyingSpeedBefore));
}
}
@Override
protected void onDisabled() {
ClientPlayerEntity player = MC.player;
if (player != null) {
player.abilities.mayfly = this.couldFlyBefore;
player.abilities.setFlyingSpeed(this.flyingSpeedBefore);
if (this.force.get()) {
player.abilities.flying = false;
}
}
}
}
|