diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 953e496..b08afd7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ on: - '**/src/**' - '.github/**' branches: - - 1605 + - 1605-fabric jobs: build: @@ -26,7 +26,7 @@ jobs: - name: Grant execute permission for gradle run: chmod +x gradlew - - name: Upload to CurseForge + - name: Upload to CurseForge & Modrinth run: ./gradlew publish modPublish --stacktrace if: | !contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.pull_request.title, '[ci skip]') diff --git a/build.gradle b/build.gradle index a860cca..757b32f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,78 +1,110 @@ plugins { - id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.1-SNAPSHOT" apply false + id 'fabric-loom' version '1.0-SNAPSHOT' id "me.shedaniel.unified-publishing" version "0.1.+" - id "com.github.breadmoirai.github-release" version "2.4.1" } -architectury { - minecraft = rootProject.minecraft_version -} +def runNumber = (System.getenv("GITHUB_RUN_NUMBER") == null ? "9999" : System.getenv('GITHUB_RUN_NUMBER')) + +archivesBaseName = project.archives_base_name +version = project.mod_version + "." + runNumber +group = project.maven_group -subprojects { - apply plugin: "dev.architectury.loom" - loom { - silentMojangMappingsLicense() +repositories { + // Add repositories to retrieve artifacts from in here. + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html + // for more information about repositories. + maven { + url = "https://maven.parchmentmc.org" + } + maven { + url = "https://maven.kosmx.dev" + } + maven { + url = "https://maven.maxhenkel.de/repository/public" + } + maven { + url = "https://api.modrinth.com/maven" } +} - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - // The following line declares the mojmap mappings, you may use other mappings as well - mappings loom.officialMojangMappings() - // The following line declares the yarn mappings you may select this one as well. - // mappings "net.fabricmc:yarn:1.16.5+build.10:v2" +dependencies { + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings loom.layered() { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-1.16.5:2022.03.06@zip") } + + modImplementation "net.fabricmc:fabric-loader:${project.fabric_loader_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" + + modImplementation "de.maxhenkel.voicechat:voicechat-api:${project.voicechat_api}" + modImplementation "maven.modrinth:simple-voice-chat:fabric-${project.voicechat}" + + modImplementation "io.github.kosmx.emotes:emotesMain:${project.emotecraft}" + modImplementation "dev.kosmx.player-anim:player-animation-lib-fabric:${project.player_animation_lib}" + modImplementation "maven.modrinth:emotecraft:${project.emotecraft}+${project.minecraft_version}-fabric" + } -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" +processResources { + inputs.property "version", project.version + filteringCharset "UTF-8" - def runNumber = (System.getenv("GITHUB_RUN_NUMBER") == null ? "9999" : System.getenv('GITHUB_RUN_NUMBER')) + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} - archivesBaseName = rootProject.archives_base_name - version = rootProject.mod_version + "." + runNumber - group = rootProject.maven_group +tasks.withType(JavaCompile) { + options.encoding = "UTF-8" + options.release = 17 +} - repositories { - // Add repositories to retrieve artifacts from in here. - // You should only use this when depending on other mods because - // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. - // See https://docs.gradle.org/current/userguide/declaring_repositories.html - // for more information about repositories. - maven { - url = "https://maven.parchmentmc.org" - } - maven { - url = "https://maven.kosmx.dev" - } - maven { - url = "https://maven.maxhenkel.de/repository/public" - } - maven { - url = "https://api.modrinth.com/maven" - } +jar { + from("LICENSE") { + rename { "${it}_${archivesBaseName}+${version}" } } +} + +unifiedPublishing { + project { + displayName = "[Fabric $project.minecraft_version] v$project.version" + releaseType = "release" + gameVersions = ["1.16.5"] + gameLoaders = ["fabric"] - tasks.withType(JavaCompile) { - options.encoding = "UTF-8" + mainPublication remapJar - // The Minecraft launcher currently installs Java 8 for users, so your mod probably wants to target Java 8 too - // JDK 9 introduced a new way of specifying this that will make sure no newer classes or methods are used. - // We'll use that if it's available, but otherwise we'll use the older option. - def targetVersion = 8 - if (JavaVersion.current().isJava9Compatible()) { - options.release = targetVersion + relations { + depends { + curseforge = modrinth = "emotecraft" + } + depends { + curseforge = modrinth = "simple-voice-chat" + } } - } - java { - withSourcesJar() + if (project.hasProperty("curse_api_key") || System.getenv("curse_api_key") != null) { + curseforge { + token = project.hasProperty("curse_api_key") ? project.property("curse_api_key") : System.getenv("curse_api_key") + id = project.curseforge_id + gameVersions.addAll "Java 8" + } + } + + if (project.hasProperty("modrinth_key") || System.getenv("modrinth_key") != null) { + modrinth { + token = project.hasProperty("modrinth_key") ? project.property("modrinth_key") : System.getenv("modrinth_key") + id = project.modrinth_id + version = "$project.version+fabric" + } + } } } -task modPublish +task modPublish \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index a2bd785..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -architectury { - common(rootProject.enabled_platforms.split(",")) -} - -dependencies { - // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies - // Do NOT use other classes from fabric loader - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - // Remove the next line if you don't want to depend on the API - modApi "me.shedaniel:architectury:${rootProject.architectury_version}" - - modApi "de.maxhenkel.voicechat:voicechat-api:${rootProject.voicechat_api}" - modApi "maven.modrinth:simple-voice-chat:fabric-${rootProject.voicechat}" - - modApi "dev.kosmx.player-anim:player-animation-lib:${rootProject.player_animation_lib}" - modApi "io.github.kosmx.emotes:emotesMain:${rootProject.emotecraft}" - modImplementation "maven.modrinth:emotecraft:${rootProject.emotecraft}+1.16.5-fabric" - -} - -publishing { - publications { - mavenCommon(MavenPublication) { - artifactId = rootProject.archives_base_name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - } -} diff --git a/common/run/logs/debug.log b/common/run/logs/debug.log deleted file mode 100644 index d46d6de..0000000 --- a/common/run/logs/debug.log +++ /dev/null @@ -1,26 +0,0 @@ -[17:23:02] [main/INFO] (FabricLoader/GameProvider) Loading Minecraft 1.16.5 with Fabric Loader 0.14.19 -[17:23:02] [main/DEBUG] (FabricLoader/GamePatch) Found game constructor: net.minecraft.client.main.Main -> net.minecraft.client.Minecraft -[17:23:02] [main/DEBUG] (FabricLoader/GamePatch) Patching game constructor (Lnet/minecraft/client/main/GameConfig;)V -[17:23:02] [main/DEBUG] (FabricLoader/GamePatch) Run directory field is thought to be net/minecraft/client/Minecraft/gameDirectory -[17:23:02] [main/DEBUG] (FabricLoader/GamePatch) Applying brand name hook to net/minecraft/client/ClientBrandRetriever::getClientModName -[17:23:02] [main/DEBUG] (FabricLoader/GamePatch) Applying brand name hook to net/minecraft/server/MinecraftServer::getServerModName -[17:23:02] [main/DEBUG] (FabricLoader/GamePatch) Patched 3 classs -[17:23:02] [main/DEBUG] (FabricLoader/Discovery) Mod discovery time: 15.4 ms -[17:23:02] [main/WARN] (FabricLoader/Resolution) Mod resolution failed -[17:23:02] [main/INFO] (FabricLoader/Resolution) Immediate reason: [HARD_DEP_NO_CANDIDATE emotecraft 2.2.7-b.build.47 {depends fabric @ [>=0.16.4]}, ROOT_FORCELOAD_SINGLE emotecraft 2.2.7-b.build.47] -[17:23:02] [main/INFO] (FabricLoader/Resolution) Reason: [HARD_DEP emotecraft 2.2.7-b.build.47 {depends fabric @ [>=0.16.4]}, HARD_DEP emotecraft 2.2.7-b.build.47 {depends player-animator @ [*]}] -[17:23:02] [main/INFO] (FabricLoader/Resolution) Fix: add [], remove [], replace [[emotecraft 2.2.7-b.build.47] -> add:emotecraft 1 ([(-?,?)])] -[17:23:02] [main/ERROR] (FabricLoader) Incompatible mod set! -net.fabricmc.loader.impl.FormattedException: Mod resolution encountered an incompatible mod set! -A potential solution has been determined: - - Replace mod 'Emotecraft' (emotecraft) 2.2.7-b.build.47 with any version that is compatible with: - - Other constraints that can''t be automatically determined -Unmet dependency listing: - - Mod 'Emotecraft' (emotecraft) 2.2.7-b.build.47 requires version 0.16.4 or later of fabric, which is missing! - - Mod 'Emotecraft' (emotecraft) 2.2.7-b.build.47 requires any version of player-animator, which is missing! - at net.fabricmc.loader.impl.FormattedException.ofLocalized(FormattedException.java:51) ~[fabric-loader-0.14.19.jar:?] - at net.fabricmc.loader.impl.FabricLoaderImpl.load(FabricLoaderImpl.java:192) ~[fabric-loader-0.14.19.jar:?] - at net.fabricmc.loader.impl.launch.knot.Knot.init(Knot.java:148) ~[fabric-loader-0.14.19.jar:?] - at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:68) [fabric-loader-0.14.19.jar:?] - at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23) [fabric-loader-0.14.19.jar:?] - at net.fabricmc.devlaunchinjector.Main.main(Main.java:86) [dev-launch-injector-0.2.1+build.8.jar:?] diff --git a/common/src/main/java/dev/bsmp/emotetweaks/util/EmoteProperties.java b/common/src/main/java/dev/bsmp/emotetweaks/util/EmoteProperties.java deleted file mode 100644 index 26864db..0000000 --- a/common/src/main/java/dev/bsmp/emotetweaks/util/EmoteProperties.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.bsmp.emotetweaks.util; - -import dev.architectury.injectables.annotations.ExpectPlatform; - -import java.nio.file.Path; -import java.util.UUID; - -public class EmoteProperties { - - @ExpectPlatform - public static Path getGameDir() { - throw new AssertionError(); - } -} diff --git a/common/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXPacket.java b/common/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXPacket.java deleted file mode 100644 index baac51d..0000000 --- a/common/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXPacket.java +++ /dev/null @@ -1,53 +0,0 @@ -package dev.bsmp.emotetweaks.voicefx; - -import de.maxhenkel.voicechat.Voicechat; -import de.maxhenkel.voicechat.api.events.SoundPacketEvent; -import de.maxhenkel.voicechat.voice.common.LocationSoundPacket; -import de.maxhenkel.voicechat.voice.server.ServerWorldUtils; -import me.shedaniel.architectury.networking.NetworkManager; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; - -import java.util.UUID; - -public class SFXPacket { - UUID uuid; - byte[] frame; - long sequenceNumber; - - public SFXPacket(){} - public SFXPacket(UUID uuid, byte[] frame, long sequenceNumber) { - this.uuid = uuid; - this.frame = frame; - this.sequenceNumber = sequenceNumber; - } - - public static void encode(SFXPacket msg, FriendlyByteBuf buf) { - buf.writeUUID(msg.uuid); - buf.writeByteArray(msg.frame); - buf.writeLong(msg.sequenceNumber); - } - - public static SFXPacket decode(FriendlyByteBuf buf) { - return new SFXPacket(buf.readUUID(), buf.readByteArray(), buf.readLong()); - } - - public static void handleMessage(FriendlyByteBuf msg, NetworkManager.PacketContext contextSupplier) { - UUID uuid = msg.readUUID(); - byte[] frame = msg.readByteArray(); - long sequenceNumber = msg.readLong(); - ServerPlayer player = (ServerPlayer) contextSupplier.getPlayer(); - - - //ToDo: Check Distance and maybe add custom category for EmoteFX? - LocationSoundPacket packet = new LocationSoundPacket(uuid, player.position(), frame, sequenceNumber, 15f, null); - Voicechat.SERVER.getServer().broadcast( - ServerWorldUtils.getPlayersInRange(player.getLevel(), player.position(), Voicechat.SERVER_CONFIG.voiceChatDistance.get(), p -> p != player), -// ServerWorldUtils.getPlayersInRange(serverPlayer.getWorld(), serverPlayer.getPos(), Voicechat.SERVER_CONFIG.voiceChatDistance.get(), p -> true), - packet, - null, null, null, - SoundPacketEvent.SOURCE_PROXIMITY - ); - } - -} diff --git a/common/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXThread.java b/common/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXThread.java deleted file mode 100644 index e2809a3..0000000 --- a/common/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXThread.java +++ /dev/null @@ -1,94 +0,0 @@ -package dev.bsmp.emotetweaks.voicefx; - -import de.maxhenkel.voicechat.Voicechat; -import de.maxhenkel.voicechat.api.opus.OpusEncoder; -import de.maxhenkel.voicechat.voice.client.ClientManager; -import de.maxhenkel.voicechat.voice.common.LocationSoundPacket; -import io.netty.buffer.Unpooled; -import me.shedaniel.architectury.networking.NetworkManager; -import net.minecraft.client.Minecraft; -import net.minecraft.network.FriendlyByteBuf; - -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.UnsupportedAudioFileException; -import java.io.IOException; -import java.util.UUID; - -import static dev.bsmp.emotetweaks.emotetweaks.EmoteTweaksMain.PACKET_ID; - -public class SFXThread extends Thread { - - private final OpusEncoder encoder; - private final UUID uuid; - private boolean started; - private AudioInputStream stream; - - private SFXThread(UUID uuid, OpusEncoder encoder, AudioInputStream stream) { - this.uuid = uuid; - this.encoder = encoder; - this.stream = stream; - - this.setDaemon(true); - } - - @Override - public void run() { - int framePosition = 0; - long startTime = System.nanoTime(); - - try { - byte[] bytes = new byte[1920]; - short[] frame; - while ((stream.read(bytes) != -1) && !isInterrupted()) { -// while ((frame = getFrameData(framePosition)) != null && !isInterrupted()) { - frame = SoundPlugin.voicechatApi.getAudioConverter().bytesToShorts(bytes); - bytes = new byte[1920]; - - if (frame.length != 960) { - Voicechat.LOGGER.error("Got invalid audio frame size {}!={}", frame.length, 960); - break; - } - - //Send Data Packet - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); - buf.writeUUID(uuid); - buf.writeByteArray(encoder.encode(frame)); - buf.writeLong(framePosition); - NetworkManager.sendToServer(PACKET_ID, buf); - - short[] finalFrame = frame; - - Minecraft.getInstance().execute(() -> ClientManager.getClient().processSoundPacket(new LocationSoundPacket(uuid, finalFrame, Minecraft.getInstance().player.position(), 15f, null))); - - ++framePosition; - long waitTimestamp = startTime + (long) framePosition * 20000000L; - long waitNanos = waitTimestamp - System.nanoTime(); - - try { - if (waitNanos > 0L) { - Thread.sleep(waitNanos / 1000000L, (int) (waitNanos % 1000000L)); - } - } catch (InterruptedException var10) { - break; - } - } - } - catch (IOException e) { - throw new RuntimeException(e); - } - - this.encoder.close(); - } - - public void startPlaying() { - if (!this.started) { - this.start(); - this.started = true; - } - } - - public static SFXThread playSFX(AudioInputStream stream) throws UnsupportedAudioFileException, IOException { - return new SFXThread(UUID.randomUUID(), SoundPlugin.voicechatApi.createEncoder(), stream); - } - -} diff --git a/common/src/main/resources/META-INF/accesstransformer.cfg b/common/src/main/resources/META-INF/accesstransformer.cfg deleted file mode 100644 index e69de29..0000000 diff --git a/common/src/main/resources/META-INF/mods.toml b/common/src/main/resources/META-INF/mods.toml deleted file mode 100644 index f2f8a39..0000000 --- a/common/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,52 +0,0 @@ -# This is an example mods.toml file. -# Any fields that aren't annotated with #optional are *required*! -modLoader = "javafml" -loaderVersion = "[36,)" -license = "MIT" # Want to make your mod open source? Check out https://choosealicense.com/! - -# This is a URL to e.g. your GitHub or CurseForge issues page. -# It will appear in any crash reports this mod is directly involved in. -# issueTrackerURL="https://github.com/invalid/pleasechangeme/issues" #optional -# A list of mods - how many allowed here is determined by the individual mod loader - -[[mods]] -modId = "emotetweaks" -# The version number of the mod - unlike in the Forge MDK, -# we'll use the processResources task to replace this for us -version = "${version}" -displayName = "Emote Tweaks" -# This URL will be queried by the Forge update checker in order to find the latest version of your mod. -# If an update is found, you'll see a little blinking "emerald" symbol on your Mods button! -# updateJSONURL="https://changeme.dev/updates.json" #optional -# This is your mod's "homepage" and will be displayed on the mod's information screen in the Mods panel. -# displayURL="https://changeme.dev/" #optional -# This will be displayed as your mod's logo in the Mods panel. -# logoFile="icon.png" #optional -# Some more fluff displayed in the Mods panel. Feel free to issue your special thanks here! -# credits="Thanks to Mojang for making this great game" #optional -# Some more fluff displayed in the Mods panel. Plug your stuff here! -authors="RyanV" -# A multi-line description for your mod. This has no minimum length, but it *is* required! -description = '''Mod for allowing some Tweaked functionality of EmoteCraft''' - -# An (optional) dependency for your mod. Though technically not required, -# it's always helpful to add these to stop your mod from loading when something is missing -# rather than erroring out later -[[dependencies.emotetweaks]] -modId = "forge" -mandatory = true # do you **need** this mod to be able to launch? -# A version range using interval notation. -# Brackets mean "inclusive" bounds, while parentheses mean "exclusive". -versionRange = "[36,)" # This essentially means any forge >= 40 -ordering = "NONE" # Use this if you want your mod to be loaded specifically BEFORE or AFTER another mod -side = "BOTH" # Specify where this mod is required: can be BOTH, CLIENT or SERVER - -# And another dependency, use this if you want to require a certain Minecraft version. -[[dependencies.emotetweaks]] -modId = "minecraft" -mandatory = true -# See above for how to read this notation, this essentially means any -# version of Minecraft from 1.18.2 (inclusive). -versionRange = "[1.16.5,)" -ordering = "NONE" -side = "BOTH" diff --git a/common/src/main/resources/pack.mcmeta b/common/src/main/resources/pack.mcmeta deleted file mode 100644 index cc40243..0000000 --- a/common/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "Resources for EmoteTweaks", - "pack_format": 6 - } -} diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index d9f5eb6..0000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,133 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "7.1.2" - id "me.shedaniel.unified-publishing" -} - -architectury { - platformSetupLoomIde() - fabric() -} - -configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common -} - -dependencies { - modApi "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" - // Remove the next line if you don't want to depend on the API - modApi "me.shedaniel:architectury-fabric:${rootProject.architectury_version}" - - modApi "de.maxhenkel.voicechat:voicechat-api:${rootProject.voicechat_api}" - modApi "maven.modrinth:simple-voice-chat:fabric-${rootProject.voicechat}" - - modApi "io.github.kosmx.emotes:emotesMain:${rootProject.emotecraft}" - modApi "dev.kosmx.player-anim:player-animation-lib-fabric:${rootProject.player_animation_lib}" - modApi "maven.modrinth:emotecraft:${rootProject.emotecraft}+1.16.5-fabric" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } -} - -processResources { - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} - -shadowJar { - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - classifier "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar - classifier "fabric" - - from rootProject.file("LICENSE.md") -} - -jar { - classifier "dev" -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - from project(":common").sourcesJar { - exclude('EmoteTweaks.mixins.json') - } - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } - -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -unifiedPublishing { - project { - displayName = "[Fabric $rootProject.minecraft_version] v$project.version" - releaseType = "release" - gameVersions = ["1.16.5"] - gameLoaders = ["fabric"] - - mainPublication remapJar - - relations { - depends { - curseforge = modrinth = "emotecraft" - } - depends { - curseforge = modrinth = "simple-voice-chat" - } - depends { - curseforge = modrinth = "architectury-api" - } - } - - if (project.hasProperty("curse_api_key") || System.getenv("curse_api_key") != null) { - curseforge { - token = project.hasProperty("curse_api_key") ? project.property("curse_api_key") : System.getenv("curse_api_key") - id = project.curseforge_id - gameVersions.addAll "Java 8" - } - } - - if (project.hasProperty("modrinth_key") || System.getenv("modrinth_key") != null) { - modrinth { - token = project.hasProperty("modrinth_key") ? project.property("modrinth_key") : System.getenv("modrinth_key") - id = project.modrinth_id - version = "$project.version+$project.name" - } - } - } -} - - -publishing { - publications { - mavenFabric(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - } -} - -rootProject.tasks.getByName("modPublish").dependsOn tasks.getByName("publishUnified") \ No newline at end of file diff --git a/fabric/src/main/java/dev/bsmp/emotetweaks/emotetweaks/fabric/EmoteTweaksFabric.java b/fabric/src/main/java/dev/bsmp/emotetweaks/emotetweaks/fabric/EmoteTweaksFabric.java deleted file mode 100644 index 0ad4cdf..0000000 --- a/fabric/src/main/java/dev/bsmp/emotetweaks/emotetweaks/fabric/EmoteTweaksFabric.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.bsmp.emotetweaks.emotetweaks.fabric; - -import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaksMain; -import dev.bsmp.emotetweaks.emotetweaks.client.EmoteTweaksClient; -import net.fabricmc.api.ModInitializer; - - -public class EmoteTweaksFabric implements ModInitializer { - @Override - public void onInitialize() { - new EmoteTweaksMain(); - } - -} - diff --git a/fabric/src/main/java/dev/bsmp/emotetweaks/util/fabric/EmotePropertiesImpl.java b/fabric/src/main/java/dev/bsmp/emotetweaks/util/fabric/EmotePropertiesImpl.java deleted file mode 100644 index 0fa7f72..0000000 --- a/fabric/src/main/java/dev/bsmp/emotetweaks/util/fabric/EmotePropertiesImpl.java +++ /dev/null @@ -1,11 +0,0 @@ -package dev.bsmp.emotetweaks.util.fabric; - -import net.fabricmc.loader.api.FabricLoader; - -import java.nio.file.Path; - -public class EmotePropertiesImpl { - public static Path getGameDir() { - return FabricLoader.getInstance().getGameDir(); - } -} diff --git a/fabric/src/main/resources/EmoteTweaks.mixins.json b/fabric/src/main/resources/EmoteTweaks.mixins.json deleted file mode 100644 index adbf08e..0000000 --- a/fabric/src/main/resources/EmoteTweaks.mixins.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "required": true, - "package": "dev.bsmp.emotetweaks.emotetweaks.mixin", - "compatibilityLevel": "JAVA_8", - "minVersion": "0.8", - "client": [ - "ClientConfigSerializerMixin", - "ClientEmotePlayMixin", - "DefaultsMixin", - "EmoteHolderMixin", - "EmoteScreenMixin", - "KeyMixin" - ], - "mixins": [ - "AnimationBinaryMixin", - "AnimationJsonMixin", - "KeyframeAnimationPlayerMixin", - "NetDataAccessor", - "ServerEmotePlayMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} \ No newline at end of file diff --git a/forge/build.gradle b/forge/build.gradle deleted file mode 100644 index b873724..0000000 --- a/forge/build.gradle +++ /dev/null @@ -1,151 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" version "7.1.2" - id "me.shedaniel.unified-publishing" -} - -architectury { - platformSetupLoomIde() - forge() -} - - -loom { - //accessWidenerPath = project(":common").loom.accessWidenerPath - - forge { - // convertAccessWideners = true - //extraAccessWideners.add loom.accessWidenerPath.get().asFile.name - - mixinConfig "EmoteTweaks.mixins.json" - } - -} - -configurations { - dev - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentForge.extendsFrom common -} - -artifacts { - dev(jar) -} - -dependencies { - forge "net.minecraftforge:forge:${rootProject.forge_version}" - // Remove the next line if you don't want to depend on the API - modApi "me.shedaniel:architectury-forge:${rootProject.architectury_version}" - - modApi "de.maxhenkel.voicechat:voicechat-api:${rootProject.voicechat_api}" - modApi "maven.modrinth:simple-voice-chat:forge-${rootProject.voicechat}" - - modApi "dev.kosmx.player-anim:player-animation-lib-forge:${rootProject.player_animation_lib}" - modApi "io.github.kosmx.emotes:emotesMain:${rootProject.emotecraft}" - modImplementation "maven.modrinth:emotecraft:${rootProject.emotecraft}+1.16.5-forge" - - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } -} - -processResources { - inputs.property "version", project.version - - filesMatching("META-INF/mods.toml") { - expand "version": project.version - } -} - -shadowJar { - exclude "fabric.mod.json" - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - classifier "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar - classifier "forge" - - from rootProject.file("LICENSE.md") -} - -jar { - classifier "dev" -} - -sourcesJar { - def commonSources = project(":common").sourcesJar - from project(":common").sourcesJar { - exclude('META-INF/mods.toml') - exclude('pack.mcmeta') - } - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -unifiedPublishing { - project { - displayName = "[Forge $rootProject.minecraft_version] v$project.version" - releaseType = "release" - gameVersions = ["1.16.5"] - gameLoaders = ["forge"] - - mainPublication remapJar - - relations { - depends { - curseforge = "emotecraft-forge" - modrinth = "emotecraft" - } - depends { - curseforge = modrinth = "simple-voice-chat" - } - depends { - curseforge = modrinth = "architectury-api" - } - } - - if (project.hasProperty("curse_api_key") || System.getenv("curse_api_key") != null) { - curseforge { - token = project.hasProperty("curse_api_key") ? project.property("curse_api_key") : System.getenv("curse_api_key") - id = project.curseforge_id - gameVersions.addAll "Java 8" - } - } - - if (project.hasProperty("modrinth_key") || System.getenv("modrinth_key") != null) { - modrinth { - token = project.hasProperty("modrinth_key") ? project.property("modrinth_key") : System.getenv("modrinth_key") - id = project.modrinth_id - version = "$project.version+$project.name" - } - } - } -} - -publishing { - publications { - mavenForge(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - } -} - -rootProject.tasks.getByName("modPublish").dependsOn tasks.getByName("publishUnified") \ No newline at end of file diff --git a/forge/gradle.properties b/forge/gradle.properties deleted file mode 100644 index 32f842a..0000000 --- a/forge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform=forge \ No newline at end of file diff --git a/forge/src/main/java/dev/bsmp/emotetweaks/emotetweaks/forge/EmoteTweaksForge.java b/forge/src/main/java/dev/bsmp/emotetweaks/emotetweaks/forge/EmoteTweaksForge.java deleted file mode 100644 index 773e7de..0000000 --- a/forge/src/main/java/dev/bsmp/emotetweaks/emotetweaks/forge/EmoteTweaksForge.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.bsmp.emotetweaks.emotetweaks.forge; - -import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaksMain; -import me.shedaniel.architectury.platform.forge.EventBuses; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; - -@Mod(EmoteTweaksMain.MOD_ID) -public class EmoteTweaksForge { - - public EmoteTweaksForge() { - EventBuses.registerModEventBus(EmoteTweaksMain.MOD_ID, FMLJavaModLoadingContext.get().getModEventBus()); - new EmoteTweaksMain(); - } - -} - diff --git a/forge/src/main/java/dev/bsmp/emotetweaks/util/forge/EmotePropertiesImpl.java b/forge/src/main/java/dev/bsmp/emotetweaks/util/forge/EmotePropertiesImpl.java deleted file mode 100644 index ed23b8c..0000000 --- a/forge/src/main/java/dev/bsmp/emotetweaks/util/forge/EmotePropertiesImpl.java +++ /dev/null @@ -1,12 +0,0 @@ -package dev.bsmp.emotetweaks.util.forge; - -import net.minecraftforge.fml.loading.FMLLoader; - -import java.nio.file.Path; - -public class EmotePropertiesImpl { - - public static Path getGameDir() { - return FMLLoader.getGamePath(); - } -} diff --git a/forge/src/main/resources/EmoteTweaks.mixins.json b/forge/src/main/resources/EmoteTweaks.mixins.json deleted file mode 100644 index 56ed2d6..0000000 --- a/forge/src/main/resources/EmoteTweaks.mixins.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "dev.bsmp.emotetweaks.emotetweaks.mixin", - "compatibilityLevel": "JAVA_8", - "mixins": [ - "AnimationBinaryMixin", - "AnimationJsonMixin", - "KeyframeAnimationPlayerMixin", - "NetDataAccessor", - "ServerEmotePlayMixin" - ], - "client": [ - "ClientConfigSerializerMixin", - "ClientEmotePlayMixin", - "DefaultsMixin", - "EmoteHolderMixin", - "EmoteScreenMixin", - "KeyMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index bf4b084..0000000 --- a/forge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,33 +0,0 @@ -modLoader = "javafml" -loaderVersion = "[36,)" -#issueTrackerURL = "" -license = "MIT License" - -[[mods]] -modId = "emotetweaks" -version = "${version}" -displayName = "Emote Tweaks" -authors = "RyanV, Wolfie" -description = '''Mod for allowing some Tweaked functionality of EmoteCraft''' -#logoFile = "" - -[[dependencies.emotetweaks]] -modId = "forge" -mandatory = true -versionRange = "[36,)" -ordering = "NONE" -side = "BOTH" - -[[dependencies.emotetweaks]] -modId = "minecraft" -mandatory = true -versionRange = "[1.16.5,)" -ordering = "NONE" -side = "BOTH" - -[[dependencies.emotetweaks]] -modId = "architectury" -mandatory = true -versionRange = "[1.32.67,)" -ordering = "AFTER" -side = "BOTH" \ No newline at end of file diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta deleted file mode 100644 index a432349..0000000 --- a/forge/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "Resources for EmoteTweaks", - "pack_format": 6 - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index e58bb7a..4c6327a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,19 +1,14 @@ org.gradle.jvmargs=-Xmx2048M minecraft_version=1.16.5 -enabled_platforms=fabric,forge archives_base_name=EmoteTweaks -mod_version=1.0.2 +mod_version=1.0.3 maven_group=dev.bsmp.emoteTweaks -architectury_version=1.32.67 - -fabric_loader_version=0.14.19 +fabric_loader_version=0.15.6 fabric_api_version=0.42.0+1.16 - -forge_version=1.16.5-36.2.39 - +yarn_mappings=1.18.2+build.4 emotecraft=2.2.7-b.build.47 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c..7f93135 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 41dfb87..870dc35 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/EmoteTweaksMain.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/EmoteTweaks.java similarity index 56% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/EmoteTweaksMain.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/EmoteTweaks.java index 0416a78..f0e021a 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/EmoteTweaksMain.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/EmoteTweaks.java @@ -2,25 +2,24 @@ import dev.bsmp.emotetweaks.voicefx.SFXPacket; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; -import me.shedaniel.architectury.networking.NetworkManager; -import net.minecraft.resources.ResourceLocation; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import java.util.HashMap; import java.util.UUID; -public class EmoteTweaksMain { - public static final String MOD_ID = "emotetweaks"; - public static ResourceLocation PACKET_ID = new ResourceLocation("emotecraft", "main"); +public class EmoteTweaks implements ModInitializer { public static HashMap MODIFIERS = new HashMap<>(); public static Object2BooleanOpenHashMap CROUCH_CANCEL_MAP = new Object2BooleanOpenHashMap<>(); - public EmoteTweaksMain() { + @Override + public void onInitialize() { MODIFIERS.put(1, "SHIFT"); MODIFIERS.put(2, "CTRL"); MODIFIERS.put(4, "L ALT"); MODIFIERS.put(6, "R ALT"); - NetworkManager.registerReceiver(NetworkManager.c2s(), PACKET_ID, SFXPacket::handleMessage); + ServerPlayNetworking.registerGlobalReceiver(SFXPacket.PACKET_ID, SFXPacket::receiveMessage); } } diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/IEmoteScreen.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/IEmoteScreen.java similarity index 100% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/IEmoteScreen.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/IEmoteScreen.java diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/IMixedKey.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/IMixedKey.java similarity index 100% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/IMixedKey.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/IMixedKey.java diff --git a/src/main/java/dev/bsmp/emotetweaks/emotetweaks/SoundDataPacket.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/SoundDataPacket.java new file mode 100644 index 0000000..d9f5966 --- /dev/null +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/SoundDataPacket.java @@ -0,0 +1,71 @@ +package dev.bsmp.emotetweaks.emotetweaks; + +import dev.bsmp.emotetweaks.emotetweaks.mixin.NetDataAccessor; +import dev.kosmx.playerAnim.core.data.AnimationBinary; +import io.github.kosmx.emotes.common.network.objects.AbstractNetworkPacket; +import io.github.kosmx.emotes.common.network.objects.NetData; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class SoundDataPacket extends AbstractNetworkPacket { + public void write(ByteBuffer buf, NetData config) throws IOException { + List frames = (ArrayList) config.emoteData.extraData.get("sound_effects"); + buf.putInt(frames.size()); + Iterator framesOrSum = frames.iterator(); + + while (framesOrSum.hasNext()) { + SoundFrame frame = (SoundFrame) framesOrSum.next(); + buf.putInt(frame.tick); + AnimationBinary.putString(buf, frame.value); + } + + } + + public boolean read(ByteBuffer buf, NetData config, int version) throws IOException { + int size = buf.getInt(); + if (size <= 0) { + return false; + } else { + List soundFrames = new ArrayList<>(); + + for (int i = 0; i < size; ++i) { + soundFrames.add(new SoundFrame(buf.getInt(), AnimationBinary.getString(buf))); + } + + if (config.emoteData != null) { + config.emoteData.extraData.put("sound_effects", soundFrames); + } + + return true; + } + } + + public boolean doWrite(NetData config) { + return config.emoteData != null; + } + + public byte getID() { + return 69; + } + + public byte getVer() { + return 2; + } + + public int calculateSize(NetData config) { + int size = 4; + if (config.emoteData != null) { + List soundFrames = (List) config.emoteData.extraData.get("sound_effects"); + if (soundFrames != null) { + for (SoundFrame frame : soundFrames) { + size += frame.calculateSize(); + } + } + } + return size; + } +} diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/SoundFrame.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/SoundFrame.java similarity index 100% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/SoundFrame.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/SoundFrame.java diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/EmoteTweaksClient.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/EmoteTweaksClient.java similarity index 73% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/EmoteTweaksClient.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/EmoteTweaksClient.java index 9e64fb2..ab118d7 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/EmoteTweaksClient.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/EmoteTweaksClient.java @@ -1,17 +1,20 @@ package dev.bsmp.emotetweaks.emotetweaks.client; -import dev.bsmp.emotetweaks.voicefx.SoundPlugin; -import io.github.kosmx.emotes.api.events.client.ClientEmoteEvents; +import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; +import dev.bsmp.emotetweaks.voicefx.SoundPlugin; +import io.github.kosmx.emotes.api.events.client.ClientEmoteEvents; @Environment(EnvType.CLIENT) -public class EmoteTweaksClient { - public static void onInitializeClient() { +public class EmoteTweaksClient implements ClientModInitializer { + @Override + public void onInitializeClient() { ClientEmoteEvents.EMOTE_PLAY.register((emoteData, userID) -> { - if(userID == Minecraft.getInstance().player.getUUID()) + if(userID == Minecraft.getInstance().player.getUUID()) { SoundPlugin.stopSounds(); + } }); } } diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/ToggleButton.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/ToggleButton.java similarity index 76% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/ToggleButton.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/ToggleButton.java index c187f62..ca03a24 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/ToggleButton.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/client/ToggleButton.java @@ -1,9 +1,10 @@ package dev.bsmp.emotetweaks.emotetweaks.client; -import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaksMain; +import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaks; import dev.bsmp.emotetweaks.emotetweaks.IEmoteScreen; import io.github.kosmx.emotes.arch.gui.screen.IButtonImpl; import io.github.kosmx.emotes.main.screen.EmoteMenu; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import java.util.UUID; @@ -13,7 +14,7 @@ public class ToggleButton extends IButtonImpl { private boolean currentState = false; public ToggleButton(EmoteMenu parent, int x, int y, int width, int height, boolean state) { - super(x, y, width, height, new TextComponent(""+state), null); + super(x, y, width, height, new TextComponent("" + state), null); this.currentState = state; this.parent = parent; } @@ -26,9 +27,9 @@ public void onPress() { public void setCurrentState(boolean newState) { currentState = newState; parent.save = true; - setMessage(new TextComponent(""+currentState)); + setMessage(new TextComponent("" + currentState)); UUID uuid = ((IEmoteScreen)parent).getEmoteList().getSelectedEntry().getEmote().getUuid(); - EmoteTweaksMain.CROUCH_CANCEL_MAP.put(uuid, currentState); + EmoteTweaks.CROUCH_CANCEL_MAP.put(uuid, currentState); } public boolean getCurrentState() { diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/AnimationBinaryMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/AnimationBinaryMixin.java similarity index 100% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/AnimationBinaryMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/AnimationBinaryMixin.java diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/AnimationJsonMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/AnimationJsonMixin.java similarity index 100% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/AnimationJsonMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/AnimationJsonMixin.java diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientConfigSerializerMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientConfigSerializerMixin.java similarity index 80% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientConfigSerializerMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientConfigSerializerMixin.java index 4e65d42..07ed9ee 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientConfigSerializerMixin.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientConfigSerializerMixin.java @@ -11,8 +11,10 @@ import java.util.Map; import java.util.UUID; -import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaksMain; +import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaks; +import dev.kosmx.playerAnim.core.util.Pair; import io.github.kosmx.emotes.common.SerializableConfig; +import io.github.kosmx.emotes.executor.dataTypes.InputKey; import io.github.kosmx.emotes.main.config.ClientConfig; import io.github.kosmx.emotes.main.config.ClientConfigSerializer; @@ -26,7 +28,7 @@ private void deserializeCrouchCancels(JsonObject node, SerializableConfig sconfi private void crouchCancelDeserializer(JsonElement node) { for(Map.Entry element : node.getAsJsonObject().entrySet()) { - EmoteTweaksMain.CROUCH_CANCEL_MAP.put(UUID.fromString(element.getKey()), element.getValue().getAsBoolean()); + EmoteTweaks.CROUCH_CANCEL_MAP.put(UUID.fromString(element.getKey()), element.getValue().getAsBoolean()); } } @@ -37,7 +39,7 @@ private void serializeCrouchCancels(ClientConfig config, JsonObject node, Callba private JsonElement crouchCancelSerializer() { JsonObject array = new JsonObject(); - for(Map.Entry entry : EmoteTweaksMain.CROUCH_CANCEL_MAP.object2BooleanEntrySet()){ + for(Map.Entry entry : EmoteTweaks.CROUCH_CANCEL_MAP.object2BooleanEntrySet()){ array.addProperty(entry.getKey().toString(), entry.getValue()); } return array; diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientEmotePlayMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientEmotePlayMixin.java similarity index 78% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientEmotePlayMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientEmotePlayMixin.java index 5552a7c..bb99136 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientEmotePlayMixin.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ClientEmotePlayMixin.java @@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaksMain; +import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaks; import dev.kosmx.playerAnim.core.data.KeyframeAnimation; import io.github.kosmx.emotes.main.network.ClientEmotePlay; @@ -14,8 +14,8 @@ public abstract class ClientEmotePlayMixin { @Inject(method = "clientStartLocalEmote(Ldev/kosmx/playerAnim/core/data/KeyframeAnimation;)Z", at = @At("HEAD")) private static void attachData(KeyframeAnimation emote, CallbackInfoReturnable cir) { - if(EmoteTweaksMain.CROUCH_CANCEL_MAP.containsKey(emote.get())) { - boolean b = EmoteTweaksMain.CROUCH_CANCEL_MAP.getBoolean(emote.get()); + if(EmoteTweaks.CROUCH_CANCEL_MAP.containsKey(emote.get())) { + boolean b = EmoteTweaks.CROUCH_CANCEL_MAP.getBoolean(emote.get()); emote.extraData.put("crouchCancel", b); } } diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/DefaultsMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/DefaultsMixin.java similarity index 100% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/DefaultsMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/DefaultsMixin.java diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteHolderMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteHolderMixin.java similarity index 91% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteHolderMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteHolderMixin.java index 998f0c6..e02e115 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteHolderMixin.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteHolderMixin.java @@ -6,8 +6,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import com.mojang.blaze3d.platform.InputConstants; -import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaksMain; +import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaks; import dev.bsmp.emotetweaks.emotetweaks.IMixedKey; import dev.kosmx.playerAnim.core.data.KeyframeAnimation; import dev.kosmx.playerAnim.core.util.MathHelper; @@ -26,8 +27,8 @@ public abstract class EmoteHolderMixin { @Inject(method = "playEmote(Ldev/kosmx/playerAnim/core/data/KeyframeAnimation;Lio/github/kosmx/emotes/executor/emotePlayer/IEmotePlayerEntity;Lio/github/kosmx/emotes/main/EmoteHolder;)Z", at = @At("HEAD"), cancellable = true) private static void attachData(KeyframeAnimation emote, IEmotePlayerEntity player, EmoteHolder emoteHolder, CallbackInfoReturnable cir) { - if(EmoteTweaksMain.CROUCH_CANCEL_MAP.containsKey(emote.get())) { - boolean b = EmoteTweaksMain.CROUCH_CANCEL_MAP.getBoolean(emote.get()); + if(EmoteTweaks.CROUCH_CANCEL_MAP.containsKey(emote.get())) { + boolean b = EmoteTweaks.CROUCH_CANCEL_MAP.getBoolean(emote.get()); if(b) cir.setReturnValue(ClientEmotePlay.clientStartLocalEmote(emote)); } diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteScreenMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteScreenMixin.java similarity index 93% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteScreenMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteScreenMixin.java index 7e1d56c..f5605cf 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteScreenMixin.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/EmoteScreenMixin.java @@ -1,6 +1,7 @@ package dev.bsmp.emotetweaks.emotetweaks.mixin; -import dev.bsmp.emotetweaks.emotetweaks.client.ToggleButton; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -8,9 +9,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaksMain; +import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaks; import dev.bsmp.emotetweaks.emotetweaks.IEmoteScreen; import dev.bsmp.emotetweaks.emotetweaks.IMixedKey; +import dev.bsmp.emotetweaks.emotetweaks.client.ToggleButton; import io.github.kosmx.emotes.arch.executor.types.TextImpl; import io.github.kosmx.emotes.executor.EmoteInstance; import io.github.kosmx.emotes.executor.dataTypes.InputKey; @@ -18,7 +20,6 @@ import io.github.kosmx.emotes.main.screen.EmoteMenu; import io.github.kosmx.emotes.main.screen.IScreenSlave; import io.github.kosmx.emotes.main.screen.widget.IEmoteListWidgetHelper; -import net.minecraft.network.chat.TextComponent; @Mixin(value = EmoteMenu.class, remap = false) public abstract class EmoteScreenMixin extends AbstractScreenLogic implements IEmoteScreen { @@ -57,7 +58,7 @@ private void crouchButtonActive(MATRIX matrices, int mouseX, int mouseY, float d if(lastEntry != selected) { lastEntry = selected; if (selected != null) { - boolean ignoreCrouch = EmoteTweaksMain.CROUCH_CANCEL_MAP.getBoolean(emoteList.getSelectedEntry().getEmote().getEmote().get()); + boolean ignoreCrouch = EmoteTweaks.CROUCH_CANCEL_MAP.getBoolean(emoteList.getSelectedEntry().getEmote().getEmote().get()); this.crouchToggleButton.setCurrentState(ignoreCrouch); } } diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyMixin.java similarity index 91% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyMixin.java index 5f2ef89..1e98873 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyMixin.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyMixin.java @@ -1,5 +1,7 @@ package dev.bsmp.emotetweaks.emotetweaks.mixin; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -8,9 +10,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Objects; -import net.minecraft.network.chat.TextComponent; import com.mojang.blaze3d.platform.InputConstants; -import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaksMain; +import dev.bsmp.emotetweaks.emotetweaks.EmoteTweaks; import dev.bsmp.emotetweaks.emotetweaks.IMixedKey; import io.github.kosmx.emotes.arch.executor.types.Key; import io.github.kosmx.emotes.arch.executor.types.TextImpl; @@ -40,7 +41,7 @@ private void checkEquals(InputKey key, CallbackInfoReturnable cir) { @Inject(method = "getLocalizedText", at = @At("RETURN"), cancellable = true) private void getText(CallbackInfoReturnable cir) { if(modifier != 0) - cir.setReturnValue(new TextImpl(new TextComponent(EmoteTweaksMain.MODIFIERS.get(modifier) + " + ").plainCopy()).append(cir.getReturnValue())); + cir.setReturnValue(new TextImpl(new TextComponent(EmoteTweaks.MODIFIERS.get(modifier) + " + ").plainCopy()).append(cir.getReturnValue())); } @Inject(method = "getTranslationKey", at = @At("RETURN"), cancellable = true) diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyframeAnimationPlayerMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyframeAnimationPlayerMixin.java similarity index 51% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyframeAnimationPlayerMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyframeAnimationPlayerMixin.java index 0105bdf..2c65dd0 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyframeAnimationPlayerMixin.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/KeyframeAnimationPlayerMixin.java @@ -1,12 +1,7 @@ package dev.bsmp.emotetweaks.emotetweaks.mixin; -import de.maxhenkel.voicechat.voice.client.SoundManager; -import dev.bsmp.emotetweaks.emotetweaks.SoundFrame; -import dev.bsmp.emotetweaks.util.EmoteProperties; -import dev.bsmp.emotetweaks.voicefx.SoundPlugin; -import dev.kosmx.playerAnim.api.layered.KeyframeAnimationPlayer; -import dev.kosmx.playerAnim.core.data.KeyframeAnimation; -import io.github.kosmx.emotes.executor.EmoteInstance; +import net.fabricmc.loader.api.FabricLoader; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,17 +9,30 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.UnsupportedAudioFileException; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; + +import de.maxhenkel.voicechat.voice.client.SoundManager; +import dev.bsmp.emotetweaks.emotetweaks.SoundFrame; +import dev.bsmp.emotetweaks.voicefx.SoundPlugin; +import dev.kosmx.playerAnim.api.layered.KeyframeAnimationPlayer; +import dev.kosmx.playerAnim.core.data.KeyframeAnimation; +import dev.kosmx.playerAnim.core.impl.AnimationProcessor; +import io.github.kosmx.emotes.executor.EmoteInstance; +import io.github.kosmx.emotes.executor.emotePlayer.IEmotePlayerEntity; + @Mixin(value = KeyframeAnimationPlayer.class, remap = false) public class KeyframeAnimationPlayerMixin { @Shadow private boolean isRunning; @@ -38,57 +46,56 @@ public class KeyframeAnimationPlayerMixin { @Inject(method = "(Ldev/kosmx/playerAnim/core/data/KeyframeAnimation;I)V", at = @At("TAIL")) private void onConstruct(KeyframeAnimation emote, int t, CallbackInfo ci) { if(emote.extraData.containsKey("name")) { - Path autoFile = EmoteProperties.getGameDir().resolve("emotes" + FileSystems.getDefault().getSeparator() + ((String) emote.extraData.get("name")).replace("\"", "") + ".wav"); + Path autoFile = FabricLoader.getInstance().getGameDir().resolve("emotes" + FileSystems.getDefault().getSeparator() + ((String) emote.extraData.get("name")).replace("\"", "") + ".wav"); if (autoFile.toFile().exists()) { try { - AudioInputStream stream = loadAudioFile(autoFile); - if (stream != null) - SoundPlugin.playSound(stream); + short[] pairedSound = loadAudioFile(autoFile); + if (pairedSound != null) + SoundPlugin.playSound(pairedSound); } catch (UnsupportedAudioFileException | IOException e) { e.printStackTrace(); } } } - //Temp Disabled -// if(emote.extraData.containsKey("sound_effects")) { -// soundFrames = new ArrayList<>((ArrayList) emote.extraData.get("sound_effects")); -// soundFrames.sort(Comparator.comparingInt(o -> o.tick)); -// for(SoundFrame frame : soundFrames) { -// if (!audioFiles.containsKey(frame.value)) { -// try { -// audioFiles.put(frame.value, loadAudioFile(frame.value)); -// } catch (UnsupportedAudioFileException | IOException e) { -// e.printStackTrace(); -// } -// } -// } -// } + if(emote.extraData.containsKey("sound_effects")) { + soundFrames = new ArrayList<>((ArrayList) emote.extraData.get("sound_effects")); + soundFrames.sort(Comparator.comparingInt(o -> o.tick)); + for(SoundFrame frame : soundFrames) { + if (!audioFiles.containsKey(frame.value)) { + try { + audioFiles.put(frame.value, loadAudioFile(frame.value)); + } catch (UnsupportedAudioFileException | IOException e) { + e.printStackTrace(); + } + } + } + } } - private AudioInputStream loadAudioFile(String name) throws UnsupportedAudioFileException, IOException { - return loadAudioFile(EmoteProperties.getGameDir().resolve("emotes" + FileSystems.getDefault().getSeparator() + name)); + private short[] loadAudioFile(String name) throws UnsupportedAudioFileException, IOException { + return loadAudioFile(FabricLoader.getInstance().getGameDir().resolve("emotes" + FileSystems.getDefault().getSeparator() + name)); } - private AudioInputStream loadAudioFile(Path path) throws UnsupportedAudioFileException, IOException { + private short[] loadAudioFile(Path path) throws UnsupportedAudioFileException, IOException { AudioInputStream input = AudioSystem.getAudioInputStream(path.toFile()); AudioInputStream formattedInput = AudioSystem.getAudioInputStream(new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, SoundManager.SAMPLE_RATE, 16, 1, 2, SoundManager.SAMPLE_RATE, false), input); - return formattedInput; + return SoundPlugin.voicechatApi.getAudioConverter().bytesToShorts(formattedInput.readAllBytes()); } -// @Inject(method = "tick", at = @At("HEAD")) -// private void soundTick(CallbackInfo ci) { -// if(this.isRunning && this.soundFrames != null) { -// if(nextSound != null) { -// if(nextSound.tick == this.currentTick) { -// if(this == EmoteInstance.instance.getClientMethods().getMainPlayer().getEmote()) -// SoundPlugin.playSound(audioFiles.remove(nextSound.value)); -// } -// } -// else if(!soundFrames.isEmpty()) { -// nextSound = soundFrames.remove(0); -// } -// } -// } + @Inject(method = "tick", at = @At("HEAD")) + private void soundTick(CallbackInfo ci) { + if(this.isRunning && this.soundFrames != null) { + if(nextSound != null) { + if(nextSound.tick == this.currentTick) { + if(this == EmoteInstance.instance.getClientMethods().getMainPlayer().getEmote()) + SoundPlugin.playSound(audioFiles.remove(nextSound.value)); + } + } + else if(!soundFrames.isEmpty()) { + nextSound = soundFrames.remove(0); + } + } + } @Inject(method = "stop", at = @At("TAIL")) private void stopSounds(CallbackInfo ci) { diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/NetDataAccessor.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/NetDataAccessor.java similarity index 86% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/NetDataAccessor.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/NetDataAccessor.java index 3cfca98..1f504be 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/NetDataAccessor.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/NetDataAccessor.java @@ -1,14 +1,13 @@ package dev.bsmp.emotetweaks.emotetweaks.mixin; +import io.github.kosmx.emotes.common.network.objects.NetData; +import java.util.HashMap; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import java.util.HashMap; - -import io.github.kosmx.emotes.common.network.objects.NetData; - -@Mixin(value = NetData.class, remap = false) +@Mixin(value = { NetData.class }, remap = false) public interface NetDataAccessor { @Accessor HashMap getExtraData(); } + diff --git a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ServerEmotePlayMixin.java b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ServerEmotePlayMixin.java similarity index 99% rename from common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ServerEmotePlayMixin.java rename to src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ServerEmotePlayMixin.java index 025da81..84b8ae1 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ServerEmotePlayMixin.java +++ b/src/main/java/dev/bsmp/emotetweaks/emotetweaks/mixin/ServerEmotePlayMixin.java @@ -1,16 +1,15 @@ package dev.bsmp.emotetweaks.emotetweaks.mixin; +import dev.kosmx.playerAnim.core.data.KeyframeAnimation; +import dev.kosmx.playerAnim.core.util.Pair; +import io.github.kosmx.emotes.server.network.AbstractServerEmotePlay; +import io.github.kosmx.emotes.server.network.IServerNetworkInstance; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import dev.kosmx.playerAnim.core.data.KeyframeAnimation; -import dev.kosmx.playerAnim.core.util.Pair; -import io.github.kosmx.emotes.server.network.AbstractServerEmotePlay; -import io.github.kosmx.emotes.server.network.IServerNetworkInstance; - @Mixin(value = AbstractServerEmotePlay.class, remap = false) public abstract class ServerEmotePlayMixin

{ @Invoker("getPlayerNetworkInstance") diff --git a/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXPacket.java b/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXPacket.java new file mode 100644 index 0000000..0b9c286 --- /dev/null +++ b/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXPacket.java @@ -0,0 +1,36 @@ +package dev.bsmp.emotetweaks.voicefx; + +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import java.util.UUID; + +import de.maxhenkel.voicechat.Voicechat; +import de.maxhenkel.voicechat.api.events.SoundPacketEvent; +import de.maxhenkel.voicechat.voice.common.LocationSoundPacket; +import de.maxhenkel.voicechat.voice.server.ServerWorldUtils; + +public class SFXPacket { + + public static ResourceLocation PACKET_ID = new ResourceLocation("emotecraft", "packet_sfx"); + + public static void receiveMessage(MinecraftServer minecraftServer, ServerPlayer serverPlayer, ServerGamePacketListenerImpl serverGamePacketListener, FriendlyByteBuf PacketByteBuf, PacketSender packetSender) { + UUID uuid = PacketByteBuf.readUUID(); + byte[] frame = PacketByteBuf.readByteArray(); + long sequenceNumber = PacketByteBuf.readLong(); + + //ToDo: Check Distance and maybe add custom category for EmoteFX? + LocationSoundPacket packet = new LocationSoundPacket(uuid, serverPlayer.position(), frame, sequenceNumber, 15f, null); + Voicechat.SERVER.getServer().broadcast( + ServerWorldUtils.getPlayersInRange(serverPlayer.getLevel(), serverPlayer.position(), Voicechat.SERVER_CONFIG.voiceChatDistance.get(), p -> p != serverPlayer), +// ServerWorldUtils.getPlayersInRange(serverPlayer.getWorld(), serverPlayer.getPos(), Voicechat.SERVER_CONFIG.voiceChatDistance.get(), p -> true), + packet, + null, null, null, + SoundPacketEvent.SOURCE_PROXIMITY + ); + } + +} diff --git a/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXThread.java b/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXThread.java new file mode 100644 index 0000000..e6d0302 --- /dev/null +++ b/src/main/java/dev/bsmp/emotetweaks/voicefx/SFXThread.java @@ -0,0 +1,92 @@ +package dev.bsmp.emotetweaks.voicefx; + +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import java.io.IOException; +import java.util.Arrays; +import java.util.UUID; + +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.UnsupportedAudioFileException; + +import de.maxhenkel.voicechat.Voicechat; +import de.maxhenkel.voicechat.api.opus.OpusEncoder; +import de.maxhenkel.voicechat.plugins.PluginManager; +import de.maxhenkel.voicechat.voice.client.ClientManager; +import de.maxhenkel.voicechat.voice.client.ClientVoicechat; +import de.maxhenkel.voicechat.voice.common.LocationSoundPacket; + +public class SFXThread extends Thread { + + private final OpusEncoder encoder; + private final UUID uuid; + private boolean started; + private short[] data; + + private SFXThread(UUID uuid, OpusEncoder encoder, short[] data) { + this.uuid = uuid; + this.encoder = encoder; + this.data = data; + + this.setDaemon(true); + } + + @Override + public void run() { + int framePosition = 0; + long startTime = System.nanoTime(); + + short[] frame; + while ((frame = getFrameData(framePosition)) != null && !isInterrupted()) { + if (frame.length != 960) { + Voicechat.LOGGER.error("Got invalid audio frame size {}!={}", frame.length, 960); + break; + } + + //Send Data Packet + FriendlyByteBuf buf = PacketByteBufs.create(); + buf.writeUUID(uuid); + buf.writeByteArray(encoder.encode(frame)); + buf.writeLong(framePosition); + ClientPlayNetworking.send(SFXPacket.PACKET_ID, buf); + + short[] finalFrame = frame; + Minecraft.getInstance().execute(() -> ClientManager.getClient().processSoundPacket(new LocationSoundPacket(uuid, finalFrame, Minecraft.getInstance().player.position(), 15f, null))); + + ++framePosition; + long waitTimestamp = startTime + (long) framePosition * 20000000L; + long waitNanos = waitTimestamp - System.nanoTime(); + + try { + if (waitNanos > 0L) { + Thread.sleep(waitNanos / 1000000L, (int) (waitNanos % 1000000L)); + } + } catch (InterruptedException var10) { + break; + } + } + + this.encoder.close(); + } + + private short[] getFrameData(int currentFrame) { + int startIndex = currentFrame * (960); + if(startIndex > data.length) + return null; + return Arrays.copyOfRange(this.data, startIndex, startIndex + 960); + } + + public void startPlaying() { + if (!this.started) { + this.start(); + this.started = true; + } + } + + public static SFXThread playSFX(short[] data) throws UnsupportedAudioFileException, IOException { + return new SFXThread(UUID.randomUUID(), SoundPlugin.voicechatApi.createEncoder(), data); + } + +} diff --git a/common/src/main/java/dev/bsmp/emotetweaks/voicefx/SoundPlugin.java b/src/main/java/dev/bsmp/emotetweaks/voicefx/SoundPlugin.java similarity index 86% rename from common/src/main/java/dev/bsmp/emotetweaks/voicefx/SoundPlugin.java rename to src/main/java/dev/bsmp/emotetweaks/voicefx/SoundPlugin.java index b9a6c8e..a043ae1 100644 --- a/common/src/main/java/dev/bsmp/emotetweaks/voicefx/SoundPlugin.java +++ b/src/main/java/dev/bsmp/emotetweaks/voicefx/SoundPlugin.java @@ -1,19 +1,17 @@ package dev.bsmp.emotetweaks.voicefx; -import de.maxhenkel.voicechat.api.ForgeVoicechatPlugin; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.sound.sampled.UnsupportedAudioFileException; + import de.maxhenkel.voicechat.api.VoicechatApi; import de.maxhenkel.voicechat.api.VoicechatPlugin; import de.maxhenkel.voicechat.api.VoicechatServerApi; import de.maxhenkel.voicechat.api.events.EventRegistration; import de.maxhenkel.voicechat.api.events.VoicechatServerStartedEvent; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.UnsupportedAudioFileException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -@ForgeVoicechatPlugin public class SoundPlugin implements VoicechatPlugin { public static VoicechatApi voicechatApi; @@ -40,9 +38,9 @@ public void onServerStarted(VoicechatServerStartedEvent event) { voicechatServerApi = event.getVoicechat(); } - public static void playSound(AudioInputStream stream) { + public static void playSound(short[] data) { try { - SFXThread thread = SFXThread.playSFX(stream); + SFXThread thread = SFXThread.playSFX(data); runningThreads.add(thread); thread.startPlaying(); } catch (UnsupportedAudioFileException | IOException e) { diff --git a/common/src/main/resources/EmoteTweaks.mixins.json b/src/main/resources/EmoteTweaks.mixins.json similarity index 93% rename from common/src/main/resources/EmoteTweaks.mixins.json rename to src/main/resources/EmoteTweaks.mixins.json index c626afd..bb8e359 100644 --- a/common/src/main/resources/EmoteTweaks.mixins.json +++ b/src/main/resources/EmoteTweaks.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "dev.bsmp.emotetweaks.emotetweaks.mixin", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_17", "mixins": [ "AnimationBinaryMixin", "AnimationJsonMixin", diff --git a/fabric/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json similarity index 74% rename from fabric/src/main/resources/fabric.mod.json rename to src/main/resources/fabric.mod.json index 7f8e294..222c0b2 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -5,15 +5,17 @@ "name": "EmoteTweaks", "description": "Mod for allowing some Tweaked functionality of EmoteCraft", "authors": [ - "RyanV", - "Wolfie" + "RyanV" ], "contact": {}, "license": "MIT", "environment": "*", "entrypoints": { + "client": [ + "dev.bsmp.emotetweaks.emotetweaks.client.EmoteTweaksClient" + ], "main": [ - "dev.bsmp.emotetweaks.emotetweaks.fabric.EmoteTweaksFabric" + "dev.bsmp.emotetweaks.emotetweaks.EmoteTweaks" ], "voicechat": [ "dev.bsmp.emotetweaks.voicefx.SoundPlugin" @@ -27,7 +29,6 @@ "fabric": "*", "minecraft": "1.16.5", "emotecraft": "2.2.7-b.build.47", - "voicechat": ">=1.16.5-2.3.3", - "architectury": ">=1.32.67" + "voicechat": ">=1.16.5-2.4.16" } -} \ No newline at end of file +}