From 45191daad482d7d2a3ea8bc310bac3281d09810d Mon Sep 17 00:00:00 2001 From: johni0702 Date: Fri, 7 Oct 2016 22:55:58 +0200 Subject: [PATCH] Add GUI that offers the user to install OpenEye --- .../com/replaymod/extras/OpenEyeExtra.java | 142 ++++++++++++++++++ .../com/replaymod/extras/ReplayModExtras.java | 1 + .../assets/replaymod/lang/en_US.lang | 12 +- 3 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/replaymod/extras/OpenEyeExtra.java diff --git a/src/main/java/com/replaymod/extras/OpenEyeExtra.java b/src/main/java/com/replaymod/extras/OpenEyeExtra.java new file mode 100644 index 00000000..600db9ad --- /dev/null +++ b/src/main/java/com/replaymod/extras/OpenEyeExtra.java @@ -0,0 +1,142 @@ +package com.replaymod.extras; + +import com.replaymod.core.ReplayMod; +import com.replaymod.core.Setting; +import de.johni0702.minecraft.gui.container.AbstractGuiScreen; +import de.johni0702.minecraft.gui.container.GuiContainer; +import de.johni0702.minecraft.gui.container.GuiPanel; +import de.johni0702.minecraft.gui.container.GuiScreen; +import de.johni0702.minecraft.gui.element.GuiButton; +import de.johni0702.minecraft.gui.element.GuiLabel; +import de.johni0702.minecraft.gui.function.Tickable; +import de.johni0702.minecraft.gui.layout.CustomLayout; +import de.johni0702.minecraft.gui.layout.HorizontalLayout; +import de.johni0702.minecraft.gui.layout.VerticalLayout; +import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; +import de.johni0702.minecraft.gui.utils.Colors; +import net.minecraftforge.fml.common.Loader; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.ReadableByteChannel; + +public class OpenEyeExtra implements Extra { + private static final String DOWNLOAD_URL = "https://www.replaymod.com/dl/openeye/" + Loader.MC_VERSION; + private static final Setting ASK_FOR_OPEN_EYE = new Setting<>("advanced", "askForOpenEye", null, true); + + private ReplayMod mod; + + @Override + public void register(ReplayMod mod) throws Exception { + this.mod = mod; + mod.getSettingsRegistry().register(ASK_FOR_OPEN_EYE); + + if (!Loader.isModLoaded("OpenEye") && mod.getSettingsRegistry().get(ASK_FOR_OPEN_EYE)) { + mod.runLater(() -> new OfferGui(GuiScreen.wrap(mod.getMinecraft().currentScreen)).display()); + } + } + + private class OfferGui extends AbstractGuiScreen { + public final GuiScreen parent; + public final GuiPanel textPanel = new GuiPanel().setLayout(new VerticalLayout().setSpacing(3)) + .addElements(new VerticalLayout.Data(0.5), + new GuiLabel().setI18nText("replaymod.gui.offeropeneye1"), + new GuiLabel().setI18nText("replaymod.gui.offeropeneye2"), + new GuiLabel().setI18nText("replaymod.gui.offeropeneye3"), + new GuiLabel().setI18nText("replaymod.gui.offeropeneye4"), + new GuiLabel().setI18nText("replaymod.gui.offeropeneye5"), + new GuiLabel().setI18nText("replaymod.gui.offeropeneye6"), + new GuiLabel().setI18nText("replaymod.gui.offeropeneye7"), + new GuiLabel().setI18nText("replaymod.gui.offeropeneye8")); + public final GuiPanel buttonPanel = new GuiPanel() + .setLayout(new HorizontalLayout(HorizontalLayout.Alignment.CENTER).setSpacing(5)); + public final GuiPanel contentPanel = new GuiPanel(this).setLayout(new VerticalLayout().setSpacing(20)) + .addElements(new VerticalLayout.Data(0.5), textPanel, buttonPanel); + public final GuiButton yesButton = new GuiButton(buttonPanel).setSize(150, 20).setI18nLabel("gui.yes"); + public final GuiButton noButton = new GuiButton(buttonPanel).setSize(150, 20).setI18nLabel("gui.no"); + + public OfferGui(GuiScreen parent) { + this.parent = parent; + + yesButton.onClick(() -> { + GuiPopup popup = new GuiPopup(OfferGui.this); + new Thread(() -> { + try { + File targetFile = new File("mods/" + Loader.MC_VERSION, "OpenEye.jar"); + FileUtils.forceMkdir(targetFile.getParentFile()); + + ReadableByteChannel in = Channels.newChannel(new URL(DOWNLOAD_URL).openStream()); + FileChannel out = new FileOutputStream(targetFile).getChannel(); + out.transferFrom(in, 0, Long.MAX_VALUE); + } catch (Throwable e) { + e.printStackTrace(); + } finally { + mod.runLater(() -> { + popup.close(); + parent.display(); + }); + } + }).start(); + }); + noButton.onClick(() -> { + mod.getSettingsRegistry().set(ASK_FOR_OPEN_EYE, false); + mod.getSettingsRegistry().save(); + parent.display(); + }); + + setLayout(new CustomLayout() { + @Override + protected void layout(OfferGui container, int width, int height) { + pos(contentPanel, width / 2 - width(contentPanel) / 2, height / 2 - height(contentPanel) / 2); + } + }); + } + + @Override + protected OfferGui getThis() { + return this; + } + } + + private static final class GuiPopup extends AbstractGuiPopup { + GuiPopup(GuiContainer container) { + super(container); + popup.addElements(null, new GuiIndicator().setColor(Colors.BLACK)); + setBackgroundColor(Colors.DARK_TRANSPARENT); + open(); + } + + @Override + public void close() { + super.close(); + } + + @Override + protected GuiPopup getThis() { + return this; + } + + private static final class GuiIndicator extends GuiLabel implements Tickable { + private int tick; + + @Override + public void tick() { + tick++; + setText(new String[]{ + "Ooooo", + "oOooo", + "ooOoo", + "oooOo", + "ooooO", + "oooOo", + "ooOoo", + "oOooo", + }[tick / 5 % 8]); + } + } + } +} diff --git a/src/main/java/com/replaymod/extras/ReplayModExtras.java b/src/main/java/com/replaymod/extras/ReplayModExtras.java index b56c26ac..54a7eca4 100644 --- a/src/main/java/com/replaymod/extras/ReplayModExtras.java +++ b/src/main/java/com/replaymod/extras/ReplayModExtras.java @@ -29,6 +29,7 @@ public class ReplayModExtras { FullBrightness.class, HotkeyButtons.class, LocalizationExtra.class, + OpenEyeExtra.class, VersionChecker.class ); diff --git a/src/main/resources/assets/replaymod/lang/en_US.lang b/src/main/resources/assets/replaymod/lang/en_US.lang index bee76354..1c660296 100644 --- a/src/main/resources/assets/replaymod/lang/en_US.lang +++ b/src/main/resources/assets/replaymod/lang/en_US.lang @@ -496,4 +496,14 @@ replaymod.gui.modwarning.id=Mod Id: replaymod.gui.modwarning.missing=Missing Mods replaymod.gui.modwarning.version=Different Mod Versions replaymod.gui.modwarning.version.expected=Expected -replaymod.gui.modwarning.version.found=Found \ No newline at end of file +replaymod.gui.modwarning.version.found=Found + +#OpenEye +replaymod.gui.offeropeneye1=Do you want to install OpenEye? +replaymod.gui.offeropeneye2=OpenEye is a mod that collects anonymous information +replaymod.gui.offeropeneye3=about the mods being run and any crashes that happen. +replaymod.gui.offeropeneye4= +replaymod.gui.offeropeneye5=OpenEye can be disabled at any time and is completely optional. +replaymod.gui.offeropeneye6=More information is available at https://openeye.openmods.info/faq +replaymod.gui.offeropeneye7=Clicking Yes will download OpenEye and place it in your mods folder. +replaymod.gui.offeropeneye8=It will then be active the next time you start Minecraft. \ No newline at end of file