Полноценный граф зависимостей опциональных модов на Java

This commit is contained in:
Gravit 2018-12-27 14:51:39 +07:00
parent 005507a3a3
commit 4792e0453e
No known key found for this signature in database
GPG key ID: 061981E1E85D3216
3 changed files with 94 additions and 78 deletions

View file

@ -290,6 +290,7 @@ function updateProfilesList(profiles) {
});
})();
serverList.getChildren().add(serverBtn);
if(profile.getOptional() != null) profile.updateOptionalGraph();
index++;
});
LogHelper.debug("Load selected %d profile",settings.profile);

View file

@ -122,13 +122,11 @@ var options = {
{
profile.markOptional(modFile.file);
LogHelper.debug("Selected mod %s", modFile.file);
options.treeToggle(true, modFile.file);
}
else
{
profile.unmarkOptional(modFile.file);
LogHelper.debug("Unselected mod %s", modFile.file);
options.treeToggle(false, modFile.file);
}
options.update();
});
@ -155,73 +153,6 @@ var options = {
});
holder.getChildren().clear();
holder.getChildren().addAll(checkBoxList);
},
treeToggle: function(enable, ImodFile) {
var profile = profilesList[serverHolder.old];
var modInfo = profile.getOptionalFile(ImodFile);
var modList = profile.getOptional();
if(modInfo.subTreeLevel != null) {
if(modInfo.subTreeLevel >= 1){//Отключение core-модификации
var stop = false;
modList.forEach(function(elem, id) {
if(elem != null && elem.subTreeLevel != null) {
if( elem.subTreeLevel > modInfo.subTreeLevel && enable == false && stop == false) {
if(options.modExists(elem.file)){
profile.unmarkOptional(elem.file);
LogHelper.debug("Unselected subMod %s", elem.file);
}
} else if(elem.subTreeLevel <= modInfo.subTreeLevel && stop == false) {
//LogHelper.debug("STOP disable!! " + key);
stop = true;
}
}
});
}
if(modInfo.onlyOne == true){//Включение onlyOne-модификации (Все onlyOne-модификации с той же группой будут отключены. К примеру 2 миникарты)
modList.forEach(function(elem, id) {
if(elem != null && elem.onlyOneGroup != null) {
if(elem.onlyOneGroup == modInfo.onlyOneGroup && elem.onlyOne == true && enable == true && key != ImodFile) {
if(options.modExists(elem.file)) {
profile.unmarkOptional(elem.file);
LogHelper.debug("Unselected Mod (onlyOne toggle) %s", elem.file);
}
options.treeToggle(false, elem.file); //И все его подмодификации канут в Лету..
}
}
});
}
if(modInfo.subTreeLevel > 1){//Включение суб-модификации (Без core суб-моды работать не будут, так что его нужно включать) (Включаем всю ветку зависимости)
var tsl = modInfo.subTreeLevel-1;
modList.forEach(function(elem, id) {
if(elem != null && elem.subTreeLevel != null) {
if(elem.subTreeLevel == tsl && enable == true) {
if(options.modExists(elem)) {
profile.markOptional(elem.file);
LogHelper.debug("Selected coreMod %s", key);
}
options.treeToggle(true, key); //Для срабатывания onlyOne-модификаций.
tsl--;
}
}
});
}
}
},
modExists: function(key){
var profile = profilesList[serverHolder.old];
var list = profile.getOptional();
var result = false;
list.forEach(function(modFile) {
if(modFile.file === key) {
result = true;
}
});
return result;
}
};

View file

@ -104,11 +104,17 @@ public static class OptionalFile {
@LauncherAPI
public String info;
@LauncherAPI
public int sunTreeLevel = 1;
public String[] dependenciesFile;
@LauncherAPI
public boolean onlyOne = false;
public String[] conflictFile;
@LauncherAPI
public int onlyOneGroup = 1;
public transient OptionalFile[] dependencies;
@LauncherAPI
public transient OptionalFile[] conflict;
@LauncherAPI
public int subTreeLevel = 1;
@LauncherAPI
public transient Set<OptionalFile> dependenciesCount;
public OptionalFile(String file, boolean mark) {
this.file = file;
@ -234,6 +240,31 @@ public String getServerAddress() {
public Set<OptionalFile> getOptional() {
return updateOptional;
}
@LauncherAPI
public void updateOptionalGraph()
{
for(OptionalFile file : updateOptional)
{
if(file.dependenciesFile != null)
{
file.dependencies = new OptionalFile[file.dependenciesFile.length];
for(int i=0;i<file.dependenciesFile.length;++i)
{
file.dependencies[i] = getOptionalFile(file.dependenciesFile[i]);
}
}
if(file.conflictFile != null)
{
file.conflict = new OptionalFile[file.conflictFile.length];
for(int i=0;i<file.conflictFile.length;++i)
{
file.conflict[i] = getOptionalFile(file.conflictFile[i]);
}
}
}
}
@LauncherAPI
public OptionalFile getOptionalFile(String file)
{
@ -251,18 +282,71 @@ public Collection<String> getShared() {
public void markOptional(String opt) {
if (!updateOptional.contains(new OptionalFile(opt)))
throw new SecurityException(String.format("Optional mod %s not found in optionalList", opt));
updateOptional.forEach(e -> {
if (e.file.equals(opt)) e.mark = true;
});
OptionalFile file = getOptionalFile(opt);
markOptional(file);
}
@LauncherAPI
public void markOptional(OptionalFile file)
{
if(file.mark) return;
file.mark = true;
if(file.dependencies != null)
{
for(OptionalFile dep : file.dependencies)
{
if(dep.dependenciesCount == null) dep.dependenciesCount = new HashSet<>();
dep.dependenciesCount.add(file);
markOptional(dep);
}
}
if(file.conflict != null)
{
for(OptionalFile conflict : file.conflict)
{
unmarkOptional(conflict);
}
}
}
@LauncherAPI
public void unmarkOptional(String opt) {
if (!updateOptional.contains(new OptionalFile(opt)))
throw new SecurityException(String.format("Optional mod %s not found in optionalList", opt));
updateOptional.forEach(e -> {
if (e.file.equals(opt)) e.mark = false;
});
OptionalFile file = getOptionalFile(opt);
unmarkOptional(file);
}
@LauncherAPI
public void unmarkOptional(OptionalFile file)
{
if(!file.mark) return;
file.mark = false;
if(file.dependenciesCount != null)
{
for(OptionalFile f : file.dependenciesCount)
{
unmarkOptional(f);
}
file.dependenciesCount.clear();
file.dependenciesCount = null;
}
if(file.dependencies != null)
{
for(OptionalFile f : file.dependencies)
{
if(!f.mark) continue;
if(f.dependenciesCount == null)
{
unmarkOptional(f);
}
else if(f.dependenciesCount.size() <= 1)
{
f.dependenciesCount.clear();
f.dependenciesCount = null;
unmarkOptional(f);
}
}
}
}
public void pushOptional(HashedDir dir, boolean digest) throws IOException {