Compare commits

...

5 commits

Author SHA1 Message Date
f56891e1d0 Update Reproducibility.md
All checks were successful
Build TurnBasedMC and create Release / build-and-store-artifact (push) Successful in 8m22s
2024-01-08 15:41:33 +09:00
d58ef1585a Update README.md 2024-01-08 15:37:48 +09:00
2cbad47b33 Update Changelog.md 2024-01-08 15:34:40 +09:00
d57f18d6c2 Add support for ogg-vorbis audio files 2024-01-08 15:19:42 +09:00
c0bbf92efc Bump version, add j-ogg-vorbis dependency
Updated README.md, Reproducibility.md, etc.
2024-01-08 15:19:31 +09:00
9 changed files with 200 additions and 17 deletions

View file

@ -1,4 +1,4 @@
name: Build TurnBasedMC and store Artifact name: Build TurnBasedMC and create Release
on: on:
push: push:
tags: tags:
@ -24,6 +24,7 @@ jobs:
\"name\": \"TurnBasedMinecraftMod version ${GITHUB_REF_NAME}\", \"name\": \"TurnBasedMinecraftMod version ${GITHUB_REF_NAME}\",
\"body\": \"See the [Changelog](https://git.seodisparate.com/stephenseo/TurnBasedMinecraftMod/src/branch/neoforge/Changelog.md) \"body\": \"See the [Changelog](https://git.seodisparate.com/stephenseo/TurnBasedMinecraftMod/src/branch/neoforge/Changelog.md)
(Using OpenJDK Java.)
$(javac --version) $(javac --version)
$(find TurnBasedMinecraftMod/build/libs -regex '.*all.jar$' -exec sha256sum '{}' ';')\", $(find TurnBasedMinecraftMod/build/libs -regex '.*all.jar$' -exec sha256sum '{}' ';')\",
\"tag_name\": \"${GITHUB_REF_NAME}\" \"tag_name\": \"${GITHUB_REF_NAME}\"

View file

@ -1,5 +1,19 @@
# Upcoming changes # Upcoming changes
# Version NeoForge-1.25.0
Add new dependency `j-ogg-vorbis`.
Implement playing Vorbis encoded .ogg files for battle/silly music.
# Version Forge-1.25.0
Remove usage of "shadow jar" in build.gradle, and use jarJar instead.
Add new dependency `j-ogg-vorbis`.
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

@ -45,14 +45,18 @@ When playing multiplayer, some configuration of the config on the server may be
between them between them
- Supports use of the vanilla Minecraft bow and arrows (have bow selected when - Supports use of the vanilla Minecraft bow and arrows (have bow selected when
in battle) in battle)
- Supports custom battle music to be played when fighting enemies. (They must be - Supports custom battle music to be played when fighting enemies. (They must
placed in `.minecraft/config/TurnBasedMinecraft/Music/battle` or be placed in `.minecraft/config/TurnBasedMinecraft/Music/battle` or
`.minecraft/config/TurnBasedMinecraft/Music/silly`. Client-side config determines `.minecraft/config/TurnBasedMinecraft/Music/silly`. Client-side config
which song plays in battle for the client. only `.wav`, ~~`.mid`~~, and `.mp3` files determines which song plays in battle for the client. only `.wav`,
supported. ~~Only `.mid` files are not affected by volume options (master and ~~`.mid`~~, `.mp3`, and `.ogg` files supported. ~~Only `.mid` files are not
music sliders))~~ Midi file playback has been disabled for now due to lack of volume affected by volume options (master and music sliders))~~ Midi file playback
control issues. MP3 file playback sometimes fails, but seems to work better when the has been disabled for now due to lack of volume control issues. MP3 file
file is as "barebones" as possible (no album art metadata in the file). playback sometimes fails, but seems to work better when the file is as
"barebones" as possible (no album art metadata in the file). It is recommended
to use `.ogg` files for music. Note that ogg Vorbis is supported, and NOT ogg
Opus. One can convert to ogg Vorbis with ffmpeg like this: `ffmpeg -i
<my_music_file_to_convert> -map a:0 -c:a libvorbis output.ogg`.
- Config allows limiting number of combatants in turn-based battle. - Config allows limiting number of combatants in turn-based battle.
- Config can be modified (server-side) to add entries of mobs from other mods. - Config can be modified (server-side) to add entries of mobs from other mods.
(by default an unknown mob cannot enter turn-based battle, so the config must be (by default an unknown mob cannot enter turn-based battle, so the config must be
@ -65,7 +69,8 @@ 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-NeoForge-1.24.0-all.jar" finished jar will be saved at
`build/libs/TurnBasedMinecraft-NeoForge-1.25.0-all.jar`
# Reproducibility # Reproducibility
@ -74,6 +79,10 @@ more details.
# Other notes # Other notes
This mod uses [j-ogg-vorbis](https://github.com/stephengold/j-ogg-all)
available from [http://www.j-ogg.de](http://www.j-ogg.de) and copyrighted by
Tor-Einar Jarnbjo.
This mod also uses [JavaMP3](https://github.com/kevinstadler/JavaMP3) This mod also uses [JavaMP3](https://github.com/kevinstadler/JavaMP3)
which is licensed under the [MIT License](https://github.com/kevinstadler/JavaMP3/blob/master/LICENSE). which is licensed under the [MIT License](https://github.com/kevinstadler/JavaMP3/blob/master/LICENSE).

View file

@ -4,6 +4,32 @@ Starting with version 1.24.0 of this mod, this file will list what version of
Java was used to compile the jars. In theory, using the same version of Java Java was used to compile the jars. In theory, using the same version of Java
should result in an identical jar due to reproducible builds. should result in an identical jar due to reproducible builds.
## NeoForge 1.25.0
$ java --version
openjdk 17.0.9 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+8)
OpenJDK 64-Bit Server VM (build 17.0.9+8, mixed mode)
$ javac --version
javac 17.0.9
$ sha256sum build/libs/TurnBasedMinecraft-NeoForge-1.25.0-all.jar
0e5eacc8aefd3b1a1c8e6c9657108172934fae2e727547ca7c12f9ff79ce4e8e build/libs/TurnBasedMinecraft-NeoForge-1.25.0-all.jar
## Forge 1.25.0
$ java --version
openjdk 17.0.9 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+8)
OpenJDK 64-Bit Server VM (build 17.0.9+8, mixed mode)
$ javac --version
javac 17.0.9
$ sha256sum build/libs/TurnBasedMinecraft-Forge-1.25.0-all.jar
51ef854552b180df68969f4cec6fdc8716ef519b947948b9e5f4ce9953d00162 build/libs/TurnBasedMinecraft-Forge-1.25.0-all.jar
## NeoForge 1.24.0 ## NeoForge 1.24.0
$ java --version $ java --version

View file

@ -5,7 +5,7 @@ plugins {
id 'net.neoforged.gradle.userdev' version '7.0.57' id 'net.neoforged.gradle.userdev' version '7.0.57'
} }
version = "1.24.0" version = "1.25.0"
group = "com.burnedkirby.TurnBasedMinecraft" group = "com.burnedkirby.TurnBasedMinecraft"
archivesBaseName = "TurnBasedMinecraft-NeoForge" archivesBaseName = "TurnBasedMinecraft-NeoForge"
@ -81,9 +81,13 @@ dependencies {
// implementation files('libs/javamp3-1.0.3.jar') // implementation files('libs/javamp3-1.0.3.jar')
implementation 'fr.delthas:javamp3:1.0.3' implementation 'fr.delthas:javamp3:1.0.3'
implementation 'com.github.stephengold:j-ogg-vorbis:1.0.4'
jarJar(group: 'fr.delthas', name: 'javamp3', version: '[1.0.0,2.0.0)') { jarJar(group: 'fr.delthas', name: 'javamp3', version: '[1.0.0,2.0.0)') {
jarJar.pin(it, '1.0.3') 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.

View file

@ -10,7 +10,7 @@ minecraft_version=1.20.2
# as they do not follow standard versioning conventions. # as they do not follow standard versioning conventions.
minecraft_version_range=[1.20.2,1.21) minecraft_version_range=[1.20.2,1.21)
# The Neo version must agree with the Minecraft version to get a valid artifact # The Neo version must agree with the Minecraft version to get a valid artifact
neo_version=20.2.86 neo_version=20.2.88
# The Neo version range can use any version of Neo as bounds or match the loader version range # The Neo version range can use any version of Neo as bounds or match the loader version range
neo_version_range=[20.2,) neo_version_range=[20.2,)
# The loader version range can only use the major version of Neo/FML as bounds # The loader version range can only use the major version of Neo/FML as bounds
@ -26,7 +26,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

@ -40,7 +40,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.1", "mcversion": "1.20.1",
"url": "", "url": "",
"updateUrl": "", "updateUrl": "",