0
0
mirror of https://github.com/Wurst-Imperium/Wurst7.git synced 2024-09-20 01:12:13 +02:00

Refactor NukerHack.onUpdate() logic

This commit is contained in:
Alexander01998 2024-08-02 10:03:42 +02:00
parent 7a81626687
commit e0def4f772

View File

@ -11,7 +11,6 @@ import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.function.BiPredicate; import java.util.function.BiPredicate;
import java.util.function.Function; import java.util.function.Function;
@ -20,7 +19,6 @@ import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.HitResult; import net.minecraft.util.hit.HitResult;
@ -147,57 +145,70 @@ public final class NukerHack extends Hack
if(mode.getSelected() == Mode.ID && id.getBlock() == Blocks.AIR) if(mode.getSelected() == Mode.ID && id.getBlock() == Blocks.AIR)
return; return;
ClientPlayerEntity player = MC.player;
Vec3d eyesVec = RotationUtils.getEyesPos(); Vec3d eyesVec = RotationUtils.getEyesPos();
BlockPos eyesBlock = BlockPos.ofFloored(eyesVec); BlockPos eyesBlock = BlockPos.ofFloored(eyesVec);
double rangeSq = range.getValueSq(); double rangeSq = range.getValueSq();
int blockRange = range.getValueCeil(); int blockRange = range.getValueCeil();
ArrayList<BlockPos> blocks = Stream<BlockPos> stream =
BlockUtils.getAllInBoxStream(eyesBlock, blockRange) BlockUtils.getAllInBoxStream(eyesBlock, blockRange)
.filter(pos -> pos.getSquaredDistance(eyesVec) <= rangeSq) .filter(pos -> pos.getSquaredDistance(eyesVec) <= rangeSq)
.filter(BlockUtils::canBeClicked) .filter(BlockUtils::canBeClicked)
.filter(mode.getSelected().getValidator(this)) .filter(mode.getSelected().getValidator(this)).sorted(Comparator
.sorted(Comparator .comparingDouble(pos -> pos.getSquaredDistance(eyesVec)));
.comparingDouble(pos -> pos.getSquaredDistance(eyesVec)))
.collect(Collectors.toCollection(ArrayList::new));
if(player.getAbilities().creativeMode) // Break all blocks in creative mode
if(MC.player.getAbilities().creativeMode)
{ {
Stream<BlockPos> stream2 = blocks.parallelStream();
for(Set<BlockPos> set : prevBlocks)
stream2 = stream2.filter(pos -> !set.contains(pos));
List<BlockPos> blocks2 = stream2.collect(Collectors.toList());
prevBlocks.addLast(new HashSet<>(blocks2));
while(prevBlocks.size() > 5)
prevBlocks.removeFirst();
if(!blocks2.isEmpty())
currentBlock = blocks2.get(0);
MC.interactionManager.cancelBlockBreaking(); MC.interactionManager.cancelBlockBreaking();
renderer.resetProgress(); renderer.resetProgress();
BlockBreaker.breakBlocksWithPacketSpam(blocks2);
ArrayList<BlockPos> blocks = filterOutRecentBlocks(stream);
if(blocks.isEmpty())
return;
currentBlock = blocks.get(0);
BlockBreaker.breakBlocksWithPacketSpam(blocks);
return; return;
} }
for(BlockPos pos : blocks) // Break the first valid block in survival mode
if(BlockBreaker.breakOneBlock(pos)) currentBlock =
{ stream.filter(BlockBreaker::breakOneBlock).findFirst().orElse(null);
currentBlock = pos;
break;
}
if(currentBlock == null) if(currentBlock == null)
{
MC.interactionManager.cancelBlockBreaking(); MC.interactionManager.cancelBlockBreaking();
renderer.resetProgress();
return;
}
if(currentBlock != null && BlockUtils.getHardness(currentBlock) < 1) if(BlockUtils.getHardness(currentBlock) < 1)
renderer.updateProgress(); renderer.updateProgress();
else else
renderer.resetProgress(); renderer.resetProgress();
} }
/*
* Waits 5 ticks before trying to break the same block again, which
* makes it much more likely that the server will accept the block
* breaking packets.
*/
private ArrayList<BlockPos> filterOutRecentBlocks(Stream<BlockPos> stream)
{
for(Set<BlockPos> set : prevBlocks)
stream = stream.filter(pos -> !set.contains(pos));
ArrayList<BlockPos> blocks =
stream.collect(Collectors.toCollection(ArrayList::new));
prevBlocks.addLast(new HashSet<>(blocks));
while(prevBlocks.size() > 5)
prevBlocks.removeFirst();
return blocks;
}
@Override @Override
public void onLeftClick(LeftClickEvent event) public void onLeftClick(LeftClickEvent event)
{ {