-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
Написал мини-утилиту для поиска патча, писал элитра таргет для своего паста клиент и решил слить так как перепишу и сделаю по лучше, каждый метод прокомментировал и объяснил, будут вопросы задавайте.
PathfindingUtil:
package im.expensive.utils.player;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.MathHelper;
import java.util.Random;
public class PathfindingUtil {
private static final Minecraft mc = Minecraft.getInstance();
private static final Random random = new Random();
private static double learningRate = 0.05;
private static double speedWeight = 0.5;
private static double smoothFactorWeight = 0.2;
/**
* [USER=804731]@param[/USER] player Твой перс типа пон который двигается к таргету
* [USER=804731]@param[/USER] target Таргет тоесть твой противник к которому двигается player
* [USER=804731]@param[/USER] distance Дистанция остановки перед целью
*/
public static void moveTowards(PlayerEntity player, Vector3d target, float distance) {
if (player == null || target == null) {
return;
}
Vector3d playerPos = player.getPositionVec();
double deltaX = target.x - playerPos.x;
double deltaY = target.y - playerPos.y;
double deltaZ = target.z - playerPos.z;
double distanceToTarget = playerPos.distanceTo(target);
if (distanceToTarget > distance) {
double speedFactor = getAdaptiveSpeed(distanceToTarget);
double motionX = deltaX / distanceToTarget * speedFactor;
double motionY = deltaY / distanceToTarget * speedFactor;
double motionZ = deltaZ / distanceToTarget * speedFactor;
double smoothFactor = getSmoothFactor();
double smoothMotionX = MathHelper.lerp(smoothFactor, player.getMotion().x, motionX);
double smoothMotionY = MathHelper.lerp(smoothFactor, player.getMotion().y, motionY);
double smoothMotionZ = MathHelper.lerp(smoothFactor, player.getMotion().z, motionZ);
player.setMotion(smoothMotionX, smoothMotionY, smoothMotionZ);
player.stepHeight = 1.0f;
player.fallDistance = 0;
updateWeights(distanceToTarget);
} else {
player.setMotion(0, 0, 0);
}
}
/**
* [USER=804731]@param[/USER] distanceToTarget Расстояние до цели.
* [USER=46448]@ReturN[/USER] Коэффициент скорости который будет заюзан
*/
private static double getAdaptiveSpeed(double distanceToTarget) {
double baseSpeed = 0.2;
double maxSpeed = 0.8;
return Math.min(baseSpeed + (distanceToTarget / 15.0) * speedWeight, maxSpeed);
}
/**
* [USER=46448]@ReturN[/USER] Плавность типа смутча пон? тут можешь поменять на побольше
*/
private static double getSmoothFactor() {
return MathHelper.clamp(smoothFactorWeight, 0.0, 1.0);
}
/**
* [USER=804731]@param[/USER] distanceToTarget Расстояние до цели.
*/
private static void updateWeights(double distanceToTarget) {
double reward = calculateReward(distanceToTarget);
speedWeight += learningRate * reward * (random.nextDouble() - 0.5);
smoothFactorWeight += learningRate * reward * (random.nextDouble() - 0.5);
// Ограничиваем значения весов в разумных пределах.
speedWeight = MathHelper.clamp(speedWeight, 0.1, 1.0);
smoothFactorWeight = MathHelper.clamp(smoothFactorWeight, 0.1, 0.5);
}
/**
* [USER=804731]@param[/USER] distanceToTarget Текущее расстояние до цели.
* [USER=46448]@ReturN[/USER] Оценка коофицента
*/
private static double calculateReward(double distanceToTarget) {
if (distanceToTarget < 1.0) {
return 1.0;
} else if (distanceToTarget < 5.0) {
return 0.5;
} else {
return -0.1;
}
}
}