From e3bd1a2d2e4af4cd5f29bb35cc46b0fe9edce407 Mon Sep 17 00:00:00 2001 From: Yaroslavik Date: Sun, 11 Nov 2018 16:23:22 +0200 Subject: [PATCH 01/10] Names for optional mods --- Launcher/runtime/dialog/overlay/options/options.css | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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; +} From 9241c0064fa34bb74f7d403a5e49ab30253d2a59 Mon Sep 17 00:00:00 2001 From: Yaroslavik Date: Mon, 12 Nov 2018 07:05:57 +0200 Subject: [PATCH 02/10] Fixed double loader (#57) --- .../runtime/dialog/overlay/processing/processing.fxml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Launcher/runtime/dialog/overlay/processing/processing.fxml b/Launcher/runtime/dialog/overlay/processing/processing.fxml index 1c188cb3..d5db2745 100644 --- a/Launcher/runtime/dialog/overlay/processing/processing.fxml +++ b/Launcher/runtime/dialog/overlay/processing/processing.fxml @@ -6,21 +6,15 @@ - + - + - - - - - - From aa91d12d2799553ac1b34271bf2c95c625c2b695 Mon Sep 17 00:00:00 2001 From: Gravit Date: Mon, 12 Nov 2018 22:27:44 +0700 Subject: [PATCH 03/10] =?UTF-8?q?=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D0=BC=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Launcher/runtime/dialog/dialog.js | 1 + .../runtime/dialog/overlay/options/options.js | 43 ++++++++++++++++++- Launcher/runtime/init.js | 1 - 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/Launcher/runtime/dialog/dialog.js b/Launcher/runtime/dialog/dialog.js index 2ca9cf9d..7cab597e 100644 --- a/Launcher/runtime/dialog/dialog.js +++ b/Launcher/runtime/dialog/dialog.js @@ -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.js b/Launcher/runtime/dialog/overlay/options/options.js index 5ad2fc0e..b6642aba 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 Date: Mon, 12 Nov 2018 19:09:10 +0200 Subject: [PATCH 04/10] Names, descriptions, submodifications and switch mechanics for additional mods (#52) * Names for optional mods * Names for optional modifications * Description and submodifications * Description and submodifications * Switching tree of mods. * Switching tree of mods. * Switching tree of mods. (Damn spaces..) * Switching tree of mods. (Lost variable) --- Launcher/runtime/config.js | 14 +++- .../runtime/dialog/overlay/options/options.js | 82 ++++++++++++++++++- 2 files changed, 92 insertions(+), 4 deletions(-) diff --git a/Launcher/runtime/config.js b/Launcher/runtime/config.js index 40c9e5fd..491eac05 100644 --- a/Launcher/runtime/config.js +++ b/Launcher/runtime/config.js @@ -41,4 +41,16 @@ 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.", //Описание модификации + group: 1, //Группа (Используется для ветки зависемых модификаций. К примеру: у NEI [submod: false и group: 1], а у NeiAddons и NeiPlugins [submod: true group: 1]) + submod: false //Это суб-модификация? (будет произведён отступ от левого края для выделения) + },*/ + }, +} diff --git a/Launcher/runtime/dialog/overlay/options/options.js b/Launcher/runtime/dialog/overlay/options/options.js index b6642aba..e585d4a0 100644 --- a/Launcher/runtime/dialog/overlay/options/options.js +++ b/Launcher/runtime/dialog/overlay/options/options.js @@ -84,6 +84,7 @@ var options = { }, }; +var upd = false; //Переменная обноеления интерфейса. function updateOptional() { var holder = options.overlay.lookup("#modlist").getContent(); @@ -100,7 +101,26 @@ function updateOptional() 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); + var modName = modfile.string, modDescription = "", subm = false; + if(optModNames.modInfo[modfile.string] != null){//Есть ли хоть какое ни будь представление описания модификации? + var optModN = optModNames.modInfo[modfile.string]; + if(optModN.name != null)//Есть ли у модификации имя? + modName = optModN.name; + if(optModN.description != null) //Есть ли описание? + modDescription = optModN.description; + if(optModN.submod != null && optModN.submod == true)//Это суб-модификация? + subm = true; + } 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(subm)//Это суб-модификация? + testMod.setTranslateX(25); testMod.setSelected(modfile.mark); testMod.setOnAction(function(event) { @@ -109,14 +129,70 @@ function updateOptional() { profile.markOptional(modfile.string); LogHelper.debug("Selected mod %s", modfile.string); + optionalModTreeToggle(true, modfile.string); } else { profile.unmarkOptional(modfile.string); LogHelper.debug("Unselected mod %s", modfile.string); + optionalModTreeToggle(false, modfile.string); } + upd = true; + updateOptional(); }); - checkboxlist.add(testMod); + checkboxlist.add(testMod); + + if(modDescription != "") { //Добавляем оаисание + textDescr = new javafx.scene.text.Text(modDescription); + if(subm){//Это суб-модификация? + textDescr.setWrappingWidth(345); + textDescr.setTranslateX(50); + } 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); + }); + if(upd) holder.getChildren().clear(); holder.getChildren().addAll(checkboxlist); -} \ No newline at end of file +}; +function optionalModTreeToggle(enable, Imodfile) { //Переключение ветки модов + var profile = profilesList[serverHolder.old].object; + if(optModNames.modInfo[Imodfile] != null) { + var modInfo = optModNames.modInfo[Imodfile]; + var modList = optModNames.modInfo; + + if(modInfo.group != null && modInfo.submod != null) { + + if(modInfo.submod == false){//Отключение core-модификации + Object.keys(modList).forEach(function(key, id) { + if(modList[key] != null && modList[key].group != null && modList[key].submod != null) { + if(modList[key].group == modInfo.group && modList[key].submod == true && enable == false) { + profile.unmarkOptional(key); + LogHelper.debug("Unselected subMod %s", key); + } + } + }); + } + + if(modInfo.submod == true){//Включение суб-модификации (Без core суб-моды работать не будут, так что его нужно включать) + Object.keys(modList).forEach(function(key, id) { + if(modList[key] != null && modList[key].group != null && modList[key].submod != null) { + if(modList[key].group == modInfo.group && modList[key].submod == false && enable == true) { + profile.markOptional(key); + LogHelper.debug("Selected coreMod %s", key); + } + } + }); + } + + } + } +} From 909d55076c34804caeb6e101a42f12fd0376103b Mon Sep 17 00:00:00 2001 From: Yaroslavik Date: Tue, 13 Nov 2018 04:49:12 +0200 Subject: [PATCH 05/10] Fixed ram lable (lable don't change value when moving the slider) (#61) Lable don't change value when moving the slider. --- Launcher/runtime/dialog/overlay/settings/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 78ecb7ff431175f61dcb9374e2868f0e4f9b0893 Mon Sep 17 00:00:00 2001 From: Yaroslavik Date: Tue, 13 Nov 2018 04:49:56 +0200 Subject: [PATCH 06/10] Sorting optional mods, triggering core-mods. (#60) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сортировка производится по механике: Сначала все моды по порядку как в config.js, а потом всё остальное. Триггер core-модификации работает так: Если 2 модификации имеют параметр submod: false и одинаковую группу - то они будут переключатся, при включении одного из них. То есть не возможно будет включить две модификации сразу. Полезно для тех же различных типов мини-карт. --- .../runtime/dialog/overlay/options/options.js | 142 ++++++++++-------- 1 file changed, 80 insertions(+), 62 deletions(-) diff --git a/Launcher/runtime/dialog/overlay/options/options.js b/Launcher/runtime/dialog/overlay/options/options.js index e585d4a0..2c8987b4 100644 --- a/Launcher/runtime/dialog/overlay/options/options.js +++ b/Launcher/runtime/dialog/overlay/options/options.js @@ -84,7 +84,6 @@ var options = { }, }; -var upd = false; //Переменная обноеления интерфейса. function updateOptional() { var holder = options.overlay.lookup("#modlist").getContent(); @@ -100,70 +99,78 @@ function updateOptional() var profile = profilesList[serverHolder.old].object; var list = profile.getOptional(); var checkboxlist = new java.util.ArrayList; - list.forEach(function(modfile,i,arr) { - var modName = modfile.string, modDescription = "", subm = false; - if(optModNames.modInfo[modfile.string] != null){//Есть ли хоть какое ни будь представление описания модификации? - var optModN = optModNames.modInfo[modfile.string]; - if(optModN.name != null)//Есть ли у модификации имя? - modName = optModN.name; - if(optModN.description != null) //Есть ли описание? - modDescription = optModN.description; - if(optModN.submod != null && optModN.submod == true)//Это суб-модификация? - subm = true; - } 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(subm)//Это суб-модификация? - testMod.setTranslateX(25); + var modConfigKeys = Object.keys(optModNames.modInfo); + var dModsIds = []; + + for (var ik = 0, l = modConfigKeys.length + 1; ik <= l; ik++) { + list.forEach(function(modfile) { + if((modConfigKeys[ik] === modfile.string) || (ik == modConfigKeys.length+1 && dModsIds.indexOf(modfile.string) == -1)) { + dModsIds.push(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); - optionalModTreeToggle(true, modfile.string); - } - else - { - profile.unmarkOptional(modfile.string); - LogHelper.debug("Unselected mod %s", modfile.string); - optionalModTreeToggle(false, modfile.string); - } - upd = true; - updateOptional(); - }); - checkboxlist.add(testMod); - - if(modDescription != "") { //Добавляем оаисание - textDescr = new javafx.scene.text.Text(modDescription); - if(subm){//Это суб-модификация? - textDescr.setWrappingWidth(345); - textDescr.setTranslateX(50); - } 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); - - }); - if(upd) holder.getChildren().clear(); + var modName = modfile.string, modDescription = "", subm = false; + if(optModNames.modInfo[modfile.string] != null){//Есть ли хоть какое-нибудь представление описания модификации? + var optModN = optModNames.modInfo[modfile.string]; + if(optModN.name != null)//Есть ли у модификации имя? + modName = optModN.name; + if(optModN.description != null) //Есть ли описание? + modDescription = optModN.description; + if(optModN.submod != null && optModN.submod == true)//Это суб-модификация? + subm = true; + } 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(subm)//Это суб-модификация? + testMod.setTranslateX(25); + + 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); + optionalModTreeToggle(true, modfile.string); + } + else + { + profile.unmarkOptional(modfile.string); + LogHelper.debug("Unselected mod %s", modfile.string); + optionalModTreeToggle(false, modfile.string); + } + updateOptional(); + }); + checkboxlist.add(testMod); + + if(modDescription != "") { //Добавляем описание? + textDescr = new javafx.scene.text.Text(modDescription); + if(subm){//Это суб-модификация? + textDescr.setWrappingWidth(345); + textDescr.setTranslateX(50); + } 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); }; -function optionalModTreeToggle(enable, Imodfile) { //Переключение ветки модов +function optionalModTreeToggle(enable, Imodfile) +{ //Переключение ветки модов var profile = profilesList[serverHolder.old].object; if(optModNames.modInfo[Imodfile] != null) { var modInfo = optModNames.modInfo[Imodfile]; @@ -182,6 +189,17 @@ function optionalModTreeToggle(enable, Imodfile) { //Переключение в }); } + if(modInfo.submod == false){//Включение core-модификации (Все core-модификации с той же группой будут отключены. К примеру 2 миникарты) + Object.keys(modList).forEach(function(key, id) { + if(modList[key] != null && modList[key].group != null) { + if(modList[key].group == modInfo.group && modList[key].submod == false && enable == true && key != Imodfile) { + profile.unmarkOptional(key); + LogHelper.debug("Unselected coreMod %s", key); + } + } + }); + } + if(modInfo.submod == true){//Включение суб-модификации (Без core суб-моды работать не будут, так что его нужно включать) Object.keys(modList).forEach(function(key, id) { if(modList[key] != null && modList[key].group != null && modList[key].submod != null) { From 370466dbe771e7361394a7a67590f089fb7c6119 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 13 Nov 2018 17:49:56 +0700 Subject: [PATCH 07/10] =?UTF-8?q?=D0=9E=D0=9E=D0=9F-like=20=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=20=D0=BE=D0=BF=D1=86=D0=B8=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D0=BC=D0=BE=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Launcher/runtime/dialog/dialog.js | 2 +- .../runtime/dialog/overlay/options/options.js | 270 +++++++++--------- 2 files changed, 135 insertions(+), 137 deletions(-) diff --git a/Launcher/runtime/dialog/dialog.js b/Launcher/runtime/dialog/dialog.js index 7cab597e..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); } diff --git a/Launcher/runtime/dialog/overlay/options/options.js b/Launcher/runtime/dialog/overlay/options/options.js index 2c8987b4..7189c2b1 100644 --- a/Launcher/runtime/dialog/overlay/options/options.js +++ b/Launcher/runtime/dialog/overlay/options/options.js @@ -43,16 +43,16 @@ var options = { for(var j = 0; j < listSize; j++) { var mark = input.readBoolean(); - var modfile = input.readString(0); + var modFile = input.readString(0); if(mark) { - profile.markOptional(modfile); - LogHelper.debug("Load options %s marked",modfile); + profile.markOptional(modFile); + LogHelper.debug("Load options %s marked",modFile); } else { - profile.unmarkOptional(modfile); - LogHelper.debug("Load options %s unmarked",modfile); + profile.unmarkOptional(modFile); + LogHelper.debug("Load options %s unmarked",modFile); } } } @@ -67,9 +67,9 @@ var options = { var list = profile.getOptional(); output.writeInt(list.size()); output.writeInt(profile.getSortIndex()); - list.forEach(function(modfile,j,arr2) { - output.writeBoolean(modfile.mark); - output.writeString(modfile.string, 0); + list.forEach(function(modFile,j,arr2) { + output.writeBoolean(modFile.mark); + output.writeString(modFile.string, 0); }); }); }, @@ -82,135 +82,133 @@ var options = { var holder = options.overlay.lookup("#holder"); holder.lookup("#apply").setOnAction(function(event) overlay.hide(0, null)); }, + update: function() { + var holder = options.overlay.lookup("#modlist").getContent(); + var nodelist = new java.util.ArrayList; -}; -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; - var modConfigKeys = Object.keys(optModNames.modInfo); - var dModsIds = []; - - for (var ik = 0, l = modConfigKeys.length + 1; ik <= l; ik++) { - list.forEach(function(modfile) { - if((modConfigKeys[ik] === modfile.string) || (ik == modConfigKeys.length+1 && dModsIds.indexOf(modfile.string) == -1)) { - dModsIds.push(modfile.string); + 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; + var modConfigKeys = Object.keys(optModNames.modInfo); + var dModsIds = []; + + for (var ik = 0, l = modConfigKeys.length + 1; ik <= l; ik++) { + list.forEach(function(modFile) { + if((modConfigKeys[ik] === modFile.string) || (ik == modConfigKeys.length+1 && dModsIds.indexOf(modFile.string) == -1)) { + dModsIds.push(modFile.string); + + var modName = modFile.string, modDescription = "", subm = false; + if(optModNames.modInfo[modFile.string] != null){//Есть ли хоть какое-нибудь представление описания модификации? + var optModN = optModNames.modInfo[modFile.string]; + if(optModN.name != null)//Есть ли у модификации имя? + modName = optModN.name; + if(optModN.description != null) //Есть ли описание? + modDescription = optModN.description; + if(optModN.subMod != null && optModN.subMod == true)//Это суб-модификация? + subm = true; + } 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(subm)//Это суб-модификация? + testMod.setTranslateX(25); + + 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(subm){//Это суб-модификация? + textDescr.setWrappingWidth(345); + textDescr.setTranslateX(50); + } 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; + + if(modInfo.group != null && modInfo.subMod != null) { + + if(modInfo.subMod == false){//Отключение core-модификации + Object.keys(modList).forEach(function(key, id) { + if(modList[key] != null && modList[key].group != null && modList[key].subMod != null) { + if(modList[key].group == modInfo.group && modList[key].subMod == true && enable == false) { + profile.unmarkOptional(key); + LogHelper.debug("Unselected subMod %s", key); + } + } + }); + } + + if(modInfo.subMod == false){//Включение core-модификации (Все core-модификации с той же группой будут отключены. К примеру 2 миникарты) + Object.keys(modList).forEach(function(key, id) { + if(modList[key] != null && modList[key].group != null) { + if(modList[key].group == modInfo.group && modList[key].subMod == false && enable == true && key != ImodFile) { + profile.unmarkOptional(key); + LogHelper.debug("Unselected coreMod %s", key); + } + } + }); + } + + if(modInfo.subMod == true){//Включение суб-модификации (Без core суб-моды работать не будут, так что его нужно включать) + Object.keys(modList).forEach(function(key, id) { + if(modList[key] != null && modList[key].group != null && modList[key].subMod != null) { + if(modList[key].group == modInfo.group && modList[key].subMod == false && enable == true) { + profile.markOptional(key); + LogHelper.debug("Selected coreMod %s", key); + } + } + }); + } - var modName = modfile.string, modDescription = "", subm = false; - if(optModNames.modInfo[modfile.string] != null){//Есть ли хоть какое-нибудь представление описания модификации? - var optModN = optModNames.modInfo[modfile.string]; - if(optModN.name != null)//Есть ли у модификации имя? - modName = optModN.name; - if(optModN.description != null) //Есть ли описание? - modDescription = optModN.description; - if(optModN.submod != null && optModN.submod == true)//Это суб-модификация? - subm = true; - } 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(subm)//Это суб-модификация? - testMod.setTranslateX(25); + } + } - 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); - optionalModTreeToggle(true, modfile.string); - } - else - { - profile.unmarkOptional(modfile.string); - LogHelper.debug("Unselected mod %s", modfile.string); - optionalModTreeToggle(false, modfile.string); - } - updateOptional(); - }); - checkboxlist.add(testMod); - - if(modDescription != "") { //Добавляем описание? - textDescr = new javafx.scene.text.Text(modDescription); - if(subm){//Это суб-модификация? - textDescr.setWrappingWidth(345); - textDescr.setTranslateX(50); - } 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); -}; -function optionalModTreeToggle(enable, Imodfile) -{ //Переключение ветки модов - var profile = profilesList[serverHolder.old].object; - if(optModNames.modInfo[Imodfile] != null) { - var modInfo = optModNames.modInfo[Imodfile]; - var modList = optModNames.modInfo; - - if(modInfo.group != null && modInfo.submod != null) { - - if(modInfo.submod == false){//Отключение core-модификации - Object.keys(modList).forEach(function(key, id) { - if(modList[key] != null && modList[key].group != null && modList[key].submod != null) { - if(modList[key].group == modInfo.group && modList[key].submod == true && enable == false) { - profile.unmarkOptional(key); - LogHelper.debug("Unselected subMod %s", key); - } - } - }); - } - - if(modInfo.submod == false){//Включение core-модификации (Все core-модификации с той же группой будут отключены. К примеру 2 миникарты) - Object.keys(modList).forEach(function(key, id) { - if(modList[key] != null && modList[key].group != null) { - if(modList[key].group == modInfo.group && modList[key].submod == false && enable == true && key != Imodfile) { - profile.unmarkOptional(key); - LogHelper.debug("Unselected coreMod %s", key); - } - } - }); - } - - if(modInfo.submod == true){//Включение суб-модификации (Без core суб-моды работать не будут, так что его нужно включать) - Object.keys(modList).forEach(function(key, id) { - if(modList[key] != null && modList[key].group != null && modList[key].submod != null) { - if(modList[key].group == modInfo.group && modList[key].submod == false && enable == true) { - profile.markOptional(key); - LogHelper.debug("Selected coreMod %s", key); - } - } - }); - } - - } - } -} +}; \ No newline at end of file From 56f81e791ae387721311291bea1b230f99654323 Mon Sep 17 00:00:00 2001 From: Gravit Date: Tue, 13 Nov 2018 19:02:50 +0700 Subject: [PATCH 08/10] 4.0.7 stable --- libLauncher/src/main/java/ru/gravit/launcher/Launcher.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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() { From 93ab36477ec60009031e4adbd884d9b15582a758 Mon Sep 17 00:00:00 2001 From: Yaroslavik Date: Wed, 14 Nov 2018 10:51:58 +0200 Subject: [PATCH 09/10] Update optional mods.. Again... (#65) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Поддержка многослойного дерева вложенности / новая механика выбора одного из национальных модов. Сортировка дерева производится так же, как и в прошлой версии (Сначала всё как config.js, потом всё остальное). Необходимо соблюдать порядок, это важно. Т.к. дерево на нём завязано. То есть модификации должны быть по порядку {Кор-мод}{Мод}{Аддон}, с соответствующими им уровнями вложенности. Теперь выбор "одного из" работает со всеми модами/субмодами. (К примеру: При включении миникарты - отключится JEI со всеми его аддонами. Т.к. JEI и миникарта имели общий флаг группы [onlyOneGroup] и соответственно включенный параметр [onlyOne]) Видео с демонстрацией работы вложенности/зависимости и функции выбора "одного из": https://lww.page.link/FKec --- Launcher/runtime/config.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Launcher/runtime/config.js b/Launcher/runtime/config.js index 491eac05..cd0b7f2e 100644 --- a/Launcher/runtime/config.js +++ b/Launcher/runtime/config.js @@ -47,10 +47,11 @@ var optModNames = { optAutoModName: true,//Попытатся автоматически создать представляемое имя модификации modInfo: {//"Путь до опц. модификации" : "Отображаемый клиенту контент" /*"mods/ModName-1.1.jar": { - name: "ModName", //Наименование модификации (Отображаемое в лаунчере) - description:"Лучший в своём роде ModName.", //Описание модификации - group: 1, //Группа (Используется для ветки зависемых модификаций. К примеру: у NEI [submod: false и group: 1], а у NeiAddons и NeiPlugins [submod: true group: 1]) - submod: false //Это суб-модификация? (будет произведён отступ от левого края для выделения) + name: "ModName", //Наименование модификации (Отображаемое в лаунчере) [Можно не указывать] + description:"Лучший в своём роде ModName.", //Описание модификации [Можно не указывать] + subTreeLevel: 1, //Уровень вложенности модификации (Ядро - 1, Мод - 2, Аддон - 3 и т.д...) (будет произведён отступ от левого края для выделения) [Можно не указывать, по умолчанию: 1] + onlyOne: true, //Для выбора только одной из группы модификаций [Можно не указывать] + onlyOneGroup: 1 //Используется в совокупности с onlyOne. Определяет ту самую группу, из которой производится выбор. },*/ - }, + } } From 7c58959e24fc7297b82ac78ff2fc72b10bcb7fe3 Mon Sep 17 00:00:00 2001 From: Yaroslavik Date: Wed, 14 Nov 2018 10:53:39 +0200 Subject: [PATCH 10/10] Update optional mods.. Again... (#66) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Поддержка многослойного дерева вложенности / новая механика выбора одного из национальных модов. Сортировка дерева производится так же, как и в прошлой версии (Сначала всё как config.js, потом всё остальное). Необходимо соблюдать порядок, это важно. Т.к. дерево на нём завязано. То есть модификации должны быть по порядку {Кор-мод}{Мод}{Аддон}, с соответствующими им уровнями вложенности. Теперь выбор "одного из" работает со всеми модами/субмодами. (К примеру: При включении миникарты - отключится неи со всеми его аддонами. Т.к. NEI и миникарта имели общий флаг группы [onlyOneGroup] и соответственно включенный параметр [onlyOne]) Видео с демонстрацией работы вложенности/зависимости и функции выбора "одного из": https://lww.page.link/FKec --- .../runtime/dialog/overlay/options/options.js | 68 ++++++++++++------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/Launcher/runtime/dialog/overlay/options/options.js b/Launcher/runtime/dialog/overlay/options/options.js index 7189c2b1..02ece64f 100644 --- a/Launcher/runtime/dialog/overlay/options/options.js +++ b/Launcher/runtime/dialog/overlay/options/options.js @@ -98,21 +98,26 @@ var options = { var checkBoxList = new java.util.ArrayList; var modConfigKeys = Object.keys(optModNames.modInfo); var dModsIds = []; + + modConfigKeys.forEach(function(key, id) {//По умолчанию индекс у ветви = 1. Выставляем его у всех неуказанных. + if(optModNames.modInfo[key].subTreeLevel == null) + optModNames.modInfo[key].subTreeLevel = 1; + }); for (var ik = 0, l = modConfigKeys.length + 1; ik <= l; ik++) { list.forEach(function(modFile) { if((modConfigKeys[ik] === modFile.string) || (ik == modConfigKeys.length+1 && dModsIds.indexOf(modFile.string) == -1)) { dModsIds.push(modFile.string); - var modName = modFile.string, modDescription = "", subm = false; + var modName = modFile.string, modDescription = "", subLevel = 1; if(optModNames.modInfo[modFile.string] != null){//Есть ли хоть какое-нибудь представление описания модификации? var optModN = optModNames.modInfo[modFile.string]; if(optModN.name != null)//Есть ли у модификации имя? modName = optModN.name; if(optModN.description != null) //Есть ли описание? modDescription = optModN.description; - if(optModN.subMod != null && optModN.subMod == true)//Это суб-модификация? - subm = true; + if(optModN.subTreeLevel != null && optModN.subTreeLevel > 1)//Это суб-модификация? + subLevel = optModN.subTreeLevel; } else if(optModNames.optAutoModName) { //Попытка автоматически создать представляемое имя модификации. modName = modName.replace(new RegExp("(.*?(\/))",'g'),''); @@ -122,8 +127,9 @@ var options = { } var testMod = new javafx.scene.control.CheckBox(modName); - if(subm)//Это суб-модификация? - testMod.setTranslateX(25); + if(subLevel > 1) + for(var i = 1; i < subLevel; i++)//Выделение субмодификаций сдвигом. + testMod.setTranslateX(25*i); testMod.setSelected(modFile.mark); testMod.setOnAction(function(event) { @@ -146,12 +152,14 @@ var options = { if(modDescription != "") { //Добавляем описание? textDescr = new javafx.scene.text.Text(modDescription); - if(subm){//Это суб-модификация? - textDescr.setWrappingWidth(345); - textDescr.setTranslateX(50); + 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.setWrappingWidth(370); + textDescr.setTranslateX(25); } textDescr.setTextAlignment(javafx.scene.text.TextAlignment.JUSTIFY); textDescr.getStyleClass().add("description-text"); @@ -171,37 +179,47 @@ var options = { if(optModNames.modInfo[ImodFile] != null) { var modInfo = optModNames.modInfo[ImodFile]; var modList = optModNames.modInfo; + var modIDs = Object.keys(modList); - if(modInfo.group != null && modInfo.subMod != null) { + if(modInfo.subTreeLevel != null) { - if(modInfo.subMod == false){//Отключение core-модификации - Object.keys(modList).forEach(function(key, id) { - if(modList[key] != null && modList[key].group != null && modList[key].subMod != null) { - if(modList[key].group == modInfo.group && modList[key].subMod == true && enable == false) { + 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.subMod == false){//Включение core-модификации (Все core-модификации с той же группой будут отключены. К примеру 2 миникарты) - Object.keys(modList).forEach(function(key, id) { - if(modList[key] != null && modList[key].group != null) { - if(modList[key].group == modInfo.group && modList[key].subMod == false && enable == true && key != ImodFile) { + 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 coreMod %s", key); + LogHelper.debug("Unselected Mod (onlyOne toggle) %s", key); + options.treeToggle(false, key); //И все его подмодификации канут в Лету.. } } }); } - if(modInfo.subMod == true){//Включение суб-модификации (Без core суб-моды работать не будут, так что его нужно включать) - Object.keys(modList).forEach(function(key, id) { - if(modList[key] != null && modList[key].group != null && modList[key].subMod != null) { - if(modList[key].group == modInfo.group && modList[key].subMod == false && enable == true) { + 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--; } } }); @@ -211,4 +229,4 @@ var options = { } } -}; \ No newline at end of file +};