17.09.2016, 22:14 | #1 (permalink) |
Registriert seit: 01.07.2006
Ort: Kabul
Alter: 39
Beiträge: 2.666
|
mdhClassReplace
mdhClassReplace.jar ist ein simples Javaprogramm um classnames in ext, sqs, sqf, sqm dateien im order und unterorder des tools zu aendern. Die ausgetauschten classnames stehen in der mdhClassReplace.cfg datei.
wie funktionierst: 1. erstelle und schreibe in die mdhClassReplaceLog.txt lognachrichten 2. die mdhClassReplace.cfg wird eingelesen um die classnames zu ermitteln welche in den ext, sqs, sqf und sqm dateien ausgetauscht werden sollen 3. jede ext, sqs, sqm, sqf datei im ordner und in den unterordnern des tools werden durchscannt und die classnames ausgetauscht ein kleines beispiel fuer die verwendung um A2 missionsne nach A3 mit CUP zu portieren: 1. runterladen des tools mdhClassReplace.7z 2. extrahieren des tools in einen neuen ordner 3. arma2 missionsordner in den selben ordner wie das tool 4. ausfuehren der mdhClassReplace.jar 5. einen blick in die mdhClassReplaceLog.txt werden und pruefen was gemacht wurde 6. den arma2 missionsordner anschließend in den arma3 mission ordern kopieren und die mission im Arma 3 3D editor oeffnen die verwendung des tools/mdhClassReplace.jar auf eigene gefahr Download: http://moerderhoschi.bplaced.net/pub...lassReplace.7z my A2 -> CUP ClassnameMSExcelWar -> http://moerderhoschi.bplaced.net/pub...Classnames.png mdhClassReplace.jar Source: Code:
package mdhClassReplace; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class mdhClassReplace { public static void dirTree(File dir, List classOld, List classNew) { File[] subdirs = dir.listFiles(); for (File subdir : subdirs) { if (subdir.isDirectory()) { dirTree(subdir, classOld, classNew); } else { doFile(subdir, classOld, classNew); } } } public static void doFile(File file, List classOld, List classNew) { String extension = ""; int i = file.getName().lastIndexOf('.'); if (i > 0) { extension = file.getName().substring(i + 1).toLowerCase(); } if (extension.contentEquals("sqm") || extension.contentEquals("sqf") || extension.contentEquals("sqs") || extension.contentEquals("ext")) { writeLog("checkFile: " + file.getAbsolutePath()); rplTxt(file.getAbsolutePath(), classOld, classNew); } } public static void rplTxt(String fileName, List classOld, List classNew) { Path path = Paths.get(fileName); Charset charset = StandardCharsets.UTF_8; String content = null; try { content = new String(Files.readAllBytes(path), charset); } catch (IOException e) { e.printStackTrace(); } String contentLower = content.toLowerCase(); boolean foundClass = false; for (int i = 0; i < classOld.size(); i++) { String classOldS = "\"" + classOld.get(i).toString() + "\""; String classNewS = "\"" + classNew.get(i).toString() + "\""; if (contentLower.contains(classOldS.toLowerCase())) { foundClass = true; content = content.replaceAll("(?i)"+classOldS, classNewS); writeLog("changedClass: " + classOldS + " to " + classNewS); } classOldS = "'" + classOld.get(i).toString() + "'"; classNewS = "'" + classNew.get(i).toString() + "'"; if (contentLower.contains(classOldS.toLowerCase())) { foundClass = true; content = content.replaceAll("(?i)"+classOldS, classNewS); writeLog("changedClass: " + classOldS + " to " + classNewS); } } if (foundClass) { try { Files.write(path, content.getBytes(charset)); } catch (IOException e) { e.printStackTrace(); } } } public static void writeLog(String logTxt) { PrintWriter out; logTxt = new java.util.Date() + " --> " + logTxt; try { out = new PrintWriter(new BufferedWriter(new FileWriter( "mdhClassReplaceLog.txt", true))); out.println(logTxt); System.out.println(logTxt); out.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } public static void main(String[] args) { writeLog("-------------------------------"); writeLog("pgmStart"); String currentDir = System.getProperty("user.dir"); writeLog("currentDir: " + currentDir); File f = new File(currentDir); File c = new File(currentDir.concat("\\mdhClassReplace.cfg")); if (c.exists() && !c.isDirectory()) { String classOldS = ""; String classNewS = ""; List classOld = new ArrayList(); List classNew = new ArrayList(); try { BufferedReader in = new BufferedReader(new FileReader(c)); String actLine = null; while ((actLine = in.readLine()) != null) { int seperatorPos = actLine.indexOf(";"); classOldS = actLine.substring(0, seperatorPos); classNewS = actLine.substring(seperatorPos + 1); if (!classOldS.isEmpty() && !classNewS.isEmpty()) { classOld.add(classOldS); classNew.add(classNewS); } } } catch (IOException e) { e.printStackTrace(); writeLog("pgmError: error while reading mdhClassReplace.cfg"); System.exit(-1); } dirTree(f, classOld, classNew); } else { writeLog("mdhClassReplace.cfg not found"); }; writeLog("pgmEnd"); } } v1.1 - problem mit groß/kleinschreibung beim klassennamen ersetzen gefixt - mehr klassennamen zum ersetzten in die mdhClassReplace.cfg hinzugefuegt v1.2 - mdhClassReplace.cfg um weitere Klassen ergaenzt - update vom Javaprogramm, .sqs sowie .ext werden nun auch geprueft gruß hoschi Geändert von Moerderhoschi (18.09.2016 um 17:13 Uhr). Grund: update 1.1 |
18.09.2016, 17:14 | #2 (permalink) |
Registriert seit: 01.07.2006
Ort: Kabul
Alter: 39
Beiträge: 2.666
|
update zu v1.1:
- problem mit groß/kleinschreibung beim klassennamen ersetzen gefixt - mehr klassennamen zum ersetzten in die mdhClassReplace.cfg hinzugefuegt mdhClassReplace.jar Source im ersten Beitrag ebenfalls aktualisiert |
19.09.2016, 14:04 | #3 (permalink) |
Gutes Tool zum porten. Danke Hoschi!
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
12.11.2016, 10:37 | #4 (permalink) |
Kann man damit auch A1 Missionen irgendwie porten? Habe es eben versucht, bekomme aber nur diesen Eintrag im Log, ohne das die Mission geportet wird.
Grüße
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
12.11.2016, 11:10 | #5 (permalink) |
Registriert seit: 01.07.2006
Ort: Kabul
Alter: 39
Beiträge: 2.666
|
ja geht auch, jedoch muss erst in der mdhClassReplace.cfg Datei die alten A1 Klassennamen mit den jetzigen zu ersetzenden CupKlassennamen befuellt werden.
Die letzte verfuegbare version ist nur mit A2 Klassen und den CupReplacements versorgt: mdhClassReplace.cfg Falls Du Dir die Muehe geben solltest und die A1 Klassennamen sowie durch die zu ersetzenden CupKlassennamen zusammen zu suchen, wuerde ich mich sehr freuen falls Du die erweiterte mdhClassReplace.cfg bereitstellst |
12.11.2016, 16:07 | #6 (permalink) |
Ok, also muss ich eigentlich "nur" die Classnames definieren damit die sqm portiert wird. Mich hatte es eben nur verwundert, dass die mission.sqm zwar erkannt wurde aber gänzlich unberührt blieb.
Grüße
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
12.11.2016, 16:45 | #7 (permalink) |
Registriert seit: 01.07.2006
Ort: Kabul
Alter: 39
Beiträge: 2.666
|
Ja genau, einfach die A1 Klassen und Cup Klassen in der mdhClassReplace.cfg definieren dann sollte das klappen.
Das System funktioniert ganz simpel, links vom Semicolon alter Klassenname und rechts neuer Klassenname: KlassenNameVorher;KlassenNameNachher Ich denke wich werde die Tage mal die neue Version des JavaPGMs hochladen, dort werden dann auch .sqs und .ext mit bearbeitet. |
12.11.2016, 18:19 | #8 (permalink) |
Topp!
Ich habe die ersten 150 Classnames aufgenommen. Ich schick dir die Datei wenn ich soweit alles habe. Grüße
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|