diff --git a/src/main/java/io/github/arctanmc/arctan/ArctanClient.java b/src/main/java/io/github/arctanmc/arctan/ArctanClient.java index f3ccc60..6788ca0 100644 --- a/src/main/java/io/github/arctanmc/arctan/ArctanClient.java +++ b/src/main/java/io/github/arctanmc/arctan/ArctanClient.java @@ -17,19 +17,25 @@ package io.github.arctanmc.arctan; -import io.github.arctanmc.arctan.rpc.DiscordRPC; +import io.github.arctanmc.arctan.config.ArctanConfig; +import io.github.arctanmc.arctan.module.Module; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.quiltmc.loader.api.ModContainer; +import org.quiltmc.loader.api.QuiltLoader; import org.quiltmc.qsl.base.api.entrypoint.client.ClientModInitializer; public class ArctanClient implements ClientModInitializer { public static final String MOD_ID = "arctan"; public static final Logger LOGGER = LogManager.getLogger("ArctanClient"); + public static final ArctanConfig CONFIG = ArctanConfig.load(QuiltLoader.getConfigDir().resolve(MOD_ID+ ".json")); + public static final boolean DEBUG = QuiltLoader.isDevelopmentEnvironment(); + @Override public void onInitializeClient(ModContainer mod) { + Module.loadAll(); LOGGER.info("Initialized"); - DiscordRPC.init(); } } diff --git a/src/main/java/io/github/arctanmc/arctan/config/ArctanConfig.java b/src/main/java/io/github/arctanmc/arctan/config/ArctanConfig.java new file mode 100644 index 0000000..98b9420 --- /dev/null +++ b/src/main/java/io/github/arctanmc/arctan/config/ArctanConfig.java @@ -0,0 +1,59 @@ +package io.github.arctanmc.arctan.config; + +import java.io.FileReader; +import java.io.IOException; +import java.lang.reflect.Modifier; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.github.arctanmc.arctan.ArctanClient; +import it.unimi.dsi.fastutil.objects.Reference2BooleanOpenHashMap; + +public class ArctanConfig { + private static final Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .excludeFieldsWithModifiers(Modifier.PRIVATE) + .create(); + + private Path path; + + public final Map enabledModules = new Reference2BooleanOpenHashMap<>(); + + public ArctanConfig() {} + + public ArctanConfig(Path path) { + this.path = path; + } + + public static ArctanConfig load(Path path) { + ArctanConfig config; + + if (Files.exists(path)) { + try (FileReader reader = new FileReader(path.toFile())) { + config = GSON.fromJson(reader, ArctanConfig.class); + config.path = path; + } catch (IOException e) { + ArctanClient.LOGGER.error("Error while loading config. Reverting to defaults.", e); + config = new ArctanConfig(path); + } + } else { + config = new ArctanConfig(path); + } + + try { + config.save(); + } catch (IOException e) { + ArctanClient.LOGGER.error("Couldn't save config.", e); + } + + return config; + } + + public void save() throws IOException { + Files.writeString(path, GSON.toJson(this)); + } +} diff --git a/src/main/java/io/github/arctanmc/arctan/mixin/modules/damagetilt/BobHurtMixin.java b/src/main/java/io/github/arctanmc/arctan/mixin/modules/damagetilt/BobHurtMixin.java index 9982633..b926235 100644 --- a/src/main/java/io/github/arctanmc/arctan/mixin/modules/damagetilt/BobHurtMixin.java +++ b/src/main/java/io/github/arctanmc/arctan/mixin/modules/damagetilt/BobHurtMixin.java @@ -25,13 +25,20 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +import io.github.arctanmc.arctan.module.Module; + @Mixin(GameRenderer.class) public class BobHurtMixin { /** * @author Akashii_Kun + * @author Maximumpower55 */ @Redirect(method = "bobHurt", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/LivingEntity;hurtDir:F")) private float editHurtDirection(LivingEntity entity) { - return (float) (Mth.atan2(Mth.lerp(Minecraft.getInstance().getFrameTime(), entity.zo - entity.getZ(), entity.getZ()), Mth.lerp(Minecraft.getInstance().getFrameTime(), entity.xo - entity.getX(), entity.getX())) * (180D / Math.PI) - (double) entity.getYRot()); + if (Module.DAMAGETILT.isEnabled()) { + return (float) (Mth.atan2(Mth.lerp(Minecraft.getInstance().getFrameTime(), entity.zo - entity.getZ(), entity.getZ()), Mth.lerp(Minecraft.getInstance().getFrameTime(), entity.xo - entity.getX(), entity.getX())) * (180D / Math.PI) - (double) entity.getYRot()); + } + + return entity.hurtDir; } } diff --git a/src/main/java/io/github/arctanmc/arctan/module/Module.java b/src/main/java/io/github/arctanmc/arctan/module/Module.java new file mode 100644 index 0000000..c6f15c7 --- /dev/null +++ b/src/main/java/io/github/arctanmc/arctan/module/Module.java @@ -0,0 +1,38 @@ +package io.github.arctanmc.arctan.module; + +import io.github.arctanmc.arctan.ArctanClient; +import io.github.arctanmc.arctan.module.rpc.DiscordRPCModule; + +/** + * @author Maximumpower55 + */ +public interface Module { + static final Module DAMAGETILT = register(new SimpleModule("damagetilt"), true); + static final Module DISCORD_RPC = register(new DiscordRPCModule(), true); + + private static Module register(Module module, boolean enabledByDefault) { + ArctanClient.CONFIG.enabledModules.putIfAbsent(module.getId(), enabledByDefault); + + if (module.isEnabled()) module.onEnable(); + + try { + ArctanClient.CONFIG.save(); + } catch (Exception e) { + //TODO: handle exception + } + + return module; + } + + // Had to make this because of class loading stuff. + static void loadAll() {} + + String getId(); + + default void onEnable() {} + default void onDisable() {} + + default boolean isEnabled() { + return ArctanClient.CONFIG.enabledModules.get(getId()); + } +} diff --git a/src/main/java/io/github/arctanmc/arctan/module/SimpleModule.java b/src/main/java/io/github/arctanmc/arctan/module/SimpleModule.java new file mode 100644 index 0000000..204f80b --- /dev/null +++ b/src/main/java/io/github/arctanmc/arctan/module/SimpleModule.java @@ -0,0 +1,29 @@ +package io.github.arctanmc.arctan.module; + +import io.github.arctanmc.arctan.ArctanClient; + +/** + * @author Maximumpower55 + */ +public class SimpleModule implements Module { + private final String id; + + public SimpleModule(String id) { + this.id = id; + } + + @Override + public void onEnable() { + if (ArctanClient.DEBUG) ArctanClient.LOGGER.info("{} Module Enabled.", id); + } + + @Override + public void onDisable() { + if (ArctanClient.DEBUG) ArctanClient.LOGGER.info("{} Module Disabled.", id); + } + + @Override + public String getId() { + return id; + } +} diff --git a/src/main/java/io/github/arctanmc/arctan/rpc/DiscordRPC.java b/src/main/java/io/github/arctanmc/arctan/module/rpc/DiscordRPCModule.java similarity index 80% rename from src/main/java/io/github/arctanmc/arctan/rpc/DiscordRPC.java rename to src/main/java/io/github/arctanmc/arctan/module/rpc/DiscordRPCModule.java index ed0be0d..dd193b7 100644 --- a/src/main/java/io/github/arctanmc/arctan/rpc/DiscordRPC.java +++ b/src/main/java/io/github/arctanmc/arctan/module/rpc/DiscordRPCModule.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package io.github.arctanmc.arctan.rpc; +package io.github.arctanmc.arctan.module.rpc; import com.jagrosh.discordipc.IPCClient; import com.jagrosh.discordipc.IPCListener; @@ -23,15 +23,22 @@ import com.jagrosh.discordipc.entities.RichPresence; import com.jagrosh.discordipc.exceptions.NoDiscordClientException; import io.github.arctanmc.arctan.ArctanClient; +import io.github.arctanmc.arctan.module.SimpleModule; import net.minecraft.client.Minecraft; -import java.lang.invoke.MethodHandles; import java.time.OffsetDateTime; -public class DiscordRPC { +public class DiscordRPCModule extends SimpleModule { + private IPCClient client; + + public DiscordRPCModule() { + super("rpc"); + } + + @Override + public void onEnable() { + client = new IPCClient(947514926589693983L); - public static void init() { - IPCClient client = new IPCClient(947514926589693983L); client.setListener(new IPCListener() { @Override public void onReady(IPCClient client) { @@ -44,12 +51,22 @@ public void onReady(IPCClient client) { client.sendRichPresence(builder.build()); } }); + try { client.connect(DiscordBuild.ANY); ArctanClient.LOGGER.info("Connected to Discord"); } catch (NoDiscordClientException | RuntimeException e) { ArctanClient.LOGGER.info("No Discord Client found"); } + + super.onEnable(); } + @Override + public void onDisable() { + client.close(); + client = null; + + super.onDisable(); + } }