2019-10-27 15:45:44 +00:00
package me.rigamortis.seppuku.impl.module.world ;
2021-05-16 15:52:59 +00:00
import java.awt.* ;
import me.rigamortis.seppuku.Seppuku ;
2019-10-27 15:45:44 +00:00
import me.rigamortis.seppuku.api.event.EventStageable ;
2019-11-29 23:45:01 +00:00
import me.rigamortis.seppuku.api.event.player.EventClickBlock ;
import me.rigamortis.seppuku.api.event.player.EventPlayerDamageBlock ;
import me.rigamortis.seppuku.api.event.player.EventPlayerUpdate ;
import me.rigamortis.seppuku.api.event.player.EventResetBlockRemoving ;
2021-05-16 15:52:59 +00:00
import me.rigamortis.seppuku.api.event.render.EventRender3D ;
2019-10-27 15:45:44 +00:00
import me.rigamortis.seppuku.api.module.Module ;
2021-05-16 15:52:59 +00:00
import me.rigamortis.seppuku.api.util.ColorUtil ;
import me.rigamortis.seppuku.api.util.RenderUtil ;
2019-11-30 00:31:05 +00:00
import me.rigamortis.seppuku.api.value.Value ;
2019-10-27 15:45:44 +00:00
import net.minecraft.block.Block ;
import net.minecraft.block.state.IBlockState ;
import net.minecraft.client.Minecraft ;
2021-05-15 22:56:09 +00:00
import net.minecraft.init.Blocks ;
2019-10-27 15:45:44 +00:00
import net.minecraft.network.play.client.CPacketPlayerDigging ;
2021-05-15 22:56:09 +00:00
import net.minecraft.util.EnumFacing ;
2019-10-27 15:45:44 +00:00
import net.minecraft.util.EnumHand ;
2021-05-16 15:52:59 +00:00
import net.minecraft.util.math.AxisAlignedBB ;
2019-10-27 15:45:44 +00:00
import net.minecraft.util.math.BlockPos ;
import team.stiff.pomelo.impl.annotated.handler.annotation.Listener ;
/ * *
* Author Seth
* 4 / 24 / 2019 @ 12 : 16 PM .
* /
public final class SpeedMineModule extends Module {
2021-05-16 18:30:48 +00:00
public final Value < Mode > mode = new Value < Mode > ( " Mode " , new String [ ] { " Mode " , " M " } , " The speed-mine mode to use. " , Mode . DAMAGE ) ;
2019-10-27 15:45:44 +00:00
2019-11-30 00:31:05 +00:00
private enum Mode {
2021-05-15 22:56:09 +00:00
PACKET , DAMAGE , INSTANT , SEQUENTIAL
2019-11-30 00:31:05 +00:00
}
2021-05-16 15:52:59 +00:00
public static BlockPos autoPos ;
2021-05-16 18:30:48 +00:00
public BlockPos seqPos ;
2021-05-15 22:56:09 +00:00
public EnumFacing seqDir ;
2021-05-16 18:30:48 +00:00
public final Minecraft mc = Minecraft . getMinecraft ( ) ;
2021-05-15 22:56:09 +00:00
2019-11-30 00:31:05 +00:00
public final Value < Boolean > reset = new Value < Boolean > ( " Reset " , new String [ ] { " Res " } , " Stops current block destroy damage from resetting if enabled. " , true ) ;
public final Value < Boolean > doubleBreak = new Value < Boolean > ( " DoubleBreak " , new String [ ] { " DoubleBreak " , " Double " , " DB " } , " Mining a block will also mine the block above it, if enabled. " , false ) ;
2021-05-16 18:30:48 +00:00
public final Value < Boolean > auto = new Value < Boolean > ( " Auto " , new String [ ] { " Res " } , " When enabled, allows for multi-mining blocks. " , false ) ;
2019-10-27 15:45:44 +00:00
public SpeedMineModule ( ) {
super ( " SpeedMine " , new String [ ] { " FastMine " } , " Allows you to break blocks faster " , " NONE " , - 1 , ModuleType . WORLD ) ;
}
@Override
public String getMetaData ( ) {
2019-11-30 00:31:05 +00:00
return this . mode . getValue ( ) . name ( ) ;
2019-10-27 15:45:44 +00:00
}
@Listener
public void onUpdate ( EventPlayerUpdate event ) {
2021-05-15 22:56:09 +00:00
2019-10-27 15:45:44 +00:00
if ( event . getStage ( ) = = EventStageable . EventStage . PRE ) {
2021-05-15 22:56:09 +00:00
mc . playerController . blockHitDelay = 0 ;
2019-10-27 15:45:44 +00:00
2021-05-15 22:56:09 +00:00
if ( seqPos ! = null & & mc . world . getBlockState ( seqPos ) . getBlock ( ) ! = Blocks . AIR & & mode . getValue ( ) = = Mode . SEQUENTIAL ) {
mc . player . connection . sendPacket ( new CPacketPlayerDigging ( CPacketPlayerDigging . Action . STOP_DESTROY_BLOCK , seqPos , seqDir ) ) ;
}
if ( this . reset . getValue ( ) & & mc . gameSettings . keyBindUseItem . isKeyDown ( ) ) {
mc . playerController . isHittingBlock = false ;
2019-10-27 15:45:44 +00:00
}
}
}
@Listener
public void resetBlockDamage ( EventResetBlockRemoving event ) {
2019-11-30 00:31:05 +00:00
if ( this . reset . getValue ( ) ) {
2019-10-27 15:45:44 +00:00
event . setCanceled ( true ) ;
}
}
@Listener
public void clickBlock ( EventClickBlock event ) {
2019-11-30 00:31:05 +00:00
if ( this . reset . getValue ( ) ) {
2021-05-15 22:56:09 +00:00
if ( mc . playerController . curBlockDamageMP > 0 . 1f ) {
mc . playerController . isHittingBlock = true ;
2019-10-27 15:45:44 +00:00
}
}
}
2021-05-16 15:52:59 +00:00
@Listener
public void onRender ( EventRender3D event ) {
if ( ! auto . getValue ( ) ) return ;
if ( autoPos ! = null & & mc . world . getBlockState ( autoPos ) . getBlock ( ) ! = Blocks . AIR ) {
RenderUtil . begin3D ( ) ;
final AxisAlignedBB bb = new AxisAlignedBB (
autoPos . getX ( ) - mc . getRenderManager ( ) . viewerPosX ,
autoPos . getY ( ) - mc . getRenderManager ( ) . viewerPosY ,
autoPos . getZ ( ) - mc . getRenderManager ( ) . viewerPosZ ,
autoPos . getX ( ) + 1 - mc . getRenderManager ( ) . viewerPosX ,
autoPos . getY ( ) + 1 - mc . getRenderManager ( ) . viewerPosY ,
autoPos . getZ ( ) + 1 - mc . getRenderManager ( ) . viewerPosZ
) ;
RenderUtil . drawBoundingBox ( bb , 2f , new Color ( 255 , 255 , 255 ) . getRGB ( ) ) ;
RenderUtil . end3D ( ) ;
}
}
2019-10-27 15:45:44 +00:00
@Listener
public void damageBlock ( EventPlayerDamageBlock event ) {
if ( canBreak ( event . getPos ( ) ) ) {
2019-11-30 00:31:05 +00:00
if ( this . reset . getValue ( ) ) {
2019-10-27 15:45:44 +00:00
mc . playerController . isHittingBlock = false ;
}
2019-11-30 00:31:05 +00:00
switch ( this . mode . getValue ( ) ) {
case PACKET :
2019-10-27 15:45:44 +00:00
mc . player . swingArm ( EnumHand . MAIN_HAND ) ;
mc . player . connection . sendPacket ( new CPacketPlayerDigging ( CPacketPlayerDigging . Action . START_DESTROY_BLOCK , event . getPos ( ) , event . getFace ( ) ) ) ;
mc . player . connection . sendPacket ( new CPacketPlayerDigging ( CPacketPlayerDigging . Action . STOP_DESTROY_BLOCK , event . getPos ( ) , event . getFace ( ) ) ) ;
event . setCanceled ( true ) ;
break ;
2019-11-30 00:31:05 +00:00
case DAMAGE :
2019-10-27 15:45:44 +00:00
if ( mc . playerController . curBlockDamageMP > = 0 . 7f ) {
mc . playerController . curBlockDamageMP = 1 . 0f ;
2021-05-16 15:52:59 +00:00
if ( auto . getValue ( ) ) {
mode . setValue ( Mode . INSTANT ) ;
}
2019-10-27 15:45:44 +00:00
}
break ;
2019-11-30 00:31:05 +00:00
case INSTANT :
2019-10-27 15:45:44 +00:00
mc . player . swingArm ( EnumHand . MAIN_HAND ) ;
mc . player . connection . sendPacket ( new CPacketPlayerDigging ( CPacketPlayerDigging . Action . START_DESTROY_BLOCK , event . getPos ( ) , event . getFace ( ) ) ) ;
mc . player . connection . sendPacket ( new CPacketPlayerDigging ( CPacketPlayerDigging . Action . STOP_DESTROY_BLOCK , event . getPos ( ) , event . getFace ( ) ) ) ;
mc . playerController . onPlayerDestroyBlock ( event . getPos ( ) ) ;
mc . world . setBlockToAir ( event . getPos ( ) ) ;
2021-05-16 15:52:59 +00:00
if ( auto . getValue ( ) ) {
autoPos = event . getPos ( ) ;
mode . setValue ( Mode . DAMAGE ) ;
}
2019-10-27 15:45:44 +00:00
break ;
2021-05-15 22:56:09 +00:00
case SEQUENTIAL :
mc . player . swingArm ( EnumHand . MAIN_HAND ) ;
mc . player . connection . sendPacket ( new CPacketPlayerDigging ( CPacketPlayerDigging . Action . START_DESTROY_BLOCK , event . getPos ( ) , event . getFace ( ) ) ) ;
mc . player . connection . sendPacket ( new CPacketPlayerDigging ( CPacketPlayerDigging . Action . STOP_DESTROY_BLOCK , event . getPos ( ) , event . getFace ( ) ) ) ;
seqPos = event . getPos ( ) ;
seqDir = event . getFace ( ) ;
event . setCanceled ( true ) ;
break ;
2019-10-27 15:45:44 +00:00
}
}
2019-11-30 00:31:05 +00:00
if ( this . doubleBreak . getValue ( ) ) {
2019-10-27 15:45:44 +00:00
final BlockPos above = event . getPos ( ) . add ( 0 , 1 , 0 ) ;
if ( canBreak ( above ) & & mc . player . getDistance ( above . getX ( ) , above . getY ( ) , above . getZ ( ) ) < = 5f ) {
mc . player . swingArm ( EnumHand . MAIN_HAND ) ;
mc . player . connection . sendPacket ( new CPacketPlayerDigging ( CPacketPlayerDigging . Action . START_DESTROY_BLOCK , above , event . getFace ( ) ) ) ;
mc . player . connection . sendPacket ( new CPacketPlayerDigging ( CPacketPlayerDigging . Action . STOP_DESTROY_BLOCK , above , event . getFace ( ) ) ) ;
mc . playerController . onPlayerDestroyBlock ( above ) ;
mc . world . setBlockToAir ( above ) ;
}
}
}
2021-05-15 22:56:09 +00:00
2019-10-27 15:45:44 +00:00
private boolean canBreak ( BlockPos pos ) {
2021-05-15 22:56:09 +00:00
final IBlockState blockState = mc . world . getBlockState ( pos ) ;
2019-10-27 15:45:44 +00:00
final Block block = blockState . getBlock ( ) ;
2021-05-15 22:56:09 +00:00
return block . getBlockHardness ( blockState , mc . world , pos ) ! = - 1 ;
2019-10-27 15:45:44 +00:00
}
}