Compare commits

..

1 commit

Author SHA1 Message Date
ENDERZOMBI102 6eeade90b0 fix(semver): Minecraft 1.20 crashing the semver parser
Minecraft doesn't use semver, and as such, sometimes it can cause problems, like in this case: `1.20` is not a valid semver version, but we must deal with it anyway, we've made the `<patch>` component optional, defaulting it to `0` if missing
2024-07-06 01:26:46 +02:00
8 changed files with 18 additions and 35 deletions

View file

@ -19,8 +19,7 @@ jobs:
- name: Check Gradle Setup
run: |
chmod +x ./gradlew
cat ./settings.gradle.kts | sed "s/^.*:minecraft.*$//g" > settings.gradle.kts1
mv settings.gradle.kts1 settings.gradle.kts
cat ./settings.gradle.kts | sed "s/^.*:minecraft.*$//g" > settings.gradle.kts
- name: Build
run: |
./gradlew :publishMavenJavaPublicationToFrogMCSnapshotsMavenRepository \

View file

@ -3,11 +3,11 @@ plugins {
`java-library`
id("io.freefair.lombok") version "8.+"
`maven-publish`
id("dev.frogmc.meta-update") version "0.0.1-alpha.7"
id("dev.frogmc.meta-update") version "0.0.1-alpha.3"
}
group = "dev.frogmc"
version = "0.0.1-alpha.14"
version = "0.0.1-alpha.2"
repositories {
maven {
@ -24,17 +24,14 @@ repositories {
}
dependencies {
implementation(libs.thyroxine)
implementation(libs.thyroxine){
isTransitive = false
}
compileOnly("org.apache.logging.log4j:log4j-slf4j2-impl:2.22.1")
compileOnly("org.apache.logging.log4j:log4j-api:2.22.1")
compileOnly("org.apache.logging.log4j:log4j-core:2.22.1")
compileOnly("com.google.code.gson:gson:2.0")
compileOnly("com.google.guava:guava:21.0") // Lowest possible version for our code
api(libs.mixin) {
exclude(group = "com.google.code.gson")
exclude(group = "com.google.guava")
}
api(libs.mixin)
api(libs.mixinextras)
api(libs.nightconfig)
api(libs.annotations)

View file

@ -1,7 +1,7 @@
[versions]
thyroxine = "0.0.1-alpha.6"
nightconfig = "3.7.3"
thyroxine = "0.0.1-alpha.3"
nightconfig = "3.7.2"
mixin = "0.14.0+mixin.0.8.6"
annotations = "24.1.0"
mixinextras = "0.3.6"

View file

@ -1,6 +1,6 @@
plugins {
java
id("dev.frogmc.phytotelma") version "0.0.1-alpha.15"
id("dev.frogmc.phytotelma") version "0.0.1-alpha.10"
}
repositories {
@ -20,9 +20,7 @@ dependencies {
}
phytotelma {
minecraft {
version = "1.21"
}
minecraft("1.21", "1.20.6")
}
java {

View file

@ -148,7 +148,7 @@ public class FrogLoaderImpl implements FrogLoader {
@Override
public Optional<ModProperties> getModProperties(String id) {
return mods.values().stream().map(m -> m.get(id)).filter(Objects::nonNull).findFirst();
return mods.values().stream().flatMap(m -> m.values().stream()).filter(m -> m.id().equals(id)).findFirst();
}
private Collection<String> collectModIds() {

View file

@ -1,9 +1,7 @@
package dev.frogmc.frogloader.impl;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.stream.Stream;
import dev.frogmc.frogloader.api.FrogLoader;
import dev.frogmc.frogloader.api.mod.ModProperties;
@ -26,7 +24,7 @@ public class PluginLoader {
List<ModProvider> providers = new ArrayList<>(ServiceLoader.load(ModProvider.class).stream().map(ServiceLoader.Provider::get).toList()); // we need mutability & random access
Map<String, Collection<ModProperties>> properties = new HashMap<>();
int[] size = new int[]{providers.size()}; // use a separate size variable to not have to iterate over the list over and over again
int[] size = new int[providers.size()]; // use a separate size variable to not have to iterate over the list over and over again
for (int i = 0; i < size[0]; i++) {
ModProvider plugin = providers.get(i); // use random access to work around concurrent access (through modifications during iteration)
LOGGER.debug("Found mod provider: {}", plugin.getClass().getName());
@ -35,7 +33,6 @@ public class PluginLoader {
}
try {
LOGGER.debug("Initialising mod provider: {}", plugin.id());
Files.createDirectories(gameDir.resolve(plugin.loadDirectory()));
Collection<ModProperties> loadedMods = plugin.loadMods(Discovery.find(gameDir.resolve(plugin.loadDirectory()),
plugin::isDirectoryApplicable,
plugin::isFileApplicable),
@ -50,14 +47,12 @@ public class PluginLoader {
providers.add(provider);
size[0]++;
}));
modProviders.add(plugin);
} catch (Throwable e) {
LOGGER.error("Error during plugin initialisation: ", e);
}
}
Collection<ModProperties> flattened = Stream.concat(properties.values().stream().flatMap(Collection::stream),
mods.values().stream().map(Map::values).flatMap(Collection::stream)).toList();
Collection<ModProperties> flattened = properties.values().stream().flatMap(Collection::stream).toList();
try {
Collection<ModProperties> solved = new ModDependencyResolver(flattened).solve();
properties.forEach((s, c) -> c.retainAll(solved));
@ -66,6 +61,7 @@ public class PluginLoader {
c.forEach(p -> map.put(p.id(), p));
});
modIds.addAll(solved.stream().map(ModProperties::id).toList());
modProviders.addAll(providers);
} catch (ModDependencyResolver.UnfulfilledDependencyException e) {
LoaderGui.execUnfulfilledDep(CrashReportGenerator.writeReport(e, flattened), e, false);
} catch (ModDependencyResolver.BreakingModException e) {

View file

@ -35,7 +35,7 @@ public class UnfulfilledDepPage extends JScrollPane {
} else {
description.append("a Mod with id ").append(entry.dependency());
}
description.append(" with a version matching range:\n").append(entry.range().toString(" or ")).append("\nNo matching version is currently available.");
description.append(" with a version matching range:\n").append(entry.range().toString(" or ")).append("\nNo version is currently available.");
}
description.append("\nSuggested Solution: Install ")
.append(

View file

@ -15,14 +15,7 @@ public class ModUtil {
return "No mods loaded.";
}
Map<String, ModProperties> modIdMap = new HashMap<>();
for (ModProperties p : mods) {
if (!modIdMap.containsKey(p.id()) || modIdMap.get(p.id()).version().compareTo(p.version()) < 0) {
modIdMap.put(p.id(), p);
}
}
Map<String, ModProperties> modIdMap = mods.stream().collect(Collectors.toMap(ModProperties::id, m -> m));
AtomicInteger indent = new AtomicInteger(1);
Map<ModProperties, Collection<String>> parentToChildIdMap = getParentMods(mods);
Collection<String> containedIds = parentToChildIdMap.values().stream().flatMap(Collection::stream).collect(Collectors.toUnmodifiableSet());