├── .classpath
├── .gitignore
├── .project
├── LICENSE
├── Libraries
├── fluent-hc-4.5.7.jar
├── httpclient-4.5.7.jar
├── httpcore-4.4.11.jar
├── jackson-annotations-2.9.8.jar
├── jackson-core-2.9.8.jar
├── jackson-databind-2.9.8.jar
├── jna-4.5.2.jar
└── jna-platform-4.5.2.jar
├── README.md
├── data
├── tankmaster_coalesce
│ ├── Gammtek.Conduit.CommandLine.dll
│ ├── Gammtek.Conduit.Core.dll
│ ├── Gammtek.Conduit.MassEffect3.dll
│ ├── Gammtek.Conduit.UnrealEngine3.dll
│ └── MassEffect3.Coalesce.exe
└── tankmaster_tlk
│ ├── Gammtek.Conduit.CommandLine.dll
│ ├── Gammtek.Conduit.Core.dll
│ ├── Gammtek.Conduit.MassEffect3.dll
│ ├── Gammtek.Conduit.UnrealEngine3.dll
│ ├── MassEffect3.TlkEditor.exe
│ ├── MassEffect3.TlkEditor.exe.config
│ ├── Microsoft.WindowsAPICodePack.Shell.dll
│ └── Microsoft.WindowsAPICodePack.dll
├── dlcpatcher
├── BalanceChangesReplacer.asi
├── binkw23.dll
├── binkw32_asi.dll
├── me3logger_truncating.asi
└── zlib1.dll
├── libraries
├── commons-io-2.5-javadoc.jar
├── commons-io-2.5.jar
├── commons-lang3-3.6-javadoc.jar
├── commons-lang3-3.6.jar
├── commons-logging-1.2.jar
├── commons-validator-1.6.jar
├── derby.jar
├── filedrop.jar
├── ini4j-0.5.2.jar
├── jsch-0.1.54.jar
├── json-simple-1.1.1.jar
├── sevenzipjbinding-Windows-amd64.jar
├── sevenzipjbinding.jar
└── swingx-all-1.6.5-1.jar
├── licenses
├── 7zip.txt
├── Apache libraries.txt
├── ME3Explorer.txt
├── binkw32_asi.txt
└── zlib.txt
├── modmanager3.iml
├── src
├── com
│ └── me3tweaks
│ │ └── modmanager
│ │ ├── ALOTInstallerUpdaterWindow.java
│ │ ├── ASIModWindow.java
│ │ ├── AboutWindow2.java
│ │ ├── AutoTocWindow.java
│ │ ├── BackupWindow.java
│ │ ├── CoalescedWindow.java
│ │ ├── CommandLineToolsUpdaterWindow.java
│ │ ├── CompressionOptionsWindow.java
│ │ ├── CustomDLCConflictWindow.java
│ │ ├── CustomDLCWindow.java
│ │ ├── DeltaWindow.java
│ │ ├── FailedModsWindow.java
│ │ ├── FileDropWindow.java
│ │ ├── ImportEntryWindow.java
│ │ ├── KeybindsInjectionWindow.java
│ │ ├── LogOptionsWindow.java
│ │ ├── LogWindow.java
│ │ ├── ME3ExplorerUpdaterWindow.java
│ │ ├── ME3TweaksUpdaterServiceWindow.java
│ │ ├── ModGroupCreatorWindow.java
│ │ ├── ModGroupWindow.java
│ │ ├── ModImportArchiveWindow.java
│ │ ├── ModImportDLCWindow.java
│ │ ├── ModInfoEditorWindow.java
│ │ ├── ModInstallWindow.java
│ │ ├── ModManager.java
│ │ ├── ModManagerWindow.java
│ │ ├── MountFileEditorWindow.java
│ │ ├── NetFrameworkMissingWindow.java
│ │ ├── OfficialDLCWindow.java
│ │ ├── OptionsWindow.java
│ │ ├── PCCDataDumperWindow.java
│ │ ├── PatchApplicationWindow.java
│ │ ├── PatchLibraryWindow.java
│ │ ├── RestoreFilesWindow.java
│ │ ├── SelectiveRestoreWindow.java
│ │ ├── StarterKitWindow.java
│ │ ├── TLKTool.java
│ │ ├── UnpackWindow.java
│ │ ├── UpdateAvailableWindow.java
│ │ ├── UpdateJREAvailableWindow.java
│ │ ├── VanillaBackupWindow.java
│ │ ├── help
│ │ ├── HelpItemPackage.java
│ │ ├── HelpMenu.java
│ │ └── ResourceWindowHelpModal.java
│ │ ├── moddesceditor
│ │ ├── MDEConditionalDLCItem.java
│ │ ├── MDEConditionalFileItem.java
│ │ ├── MDECustomDLC.java
│ │ ├── MDEModFileChooser.java
│ │ ├── MDEModFolderChooser.java
│ │ ├── MDEOfficialJob.java
│ │ ├── MDEOfficialJobConditionalFileItem.java
│ │ ├── MDEOfficialJobNewFile.java
│ │ ├── MDEOfficialTaskSelector.java
│ │ ├── MDEOutdatedCustomDLC.java
│ │ ├── ModDescEditorDirectoryChooser.java
│ │ └── ModDescEditorWindow.java
│ │ ├── modmaker
│ │ ├── DynamicPatch.java
│ │ ├── ME3TweaksUtils.java
│ │ ├── ModMakerCompilerWindow.java
│ │ ├── ModMakerEntryWindow.java
│ │ └── TLKFragment.java
│ │ ├── modupdater
│ │ ├── AllModsUpdateWindow.java
│ │ ├── ManifestModFile.java
│ │ ├── ModUpdateWindow.java
│ │ ├── ModXMLTools.java
│ │ └── UpdatePackage.java
│ │ ├── objects
│ │ ├── ASIMod.java
│ │ ├── ASIUpdateGroup.java
│ │ ├── AlternateCustomDLC.java
│ │ ├── AlternateFile.java
│ │ ├── CompressedMod.java
│ │ ├── CustomDLC.java
│ │ ├── HelpMenuItem.java
│ │ ├── InstalledASIMod.java
│ │ ├── ME3TweaksPatchPackage.java
│ │ ├── MainUIBackgroundJob.java
│ │ ├── MergeModFile.java
│ │ ├── MetaCMM.java
│ │ ├── Mod.java
│ │ ├── ModDelta.java
│ │ ├── ModGroup.java
│ │ ├── ModJob.java
│ │ ├── ModList.java
│ │ ├── ModTypeConstants.java
│ │ ├── ModuleDelta.java
│ │ ├── MountFile.java
│ │ ├── MountFlag.java
│ │ ├── PCCDumpOptions.java
│ │ ├── Patch.java
│ │ ├── PatchModBundle.java
│ │ ├── ProcessResult.java
│ │ ├── RestoreMode.java
│ │ ├── ThirdPartyImportingInfo.java
│ │ ├── ThirdPartyModInfo.java
│ │ ├── ThreadCommand.java
│ │ └── TocBatchDescriptor.java
│ │ ├── repairdb
│ │ ├── BasegameHashDB.java
│ │ └── RepairFileInfo.java
│ │ ├── testing
│ │ └── Testing.java
│ │ ├── ui
│ │ ├── ASIActionColumn.java
│ │ ├── AboutWindow2Controller.java
│ │ ├── ButtonColumn.java
│ │ ├── CheckBoxLabel.java
│ │ ├── CompressedModCellRenderer.java
│ │ ├── ConflictResolutionRadioButton.java
│ │ ├── CustomDLCManagerTableCellRenderer.java
│ │ ├── CustomDLCManagerToggleButtonColumn.java
│ │ ├── HintTextAreaUI.java
│ │ ├── HintTextFieldUI.java
│ │ ├── ModCellRenderer.java
│ │ ├── MountFlagCellRenderer.java
│ │ ├── MultiLineTableCell.java
│ │ ├── NumReqButtonColumn.java
│ │ ├── SFARColumn.java
│ │ ├── SelectiveRestoreTableCellRenderer.java
│ │ ├── StayOpenJCheckboxMenuItem.java
│ │ ├── SwingLink.java
│ │ └── aboutwindow.fxml
│ │ ├── utilities
│ │ ├── ByteArrayInOutStream.java
│ │ ├── DebugLogger.java
│ │ ├── EXEFileInfo.java
│ │ ├── MD5Checksum.java
│ │ ├── NexusModsAPI.java
│ │ ├── ResourceUtils.java
│ │ ├── SevenZipCompressedModInspector.java
│ │ ├── Version.java
│ │ ├── datatypeconverter
│ │ │ ├── DatatypeConverter.java
│ │ │ ├── DatatypeConverterImpl.java
│ │ │ ├── DatatypeConverterInterface.java
│ │ │ ├── Messages.java
│ │ │ └── WhiteSpaceProcessor.java
│ │ └── nexusmods
│ │ │ ├── NexusModsFileInfo.java
│ │ │ └── NexusModsMod.java
│ │ └── valueparsers
│ │ ├── ValueParserLib.java
│ │ ├── ammopower
│ │ └── AmmoPowerGUI.java
│ │ ├── bioai
│ │ ├── BioAIGUI.java
│ │ └── Range.java
│ │ ├── biodifficulty
│ │ ├── Category.java
│ │ ├── DifficultyGUI.java
│ │ ├── Stat.java
│ │ └── StatRange.java
│ │ ├── bioweapon
│ │ ├── BioWeaponGUI.java
│ │ ├── HTMLGenerator.java
│ │ ├── HTMLParams.java
│ │ └── Range.java
│ │ ├── consumable
│ │ └── ConsumableGUI.java
│ │ ├── enemytype
│ │ └── EnemyType.java
│ │ ├── id
│ │ └── ID.java
│ │ ├── mpstorepack
│ │ ├── Card.java
│ │ ├── CardParser.java
│ │ ├── CardPool.java
│ │ ├── PackMetadata.java
│ │ ├── PackSlot.java
│ │ ├── PoolCard.java
│ │ ├── RealCard.java
│ │ ├── SlotPool.java
│ │ ├── StorePack.java
│ │ └── WeightWrapper.java
│ │ ├── possessionwaves
│ │ ├── Difficulty.java
│ │ ├── PossessionWavesGUI.java
│ │ └── Waves.java
│ │ ├── powercustomaction
│ │ ├── BaseRankUpgrade.java
│ │ ├── ContainerRow.java
│ │ ├── DetonationParameters.java
│ │ ├── Power.java
│ │ ├── PowerCustomActionGUI.java
│ │ ├── PowerCustomActionGUI2.java
│ │ ├── PowerVariable.java
│ │ └── VariableRow.java
│ │ ├── sharedassignment
│ │ └── SharedDifficulty.java
│ │ ├── waveclass
│ │ └── WaveClass.java
│ │ └── wavelist
│ │ ├── Enemy.java
│ │ ├── Wave.java
│ │ └── WavelistGUI.java
└── resource
│ ├── icon128.png
│ ├── icon32.png
│ ├── icon64.png
│ ├── me3tweaks.png
│ ├── modmaker.png
│ └── network.gif
└── starterkit
├── Default.sfar
├── Default_DLC_MOD_StarterKit.bin
├── Mount.dlc
└── StarterKitTLK.xml
/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
13 | * The ByteArrayInputStream can be retrieved using Slots in a store pack draw from a list of pools. Each slot can have independent pools from each other. If this pool is chosen by a pack, it will automatically choose the backup pool instead. Slots in a store pack draw from a list of pools. Each slot can have independent pools from each other. CONTAINERDESCRIPTION Detonation parameters determine what gets hit when TABLENAME detonate.getInputStream()
.
14 | *
15 | * @author Nick Russler
16 | */
17 | public class ByteArrayInOutStream extends ByteArrayOutputStream {
18 | /**
19 | * Creates a new ByteArrayInOutStream. The buffer capacity is initially 32
20 | * bytes, though its size increases if necessary.
21 | */
22 | public ByteArrayInOutStream() {
23 | super();
24 | }
25 |
26 | /**
27 | * Creates a new ByteArrayInOutStream, with a buffer capacity of the
28 | * specified size, in bytes.
29 | *
30 | * @param size
31 | * the initial size.
32 | * @exception IllegalArgumentException
33 | * if size is negative.
34 | */
35 | public ByteArrayInOutStream(int size) {
36 | super(size);
37 | }
38 |
39 | /**
40 | * Creates a new ByteArrayInputStream that uses the internal byte array
41 | * buffer of this ByteArrayInOutStream instance as its buffer array. The
42 | * initial value of pos is set to zero and the initial value of count is the
43 | * number of bytes that can be read from the byte array. The buffer array is
44 | * not copied. This instance of ByteArrayInOutStream can not be used anymore
45 | * after calling this method.
46 | *
47 | * @return the ByteArrayInputStream instance
48 | */
49 | public ByteArrayInputStream getInputStream() {
50 | // create new ByteArrayInputStream that respects the current count
51 | ByteArrayInputStream in = new ByteArrayInputStream(this.buf, 0, this.count);
52 |
53 | // set the buffer of the ByteArrayOutputStream
54 | // to null so it can't be altered anymore
55 | this.buf = null;
56 |
57 | return in;
58 | }
59 | }
--------------------------------------------------------------------------------
/src/com/me3tweaks/modmanager/utilities/EXEFileInfo.java:
--------------------------------------------------------------------------------
1 | package com.me3tweaks.modmanager.utilities;
2 |
3 | import com.sun.jna.Memory;
4 | import com.sun.jna.Pointer;
5 | import com.sun.jna.platform.win32.VerRsrc.VS_FIXEDFILEINFO;
6 | import com.sun.jna.ptr.IntByReference;
7 | import com.sun.jna.ptr.PointerByReference;
8 |
9 | public class EXEFileInfo {
10 | public static int MAJOR = 0;
11 | public static int MINOR = 1;
12 | public static int BUILD = 2;
13 | public static int REVISION = 3;
14 |
15 | public static int getMajorVersionOfProgram(String path) {
16 | return getVersionInfo(path)[MAJOR];
17 | }
18 |
19 | public static int getMinorVersionOfProgram(String path) {
20 | return getVersionInfo(path)[MINOR];
21 | }
22 |
23 | public static int getBuildOfProgram(String path) {
24 | return getVersionInfo(path)[BUILD];
25 | }
26 |
27 | public static int getRevisionOfProgram(String path) {
28 | return getVersionInfo(path)[REVISION];
29 | }
30 |
31 | public static int[] getVersionInfo(String path) {
32 | IntByReference dwDummy = new IntByReference();
33 | dwDummy.setValue(0);
34 |
35 | int versionlength = com.sun.jna.platform.win32.Version.INSTANCE.GetFileVersionInfoSize(path, dwDummy);
36 |
37 | byte[] bufferarray = new byte[versionlength];
38 | Pointer lpData = new Memory(bufferarray.length);
39 | PointerByReference lplpBuffer = new PointerByReference();
40 | IntByReference puLen = new IntByReference();
41 | boolean fileInfoResult = com.sun.jna.platform.win32.Version.INSTANCE.GetFileVersionInfo(path, 0, versionlength, lpData);
42 | boolean verQueryVal = com.sun.jna.platform.win32.Version.INSTANCE.VerQueryValue(lpData, "\\", lplpBuffer, puLen);
43 |
44 | VS_FIXEDFILEINFO lplpBufStructure = new VS_FIXEDFILEINFO(lplpBuffer.getValue());
45 | lplpBufStructure.read();
46 |
47 | int v1 = (lplpBufStructure.dwFileVersionMS).intValue() >> 16;
48 | int v2 = (lplpBufStructure.dwFileVersionMS).intValue() & 0xffff;
49 | int v3 = (lplpBufStructure.dwFileVersionLS).intValue() >> 16;
50 | int v4 = (lplpBufStructure.dwFileVersionLS).intValue() & 0xffff;
51 | return new int[] { v1, v2, v3, v4 };
52 | }
53 |
54 | public static Version getVersion(String path) {
55 | IntByReference dwDummy = new IntByReference();
56 | dwDummy.setValue(0);
57 |
58 | int versionlength = com.sun.jna.platform.win32.Version.INSTANCE.GetFileVersionInfoSize(path, dwDummy);
59 |
60 | byte[] bufferarray = new byte[versionlength];
61 | Pointer lpData = new Memory(bufferarray.length);
62 | PointerByReference lplpBuffer = new PointerByReference();
63 | IntByReference puLen = new IntByReference();
64 | boolean fileInfoResult = com.sun.jna.platform.win32.Version.INSTANCE.GetFileVersionInfo(path, 0, versionlength, lpData);
65 | boolean verQueryVal = com.sun.jna.platform.win32.Version.INSTANCE.VerQueryValue(lpData, "\\", lplpBuffer, puLen);
66 |
67 | VS_FIXEDFILEINFO lplpBufStructure = new VS_FIXEDFILEINFO(lplpBuffer.getValue());
68 | lplpBufStructure.read();
69 |
70 | int v1 = (lplpBufStructure.dwFileVersionMS).intValue() >> 16;
71 | int v2 = (lplpBufStructure.dwFileVersionMS).intValue() & 0xffff;
72 | int v3 = (lplpBufStructure.dwFileVersionLS).intValue() >> 16;
73 | int v4 = (lplpBufStructure.dwFileVersionLS).intValue() & 0xffff;
74 | return new Version(v1 + "." + v2 + "." + v3 + "." + v4);
75 | }
76 |
77 | /**
78 | * Compares two version strings.
79 | *
80 | * Use this instead of String.compareTo() for a non-lexicographical
81 | * comparison that works for version strings. e.g. "1.10".compareTo("1.6").
82 | *
83 | * @note It does not work if "1.10" is supposed to be equal to "1.10.0".
84 | *
85 | * @param str1
86 | * a string of ordinal numbers separated by decimal points.
87 | * @param str2
88 | * a string of ordinal numbers separated by decimal points.
89 | * @return The result is a negative integer if str1 is _numerically_ less
90 | * than str2. The result is a positive integer if str1 is
91 | * _numerically_ greater than str2. The result is zero if the
92 | * strings are _numerically_ equal.
93 | */
94 | public static int versionCompare(String str1, String str2) {
95 | String[] vals1 = str1.split("\\.");
96 | String[] vals2 = str2.split("\\.");
97 | int i = 0;
98 | // set index to first non-equal ordinal or length of shortest version string
99 | while (i < vals1.length && i < vals2.length && vals1[i].equals(vals2[i])) {
100 | i++;
101 | }
102 | // compare first non-equal ordinal number
103 | if (i < vals1.length && i < vals2.length) {
104 | int diff = Integer.valueOf(vals1[i]).compareTo(Integer.valueOf(vals2[i]));
105 | return Integer.signum(diff);
106 | }
107 | // the strings are equal or one string is a substring of the other
108 | // e.g. "1.2.3" = "1.2.3" or "1.2.3" < "1.2.3.4"
109 | return Integer.signum(vals1.length - vals2.length);
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/src/com/me3tweaks/modmanager/utilities/MD5Checksum.java:
--------------------------------------------------------------------------------
1 | package com.me3tweaks.modmanager.utilities;
2 |
3 | import java.io.*;
4 | import java.security.MessageDigest;
5 |
6 | public class MD5Checksum {
7 |
8 | public static byte[] createChecksum(String filename) throws Exception {
9 | InputStream fis = new FileInputStream(filename);
10 |
11 | byte[] buffer = new byte[1024];
12 | MessageDigest complete = MessageDigest.getInstance("MD5");
13 | int numRead;
14 |
15 | do {
16 | numRead = fis.read(buffer);
17 | if (numRead > 0) {
18 | complete.update(buffer, 0, numRead);
19 | }
20 | } while (numRead != -1);
21 |
22 | fis.close();
23 | return complete.digest();
24 | }
25 |
26 | // see this How-to for a faster way to convert
27 | // a byte array to a HEX string
28 | public static String getMD5Checksum(String filename) throws Exception {
29 | byte[] b = createChecksum(filename);
30 | String result = "";
31 |
32 | for (int i=0; i < b.length; i++) {
33 | result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
34 | }
35 | return result;
36 | }
37 | }
--------------------------------------------------------------------------------
/src/com/me3tweaks/modmanager/utilities/NexusModsAPI.java:
--------------------------------------------------------------------------------
1 | package com.me3tweaks.modmanager.utilities;
2 |
3 | import com.me3tweaks.modmanager.ModManager;
4 | import com.me3tweaks.modmanager.utilities.nexusmods.NexusModsFileInfo;
5 | import org.apache.commons.io.FileUtils;
6 | import org.apache.http.client.fluent.Request;
7 | import org.json.simple.JSONArray;
8 | import org.json.simple.JSONObject;
9 | import org.json.simple.parser.JSONParser;
10 |
11 | import java.io.File;
12 |
13 | public class NexusModsAPI {
14 | private static String API_ENDPOINT_BASE = "https://api.nexusmods.com/v1/";
15 | private static String PERSONAL_API_KEY = "";
16 | private static String SSO_API_KEY = "";
17 | private static String GAME_NAME = "masseffect3";
18 |
19 | public static NexusModsFileInfo GetModInfoByMD5(String md5) {
20 | try {
21 | ModManager.debugLogger.writeMessage("Looking up mod info on nexusmods via MD5: "+md5);
22 | if (PERSONAL_API_KEY.equals("")) { LoadAPIKeyFromDisk(); }
23 | String md5SeachResult = Request.Get(API_ENDPOINT_BASE + "games/" + GAME_NAME + "/mods/md5_search/" + md5 + ".json")
24 | .addHeader("apikey", PERSONAL_API_KEY)
25 | .setHeader("User-Agent", "Mass Effect 3 Mod Manager/Build " + ModManager.BUILD_NUMBER + " (Java) on " + System.getProperty("os.name"))
26 | .execute().returnContent().asString();
27 |
28 | JSONParser parser = new JSONParser();
29 | JSONArray results = (JSONArray) parser.parse(md5SeachResult);
30 | if (results.size() != 1) {
31 | return null; //More or less than one result.
32 | }
33 | return new NexusModsFileInfo((JSONObject)((JSONObject)results.get(0)).get("file_details"));
34 | } catch (Exception e) {
35 | ModManager.debugLogger.writeError("Error getting mod info by MD5: "+e.getMessage());
36 | }
37 | return null;
38 | }
39 |
40 |
41 | /**
42 | * Loads your personal API key from disk. Do not commit this file to a repository.
43 | */
44 | public static void LoadAPIKeyFromDisk() {
45 | try {
46 | PERSONAL_API_KEY = FileUtils.readFileToString(new File("NM_PersonalAPIKey.txt"), "UTF-8");
47 | ModManager.debugLogger.writeMessage("Loaded NexusMods API key from disk");
48 | } catch (Exception e) {
49 | ModManager.debugLogger.writeError("Could not read personal API key from disk");
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/com/me3tweaks/modmanager/utilities/Version.java:
--------------------------------------------------------------------------------
1 | package com.me3tweaks.modmanager.utilities;
2 |
3 | public class Version implements ComparableCard Pool
\n");
45 | sb.append("" + getPoolname() + "
\n");
46 | sb.append("
\n");
48 | sb.append("Cards in this pool
\n");
52 | sb.append("This pool is empty.
Card Pool
\n");
54 | sb.append("" + getPoolname() + "
\n");
55 | sb.append("
\n");
57 | sb.append("Cards in this pool
\n");
59 |
60 | //MAIN POOLS
61 | for (PoolCard pcard : poolContents) {
62 | //these are only placeholder pools. we need to fetch the real ones
63 | RealCard realcard = CardParser.getRealCardFromPoolCard(pcard);
64 | if (realcard != null) {
65 | sb.append(realcard.getCardpageHTML());
66 | } else {
67 | // System.err.println("POOL CARD HAS NO STORE DEFINITION: "+card);
68 | }
69 | }
70 |
71 | sb.append("\n"
15 | + "\t\t\t\t\t
CONTAINERNAME
\n"
16 | + "\t\t\t\t\t\n"
20 | + "\t\t\t\t\t
Detonation Parameters
\n"
21 | + "\t\t\t\t\t