This commit is contained in:
Saturn5Vfive 2022-04-04 00:25:38 -05:00
commit 0b8fabbcc8
13 changed files with 89 additions and 101 deletions

View file

@ -8,16 +8,16 @@ import net.minecraft.util.Identifier;
import net.shadow.client.feature.command.Command;
import net.shadow.client.feature.module.AddonModule;
import java.awt.image.BufferedImage;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
@SuppressWarnings("unused")
public abstract class Addon {
private final AtomicBoolean isEnabled = new AtomicBoolean(false);
public final String name;
public final String description;
public final String[] developers;
private final AtomicBoolean isEnabled = new AtomicBoolean(false);
public Addon(String name, String description, String[] developers) {
this.name = name;
this.description = description;

View file

@ -4,14 +4,12 @@
package net.shadow.client.feature.addon;
import net.minecraft.entity.passive.AbstractDonkeyEntity;
import net.shadow.client.ShadowMain;
import net.shadow.client.feature.command.Command;
import net.shadow.client.feature.command.CommandRegistry;
import net.shadow.client.feature.config.ModuleConfig;
import net.shadow.client.feature.config.SettingBase;
import net.shadow.client.feature.gui.clickgui.ClickGUI;
import net.shadow.client.feature.gui.clickgui.theme.impl.Shadow;
import net.shadow.client.feature.module.AddonModule;
import net.shadow.client.feature.module.Module;
import net.shadow.client.feature.module.ModuleRegistry;
@ -32,7 +30,6 @@ public class AddonManager {
0xCA, 0xFE, 0xBA, 0xBE
};
public static AddonManager INSTANCE;
record AddonEntry(File sourceFile, String name, String description, String[] devs, Addon registeredAddon) {}
private final List<AddonEntry> loadedAddons = new ArrayList<>();
@SuppressWarnings("ResultOfMethodCallIgnored")
@ -43,14 +40,14 @@ public class AddonManager {
initializeAddons();
}
public List<Addon> getLoadedAddons() {
return loadedAddons.stream().map(addonEntry -> addonEntry.registeredAddon).toList();
}
public static void init() {
new AddonManager();
}
public List<Addon> getLoadedAddons() {
return loadedAddons.stream().map(addonEntry -> addonEntry.registeredAddon).toList();
}
void initializeAddons() {
for (File file : Objects.requireNonNull(ADDON_DIRECTORY.listFiles())) {
if (file.getName().endsWith(".jar")) {
@ -92,11 +89,12 @@ public class AddonManager {
@SuppressWarnings("ResultOfMethodCallIgnored")
public void discoverNewAddons() {
for (File file : Objects.requireNonNull(ADDON_DIRECTORY.listFiles())) {
if (loadedAddons.stream().anyMatch(addonEntry -> addonEntry.sourceFile.getAbsoluteFile().equals(file.getAbsoluteFile()))) continue;
if (loadedAddons.stream().anyMatch(addonEntry -> addonEntry.sourceFile.getAbsoluteFile().equals(file.getAbsoluteFile())))
continue;
if (file.getName().endsWith(".jar")) {
if (safeLoadAddon(file) == null) {
ShadowMain.log(Level.WARN, "Renaming addon to prevent re-discovery because it failed to load");
file.renameTo(new File(file.getAbsolutePath()+".disabled"));
file.renameTo(new File(file.getAbsolutePath() + ".disabled"));
}
}
}
@ -110,9 +108,6 @@ public class AddonManager {
storedConfig.put(customModule.module().getName(), customModule.module().config);
}
}
// if (addon.getAdditionalModules() != null) for (AddonModule additionalModule : addon.getAdditionalModules()) {
// storedConfig.put(additionalModule.getName(), additionalModule.config);
// }
if (addon.isEnabled()) disableAddon(addon);
AddonEntry meant = null;
for (AddonEntry loadedAddon : loadedAddons) {
@ -218,7 +213,7 @@ public class AddonManager {
try {
mainClass = (Addon) loadedClass.getDeclaredConstructor().newInstance();
} catch (NoSuchMethodException e) {
throw new IllegalStateException("Jarfile "+location.getName()+" has invalid main class: No constructor without arguments");
throw new IllegalStateException("Jarfile " + location.getName() + " has invalid main class: No constructor without arguments");
}
// System.out.println("Found main class " + loadedClass.getName());
}
@ -228,8 +223,11 @@ public class AddonManager {
if (mainClass == null)
throw new IllegalStateException("Jarfile " + location.getName() + " does not have a main class");
ShadowMain.log(Level.INFO, "Discovered addon " + mainClass.name + " by " + String.join(", ", mainClass.developers));
loadedAddons.add(new AddonEntry(location,mainClass.name,mainClass.description,mainClass.developers,mainClass));
loadedAddons.add(new AddonEntry(location, mainClass.name, mainClass.description, mainClass.developers, mainClass));
return mainClass;
}
record AddonEntry(File sourceFile, String name, String description, String[] devs, Addon registeredAddon) {
}
}

View file

@ -18,6 +18,11 @@ public class CommandRegistry {
private static final List<CustomCommandEntry> customCommands = new ArrayList<>();
private static final List<Command> sharedCommands = new ArrayList<>();
static {
// TODO: 18.12.21 add commands
init();
}
public static void registerCustomCommand(Addon addon, Command command) {
for (CustomCommandEntry e : customCommands) {
if (e.command.getClass() == command.getClass()) {
@ -106,9 +111,6 @@ public class CommandRegistry {
return sharedCommands;
}
record CustomCommandEntry(Addon addon, Command command) {
}
public static void execute(String command) {
String[] spl = command.split(" +");
String cmd = spl[0].toLowerCase();
@ -140,4 +142,7 @@ public class CommandRegistry {
}
return null;
}
record CustomCommandEntry(Addon addon, Command command) {
}
}

View file

@ -4,8 +4,6 @@
package net.shadow.client.feature.command.argument;
import net.shadow.client.feature.command.exception.CommandException;
public class StringArgumentParser implements ArgumentParser<String> {
@Override
public String parse(String argument) {

View file

@ -24,13 +24,12 @@ public abstract class SettingBase<V> {
*/
final V defaultValue;
final List<BooleanSupplier> suppliers = new ArrayList<>();
final Consumer<V> onChanged;
/**
* The current value of this setting
*/
V value;
final Consumer<V> onChanged;
/**
* Constructs a new Setting
*

View file

@ -5,18 +5,15 @@
package net.shadow.client.feature.gui.screen;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier;
import net.shadow.client.ShadowMain;
import net.shadow.client.feature.addon.Addon;
import net.shadow.client.feature.addon.AddonManager;
import net.shadow.client.feature.gui.FastTickable;
import net.shadow.client.feature.gui.clickgui.ClickGUI;
import net.shadow.client.feature.gui.widget.RoundButton;
import net.shadow.client.helper.GameTexture;
import net.shadow.client.helper.Texture;
import net.shadow.client.helper.Timer;
import net.shadow.client.helper.font.FontRenderers;
import net.shadow.client.helper.font.adapter.FontAdapter;
@ -24,17 +21,19 @@ import net.shadow.client.helper.render.ClipStack;
import net.shadow.client.helper.render.Rectangle;
import net.shadow.client.helper.render.Renderer;
import net.shadow.client.helper.render.Scroller;
import net.shadow.client.helper.util.Utils;
import org.lwjgl.opengl.GL40C;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
public class AddonManagerScreen extends ClientScreen implements FastTickable {
Timer discoverTimer = new Timer();
Scroller scroller = new Scroller(0);
double WIDGET_WIDTH = 600;
double WIDGET_HEIGHT = 300;
List<AddonViewer> viewerList = new ArrayList<>();
@Override
public void onFastTick() {
scroller.tick();
@ -46,7 +45,7 @@ public class AddonManagerScreen extends ClientScreen implements FastTickable {
AddonManager.INSTANCE.discoverNewAddons();
for (Addon loadedAddon : AddonManager.INSTANCE.getLoadedAddons()) {
if (viewerList.stream().noneMatch(addonViewer -> addonViewer.addon == loadedAddon)) {
viewerList.add(new AddonViewer(loadedAddon, WIDGET_WIDTH-10));
viewerList.add(new AddonViewer(loadedAddon, WIDGET_WIDTH - 10));
}
}
}
@ -54,19 +53,16 @@ public class AddonManagerScreen extends ClientScreen implements FastTickable {
@Override
public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
if (new Rectangle(width/2d-WIDGET_WIDTH/2d,height/2d-WIDGET_HEIGHT/2d,width/2d+WIDGET_WIDTH/2d,height/2d+WIDGET_HEIGHT/2d).contains(mouseX,mouseY)) {
double contentHeight = viewerList.stream().map(addonViewer -> addonViewer.getHeight()+5).reduce(Double::sum).orElse(0d)+5;
double entitledScroll = Math.max(0, contentHeight-WIDGET_HEIGHT);
scroller.setBounds(0,entitledScroll);
if (new Rectangle(width / 2d - WIDGET_WIDTH / 2d, height / 2d - WIDGET_HEIGHT / 2d, width / 2d + WIDGET_WIDTH / 2d, height / 2d + WIDGET_HEIGHT / 2d).contains(mouseX, mouseY)) {
double contentHeight = viewerList.stream().map(addonViewer -> addonViewer.getHeight() + 5).reduce(Double::sum).orElse(0d) + 5;
double entitledScroll = Math.max(0, contentHeight - WIDGET_HEIGHT);
scroller.setBounds(0, entitledScroll);
scroller.scroll(amount);
}
return super.mouseScrolled(mouseX, mouseY, amount);
}
double WIDGET_WIDTH = 600;
double WIDGET_HEIGHT = 300;
List<AddonViewer> viewerList = new ArrayList<>();
@Override
protected void init() {
reInitViewers();
@ -75,21 +71,21 @@ public class AddonManagerScreen extends ClientScreen implements FastTickable {
void reInitViewers() {
viewerList.clear();
for (Addon loadedAddon : AddonManager.INSTANCE.getLoadedAddons()) {
viewerList.add(new AddonViewer(loadedAddon, WIDGET_WIDTH-10));
viewerList.add(new AddonViewer(loadedAddon, WIDGET_WIDTH - 10));
}
}
@Override
public void renderInternal(MatrixStack stack, int mouseX, int mouseY, float delta) {
renderBackground(stack);
Renderer.R2D.renderRoundedQuad(stack,new Color(20,20,20),width/2d-WIDGET_WIDTH/2d,height/2d-WIDGET_HEIGHT/2d,width/2d+WIDGET_WIDTH/2d,height/2d+WIDGET_HEIGHT/2d,5,20);
ClipStack.globalInstance.addWindow(stack, new Rectangle(width/2d-WIDGET_WIDTH/2d,height/2d-WIDGET_HEIGHT/2d,width/2d+WIDGET_WIDTH/2d,height/2d+WIDGET_HEIGHT/2d));
Renderer.R2D.renderRoundedQuad(stack, new Color(20, 20, 20), width / 2d - WIDGET_WIDTH / 2d, height / 2d - WIDGET_HEIGHT / 2d, width / 2d + WIDGET_WIDTH / 2d, height / 2d + WIDGET_HEIGHT / 2d, 5, 20);
ClipStack.globalInstance.addWindow(stack, new Rectangle(width / 2d - WIDGET_WIDTH / 2d, height / 2d - WIDGET_HEIGHT / 2d, width / 2d + WIDGET_WIDTH / 2d, height / 2d + WIDGET_HEIGHT / 2d));
double yOffset = 0;
double xRoot = width/2d-WIDGET_WIDTH/2d+5;
double yRoot = height/2d-WIDGET_HEIGHT/2d+5;
double xRoot = width / 2d - WIDGET_WIDTH / 2d + 5;
double yRoot = height / 2d - WIDGET_HEIGHT / 2d + 5;
for (AddonViewer addonViewer : viewerList) {
addonViewer.render(stack,xRoot,yRoot+yOffset+scroller.getScroll(),mouseX,mouseY);
yOffset += addonViewer.getHeight()+5;
addonViewer.render(stack, xRoot, yRoot + yOffset + scroller.getScroll(), mouseX, mouseY);
yOffset += addonViewer.getHeight() + 5;
}
ClipStack.globalInstance.popWindow();
super.renderInternal(stack, mouseX, mouseY, delta);
@ -104,69 +100,74 @@ public class AddonManagerScreen extends ClientScreen implements FastTickable {
}
class AddonViewer implements FastTickable {
Addon addon;
double width;
static final double iconDimensions = 64;
static final double padding = 5;
Addon addon;
double width;
double lastX, lastY;
RoundButton disable, reload;
public AddonViewer(Addon addon, double width) {
this.addon = addon;
this.width = width;
disable = new RoundButton(RoundButton.STANDARD,0,0,60,20,addon.isEnabled()?"Disable":"Enable", () -> {
disable = new RoundButton(RoundButton.STANDARD, 0, 0, 60, 20, addon.isEnabled() ? "Disable" : "Enable", () -> {
if (addon.isEnabled()) AddonManager.INSTANCE.disableAddon(addon);
else AddonManager.INSTANCE.enableAddon(addon);
disable.setText(addon.isEnabled()?"Disable":"Enable");
disable.setText(addon.isEnabled() ? "Disable" : "Enable");
ClickGUI.reInit();
});
reload = new RoundButton(RoundButton.STANDARD,0,0,60,20,"Reload",() -> {
reload = new RoundButton(RoundButton.STANDARD, 0, 0, 60, 20, "Reload", () -> {
AddonManager.INSTANCE.reload(addon);
reInitViewers();
ClickGUI.reInit();
});
}
public void render(MatrixStack stack, double x, double y, int mouseX, int mouseY) {
lastX = x;
lastY = y;
Color background = new Color(30,30,30);
Renderer.R2D.renderRoundedQuad(stack,background,x,y,x+width,y+getHeight(),5,20);
Color background = new Color(30, 30, 30);
Renderer.R2D.renderRoundedQuad(stack, background, x, y, x + width, y + getHeight(), 5, 20);
RenderSystem.enableBlend();
RenderSystem.colorMask(false, false, false, true);
RenderSystem.clearColor(0.0F, 0.0F, 0.0F, 0.0F);
RenderSystem.clear(GL40C.GL_COLOR_BUFFER_BIT, false);
RenderSystem.colorMask(true, true, true, true);
RenderSystem.setShader(GameRenderer::getPositionColorShader);
Renderer.R2D.renderRoundedQuadInternal(stack.peek().getPositionMatrix(), background.getRed()/255f, background.getGreen()/255f, background.getBlue()/255f, 1, x + padding, y + padding, x + padding + iconDimensions, y + padding + iconDimensions, 6, 10);
Renderer.R2D.renderRoundedQuadInternal(stack.peek().getPositionMatrix(), background.getRed() / 255f, background.getGreen() / 255f, background.getBlue() / 255f, 1, x + padding, y + padding, x + padding + iconDimensions, y + padding + iconDimensions, 6, 10);
RenderSystem.blendFunc(GL40C.GL_DST_ALPHA, GL40C.GL_ONE_MINUS_DST_ALPHA);
Identifier icon = addon.getIcon();
if (icon == null) icon = GameTexture.ICONS_ADDON_PROVIDED.getWhere();
RenderSystem.setShaderTexture(0, addon.getIcon());
if (!addon.isEnabled()) RenderSystem.setShaderColor(0.6f,0.6f,0.6f,1f);
if (!addon.isEnabled()) RenderSystem.setShaderColor(0.6f, 0.6f, 0.6f, 1f);
Renderer.R2D.renderTexture(stack, x + padding, y + padding, iconDimensions, iconDimensions, 0, 0, iconDimensions, iconDimensions, iconDimensions, iconDimensions);
RenderSystem.defaultBlendFunc();
RenderSystem.setShaderColor(1f,1f,1f,1f);
RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
FontAdapter title = FontRenderers.getCustomSize(30);
FontAdapter normal = FontRenderers.getRenderer();
double entireHeight = title.getFontHeight()+normal.getFontHeight()*2d;
if (addon.isEnabled()) title.drawString(stack,addon.name, (float) (x+padding+iconDimensions+padding), (float) (y+getHeight()/2d-entireHeight/2d),0xFFFFFF);
else title.drawString(stack,addon.name, (float) (x+padding+iconDimensions+padding), (float) (y+getHeight()/2d-entireHeight/2d),0.6f,0.6f,0.6f,1f);
normal.drawString(stack,addon.description, (float) (x+padding+iconDimensions+padding), (float) (y+getHeight()/2d-entireHeight/2d+title.getFontHeight()),0.6f,0.6f,0.6f,1f);
normal.drawString(stack,"Developer(s): "+String.join(", ", addon.developers), (float) (x+padding+iconDimensions+padding), (float) (y+getHeight()/2d-entireHeight/2d+title.getFontHeight()+normal.getFontHeight()),0.6f,0.6f,0.6f,1f);
double entireHeight = title.getFontHeight() + normal.getFontHeight() * 2d;
if (addon.isEnabled())
title.drawString(stack, addon.name, (float) (x + padding + iconDimensions + padding), (float) (y + getHeight() / 2d - entireHeight / 2d), 0xFFFFFF);
else
title.drawString(stack, addon.name, (float) (x + padding + iconDimensions + padding), (float) (y + getHeight() / 2d - entireHeight / 2d), 0.6f, 0.6f, 0.6f, 1f);
normal.drawString(stack, addon.description, (float) (x + padding + iconDimensions + padding), (float) (y + getHeight() / 2d - entireHeight / 2d + title.getFontHeight()), 0.6f, 0.6f, 0.6f, 1f);
normal.drawString(stack, "Developer(s): " + String.join(", ", addon.developers), (float) (x + padding + iconDimensions + padding), (float) (y + getHeight() / 2d - entireHeight / 2d + title.getFontHeight() + normal.getFontHeight()), 0.6f, 0.6f, 0.6f, 1f);
double buttonRowHeight = disable.getHeight()+padding+reload.getHeight();
double buttonRowHeight = disable.getHeight() + padding + reload.getHeight();
disable.setX(x+width-disable.getWidth()-padding);
disable.setY(y+getHeight()/2d-buttonRowHeight/2d);
disable.render(stack,mouseX,mouseY,0);
reload.setX(x+width-disable.getWidth()-padding);
reload.setY(y+getHeight()/2d-buttonRowHeight/2d+disable.getHeight()+padding);
reload.render(stack,mouseX,mouseY,0);
disable.setX(x + width - disable.getWidth() - padding);
disable.setY(y + getHeight() / 2d - buttonRowHeight / 2d);
disable.render(stack, mouseX, mouseY, 0);
reload.setX(x + width - disable.getWidth() - padding);
reload.setY(y + getHeight() / 2d - buttonRowHeight / 2d + disable.getHeight() + padding);
reload.render(stack, mouseX, mouseY, 0);
}
public void clicked(double mouseX, double mouseY,int button) {
disable.mouseClicked(mouseX,mouseY,button);
public void clicked(double mouseX, double mouseY, int button) {
disable.mouseClicked(mouseX, mouseY, button);
reload.mouseClicked(mouseX, mouseY, button);
}
@ -177,7 +178,7 @@ public class AddonManagerScreen extends ClientScreen implements FastTickable {
}
public double getHeight() {
return iconDimensions +padding*2;
return iconDimensions + padding * 2;
}
}
}

View file

@ -20,14 +20,13 @@ import net.shadow.client.feature.module.impl.world.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ModuleRegistry {
static final List<Module> vanillaModules = new ArrayList<>();
static final List<AddonModuleEntry> customModules = new ArrayList<>();
static final List<Module> sharedModuleList = new ArrayList<>();
static final AtomicBoolean reloadInProgress = new AtomicBoolean(false);
static final AtomicBoolean initialized = new AtomicBoolean(false);
public static List<AddonModuleEntry> getCustomModules() {
return customModules;
@ -42,7 +41,6 @@ public class ModuleRegistry {
customModules.add(new AddonModuleEntry(source, module));
rebuildSharedModuleList();
}
static final AtomicBoolean initialized = new AtomicBoolean(false);
public static void clearCustomModules(Addon addon) {
for (AddonModuleEntry customModule : customModules) {
@ -188,11 +186,8 @@ public class ModuleRegistry {
return sharedModuleList;
}
public record AddonModuleEntry(Addon addon, Module module) {
}
private static void awaitLockOpen() {
while(reloadInProgress.get()) {
while (reloadInProgress.get()) {
Thread.onSpinWait();
}
}
@ -223,4 +218,7 @@ public class ModuleRegistry {
}
return null;
}
public record AddonModuleEntry(Addon addon, Module module) {
}
}

View file

@ -4,8 +4,8 @@
package net.shadow.client.feature.module.impl.crash;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
@ -14,9 +14,6 @@ import net.minecraft.screen.slot.SlotActionType;
import net.shadow.client.feature.gui.notifications.Notification;
import net.shadow.client.feature.module.Module;
import net.shadow.client.feature.module.ModuleType;
import net.minecraft.client.util.math.MatrixStack;
import net.shadow.client.helper.event.EventType;
import net.shadow.client.helper.event.Events;
public class LecternCrash extends Module {
public LecternCrash() {
@ -27,10 +24,10 @@ public class LecternCrash extends Module {
public void tick() {
if (client.player.currentScreenHandler instanceof LecternScreenHandler handler) {
int sid = handler.syncId;
ClickSlotC2SPacket p = new ClickSlotC2SPacket(sid,0,0,0, SlotActionType.QUICK_MOVE,new ItemStack(Items.AIR),new Int2ObjectOpenHashMap<>());
ClickSlotC2SPacket p = new ClickSlotC2SPacket(sid, 0, 0, 0, SlotActionType.QUICK_MOVE, new ItemStack(Items.AIR), new Int2ObjectOpenHashMap<>());
client.getNetworkHandler().sendPacket(p);
client.player.closeHandledScreen();
Notification.create(5000,"LecternCrash", Notification.Type.SUCCESS,"Sent exploit packet");
Notification.create(5000, "LecternCrash", Notification.Type.SUCCESS, "Sent exploit packet");
}
}

View file

@ -5,34 +5,28 @@
package net.shadow.client.feature.module.impl.misc;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.network.Packet;
import net.minecraft.network.packet.c2s.play.ButtonClickC2SPacket;
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import net.minecraft.screen.slot.SlotActionType;
import net.shadow.client.feature.gui.notifications.Notification;
import net.shadow.client.feature.module.Module;
import net.shadow.client.feature.module.ModuleType;
import net.shadow.client.helper.Timer;
import net.shadow.client.helper.event.EventType;
import net.shadow.client.helper.event.Events;
import net.shadow.client.helper.event.events.PacketEvent;
import java.lang.reflect.Field;
public class Test extends Module {
public Test() {
super("Test", "Testing stuff with the client, can be ignored", ModuleType.MISC);
Events.registerEventHandler(EventType.PACKET_SEND, e -> {
if(!this.isEnabled()) return;
PacketEvent event = (PacketEvent)e;
if (!this.isEnabled()) return;
PacketEvent event = (PacketEvent) e;
System.out.println(event.getPacket());
if(event.getPacket() instanceof ClickSlotC2SPacket uwu){
if (event.getPacket() instanceof ClickSlotC2SPacket uwu) {
System.out.println(uwu.getSlot() + " <- slot");
System.out.println(uwu.getButton() + " <- button");
}
if(event.getPacket() instanceof ButtonClickC2SPacket uwu){
if (event.getPacket() instanceof ButtonClickC2SPacket uwu) {
System.out.println(uwu.getButtonId() + " <- Button id");
}
});
@ -42,6 +36,7 @@ public class Test extends Module {
public void enable() {
}
@Override
public void disable() {
@ -63,6 +58,6 @@ public class Test extends Module {
@Override
public void tick() {
client.interactionManager.clickSlot(0,0,0, SlotActionType.QUICK_MOVE,client.player);
client.interactionManager.clickSlot(0, 0, 0, SlotActionType.QUICK_MOVE, client.player);
}
}

View file

@ -5,8 +5,6 @@
package net.shadow.client.feature.module.impl.movement;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.impl.FabricLoaderImpl;
import net.fabricmc.loader.impl.launch.FabricLauncher;
import net.minecraft.client.util.math.MatrixStack;
import net.shadow.client.feature.gui.notifications.Notification;
import net.shadow.client.feature.module.Module;
@ -26,7 +24,7 @@ public class NoLevitation extends Module {
@Override
public void enable() {
if (FabricLoader.getInstance().isModLoaded("meteor-client")) {
Notification.create(4000,"NoLevitation", Notification.Type.ERROR, "Meteor is currently loaded and prevents this from working. Use meteor's NoLevitation");
Notification.create(4000, "NoLevitation", Notification.Type.ERROR, "Meteor is currently loaded and prevents this from working. Use meteor's NoLevitation");
setEnabled(false);
}
}

View file

@ -5,7 +5,6 @@
package net.shadow.client.feature.module.impl.render;
import com.mojang.blaze3d.systems.RenderSystem;
import lombok.val;
import net.minecraft.client.network.PlayerListEntry;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket;
@ -47,10 +46,10 @@ public class Hud extends Module {
final BooleanSetting coords = this.config.create(new BooleanSetting.Builder(true).name("Coordinates").description("Whether to show current coordinates").get());
final BooleanSetting ping = this.config.create(new BooleanSetting.Builder(true).name("Ping").description("Whether to show current ping").get());
final BooleanSetting modules = this.config.create(new BooleanSetting.Builder(true).name("Array list").description("Whether to show currently enabled modules").get());
Map<Module, ModuleEntry> entryList = new ConcurrentHashMap<>();
// final List<ModuleEntry> moduleList = new ArrayList<>();
// final List<ModuleEntry> moduleList = new ArrayList<>();
final Timer tpsUpdateTimer = new Timer();
final List<Double> last5SecondTpsAverage = new ArrayList<>();
Map<Module, ModuleEntry> entryList = new ConcurrentHashMap<>();
long lastTimePacketReceived;
double rNoConnectionPosY = -10d;
Notification serverNotResponding = null;

View file

@ -20,9 +20,9 @@ public class GameMenuMixin extends Screen {
super(title);
}
@Inject(method="initWidgets",at=@At("RETURN"))
@Inject(method = "initWidgets", at = @At("RETURN"))
void addAddons(CallbackInfo ci) {
addDrawableChild(new RoundButton(RoundButton.STANDARD,5,5,60,20,"Addons",() -> {
addDrawableChild(new RoundButton(RoundButton.STANDARD, 5, 5, 60, 20, "Addons", () -> {
assert client != null;
client.setScreen(new AddonManagerScreen());
}));

View file

@ -52,7 +52,7 @@ public class LivingEntityMixin {
}
}
@Redirect(method = "travel", at = @At(value = "INVOKE", target = "net/minecraft/entity/LivingEntity.hasStatusEffect(Lnet/minecraft/entity/effect/StatusEffect;)Z"),require = 0)
@Redirect(method = "travel", at = @At(value = "INVOKE", target = "net/minecraft/entity/LivingEntity.hasStatusEffect(Lnet/minecraft/entity/effect/StatusEffect;)Z"), require = 0)
boolean atomic_stopLevitationEffect(LivingEntity instance, StatusEffect effect) {
if (instance.equals(ShadowMain.client.player) && ModuleRegistry.getByClass(NoLevitation.class).isEnabled() && effect == StatusEffects.LEVITATION) {
return false;