-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
PatchLoader.java
80 lines (71 loc) · 2.63 KB
/
PatchLoader.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package nallar.patched.forge;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.common.collect.ImmutableMultiset;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multiset;
import com.google.common.collect.Multisets;
import com.google.common.collect.Ordering;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.TreeMultimap;
import cpw.mods.fml.common.DuplicateModsFoundException;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.ModContainer;
import nallar.tickthreading.patcher.Declare;
public abstract class PatchLoader extends Loader {
public static boolean isModLoaded(String modname) {
return instance().isModLoadedFast(modname);
}
@Override
@Declare
public boolean isModLoadedFast(String modname) {
return namedMods.containsKey(modname);
}
@Override
protected void identifyDuplicates(List<ModContainer> mods) {
Map<String, List<ModContainer>> modsMap = new HashMap<String, List<ModContainer>>();
for (ModContainer mc : mods) {
String source;
try {
source = mc.getSource().getCanonicalPath() + mc.getModId();
} catch (IOException e) {
source = mc.getSource().getAbsolutePath().replace(File.separator + '.' + File.separator, File.separator) + mc.getModId();
}
List<ModContainer> modsList = modsMap.get(source);
if (modsList == null) {
modsMap.put(source, modsList = new ArrayList<ModContainer>());
}
modsList.add(mc);
}
for (List<ModContainer> modContainers : modsMap.values()) {
if (modContainers.size() > 1) {
modContainers.remove(modContainers.size() - 1);
for (ModContainer modContainer : modContainers) {
mods.remove(modContainer);
}
}
}
TreeMultimap<ModContainer, File> dupsearch = TreeMultimap.create(new ModIdComparator(), Ordering.arbitrary());
for (ModContainer mc : mods) {
if (mc.getSource() != null) {
dupsearch.put(mc, mc.getSource());
}
}
ImmutableMultiset<ModContainer> duplist = Multisets.copyHighestCountFirst(dupsearch.keys());
SetMultimap<ModContainer, File> dupes = LinkedHashMultimap.create();
for (Multiset.Entry<ModContainer> e : duplist.entrySet()) {
if (e.getCount() > 1) {
FMLLog.severe("Found a duplicate mod %s at %s", e.getElement().getModId(), dupsearch.get(e.getElement()));
dupes.putAll(e.getElement(), dupsearch.get(e.getElement()));
}
}
if (!dupes.isEmpty()) {
throw new DuplicateModsFoundException(dupes);
}
}
}