mirror of
https://code.chipmunk.land/ChomeNS/chipmunkmod.git
synced 2026-03-31 02:02:04 +00:00
feat: support trumpets in nbs v5 format
This commit is contained in:
parent
624d87c381
commit
84df266240
2 changed files with 32 additions and 20 deletions
|
|
@ -30,24 +30,20 @@ public class Instrument {
|
||||||
public final int offset;
|
public final int offset;
|
||||||
public final String sound;
|
public final String sound;
|
||||||
|
|
||||||
private Instrument (final int id, final String name, final int offset, final String sound) {
|
protected Instrument (final int id, final String name, final int offset, final String sound) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.offset = offset;
|
this.offset = offset;
|
||||||
this.sound = sound;
|
this.sound = sound;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Instrument (final int id, final String name, final int offset) {
|
protected Instrument (final int id, final String name, final int offset) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.offset = offset;
|
this.offset = offset;
|
||||||
this.sound = "block.note_block." + name;
|
this.sound = "block.note_block." + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Instrument of (final String sound) {
|
|
||||||
return new Instrument(-1, null, 0, sound);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Instrument fromId (final int id) {
|
public static Instrument fromId (final int id) {
|
||||||
return VALUES[id];
|
return VALUES[id];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,9 @@ import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.ByteOrder;
|
import java.nio.ByteOrder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import net.minecraft.resources.Identifier;
|
||||||
|
import net.minecraft.util.Util;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
|
||||||
public class NBSConverter {
|
public class NBSConverter {
|
||||||
|
|
@ -120,12 +123,12 @@ public class NBSConverter {
|
||||||
if (buffer.hasRemaining()) {
|
if (buffer.hasRemaining()) {
|
||||||
final byte customInstrumentCount = buffer.get();
|
final byte customInstrumentCount = buffer.get();
|
||||||
for (int i = 0; i < customInstrumentCount; i++) {
|
for (int i = 0; i < customInstrumentCount; i++) {
|
||||||
final NBSCustomInstrument customInstrument = new NBSCustomInstrument();
|
final String name = getString(buffer, bytes.length);
|
||||||
customInstrument.name = getString(buffer, bytes.length);
|
final String file = getString(buffer, bytes.length);
|
||||||
customInstrument.file = getString(buffer, bytes.length);
|
final byte pitch = buffer.get();
|
||||||
customInstrument.pitch = buffer.get();
|
final boolean visible = buffer.get() != 0; // "Press piano key"
|
||||||
customInstrument.key = buffer.get() != 0;
|
|
||||||
customInstruments.add(customInstrument);
|
customInstruments.add(new NBSCustomInstrument(name, file, pitch, visible));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,12 +148,10 @@ public class NBSConverter {
|
||||||
key = (double) ((note.key * 100) + note.pitch) / 100;
|
key = (double) ((note.key * 100) + note.pitch) / 100;
|
||||||
} else {
|
} else {
|
||||||
final int index = note.instrument - vanillaInstrumentCount;
|
final int index = note.instrument - vanillaInstrumentCount;
|
||||||
|
|
||||||
if (index >= customInstruments.size()) continue;
|
if (index >= customInstruments.size()) continue;
|
||||||
|
|
||||||
final NBSCustomInstrument customInstrument = customInstruments.get(index);
|
final NBSCustomInstrument customInstrument = customInstruments.get(index);
|
||||||
instrument = Instrument.of(customInstrument.name);
|
|
||||||
|
|
||||||
|
instrument = customInstrument;
|
||||||
key = (note.key) + (customInstrument.pitch + (double) note.pitch / 100);
|
key = (note.key) + (customInstrument.pitch + (double) note.pitch / 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -220,10 +221,25 @@ public class NBSConverter {
|
||||||
public byte stereo = 100;
|
public byte stereo = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NBSCustomInstrument {
|
private static class NBSCustomInstrument extends Instrument {
|
||||||
public String name;
|
public final byte pitch;
|
||||||
public String file;
|
public final boolean visible;
|
||||||
public byte pitch = 0;
|
|
||||||
public boolean key = false;
|
public NBSCustomInstrument(final String name, final String optionalPath, final byte pitch, final boolean visible) {
|
||||||
|
// some implementations straight up just don't save the path, so we perform conversions on name on those
|
||||||
|
final String path = optionalPath.isBlank() ? name : optionalPath;
|
||||||
|
String sound = Util.sanitizeName(path, Identifier::isAllowedInIdentifier)
|
||||||
|
.replaceFirst("\\.ogg$", "")
|
||||||
|
.replaceFirst("^minecraft/", "")
|
||||||
|
.replace('/', '.');
|
||||||
|
|
||||||
|
// if there's no path, it's probably a note block sound
|
||||||
|
// this happens when you have trumpets saved in a v5 format NBS for example
|
||||||
|
if (!sound.contains(".")) sound = "block.note_block." + sound;
|
||||||
|
|
||||||
|
super(-1, name, 0, sound);
|
||||||
|
this.pitch = pitch;
|
||||||
|
this.visible = visible;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue