@@ -37,74 +37,83 @@ import net.minecraft.util.hit.HitResult
3737
3838object BetterFirework : Module(
3939 name = " BetterFirework" ,
40- description = " Improves firework usage " ,
40+ description = " Automatic takeoff with fireworks " ,
4141 tag = ModuleTag .MOVEMENT ,
4242) {
43- private var autoTakeoff by setting(" Auto Takeoff" , true )
44- private var silent by setting(" Silent" , true )
45- private var swing by setting(" Swing " , true )
46- private var middleClick by setting(" Middle click" , true )
47- private var middleClickCancel by setting(" Middle Click Cancel" , false , visibility = { middleClick })
43+ private var fireworkInteract by setting(" Firework Interact" , true , " Automatically start flying when right clicking fireworks" )
44+ private var fireworkInteractCancel by setting(" Firework Interact Cancel" , false , " Cancel block interactions while holding fireworks" , visibility = { fireworkInteract })
45+ private var middleClick by setting(" Middle Click" , true , " Use firework on middle mouse click" )
46+ private var middleClickCancel by setting(" Middle Click Cancel" , false , description = " Cancel pick block action on middle mouse click" , visibility = { middleClick })
47+ private var clientSwing by setting(" Swing" , true , " Swing hand client side" )
48+ private var silentUse by setting(" Silent" , true , " Silent use fireworks from the inventory" , visibility = { middleClick })
4849
49- private var state = BetterFireworkState .IDLE
5050 private var openDelay = 0
5151
5252 init {
5353 listen<TickEvent .Pre > {
54+ // Try opening the elytra after a delay after jumping
5455 if (openDelay > 0 ) {
5556 openDelay--
56- if (openDelay == 0 && state == BetterFireworkState .WAIT_AIRBORNE ) {
57- state = BetterFireworkState .IDLE
58- startFlying()
57+ if (openDelay == 0 ) {
58+ tryTakeoff()
5959 }
6060 }
6161 }
6262 }
6363
64- fun onInteract (): Boolean {
65- if (! autoTakeoff) return false
66-
64+ /* *
65+ * Returns true if the mc item interaction should be canceled
66+ */
67+ fun onInteract () =
6768 runSafe {
68- if (player.inventory.selectedStack?.item == Items .FIREWORK_ROCKET ) {
69- if (mc.crosshairTarget != null && mc.crosshairTarget!! .type != HitResult .Type .MISS ) {
70- return false
71- }
72-
73- mc.itemUseCooldown + = 4
74- return startFlying()
69+ if (! fireworkInteract) return false
70+ if (player.inventory.selectedStack?.item != Items .FIREWORK_ROCKET ) {
71+ return false
7572 }
76- }
77- return false
78- }
73+ if (player.isGliding) {
74+ return false // No need to do special magic if we are already holding fireworks and flying
75+ }
76+ if (mc.crosshairTarget != null && mc.crosshairTarget!! .type != HitResult .Type .MISS && ! fireworkInteractCancel) {
77+ return false
78+ }
79+ mc.itemUseCooldown + = 4
80+ return tryTakeoff() || fireworkInteractCancel
81+ } ? : false
7982
80- // Do on pick so mc does not select blocks on middle click after we start flying
83+ /* *
84+ * Returns true when the pick interaction should be canceled.
85+ */
8186 fun onPick () =
8287 runSafe {
8388 if (! middleClick) return false
8489 if (mc.crosshairTarget?.type == HitResult .Type .BLOCK && ! middleClickCancel) {
8590 return false
8691 }
8792 if (player.isGliding) {
88- startFirework(silent)
93+ // If already gliding use another firework
94+ startFirework(silentUse)
8995 } else {
90- startFlying ()
96+ tryTakeoff ()
9197 }
9298 return true
9399 } ? : false // Edouardo: :3333333
94100
95- fun SafeContext.startFlying (): Boolean {
101+ /* *
102+ * This function prepares takeoff from standing or falling.
103+ * If the player is standing on ground it jumps to prepare for takeoff and return true.
104+ * If the player is falling it opens the elytra, uses a firework and return true.
105+ * Otherwise, return false and does nothing.
106+ */
107+ fun SafeContext.tryTakeoff (): Boolean {
96108 if (player.isOnGround) {
97- state = BetterFireworkState .WAIT_AIRBORNE
98109 player.jump()
99- openDelay = 1 ; // Magic number
110+ openDelay = 1 ; // Magic number, works on 2b so we GUCCI
100111 return true
101112 }
102113
103- if (player.isGliding) return false
104-
105114 if (canOpenElytra(player)) {
106115 connection.sendPacket(ClientCommandC2SPacket (player, ClientCommandC2SPacket .Mode .START_FALL_FLYING ))
107- startFirework(silent )
116+ startFirework(silentUse )
108117 return true
109118 }
110119
@@ -116,13 +125,17 @@ object BetterFirework : Module(
116125 }
117126
118127 fun SafeContext.sendSwing () {
119- if (swing ) {
128+ if (clientSwing ) {
120129 player.swingHand(Hand .MAIN_HAND )
121130 } else {
122131 connection.sendPacket(HandSwingC2SPacket (Hand .MAIN_HAND ))
123132 }
124133 }
125134
135+ /* *
136+ * Use a firework from the hotbar or inventory if possible.
137+ * Return true if a firework has been used
138+ */
126139 fun SafeContext.startFirework (silent : Boolean ): Boolean {
127140 val fireworkSlot = getFireworkAtHotbar()
128141 if (fireworkSlot != - 1 ) {
@@ -171,9 +184,4 @@ object BetterFirework : Module(
171184 }
172185 return - 1
173186 }
174-
175- enum class BetterFireworkState {
176- IDLE ,
177- WAIT_AIRBORNE
178- }
179187}
0 commit comments