Skip to content

Commit

Permalink
Merge pull request #13 from SpiritGameStudios/1.0.1-dev
Browse files Browse the repository at this point in the history
Snapper 1.0.1: The Unbreakification Update
  • Loading branch information
worldwidepixel authored Dec 2, 2024
2 parents b53b239 + 9c60290 commit 8bd4cb4
Show file tree
Hide file tree
Showing 25 changed files with 368 additions and 218 deletions.
15 changes: 9 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ Screenshots, made simple

<img alt="Won't support Forge" src="https://raw.githubusercontent.com/intergrav/devins-badges/v3/assets/compact/unsupported/forge_vector.svg">

<img alt="Made by Spirit Studios" src="https://badger-api-staging.worldwidepixel.ca/compact?gradientStart=310092&gradientEnd=2e005e&lineOne=Made%20by&lineTwo=Spirit&colourOne=FFFFFF&colourTwo=b300ff&iconUrl=https%3A%2F%2Frounder.worldwidepixel.ca%2F%3Fr%3D80%26url%3Dhttps%3A%2F%2Fcdn.modrinth.com%2Fdata%2F3N4V1sd0%2Feb038a251ef1bb4c3330d4a8d79de4be700fb815.png">
<img alt="Made by Spirit Studios" src="https://raw.githubusercontent.com/SpiritGameStudios/.github/main/assets/brand/badge/compact.svg">

<img alt="As seen on ModFest 1.21" height="40" src="https://badger-api-staging.worldwidepixel.ca/compact?gradientStart=4B2018&gradientEnd=220D09&lineOne=As+seen+on&lineTwo=ModFest+1.21&colourOne=FFFFFF&colourTwo=de634c&iconUrl=https://raw.githubusercontent.com/ModFest/art/refs/heads/v2/icon/svg/1.21/transparent.svg">

## 📖 About

Expand All @@ -16,18 +18,19 @@ Snapper includes:
- A screenshot managment menu, accessible from the title screen or ingame
- The ability to view latest screenshot with just a keybind
- Options to rename, delete, copy, and externally open images ingame
- The ability to and view panoramic screenshots ingame
- The ability to create and view panoramic screenshots ingame
- ~~Not having to install a mod from an EXE~~

## ❓ FAQ
* Forge? <br/>
No. Please do not ask us for a forge port.
No. Please do not ask us for a forge port.

* Do you plan to / Could you add `X`? <br/>
If you want to suggest something, join the [discord](https://discord.gg/TTmx7d2axf).
If you want to suggest something, join the [discord](https://discord.gg/TTmx7d2axf).

* Can you port/backport to `X` version? <br/>
Probably not. Multi-version projects are hard :<
Probably not. Multi-version projects are hard :<

Special thanks to our original beta testers:
- [Blurryface](https://blurry.gay)
- [ThinkSeal](https://github.com/thinkseal)
- [ThinkSeal](https://github.com/thinkseal)
71 changes: 33 additions & 38 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
java
id("fabric-loom") version "1.7-SNAPSHOT"
alias(libs.plugins.fabric.loom)
alias(libs.plugins.minotaur)
}

class ModInfo {
Expand All @@ -9,70 +10,50 @@ class ModInfo {
val version = property("mod.version").toString()
}

class Dependencies {
val minecraft = property("deps.minecraft").toString()
val loader = property("deps.loader").toString()
val yarn = property("deps.yarn").toString()

val fabricApi = property("deps.fabricapi").toString()
val specter = property("deps.specter").toString()
}


val mod = ModInfo()
val deps = Dependencies()

version = mod.version
group = mod.group

base.archivesName = "${mod.id}-${mod.version}"
base.archivesName = mod.id

loom {
splitEnvironmentSourceSets()

mods.create(mod.id) {
sourceSet(sourceSets.getByName("main"))
sourceSet(sourceSets.getByName("client"))
sourceSet(sourceSets["main"])
sourceSet(sourceSets["client"])
}
}

repositories {
mavenCentral()
maven("https://maven.callmeecho.dev/releases/")
maven("https://maven.spiritstudios.dev/releases/")
}

dependencies {
minecraft("com.mojang:minecraft:${deps.minecraft}")
mappings("net.fabricmc:yarn:${deps.yarn}:v2")
modImplementation("net.fabricmc:fabric-loader:${deps.loader}")

modImplementation("net.fabricmc.fabric-api:fabric-api:${deps.fabricApi}")
minecraft(libs.minecraft)
mappings(variantOf(libs.yarn) { classifier("v2") })
modImplementation(libs.fabric.loader)

fun specterModule(name: String) {
include("dev.spiritstudios.specter:specter-$name:${deps.specter}")
modImplementation("dev.spiritstudios.specter:specter-$name:${deps.specter}")
}
modImplementation(libs.fabric.api);

specterModule("config")
specterModule("core")
include(libs.bundles.specter)
modImplementation(libs.bundles.specter)

// TODO: Find a way to use the macOS clipboard without this.
implementation("ca.weblite:java-objc-bridge:1.0.0")
implementation(libs.objc.bridge)
}

tasks.processResources {
inputs.property("id", mod.id)
inputs.property("version", mod.version)
inputs.property("loader_version", deps.loader)
inputs.property("minecraft_version", deps.minecraft)

val map = mapOf(
"id" to mod.id,
"version" to mod.version,
"loader_version" to deps.loader,
"minecraft_version" to deps.minecraft
"mod_id" to mod.id,
"mod_version" to mod.version,
"fabric_loader_version" to libs.versions.fabric.loader.get(),
"minecraft_version" to libs.versions.minecraft.get()
)

inputs.properties(map)
filesMatching("fabric.mod.json") { expand(map) }
}

Expand All @@ -83,8 +64,22 @@ java {
targetCompatibility = JavaVersion.VERSION_21
}


tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
options.release = 21
}

tasks.jar { from("LICENSE") { rename { "${it}_${base.archivesName}" } } }

modrinth {
token.set(System.getenv("MODRINTH_TOKEN"))
projectId.set(mod.id)
versionNumber.set(mod.version)
uploadFile.set(tasks.remapJar)
gameVersions.addAll(libs.versions.minecraft.get(), "1.21.1")
loaders.addAll("fabric", "quilt")
syncBodyFrom.set(rootProject.file("README.md").readText())
dependencies {
required.version("fabric-api", libs.versions.fabric.api.get())
}
}
8 changes: 4 additions & 4 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
org.gradle.jvmargs=-Xmx2G
org.gradle.parallel=true

mod.version = 1.0.0
mod.version = 1.0.1
mod.group = dev.spiritstudios
mod.id = snapper

deps.minecraft=1.21
deps.loader=0.15.11
deps.loader=0.16.5
deps.yarn=1.21+build.9

deps.fabricapi=0.102.0+1.21
deps.specter=1.0.2
deps.fabricapi=0.110.0+1.21.1
deps.specter=1.0.6
38 changes: 38 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
[versions]
fabric_loom = "1.8-SNAPSHOT"
minotaur = "2.+"

minecraft = "1.21"
yarn = "1.21+build.9"

fabric_loader = "0.16.5"
fabric_api = "0.110.0+1.21.1"

specter = "1.0.6"
objc_bridge = "1.0.0"

[plugins]
fabric_loom = { id = "fabric-loom", version.ref = "fabric_loom" }
minotaur = { id = "com.modrinth.minotaur", version.ref = "minotaur" }

[libraries]
minecraft = { group = "mojang", name = "minecraft", version.ref = "minecraft" }
yarn = { group = "net.fabricmc", name = "yarn", version.ref = "yarn" }

fabric_loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fabric_loader" }
fabric_api = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fabric_api" }

specter_config = { group = "dev.spiritstudios.specter", name = "specter-config", version.ref = "specter" }
specter_core = { group = "dev.spiritstudios.specter", name = "specter-core", version.ref = "specter" }
specter_serialization = { group = "dev.spiritstudios.specter", name = "specter-serialization", version.ref = "specter" }
specter_gui = { group = "dev.spiritstudios.specter", name = "specter-gui", version.ref = "specter" }

objc_bridge = { group = "ca.weblite", name = "java-objc-bridge", version.ref = "objc_bridge" }

[bundles]
specter = [
"specter_serialization",
"specter_core",
"specter_config",
"specter_gui"
]
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
5 changes: 4 additions & 1 deletion gradlew
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#

##############################################################################
#
Expand Down Expand Up @@ -84,7 +86,8 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
Expand Down
2 changes: 2 additions & 0 deletions gradlew.bat
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem

@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
Expand Down
86 changes: 17 additions & 69 deletions src/client/java/dev/spiritstudios/snapper/Snapper.java
Original file line number Diff line number Diff line change
@@ -1,46 +1,32 @@
package dev.spiritstudios.snapper;

import dev.spiritstudios.snapper.gui.ScreenshotScreen;
import dev.spiritstudios.snapper.gui.ScreenshotViewerScreen;
import dev.spiritstudios.snapper.util.*;
import dev.spiritstudios.specter.api.ModMenuHelper;
import dev.spiritstudios.specter.api.core.util.ClientKeybindEvents;
import dev.spiritstudios.snapper.util.MacActions;
import dev.spiritstudios.snapper.util.PlatformHelper;
import dev.spiritstudios.snapper.util.WindowsActions;
import dev.spiritstudios.specter.api.config.ModMenuHelper;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
import org.lwjgl.glfw.GLFW;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.List;

public class Snapper implements ClientModInitializer {
public final class Snapper implements ClientModInitializer {
public static final String MODID = "snapper";
public static final Logger LOGGER = LoggerFactory.getLogger(MODID);

public static final boolean IS_IRIS_INSTALLED = FabricLoader.getInstance().isModLoaded("iris");
public static final KeyBinding RECENT_SCREENSHOT_KEY = KeyBindingHelper.registerKeyBinding(
new KeyBinding(
"key.snapper.recent",
GLFW.GLFW_KEY_O,
"key.categories.misc"
));
private static final KeyBinding SCREENSHOT_MENU_KEY = KeyBindingHelper.registerKeyBinding(
new KeyBinding(
"key.snapper.screenshot_menu",
GLFW.GLFW_KEY_V,
"key.categories.misc"
));
private static final KeyBinding PANORAMA_KEY = KeyBindingHelper.registerKeyBinding(
new KeyBinding(
"key.snapper.panorama",
GLFW.GLFW_KEY_F8,
"key.categories.misc"
));

@Override
public void onInitializeClient() {
SnapperKeybindings.init();

ModMenuHelper.addConfig(Snapper.MODID, SnapperConfig.HOLDER.id());
}

public static Identifier id(String path) {
return Identifier.of(MODID, path);
}

public static PlatformHelper getPlatformHelper() {
return switch (Util.getOperatingSystem()) {
Expand All @@ -49,42 +35,4 @@ public static PlatformHelper getPlatformHelper() {
default -> new WindowsActions();
};
}

@Override
public void onInitializeClient() {
ModMenuHelper.addConfig(Snapper.MODID, SnapperConfig.INSTANCE.getId());

ClientKeybindEvents.pressed(SCREENSHOT_MENU_KEY).register(client -> client.setScreen(new ScreenshotScreen(null)));

ClientKeybindEvents.pressed(PANORAMA_KEY).register(client -> {
if (client.player == null) return;

if (IS_IRIS_INSTALLED) {
client.player.sendMessage(Text.translatable("text.snapper.panorama_failure_iris"), true);
return;
}

client.takePanorama(client.runDirectory, 1024, 1024);
client.player.sendMessage(Text.translatable(
"text.snapper.panorama_success",
SCREENSHOT_MENU_KEY.getBoundKeyLocalizedText()
), true);
});

ClientKeybindEvents.pressed(RECENT_SCREENSHOT_KEY).register(client -> {
List<File> screenshots = ScreenshotActions.getScreenshots(client);
if (screenshots.isEmpty()) {
if (client.player != null)
client.player.sendMessage(Text.translatable("text.snapper.screenshot_failure_open"), true);
return;
}

File latestScreenshot = screenshots.getFirst();
client.setScreen(new ScreenshotViewerScreen(
ScreenshotImage.of(latestScreenshot, client.getTextureManager()),
latestScreenshot,
client.currentScreen
));
});
}
}
23 changes: 16 additions & 7 deletions src/client/java/dev/spiritstudios/snapper/SnapperConfig.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
package dev.spiritstudios.snapper;

import dev.spiritstudios.specter.api.config.Config;
import net.minecraft.util.Identifier;
import dev.spiritstudios.specter.api.config.ConfigHolder;
import dev.spiritstudios.specter.api.config.Value;

public class SnapperConfig extends Config<SnapperConfig> {
public static final SnapperConfig INSTANCE = create(SnapperConfig.class);
public final class SnapperConfig extends Config<SnapperConfig> {
public static final ConfigHolder<SnapperConfig, ?> HOLDER = ConfigHolder.builder(
Snapper.id("snapper"), SnapperConfig.class
).build();
public static final SnapperConfig INSTANCE = HOLDER.get();

@Override
public Identifier getId() { return Identifier.of(Snapper.MODID, "snapper"); }

public Value<Boolean> copyTakenScreenshot = booleanValue(false)
public final Value<Boolean> copyTakenScreenshot = booleanValue(false)
.comment("Whether to copy screenshots to clipboard when taken.")
.build();

public final Value<Boolean> showSnapperTitleScreen = booleanValue(true)
.comment("Whether to show Snapper button on title screen.")
.build();

public final Value<Boolean> showSnapperGameMenu = booleanValue(true)
.comment("Whether to show Snapper button in game menu.")
.build();
}
Loading

0 comments on commit 8bd4cb4

Please sign in to comment.