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
This commit is contained in:
Collin Smith 2019-03-11 20:00:58 -07:00
parent 8eb19c2063
commit 395e0274b8
3 changed files with 40 additions and 37 deletions

View File

@ -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();

View File

@ -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();

View File

@ -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<MPQ> 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);