Начинающий
- Статус
- Оффлайн
- Регистрация
- 14 Окт 2023
- Сообщения
- 146
- Реакции
- 2
- Выберите загрузчик игры
- Vanilla
Говно которое работает еле как ,
на рв иногда не бьет потому что домер гандон
на рв иногда не бьет потому что домер гандон
код:
package Kotuk.kit.functions.impl.Util;
import Kotuk.kit.events.EventUpdate;
import Kotuk.kit.functions.api.Category;
import Kotuk.kit.functions.api.Function;
import Kotuk.kit.functions.api.FunctionRegister;
import Kotuk.kit.functions.settings.impl.BooleanSetting;
import Kotuk.kit.functions.settings.impl.ModeSetting;
import Kotuk.kit.functions.settings.impl.SliderSetting;
import com.google.common.eventbus.Subscribe;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.*;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.eventbus.api.Event;
import java.util.HashMap;
import java.util.Map;
@FunctionRegister(name = "МобФарм", type = Category.Utils)
public class UniversalMobFarm extends Function {
private final ModeSetting mobTypeSetting = new ModeSetting("Тип моба", "Все",
"Все", "Враждебные", "Мирные", "Криперы", "Зомби", "Скелеты", "Пауки", "Эндермены", "Свинозомби", "Коровы", "Свиньи", "Овцы", "Куры");
private final ModeSetting modeSetting = new ModeSetting("Режим", "Обычный", "Обычный", "Фермерский", "Агрессивный");
private final SliderSetting distanceSetting = new SliderSetting("Дистанция", 15.0f, 5.0f, 200.0f, 0.5f);
private final BooleanSetting collectDropsSetting = new BooleanSetting("Собирать дроп", true);
private final BooleanSetting runModeSetting = new BooleanSetting("Режим бега", true);
private final ModeSetting movementMode = new ModeSetting("Тип Движения", "Авто", "Авто", "Движение")
.setVisible(() -> runModeSetting.get());
private final BooleanSetting retreatSetting = new BooleanSetting("Убегать от опасности", true);
private final ModeSetting retreatCondition = new ModeSetting("Условие отступления", "При низком HP",
"При низком HP", "От крипера", "От всех взрывающихся", "От всех атакующих")
.setVisible(() -> retreatSetting.get());
private final SliderSetting retreatDistanceSetting = new SliderSetting("Дистанция бега", 7.0f, 3.0f, 15.0f, 0.5f)
.setVisible(() -> retreatSetting.get());
private final SliderSetting rotationSpeed = new SliderSetting("Скорость поворотов", 0.8f, 0.1f, 2.0f, 0.1f);
private final BooleanSetting predictMovement = new BooleanSetting("Предсказание движения", true);
private final SliderSetting predictionFactor = new SliderSetting("Фактор предсказания", 0.3f, 0.1f, 0.8f, 0.05f)
.setVisible(() -> predictMovement.get());
private final BooleanSetting autoSwitchWeapon = new BooleanSetting("Авто-смена оружия", true);
private final SliderSetting attackCooldown = new SliderSetting("Задержка атаки (мс)", 500.0f, 100.0f, 2000.0f, 50.0f);
private final SliderSetting minHealthToFight = new SliderSetting("Мин. HP для боя", 10.0f, 1.0f, 20.0f, 1.0f);
private final BooleanSetting targetPrioritization = new BooleanSetting("Приоритет целей", true);
private final ModeSetting priorityMode = new ModeSetting("Приоритет", "Ближайший",
"Ближайший", "Слабейший", "Сильнейший", "Опаснейший")
.setVisible(() -> targetPrioritization.get());
private final BooleanSetting avoidWaterSetting = new BooleanSetting("Избегать воду", true);
private final BooleanSetting avoidLavaSetting = new BooleanSetting("Избегать лаву", true);
private final BooleanSetting autoReconnectSetting = new BooleanSetting("Авто переподлючение", false);
private final SliderSetting reconnectIntervalSetting = new SliderSetting("Интервал переподкл. (мин)", 5.0f, 1.0f, 60.0f, 1.0f)
.setVisible(() -> autoReconnectSetting.get());
private static final Minecraft mc = Minecraft.getInstance();
private LivingEntity targetMob;
private ItemEntity targetDrop;
private long lastReconnectTime = 0;
private long lastAttackTime = 0;
private boolean isRetreating = false;
private int retreatTicks = 0;
private Map<Class<?>, Long> lastAttackTimeByType = new HashMap<>();
private static final Map<Class<?>, Integer> MOB_PRIORITY = new HashMap<>();
static {
MOB_PRIORITY.put(CreeperEntity.class, 100);
MOB_PRIORITY.put(GhastEntity.class, 90);
MOB_PRIORITY.put(EndermanEntity.class, 80);
MOB_PRIORITY.put(WitchEntity.class, 70);
MOB_PRIORITY.put(BlazeEntity.class, 60);
MOB_PRIORITY.put(SkeletonEntity.class, 50);
MOB_PRIORITY.put(ZombieEntity.class, 40);
MOB_PRIORITY.put(SpiderEntity.class, 30);
MOB_PRIORITY.put(SlimeEntity.class, 20);
MOB_PRIORITY.put(SilverfishEntity.class, 10);
}
public UniversalMobFarm() {
addSettings(
mobTypeSetting, modeSetting, distanceSetting, collectDropsSetting,
runModeSetting, movementMode, retreatSetting, retreatCondition,
retreatDistanceSetting, autoSwitchWeapon, attackCooldown, minHealthToFight,
targetPrioritization, priorityMode, rotationSpeed, predictMovement,
predictionFactor, avoidWaterSetting, avoidLavaSetting,
autoReconnectSetting, reconnectIntervalSetting
);
}
@Override
public String getSuffix() {
return mobTypeSetting.get();
}
@Override
public boolean onEvent(Event event) {
return false;
}
@Subscribe
public void onUpdate(EventUpdate event) {
if (mc.world == null || mc.player == null) return;
if (mc.player.getHealth() < minHealthToFight.get() && retreatSetting.get()) {
retreatFromAll();
return;
}
if (collectDropsSetting.get()) {
targetDrop = findClosestDrop();
if (targetDrop != null) {
runToTarget(targetDrop);
isRetreating = false;
retreatTicks = 0;
return;
}
}
targetMob = YaGaYGptLOL();
if (targetMob == null) {
resetMovement();
isRetreating = false;
retreatTicks = 0;
return;
}
double distanceSq = mc.player.getDistanceSq(targetMob);
if (distanceSq > distanceSetting.get() * distanceSetting.get()) {
resetMovement();
isRetreating = false;
retreatTicks = 0;
return;
}
if (!hasLine(targetMob)) {
resetMovement();
return;
}
if (retreatSetting.get() && shouldRetreat(targetMob)) {
retreatFromMob(targetMob);
isRetreating = true;
retreatTicks++;
if (retreatTicks >= 60) {
isRetreating = false;
retreatTicks = 0;
}
} else {
if (runModeSetting.get()) {
runToTarget(targetMob);
} else {
aimAtTarget(targetMob);
}
if (canAttack(targetMob)) {
attackMob(targetMob);
}
isRetreating = false;
}
if (autoReconnectSetting.get()) {
autoReconnect();
}
}
private LivingEntity YaGaYGptLOL() {
LivingEntity closestMob = null;
double closestDistanceSq = Double.MAX_VALUE;
double bestPriorityScore = -Double.MAX_VALUE;
for (Entity entity : mc.world.getAllEntities()) {
if (entity instanceof LivingEntity living &&
!(entity instanceof PlayerEntity) &&
living.isAlive() &&
isValidMobType(living)) {
double distanceSq = mc.player.getDistanceSq(living);
if (distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(living)) {
if (targetPrioritization.get()) {
double priorityScore = calculatePriorityScore(living, distanceSq);
if (priorityScore > bestPriorityScore) {
bestPriorityScore = priorityScore;
closestMob = living;
}
} else if (distanceSq < closestDistanceSq) {
closestDistanceSq = distanceSq;
closestMob = living;
}
}
}
}
return closestMob;
}
private double calculatePriorityScore(LivingEntity mob, double distanceSq) {
double score = 0;
switch (priorityMode.get()) {
case "Ближайший":
score = -distanceSq;
break;
case "Слабейший":
score = -mob.getHealth();
break;
case "Сильнейший":
score = mob.getHealth();
break;
case "Опаснейший":
int priority = MOB_PRIORITY.getOrDefault(mob.getClass(), 0);
score = priority - (distanceSq / 100); // Учитываем и дистанцию
break;
}
return score;
}
private boolean isValidMobType(LivingEntity mob) {
String selectedType = mobTypeSetting.get();
if (selectedType.equals("Все")) return true;
switch (selectedType) {
case "Враждебные":
return mob instanceof MonsterEntity ||
mob instanceof GhastEntity ||
mob instanceof SlimeEntity;
case "Мирные":
return mob instanceof AnimalEntity;
case "Криперы":
return mob instanceof CreeperEntity;
case "Зомби":
return mob instanceof ZombieEntity || mob instanceof ZombifiedPiglinEntity;
case "Скелеты":
return mob instanceof SkeletonEntity;
case "Пауки":
return mob instanceof SpiderEntity;
case "Эндермены":
return mob instanceof EndermanEntity;
case "Свинозомби":
return mob instanceof ZombifiedPiglinEntity;
case "Коровы":
return mob.getClass().getSimpleName().contains("Cow");
case "Свиньи":
return mob.getClass().getSimpleName().contains("Pig");
case "Овцы":
return mob.getClass().getSimpleName().contains("Sheep");
case "Куры":
return mob.getClass().getSimpleName().contains("Chicken");
default:
return false;
}
}
private ItemEntity findClosestDrop() {
ItemEntity closestDrop = null;
double closestDistanceSq = Double.MAX_VALUE;
for (Entity entity : mc.world.getAllEntities()) {
if (entity instanceof ItemEntity item && item.isAlive()) {
double distanceSq = mc.player.getDistanceSq(item);
if (distanceSq < closestDistanceSq && distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(item)) {
closestDrop = item;
closestDistanceSq = distanceSq;
}
}
}
return closestDrop;
}
private boolean hasLine(Entity entity) {
Vector3d start = mc.player.getEyePosition(1.0F);
Vector3d end = entity.getBoundingBox().getCenter();
RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
RayTraceResult result = mc.world.rayTraceBlocks(context);
return result.getType() == RayTraceResult.Type.MISS;
}
private boolean hasObstacle() {
Vector3d start = mc.player.getEyePosition(1.0F);
Vector3d forward = mc.player.getForward().scale(1.5);
Vector3d end = start.add(forward);
RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
RayTraceResult result = mc.world.rayTraceBlocks(context);
return result.getType() == RayTraceResult.Type.BLOCK;
}
private boolean shouldRetreat(LivingEntity mob) {
String condition = retreatCondition.get();
if (condition.equals("При низком HP")) {
return mc.player.getHealth() < minHealthToFight.get();
} else if (condition.equals("От крипера")) {
return mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f;
} else if (condition.equals("От всех взрывающихся")) {
return (mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f) ||
(mob instanceof GhastEntity && mob.getAttackingEntity() == mc.player);
} else if (condition.equals("От всех атакующих")) {
return mob.getAttackingEntity() == mc.player && mob.getDistance(mc.player) < 3.0;
}
return false;
}
private void runToTarget(Entity target) {
float[] rotations = calculateOptimalRotations(target);
float rotationFactor = rotationSpeed.get();
mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);
if (movementMode.get().equals("Авто")) {
runToTargetKeybinds(target);
} else {
runToTargetMove(target);
}
}
private float[] calculateOptimalRotations(Entity entity) {
Vector3d targetPos = entity.getBoundingBox().getCenter();
if (predictMovement.get() && entity.getMotion().lengthSquared() > 0.001) {
double distance = mc.player.getDistance(entity);
double timeToTarget = distance / 20.0;
Vector3d predictedMotion = entity.getMotion().scale(timeToTarget * predictionFactor.get());
targetPos = targetPos.add(predictedMotion);
}
Vector3d eyesPos = mc.player.getEyePosition(1.0F);
double diffX = targetPos.x - eyesPos.x;
double diffY = targetPos.y - eyesPos.y;
double diffZ = targetPos.z - eyesPos.z;
double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);
float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));
yaw = MathHelper.wrapDegrees(yaw);
pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);
return new float[]{yaw, pitch};
}
private float smoothRotation(float current, float target, float factor) {
float delta = MathHelper.wrapDegrees(target - current);
return current + delta * MathHelper.clamp(factor, 0.1f, 1.0f);
}
private void runToTargetKeybinds(Entity target) {
double dx = target.getPosX() - mc.player.getPosX();
double dz = target.getPosZ() - mc.player.getPosZ();
double distance = Math.sqrt(dx * dx + dz * dz);
if (distance > 1.5) {
mc.gameSettings.keyBindForward.setPressed(true);
if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
mc.gameSettings.keyBindSprint.setPressed(true);
}
if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
mc.gameSettings.keyBindJump.setPressed(true);
if (modeSetting.get().equals("Фермерский")) {
mc.player.jumpTicks = 0;
}
adjustedStrafeKeybinds(dx, dz);
} else {
adjustedStrafeKeybinds(dx, dz);
}
} else {
resetMovementKeybinds();
}
}
private void runToTargetMove(Entity target) {
double dx = target.getPosX() - mc.player.getPosX();
double dz = target.getPosZ() - mc.player.getPosZ();
double distance = Math.sqrt(dx * dx + dz * dz);
if (distance > 1.5) {
double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
double moveX = Math.sin(angle);
double moveZ = Math.cos(angle);
mc.player.moveForward = (float) (0.5 * Math.min(distance, 3.0));
mc.player.moveStrafing = (float) moveX;
if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
mc.player.setSprinting(true);
} else {
mc.player.setSprinting(false);
}
if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
mc.player.jump();
if (modeSetting.get().equals("Фермерский")) {
mc.player.jumpTicks = 0;
}
}
} else {
resetMovementMove();
}
}
private void aimAtTarget(Entity target) {
float[] rotations = calculateOptimalRotations(target);
float rotationFactor = rotationSpeed.get() * 0.3f;
mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);
if (movementMode.get().equals("Авто")) {
resetMovementKeybinds();
} else {
resetMovementMove();
}
}
private void retreatFromMob(LivingEntity mob) {
Vector3d playerPos = mc.player.getPositionVec();
Vector3d mobPos = mob.getPositionVec();
Vector3d direction = playerPos.subtract(mobPos).normalize();
float[] rotations = calculateAwayRotations(mob);
float rotationFactor = rotationSpeed.get() * 1.2f;
mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);
if (movementMode.get().equals("Авто")) {
retreatKeybinds(direction);
} else {
retreatMove(direction);
}
}
private void retreatFromAll() {
mc.player.rotationYaw += 180;
mc.player.rotationYaw = MathHelper.wrapDegrees(mc.player.rotationYaw);
if (movementMode.get().equals("Авто")) {
mc.gameSettings.keyBindForward.setPressed(true);
mc.gameSettings.keyBindSprint.setPressed(true);
} else {
mc.player.moveForward = 1.0f;
mc.player.setSprinting(true);
}
}
private float[] calculateAwayRotations(Entity entity) {
Vector3d entityPos = entity.getBoundingBox().getCenter();
Vector3d eyesPos = mc.player.getEyePosition(1.0F);
double diffX = eyesPos.x - entityPos.x;
double diffY = eyesPos.y - entityPos.y;
double diffZ = eyesPos.z - entityPos.z;
double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);
float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));
yaw = MathHelper.wrapDegrees(yaw);
pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);
return new float[]{yaw, pitch};
}
private void retreatKeybinds(Vector3d direction) {
double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
double dx = retreatX - mc.player.getPosX();
double dz = retreatZ - mc.player.getPosZ();
double distance = Math.sqrt(dx * dx + dz * dz);
if (distance > 0.1) {
mc.gameSettings.keyBindForward.setPressed(true);
mc.gameSettings.keyBindSprint.setPressed(true);
if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
mc.gameSettings.keyBindJump.setPressed(true);
if (modeSetting.get().equals("Фермерский")) {
mc.player.jumpTicks = 0;
}
adjustedStrafeKeybinds(dx, dz);
} else {
adjustedStrafeKeybinds(dx, dz);
}
} else {
resetMovementKeybinds();
}
}
private void retreatMove(Vector3d direction) {
double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
double dx = retreatX - mc.player.getPosX();
double dz = retreatZ - mc.player.getPosZ();
double distance = Math.sqrt(dx * dx + dz * dz);
if (distance > 0.1) {
double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
double moveX = Math.sin(angle);
double moveZ = Math.cos(angle);
mc.player.moveForward = 1.0f;
mc.player.moveStrafing = (float) moveX;
mc.player.setSprinting(true);
if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
mc.player.jump();
if (modeSetting.get().equals("Фермерский")) {
mc.player.jumpTicks = 0;
}
}
} else {
resetMovementMove();
}
}
private void adjustedStrafeKeybinds(double dx, double dz) {
float yaw = mc.player.rotationYaw;
double strafe = 0;
double angleToTarget = Math.toDegrees(Math.atan2(dz, dx)) - 90 - yaw;
angleToTarget = MathHelper.wrapDegrees((float) angleToTarget);
if (Math.abs(angleToTarget) > 45 && Math.abs(angleToTarget) < 135) {
strafe = angleToTarget > 0 ? 1.0 : -1.0;
}
mc.gameSettings.keyBindLeft.setPressed(strafe < -0.1);
mc.gameSettings.keyBindRight.setPressed(strafe > 0.1);
}
private void resetMovementKeybinds() {
mc.gameSettings.keyBindForward.setPressed(false);
mc.gameSettings.keyBindBack.setPressed(false);
mc.gameSettings.keyBindLeft.setPressed(false);
mc.gameSettings.keyBindRight.setPressed(false);
mc.gameSettings.keyBindSprint.setPressed(false);
mc.gameSettings.keyBindJump.setPressed(false);
}
private void resetMovementMove() {
mc.player.moveForward = 0.0f;
mc.player.moveStrafing = 0.0f;
mc.player.setSprinting(false);
}
private boolean canAttack(LivingEntity mob) {
if (mob instanceof CreeperEntity) {
return ((CreeperEntity) mob).getSwelling(1.0f) <= 0.5f;
}
return true;
}
private void attackMob(LivingEntity mob) {
long currentTime = System.currentTimeMillis();
Class<?> mobClass = mob.getClass();
Long lastAttack = lastAttackTimeByType.get(mobClass);
if (lastAttack == null || currentTime - lastAttack >= attackCooldown.get()) {
double distance = mc.player.getDistance(mob);
if (distance <= 3.5) {
if (autoSwitchWeapon.get()) {
// Здесь можно добавить логику авто-смены оружия
}
mc.playerController.attackEntity(mc.player, mob);
mc.player.swingArm(Hand.MAIN_HAND);
lastAttackTimeByType.put(mobClass, currentTime);
lastAttackTime = currentTime;
}
}
}
private void autoReconnect() {
long currentTime = System.currentTimeMillis();
float intervalMinutes = reconnectIntervalSetting.get();
long intervalMillis = (long) (intervalMinutes * 60 * 1000);
if (currentTime - lastReconnectTime >= intervalMillis) {
if (mc.player != null) {
mc.player.sendChatMessage(".rct");
lastReconnectTime = currentTime;
}
}
}
private void resetMovement() {
if (movementMode.get().equals("Авто")) {
resetMovementKeybinds();
} else {
resetMovementMove();
}
}
@Override
public boolean onEnable() {
super.onEnable();
lastReconnectTime = System.currentTimeMillis();
lastAttackTime = 0;
isRetreating = false;
retreatTicks = 0;
lastAttackTimeByType.clear();
return false;
}
@Override
public void onDisable() {
super.onDisable();
resetMovement();
isRetreating = false;
retreatTicks = 0;
targetMob = null;
targetDrop = null;
lastAttackTimeByType.clear();
}
@Override
protected float[] rotations(PlayerEntity var1) {
return new float[0];
}
@Override
public void onTick() {
}
}