Начинающий
- Статус
- Оффлайн
- Регистрация
- 17 Июл 2024
- Сообщения
- 36
- Реакции
- 1
- Выберите загрузчик игры
- Vanilla
На байпасс не проверял, скорее всего сервера с фиговым АЧ обойдёт
Scaffold.java:
package im.expensive.functions.impl.player;
import com.google.common.eventbus.Subscribe;
import im.expensive.events.EventUpdate;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.functions.settings.impl.ModeSetting;
import net.minecraft.block.Blocks;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.client.CPlayerPacket;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3d;
@FunctionRegister(name = "Scaffold", type = Category.Player)
public class Scaffold extends Function {
private final ModeSetting mode = new ModeSetting("Режим", "Normal", "Normal", "Tower");
private final BooleanSetting rotate = new BooleanSetting("Пакетная ротация", true);
private final BooleanSetting swing = new BooleanSetting("Анимация руки", true);
private BlockPos lastPos;
private int blockSlot = -1;
private boolean isPlacing;
private float serverYaw, serverPitch;
public Scaffold() {
addSettings(mode, rotate, swing);
}
@Subscribe
public void onUpdate(EventUpdate e) {
if (mc.player == null || mc.world == null) return;
Vector3d pos = mc.player.getPositionVec();
BlockPos currentPos = new BlockPos(pos.x, pos.y + 0.5, pos.z);
if (lastPos == null || !currentPos.equals(lastPos)) {
findBlockSlot();
if (blockSlot != -1) {
BlockPos placePos = currentPos.offset(Direction.DOWN);
if (rotate.get()) {
calculateServerRotation(placePos);
sendRotationPacket();
isPlacing = true;
}
placeBlock(placePos);
isPlacing = false;
}
lastPos = currentPos;
}
if (mode.is("Tower") && mc.gameSettings.keyBindJump.isKeyDown()) {
BlockPos placePos = currentPos.offset(Direction.DOWN);
if (rotate.get()) {
calculateServerRotation(placePos);
sendRotationPacket();
isPlacing = true;
}
placeBlock(placePos);
isPlacing = false;
}
}
private void calculateServerRotation(BlockPos pos) {
Vector3d eyesPos = mc.player.getEyePosition(1.0F);
Vector3d posVec = new Vector3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5);
Vector3d diff = posVec.subtract(eyesPos);
double diffXZ = Math.sqrt(diff.x * diff.x + diff.z * diff.z);
float targetYaw = (float)Math.toDegrees(Math.atan2(diff.z, diff.x)) - 90F;
float targetPitch = (float)-Math.toDegrees(Math.atan2(diff.y, diffXZ));
this.serverYaw = MathHelper.wrapDegrees(targetYaw);
this.serverPitch = MathHelper.clamp(targetPitch, -90, 90);
}
private void sendRotationPacket() {
mc.player.connection.sendPacket(new CPlayerPacket.RotationPacket(
serverYaw,
serverPitch,
mc.player.isOnGround()
));
}
private void findBlockSlot() {
blockSlot = -1;
for (int i = 0; i < 9; i++) {
ItemStack stack = mc.player.inventory.getStackInSlot(i);
if (stack.getItem() instanceof BlockItem && stack.getCount() > 0) {
blockSlot = i;
break;
}
}
}
private void placeBlock(BlockPos pos) {
if (mc.world.getBlockState(pos).getBlock() != Blocks.AIR) return;
int oldSlot = mc.player.inventory.currentItem;
mc.player.inventory.currentItem = blockSlot;
Vector3d hitVec = new Vector3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5);
BlockRayTraceResult rayTrace = new BlockRayTraceResult(hitVec, Direction.UP, pos, false);
mc.playerController.processRightClickBlock(
mc.player,
mc.world,
Hand.MAIN_HAND,
rayTrace
);
if (swing.get()) {
mc.player.swingArm(Hand.MAIN_HAND);
}
mc.player.inventory.currentItem = oldSlot;
}
}
Последнее редактирование: