diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..e5e0caa --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,34 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/java +{ + "name": "Java", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/java:1-17-bookworm", + + "features": { + "ghcr.io/devcontainers/features/java:1": { + "version": "none", + "installMaven": "false", + "installGradle": "true" + }, + "ghcr.io/devcontainers/features/github-cli:1": { + "installDirectlyFromGitHubRelease": true, + "version": "latest" + }, + "ghcr.io/itsmechlark/features/act:1": { + "version": "latest" + } + } + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "java -version", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..097f9f9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..2d98c9c --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,28 @@ +name: Build + +on: + push: + branches-ignore: + - main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Make gradlew executable + run: chmod +x ./gradlew + - name: Build with Gradle + uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 + with: + arguments: build + - name: Upload Build Results + uses: actions/upload-artifact@v3 + with: + name: build + path: build/libs/*.jar \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..ca2c338 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,58 @@ +name: Release + +on: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Make gradlew executable + run: chmod +x ./gradlew + - name: Build with Gradle + uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 + with: + arguments: build + - name: Upload Build Results + uses: actions/upload-artifact@v3 + with: + name: build + path: build/libs/*.jar + + release: + runs-on: ubuntu-latest + permissions: + contents: write + env: + GH_TOKEN: ${{ github.token }} + needs: [build] + steps: + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 + - name: Create Release + run: | + mkdir dist + mv build/*.jar dist + + pushd dist + shasum -a 256 * > checksums.txt + popd + + version=$(grep mod_version gradle.properties | cut -d'=' -f2 | awk '{gsub(/^ +| + $/,""); print}') + channel=$(grep release_channel gradle.properties | cut -d'=' -f2 | awk '{gsub(/^ +| + $/,""); print}') + + release_args=( + "$version" + --title "Weather Changer ${version}" + --generate-notes + ) + + gh release create "${release_args[@]}" ./dist/* \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index d30a5e1..dc2d320 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,6 +4,7 @@ plugins { } architectury { + injectInjectables = false minecraft = properties["minecraft_version"].toString() } diff --git a/common/src/main/java/me/lucaslah/weatherchanger/WeatherChanger.java b/common/src/main/java/me/lucaslah/weatherchanger/WeatherChanger.java index 8b78637..e36bc3a 100644 --- a/common/src/main/java/me/lucaslah/weatherchanger/WeatherChanger.java +++ b/common/src/main/java/me/lucaslah/weatherchanger/WeatherChanger.java @@ -20,8 +20,10 @@ import java.util.Objects; public class WeatherChanger { private static final Gson gson = new GsonBuilder().setPrettyPrinting().create(); private static WcMode currentMode = WcMode.OFF; + private static WeatherChangerPlatform platform; - public static void init() { + public static void init(WeatherChangerPlatform platform) { + WeatherChanger.platform = platform; boolean fileCreated = false; File configPath = getConfigFile(); @@ -39,7 +41,7 @@ public class WeatherChanger { loadConfig(); } - KeybindingManager keybindingManager = WeatherChangerExpectPlatform.getKeybindingManager(); + KeybindingManager keybindingManager = platform.getKeybindingManager(); keybindingManager .add(new ToggleClearKey()) @@ -96,7 +98,7 @@ public class WeatherChanger { } private static File getConfigFile() { - return WeatherChangerExpectPlatform.getConfigDirectory().resolve("weather-changer.json").toFile(); + return platform.getConfigDirectory().resolve("weather-changer.json").toFile(); } /** diff --git a/common/src/main/java/me/lucaslah/weatherchanger/WeatherChangerExpectPlatform.java b/common/src/main/java/me/lucaslah/weatherchanger/WeatherChangerExpectPlatform.java deleted file mode 100644 index f35854c..0000000 --- a/common/src/main/java/me/lucaslah/weatherchanger/WeatherChangerExpectPlatform.java +++ /dev/null @@ -1,18 +0,0 @@ -package me.lucaslah.weatherchanger; - -import dev.architectury.injectables.annotations.ExpectPlatform; -import me.lucaslah.weatherchanger.keybinding.KeybindingManager; - -import java.nio.file.Path; - -public class WeatherChangerExpectPlatform { - @ExpectPlatform - public static Path getConfigDirectory() { - throw new AssertionError(); - } - - @ExpectPlatform - public static KeybindingManager getKeybindingManager() { - throw new AssertionError(); - } -} diff --git a/common/src/main/java/me/lucaslah/weatherchanger/WeatherChangerPlatform.java b/common/src/main/java/me/lucaslah/weatherchanger/WeatherChangerPlatform.java new file mode 100644 index 0000000..4c0205c --- /dev/null +++ b/common/src/main/java/me/lucaslah/weatherchanger/WeatherChangerPlatform.java @@ -0,0 +1,10 @@ +package me.lucaslah.weatherchanger; + +import me.lucaslah.weatherchanger.keybinding.KeybindingManager; + +import java.nio.file.Path; + +public interface WeatherChangerPlatform { + Path getConfigDirectory(); + KeybindingManager getKeybindingManager(); +} diff --git a/fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerFabric.java b/fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerFabric.java index b03b760..5eb7f14 100644 --- a/fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerFabric.java +++ b/fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerFabric.java @@ -3,15 +3,11 @@ package me.lucaslah.weatherchanger.fabric; import me.lucaslah.weatherchanger.WeatherChanger; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; public class WeatherChangerFabric implements ClientModInitializer { - public static final Logger LOGGER = LogManager.getLogger("weather-changer"); - @Override public void onInitializeClient() { - WeatherChanger.init(); + WeatherChanger.init(new WeatherChangerPlatformImpl()); ClientLifecycleEvents.CLIENT_STOPPING.register(client -> WeatherChanger.shutdown()); } } diff --git a/fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerExpectPlatformImpl.java b/fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerPlatformImpl.java similarity index 54% rename from fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerExpectPlatformImpl.java rename to fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerPlatformImpl.java index bd7cd27..0231822 100644 --- a/fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerExpectPlatformImpl.java +++ b/fabric/src/main/java/me/lucaslah/weatherchanger/fabric/WeatherChangerPlatformImpl.java @@ -1,16 +1,19 @@ package me.lucaslah.weatherchanger.fabric; +import me.lucaslah.weatherchanger.WeatherChangerPlatform; import me.lucaslah.weatherchanger.keybinding.KeybindingManager; import net.fabricmc.loader.api.FabricLoader; import java.nio.file.Path; -public class WeatherChangerExpectPlatformImpl { - public static Path getConfigDirectory() { +public class WeatherChangerPlatformImpl implements WeatherChangerPlatform { + @Override + public Path getConfigDirectory() { return FabricLoader.getInstance().getConfigDir(); } - public static KeybindingManager getKeybindingManager() { + @Override + public KeybindingManager getKeybindingManager() { return new FabricKeybindingManager(); } } diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts new file mode 100644 index 0000000..40f9294 --- /dev/null +++ b/forge/build.gradle.kts @@ -0,0 +1,89 @@ +architectury { + platformSetupLoomIde() + forge() +} + +loom { + accessWidenerPath.set(project(":common").loom.accessWidenerPath) + + forge.apply { + convertAccessWideners.set(true) + extraAccessWideners.add(loom.accessWidenerPath.get().asFile.name) + + mixinConfig("weatherchanger.mixins.json") + } +} + +val common: Configuration by configurations.creating +val shadowCommon: Configuration by configurations.creating + +configurations { + compileOnly.configure { extendsFrom(common) } + runtimeOnly.configure { extendsFrom(common) } +} + +dependencies { + forge("net.minecraftforge:forge:${rootProject.property("forge.version")}") + + common(project(":common", "namedElements")) { + isTransitive = false + } + + shadowCommon(project(":common", "transformProductionForge")) { + isTransitive = false + } +} + +tasks { + processResources { + inputs.property("group", rootProject.property("maven_group")) + inputs.property("version", project.version) + + filesMatching("META-INF/mods.toml") { + expand(mapOf( + "group" to rootProject.property("maven_group"), + "version" to project.version, + + "mod_id" to rootProject.property("mod_id"), + "minecraft_version" to rootProject.property("minecraft_version") + )) + } + } + + remapJar { + injectAccessWidener.set(true) + } + + jar { + from("../LICENSE.md") + from("../assets/logo.png") { + rename { "icon.png" } + } + + dependsOn(":common:transformProductionForge") + + from({ + shadowCommon.filter { it.name.endsWith("jar") }.map { zipTree(it) } + }) + } +} + +java { + withSourcesJar() +} + +publishing { + publications { + create("mavenJava") { + 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. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} diff --git a/forge/gradle.properties b/forge/gradle.properties new file mode 100644 index 0000000..32f842a --- /dev/null +++ b/forge/gradle.properties @@ -0,0 +1 @@ +loom.platform=forge \ No newline at end of file diff --git a/forge/src/main/java/me/lucaslah/weatherchanger/forge/ForgeKeybindingManager.java b/forge/src/main/java/me/lucaslah/weatherchanger/forge/ForgeKeybindingManager.java new file mode 100644 index 0000000..3381860 --- /dev/null +++ b/forge/src/main/java/me/lucaslah/weatherchanger/forge/ForgeKeybindingManager.java @@ -0,0 +1,10 @@ +package me.lucaslah.weatherchanger.forge; + +import me.lucaslah.weatherchanger.keybinding.KeybindingManager; + +public class ForgeKeybindingManager extends KeybindingManager { + @Override + public void registerKeys() { + // forge handles keybindings in a event + } +} diff --git a/forge/src/main/java/me/lucaslah/weatherchanger/forge/WeatherChangerForge.java b/forge/src/main/java/me/lucaslah/weatherchanger/forge/WeatherChangerForge.java new file mode 100644 index 0000000..abc9e3e --- /dev/null +++ b/forge/src/main/java/me/lucaslah/weatherchanger/forge/WeatherChangerForge.java @@ -0,0 +1,57 @@ +package me.lucaslah.weatherchanger.forge; + +import me.lucaslah.weatherchanger.WeatherChanger; +import me.lucaslah.weatherchanger.keybinding.Key; +import net.minecraft.client.MinecraftClient; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +@Mod("weatherchanger") +public class WeatherChangerForge { + private static WeatherChangerForge instance; + private ForgeKeybindingManager forgeKeybindingManager; + + public WeatherChangerForge() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBus.addListener(this::onClientSetup); + } + + private void onClientSetup(FMLClientSetupEvent event) { + instance = this; + forgeKeybindingManager = new ForgeKeybindingManager(); + MinecraftForge.EVENT_BUS.register(this); + WeatherChanger.init(new WeatherChangerPlatformImpl()); + } + + public static WeatherChangerForge getInstance() { + return instance; + } + + public ForgeKeybindingManager getKeybindingManager() { + return forgeKeybindingManager; + } + + @SubscribeEvent + public void registerBindings(RegisterKeyMappingsEvent event) { + for (Key key : forgeKeybindingManager.getEntries()) { + event.register(key.getKeyBinding()); + } + } + + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + for (Key key : forgeKeybindingManager.getEntries()) { + if (key.isEnabled() && key.getKeyBinding().wasPressed()) { + key.onPress(MinecraftClient.getInstance()); + } + } + } + } +} diff --git a/forge/src/main/java/me/lucaslah/weatherchanger/forge/WeatherChangerPlatformImpl.java b/forge/src/main/java/me/lucaslah/weatherchanger/forge/WeatherChangerPlatformImpl.java new file mode 100644 index 0000000..d827663 --- /dev/null +++ b/forge/src/main/java/me/lucaslah/weatherchanger/forge/WeatherChangerPlatformImpl.java @@ -0,0 +1,19 @@ +package me.lucaslah.weatherchanger.forge; + +import me.lucaslah.weatherchanger.WeatherChangerPlatform; +import me.lucaslah.weatherchanger.keybinding.KeybindingManager; +import net.minecraftforge.fml.loading.FMLPaths; + +import java.nio.file.Path; + +public class WeatherChangerPlatformImpl implements WeatherChangerPlatform { + @Override + public Path getConfigDirectory() { + return FMLPaths.CONFIGDIR.get(); + } + + @Override + public KeybindingManager getKeybindingManager() { + return WeatherChangerForge.getInstance().getKeybindingManager(); + } +} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..158a8a7 --- /dev/null +++ b/forge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,28 @@ +modLoader = "javafml" +loaderVersion = "[4,)" +issueTrackerURL = "https://github.com/Lucaslah/WeatherChanger/issues" +license = "LGPL-3.0" + +[[mods]] +modId = "${mod_id}" +version = "${version}" +displayName = "Weather Changer" +authors = "Lucaslah" +description = ''' +Client side weather change for Minecraft +''' +logoFile = "icon.png" + +[[dependencies.${mod_id}]] +modId = "forge" +mandatory = true +versionRange = "[43,)" +ordering = "NONE" +side = "CLIENT" + +[[dependencies.${mod_id}]] +modId = "minecraft" +mandatory = true +versionRange = "[${minecraft_version},)" +ordering = "NONE" +side = "CLIENT" diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..fb58c57 --- /dev/null +++ b/forge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "Weather Changer", + "pack_format": 9 + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index f08cea4..7c1c24b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,6 +15,10 @@ mod_id = weatherchanger maven_group = me.lucaslah.weatherchanger archives_base_name = weather-changer +# Release Properties +# options: none,alpha,beta,release +release_channel=none + # Fabric fabric.loader_version=0.14.21 fabric.version=0.84.0+1.20.1 diff --git a/settings.gradle.kts b/settings.gradle.kts index ce0d6f6..f920c0e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -23,4 +23,5 @@ pluginManagement { } include("common") -include("fabric") \ No newline at end of file +include("fabric") +include("forge")