diff --git a/.github/LCRE-banner.png b/.github/LCRE-banner.png new file mode 100644 index 00000000..d0ef387c Binary files /dev/null and b/.github/LCRE-banner.png differ diff --git a/.gitignore b/.gitignore index 83e66cd1..226e4105 100644 --- a/.gitignore +++ b/.gitignore @@ -415,3 +415,8 @@ build/ tmp*/ _server_asset_probe/ server-data/ + +# Tools build artifacts and intermediates +tools/*.class +tools/*.swf +tools/staging/ diff --git a/README.md b/README.md index a8904705..a88a53b8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Legacy Edition Banner](.github/banner.png) +![Legacy Edition Banner](.github/LCRE-banner.png) # MinecraftConsoles (Legacy Console Revelations Edition) If you have any questions regarding this fork, this is my Fluxer server (similar to a Discord server): diff --git a/tools/CheckSetImage.java b/tools/CheckSetImage.java new file mode 100644 index 00000000..7c63f186 --- /dev/null +++ b/tools/CheckSetImage.java @@ -0,0 +1,12 @@ +import com.jpexs.decompiler.flash.tags.*; +import java.lang.reflect.*; + +public class CheckSetImage { + public static void main(String[] args) { + for (Method m : DefineBitsLossless2Tag.class.getMethods()) { + if (m.getName().contains("mage") || m.getName().contains("itmap") || m.getName().contains("set")) { + System.out.println(m.getReturnType().getSimpleName() + " " + m.getName() + "(" + java.util.Arrays.toString(m.getParameterTypes()) + ")"); + } + } + } +} diff --git a/tools/DumpSwfDetail.java b/tools/DumpSwfDetail.java new file mode 100644 index 00000000..ec122a40 --- /dev/null +++ b/tools/DumpSwfDetail.java @@ -0,0 +1,46 @@ +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.tags.*; +import com.jpexs.decompiler.flash.tags.base.*; +import com.jpexs.decompiler.flash.types.*; +import java.io.*; +import java.lang.reflect.*; +import java.util.*; + +public class DumpSwfDetail { + public static void main(String[] args) throws Exception { + String path = args[0]; + SWF swf = new SWF(new FileInputStream(path), false); + + System.out.println("SWF: " + path); + System.out.println("Frame size: " + swf.displayRect); + System.out.println("Frame rate: " + swf.frameRate); + System.out.println(); + + for (Tag tag : swf.getTags()) { + System.out.println(tag.getClass().getSimpleName() + " - " + tag); + + if (tag instanceof ImportAssets2Tag) { + ImportAssets2Tag imp = (ImportAssets2Tag) tag; + System.out.println(" URL: " + imp.url); + // Dump all fields via reflection + for (Field f : imp.getClass().getFields()) { + try { + System.out.println(" field " + f.getName() + " = " + f.get(imp)); + } catch (Exception e) {} + } + } + + if (tag instanceof DefineBitsLossless2Tag) { + DefineBitsLossless2Tag bmp = (DefineBitsLossless2Tag) tag; + System.out.println(" Bitmap: id=" + bmp.characterID + " " + bmp.bitmapWidth + "x" + bmp.bitmapHeight); + } + + if (tag instanceof SymbolClassTag) { + SymbolClassTag sym = (SymbolClassTag) tag; + for (int i = 0; i < sym.tags.size(); i++) { + System.out.println(" Symbol: id=" + sym.tags.get(i) + " name=" + sym.names.get(i)); + } + } + } + } +} diff --git a/tools/FindLogoBitmap.java b/tools/FindLogoBitmap.java new file mode 100644 index 00000000..fc096716 --- /dev/null +++ b/tools/FindLogoBitmap.java @@ -0,0 +1,63 @@ +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.tags.*; +import com.jpexs.decompiler.flash.tags.base.*; +import java.io.*; +import java.util.*; + +public class FindLogoBitmap { + public static void main(String[] args) throws Exception { + SWF swf = new SWF(new FileInputStream(args[0]), false); + + // Find MenuTitle symbol + Map symbolMap = new HashMap<>(); + for (Tag tag : swf.getTags()) { + if (tag instanceof SymbolClassTag) { + SymbolClassTag sym = (SymbolClassTag) tag; + for (int i = 0; i < sym.tags.size(); i++) { + symbolMap.put(sym.tags.get(i), sym.names.get(i)); + if (sym.names.get(i).contains("Title") || sym.names.get(i).contains("Logo")) { + System.out.println("Symbol: id=" + sym.tags.get(i) + " name=" + sym.names.get(i)); + } + } + } + if (tag instanceof ExportAssetsTag) { + ExportAssetsTag exp = (ExportAssetsTag) tag; + for (int i = 0; i < exp.tags.size(); i++) { + if (exp.names.get(i).contains("Title") || exp.names.get(i).contains("Logo")) { + System.out.println("Export: id=" + exp.tags.get(i) + " name=" + exp.names.get(i)); + } + } + } + } + + // Find all bitmaps + System.out.println("\n=== Bitmaps ==="); + for (Tag tag : swf.getTags()) { + if (tag instanceof DefineBitsLossless2Tag) { + DefineBitsLossless2Tag bmp = (DefineBitsLossless2Tag) tag; + String sym = symbolMap.getOrDefault(bmp.characterID, ""); + System.out.println("Lossless2: id=" + bmp.characterID + " " + bmp.bitmapWidth + "x" + bmp.bitmapHeight + " sym=" + sym); + } + if (tag instanceof DefineBitsJPEG2Tag) { + DefineBitsJPEG2Tag jpg = (DefineBitsJPEG2Tag) tag; + String sym = symbolMap.getOrDefault(jpg.characterID, ""); + System.out.println("JPEG2: id=" + jpg.characterID + " sym=" + sym); + } + if (tag instanceof DefineBitsJPEG3Tag) { + DefineBitsJPEG3Tag jpg = (DefineBitsJPEG3Tag) tag; + String sym = symbolMap.getOrDefault(jpg.characterID, ""); + System.out.println("JPEG3: id=" + jpg.characterID + " sym=" + sym); + } + if (tag instanceof DefineBitsTag) { + DefineBitsTag bmp = (DefineBitsTag) tag; + String sym = symbolMap.getOrDefault(bmp.characterID, ""); + System.out.println("Bits: id=" + bmp.characterID + " sym=" + sym); + } + if (tag instanceof DefineBitsLosslessTag) { + DefineBitsLosslessTag bmp = (DefineBitsLosslessTag) tag; + String sym = symbolMap.getOrDefault(bmp.characterID, ""); + System.out.println("Lossless: id=" + bmp.characterID + " " + bmp.bitmapWidth + "x" + bmp.bitmapHeight + " sym=" + sym); + } + } + } +} diff --git a/tools/FindMenuTitle.java b/tools/FindMenuTitle.java new file mode 100644 index 00000000..ca5aafb4 --- /dev/null +++ b/tools/FindMenuTitle.java @@ -0,0 +1,33 @@ +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.tags.*; +import com.jpexs.decompiler.flash.tags.base.*; +import java.io.*; + +public class FindMenuTitle { + public static void main(String[] args) throws Exception { + String path = args[0]; + System.out.println("Scanning: " + path); + SWF swf = new SWF(new FileInputStream(path), false); + + for (Tag tag : swf.getTags()) { + if (tag instanceof SymbolClassTag) { + SymbolClassTag sym = (SymbolClassTag) tag; + for (int i = 0; i < sym.tags.size(); i++) { + String name = sym.names.get(i); + if (name.contains("Menu") || name.contains("Logo") || name.contains("Title")) { + System.out.println(" Symbol: id=" + sym.tags.get(i) + " name=" + name); + } + } + } + if (tag instanceof ExportAssetsTag) { + ExportAssetsTag exp = (ExportAssetsTag) tag; + for (int i = 0; i < exp.tags.size(); i++) { + String name = exp.names.get(i); + if (name.contains("Menu") || name.contains("Logo") || name.contains("Title")) { + System.out.println(" Export: id=" + exp.tags.get(i) + " name=" + name); + } + } + } + } + } +} diff --git a/tools/FindMenuTitleAll.java b/tools/FindMenuTitleAll.java new file mode 100644 index 00000000..cc787837 --- /dev/null +++ b/tools/FindMenuTitleAll.java @@ -0,0 +1,37 @@ +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.tags.*; +import com.jpexs.decompiler.flash.tags.base.*; +import java.io.*; + +public class FindMenuTitleAll { + public static void main(String[] args) throws Exception { + String[] files = {"skinHD.swf", "skinHDGraphics.swf", "skinHDWin.swf", "skinHDInGame.swf", "skinHDLabels.swf", "skinHDHud.swf", "skinHDGraphicsInGame.swf", "skinHDGraphicsLabels.swf", "skinHDGraphicsHud.swf", "skin.swf", "skinGraphics.swf", "skinWin.swf"}; + String base = "C:/Users/revela/Documents/Minecraft/itsRevela/Minecraft.Client/Common/Media/"; + + for (String file : files) { + try { + SWF swf = new SWF(new FileInputStream(base + file), false); + for (Tag tag : swf.getTags()) { + if (tag instanceof SymbolClassTag) { + SymbolClassTag sym = (SymbolClassTag) tag; + for (int i = 0; i < sym.tags.size(); i++) { + if (sym.names.get(i).contains("Title") || sym.names.get(i).contains("MenuTitle")) { + System.out.println(file + " -> Symbol: id=" + sym.tags.get(i) + " name=" + sym.names.get(i)); + } + } + } + if (tag instanceof ExportAssetsTag) { + ExportAssetsTag exp = (ExportAssetsTag) tag; + for (int i = 0; i < exp.tags.size(); i++) { + if (exp.names.get(i).contains("Title") || exp.names.get(i).contains("MenuTitle")) { + System.out.println(file + " -> Export: id=" + exp.tags.get(i) + " name=" + exp.names.get(i)); + } + } + } + } + } catch (Exception e) { + System.err.println("Error reading " + file + ": " + e.getMessage()); + } + } + } +} diff --git a/tools/ListArc.java b/tools/ListArc.java new file mode 100644 index 00000000..14329c5e --- /dev/null +++ b/tools/ListArc.java @@ -0,0 +1,19 @@ +import java.io.*; +import java.nio.file.*; + +public class ListArc { + public static void main(String[] args) throws Exception { + DataInputStream dis = new DataInputStream(new FileInputStream(args[0])); + int numFiles = dis.readInt(); + System.out.println("Files: " + numFiles); + for (int i = 0; i < numFiles; i++) { + String name = dis.readUTF(); + int offset = dis.readInt(); + int size = dis.readInt(); + if (name.contains("ogo") || name.contains("skin") || name.contains("Menu") || name.contains("platform")) { + System.out.println(" >>> " + name + " offset=" + offset + " size=" + size); + } + } + dis.close(); + } +}