-
Автор темы
- #1
Типо легитный авто фарм нароста .
Пометки в коде есть. Будет легко перенести на 3.1
Пожалуйста, авторизуйтесь для просмотра ссылки.
Java:
package jiraf.cc.modules.impl.player;
import net.minecraft.block.Block;
import net.minecraft.block.NetherWartBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.Direction;
import jiraf.cc.events.Event;
import jiraf.cc.events.impl.player.EventUpdate;
import jiraf.cc.modules.Function;
import jiraf.cc.modules.FunctionAnnotation;
import jiraf.cc.modules.Type;
import jiraf.cc.util.misc.TimerUtil;
import we.winner.annotations.obfuscator.Native;
import we.winner.annotations.obfuscator.VMProtect;
import java.util.ArrayList;
import java.util.List;
@Native(vmProtect = VMProtect.NONE)
@FunctionAnnotation(name = "FarmNarosta", type = Type.Player)
public class AutoFarm extends Function {
private final TimerUtil delay = new TimerUtil();
private BlockPos targetBlock = null;
@Override
public void onEvent(final Event event) {
if (mc.player == null || mc.world == null) return;
if (event instanceof EventUpdate) {
if (targetBlock == null) {
targetBlock = findGrowthNetherWart(); // ищет нарост который уже вырос до 2 или 3 стадии
}
if (targetBlock != null) {
moveToBlock(targetBlock);
if (isPlayerCloseToBlock(targetBlock)) { // Если пользователь рядом с ним то
harvestNetherWart(targetBlock); // Он собирает нарост
replantNetherWart(targetBlock); // И если нарост находиться в хотбаре то он засаживает его обратно
targetBlock = null; // Сбрасываем
}
}
}
}
// Метод для поиска нароста
private BlockPos findGrowthNetherWart() {
for (BlockPos pos : getNearbyBlocks()) {
if (isNetherWartOnGrowthStage(pos)) {
return pos;
}
}
return null;
}
private Iterable<BlockPos> getNearbyBlocks() {
BlockPos playerPos = mc.player.getPosition();
int radius = 9; // Радиус для проверки нароста вокруг игрока (не советую ставить больше)
List<BlockPos> blocks = new ArrayList<>();
for (int x = -radius; x <= radius; x++) {
for (int y = -1; y <= 1; y++) {
for (int z = -radius; z <= radius; z++) {
blocks.add(playerPos.add(x, y, z));
}
}
}
return blocks;
}
// Проверка 2 или 3 стадии чтобы он не добывал нарост который находиться на 1 стадии
private boolean isNetherWartOnGrowthStage(BlockPos pos) {
Block block = mc.world.getBlockState(pos).getBlock();
if (block instanceof NetherWartBlock) {
int age = mc.world.getBlockState(pos).get(NetherWartBlock.AGE);
return age == 2 || age == 3; // Стадия
}
return false;
}
private void moveToBlock(BlockPos pos) {
double dx = pos.getX() + 0.5 - mc.player.getPosX();
double dz = pos.getZ() + 0.5 - mc.player.getPosZ();
// Угол поворота к наросту
float yaw = (float) (Math.atan2(dz, dx) * (180 / Math.PI)) - 90;
mc.player.rotationYaw = yaw; // Поворот в нужную сторону
mc.player.moveForward = 1.0f;
}
// Проверка может ли пользователь дотянуться до нароста или нет
private boolean isPlayerCloseToBlock(BlockPos pos) {
double playerX = mc.player.getPosX();
double playerY = mc.player.getPosY();
double playerZ = mc.player.getPosZ();
double blockX = pos.getX() + 0.5;
double blockY = pos.getY() + 0.5;
double blockZ = pos.getZ() + 0.5;
double distanceSquared = (playerX - blockX) * (playerX - blockX)
+ (playerY - blockY) * (playerY - blockY)
+ (playerZ - blockZ) * (playerZ - blockZ);
return distanceSquared < 2.25; // Радиус примерно полтора блока
}
// Собирает нарост
private void harvestNetherWart(BlockPos pos) {
mc.playerController.clickBlock(pos, mc.player.getHorizontalFacing());
}
// Садим новый нарост
private void replantNetherWart(BlockPos pos) {
if (mc.player.inventory.hasItemStack(new ItemStack(Items.NETHER_WART))) {
mc.player.inventory.currentItem = findSlotWithNetherWart(); // Переключение на слот с наростом
BlockRayTraceResult rayTraceResult = new BlockRayTraceResult(
Vector3d.copyCentered(pos), Direction.UP, pos, false
);
mc.playerController.processRightClickBlock(mc.player, mc.world, Hand.MAIN_HAND, rayTraceResult); // Сажаем
}
}
// Находим слот с наростом
private int findSlotWithNetherWart() {
for (int i = 0; i < mc.player.inventory.mainInventory.size(); i++) {
ItemStack stack = mc.player.inventory.mainInventory.get(i);
if (stack.getItem() == Items.NETHER_WART) {
return i;
}
}
return -1; // Если не найдено то не садим.
}
@Override
protected void onDisable() {
super.onDisable();
delay.reset();
targetBlock = null;
}
}
Последнее редактирование: