Fixed various problems with NoCrystal

This commit is contained in:
Old Chum 2019-11-26 18:54:16 -08:00 committed by GitHub
parent e0633b1896
commit 6562d031c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 65 additions and 145 deletions

View File

@ -8,15 +8,12 @@ import me.rigamortis.seppuku.api.util.MathUtil;
import me.rigamortis.seppuku.api.value.BooleanValue; import me.rigamortis.seppuku.api.value.BooleanValue;
import me.rigamortis.seppuku.impl.module.player.FreeCamModule; import me.rigamortis.seppuku.impl.module.player.FreeCamModule;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockAir;
import net.minecraft.block.BlockLiquid;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.play.client.CPacketEntityAction; import net.minecraft.network.play.client.CPacketEntityAction;
import net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock; import net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHand;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
@ -34,7 +31,8 @@ public final class NoCrystalModule extends Module {
public final BooleanValue disable = new BooleanValue("Disable", new String[]{"dis"}, false); public final BooleanValue disable = new BooleanValue("Disable", new String[]{"dis"}, false);
private int lastSlot; // When false, NoCrystal will not place while the player is sneaking
public final BooleanValue sneak = new BooleanValue("PlaceOnSneak", new String[]{"sneak", "s", "pos", "sneakPlace"}, false);
public NoCrystalModule() { public NoCrystalModule() {
super("NoCrystal", new String[]{"AntiCrystal", "FeetPlace"}, "Automatically places obsidian in 4 cardinal directions", "NONE", -1, ModuleType.COMBAT); super("NoCrystal", new String[]{"AntiCrystal", "FeetPlace"}, "Automatically places obsidian in 4 cardinal directions", "NONE", -1, ModuleType.COMBAT);
@ -43,7 +41,6 @@ public final class NoCrystalModule extends Module {
@Listener @Listener
public void onWalkingUpdate(EventUpdateWalkingPlayer event) { public void onWalkingUpdate(EventUpdateWalkingPlayer event) {
if (event.getStage() == EventStageable.EventStage.PRE) { if (event.getStage() == EventStageable.EventStage.PRE) {
final FreeCamModule freeCam = (FreeCamModule) Seppuku.INSTANCE.getModuleManager().find(FreeCamModule.class); final FreeCamModule freeCam = (FreeCamModule) Seppuku.INSTANCE.getModuleManager().find(FreeCamModule.class);
if(freeCam != null && freeCam.isEnabled()) { if(freeCam != null && freeCam.isEnabled()) {
@ -51,6 +48,7 @@ public final class NoCrystalModule extends Module {
} }
final Vec3d pos = MathUtil.interpolateEntity(mc.player, mc.getRenderPartialTicks()); final Vec3d pos = MathUtil.interpolateEntity(mc.player, mc.getRenderPartialTicks());
final float playerSpeed = (float) MathUtil.getDistance(pos, mc.player.posX, mc.player.posY, mc.player.posZ);
final BlockPos interpPos = new BlockPos(pos.x, pos.y, pos.z); final BlockPos interpPos = new BlockPos(pos.x, pos.y, pos.z);
@ -59,39 +57,58 @@ public final class NoCrystalModule extends Module {
final BlockPos east = interpPos.east(); final BlockPos east = interpPos.east();
final BlockPos west = interpPos.west(); final BlockPos west = interpPos.west();
final boolean canPlace = valid(north) || valid(south) || valid(east) || valid(west); final BlockPos northBelow = interpPos.north().down();
final BlockPos southBelow = interpPos.south().down();
final BlockPos eastBelow = interpPos.east().down();
final BlockPos westBelow = interpPos.west().down();
if (hasStack(Blocks.OBSIDIAN)) { int lastSlot;
if ((mc.player.onGround && mc.player.movementInput.moveForward == 0 && mc.player.movementInput.moveStrafe == 0)) { final int slot = findStackHotbar(Blocks.OBSIDIAN);
if (hasStack(Blocks.OBSIDIAN) || slot != -1) {
if ((mc.player.onGround && playerSpeed <= 0.005f)
&& (sneak.getBoolean() || (!mc.gameSettings.keyBindSneak.isKeyDown()))) {
lastSlot = mc.player.inventory.currentItem;
mc.player.inventory.currentItem = slot;
mc.playerController.updateController();
// Place supporting blocks
if (valid(northBelow)) {
place(northBelow, EnumFacing.SOUTH);
}
if (valid(southBelow)) {
place(southBelow, EnumFacing.NORTH);
}
if (valid(eastBelow)) {
place(eastBelow, EnumFacing.WEST);
}
if (valid(westBelow)) {
place(westBelow, EnumFacing.EAST);
}
// Place protecting blocks
if (valid(north)) { if (valid(north)) {
place(north); place(north, EnumFacing.SOUTH);
} }
if (valid(south)) { if (valid(south)) {
place(south); place(south, EnumFacing.NORTH);
} }
if (valid(east)) { if (valid(east)) {
place(east); place(east, EnumFacing.WEST);
} }
if (valid(west)) { if (valid(west)) {
place(west); place(west, EnumFacing.EAST);
} }
mc.player.inventory.currentItem = this.lastSlot; if (!slotEqualsBlock(lastSlot, Blocks.OBSIDIAN)) {
mc.player.inventory.currentItem = lastSlot;
}
mc.playerController.updateController(); mc.playerController.updateController();
if(this.disable.getBoolean()) { if(this.disable.getBoolean()) {
this.toggle(); this.toggle();
} }
} }
}else{
if (canPlace && (mc.player.onGround && mc.player.movementInput.moveForward == 0 && mc.player.movementInput.moveStrafe == 0)) {
final int slot = findStackHotbar(Blocks.OBSIDIAN);
if (slot != -1) {
this.lastSlot = mc.player.inventory.currentItem;
mc.player.inventory.currentItem = slot;
mc.playerController.updateController();
}
}
} }
} }
} }
@ -99,118 +116,18 @@ public final class NoCrystalModule extends Module {
private boolean hasStack(Block type) { private boolean hasStack(Block type) {
if (mc.player.inventory.getCurrentItem().getItem() instanceof ItemBlock) { if (mc.player.inventory.getCurrentItem().getItem() instanceof ItemBlock) {
final ItemBlock block = (ItemBlock) mc.player.inventory.getCurrentItem().getItem(); final ItemBlock block = (ItemBlock) mc.player.inventory.getCurrentItem().getItem();
if (block.getBlock() == type) { return block.getBlock() == type;
return true;
}
} }
return false; return false;
} }
private void place(BlockPos pos) { private boolean slotEqualsBlock (int slot, Block type) {
final Minecraft mc = Minecraft.getMinecraft(); if (mc.player.inventory.getStackInSlot(slot).getItem() instanceof ItemBlock) {
final ItemBlock block = (ItemBlock) mc.player.inventory.getStackInSlot(slot).getItem();
final Block north = mc.world.getBlockState(pos.add(0, 0, -1)).getBlock(); return block.getBlock() == type;
final Block south = mc.world.getBlockState(pos.add(0, 0, 1)).getBlock();
final Block east = mc.world.getBlockState(pos.add(1, 0, 0)).getBlock();
final Block west = mc.world.getBlockState(pos.add(-1, 0, 0)).getBlock();
final Block up = mc.world.getBlockState(pos.add(0, 1, 0)).getBlock();
final Block down = mc.world.getBlockState(pos.add(0, -1, 0)).getBlock();
if (up != null && up != Blocks.AIR && !(up instanceof BlockLiquid)) {
final boolean activated = up.onBlockActivated(mc.world, pos, mc.world.getBlockState(pos), mc.player, EnumHand.MAIN_HAND, EnumFacing.DOWN, 0, 0, 0);
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_SNEAKING));
}
if (mc.playerController.processRightClickBlock(mc.player, mc.world, pos.add(0, 1, 0), EnumFacing.DOWN, new Vec3d(0d, 0d, 0d), EnumHand.MAIN_HAND) != EnumActionResult.FAIL) {
mc.player.swingArm(EnumHand.MAIN_HAND);
}
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.STOP_SNEAKING));
}
} }
if (down != null && down != Blocks.AIR && !(down instanceof BlockLiquid)) { return false;
final boolean activated = down.onBlockActivated(mc.world, pos, mc.world.getBlockState(pos), mc.player, EnumHand.MAIN_HAND, EnumFacing.UP, 0, 0, 0);
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_SNEAKING));
}
if (mc.playerController.processRightClickBlock(mc.player, mc.world, pos.add(0, -1, 0), EnumFacing.UP, new Vec3d(0d, 0d, 0d), EnumHand.MAIN_HAND) != EnumActionResult.FAIL) {
mc.player.swingArm(EnumHand.MAIN_HAND);
}
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.STOP_SNEAKING));
}
}
if (north != null && north != Blocks.AIR && !(north instanceof BlockLiquid)) {
final boolean activated = north.onBlockActivated(mc.world, pos, mc.world.getBlockState(pos), mc.player, EnumHand.MAIN_HAND, EnumFacing.UP, 0, 0, 0);
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_SNEAKING));
}
if (mc.playerController.processRightClickBlock(mc.player, mc.world, pos.add(0, 0, -1), EnumFacing.SOUTH, new Vec3d(0d, 0d, 0d), EnumHand.MAIN_HAND) != EnumActionResult.FAIL) {
mc.player.swingArm(EnumHand.MAIN_HAND);
}
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.STOP_SNEAKING));
}
}
if (south != null && south != Blocks.AIR && !(south instanceof BlockLiquid)) {
final boolean activated = south.onBlockActivated(mc.world, pos, mc.world.getBlockState(pos), mc.player, EnumHand.MAIN_HAND, EnumFacing.UP, 0, 0, 0);
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_SNEAKING));
}
if (mc.playerController.processRightClickBlock(mc.player, mc.world, pos.add(0, 0, 1), EnumFacing.NORTH, new Vec3d(0d, 0d, 0d), EnumHand.MAIN_HAND) != EnumActionResult.FAIL) {
mc.player.swingArm(EnumHand.MAIN_HAND);
}
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.STOP_SNEAKING));
}
}
if (east != null && east != Blocks.AIR && !(east instanceof BlockLiquid)) {
final boolean activated = east.onBlockActivated(mc.world, pos, mc.world.getBlockState(pos), mc.player, EnumHand.MAIN_HAND, EnumFacing.UP, 0, 0, 0);
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_SNEAKING));
}
if (mc.playerController.processRightClickBlock(mc.player, mc.world, pos.add(1, 0, 0), EnumFacing.WEST, new Vec3d(0d, 0d, 0d), EnumHand.MAIN_HAND) != EnumActionResult.FAIL) {
mc.player.swingArm(EnumHand.MAIN_HAND);
}
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.STOP_SNEAKING));
}
}
if (west != null && west != Blocks.AIR && !(west instanceof BlockLiquid)) {
final boolean activated = west.onBlockActivated(mc.world, pos, mc.world.getBlockState(pos), mc.player, EnumHand.MAIN_HAND, EnumFacing.UP, 0, 0, 0);
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_SNEAKING));
}
if (mc.playerController.processRightClickBlock(mc.player, mc.world, pos.add(-1, 0, 0), EnumFacing.EAST, new Vec3d(0d, 0d, 0d), EnumHand.MAIN_HAND) != EnumActionResult.FAIL) {
mc.player.swingArm(EnumHand.MAIN_HAND);
}
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.STOP_SNEAKING));
}
}
} }
private int findStackHotbar(Block type) { private int findStackHotbar(Block type) {
@ -227,25 +144,28 @@ public final class NoCrystalModule extends Module {
return -1; return -1;
} }
private boolean valid(BlockPos pos) { private boolean valid (BlockPos pos) {
final Block block = mc.world.getBlockState(pos).getBlock(); // There are no entities to block placement,
if (!mc.world.checkNoEntityCollision(new AxisAlignedBB(pos))) {
return false;
}
final Block up = mc.world.getBlockState(pos.add(0, 1, 0)).getBlock(); // Check if the block is replaceable
final Block down = mc.world.getBlockState(pos.add(0, -1, 0)).getBlock(); return mc.world.getBlockState(pos).getBlock().isReplaceable(mc.world, pos);
final Block north = mc.world.getBlockState(pos.add(0, 0, -1)).getBlock();
final Block south = mc.world.getBlockState(pos.add(0, 0, 1)).getBlock();
final Block east = mc.world.getBlockState(pos.add(1, 0, 0)).getBlock();
final Block west = mc.world.getBlockState(pos.add(-1, 0, 0)).getBlock();
return (block instanceof BlockAir)
&& mc.world.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(pos)).isEmpty()
&& ((up != null && up != Blocks.AIR && !(up instanceof BlockLiquid))
|| (down != null && down != Blocks.AIR && !(down instanceof BlockLiquid))
|| (north != null && north != Blocks.AIR && !(north instanceof BlockLiquid))
|| (south != null && south != Blocks.AIR && !(south instanceof BlockLiquid))
|| (east != null && east != Blocks.AIR && !(east instanceof BlockLiquid))
|| (west != null && west != Blocks.AIR && !(west instanceof BlockLiquid)));
} }
private void place (BlockPos pos, EnumFacing direction) {
final Block block = mc.world.getBlockState(pos).getBlock();
final boolean activated = block.onBlockActivated(mc.world, pos, mc.world.getBlockState(pos), mc.player, EnumHand.MAIN_HAND, direction, 0, 0, 0);
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_SNEAKING));
}
this.mc.player.connection.sendPacket(new CPacketPlayerTryUseItemOnBlock(pos, direction, EnumHand.MAIN_HAND, 0.0F, 0.0F, 0.0F));
if (activated) {
mc.player.connection.sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.STOP_SNEAKING));
}
}
} }