import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class SoundGen { public static void main(String[] args) { try { ZipFile zip = new ZipFile("F:/dev/code/old workspaces/forge-1.7.10-tropicraft/pkg/assets.zip"); Enumeration<? extends ZipEntry> entries = zip.entries(); ArrayList<String> soundNames = new ArrayList<String>(); String initialPath = "assets/tropicraft/"; while(entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); if(!entry.isDirectory() && entry.toString().endsWith(".ogg")) { String name = entry.toString(); name = name.substring(initialPath.length()); //remove the file structure if(name.startsWith("sounds")) { name = name.substring("sounds".length() + 1); } soundNames.add(name.substring(0, name.length() - 4)); //remove the OGG } } HashMap<String, ArrayList<String>> numbered = new HashMap<String, ArrayList<String>>(); for(int i = 0; i < soundNames.size(); i++) { String name = soundNames.get(i); String oriName = name; boolean isNum = true; boolean isNumbered = false; while(isNum) { try { Integer.parseInt(name.substring(name.length() - 1)); name = name.substring(0, name.length() - 1); isNumbered = true; } catch(NumberFormatException e) { isNum = false; } } if(isNumbered) { ArrayList<String> numbers = numbered.get(name); if(numbers == null) { numbers = new ArrayList<String>(); numbered.put(name, numbers); } numbers.add(oriName); Collections.sort(numbers); } } for(int i = soundNames.size() - 1; i >= 0; i--) { String name = soundNames.get(i); for(Map.Entry<String, ArrayList<String>> e : numbered.entrySet()) { if(name.startsWith(e.getKey()) && !name.equals(e.getKey())) { soundNames.remove(i); if(!soundNames.contains(e.getKey())) { soundNames.add(i, e.getKey()); } } } } StringBuilder sb = new StringBuilder(); sb.append("\n\n"); sb.append("{\n"); for(int i = 0; i < soundNames.size(); i++) { String name = soundNames.get(i); String oriName = name; boolean isRecord = name.startsWith("records"); String category = isRecord ? "record" : name.contains("wpn_portal") ? "player" : "neutral"; //"ambient", "weather", "player", "neutral", "hostile", "block", "record", "music", and "master" String ingameName = name.replaceAll("\\/", "."); sb.append(" \"" + ingameName + "\": { \n"); //ELEMENTS HERE sb.append(" \"category\": \"" + category + "\",\n"); sb.append(" \"sounds\": [\n"); if(isRecord) { sb.append(" {\n"); sb.append(" \"name\": \"" + name + "\",\n \"stream\": true\n"); sb.append(" }\n"); } else { ArrayList<String> soundPaths = numbered.get(oriName); if(soundPaths == null) { soundPaths = new ArrayList<String>(); soundPaths.add(name); } for(int j = 0; j < soundPaths.size(); j++) { sb.append(" \"" + soundPaths.get(j) + "\""); if(j != soundPaths.size() - 1) { sb.append(",\n"); } else { sb.append("\n"); } } } sb.append(" ]\n"); sb.append(" }"); if(i != soundNames.size() - 1) { sb.append(",\n"); } else { sb.append("\n"); } } sb.append("}"); System.out.println(sb.toString()); } catch(Exception e) { e.printStackTrace(); } } }