From 395e0274b8cbd2ff2e85328279fb1c47bb2fabfe Mon Sep 17 00:00:00 2001 From: Collin Smith Date: Mon, 11 Mar 2019 20:00:58 -0700 Subject: [PATCH] Cleaned up workaround for issue #9 Changed blockIndex back to final Removed ability to mark blocks as deleted Moved mpqs to MPQFileHandleResolver Added public final references to individual mpqs Forced gem.wav to resolve to d2sfx manually These changes will have a lower impact when pkexplode eventually gets fixed --- core/src/com/riiablo/Client.java | 13 ----- core/src/com/riiablo/mpq/MPQ.java | 16 +------ .../riiablo/mpq/MPQFileHandleResolver.java | 48 +++++++++++++++---- 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/core/src/com/riiablo/Client.java b/core/src/com/riiablo/Client.java index 8439e5cb..49c46d2f 100644 --- a/core/src/com/riiablo/Client.java +++ b/core/src/com/riiablo/Client.java @@ -235,19 +235,6 @@ public class Client extends Game { } Riiablo.mpqs = mpqs = new MPQFileHandleResolver(); - mpqs.add(home.child("patch_d2.mpq")); - mpqs.add(home.child("d2exp.mpq")); - mpqs.delete("data\\global\\sfx\\Item\\gem.wav"); // workaround for issue #9 - mpqs.add(home.child("d2xmusic.mpq")); - mpqs.add(home.child("d2xtalk.mpq")); - mpqs.add(home.child("d2xvideo.mpq")); - mpqs.add(home.child("d2data.mpq")); - mpqs.add(home.child("d2char.mpq")); - mpqs.add(home.child("d2sfx.mpq")); - mpqs.add(home.child("d2music.mpq")); - mpqs.add(home.child("d2speech.mpq")); - mpqs.add(home.child("d2video.mpq")); - Riiablo.string = string = new StringTBLs(mpqs); Riiablo.assets = assets = new AssetManager(); diff --git a/core/src/com/riiablo/mpq/MPQ.java b/core/src/com/riiablo/mpq/MPQ.java index f5c1051b..155c1e4c 100644 --- a/core/src/com/riiablo/mpq/MPQ.java +++ b/core/src/com/riiablo/mpq/MPQ.java @@ -49,11 +49,6 @@ public class MPQ { return hashTable.contains(fileName); } - public boolean delete(String fileName) { - fileName = fileName.replaceAll("/", "\\\\"); - return hashTable.deleteEntry(fileName); - } - public long length(String fileName) { fileName = fileName.replaceAll("/", "\\\\"); HashTable.Entry entry = hashTable.getEntry(fileName); @@ -243,15 +238,6 @@ public class MPQ { return index != -1 ? entries[index] : null; } - boolean deleteEntry(String file) { - Entry entry = getEntry(file); - System.out.println("deleting entry " + entry); - if (entry == null || entry.blockIndex == Entry.DELETED) return false; - entry.blockIndex = Entry.DELETED; - System.out.println("-> " + entry); - return true; - } - public boolean contains(String file) { return getIndex(File.key(file), File.offset(file), Entry.DEFAULT_LOCALE) != -1; } @@ -290,7 +276,7 @@ public class MPQ { final long key; // QWORD final short locale; // WORD final short platform; // WORD - int blockIndex; // DWORD + final int blockIndex; // DWORD Entry(ByteBuffer in) { key = in.getLong(); diff --git a/core/src/com/riiablo/mpq/MPQFileHandleResolver.java b/core/src/com/riiablo/mpq/MPQFileHandleResolver.java index ea051afa..688975e4 100644 --- a/core/src/com/riiablo/mpq/MPQFileHandleResolver.java +++ b/core/src/com/riiablo/mpq/MPQFileHandleResolver.java @@ -3,6 +3,7 @@ package com.riiablo.mpq; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.assets.loaders.FileHandleResolver; import com.badlogic.gdx.files.FileHandle; +import com.riiablo.Riiablo; import java.util.concurrent.CopyOnWriteArrayList; @@ -10,20 +11,45 @@ public class MPQFileHandleResolver implements FileHandleResolver { private static final String TAG = "MPQFileHandleResolver"; private static final boolean DEBUG = !true; + public final MPQ patch_d2; + public final MPQ d2exp; + public final MPQ d2xmusic; + public final MPQ d2xtalk; + public final MPQ d2xvideo; + public final MPQ d2data; + public final MPQ d2char; + public final MPQ d2sfx; + public final MPQ d2music; + public final MPQ d2speech; + public final MPQ d2video; + + public MPQFileHandleResolver() { + this(Riiablo.home); + } + + public MPQFileHandleResolver(FileHandle home) { + patch_d2 = add(home.child("patch_d2.mpq")); + d2exp = add(home.child("d2exp.mpq")); + d2xmusic = add(home.child("d2xmusic.mpq")); + d2xtalk = add(home.child("d2xtalk.mpq")); + d2xvideo = add(home.child("d2xvideo.mpq")); + d2data = add(home.child("d2data.mpq")); + d2char = add(home.child("d2char.mpq")); + d2sfx = add(home.child("d2sfx.mpq")); + d2music = add(home.child("d2music.mpq")); + d2speech = add(home.child("d2speech.mpq")); + d2video = add(home.child("d2video.mpq")); + } + private final CopyOnWriteArrayList mpqs = new CopyOnWriteArrayList<>(); - public void add(MPQ mpq) { + public MPQ add(MPQ mpq) { mpqs.add(mpq); + return mpq; } - public void add(FileHandle file) { - add(MPQ.loadFromFile(file)); - } - - public boolean delete(String fileName) { - boolean deleted = false; - for (MPQ mpq : mpqs) deleted = mpq.delete(fileName); - return deleted; + public MPQ add(FileHandle file) { + return add(MPQ.loadFromFile(file)); } public boolean contains(String fileName) { @@ -40,6 +66,10 @@ public class MPQFileHandleResolver implements FileHandleResolver { public FileHandle resolve(String fileName) { if (DEBUG) Gdx.app.debug(TAG, "Resolving " + fileName); if (fileName == null) return null; + if (fileName.endsWith("gem.wav")) { + return new MPQFileHandle(d2sfx, fileName); + } + for (MPQ mpq : mpqs) { if (mpq.contains(fileName)) { if (DEBUG) Gdx.app.debug(TAG, fileName + " found in " + mpq);