Compare commits

..

No commits in common. "3a6d800745e067151596eb37c44d0310e9300692" and "f687dfdaf39592d893c25f8c8dbf3873da59cd99" have entirely different histories.

9 changed files with 41 additions and 191 deletions

View file

@ -1,4 +1,4 @@
name: Build TurnBasedMC and create Release name: Build TurnBasedMC and store Artifact
on: on:
push: push:
tags: tags:
@ -10,7 +10,7 @@ jobs:
steps: steps:
- run: git clone --depth=1 --no-single-branch https://git.seodisparate.com/stephenseo/TurnBasedMinecraftMod.git TurnBasedMinecraftMod - run: git clone --depth=1 --no-single-branch https://git.seodisparate.com/stephenseo/TurnBasedMinecraftMod.git TurnBasedMinecraftMod
- run: cd TurnBasedMinecraftMod && git checkout ${GITHUB_REF_NAME} - run: cd TurnBasedMinecraftMod && git checkout ${GITHUB_REF_NAME}
- run: cd TurnBasedMinecraftMod && sed -i '/org.gradle.jvmargs/s/Xmx[0-9]\+m/Xmx1024m/' gradle.properties - run: cd TurnBasedMinecraftMod && sed -i '/org.gradle.jvmargs/s/Xmx[0-9]\+m/Xmx700m/' gradle.properties
- run: cd TurnBasedMinecraftMod && ./gradlew --console=plain build - run: cd TurnBasedMinecraftMod && ./gradlew --console=plain build
- run: cd TurnBasedMinecraftMod/build/libs && find . -type f -exec sha256sum '{}' ';' -exec bash -c 'sha256sum {} >> sha256sums.txt' ';' && java --version >> javaVersion.txt && javac --version >> javaVersion.txt - run: cd TurnBasedMinecraftMod/build/libs && find . -type f -exec sha256sum '{}' ';' -exec bash -c 'sha256sum {} >> sha256sums.txt' ';' && java --version >> javaVersion.txt && javac --version >> javaVersion.txt
- name: Create release and attach jar - name: Create release and attach jar
@ -24,7 +24,6 @@ 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/master/Changelog.md) \"body\": \"See the [Changelog](https://git.seodisparate.com/stephenseo/TurnBasedMinecraftMod/src/branch/master/Changelog.md)
(Using OpenJDK Java.)
$(javac --version) $(javac --version)
$(find TurnBasedMinecraftMod/build/libs -regex '.*[0-9].jar$' -exec sha256sum '{}' ';')\", $(find TurnBasedMinecraftMod/build/libs -regex '.*[0-9].jar$' -exec sha256sum '{}' ';')\",
\"tag_name\": \"${GITHUB_REF_NAME}\" \"tag_name\": \"${GITHUB_REF_NAME}\"

View file

@ -1,13 +1,5 @@
# Upcoming changes # Upcoming changes
# 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,18 +45,14 @@ 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 - Supports custom battle music to be played when fighting enemies. (They must be
be placed in `.minecraft/config/TurnBasedMinecraft/Music/battle` or placed in `.minecraft/config/TurnBasedMinecraft/Music/battle` or
`.minecraft/config/TurnBasedMinecraft/Music/silly`. Client-side config `.minecraft/config/TurnBasedMinecraft/Music/silly`. Client-side config determines
determines which song plays in battle for the client. only `.wav`, which song plays in battle for the client. only `.wav`, ~~`.mid`~~, and `.mp3` files
~~`.mid`~~, `.mp3`, and `.ogg` files supported. ~~Only `.mid` files are not supported. ~~Only `.mid` files are not affected by volume options (master and
affected by volume options (master and music sliders))~~ Midi file playback music sliders))~~ Midi file playback has been disabled for now due to lack of volume
has been disabled for now due to lack of volume control issues. MP3 file control issues. MP3 file playback sometimes fails, but seems to work better when the
playback sometimes fails, but seems to work better when the file is as file is as "barebones" as possible (no album art metadata in the file).
"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
@ -69,8 +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 finished jar will be saved at "build/libs/TurnBasedMinecraft-Forge-1.24.0.jar"
`build/libs/TurnBasedMinecraft-Forge-1.25.0-all.jar`
# Reproducibility # Reproducibility
@ -79,9 +74,8 @@ more details.
# Other notes # Other notes
This mod uses [j-ogg-vorbis](https://github.com/stephengold/j-ogg-all) available This mod uses [shadow](https://github.com/johnrengelman/shadow) which is
from [http://www.j-ogg.de](http://www.j-ogg.de) and copyrighted by Tor-Einar licenced under the [Apache License 2.0](https://github.com/johnrengelman/shadow/blob/master/LICENSE).
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,19 +4,6 @@ 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.
## 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

@ -3,17 +3,16 @@ 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.25.0" version = "1.24.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.
@ -138,10 +137,11 @@ sourceSets.main.resources { srcDir 'src/generated/resources' }
// } // }
//} //}
repositories { apply plugin: 'com.github.johnrengelman.shadow'
flatDir {
dir 'libs' configurations {
} shade
impelmentation.extendsFrom shade
} }
dependencies { dependencies {
@ -161,16 +161,9 @@ 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'
implementation 'com.github.stephengold:j-ogg-vorbis:1.0.4' shade files('libs/javamp3-1.0.3.jar')
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.
@ -210,6 +203,20 @@ 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.25.0 mod_version=1.24.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,7 +1,6 @@
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;
@ -29,9 +28,7 @@ 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)
{ {
@ -84,7 +81,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") || ext.equals("ogg"); // midi disabled return ext.equals("wav") || ext.equals("mp3"); // midi disabled
} }
}); });
for(File f : battleFiles) for(File f : battleFiles)
@ -104,7 +101,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") || ext.equals("ogg"); // midi disabled return ext.equals("wav") || ext.equals("mp3"); // midi disabled
} }
}); });
for(File f : sillyFiles) for(File f : sillyFiles)
@ -306,39 +303,6 @@ 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;
}
}
} }
} }
@ -356,10 +320,6 @@ 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();
@ -494,93 +454,4 @@ 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.25.0"; public static final String VERSION = "1.24.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.25.0", "version": "1.24.0",
"mcversion": "1.20.2", "mcversion": "1.20.2",
"url": "", "url": "",
"updateUrl": "", "updateUrl": "",