diff --git a/Launcher/runtime/config.js b/Launcher/runtime/config.js index 40c9e5fd..cd0b7f2e 100644 --- a/Launcher/runtime/config.js +++ b/Launcher/runtime/config.js @@ -41,4 +41,17 @@ var serversConfig = { } return serversConfig[profile][property]; } -}; \ No newline at end of file +}; + +var optModNames = { + optAutoModName: true,//Попытатся автоматически создать представляемое имя модификации + modInfo: {//"Путь до опц. модификации" : "Отображаемый клиенту контент" + /*"mods/ModName-1.1.jar": { + name: "ModName", //Наименование модификации (Отображаемое в лаунчере) [Можно не указывать] + description:"Лучший в своём роде ModName.", //Описание модификации [Можно не указывать] + subTreeLevel: 1, //Уровень вложенности модификации (Ядро - 1, Мод - 2, Аддон - 3 и т.д...) (будет произведён отступ от левого края для выделения) [Можно не указывать, по умолчанию: 1] + onlyOne: true, //Для выбора только одной из группы модификаций [Можно не указывать] + onlyOneGroup: 1 //Используется в совокупности с onlyOne. Определяет ту самую группу, из которой производится выбор. + },*/ + } +} diff --git a/Launcher/runtime/dialog/dialog.js b/Launcher/runtime/dialog/dialog.js index 2ca9cf9d..63be8402 100644 --- a/Launcher/runtime/dialog/dialog.js +++ b/Launcher/runtime/dialog/dialog.js @@ -182,7 +182,7 @@ function goOptions(event) { } // Show options overlay - updateOptional(); + options.update(); overlay.show(options.overlay, null); } @@ -198,6 +198,7 @@ function verifyLauncher(e) { } overlay.swap(0, processing.overlay, function(event) makeProfilesRequest(function(result) { settings.lastProfiles = result.profiles; + options.load(); // Update profiles list and hide overlay updateProfilesList(result.profiles); overlay.hide(0, function() { diff --git a/Launcher/runtime/dialog/overlay/options/options.css b/Launcher/runtime/dialog/overlay/options/options.css index 2f9fdd0f..aa677e61 100644 --- a/Launcher/runtime/dialog/overlay/options/options.css +++ b/Launcher/runtime/dialog/overlay/options/options.css @@ -61,10 +61,9 @@ .scroll-pane > .corner { .check-box{ -fx-background-color: transparent; -fx-text-fill:#2c2c2c; - -fx-font-size: 13; + -fx-font-size: 13px; -fx-background-image: url('../../images/icons/checkbox.png'); -fx-background-repeat: no-repeat; - -fx-padding: 0 0 10 0; } .check-box .mark { -fx-background-color: transparent; @@ -83,3 +82,13 @@ .check-box:selected .mark { .check-box:selected .box { -fx-background-color: transparent; } + +.description-text { + -fx-font-smoothing-type: lcd; + -fx-fill: #8c8c8c; + -fx-font-size: 12px; +} +.separator *.line { + -fx-border-color: transparent; + -fx-border-width: 0 0 10 0; +} diff --git a/Launcher/runtime/dialog/overlay/options/options.js b/Launcher/runtime/dialog/overlay/options/options.js index 5ad2fc0e..02ece64f 100644 --- a/Launcher/runtime/dialog/overlay/options/options.js +++ b/Launcher/runtime/dialog/overlay/options/options.js @@ -2,7 +2,7 @@ var options = { file: DirBridge.dir.resolve("options.bin"), // options file /* options and overlay functions */ - load: function() { + load: function(profiles) { LogHelper.debug("Loading options file"); try { tryWithResources(new HInput(IOHelper.newInput(options.file)), options.read); @@ -27,10 +27,51 @@ var options = { if (magic != config.settingsMagic) { throw new java.io.IOException("options magic mismatch: " + java.lang.Integer.toString(magic, 16)); } + var profilesCount = input.readInt(); + LogHelper.debug("Load options. ProfilesCount %d",profilesCount); + for(var i = 0;i 1)//Это суб-модификация? + subLevel = optModN.subTreeLevel; + } else if(optModNames.optAutoModName) { + //Попытка автоматически создать представляемое имя модификации. + modName = modName.replace(new RegExp("(.*?(\/))",'g'),''); + modName = modName.replace(new RegExp("(-|_|[\\d]|\\+).*",'g'),''); + //Первая буква - заглавная + modName = modName[0].toUpperCase() + modName.slice(1); + } + var testMod = new javafx.scene.control.CheckBox(modName); + + if(subLevel > 1) + for(var i = 1; i < subLevel; i++)//Выделение субмодификаций сдвигом. + testMod.setTranslateX(25*i); + + testMod.setSelected(modFile.mark); + testMod.setOnAction(function(event) { + var isSelected = event.getSource().isSelected(); + if(isSelected) + { + profile.markOptional(modFile.string); + LogHelper.debug("Selected mod %s", modFile.string); + options.treeToggle(true, modFile.string); + } + else + { + profile.unmarkOptional(modFile.string); + LogHelper.debug("Unselected mod %s", modFile.string); + options.treeToggle(false, modFile.string); + } + options.update(); + }); + checkBoxList.add(testMod); + + if(modDescription != "") { //Добавляем описание? + textDescr = new javafx.scene.text.Text(modDescription); + if(subLevel > 1) { + for(var i = 1; i < subLevel; i++){ + textDescr.setWrappingWidth(370-(25*i)); + textDescr.setTranslateX(25+(25*i)); + } + } else { + textDescr.setWrappingWidth(370); + textDescr.setTranslateX(25); + } + textDescr.setTextAlignment(javafx.scene.text.TextAlignment.JUSTIFY); + textDescr.getStyleClass().add("description-text"); + checkBoxList.add(textDescr); + } + sep = new javafx.scene.control.Separator(); + sep.getStyleClass().add("separator"); + checkBoxList.add(sep); + } + }); + } + holder.getChildren().clear(); + holder.getChildren().addAll(checkBoxList); + }, + treeToggle: function(enable, ImodFile) { + var profile = profilesList[serverHolder.old].object; + if(optModNames.modInfo[ImodFile] != null) { + var modInfo = optModNames.modInfo[ImodFile]; + var modList = optModNames.modInfo; + var modIDs = Object.keys(modList); + + if(modInfo.subTreeLevel != null) { + + if(modInfo.subTreeLevel >= 1){//Отключение core-модификации + var stop = false; + modIDs.forEach(function(key, id) { + if(modList[key] != null && modList[key].subTreeLevel != null) { + if( modList[key].subTreeLevel > modInfo.subTreeLevel && modIDs.indexOf(key) > modIDs.indexOf(ImodFile) && enable == false && stop == false) { + profile.unmarkOptional(key); + LogHelper.debug("Unselected subMod %s", key); + } else if(modIDs.indexOf(key) > modIDs.indexOf(ImodFile) && modList[key].subTreeLevel <= modInfo.subTreeLevel && stop == false) { + //LogHelper.debug("STOP disable!! " + key); + stop = true; + } + } + }); + } + + if(modInfo.onlyOne == true){//Включение onlyOne-модификации (Все onlyOne-модификации с той же группой будут отключены. К примеру 2 миникарты) + modIDs.forEach(function(key, id) { + if(modList[key] != null && modList[key].onlyOneGroup != null) { + if(modList[key].onlyOneGroup == modInfo.onlyOneGroup && modList[key].onlyOne == true && enable == true && key != ImodFile) { + profile.unmarkOptional(key); + LogHelper.debug("Unselected Mod (onlyOne toggle) %s", key); + options.treeToggle(false, key); //И все его подмодификации канут в Лету.. + } + } + }); + } + + if(modInfo.subTreeLevel > 1){//Включение суб-модификации (Без core суб-моды работать не будут, так что его нужно включать) (Включаем всю ветку зависимости) + var reverseModList = Object.keys(modList).reverse(); + var tsl = modInfo.subTreeLevel-1; + reverseModList.forEach(function(key, id) { + if(modList[key] != null && modList[key].subTreeLevel != null) { + if(modList[key].subTreeLevel == tsl && modIDs.indexOf(key) < modIDs.indexOf(ImodFile) && enable == true) { + profile.markOptional(key); + LogHelper.debug("Selected coreMod %s", key); + options.treeToggle(true, key); //Для срабатывания onlyOne-модификаций. + tsl--; + } + } + }); + } + + } + } + } }; -function updateOptional() -{ - var holder = options.overlay.lookup("#modlist").getContent(); - var nodelist = new java.util.ArrayList; - - holder.getChildren().forEach(function(node,i,arr) { - if(node instanceof javafx.scene.control.CheckBox) - nodelist.add(node); - }); - nodelist.forEach(function(node,i,arr) { - holder.getChildren().remove(node); - }); - var profile = profilesList[serverHolder.old].object; - var list = profile.getOptional(); - var checkboxlist = new java.util.ArrayList; - list.forEach(function(modfile,i,arr) { - var testMod = new javafx.scene.control.CheckBox(modfile.string); - - testMod.setSelected(modfile.mark); - testMod.setOnAction(function(event) { - var isSelected = event.getSource().isSelected(); - if(isSelected) - { - profile.markOptional(modfile.string); - LogHelper.debug("Selected mod %s", modfile.string); - } - else - { - profile.unmarkOptional(modfile.string); - LogHelper.debug("Unselected mod %s", modfile.string); - } - }); - checkboxlist.add(testMod); - }); - holder.getChildren().addAll(checkboxlist); -} \ No newline at end of file diff --git a/Launcher/runtime/dialog/overlay/settings/settings.js b/Launcher/runtime/dialog/overlay/settings/settings.js index d4225b39..b4fc596d 100644 --- a/Launcher/runtime/dialog/overlay/settings/settings.js +++ b/Launcher/runtime/dialog/overlay/settings/settings.js @@ -93,7 +93,7 @@ var settingsOverlay = { ramSlider.setValue(settings.ram); ramSlider.valueProperty()["addListener(javafx.beans.value.ChangeListener)"](function(o, ov, nv) { settings.setRAM(nv); - settings.updateRAMLabel(); + settingsOverlay.updateRAMLabel(); }); // Lookup delete dir button diff --git a/Launcher/runtime/init.js b/Launcher/runtime/init.js index 5601b78c..34fca1c3 100644 --- a/Launcher/runtime/init.js +++ b/Launcher/runtime/init.js @@ -7,7 +7,6 @@ var LauncherApp = Java.extend(JSApplication, { app = JSApplication.getInstance(); cliParams.init(app.getParameters()); settings.load(); - options.load(); cliParams.applySettings(); }, start: function(primaryStage) { stage = primaryStage; diff --git a/libLauncher/src/main/java/ru/gravit/launcher/Launcher.java b/libLauncher/src/main/java/ru/gravit/launcher/Launcher.java index 837b27eb..67798cba 100644 --- a/libLauncher/src/main/java/ru/gravit/launcher/Launcher.java +++ b/libLauncher/src/main/java/ru/gravit/launcher/Launcher.java @@ -66,9 +66,9 @@ static int readBuildNumber() { private static final Pattern UUID_PATTERN = Pattern.compile("-", Pattern.LITERAL); public static int MAJOR = 4; public static int MINOR = 0; - public static int PATCH = 6; + public static int PATCH = 7; public static int BUILD = readBuildNumber(); - public static Version.Type RELEASE = Version.Type.BETA; + public static Version.Type RELEASE = Version.Type.STABLE; @LauncherAPI public static LauncherConfig getConfig() {