Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Snapper 1.0.1: The Unbreakification Update #13

Merged
merged 8 commits into from
Dec 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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