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:
parent
7a81626687
commit
e0def4f772
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user