diff --git a/README.md b/README.md index a02d1e7..964753c 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,8 @@ - `disableToasts` - Flight - `stopMomentum` +- Module + - `Duplicate names` ## Commands - `.center` @@ -108,5 +110,7 @@ - Radar HUD ## Config -- `Http Allowed` - modify what http requests can be made with Meteor's http api -- `Hidden Modules` - hide modules from module gui. **requires restart when unhiding** +- `Http Allowed` - Modify what http requests can be made with Meteor's http api +- `Hidden Modules` - Hide modules from module gui. **requires restart when unhiding** +- `Load system fonts` - Disabling this for faster launch. You can put font into meteor-client/fonts folder. **requires restart to take effect** +- `Duplicate module names` - Allow duplicate module names. Best for addon compatibility. diff --git a/src/main/java/anticope/rejects/mixin/meteor/FontUtilsMixin.java b/src/main/java/anticope/rejects/mixin/meteor/FontUtilsMixin.java new file mode 100644 index 0000000..c7be1e9 --- /dev/null +++ b/src/main/java/anticope/rejects/mixin/meteor/FontUtilsMixin.java @@ -0,0 +1,25 @@ +package anticope.rejects.mixin.meteor; + +import anticope.rejects.utils.RejectsConfig; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.utils.render.FontUtils; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.io.File; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +@Mixin(FontUtils.class) +public class FontUtilsMixin { + @Inject(method = "getSearchPaths", at = @At("HEAD"), cancellable = true, remap = false) + private static void onGetSearchPaths(CallbackInfoReturnable> info) { + if (!RejectsConfig.get().loadSystemFonts) { + File dir = new File(MeteorClient.FOLDER, "fonts"); + info.setReturnValue(!dir.mkdirs() ? Collections.singleton(dir.getAbsolutePath()) : new HashSet<>()); + } + } +} diff --git a/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java b/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java new file mode 100644 index 0000000..514f7e0 --- /dev/null +++ b/src/main/java/anticope/rejects/mixin/meteor/ModuleMixin.java @@ -0,0 +1,28 @@ +package anticope.rejects.mixin.meteor; + +import anticope.rejects.utils.RejectsConfig; +import anticope.rejects.utils.RejectsUtils; +import meteordevelopment.meteorclient.systems.modules.Category; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.Utils; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Module.class) +public class ModuleMixin { + @Mutable @Shadow public String name; + + @Mutable @Shadow public String title; + + @Inject(method = "", at = @At("TAIL"), remap = false) + private void onInit(Category category, String name, String description, CallbackInfo info) { + if (RejectsConfig.get().duplicateModuleNames) { + this.name = RejectsUtils.getModuleName(name); + this.title = Utils.nameToTitle(this.name); + } + } +} diff --git a/src/main/java/anticope/rejects/utils/ConfigModifier.java b/src/main/java/anticope/rejects/utils/ConfigModifier.java index 06ca2ee..6c27527 100644 --- a/src/main/java/anticope/rejects/utils/ConfigModifier.java +++ b/src/main/java/anticope/rejects/utils/ConfigModifier.java @@ -1,13 +1,9 @@ package anticope.rejects.utils; -import meteordevelopment.meteorclient.settings.EnumSetting; -import meteordevelopment.meteorclient.settings.ModuleListSetting; -import meteordevelopment.meteorclient.settings.Setting; -import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.config.Config; import meteordevelopment.meteorclient.systems.modules.Module; -import java.util.Arrays; import java.util.List; public class ConfigModifier { @@ -27,12 +23,30 @@ public class ConfigModifier { public final Setting> hiddenModules = sgRejects.add(new ModuleListSetting.Builder() .name("hidden-modules") .description("Which modules to hide.") - .defaultValue(Arrays.asList()) + .defaultValue(List.of()) .defaultValue(RejectsConfig.get().getHiddenModules()) .onChanged(v -> RejectsConfig.get().setHiddenModules(v)) .build() ); + public final Setting loadSystemFonts = sgRejects.add(new BoolSetting.Builder() + .name("load-system-fonts") + .description("Disabling this for faster launch. You can put font into meteor-client/fonts folder. Restart to take effect.") + .defaultValue(true) + .defaultValue(RejectsConfig.get().loadSystemFonts) + .onChanged(v -> RejectsConfig.get().loadSystemFonts = v) + .build() + ); + + public final Setting duplicateModuleNames = sgRejects.add(new BoolSetting.Builder() + .name("duplicate-module-names") + .description("Allow duplicate module names. Best for addon compatibility.") + .defaultValue(false) + .defaultValue(RejectsConfig.get().duplicateModuleNames) + .onChanged(v -> RejectsConfig.get().duplicateModuleNames = v) + .build() + ); + public static ConfigModifier get() { if (INSTANCE == null) INSTANCE = new ConfigModifier(); return INSTANCE; diff --git a/src/main/java/anticope/rejects/utils/RejectsConfig.java b/src/main/java/anticope/rejects/utils/RejectsConfig.java index f63a386..59c1b2f 100644 --- a/src/main/java/anticope/rejects/utils/RejectsConfig.java +++ b/src/main/java/anticope/rejects/utils/RejectsConfig.java @@ -1,22 +1,20 @@ package anticope.rejects.utils; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.systems.System; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; -import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.utils.render.prompts.OkPrompt; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtString; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + public class RejectsConfig extends System { private static final RejectsConfig INSTANCE = new RejectsConfig(); @@ -28,7 +26,9 @@ public class RejectsConfig extends System { } public HttpAllowed httpAllowed = HttpAllowed.Everything; - public Set hiddenModules = new HashSet(); + public Set hiddenModules = new HashSet<>(); + public boolean loadSystemFonts = true; + public boolean duplicateModuleNames = false; public RejectsConfig() { super("rejects-config"); @@ -43,10 +43,10 @@ public class RejectsConfig extends System { public void setHiddenModules(List newList) { if (newList.size() < hiddenModules.size()) { OkPrompt.create() - .title("Hidden Modules") - .message("In order to see the modules you have removed from the list you need to restart Minecraft.") - .id("hidden-modules-unhide") - .show(); + .title("Hidden Modules") + .message("In order to see the modules you have removed from the list you need to restart Minecraft.") + .id("hidden-modules-unhide") + .show(); } hiddenModules.clear(); for (Module module : newList) { @@ -58,7 +58,7 @@ public class RejectsConfig extends System { public List getHiddenModules() { Modules modules = Modules.get(); - if (modules == null) return Arrays.asList(); + if (modules == null) return List.of(); return hiddenModules.stream().map(modules::get).collect(Collectors.toList()); } @@ -66,6 +66,8 @@ public class RejectsConfig extends System { public NbtCompound toTag() { NbtCompound tag = new NbtCompound(); tag.putString("httpAllowed", httpAllowed.toString()); + tag.putBoolean("loadSystemFonts", loadSystemFonts); + tag.putBoolean("duplicateModuleNames", duplicateModuleNames); NbtList modulesTag = new NbtList(); for (String module : hiddenModules) modulesTag.add(NbtString.of(module)); @@ -77,6 +79,8 @@ public class RejectsConfig extends System { @Override public RejectsConfig fromTag(NbtCompound tag) { httpAllowed = HttpAllowed.valueOf(tag.getString("httpAllowed")); + loadSystemFonts = tag.getBoolean("loadSystemFonts"); + duplicateModuleNames = tag.getBoolean("duplicateModuleNames"); NbtList valueTag = tag.getList("hiddenModules", 8); for (NbtElement tagI : valueTag) { diff --git a/src/main/java/anticope/rejects/utils/RejectsUtils.java b/src/main/java/anticope/rejects/utils/RejectsUtils.java index 91e1ea7..0b252f3 100644 --- a/src/main/java/anticope/rejects/utils/RejectsUtils.java +++ b/src/main/java/anticope/rejects/utils/RejectsUtils.java @@ -2,6 +2,8 @@ package anticope.rejects.utils; import anticope.rejects.utils.seeds.Seeds; import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.PostInit; public class RejectsUtils { @@ -13,4 +15,15 @@ public class RejectsUtils { Seeds.get().save(MeteorClient.FOLDER); })); } + + public static String getModuleName(String name) { + int dupe = 0; + for (Module module : Modules.get().getAll()) { + if (module.name.equals(name)) { + dupe++; + break; + } + } + return dupe == 0 ? name : getModuleName(name + "*".repeat(dupe)); + } } diff --git a/src/main/resources/meteor-rejects-meteor.mixins.json b/src/main/resources/meteor-rejects-meteor.mixins.json index 23e712a..982f7c1 100644 --- a/src/main/resources/meteor-rejects-meteor.mixins.json +++ b/src/main/resources/meteor-rejects-meteor.mixins.json @@ -7,7 +7,9 @@ "ConfigTabMixin", "GuiRendererAccessor", "HttpMixin", + "ModuleMixin", "ModulesMixin", + "FontUtilsMixin", "modules.FlightMixin", "modules.NoRenderAccessor" ]