Compare commits

...

3 commits

Author SHA1 Message Date
Sevastjan
d4ca612bff
[FEATURE] Фикс зависимостей и возможность взаимоисключения для опциональных модов (#663)
* [FEATURE] Mutually exclusive optional mods (XOR logic)

* [FIX] Bug with missing forgotten dependency/conflict

* [FIX] ArrayIndexOutOfBoundsException if xorConfict is empty

* [STYLE] Rename "xorConflict" to "group"
2023-07-21 21:11:48 +07:00
microwin7
680244e5d1
[FIX] Should no longer go into debugging ServerPinger (#669) 2023-07-21 21:09:05 +07:00
microwin7
2f7b94365a
[FIX] Proguard mapping letter L (#670) 2023-07-21 21:08:45 +07:00
5 changed files with 58 additions and 2 deletions

View file

@ -174,7 +174,7 @@ public static class ProguardConf {
"-libraryjars '<java.home>/lib/ext/nashorn.jar'",
"-libraryjars '<java.home>/lib/ext/jfxrt.jar'"
};
private static final char[] chars = "1aAbBcC2dDeEfF3gGhHiI4jJkKl5mMnNoO6pPqQrR7sStT8uUvV9wWxX0yYzZ".toCharArray();
private static final char[] chars = "1aAbBcC2dDeEfF3gGhHiI4jJkKlL5mMnNoO6pPqQrR7sStT8uUvV9wWxX0yYzZ".toCharArray();
public final Path proguard;
public final Path config;
public final Path mappings;

View file

@ -158,7 +158,7 @@ private Result modernPing(HInput input, HOutput output, int protocol) throws IOE
if (statusPacketID != 0x0)
throw new IOException("Illegal status packet ID: " + statusPacketID);
response = packetInput.readString(PACKET_LENGTH);
LogHelper.debug("Ping response (modern): '%s'", response);
LogHelper.dev("Ping response (modern): '%s'", response);
}
// Parse JSON response

View file

@ -254,6 +254,12 @@ public void updateOptionalGraph() {
file.conflict[i] = getOptionalFile(file.conflictFile[i].name);
}
}
if(file.groupFile != null) {
file.group = new OptionalFile[file.groupFile.length];
for(int i = 0; i < file.groupFile.length; ++i) {
file.group[i] = getOptionalFile(file.groupFile[i].name);
}
}
}
}
@ -369,6 +375,11 @@ public void verify() {
if (s == null)
throw new IllegalArgumentException(String.format("Found null entry in updateOptional.%s.dependenciesFile", f.name));
}
if(f.groupFile != null)
for (OptionalDepend s : f.groupFile) {
if (s == null)
throw new IllegalArgumentException(String.format("Found null entry in updateOptional.%s.groupFile", f.name));
}
if (f.triggersList != null) {
for (OptionalTrigger trigger : f.triggersList) {
if (trigger == null)

View file

@ -24,10 +24,14 @@ public class OptionalFile {
@LauncherNetworkAPI
public OptionalDepend[] conflictFile;
@LauncherNetworkAPI
public OptionalDepend[] groupFile;
@LauncherNetworkAPI
public transient OptionalFile[] dependencies;
@LauncherNetworkAPI
public transient OptionalFile[] conflict;
@LauncherNetworkAPI
public transient OptionalFile[] group;
@LauncherNetworkAPI
public int subTreeLevel = 1;
@LauncherNetworkAPI
public boolean isPreset;

View file

@ -7,7 +7,9 @@
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Arrays;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
public class OptionalView {
public Set<OptionalFile> enabled = new HashSet<>();
@ -25,6 +27,7 @@ public OptionalView(OptionalView view) {
this.enabled = new HashSet<>(view.enabled);
this.installInfo = new HashMap<>(view.installInfo);
this.all = view.all;
fixDependencies();
}
public OptionalView(ClientProfile profile, OptionalView old) {
@ -40,6 +43,7 @@ public OptionalView(ClientProfile profile, OptionalView old) {
disable(newFile, (file, status) -> {});
}
}
fixDependencies();
}
@SuppressWarnings("unchecked")
@ -80,6 +84,33 @@ public Set<OptionalAction> getEnabledActions() {
return results;
}
//Needed if dependency/conflict was added after mod declaring it and clients have their profiles with this mod enabled
public void fixDependencies() {
Set<OptionalFile> disabled = all.stream().filter(t -> !isEnabled(t)).collect(Collectors.toSet());
for (OptionalFile file : disabled) {
if (file.group != null && Arrays.stream(file.group).noneMatch(this::isEnabled)) {
enable(file.group[0], false, null);
}
}
for (OptionalFile file : enabled) {
if (file.dependencies != null) {
for (OptionalFile dep : file.dependencies) {
enable(dep, false, null);
}
}
if (file.conflict != null) {
for (OptionalFile conflict : file.conflict) {
disable(conflict, null);
}
}
if (file.group != null) {
for (OptionalFile member : file.group) {
disable(member, null);
}
}
}
}
public Set<OptionalAction> getDisabledActions() {
Set<OptionalAction> results = new HashSet<>();
for (OptionalFile e : all) {
@ -111,6 +142,11 @@ public void enable(OptionalFile file, boolean manual, BiConsumer<OptionalFile, B
disable(conflict, callback);
}
}
if(file.group != null) {
for(OptionalFile member : file.group) {
disable(member, callback);
}
}
}
public void disable(OptionalFile file, BiConsumer<OptionalFile, Boolean> callback) {
@ -129,6 +165,11 @@ public void disable(OptionalFile file, BiConsumer<OptionalFile, Boolean> callbac
}
}
}
if (file.group != null && file.group.length != 0) {
if (Arrays.stream(file.group).noneMatch(this::isEnabled)) {
enable(file.group[0], false, callback);
}
}
}
private boolean contains(OptionalFile file, OptionalFile[] array) {