Compare commits

..

2 commits

Author SHA1 Message Date
0d0c0ca08c Add support for ogg-vorbis audio files 2024-01-08 12:29:09 +09:00
74291dde8f Bump version, use jarJar instead of shadow jar
Also add "j-ogg-vorbis" dependency.
2024-01-08 12:18:32 +09:00
7 changed files with 153 additions and 29 deletions

View file

@ -1,5 +1,7 @@
# Upcoming changes # Upcoming changes
Implement playing Vorbis encoded .ogg files for battle/silly music.
# Version NeoForge-1.24.0 # Version NeoForge-1.24.0
Update to NeoForge 1.20.2-20.2.88. Update to NeoForge 1.20.2-20.2.88.

View file

@ -65,7 +65,7 @@ configured for them.)
# Building # Building
Simply invoke `./gradlew build` in the mod directory and after some time the Simply invoke `./gradlew build` in the mod directory and after some time the
finished jar will be saved at "build/libs/TurnBasedMinecraft-Forge-1.24.0.jar" finished jar will be saved at "build/libs/TurnBasedMinecraft-Forge-1.25.0.jar"
# Reproducibility # Reproducibility

View file

@ -3,16 +3,17 @@ plugins {
id 'idea' id 'idea'
id 'maven-publish' id 'maven-publish'
id 'net.minecraftforge.gradle' version '[6.0.16,6.2)' id 'net.minecraftforge.gradle' version '[6.0.16,6.2)'
id 'com.github.johnrengelman.shadow' version '8.1.1'
} }
version = "1.24.0" version = "1.25.0"
group = "com.burnedkirby.TurnBasedMinecraft" group = "com.burnedkirby.TurnBasedMinecraft"
archivesBaseName = "TurnBasedMinecraft-Forge" archivesBaseName = "TurnBasedMinecraft-Forge"
java.toolchain.languageVersion = JavaLanguageVersion.of(17) java.toolchain.languageVersion = JavaLanguageVersion.of(17)
println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
jarJar.enable()
minecraft { minecraft {
// The mappings can be changed at any time, and must be in the following format. // The mappings can be changed at any time, and must be in the following format.
// snapshot_YYYYMMDD Snapshot are built nightly. // snapshot_YYYYMMDD Snapshot are built nightly.
@ -137,11 +138,10 @@ sourceSets.main.resources { srcDir 'src/generated/resources' }
// } // }
//} //}
apply plugin: 'com.github.johnrengelman.shadow' repositories {
flatDir {
configurations { dir 'libs'
shade }
impelmentation.extendsFrom shade
} }
dependencies { dependencies {
@ -161,9 +161,16 @@ dependencies {
// For more info... // For more info...
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html // http://www.gradle.org/docs/current/userguide/dependency_management.html
implementation files('libs/javamp3-1.0.3.jar') //implementation files('libs/javamp3-1.0.3.jar')
implementation 'fr.delthas:javamp3:1.0.3'
shade files('libs/javamp3-1.0.3.jar') implementation 'com.github.stephengold:j-ogg-vorbis:1.0.4'
jarJar(group: 'fr.delthas', name: 'javamp3', version: '[1.0.0,2.0.0)') {
jarJar.pin(it, '1.0.3')
}
jarJar(group: 'com.github.stephengold', name: 'j-ogg-vorbis', version: '[1.0.4, 2.0.0)')
} }
// This block of code expands all declared replace properties in the specified resource targets. // This block of code expands all declared replace properties in the specified resource targets.
@ -203,20 +210,6 @@ jar {
} }
} }
shadowJar {
archiveClassifier = ''
//project.configurations.shadow.setTransitive(true);
configurations = [project.configurations.shade]
relocate 'fr.delthas', 'com.burnedkirby.tbm_repack.fr.delthas'
finalizedBy 'reobfShadowJar'
}
assemble.dependsOn shadowJar
reobf {
shadowJar {} // reobfuscate the shadowed jar
}
// Reproducible Builds // Reproducible Builds
tasks.withType(AbstractArchiveTask).configureEach { tasks.withType(AbstractArchiveTask).configureEach {
preserveFileTimestamps = false preserveFileTimestamps = false

View file

@ -44,7 +44,7 @@ mod_name=TurnBasedMinecraftMod
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=MIT mod_license=MIT
# The mod version. See https://semver.org/ # The mod version. See https://semver.org/
mod_version=1.24.0 mod_version=1.25.0
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
# This should match the base package used for the mod sources. # This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html # See https://maven.apache.org/guides/mini/guide-naming-conventions.html

View file

@ -1,6 +1,7 @@
package com.burnedkirby.TurnBasedMinecraft.client; package com.burnedkirby.TurnBasedMinecraft.client;
import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod; import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
import de.jarnbjo.vorbis.VorbisAudioFileReader;
import fr.delthas.javamp3.Sound; import fr.delthas.javamp3.Sound;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -28,7 +29,9 @@ public class BattleMusic
private boolean playingIsSilly; private boolean playingIsSilly;
private boolean isPlaying; private boolean isPlaying;
private Thread mp3StreamThread; private Thread mp3StreamThread;
private Thread oggVorbisStreamThread;
private MP3Streamer mp3StreamRunnable; private MP3Streamer mp3StreamRunnable;
private OGGVorbisStreamer oggVorbisStreamRunnable;
public BattleMusic(Logger logger) public BattleMusic(Logger logger)
{ {
@ -81,7 +84,7 @@ public class BattleMusic
} }
String ext = name.substring(extIndex + 1).toLowerCase(); String ext = name.substring(extIndex + 1).toLowerCase();
// return ext.equals("mid") || ext.equals("wav") || ext.equals("mp3"); // return ext.equals("mid") || ext.equals("wav") || ext.equals("mp3");
return ext.equals("wav") || ext.equals("mp3"); // midi disabled return ext.equals("wav") || ext.equals("mp3") || ext.equals("ogg"); // midi disabled
} }
}); });
for(File f : battleFiles) for(File f : battleFiles)
@ -101,7 +104,7 @@ public class BattleMusic
} }
String ext = name.substring(extIndex + 1).toLowerCase(); String ext = name.substring(extIndex + 1).toLowerCase();
// return ext.equals("mid") || ext.equals("wav") || ext.equals("mp3"); // return ext.equals("mid") || ext.equals("wav") || ext.equals("mp3");
return ext.equals("wav") || ext.equals("mp3"); // midi disabled return ext.equals("wav") || ext.equals("mp3") || ext.equals("ogg"); // midi disabled
} }
}); });
for(File f : sillyFiles) for(File f : sillyFiles)
@ -303,6 +306,39 @@ public class BattleMusic
return; return;
} }
} }
else if (suffix.equals("ogg")) {
if(sequencer != null && sequencer.isRunning())
{
sequencer.stop();
}
if(clip != null && clip.isActive())
{
clip.stop();
clip.close();
}
if(mp3StreamThread != null && mp3StreamThread.isAlive())
{
mp3StreamRunnable.setKeepPlaying(false);
try { mp3StreamThread.join(); } catch (Throwable t) { /* ignored */ }
}
try {
if (oggVorbisStreamRunnable == null) {
oggVorbisStreamRunnable = new OGGVorbisStreamer(next, logger, volume);
} else {
oggVorbisStreamRunnable.setOggVorbisFile(next);
oggVorbisStreamRunnable.setVolume(volume);
}
oggVorbisStreamThread = new Thread(oggVorbisStreamRunnable);
oggVorbisStreamThread.start();
logger.info("Started playing OggVorbis " + next.getName());
} catch (Throwable t) {
logger.error("Failed to play battle music (ogg)");
t.printStackTrace();
return;
}
}
} }
} }
@ -320,6 +356,10 @@ public class BattleMusic
mp3StreamRunnable.setKeepPlaying(false); mp3StreamRunnable.setKeepPlaying(false);
try { mp3StreamThread.join(); } catch (Throwable t) { /* ignored */ } try { mp3StreamThread.join(); } catch (Throwable t) { /* ignored */ }
} }
if (oggVorbisStreamThread != null && oggVorbisStreamThread.isAlive()) {
oggVorbisStreamRunnable.setKeepPlaying(false);
try { oggVorbisStreamThread.join(); } catch (Throwable t) { /* ignored */ }
}
if(resumeMCSounds) if(resumeMCSounds)
{ {
Minecraft.getInstance().getSoundManager().resume(); Minecraft.getInstance().getSoundManager().resume();
@ -454,4 +494,93 @@ public class BattleMusic
} }
} }
} }
private class OGGVorbisStreamer implements Runnable {
private AtomicBoolean keepPlaying;
private File oggVorbisFile;
private Logger logger;
private float volume;
public OGGVorbisStreamer(File oggVorbisFile, Logger logger, float volume) {
keepPlaying = new AtomicBoolean(true);
this.oggVorbisFile = oggVorbisFile;
this.logger = logger;
this.volume = volume;
if (this.volume > 1.0F) {
this.volume = 1.0F;
} else if (this.volume < 0.0F) {
this.volume = 0.0F;
}
}
public void setKeepPlaying(boolean playing) {
keepPlaying.set(playing);
}
public void setOggVorbisFile(File oggVorbisFile) {
this.oggVorbisFile = oggVorbisFile;
}
public void setVolume(float volume) {
this.volume = volume;
}
@Override
public void run() {
keepPlaying.set(true);
SourceDataLine sdl = null;
try {
VorbisAudioFileReader reader = new VorbisAudioFileReader();
AudioFormat audioFormat = reader.getAudioFileFormat(oggVorbisFile).getFormat();
sdl = AudioSystem.getSourceDataLine(audioFormat);
sdl.open(audioFormat);
{
FloatControl volumeControl = (FloatControl) sdl.getControl(FloatControl.Type.MASTER_GAIN);
volumeControl.setValue(volume * 20.0f - 20.0f); // in decibels
}
AudioInputStream ais = reader.getAudioInputStream(oggVorbisFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] cached = null;
int cachedOffset = 0;
int cachedSize = 0;
byte[] buf = new byte[4096];
sdl.start();
int read = ais.read(buf);
while (keepPlaying.get()) {
if (baos != null) {
if (read != -1) {
sdl.write(buf, 0, read);
baos.write(buf, 0, read);
read = ais.read(buf);
} else {
ais.close();
ais = null;
cached = baos.toByteArray();
baos = null;
}
} else {
cachedSize = cached.length - cachedOffset;
if (cachedSize > 4096) {
cachedSize = 4096;
}
sdl.write(cached, cachedOffset, cachedSize);
cachedOffset += cachedSize;
if (cachedOffset >= cached.length) {
cachedOffset = 0;
}
}
}
} catch (Throwable t) {
logger.error("Stream play oggVorbis", t);
}
if (sdl != null) {
sdl.stop();
sdl.flush();
sdl.close();
}
}
}
} }

