Начинающий
- Статус
- Оффлайн
- Регистрация
- 10 Окт 2024
- Сообщения
- 11
- Реакции
- 0
- Выберите загрузчик игры
- Fabric
Это моя первая тема по аим ассист на fabric 1.21.4 если будут ошибки не доработки я буду исправлять
Вот код:
Вот код:
Код:
package pupsik;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.option.SimpleOption;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.SliderWidget;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.entity.mob.Monster;
import net.minecraft.entity.passive.PassiveEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import org.lwjgl.glfw.GLFW;
import java.util.List;
import java.util.ArrayList;
public class PupsikAimAssist implements ClientModInitializer {
private static KeyBinding guiKey;
private static KeyBinding aimKey;
private static boolean guiOpen = false;
private static boolean aimActive = false;
private static float aimFov = 45.0f;
private static float aimRange = 100.0f;
private static float aimSpeed = 8.5f;
private static float horizontalSpeed = 9.0f;
private static float verticalSpeed = 6.0f;
private static float smoothing = 12.0f;
private static boolean throughWalls = false;
private static boolean friendlyFire = false;
private static boolean animals = false;
private static boolean players = true;
private static boolean mobs = true;
private static float verticalLimit = 2.5f;
private static float targetSwitchDelay = 150.0f;
private static long lastTargetTime = 0;
private static Entity currentTarget = null;
@Override
public void onInitializeClient() {
guiKey = KeyBindingHelper.registerKeyBinding(new KeyBinding(
"key.pupsik.aimgui",
GLFW.GLFW_KEY_RIGHT_SHIFT,
"category.pupsik"
));
aimKey = KeyBindingHelper.registerKeyBinding(new KeyBinding(
"key.pupsik.aimkey",
GLFW.GLFW_KEY_LEFT_ALT,
"category.pupsik"
));
ClientTickEvents.END_CLIENT_TICK.register(client -> {
if (client.player == null) return;
while (guiKey.wasPressed()) {
guiOpen = !guiOpen;
}
aimActive = aimKey.isPressed();
if (!aimActive) {
currentTarget = null;
return;
}
if (guiOpen) {
client.setScreen(new AimGuiScreen());
guiOpen = false;
}
Entity target = getBestTarget(client);
if (target != null) {
applySmoothing(client, target);
currentTarget = target;
lastTargetTime = System.currentTimeMillis();
}
});
}
private Entity getBestTarget(MinecraftClient client) {
Vec3d playerPos = client.player.getEyePos();
Vec3d lookVec = client.player.getRotationVec(1.0f);
Entity bestEntity = null;
float bestAngle = aimFov;
List<Entity> entities = client.world.getEntities();
for (Entity entity : entities) {
if (entity == client.player) continue;
if (!isValidTarget(entity)) continue;
Vec3d targetPos = entity.getBoundingBox().getCenter();
Vec3d delta = targetPos.subtract(playerPos);
double distance = delta.length();
if (distance > aimRange) continue;
if (!throughWalls && !client.player.canSee(entity)) continue;
Vec3d deltaNorm = delta.normalize();
double dot = lookVec.dotProduct(deltaNorm);
double angle = Math.toDegrees(Math.acos(dot));
if (angle < bestAngle) {
bestAngle = (float) angle;
bestEntity = entity;
}
}
if (bestEntity != null && System.currentTimeMillis() - lastTargetTime < targetSwitchDelay) {
if (currentTarget != null && isValidTarget(currentTarget)) {
Vec3d delta = currentTarget.getBoundingBox().getCenter().subtract(playerPos);
if (delta.length() <= aimRange) {
return currentTarget;
}
}
}
return bestEntity;
}
private boolean isValidTarget(Entity entity) {
if (entity instanceof LivingEntity && ((LivingEntity) entity).isDead()) return false;
if (entity instanceof PlayerEntity) {
if (!players) return false;
if (!friendlyFire && entity == MinecraftClient.getInstance().player) return false;
}
if (entity instanceof MobEntity) {
if (!mobs) return false;
}
if (entity instanceof PassiveEntity) {
if (!animals) return false;
}
return true;
}
private void applySmoothing(MinecraftClient client, Entity target) {
Vec3d targetPos = target.getBoundingBox().getCenter();
Vec3d playerPos = client.player.getEyePos();
Vec3d delta = targetPos.subtract(playerPos);
double horizontalDistance = Math.sqrt(delta.x * delta.x + delta.z * delta.z);
float targetYaw = (float) Math.toDegrees(Math.atan2(delta.z, delta.x)) - 90.0f;
float targetPitch = (float) -Math.toDegrees(Math.atan2(delta.y, horizontalDistance));
targetPitch = MathHelper.clamp(targetPitch, -verticalLimit, verticalLimit);
float currentYaw = client.player.getYaw();
float currentPitch = client.player.getPitch();
float yawDelta = MathHelper.wrapDegrees(targetYaw - currentYaw);
float pitchDelta = targetPitch - currentPitch;
float maxYawStep = horizontalSpeed / smoothing;
float maxPitchStep = verticalSpeed / smoothing;
if (Math.abs(yawDelta) > aimFov) return;
float newYaw;
float newPitch;
if (Math.abs(yawDelta) > 360.0f) {
newYaw = currentYaw;
} else {
float step = Math.min(Math.abs(yawDelta), maxYawStep);
newYaw = currentYaw + Math.signum(yawDelta) * step;
}
if (Math.abs(pitchDelta) > 90.0f) {
newPitch = currentPitch;
} else {
float step = Math.min(Math.abs(pitchDelta), maxPitchStep);
newPitch = currentPitch + Math.signum(pitchDelta) * step;
}
client.player.setYaw(newYaw);
client.player.setPitch(newPitch);
}
private class AimGuiScreen extends Screen {
private SliderWidget fovSlider;
private SliderWidget rangeSlider;
private SliderWidget smoothingSlider;
private SliderWidget horizontalSlider;
private SliderWidget verticalSlider;
private SliderWidget verticalLimitSlider;
protected AimGuiScreen() {
super(Text.literal("Pupsik AimAssist"));
}
@Override
protected void init() {
int buttonWidth = 100;
int buttonHeight = 20;
int startX = this.width / 2 - 150;
int startY = 40;
int spacing = 25;
fovSlider = new SliderWidget(startX, startY, 300, buttonHeight, Text.literal(""), 0.0) {
@Override
protected void updateMessage() {
this.setMessage(Text.literal("FOV: " + String.format("%.1f", aimFov)));
}
@Override
protected void applyValue() {
aimFov = (float) (this.value * 180.0);
if (aimFov < 5.0f) aimFov = 5.0f;
if (aimFov > 180.0f) aimFov = 180.0f;
}
};
fovSlider.value = aimFov / 180.0;
fovSlider.updateMessage();
this.addDrawableChild(fovSlider);
rangeSlider = new SliderWidget(startX, startY + spacing, 300, buttonHeight, Text.literal(""), 0.0) {
@Override
protected void updateMessage() {
this.setMessage(Text.literal("Range: " + String.format("%.0f", aimRange)));
}
@Override
protected void applyValue() {
aimRange = (float) (this.value * 200.0 + 10.0);
}
};
rangeSlider.value = (aimRange - 10.0f) / 200.0;
rangeSlider.updateMessage();
this.addDrawableChild(rangeSlider);
smoothingSlider = new SliderWidget(startX, startY + spacing * 2, 300, buttonHeight, Text.literal(""), 0.0) {
@Override
protected void updateMessage() {
this.setMessage(Text.literal("Smoothing: " + String.format("%.1f", smoothing)));
}
@Override
protected void applyValue() {
smoothing = (float) (this.value * 20.0 + 2.0);
}
};
smoothingSlider.value = (smoothing - 2.0f) / 20.0;
smoothingSlider.updateMessage();
this.addDrawableChild(smoothingSlider);
horizontalSlider = new SliderWidget(startX, startY + spacing * 3, 300, buttonHeight, Text.literal(""), 0.0) {
@Override
protected void updateMessage() {
this.setMessage(Text.literal("Horizontal Speed: " + String.format("%.1f", horizontalSpeed)));
}
@Override
protected void applyValue() {
horizontalSpeed = (float) (this.value * 15.0 + 1.0);
}
};
horizontalSlider.value = (horizontalSpeed - 1.0f) / 15.0;
horizontalSlider.updateMessage();
this.addDrawableChild(horizontalSlider);
verticalSlider = new SliderWidget(startX, startY + spacing * 4, 300, buttonHeight, Text.literal(""), 0.0) {
@Override
protected void updateMessage() {
this.setMessage(Text.literal("Vertical Speed: " + String.format("%.1f", verticalSpeed)));
}
@Override
protected void applyValue() {
verticalSpeed = (float) (this.value * 12.0 + 0.5);
}
};
verticalSlider.value = (verticalSpeed - 0.5f) / 12.0;
verticalSlider.updateMessage();
this.addDrawableChild(verticalSlider);
verticalLimitSlider = new SliderWidget(startX, startY + spacing * 5, 300, buttonHeight, Text.literal(""), 0.0) {
@Override
protected void updateMessage() {
this.setMessage(Text.literal("Vertical Limit: " + String.format("%.1f", verticalLimit)));
}
@Override
protected void applyValue() {
verticalLimit = (float) (this.value * 10.0);
}
};
verticalLimitSlider.value = verticalLimit / 10.0f;
verticalLimitSlider.updateMessage();
this.addDrawableChild(verticalLimitSlider);
int toggleX = startX;
int toggleY = startY + spacing * 6;
this.addDrawableChild(ButtonWidget.builder(Text.literal("Through Walls: " + (throughWalls ? "ON" : "OFF")), button -> {
throughWalls = !throughWalls;
button.setMessage(Text.literal("Through Walls: " + (throughWalls ? "ON" : "OFF")));
}).dimensions(toggleX, toggleY, 140, buttonHeight).build());
this.addDrawableChild(ButtonWidget.builder(Text.literal("Friendly Fire: " + (friendlyFire ? "ON" : "OFF")), button -> {
friendlyFire = !friendlyFire;
button.setMessage(Text.literal("Friendly Fire: " + (friendlyFire ? "ON" : "OFF")));
}).dimensions(toggleX + 150, toggleY, 150, buttonHeight).build());
this.addDrawableChild(ButtonWidget.builder(Text.literal("Players: " + (players ? "ON" : "OFF")), button -> {
players = !players;
button.setMessage(Text.literal("Players: " + (players ? "ON" : "OFF")));
}).dimensions(toggleX, toggleY + spacing, 90, buttonHeight).build());
this.addDrawableChild(ButtonWidget.builder(Text.literal("Mobs: " + (mobs ? "ON" : "OFF")), button -> {
mobs = !mobs;
button.setMessage(Text.literal("Mobs: " + (mobs ? "ON" : "OFF")));
}).dimensions(toggleX + 100, toggleY + spacing, 90, buttonHeight).build());
this.addDrawableChild(ButtonWidget.builder(Text.literal("Animals: " + (animals ? "ON" : "OFF")), button -> {
animals = !animals;
button.setMessage(Text.literal("Animals: " + (animals ? "ON" : "OFF")));
}).dimensions(toggleX + 200, toggleY + spacing, 100, buttonHeight).build());
this.addDrawableChild(ButtonWidget.builder(Text.literal("Close"), button -> {
this.close();
}).dimensions(this.width / 2 - 50, this.height - 40, 100, buttonHeight).build());
}
@Override
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
this.renderBackground(matrices);
drawCenteredText(matrices, this.textRenderer, "Pupsik AimAssist Settings", this.width / 2, 20, 0xFFFFFF);
super.render(matrices, mouseX, mouseY, delta);
}
@Override
public boolean shouldCloseOnEsc() {
return true;
}
}
}
