summaryrefslogtreecommitdiff
path: root/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules
diff options
context:
space:
mode:
authorArslaan Pathan <[email protected]>2025-10-08 22:44:10 +1300
committerArslaan Pathan <[email protected]>2025-10-08 22:44:10 +1300
commit90f0c0722175466856b82ef65ada129eb972c425 (patch)
treec80ab1c31b3e56066a7c6daa9bdd67c6bd4197cf /src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules
parent9db037f2508ce99f51f6b9fee54a8e1ad12fe566 (diff)
downloadarslaansmagichax-90f0c0722175466856b82ef65ada129eb972c425.tar.xz
arslaansmagichax-90f0c0722175466856b82ef65ada129eb972c425.zip
finish clickgui, add more hacks, add settings, add mixins, add packet event buses and packet events, what the cook why did i put so much shit in one commit
Diffstat (limited to 'src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules')
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/Module.java50
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/ModuleManager.java60
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/AutoClicker.java48
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/ClickGUI.java2
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Criticals.java84
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Flight.java10
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Fullbright.java64
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/GUN.java19
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/NoPackets.java23
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Speed.java51
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Spider.java26
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/BooleanSetting.java33
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/ModeSetting.java65
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/NumberSetting.java66
-rw-r--r--src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/Setting.java25
15 files changed, 618 insertions, 8 deletions
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/Module.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/Module.java
index 9334a53..f42b473 100644
--- a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/Module.java
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/Module.java
@@ -1,13 +1,22 @@
package net.justlearning.arslaan3102.arslaansmagichax.modules;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.BooleanSetting;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.ModeSetting;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.NumberSetting;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.Setting;
import net.minecraft.client.MinecraftClient;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
public abstract class Module {
private final String name;
private final String description;
private final Category category;
- public MinecraftClient mc;
- private final int glfwKeybinding;
+ public static MinecraftClient mc;
+ private int glfwKeybinding;
+ private final List<Setting> settings = new ArrayList<>();
private boolean enabled = false;
@@ -49,8 +58,45 @@ public abstract class Module {
if (enabled != state) toggle();
}
+ public void setGlfwKeybinding(int glfwKeybinding) {
+ this.glfwKeybinding = glfwKeybinding;
+ }
+
protected void onEnable() {}
protected void onDisable() {}
public void tick() {}
+
+ protected <T extends Setting> T addSetting(T setting) {
+ settings.add(setting);
+ return setting;
+ }
+
+ public List<Setting> getSettings() {
+ return settings;
+ }
+
+ public Optional<Setting> getSetting(String name) {
+ return settings.stream()
+ .filter(s -> s.getName().equalsIgnoreCase(name))
+ .findFirst();
+ }
+
+ public Optional<BooleanSetting> getBoolean(String name) {
+ return getSetting(name)
+ .filter(s -> s instanceof BooleanSetting)
+ .map(s -> (BooleanSetting) s);
+ }
+
+ public Optional<NumberSetting> getNumber(String name) {
+ return getSetting(name)
+ .filter(s -> s instanceof NumberSetting)
+ .map(s -> (NumberSetting) s);
+ }
+
+ public Optional<ModeSetting> getMode(String name) {
+ return getSetting(name)
+ .filter(s -> s instanceof ModeSetting)
+ .map(s -> (ModeSetting) s);
+ }
} \ No newline at end of file
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/ModuleManager.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/ModuleManager.java
index 24c24ae..95aa499 100644
--- a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/ModuleManager.java
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/ModuleManager.java
@@ -1,6 +1,8 @@
package net.justlearning.arslaan3102.arslaansmagichax.modules;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
+import net.justlearning.arslaan3102.arslaansmagichax.ArslaansMagicHax;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.Setting;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
@@ -9,11 +11,16 @@ import net.minecraft.client.util.InputUtil;
import net.minecraft.text.Text;
import net.minecraft.util.math.MathHelper;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
public class ModuleManager {
private boolean hudRegistered = false;
+ private static final String CONFIG_FILE = "ArslaansMagicHax.properties";
private static Map<Module, Boolean> previousKeyState = new HashMap<>();
@@ -94,4 +101,57 @@ public class ModuleManager {
y += textRenderer.fontHeight + 2;
}
}
+
+ public void close() {
+ for (Module module : modules) {
+ module.onDisable();
+ }
+ saveModuleStates();
+ }
+
+ public void loadModuleStates() {
+ File file = new File(CONFIG_FILE);
+ if (!file.exists()) return;
+
+ try (FileInputStream fis = new FileInputStream(file)) {
+ Properties properties = new Properties();
+ properties.load(fis);
+
+ for (Module module : modules) {
+ String enabled = properties.getProperty(module.getName() + ".enabled");
+ if ("true".equals(enabled)) {
+ module.setEnabled(true);
+ module.onEnable();
+ } else {
+ module.setEnabled(false);
+ }
+
+ for (Setting setting : module.getSettings()) {
+ String value = properties.getProperty(module.getName() + "." + setting.getName());
+ if (value != null) {
+ setting.setValueFromString(value);
+ }
+ }
+ }
+ } catch (IOException e) {
+ ArslaansMagicHax.LOGGER.info("Failed to load module states and settings", e);
+ }
+ }
+
+ private void saveModuleStates() {
+ Properties properties = new Properties();
+ for (Module module : modules) {
+ properties.setProperty(module.getName() + ".enabled", String.valueOf(module.isEnabled()));
+
+ for (Setting setting : module.getSettings()) {
+ properties.setProperty(module.getName() + "." + setting.getName(), setting.getValueAsString());
+ }
+ }
+
+ try (FileOutputStream fos = new FileOutputStream(CONFIG_FILE)) {
+ properties.store(fos, "Arslaan's Magic Hax - Module States & Settings");
+ } catch (IOException e) {
+ ArslaansMagicHax.LOGGER.error("Failed to save module states and settings", e);
+ }
+ }
}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/AutoClicker.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/AutoClicker.java
new file mode 100644
index 0000000..b131f53
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/AutoClicker.java
@@ -0,0 +1,48 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.impl;
+
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Category;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Module;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.ModeSetting;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.NumberSetting;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.Hand;
+import net.minecraft.util.hit.EntityHitResult;
+import net.minecraft.util.hit.HitResult;
+
+import java.util.Objects;
+import java.util.Random;
+
+public class AutoClicker extends Module {
+ private final NumberSetting cps = new NumberSetting("CPS", 5, 50, 12, 0.1); // default 10 CPS
+ private final ModeSetting mode = new ModeSetting("Mode", "NoDelay", "CPS", "NoDelay");
+ private long nextClickTime = 0L;
+
+ public AutoClicker() {
+ super("AutoClicker", "Automatically attacks entities under your crosshair.", -1, Category.COMBAT);
+ addSetting(mode);
+ addSetting(cps);
+ }
+
+ @Override
+ public void tick() {
+ if (!isEnabled() || mc.player == null || mc.world == null) return;
+ if (mc.currentScreen != null) return;
+
+ HitResult hr = mc.crosshairTarget;
+ if (!(hr instanceof EntityHitResult eResult)) return;
+
+ Entity target = eResult.getEntity();
+ if (target == null || !target.isAlive()) return;
+
+ if (!Objects.equals(mode.getMode(), "NoDelay")) {
+ long now = System.currentTimeMillis();
+ if (now < nextClickTime) return;
+
+ double delayMs = 1000.0 / cps.getValue();
+ nextClickTime = now + (long) Math.max(1, delayMs);
+ }
+
+ mc.interactionManager.attackEntity(mc.player, target);
+ mc.player.swingHand(Hand.MAIN_HAND);
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/ClickGUI.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/ClickGUI.java
index f5f3a4f..b647887 100644
--- a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/ClickGUI.java
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/ClickGUI.java
@@ -2,7 +2,7 @@ package net.justlearning.arslaan3102.arslaansmagichax.modules.impl;
import net.justlearning.arslaan3102.arslaansmagichax.modules.Category;
import net.justlearning.arslaan3102.arslaansmagichax.modules.Module;
-import net.justlearning.arslaan3102.arslaansmagichax.screens.ClickGUIScreen;
+import net.justlearning.arslaan3102.arslaansmagichax.screens.clickgui.ClickGUIScreen;
import net.minecraft.client.MinecraftClient;
import org.lwjgl.glfw.GLFW;
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Criticals.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Criticals.java
new file mode 100644
index 0000000..e539ee7
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Criticals.java
@@ -0,0 +1,84 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.impl;
+
+import net.justlearning.arslaan3102.arslaansmagichax.ArslaansMagicHaxClient;
+import net.justlearning.arslaan3102.arslaansmagichax.events.PacketEvent;
+import net.justlearning.arslaan3102.arslaansmagichax.events.SendPacketEventBus;
+import net.justlearning.arslaan3102.arslaansmagichax.mixininterface.IPacket;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Category;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Module;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.ModeSetting;
+import net.minecraft.network.packet.Packet;
+import net.minecraft.network.packet.c2s.play.*;
+import net.minecraft.util.PlayerInput;
+
+import java.util.Objects;
+
+public class Criticals extends Module {
+ private static ModeSetting mode = new ModeSetting("Mode", "Packet", "Packet", "Bypass");
+
+ public Criticals() {
+ super("Criticals", "Always gives critical hits.", -1, Category.COMBAT);
+ SendPacketEventBus.register(Criticals::packetEventListener);
+ addSetting(mode);
+ }
+
+ private static void packetEventListener(PacketEvent.Send event) {
+ if (!ArslaansMagicHaxClient.criticals.isEnabled() || mc.player == null) return;
+
+ String obamaHaveDih = "barapbarapba"; // kinda put it in mbappe
+
+ Packet<?> packet = event.packet();
+
+ // mojang did a mojang thing and you cant detect if packet is InteractType.ATTACK anymore so just assume it is and pray it works
+ if (packet instanceof PlayerInteractEntityC2SPacket && ((IPacket) packet).hax$getTag() != 1337) {
+ event.setCancelled(true);
+
+ if (Objects.equals(mode.getMode(), "Packet")) {
+ // fake not sprinting if sprinting so it lets you crit
+ boolean wasSprinting = false;
+
+ if (mc.player.isSprinting()) {
+ PlayerInput fakeNoSprint = new PlayerInput(false, false, false, false, false, false, false);
+ mc.player.networkHandler.sendPacket(new PlayerInputC2SPacket(fakeNoSprint));
+
+ ClientCommandC2SPacket fakeNoSprintCommand = new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.STOP_SPRINTING);
+ mc.player.networkHandler.sendPacket(fakeNoSprintCommand);
+
+ wasSprinting = true;
+ }
+
+ sendYPacket(0.0625);
+ sendYPacket(0);
+
+ ((IPacket) packet).hax$setTag(1337);
+ mc.player.networkHandler.sendPacket(packet);
+
+ // send sprinting packet again just in case it stopped the player from sprinting client-side (happens)
+ if (wasSprinting) {
+ PlayerInput fakeNoSprint = new PlayerInput(false, false, false, false, false, false, true);
+ mc.player.networkHandler.sendPacket(new PlayerInputC2SPacket(fakeNoSprint));
+
+ ClientCommandC2SPacket fakeNoSprintCommand = new ClientCommandC2SPacket(mc.player, ClientCommandC2SPacket.Mode.START_SPRINTING);
+ mc.player.networkHandler.sendPacket(fakeNoSprintCommand);
+
+ mc.player.setSprinting(true);
+ }
+ } else if (Objects.equals(mode.getMode(), "Bypass")) {
+ // don't do the sprint bypass and make it more random-looking to throw off anticheat
+ sendYPacket(0.11);
+ sendYPacket(0.1100013579);
+ sendYPacket(0.0000013579);
+ }
+ }
+ }
+
+ private static void sendYPacket(double height) {
+ double x = mc.player.getX();
+ double y = mc.player.getY();
+ double z = mc.player.getZ();
+
+ PlayerMoveC2SPacket packet = new PlayerMoveC2SPacket.PositionAndOnGround(x, y + height, z, false, mc.player.horizontalCollision);
+
+ mc.player.networkHandler.sendPacket(packet);
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Flight.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Flight.java
index 63c4a8f..50c4b5e 100644
--- a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Flight.java
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Flight.java
@@ -10,11 +10,11 @@ public class Flight extends Module {
}
@Override
- protected void onEnable() {
- if (mc.player != null) {
- mc.player.getAbilities().allowFlying = true;
- mc.player.getAbilities().flying = true;
- }
+ public void tick() {
+ if (!this.isEnabled() || mc.player == null) return;
+
+ mc.player.getAbilities().allowFlying = true;
+ mc.player.getAbilities().flying = true;
}
@Override
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Fullbright.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Fullbright.java
new file mode 100644
index 0000000..3085f02
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Fullbright.java
@@ -0,0 +1,64 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.impl;
+
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Category;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Module;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.ModeSetting;
+import net.minecraft.client.option.SimpleOption;
+import net.minecraft.entity.effect.StatusEffectInstance;
+import net.minecraft.entity.effect.StatusEffects;
+import net.minecraft.registry.Registries;
+
+import java.util.Objects;
+
+public class Fullbright extends Module {
+ private ModeSetting mode = new ModeSetting("Mode", "Gamma", "Effect", "Gamma");
+ private SimpleOption<Double> option;
+ private double previousGamma = 1.0;
+ private boolean didSetGamma = false; // in case the mod was initialized on client load/saved state
+
+ public Fullbright() {
+ super("Fullbright", "Brightens up your world!", -1, Category.RENDER);
+ addSetting(mode);
+ }
+
+ @Override
+ protected void onEnable() {
+ if (mc.options == null) return;
+ if (Objects.equals(mode.getMode(), "Gamma")) {
+ previousGamma = mc.options.getGamma().getValue();
+ mc.options.getGamma().setValue(1000.0);
+ }
+ didSetGamma = true;
+ }
+
+ @Override
+ public void tick() {
+ if (!this.isEnabled() || mc.player == null) return;
+
+ if (Objects.equals(mode.getMode(), "Effect")) {
+ if (didSetGamma) {
+ // undo gamma if switching mode
+ mc.options.getGamma().setValue(previousGamma);
+ didSetGamma = false;
+ }
+ mc.player.addStatusEffect(new StatusEffectInstance(Registries.STATUS_EFFECT.getEntry(StatusEffects.NIGHT_VISION.value()), 1, 0));
+ }
+ if (Objects.equals(mode.getMode(), "Gamma")) {
+ if (!didSetGamma) {
+ previousGamma = mc.options.getGamma().getValue();
+ mc.options.getGamma().setValue(1000.0);
+ didSetGamma = true;
+ }
+ }
+ }
+
+ @Override
+ protected void onDisable() {
+ if (mc.player == null) return;
+ if (mc.player.hasStatusEffect(Registries.STATUS_EFFECT.getEntry(StatusEffects.NIGHT_VISION.value()))) {
+ mc.player.removeStatusEffect(Registries.STATUS_EFFECT.getEntry(StatusEffects.NIGHT_VISION.value()));
+ }
+
+ mc.options.getGamma().setValue(previousGamma);
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/GUN.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/GUN.java
new file mode 100644
index 0000000..44d3544
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/GUN.java
@@ -0,0 +1,19 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.impl;
+
+import net.justlearning.arslaan3102.arslaansmagichax.ArslaansMagicHaxClient;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Category;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Module;
+
+public class GUN extends Module {
+ public GUN() {
+ super("G U N", "NoAttackCooldown + Criticals + AutoClicker = G U N", -1, Category.COMBAT);
+ }
+
+ @Override
+ protected void onEnable() {
+ ArslaansMagicHaxClient.noAttackCooldown.setEnabled(true);
+ ArslaansMagicHaxClient.criticals.setEnabled(true);
+ ArslaansMagicHaxClient.autoClicker.setEnabled(true);
+ this.setEnabled(false);
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/NoPackets.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/NoPackets.java
new file mode 100644
index 0000000..db17e91
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/NoPackets.java
@@ -0,0 +1,23 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.impl;
+
+import net.justlearning.arslaan3102.arslaansmagichax.ArslaansMagicHaxClient;
+import net.justlearning.arslaan3102.arslaansmagichax.events.SendPacketEventBus;
+import net.justlearning.arslaan3102.arslaansmagichax.events.PacketEvent;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Category;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Module;
+import net.minecraft.text.Text;
+
+public class NoPackets extends Module {
+ public NoPackets() {
+ super("NoPackets", "Stops all outgoing packets from being sent. ONLY USE THIS IF YOU KNOW WHAT YOU ARE DOING!", -1, Category.MISC);
+ SendPacketEventBus.register(NoPackets::packetEventListener);
+ }
+
+ private static void packetEventListener(PacketEvent.Send event) {
+ if (!ArslaansMagicHaxClient.noPackets.isEnabled()) return;
+
+ if (mc.player != null) mc.player.sendMessage(Text.literal("Cancelled outgoing packet: " + event.packet().getClass().getSimpleName() + " -> " + event.packet()), false);
+
+ event.setCancelled(true);
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Speed.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Speed.java
new file mode 100644
index 0000000..c70c19b
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Speed.java
@@ -0,0 +1,51 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.impl;
+
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Category;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Module;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.BooleanSetting;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.NumberSetting;
+
+public class Speed extends Module {
+ private final NumberSetting speed = new NumberSetting("Speed", 0.1, 2.0, 0.4, 0.05);
+ private final BooleanSetting enableWhileSneaking = new BooleanSetting("Enable while Sneaking", true);
+ private final BooleanSetting enableInWater = new BooleanSetting("Enable in Water", true);
+ private final BooleanSetting enableInLava = new BooleanSetting("Enable in Lava", true);
+
+ public Speed() {
+ super("Speed", "Makes you faster.", -1, Category.MOVEMENT);
+ addSetting(speed);
+ addSetting(enableWhileSneaking);
+ addSetting(enableInWater);
+ addSetting(enableInLava);
+ }
+
+ @Override
+ public void tick() {
+ if (!isEnabled() || mc.player == null) return;
+ if (!enableWhileSneaking.isEnabled() && mc.player.isSneaking()) return;
+ if (!enableInLava.isEnabled() && mc.player.isInLava()) return;
+ if (!enableInWater.isEnabled() && mc.player.isTouchingWater()) return;
+
+ float forward = mc.player.forwardSpeed;
+ float strafe = mc.player.sidewaysSpeed;
+ float yaw = mc.player.getYaw();
+
+ if (forward == 0 && strafe == 0) return;
+
+ if (forward != 0) {
+ if (strafe > 0) yaw += (forward > 0 ? -45 : 45);
+ else if (strafe < 0) yaw += (forward > 0 ? 45 : -45);
+ strafe = 0;
+ forward = forward > 0 ? 1 : -1;
+ }
+
+ double rad = Math.toRadians(yaw);
+ double sin = Math.sin(rad);
+ double cos = Math.cos(rad);
+
+ double x = (forward * -sin + strafe * cos) * speed.getValue();
+ double z = (forward * cos - strafe * -sin) * speed.getValue();
+
+ mc.player.setVelocity(x, mc.player.getVelocity().y, z);
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Spider.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Spider.java
new file mode 100644
index 0000000..9ba3e5c
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/impl/Spider.java
@@ -0,0 +1,26 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.impl;
+
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Category;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.Module;
+import net.justlearning.arslaan3102.arslaansmagichax.modules.settings.NumberSetting;
+import net.minecraft.util.math.Vec3d;
+
+public class Spider extends Module {
+ private NumberSetting climbSpeed = new NumberSetting("Climb Speed", 0, 1, 0.2, 0.1);
+
+ public Spider() {
+ super("Spider", "Allows you to climb walls like a spider.", -1, Category.MOVEMENT);
+ addSetting(climbSpeed);
+ }
+
+ @Override
+ public void tick() {
+ if (!this.isEnabled() || mc.player == null) return;
+ if (!mc.player.horizontalCollision) return;
+
+ Vec3d velocity = mc.player.getVelocity();
+ if (velocity.y >= 0.2) return;
+
+ mc.player.setVelocity(velocity.x, climbSpeed.getValue(), velocity.z);
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/BooleanSetting.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/BooleanSetting.java
new file mode 100644
index 0000000..ac58c30
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/BooleanSetting.java
@@ -0,0 +1,33 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.settings;
+
+public class BooleanSetting extends Setting {
+
+ private boolean enabled;
+
+ public BooleanSetting(String name, boolean defaultValue) {
+ super(name);
+ this.enabled = defaultValue;
+ }
+
+ public void toggle() {
+ this.enabled = !this.enabled;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ @Override
+ public String getValueAsString() {
+ return String.valueOf(enabled);
+ }
+
+ @Override
+ public void setValueFromString(String value) {
+ this.enabled = Boolean.parseBoolean(value);
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/ModeSetting.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/ModeSetting.java
new file mode 100644
index 0000000..31ea836
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/ModeSetting.java
@@ -0,0 +1,65 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.settings;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+public class ModeSetting extends Setting {
+
+ private String mode;
+ private List<String> modes;
+ private int index;
+
+ public ModeSetting(String name, String defaultMode, String... modes) {
+ super(name);
+ this.mode = defaultMode;
+ this.modes = Arrays.asList(modes);
+ this.index = this.mode.indexOf(defaultMode);
+ }
+
+ public String getMode() {
+ return mode;
+ }
+
+ public List<String> getModes() {
+ return modes;
+ }
+
+ public void setMode(String mode) {
+ this.mode = mode;
+ this.index = modes.indexOf(mode);
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+ public void setIndex(int index) {
+ this.index = index;
+ this.mode = modes.get(index);
+ }
+
+ public void cycle() {
+ if (index < modes.size() - 1) {
+ index++;
+ mode = modes.get(index);
+ } else if (index >= modes.size() - 1) {
+ index = 0;
+ mode = modes.get(0);
+ }
+ }
+
+ public boolean isMode(String mode) {
+ return Objects.equals(this.mode, mode);
+ }
+
+ @Override
+ public String getValueAsString() {
+ return mode;
+ }
+
+ @Override
+ public void setValueFromString(String value) {
+ setMode(value);
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/NumberSetting.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/NumberSetting.java
new file mode 100644
index 0000000..d0f2bee
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/NumberSetting.java
@@ -0,0 +1,66 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.settings;
+
+public class NumberSetting extends Setting {
+
+ private double min, max, increment;
+ private double value;
+
+ public NumberSetting(String name, double min, double max, double defaultValue, double increment) {
+ super(name);
+ this.min = min;
+ this.max = max;
+ this.value = defaultValue;
+ this.increment = increment;
+ }
+
+ public static double clamp(double value, double min, double max) {
+ value = Math.max(min, value);
+ value = Math.min(max, value);
+ return value;
+ }
+
+ public double getValue() {
+ return value;
+ }
+
+ public float getValueFloat() {
+ return (float) value;
+ }
+
+ public int getValueInt() {
+ return (int) value;
+ }
+
+ public double getIncrement() {
+ return increment;
+ }
+
+ public double getMin() {
+ return min;
+ }
+
+ public double getMax() {
+ return max;
+ }
+
+ public void setValue(double value) {
+ value = clamp(value, this.min, this.max);
+ value = Math.round(value * (1.0 / this.increment)) / (1.0 / this.increment);
+ this.value = value;
+ }
+
+ public void increment(boolean positive) {
+ if (positive) setValue(getValue() + getIncrement());
+ else setValue(getValue() - getIncrement());
+ }
+
+ @Override
+ public String getValueAsString() {
+ return String.valueOf(value);
+ }
+
+ @Override
+ public void setValueFromString(String value) {
+ setValue(Double.parseDouble(value));
+ }
+}
diff --git a/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/Setting.java b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/Setting.java
new file mode 100644
index 0000000..a149d83
--- /dev/null
+++ b/src/main/java/net/justlearning/arslaan3102/arslaansmagichax/modules/settings/Setting.java
@@ -0,0 +1,25 @@
+package net.justlearning.arslaan3102.arslaansmagichax.modules.settings;
+
+public abstract class Setting {
+ private String name;
+ private boolean visible = true;
+
+ public Setting(String name) {
+ this.name = name;
+ }
+
+ public boolean isVisible() {
+ return visible;
+ }
+
+ public void setVisible(boolean visible) {
+ this.visible = visible;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public abstract String getValueAsString();
+ public abstract void setValueFromString(String value);
+}