View file

@ -37,7 +37,7 @@ import org.apache.logging.log4j.Logger;
public class TurnBasedMinecraftMod { public class TurnBasedMinecraftMod {
public static final String MODID = "com_burnedkirby_turnbasedminecraft"; public static final String MODID = "com_burnedkirby_turnbasedminecraft";
public static final String NAME = "Turn Based Minecraft Mod"; public static final String NAME = "Turn Based Minecraft Mod";
public static final String VERSION = "1.24.0"; public static final String VERSION = "1.25.0";
public static final String CONFIG_FILENAME = "TBM_Config.toml"; public static final String CONFIG_FILENAME = "TBM_Config.toml";
public static final String DEFAULT_CONFIG_FILENAME = "TBM_Config_DEFAULT.toml"; public static final String DEFAULT_CONFIG_FILENAME = "TBM_Config_DEFAULT.toml";
public static final String CONFIG_DIRECTORY = "config/TurnBasedMinecraft/"; public static final String CONFIG_DIRECTORY = "config/TurnBasedMinecraft/";

View file

@ -3,7 +3,7 @@
"modid": "com_burnedkirby_turnbasedminecraft", "modid": "com_burnedkirby_turnbasedminecraft",
"name": "Turn Based Minecraft", "name": "Turn Based Minecraft",
"description": "Changes battles to be turn-based.", "description": "Changes battles to be turn-based.",
"version": "1.24.0", "version": "1.25.0",
"mcversion": "1.20.2", "mcversion": "1.20.2",
"url": "", "url": "",
"updateUrl": "", "updateUrl": "",