Commit 655d8a93108ea48c11e2d73ad4ebc5350ece6ee2
1 parent
1f070732
Enable checking for and notifying of new snapshot builds, with option
Showing
9 changed files
with
185 additions
and
27 deletions
src/client/java/com/mumfrey/liteloader/client/LiteLoaderPanelManager.java
... | ... | @@ -9,6 +9,7 @@ import org.lwjgl.input.Keyboard; |
9 | 9 | |
10 | 10 | import com.mumfrey.liteloader.client.gui.GuiLiteLoaderPanel; |
11 | 11 | import com.mumfrey.liteloader.common.GameEngine; |
12 | +import com.mumfrey.liteloader.core.LiteLoader; | |
12 | 13 | import com.mumfrey.liteloader.core.LiteLoaderMods; |
13 | 14 | import com.mumfrey.liteloader.core.LiteLoaderUpdateSite; |
14 | 15 | import com.mumfrey.liteloader.core.LiteLoaderVersion; |
... | ... | @@ -32,6 +33,13 @@ import net.minecraft.client.resources.I18n; |
32 | 33 | */ |
33 | 34 | public class LiteLoaderPanelManager implements PanelManager<GuiScreen> |
34 | 35 | { |
36 | + /** | |
37 | + * Number of launches required before an update check is forced when the | |
38 | + * "force update check" option is enabled. For snapshot versions this is | |
39 | + * ignored and an update check is always performed. | |
40 | + */ | |
41 | + private static final int UPDATE_CHECK_INTERVAL = 10; | |
42 | + | |
35 | 43 | private final LoaderEnvironment environment; |
36 | 44 | |
37 | 45 | /** |
... | ... | @@ -87,14 +95,14 @@ public class LiteLoaderPanelManager implements PanelManager<GuiScreen> |
87 | 95 | this.displayModInfoScreenTab = this.properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_MOD_INFO_SCREEN, true); |
88 | 96 | this.tabAlwaysExpanded = this.properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_NO_HIDE_TAB, false); |
89 | 97 | |
90 | - if (this.properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_FORCE_UPDATE, false)) | |
98 | + if (this.shouldCheckForUpdates()) | |
91 | 99 | { |
92 | 100 | int updateCheckInterval = this.properties.getIntegerProperty(LoaderProperties.OPTION_UPDATE_CHECK_INTR) + 1; |
93 | - LiteLoaderLogger.debug("Force update is TRUE, updateCheckInterval = %d", updateCheckInterval); | |
101 | + LiteLoaderLogger.debug("Regular update check enabled, updateCheckInterval = %d", updateCheckInterval); | |
94 | 102 | |
95 | - if (updateCheckInterval > 10) | |
103 | + if (LiteLoader.isSnapshot() || updateCheckInterval > LiteLoaderPanelManager.UPDATE_CHECK_INTERVAL) | |
96 | 104 | { |
97 | - LiteLoaderLogger.debug("Forcing update check!"); | |
105 | + LiteLoaderLogger.debug("Checking for updates..."); | |
98 | 106 | this.checkForUpdate = true; |
99 | 107 | updateCheckInterval = 0; |
100 | 108 | } |
... | ... | @@ -104,6 +112,16 @@ public class LiteLoaderPanelManager implements PanelManager<GuiScreen> |
104 | 112 | } |
105 | 113 | } |
106 | 114 | |
115 | + private boolean shouldCheckForUpdates() | |
116 | + { | |
117 | + if (LiteLoader.isSnapshot() && this.properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_CHECK_SNAPSHOTS, true)) | |
118 | + { | |
119 | + return true; | |
120 | + } | |
121 | + | |
122 | + return this.properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_FORCE_UPDATE, false); | |
123 | + } | |
124 | + | |
107 | 125 | @Override |
108 | 126 | public void init(LiteLoaderMods mods, ConfigManager configManager) |
109 | 127 | { |
... | ... | @@ -141,7 +159,8 @@ public class LiteLoaderPanelManager implements PanelManager<GuiScreen> |
141 | 159 | this.checkForUpdate = false; |
142 | 160 | if (updateSite.isCheckSucceess() && updateSite.isUpdateAvailable()) |
143 | 161 | { |
144 | - this.setNotification(I18n.format("gui.notifications.updateavailable")); | |
162 | + this.setNotification(I18n.format("gui.notifications." + (LiteLoader.isSnapshot() ? "newsnapshotavailable" : "updateavailable"), | |
163 | + updateSite.getAvailableVersion(), updateSite.getAvailableVersionDate())); | |
145 | 164 | } |
146 | 165 | } |
147 | 166 | } |
... | ... | @@ -251,6 +270,19 @@ public class LiteLoaderPanelManager implements PanelManager<GuiScreen> |
251 | 270 | { |
252 | 271 | return this.properties.getBooleanProperty(LoaderProperties.OPTION_FORCE_UPDATE); |
253 | 272 | } |
273 | + | |
274 | + @Override | |
275 | + public void setCheckForSnapshotsEnabled(boolean checkForSnapshots) | |
276 | + { | |
277 | + this.properties.setBooleanProperty(LoaderProperties.OPTION_CHECK_SNAPSHOTS, checkForSnapshots); | |
278 | + this.properties.writeProperties(); | |
279 | + } | |
280 | + | |
281 | + @Override | |
282 | + public boolean isCheckForSnapshotsEnabled() | |
283 | + { | |
284 | + return this.properties.getBooleanProperty(LoaderProperties.OPTION_CHECK_SNAPSHOTS); | |
285 | + } | |
254 | 286 | |
255 | 287 | /** |
256 | 288 | * Display the liteloader panel over the specified GUI | ... | ... |
src/client/java/com/mumfrey/liteloader/client/gui/GuiLiteLoaderPanel.java
... | ... | @@ -177,11 +177,10 @@ public class GuiLiteLoaderPanel extends GuiScreen |
177 | 177 | this.startupErrorCount = mods.getStartupErrorCount(); |
178 | 178 | this.criticalErrorCount = mods.getCriticalErrorCount(); |
179 | 179 | |
180 | - String branding = LiteLoader.getBranding(); | |
181 | - if (branding != null && branding.contains("SNAPSHOT")) | |
180 | + this.isSnapshot = LiteLoader.isSnapshot(); | |
181 | + if (this.isSnapshot) | |
182 | 182 | { |
183 | - this.isSnapshot = true; | |
184 | - this.versionText = "\247c" + branding; | |
183 | + this.versionText = "\247c" + LiteLoader.getBranding(); | |
185 | 184 | } |
186 | 185 | } |
187 | 186 | |
... | ... | @@ -524,6 +523,7 @@ public class GuiLiteLoaderPanel extends GuiScreen |
524 | 523 | |
525 | 524 | if (annoyingTip) |
526 | 525 | { |
526 | + GuiLiteLoaderPanel.displayErrorToolTip = false; | |
527 | 527 | this.drawNotificationTooltip(mouseX, mouseY - 13); |
528 | 528 | } |
529 | 529 | } |
... | ... | @@ -542,8 +542,11 @@ public class GuiLiteLoaderPanel extends GuiScreen |
542 | 542 | } |
543 | 543 | else if (this.notification != null) |
544 | 544 | { |
545 | - GuiLiteLoaderPanel.drawTooltip(this.fontRenderer, this.notification, left, top, this.width, this.height, | |
546 | - GuiLiteLoaderPanel.NOTIFICATION_TOOLTIP_FOREGROUND, GuiLiteLoaderPanel.NOTIFICATION_TOOLTIP_BACKGROUND); | |
545 | + boolean isCritical = this.notification.startsWith("!!"); | |
546 | + String text = isCritical ? this.notification.substring(2) : this.notification; | |
547 | + int bgColour = isCritical ? GuiLiteLoaderPanel.ERROR_TOOLTIP_BACKGROUND : GuiLiteLoaderPanel.NOTIFICATION_TOOLTIP_BACKGROUND; | |
548 | + GuiLiteLoaderPanel.drawTooltip(this.fontRenderer, text, left, top, this.width, this.height, | |
549 | + GuiLiteLoaderPanel.NOTIFICATION_TOOLTIP_FOREGROUND, bgColour); | |
547 | 550 | } |
548 | 551 | } |
549 | 552 | |
... | ... | @@ -739,21 +742,32 @@ public class GuiLiteLoaderPanel extends GuiScreen |
739 | 742 | * |
740 | 743 | * @param fontRenderer |
741 | 744 | * @param tooltipText |
742 | - * @param mouseX | |
743 | - * @param mouseY | |
745 | + * @param left | |
746 | + * @param top | |
744 | 747 | * @param screenWidth |
745 | 748 | * @param screenHeight |
746 | 749 | * @param colour |
747 | 750 | * @param backgroundColour |
748 | 751 | */ |
749 | - public static void drawTooltip(FontRenderer fontRenderer, String tooltipText, int mouseX, int mouseY, int screenWidth, int screenHeight, | |
752 | + public static void drawTooltip(FontRenderer fontRenderer, String text, int left, int top, int screenWidth, int screenHeight, | |
750 | 753 | int colour, int backgroundColour) |
751 | 754 | { |
752 | - int textSize = fontRenderer.getStringWidth(tooltipText); | |
753 | - mouseX = Math.max(0, Math.min(screenWidth - 4, mouseX - 4)); | |
754 | - mouseY = Math.max(0, Math.min(screenHeight - 16, mouseY)); | |
755 | - drawRect(mouseX - textSize - 2, mouseY, mouseX + 2, mouseY + 12, backgroundColour); | |
756 | - fontRenderer.drawStringWithShadow(tooltipText, mouseX - textSize, mouseY + 2, colour); | |
755 | + String[] lines = text.trim().split("\\r?\\n"); | |
756 | + int textWidth = 0; | |
757 | + int textHeight = 9 * lines.length; | |
758 | + for (String line : lines) | |
759 | + { | |
760 | + textWidth = Math.max(textWidth, fontRenderer.getStringWidth(line)); | |
761 | + top -= 9; | |
762 | + } | |
763 | + | |
764 | + left = Math.max(0, Math.min(screenWidth - 4, left - 4)); | |
765 | + top = Math.max(0, Math.min(screenHeight - 16, top + 9)); | |
766 | + drawRect(left - textWidth - 2, top, left + 2, top + textHeight + 2, backgroundColour); | |
767 | + for (String line : lines) | |
768 | + { | |
769 | + fontRenderer.drawStringWithShadow(line, left - textWidth, (top += 9) - 7, colour); | |
770 | + } | |
757 | 771 | } |
758 | 772 | |
759 | 773 | ... | ... |
src/client/java/com/mumfrey/liteloader/client/gui/GuiPanelSettings.java
... | ... | @@ -17,25 +17,29 @@ import net.minecraft.client.resources.I18n; |
17 | 17 | |
18 | 18 | class GuiPanelSettings extends GuiPanel |
19 | 19 | { |
20 | - private GuiLiteLoaderPanel parentScreen; | |
20 | + private final GuiLiteLoaderPanel parentScreen; | |
21 | + | |
22 | + private final boolean isSnapshot; | |
21 | 23 | |
22 | - private GuiCheckbox chkShowTab, chkNoHide, chkForceUpdate; | |
24 | + private GuiCheckbox chkShowTab, chkNoHide, chkForceUpdate, chkCheckForSnapshots; | |
23 | 25 | |
24 | 26 | private boolean hide; |
25 | 27 | |
26 | 28 | private String[] helpText = new String[5]; |
27 | - | |
29 | + | |
28 | 30 | GuiPanelSettings(GuiLiteLoaderPanel parentScreen, Minecraft minecraft) |
29 | 31 | { |
30 | 32 | super(minecraft); |
31 | 33 | |
32 | 34 | this.parentScreen = parentScreen; |
35 | + this.isSnapshot = LiteLoader.isSnapshot(); | |
33 | 36 | |
37 | + String helpKey = this.isSnapshot ? "checkforsnapshots" : "forceupdate"; | |
34 | 38 | this.helpText[0] = I18n.format("gui.settings.showtab.help1"); |
35 | 39 | this.helpText[1] = I18n.format("gui.settings.showtab.help2"); |
36 | 40 | this.helpText[2] = I18n.format("gui.settings.notabhide.help1"); |
37 | - this.helpText[3] = I18n.format("gui.settings.forceupdate.help1"); | |
38 | - this.helpText[4] = I18n.format("gui.settings.forceupdate.help2"); | |
41 | + this.helpText[3] = I18n.format("gui.settings." + helpKey + ".help1"); | |
42 | + this.helpText[4] = I18n.format("gui.settings." + helpKey + ".help2"); | |
39 | 43 | } |
40 | 44 | |
41 | 45 | @Override |
... | ... | @@ -61,6 +65,10 @@ class GuiPanelSettings extends GuiPanel |
61 | 65 | this.controls.add(this.chkShowTab = new GuiCheckbox(0, 34, 90, I18n.format("gui.settings.showtab.label"))); |
62 | 66 | this.controls.add(this.chkNoHide = new GuiCheckbox(1, 34, 128, I18n.format("gui.settings.notabhide.label"))); |
63 | 67 | this.controls.add(this.chkForceUpdate = new GuiCheckbox(2, 34, 158, I18n.format("gui.settings.forceupdate.label"))); |
68 | + this.controls.add(this.chkCheckForSnapshots = new GuiCheckbox(2, 34, 158, I18n.format("gui.settings.checkforsnapshots.label"))); | |
69 | + | |
70 | + this.chkForceUpdate.visible = !this.isSnapshot; | |
71 | + this.chkCheckForSnapshots.visible = this.isSnapshot; | |
64 | 72 | |
65 | 73 | this.updateCheckBoxes(); |
66 | 74 | } |
... | ... | @@ -72,6 +80,7 @@ class GuiPanelSettings extends GuiPanel |
72 | 80 | this.chkShowTab.checked = panelManager.isTabVisible(); |
73 | 81 | this.chkNoHide.checked = panelManager.isTabAlwaysExpanded(); |
74 | 82 | this.chkForceUpdate.checked = panelManager.isForceUpdateEnabled(); |
83 | + this.chkCheckForSnapshots.checked = panelManager.isCheckForSnapshotsEnabled(); | |
75 | 84 | } |
76 | 85 | |
77 | 86 | private void updateSettings() |
... | ... | @@ -81,6 +90,7 @@ class GuiPanelSettings extends GuiPanel |
81 | 90 | panelManager.setTabVisible(this.chkShowTab.checked); |
82 | 91 | panelManager.setTabAlwaysExpanded(this.chkNoHide.checked); |
83 | 92 | panelManager.setForceUpdateEnabled(this.chkForceUpdate.checked); |
93 | + panelManager.setCheckForSnapshotsEnabled(this.chkCheckForSnapshots.checked); | |
84 | 94 | } |
85 | 95 | |
86 | 96 | @Override | ... | ... |
src/main/java/com/mumfrey/liteloader/core/LiteLoader.java
... | ... | @@ -532,6 +532,15 @@ public final class LiteLoader |
532 | 532 | { |
533 | 533 | return "true".equals(System.getProperty("mcpenv")); |
534 | 534 | } |
535 | + | |
536 | + /** | |
537 | + * Get whether the current running version is a snapshot build | |
538 | + */ | |
539 | + public static boolean isSnapshot() | |
540 | + { | |
541 | + String branding = LiteLoader.getBranding(); | |
542 | + return branding != null && branding.contains("SNAPSHOT"); | |
543 | + } | |
535 | 544 | |
536 | 545 | /** |
537 | 546 | * Dump debugging information to the console | ... | ... |
src/main/java/com/mumfrey/liteloader/core/LiteLoaderUpdateSite.java
... | ... | @@ -8,6 +8,10 @@ package com.mumfrey.liteloader.core; |
8 | 8 | import java.io.File; |
9 | 9 | import java.io.IOException; |
10 | 10 | import java.io.InputStream; |
11 | +import java.util.Date; | |
12 | +import java.util.Map; | |
13 | +import java.util.regex.Matcher; | |
14 | +import java.util.regex.Pattern; | |
11 | 15 | |
12 | 16 | import com.google.common.io.ByteSink; |
13 | 17 | import com.google.common.io.Files; |
... | ... | @@ -21,6 +25,8 @@ public class LiteLoaderUpdateSite extends UpdateSite |
21 | 25 | private static final String UPDATE_SITE_URL = "http://dl.liteloader.com/versions/"; |
22 | 26 | private static final String UPDATE_SITE_VERSIONS_JSON = "versions.json"; |
23 | 27 | private static final String UPDATE_SITE_ARTEFACT_NAME = "com.mumfrey:liteloader"; |
28 | + | |
29 | + private static final Pattern SNAPSHOT_REGEX = Pattern.compile("^([0-9\\._]+)-SNAPSHOT-(r[0-9a-z]+)-(b([0-9]+))-(.*)$", Pattern.CASE_INSENSITIVE); | |
24 | 30 | |
25 | 31 | private String mcVersion; |
26 | 32 | |
... | ... | @@ -28,6 +34,10 @@ public class LiteLoaderUpdateSite extends UpdateSite |
28 | 34 | private File jarFile = null; |
29 | 35 | |
30 | 36 | private boolean updateForced = false; |
37 | + private boolean isSnapshot = false; | |
38 | + | |
39 | + private int currentBuild, availableBuild; | |
40 | + private String snapshotDate = null; | |
31 | 41 | |
32 | 42 | public LiteLoaderUpdateSite(String targetVersion, long currentTimeStamp) |
33 | 43 | { |
... | ... | @@ -36,6 +46,64 @@ public class LiteLoaderUpdateSite extends UpdateSite |
36 | 46 | |
37 | 47 | this.mcVersion = targetVersion; |
38 | 48 | } |
49 | + | |
50 | + @Override | |
51 | + public void beginUpdateCheck() | |
52 | + { | |
53 | + this.isSnapshot = LiteLoader.isSnapshot(); | |
54 | + super.beginUpdateCheck(); | |
55 | + } | |
56 | + | |
57 | + @Override | |
58 | + public boolean isSnapshot() | |
59 | + { | |
60 | + return this.isSnapshot; | |
61 | + } | |
62 | + | |
63 | + @Override | |
64 | + public String getAvailableVersion() | |
65 | + { | |
66 | + if (this.isSnapshot() && this.availableBuild > 0) | |
67 | + { | |
68 | + return String.valueOf(this.availableBuild); | |
69 | + } | |
70 | + | |
71 | + return super.getAvailableVersion(); | |
72 | + } | |
73 | + | |
74 | + @Override | |
75 | + public String getAvailableVersionDate() | |
76 | + { | |
77 | + if (this.snapshotDate != null) | |
78 | + { | |
79 | + return this.snapshotDate; | |
80 | + } | |
81 | + | |
82 | + return super.getAvailableVersionDate(); | |
83 | + } | |
84 | + | |
85 | + @Override | |
86 | + protected boolean compareArtefact(Map<?, ?> artefact, long bestTimeStamp, Long remoteTimeStamp) | |
87 | + { | |
88 | + if (this.isSnapshot()) | |
89 | + { | |
90 | + String remoteBuild = artefact.get("build").toString(); | |
91 | + String myBuild = LiteLoader.getBranding(); | |
92 | + | |
93 | + Matcher remoteMatcher = LiteLoaderUpdateSite.SNAPSHOT_REGEX.matcher(remoteBuild); | |
94 | + Matcher myMatcher = LiteLoaderUpdateSite.SNAPSHOT_REGEX.matcher(myBuild); | |
95 | + | |
96 | + if (remoteMatcher.matches() && myMatcher.matches()) | |
97 | + { | |
98 | + this.currentBuild = Integer.parseInt(myMatcher.group(4)); | |
99 | + this.availableBuild = Integer.parseInt(remoteMatcher.group(4)); | |
100 | + this.snapshotDate = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM", new Date(remoteTimeStamp * 1000L)); | |
101 | + return this.availableBuild > this.currentBuild; | |
102 | + } | |
103 | + } | |
104 | + | |
105 | + return super.compareArtefact(artefact, bestTimeStamp, remoteTimeStamp); | |
106 | + } | |
39 | 107 | |
40 | 108 | public boolean canForceUpdate(LoaderProperties properties) |
41 | 109 | { | ... | ... |
src/main/java/com/mumfrey/liteloader/interfaces/PanelManager.java
... | ... | @@ -88,4 +88,14 @@ public interface PanelManager<TParentScreen> extends TickObserver, PostRenderObs |
88 | 88 | * Get whether "force update" is enabled |
89 | 89 | */ |
90 | 90 | public abstract boolean isForceUpdateEnabled(); |
91 | + | |
92 | + /** | |
93 | + * Set whether "check for new snapshots" is enabled | |
94 | + */ | |
95 | + public abstract void setCheckForSnapshotsEnabled(boolean checkForSnapshots); | |
96 | + | |
97 | + /** | |
98 | + * Get whether "check for new snapshots" is enabled | |
99 | + */ | |
100 | + public abstract boolean isCheckForSnapshotsEnabled(); | |
91 | 101 | } | ... | ... |
src/main/java/com/mumfrey/liteloader/launch/LoaderProperties.java
... | ... | @@ -99,6 +99,7 @@ public interface LoaderProperties |
99 | 99 | public static final String OPTION_FORCE_UPDATE = "allowForceUpdate"; |
100 | 100 | public static final String OPTION_UPDATE_CHECK_INTR = "updateCheckInterval"; |
101 | 101 | public static final String OPTION_JINPUT_DISABLE = "disableJInput"; |
102 | + public static final String OPTION_CHECK_SNAPSHOTS = "checkForNewSnapshots"; | |
102 | 103 | |
103 | 104 | // Enumerator properties |
104 | 105 | public static final String OPTION_SEARCH_MODS = "search.mods"; | ... | ... |
src/main/java/com/mumfrey/liteloader/update/UpdateSite.java
... | ... | @@ -160,6 +160,11 @@ public class UpdateSite implements Comparator<Long> |
160 | 160 | } |
161 | 161 | } |
162 | 162 | } |
163 | + | |
164 | + public boolean isSnapshot() | |
165 | + { | |
166 | + return false; | |
167 | + } | |
163 | 168 | |
164 | 169 | /** |
165 | 170 | * Gets whether a check is in progress |
... | ... | @@ -319,7 +324,7 @@ public class UpdateSite implements Comparator<Long> |
319 | 324 | */ |
320 | 325 | private void handleVersionData(Object key, Map<?, ?> value) |
321 | 326 | { |
322 | - if ("artefacts".equals(key)) | |
327 | + if ((this.isSnapshot() && "snapshots".equals(key)) || (!this.isSnapshot() && "artefacts".equals(key))) | |
323 | 328 | { |
324 | 329 | if (value.containsKey(this.artefact)) |
325 | 330 | { |
... | ... | @@ -387,7 +392,7 @@ public class UpdateSite implements Comparator<Long> |
387 | 392 | this.availableVersion = artefact.get("version").toString(); |
388 | 393 | this.availableVersionDate = DateFormat.getDateTimeInstance().format(new Date(remoteTimeStamp * 1000L)); |
389 | 394 | this.availableVersionURL = this.createArtefactURL(artefact.get("file").toString()); |
390 | - this.updateAvailable = this.compareTimeStamps(bestTimeStamp, remoteTimeStamp); | |
395 | + this.updateAvailable = this.compareArtefact(artefact, bestTimeStamp, remoteTimeStamp); | |
391 | 396 | |
392 | 397 | return true; |
393 | 398 | } |
... | ... | @@ -395,6 +400,11 @@ public class UpdateSite implements Comparator<Long> |
395 | 400 | return false; |
396 | 401 | } |
397 | 402 | |
403 | + protected boolean compareArtefact(Map<?, ?> artefact, long bestTimeStamp, Long remoteTimeStamp) | |
404 | + { | |
405 | + return this.compareTimeStamps(bestTimeStamp, remoteTimeStamp); | |
406 | + } | |
407 | + | |
398 | 408 | /** |
399 | 409 | * @param bestTimeStamp |
400 | 410 | * @param remoteTimeStamp | ... | ... |
src/main/resources/assets/liteloader/lang/en_us.lang
... | ... | @@ -16,6 +16,9 @@ gui.settings.notabhide.help1=Only applies if the above option is also checked |
16 | 16 | gui.settings.forceupdate.label=Periodically Check For Updates |
17 | 17 | gui.settings.forceupdate.help1=This option is §cexperimental§r and may not work properly |
18 | 18 | gui.settings.forceupdate.help2=yet, it also enables the "force update" capability. |
19 | +gui.settings.checkforsnapshots.label=Check For New Snapshots | |
20 | +gui.settings.checkforsnapshots.help1=If this option is enabled, LiteLoader will check | |
21 | +gui.settings.checkforsnapshots.help2=for new SNAPSHOT releases each time it it launched | |
19 | 22 | |
20 | 23 | gui.about.taboptions=§nLiteLoader Panel Options |
21 | 24 | |
... | ... | @@ -86,4 +89,5 @@ gui.error.title=Startup errors for %s |
86 | 89 | |
87 | 90 | gui.error.tooltip=%d mod startup error(s) detected (%d critical) |
88 | 91 | |
89 | -gui.notifications.updateavailable=LiteLoader Update Available! | |
90 | 92 | \ No newline at end of file |
93 | +gui.notifications.updateavailable=LiteLoader Update Available! | |
94 | +gui.notifications.newsnapshotavailable=!!New Snapshot Available:%nBuild #%s (%s) | |
91 | 95 | \ No newline at end of file | ... | ... |