Split off highly version-dependent code from ModCompat

This commit is contained in:
Jonas Herzig
2021-02-22 23:56:22 +01:00
parent 029b228b26
commit 6094422792
6 changed files with 127 additions and 78 deletions

View File

@@ -1,89 +1,12 @@
package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo;
import net.minecraft.util.Identifier;
//#if FABRIC>=1
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.minecraft.util.registry.Registry;
//#else
//#if MC>=11200
//$$ import net.minecraftforge.registries.ForgeRegistry;
//$$ import net.minecraftforge.registries.RegistryManager;
//#else
//$$ import net.minecraftforge.fml.common.registry.GameData;
//$$ import java.util.stream.Stream;
//#endif
//$$
//#if MC>=11400
//$$ import net.minecraftforge.fml.ModList;
//#else
//$$ import net.minecraftforge.fml.common.Loader;
//$$ import net.minecraftforge.fml.common.ModContainer;
//#endif
//#endif
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ModCompat {
@SuppressWarnings("unchecked")
public static Collection<ModInfo> getInstalledNetworkMods() {
//#if MC>=11400
//#if FABRIC>=1
Map<String, ModInfo> modInfoMap = FabricLoader.getInstance().getAllMods().stream()
.map(ModContainer::getMetadata)
.map(m -> new ModInfo(m.getId(), m.getName(), m.getVersion().toString()))
.collect(Collectors.toMap(ModInfo::getId, Function.identity()));
return Registry.REGISTRIES.stream()
.map(Registry::getIds).flatMap(Set::stream)
//#else
//$$ Map<String, ModInfo> modInfoMap = ModList.get().getMods().stream()
//$$ .map(m -> new ModInfo(m.getModId(), m.getDisplayName(), m.getVersion().toString()))
//$$ .collect(Collectors.toMap(ModInfo::getId, Function.identity()));
//$$ return RegistryManager.ACTIVE.takeSnapshot(false).keySet().stream()
//$$ .map(RegistryManager.ACTIVE::getRegistry)
//$$ .map(ForgeRegistry::getKeys).flatMap(Set::stream)
//#endif
.map(Identifier::getNamespace).filter(s -> !s.equals("minecraft")).distinct()
.map(modInfoMap::get).filter(Objects::nonNull)
.collect(Collectors.toList());
//#else
//$$ Map<String, ModContainer> ignoreCaseMap = Loader.instance().getModList().stream()
//$$ .collect(Collectors.toMap(m -> m.getModId().toLowerCase(), Function.identity()));
//#if MC>=11200
//$$ return RegistryManager.ACTIVE.takeSnapshot(false).keySet().stream()
//$$ .map(RegistryManager.ACTIVE::getRegistry)
//$$ .map(ForgeRegistry::getKeys).flatMap(Set::stream)
//$$ .map(ResourceLocation::getResourceDomain).filter(s -> !s.equals("minecraft")).distinct()
//$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null)
//$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
//$$ .collect(Collectors.toList());
//#else
//#if MC>=10800
//$$ return Stream.concat(
//$$ ((Set<ResourceLocation>) GameData.getBlockRegistry().getKeys()).stream(),
//$$ ((Set<ResourceLocation>) GameData.getItemRegistry().getKeys()).stream()
//$$ ).map(ResourceLocation::getResourceDomain).filter(s -> !s.equals("minecraft")).distinct()
//$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null)
//$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
//$$ .collect(Collectors.toList());
//#else
//$$ return Stream.concat(
//$$ ((Set<String>) GameData.getBlockRegistry().getKeys()).stream(),
//$$ ((Set<String>) GameData.getItemRegistry().getKeys()).stream()
//$$ ).map(name -> {
//$$ if (!name.contains(":")) return null; // Still using old names without namespace, can't do anything, ignore
//$$ return name.split(":", 2)[0];
//$$ }).filter(s -> !s.equals("minecraft")).distinct()
//$$ .map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null)
//$$ .map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
//$$ .collect(Collectors.toList());
//#endif
//#endif
//#endif
return ModInfoGetter.getInstalledNetworkMods();
}
public static final class ModInfoDifference {

View File

@@ -0,0 +1,25 @@
package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo;
import net.minecraft.util.Identifier;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.minecraft.util.registry.Registry;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
class ModInfoGetter {
static Collection<ModInfo> getInstalledNetworkMods() {
Map<String, ModInfo> modInfoMap = FabricLoader.getInstance().getAllMods().stream()
.map(ModContainer::getMetadata)
.map(m -> new ModInfo(m.getId(), m.getName(), m.getVersion().toString()))
.collect(Collectors.toMap(ModInfo::getId, Function.identity()));
return Registry.REGISTRIES.stream()
.map(Registry::getIds).flatMap(Set::stream)
.map(Identifier::getNamespace).filter(s -> !s.equals("minecraft")).distinct()
.map(modInfoMap::get).filter(Objects::nonNull)
.collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,29 @@
package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
import net.minecraftforge.fml.common.registry.GameData;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class ModInfoGetter {
static Collection<ModInfo> getInstalledNetworkMods() {
Map<String, ModContainer> ignoreCaseMap = Loader.instance().getModList().stream()
.collect(Collectors.toMap(m -> m.getModId().toLowerCase(), Function.identity()));
return Stream.concat(
((Set<ResourceLocation>) GameData.getBlockRegistry().getKeys()).stream(),
((Set<ResourceLocation>) GameData.getItemRegistry().getKeys()).stream()
).map(ResourceLocation::getResourceDomain).filter(s -> !s.equals("minecraft")).distinct()
.map(String::toLowerCase).map(ignoreCaseMap::get).filter(Objects::nonNull)
.map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
.collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,29 @@
package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
import net.minecraftforge.registries.ForgeRegistry;
import net.minecraftforge.registries.RegistryManager;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
class ModInfoGetter {
static Collection<ModInfo> getInstalledNetworkMods() {
Map<String, ModContainer> ignoreCaseMap = Loader.instance().getModList().stream()
.collect(Collectors.toMap(m -> m.getModId().toLowerCase(), Function.identity()));
return RegistryManager.ACTIVE.takeSnapshot(false).keySet().stream()
.map(RegistryManager.ACTIVE::getRegistry)
.map(ForgeRegistry::getKeys).flatMap(Set::stream)
.map(ResourceLocation::getResourceDomain).filter(s -> !s.equals("minecraft")).distinct()
.map(String::toLowerCase).map(ignoreCaseMap::get).filter(Objects::nonNull)
.map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
.collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,11 @@
package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo;
import java.util.Collection;
class ModInfoGetter {
static Collection<ModInfo> getInstalledNetworkMods() {
throw new UnsupportedOperationException();
}
}

View File

@@ -0,0 +1,32 @@
package com.replaymod.core.utils;
import com.replaymod.replaystudio.data.ModInfo;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.ModContainer;
import cpw.mods.fml.common.registry.GameData;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class ModInfoGetter {
static Collection<ModInfo> getInstalledNetworkMods() {
Map<String, ModContainer> ignoreCaseMap = Loader.instance().getModList().stream()
.collect(Collectors.toMap(m -> m.getModId().toLowerCase(), Function.identity()));
return Stream.concat(
((Set<String>) GameData.getBlockRegistry().getKeys()).stream(),
((Set<String>) GameData.getItemRegistry().getKeys()).stream()
).map(name -> {
if (!name.contains(":")) return null; // Still using old names without namespace, can't do anything, ignore
return name.split(":", 2)[0];
}).filter(Objects::nonNull)
.filter(s -> !s.equals("minecraft")).distinct()
.map(String::toLowerCase).map(ignoreCaseMap::get).filter(Objects::nonNull)
.map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
.collect(Collectors.toList());
}
}