111 Commits

Author SHA1 Message Date
Martin Prokoph
fa6fd82e4d fix: move gradient z-coordinate further back 2025-04-23 10:18:55 +02:00
Martin Prokoph
528958fa8c fix: improve gradient handling 2025-04-19 09:58:54 +02:00
Martin Prokoph
552f1e619e feat: improve config screen with comments 2025-03-29 19:30:38 +01:00
Martin Prokoph
c9c630ac11 fix: less invasive gradient injection
- Should fix various compatibility issues with other mods
2025-03-29 18:45:19 +01:00
Martin Prokoph
695fa67270 feat: various improvements
- Update to MidnightLib 1.7.0 and use its features to make the config screen more reliable
- Fix background gradient being opaque briefly when fading out while not in a world
- Fix 1.21.5 compat (still compatible with 1.21.4 as well :D)
2025-03-28 23:35:46 +01:00
Martin Prokoph
5f9738da38 fix: add null-check for Minecraft options
- Fixes #119
2025-02-02 21:00:03 +01:00
Martin Prokoph
881709c165 readme: remove duplicate banner 2025-01-27 16:39:08 +01:00
Martin Prokoph
50ed77006d chore: bump version 2025-01-27 12:24:13 +01:00
Martin Prokoph
e99572eb4d fix: crash in production when opening config screen 2025-01-27 12:23:07 +01:00
Martin Prokoph
f7465ee08e feat: title screen blur
- Also fix config changes not being saved
2025-01-25 18:53:32 +01:00
Martin Prokoph
75bfeb2ce3 feat: add mirror of blur radius to config screen
- The blur radius can normally be configured in Minecraft's Accessibility settings. However, this has caused confusion for some users, so it can now also be configured via the config screen.
2025-01-20 16:44:35 +01:00
Martin Prokoph
e5c2a542f4 fix: container blur not working on NeoForge 2025-01-14 11:50:04 +01:00
Martin Prokoph
a13cdd11a7 Update dependencies to 1.21.4 2024-12-08 18:11:51 +01:00
Martin Prokoph
6f10a7f3df Update to 1.21.3 2024-11-05 10:48:31 +01:00
Martin Prokoph
d79dfc004b Final changes before 5.0.0 2024-09-07 00:56:11 +02:00
Martin Prokoph
2961637df0 Create README.md 2024-09-06 23:39:25 +02:00
Martin Prokoph
8817e18a55 Increased max blur intensity & Working screen overrides
- EMI compat now works using forced blur
- Iris shader screen is now sooo much smoother
2024-09-06 23:33:10 +02:00
Martin Prokoph
f68048d955 Architectury port, EMI compat 2024-09-06 21:44:34 +02:00
Martin Prokoph
b6266b8e48 Merge pull request #106 from WForst-Breeze/plus
Update zh_cn translations for plus
2024-09-06 19:34:14 +02:00
Martin Prokoph
d78520448c Merge pull request #107 from yichifauzi/plus
Added Traditional Chinese (zh_tw.json)
2024-09-06 19:33:44 +02:00
dirtTW
83f2281cb0 Update zh_tw.json 2024-08-02 18:57:40 +07:00
dirtTW
081b0076c8 Added Traditional Chinese (zh_tw.json)
Added Traditional Chinese localization
2024-08-02 18:48:13 +07:00
风释清然SC
5afd31651a Update translations for zh_cn 2024-07-25 17:57:56 +08:00
Martin Prokoph
5f0d65e84c Update to 1.21 & Add exclusion list
- Iris' shader selection screen is excluded by default
- Also added unifiedPublishing for easier update publishing
2024-06-17 11:09:58 +02:00
Martin Prokoph
0799437138 Merge pull request #97 from TheLegendofSaram/Plus-Mexican-Spanish-translation
Update es_mx
2024-06-16 18:55:42 +02:00
Santiago Hernandez
fd2e4da3a7 Update es_mx
A translation for Blur+
2024-05-03 15:37:34 -04:00
Martin Prokoph
4c5e56ae80 Merge pull request #96 from Motschen/fabric-1.20.4
Sync Spanish translation into Blur+
2024-05-02 20:54:00 +02:00
Martin Prokoph
0449c77fe4 Merge pull request #90 from TheLegendofSaram/fabric-1.20.4
Mexican Spanish translation
2024-05-02 20:51:40 +02:00
Martin Prokoph
0893d6ef6c Merge pull request #95 from mpustovoi/plus
Update `ru_ru.json` for `plus`
2024-05-02 20:48:42 +02:00
Martin Prokoph
7c89dee562 Finishing touches
- Correctly scale gradients
- Updated German translations
2024-05-02 20:47:54 +02:00
Korben
22af1ef118 Update ru_ru.json for plus 2024-05-01 21:52:10 +03:00
Martin Prokoph
853f137d0c Another big step towards Blur+
- Added rainbow mode!
- Allow gradients to be rotated
- Add many new animation curves
- Update to 1.20.5
2024-04-29 15:10:43 +02:00
Santiago Hernandez
b09180a812 Mexican Spanish translation
Just a simple Mexican Spanish translation
2024-03-27 12:16:19 -03:00
Martin Prokoph
22037bd37d Rewrite large parts of the mod
Blur is now more alive than ever, as I've been working on a new update: Blur+ 🪩
The mod's goal now is to improve upon the vanilla blur effect, adding smooth & configurable animations, the ability to apply it to containers (such as the inventory, chests, etc.), as well as customizable gradient backgrounds. 🌈
2024-03-23 15:47:29 +01:00
Martin Prokoph
43d2b02162 Update MidnightLib to fix ModMenu 2023-12-19 15:20:00 +01:00
Martin Prokoph
c5f81c7eb1 Merge pull request #84 from SzczurekYT/null-fix
Fix crash when Blur.prevScreen is null
2023-12-19 14:32:14 +01:00
Martin Prokoph
210759cf6f Merge pull request #85 from backryun/fabric-1.20.4
Ready for adopt 1.20.4
2023-12-19 14:30:15 +01:00
backryun
266a37da20 satin+midnightlib update 2023-12-19 22:06:15 +09:00
Backryun
ef583e6ace Ready for update 1.20.4 2023-12-11 18:22:27 +09:00
SzczurekYT
6ee97e7415 Fix crash when Blur.prevScreen is null 2023-12-04 17:11:36 +01:00
Backryun
36514d5901 Update API 2023-11-03 19:28:18 +09:00
Backryun
7ed281b2f9 Update API+Loader 2023-10-31 00:38:17 +09:00
Backryun
b240c303c3 Update gradle+API+Yarn+Loader 2023-10-10 22:21:26 +09:00
Backryun
a092873127 fix workflow+update deps 2023-10-02 15:59:28 +09:00
Motschen
f9a54f936d Compress icon 2023-09-30 10:37:27 +02:00
Motschen
bd3b58adcb Blur 3.1.1 - 1.20.2 & New excluded screens
- Port to 1.20.2 by @TheMrEngMan & @backryun
- Exclude MidnightControls' touchscreen overlay and Baritone click screen by default (closes #75)
- Miscellaneous fixes
2023-09-30 10:31:11 +02:00
Martin Prokoph
d8b6a14e7f Merge pull request #81 from TheMrEngMan/fabric-1.20
Update to Minecraft 1.20.2
2023-09-30 10:01:02 +02:00
TheMrEngMan
d726e20410 Update to Minecraft 1.20.2
Bump satin dependency to version 1.14.0
Bump midnightlib dependency to version 1.5.0
Bump version to 3.1.1
2023-09-25 03:57:02 -04:00
Motschen
b4efd59322 Blur 3.1.0 - 1.20 & Fade Out Fix
- Update to 1.20
- Fix fade out applying to screens without blur
- Enable fade out effect by default
2023-06-10 16:42:44 +02:00
Martin Prokoph
98b398ab6c Merge pull request #74 from backryun/fabric-1.19.4
Upstream Fabric dependencys
2023-06-10 15:09:23 +02:00
Martin Prokoph
66e0c0408a Merge pull request #68 from HhiPyrene/fabric-1.19.4
zh_cn
2023-06-10 15:09:02 +02:00
backryun
11dde13801 Upstream Fabric dependencys 2023-04-28 19:47:29 +09:00
HhiPyrene
3ea75d519c Add files via upload 2023-03-26 10:57:10 +08:00
Motschen
ab80391b29 Blur 3.0.0 - Fade out & 1.19.4
- Add fade out effect (closes #41)
  - Duration can be configured seperately
  - Disabled by default until I get some feedback on it
- Improve config screen (tabs & sliders)
- French translations by @Calvineries
- Update to 1.19.4 by @backryun & @byquanton
2023-03-22 18:19:22 +01:00
Martin Prokoph
a51b02aa04 Merge pull request #62 from Calvineries/patch-1
Create fr_fr.json
2023-03-22 14:14:04 +01:00
Martin Prokoph
766f30b466 Merge pull request #64 from byquanton/fabric-1.19.4
Port to 1.19.4
2023-03-22 14:04:55 +01:00
Motschen
77badf3494 Implement fade out effect, better config screen 2023-03-22 14:45:53 +01:00
Martin Prokoph
c868cf1ef7 Merge branch 'fabric-1.19.3' into fabric-1.19.4 2023-03-22 14:02:57 +01:00
byquanton
876c5256ae 1.19.4 Port 2023-03-17 22:42:15 +01:00
byquanton
0f279a0f91 Merge remote-tracking branch 'backryun/fabric-1.19.3' into fabric-1.19.4 2023-03-17 21:32:33 +01:00
backryun
d58cd66cc8 Merge remote-tracking branch 'origin/fabric-1.19.3' into fabric-1.19.3 2023-03-08 23:07:37 +09:00
backryun
44ae96ef50 Update Gradle 8.0.2 2023-03-08 23:07:27 +09:00
backryun
427d453f79 Upstream Gradle version 8.0.2 2023-03-05 19:59:41 +09:00
backryun
521cc15306 Upstream Gradle,Fabric Dependencys 2023-02-28 22:20:04 +09:00
backryun
3528305c93 Upstream Fabric dependencys 2023-02-06 22:27:26 +09:00
Calvineries
2ad42cf1e9 Create fr_fr.json 2023-01-21 09:54:25 +01:00
backryun
84cc94fba4 Upsteram Fabric components 2023-01-03 23:45:22 +09:00
Martin Prokoph
e139a2319e Blur 2.6.1 2022-12-14 16:27:25 +00:00
Martin Prokoph
0d90cac688 Merge pull request #61 from backryun/fabric-1.19.3
Upstream components for 1.19.3
2022-12-14 16:21:07 +00:00
backryun
2fb8f29fee Fix workflow for new branch 2022-12-12 22:28:14 +09:00
backryun
f69af4c800 Switch to 1.19.3 support 2022-12-12 22:27:38 +09:00
backryun
dc94bd3f5a Upstream Fabric loader and API 2022-11-30 22:51:03 +09:00
backryun
7dd93da833 Upstream gradle 7.6 official version + fabric API 2022-11-25 23:35:02 +09:00
Martin Prokoph
7258cefb5d Merge pull request #56 from FITFC/fabric-1.19
updated pt_br
2022-11-12 19:32:40 +01:00
Martin Prokoph
dc7e5bb1e0 Merge pull request #57 from backryun/fabric-1.19
Expend build environment JAVA 19 + Update midnightlib 1.0.0
2022-11-12 19:32:12 +01:00
backryun
d42545570e Update gradle 7.6-rc2 2022-11-09 23:02:51 +09:00
backryun
9854e97996 Update fabric API 0.66.0 2022-11-09 23:00:51 +09:00
backryun
7b253f50c1 Expend build environment JAVA 19 + Update midnightlib 1.0.0 2022-10-31 22:38:45 +09:00
FITFC
8a1824c906 updated pt_br 2022-10-29 20:04:53 -05:00
Martin Prokoph
f958e43bd1 Merge pull request #55 from backryun/fabric-1.19
Add workflow and Updated Dependencys
2022-10-29 13:53:44 +02:00
backryun
7ab190d697 Workflow! 2022-10-29 14:11:55 +09:00
backryun
2dc68068e2 Update Dependencys
Fabric yarn+loader
midnightlib
2022-10-29 14:10:36 +09:00
Martin Prokoph
35635ad633 Merge pull request #53 from GodGun968/patch-1
Update zh_cn.json
2022-10-19 20:11:35 +02:00
Martin Prokoph
9c4f753fcf Merge pull request #52 from ConsoleLogLuke/iris-exclusion
Add Iris's shader pack screen to the exclusion list
2022-10-19 20:11:10 +02:00
Martin Prokoph
13d6398de0 Merge pull request #49 from Altegar/patch-1
Create uk_ua.json
2022-10-19 20:10:23 +02:00
backryun
8e0da73778 migrate to 1.19.2 and update dependencies (#51)
* migrate to 1.19.2

* Update dependencies

* Update yarn+API
2022-10-19 18:06:51 +00:00
神枪968
e668f3fa60 Update zh_cn.json 2022-10-16 10:44:01 +08:00
Luke Chambers
6000ba8f64 Add Iris's shader pack screen to the exclusion list 2022-10-10 01:42:00 -04:00
Sushomeister
e85231757a Create uk_ua.json 2022-07-26 14:35:53 +03:00
Motschen
eca592b646 Blur 2.6.0 - Ease-in animation by @Scrumplex
- Also add Korean translations by @gyular
2022-06-26 17:22:43 +02:00
gyular
000315bf13 add ko_kr.json (#47) 2022-06-26 15:19:36 +00:00
Sefa Eyeoglu
fe7229c518 Add easing option to fade animation (#48)
* Add easing option to fade animation

* Fix German translation
2022-06-26 15:01:05 +00:00
Motschen
b944975c9a Blur 2.5.0 - Update to 1.19, Better Exclusions & Colors 2022-06-11 23:28:55 +02:00
byquanton
747188d023 1.19 Update (#45) 2022-06-11 19:40:09 +00:00
backryun
a199313682 Fabric 1.18.2 (#40)
* Update 1.18.1 and dependencys
gradle 7.3.3
fabric-loader 0.12.12
fabric-api 0.45.2
satin 1.7.2

* Fabric-API update to 0.46.0

* fabric-loom 0.11
update yarn
update fabric-API

* update fabric loader
update fabric-API

* 1.18.2-rc1

* 1.18.2
2022-05-08 17:00:30 +00:00
Luni
fadf94d9be Add AdvancedChat to the exclusion list (#43) 2022-05-08 16:54:39 +00:00
Motschen
1260881f41 Update to 1.18 2021-12-04 11:42:13 +01:00
tortoise
08bc0d9512 Adding a swedish translation (#33)
* Create sv_se.json

mid-tier translations as a save, i'm gonna think about them later

* Update sv_se.json

better translations
2021-12-04 10:33:05 +00:00
Motschen
f792d34295 Blur 2.4.0 - Ingame-Configurable Exclusions & Fixes
- Made Blur exclusions configurable in-game
- ReplayMod and ProjectInception screens are excluded by default
- Update to MidnightLib 3.0.0
- Fix version in fabric.mod.json
2021-10-31 16:20:23 +01:00
Motschen
895448b13d Merge pull request #25 from NatureHog/fabric-1.17
Fix internal version of mod
2021-10-31 08:22:40 +00:00
Motschen
e749f18484 Merge pull request #29 from backryun/patch-backryun
Update to MidnightLib v0.2.8
2021-10-31 08:21:14 +00:00
backryun
91be4094d3 Update to MidnightLib v0.2.8 2021-10-29 15:20:17 +09:00
NatureHog
55ad971584 Fix internal version
Fix the internal Fabric version, so that tools like "Mod Manager" (an add-on for Mod Manager), which check for this version number for updates.
2021-09-28 23:19:59 +02:00
Motschen
0ae5c7569d Remove loftover old MidnightConfig implementation 2021-09-25 12:50:33 +02:00
Motschen
0eb076fb40 Blur 2.3.0 - Update to MidnightLib v0.2.5
Add live config preview
Russian translations by @Felix14-v2
Brazilian translations by @Percario
2021-09-24 18:34:00 +02:00
Motschen
79814b4395 Merge pull request #24 from Felix14-v2/fabric-1.17
Added translations into russian (1.17)
2021-09-24 15:19:02 +00:00
Felix14-v2
3800b44eb3 Add files via upload 2021-09-20 22:10:34 +03:00
Motschen
b6e54fddfa Merge pull request #22 from maneschy-d/patch-1
add pt_br.json
2021-09-02 17:46:47 +02:00
Maneschy
9feb8a42bd add pt_br.json 2021-08-31 14:53:51 -03:00
Motschen
3b9fa30b11 Merge pull request #20 from backryun/fabric-1.17
update minecraft version and gradle
2021-08-20 10:34:48 +02:00
backryun
6667f7564f update minecraft version and gradle 2021-08-19 14:12:11 +09:00
63 changed files with 1560 additions and 1072 deletions

29
.github/workflows/gradle.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
on:
push:
branches: [ "fabric-1.20.4" ]
pull_request:
branches: [ "fabric-1.20.4" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build --stacktrace --info
- name: Upload a Build Artifact
uses: actions/upload-artifact@v3
with:
name: Blur-Artifact
path: build/libs/blur-*.*.jar
if-no-files-found: error

47
.gitignore vendored
View File

@@ -1,29 +1,20 @@
/download
/eclipseBin
build/
*.ipr
run/
*.iws
out/
*.iml
.gradle/
output/
bin/
libs/
## gradle
/.gradle
/build
## ForgeGradle
/run
/*.launch
## eclipse
/eclipse
/.settings
/.metadata
/.classpath
/.project
/bin
## intellij
/out
/.idea
/*.iml
/*.ipr
/*.iws
/atlassian-ide-plugin.xml
## gedit
*~
.classpath
.project
.idea/
classes/
.metadata
.vscode
.settings
*.launch
.architectury-transformer/debug.log

7
README.md Normal file
View File

@@ -0,0 +1,7 @@
Ever thought that the world behind your inventory was just too distracting?
Or that the default Minecraft blur effect is just too boring?
Then this mod is just right for you!
![Image showing the Minecraft inventory with a blur effect in the background](https://cdn.modrinth.com/data/NK39zBp2/images/213f18fcf3d6c55cad164077d569e2f0339551da.webp)
Download now on [Modrinth](https://modrinth.com/mod/blur-plus)

142
build.gradle Normal file → Executable file
View File

@@ -1,87 +1,73 @@
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
plugins {
id 'fabric-loom' version '0.8-SNAPSHOT'
id 'maven-publish'
id "architectury-plugin" version "3.4-SNAPSHOT"
id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false
id "me.shedaniel.unified-publishing" version "0.1.+" apply false
id 'com.github.johnrengelman.shadow' version '8.1.1' apply false
}
sourceCompatibility = JavaVersion.VERSION_16
targetCompatibility = JavaVersion.VERSION_16
archivesBaseName = project.archives_base_name
version = project.mod_version
group = project.maven_group
repositories {
maven {
name = 'Ladysnake Mods'
url = 'https://ladysnake.jfrog.io/artifactory/mods'
content {
includeGroup 'io.github.ladysnake'
includeGroupByRegex 'io\\.github\\.onyxstudios.*'
}
}
maven {
url = 'https://maven.terraformersmc.com/releases'
content {
includeGroup 'com.terraformersmc'
}
}
architectury {
minecraft = rootProject.minecraft_version
}
dependencies {
minecraft "com.mojang:minecraft:${minecraft_version}"
mappings "net.fabricmc:yarn:${yarn_mappings}"
modImplementation "net.fabricmc:fabric-loader:${loader_version}"
modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}"
modImplementation "io.github.ladysnake:satin:${satin_version}"
include "io.github.ladysnake:satin:${satin_version}"
modCompileOnly "com.terraformersmc:modmenu:${project.modmenu_version}"
modRuntime "com.terraformersmc:modmenu:${project.modmenu_version}"
implementation 'com.google.code.findbugs:jsr305:3.0.2'
}
processResources {
inputs.property "version", project.version
filesMatching("fabric.mod.json") {
expand "version": project.version
}
}
// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
java {
withSourcesJar()
}
jar {
from "LICENSE"
}
// configure the maven publication
publishing {
publications {
mavenJava(MavenPublication) {
// add all the jars that should be included when publishing to maven
artifact(remapJar) {
builtBy remapJar
}
artifact(sourcesJar) {
builtBy remapSourcesJar
}
}
}
// select the repositories you want to publish to
subprojects {
apply plugin: "dev.architectury.loom"
repositories {
// uncomment to publish to the local maven
// mavenLocal()
maven {
url = "https://api.modrinth.com/maven"
}
}
dependencies {
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
// The following line declares the yarn mappings you may select this one as well.
mappings loom.layered {
it.mappings("net.fabricmc:yarn:$rootProject.yarn_mappings:v2")
it.mappings("dev.architectury:yarn-mappings-patch-neoforge:$rootProject.yarn_mappings_patch_neoforge_version")
}
}
}
allprojects {
apply plugin: "java"
apply plugin: "architectury-plugin"
apply plugin: "maven-publish"
archivesBaseName = rootProject.archives_base_name
version = rootProject.mod_version
group = rootProject.maven_group
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
options.release = 21
}
ext {
releaseChangelog = {
def changes = new StringBuilder()
changes << "## Blur+ v$project.version for $project.minecraft_version\n[View the changelog](https://www.github.com/Motschen/Blur/commits/)"
def proc = "git log --max-count=1 --pretty=format:%s".execute()
proc.in.eachLine { line ->
def processedLine = line.toString()
if (!processedLine.contains("New translations") && !processedLine.contains("Merge") && !processedLine.contains("branch")) {
changes << "\n- ${processedLine.capitalize()}"
}
}
proc.waitFor()
return changes.toString()
}
}
processResources {
// Minify json resources
doLast {
fileTree(dir: outputs.files.asPath, include: "**/*.json").each {
File file -> file.text = JsonOutput.toJson(new JsonSlurper().parse(file))
}
}
}
java {
withSourcesJar()
}
}

24
common/build.gradle Normal file
View File

@@ -0,0 +1,24 @@
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}"
modCompileOnly "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-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.
}
}

View File

@@ -0,0 +1,103 @@
package eu.midnightdust.blur;
import eu.midnightdust.blur.config.BlurConfig;
import eu.midnightdust.blur.util.RainbowColor;
import eu.midnightdust.lib.util.MidnightColorUtil;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import org.joml.Math;
import org.joml.Matrix4f;
import java.awt.Color;
import java.lang.Double;
import static eu.midnightdust.blur.BlurInfo.*;
import static eu.midnightdust.blur.util.RainbowColor.hue;
import static eu.midnightdust.blur.util.RainbowColor.hue2;
public class Blur {
public static final String MOD_ID = "blur";
public static void init() {
BlurConfig.init(MOD_ID, BlurConfig.class);
}
public static boolean doFade = false;
public static void onRender() {
if (!BlurInfo.doTest && BlurInfo.screenChanged) { // After the tests for blur and background color have been completed
Blur.onScreenChange();
BlurInfo.screenChanged = false;
}
BlurInfo.doTest = false; // Set the test state to completed, as tests will happen in the same tick.
}
public static void renderFadeout(DrawContext context, int width, int height, MinecraftClient client) {
if (BlurInfo.start >= 0 && !BlurInfo.screenHasBlur && BlurInfo.prevScreenHasBlur) { // Fade out in non-blurred screens
client.gameRenderer.renderBlur();
if (BlurInfo.prevScreenHasBackground && BlurConfig.useGradient) Blur.renderRotatedGradient(context, width, height);
}
}
public static void onScreenChange() {
if (screenHasBlur) {
if (doFade) {
start = System.currentTimeMillis();
doFade = false;
}
} else if (prevScreenHasBlur && BlurConfig.fadeOutTimeMillis > 0) {
start = System.currentTimeMillis();
doFade = true;
} else {
start = -1;
doFade = true;
}
}
public static void updateProgress(boolean fadeIn) {
double x;
if (fadeIn) {
x = Math.min((System.currentTimeMillis() - start) / (double) BlurConfig.fadeTimeMillis, 1);
}
else {
x = Math.max(1 + (start - System.currentTimeMillis()) / (double) BlurConfig.fadeOutTimeMillis, 0);
if (x <= 0) {
start = -1;
}
}
x = BlurConfig.animationCurve.apply(x, fadeIn);
x = Math.clamp(0, 1, x);
progress = Double.valueOf(x).floatValue();
}
public static int getBackgroundColor(boolean second) {
int a = second ? BlurConfig.gradientEndAlpha : BlurConfig.gradientStartAlpha;
var col = MidnightColorUtil.hex2Rgb(second ? BlurConfig.gradientEnd : BlurConfig.gradientStart);
if (BlurConfig.rainbowMode) col = second ? Color.getHSBColor(hue, 1, 1) : Color.getHSBColor(hue2, 1, 1);
int r = (col.getRGB() >> 16) & 0xFF;
int b = (col.getRGB() >> 8) & 0xFF;
int g = col.getRGB() & 0xFF;
float prog = progress;
a = (int) (prog * a);
r = (int) (prog * r);
g = (int) (prog * g);
b = (int) (prog * b);
return a << 24 | r << 16 | b << 8 | g;
}
public static int getRotation() {
if (BlurConfig.rainbowMode) return RainbowColor.rotation;
return BlurConfig.gradientRotation;
}
public static void renderRotatedGradient(DrawContext context, int width, int height) {
float diagonal = Math.sqrt((float) width*width + height*height);
int smallestDimension = Math.min(width, height);
context.getMatrices().push();
Matrix4f posMatrix = context.getMatrices().peek().getPositionMatrix();
posMatrix.rotationZ(Math.toRadians(getRotation()));
posMatrix.setTranslation(width / 2f, height / 2f, -1000); // Make the gradient's center the pivot point
posMatrix.scale(diagonal / smallestDimension); // Scales the gradient to the maximum diagonal value needed
context.fillGradient(-width / 2, -height / 2, width / 2, height / 2, Blur.getBackgroundColor(false), Blur.getBackgroundColor(true)); // Actually draw the gradient
context.getMatrices().pop();
}
}

View File

@@ -0,0 +1,32 @@
package eu.midnightdust.blur;
import eu.midnightdust.blur.config.BlurConfig;
import net.minecraft.client.gui.screen.Screen;
public class BlurInfo {
public static long start;
public static float progress;
public static boolean prevScreenHasBlur;
public static boolean screenHasBlur;
public static boolean prevScreenHasBackground;
public static boolean screenHasBackground;
public static boolean doTest = true;
public static boolean screenChanged = true;
public static long lastScreenChange = System.currentTimeMillis();
public static void reset(Screen newScreen) {
// Here, we reset all tests, to check if the new screen has blur and/or a background
if (newScreen != null && BlurConfig.excludedScreens.contains(newScreen.getClass().getCanonicalName())) return;
prevScreenHasBlur = screenHasBlur;
prevScreenHasBackground = screenHasBackground;
screenHasBlur = false;
screenHasBackground = false;
doTest = true;
screenChanged = true;
start = -1;
lastScreenChange = System.currentTimeMillis();
}
}

View File

@@ -0,0 +1,105 @@
package eu.midnightdust.blur.config;
import com.google.common.collect.Lists;
import eu.midnightdust.lib.config.MidnightConfig;
import net.minecraft.client.MinecraftClient;
import java.util.List;
import java.util.function.Function;
import static java.lang.Math.*;
public class BlurConfig extends MidnightConfig {
public static final String ANIMATIONS = "animations";
public static final String STYLE = "style";
public static final String SCREENS = "screens";
@Entry @Hidden public static int configVersion = 2;
@Comment(category = SCREENS, centered = true)
public static Comment _general;
@Entry(category = SCREENS)
public static boolean blurContainers = true;
@Entry(category = SCREENS)
public static boolean blurTitleScreen = false;
@Condition(requiredOption = "blurTitleScreen", visibleButLocked = true)
@Entry(category = SCREENS)
public static boolean darkenTitleScreen = false;
@Comment(category = SCREENS, centered = true)
public static Comment _advanced;
@Entry(category = SCREENS) // Screens where Blur+ should not apply transition effects (mostly dynamically blurred screens)
public static List<String> excludedScreens = Lists.newArrayList("net.irisshaders.iris.gui.screen.ShaderPackScreen");
@Entry(category = SCREENS) // Screens where the vanilla blur effect should be force enabled
public static List<String> forceEnabledScreens = Lists.newArrayList("dev.emi.emi.screen.RecipeScreen");
@Entry(category = SCREENS) // Screens where the vanilla blur effect should be force disabled
public static List<String> forceDisabledScreens = Lists.newArrayList();
@Comment(category = STYLE, centered = true)
public static Comment _blur;
@Entry(category = STYLE, isSlider = true, min = 0, max = 20)
public static int radius = 5;
@Comment(category = STYLE, centered = true)
public static Comment _gradient;
@Entry(category = STYLE)
public static boolean useGradient = true;
@Condition(requiredOption = "useGradient", visibleButLocked = true)
@Entry(category = STYLE, isColor = true, width = 7, min = 7)
public static String gradientStart = "#000000";
@Condition(requiredOption = "useGradient", visibleButLocked = true)
@Entry(category = STYLE, isSlider = true, min = 0, max = 255)
public static int gradientStartAlpha = 75;
@Condition(requiredOption = "useGradient", visibleButLocked = true)
@Entry(category = STYLE, isColor = true, width = 7, min = 7)
public static String gradientEnd = "#000000";
@Condition(requiredOption = "useGradient", visibleButLocked = true)
@Entry(category = STYLE, isSlider = true, min = 0, max = 255)
public static int gradientEndAlpha = 75;
@Condition(requiredOption = "useGradient", visibleButLocked = true)
@Entry(category = STYLE, isSlider = true, min = 0, max = 360)
public static int gradientRotation = 0;
@Entry(category = STYLE)
public static boolean rainbowMode = false;
@Comment(category = ANIMATIONS, centered = true)
public static Comment _animations;
@Entry(category = ANIMATIONS, min = 0, max = 2000, isSlider = true)
public static int fadeTimeMillis = 300;
@Entry(category = ANIMATIONS, min = 0, max = 2000, isSlider = true)
public static int fadeOutTimeMillis = 300;
@Entry(category = ANIMATIONS)
public static BlurConfig.Easing animationCurve = Easing.FLAT;
@Override
public void writeChanges(String modid) {
super.writeChanges(modid);
if (MinecraftClient.getInstance().options != null)
MinecraftClient.getInstance().options.getMenuBackgroundBlurriness().setValue(radius);
}
public enum Easing {
// Based on https://gist.github.com/dev-hydrogen/21a66f83f0386123e0c0acf107254843
// Thank you very much!
FLAT(x -> x, x -> x),
SINE(x -> 1 - cos(x * PI) / 2, x -> sin(x * PI) / 2),
QUAD(x -> x * x, x -> 1 - (1 - x) * (1 - x)),
CUBIC(x -> x * x * x, x -> 1 - pow(1 - x, 3)),
QUART(x -> x * x * x * x, x -> 1 - pow(1 - x, 4)),
QUINT(x -> x * x * x * x * x, x -> 1 - pow(1 - x, 5)),
EXPO(x -> x == 0 ? 0 : pow(2, 10 * x - 10), x -> x == 1 ? 1 : 1 - pow(2, -10 * x)),
CIRC(x -> 1 - sqrt(1 - pow(x, 2)), x -> sqrt(1 - pow(x - 1, 2))),
BACK(x -> 2.70158 * x * x * x - 1.70158 * x * x,x -> 1 + 2.70158 * pow(x - 1, 3) + 1.70158 * pow(x - 1, 2)),
ELASTIC(x -> x == 0 ? 0 : x == 1 ? 1 : -pow(2, 10 * x - 10) * sin((x * 10 - 10.75) * ((2 * PI) / 3)), x -> x == 0 ? 0 : x == 1 ? 1 : pow(2, -10 * x) * sin((x * 10 - 0.75) * ((2 * PI) / 3)) + 1);
final Function<Double, Number> functionIn;
final Function<Double, Number> functionOut;
Easing(Function<Double, Number> functionIn, Function<Double, Number> functionOut) {
this.functionIn = functionIn;
this.functionOut = functionOut;
}
public Double apply(Double x, boolean in) {
if (in) return functionIn.apply(x).doubleValue();
return functionOut.apply(x).doubleValue();
}
}
}

View File

@@ -0,0 +1,22 @@
package eu.midnightdust.blur.mixin;
import net.minecraft.client.option.GameOptions;
import net.minecraft.client.option.SimpleOption;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(GameOptions.class)
public abstract class MixinGameOptions {
@Shadow @Final private SimpleOption<Integer> menuBackgroundBlurriness;
@Shadow @Final private SimpleOption<Double> chatLineSpacing;
@Redirect(method = "<init>", at = @At(value = "NEW", target = "net/minecraft/client/option/SimpleOption$ValidatingIntSliderCallbacks", ordinal = 2))
private SimpleOption.ValidatingIntSliderCallbacks blur$increaseMaxBlurriness(int minInclusive, int maxInclusive) {
if (this.menuBackgroundBlurriness == null && this.chatLineSpacing != null)
return new SimpleOption.ValidatingIntSliderCallbacks(minInclusive, 20);
return new SimpleOption.ValidatingIntSliderCallbacks(minInclusive, maxInclusive);
}
}

View File

@@ -0,0 +1,18 @@
package eu.midnightdust.blur.mixin;
import eu.midnightdust.blur.Blur;
import eu.midnightdust.blur.BlurInfo;
import net.minecraft.client.render.GameRenderer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
@Mixin(GameRenderer.class)
public class MixinGameRenderer {
@ModifyVariable(method = "renderBlur", at = @At("STORE"), ordinal = 0)
private float blur$modifyRadius(float radius) { // Modify the radius based on the animation progress
if (!BlurInfo.screenChanged && BlurInfo.start >= 0) // Only update the progress after all tests have been completed
Blur.updateProgress(BlurInfo.screenHasBlur);
return radius * BlurInfo.progress;
}
}

View File

@@ -0,0 +1,29 @@
package eu.midnightdust.blur.mixin;
import eu.midnightdust.blur.Blur;
import eu.midnightdust.blur.config.BlurConfig;
import eu.midnightdust.lib.util.PlatformFunctions;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(HandledScreen.class)
public class MixinHandledScreen extends Screen {
protected MixinHandledScreen(Text title) {
super(title);
}
@Inject(method = "renderBackground", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawBackground(Lnet/minecraft/client/gui/DrawContext;FII)V", shift = At.Shift.BEFORE))
private void blur$renderContainerBlur(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { // Applies the blur effect in containers (Inventory, Chest, etc.)
if (BlurConfig.blurContainers) this.applyBlur();
}
@Inject(at = @At("HEAD"), method = "render")
public void blur$processScreenChange(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (PlatformFunctions.getPlatformName().equals("neoforge")) Blur.onRender();
}
}

View File

@@ -0,0 +1,30 @@
package eu.midnightdust.blur.mixin;
import eu.midnightdust.blur.Blur;
import eu.midnightdust.blur.BlurInfo;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.hud.InGameHud;
import net.minecraft.client.render.RenderTickCounter;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(InGameHud.class)
public class MixinInGameHud {
@Final @Shadow private MinecraftClient client;
@Inject(at = @At("TAIL"), method = "render")
public void blur$renderFadeOut(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { // Adds a fade-out effect when a player is in a world and closes all screens
if (client.currentScreen == null && client.world != null && BlurInfo.start >= 0 && BlurInfo.prevScreenHasBlur) {
BlurInfo.doTest = false;
BlurInfo.screenChanged = false;
this.client.gameRenderer.renderBlur();
if (BlurInfo.prevScreenHasBackground) Blur.renderRotatedGradient(context, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
}
}
}

View File

@@ -0,0 +1,26 @@
package eu.midnightdust.blur.mixin;
import eu.midnightdust.blur.Blur;
import eu.midnightdust.lib.config.MidnightConfig;
import net.minecraft.client.MinecraftClient;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Objects;
@Mixin(value = MidnightConfig.EntryInfo.class, remap = false)
public abstract class MixinMidnightConfig$EntryInfo {
@Shadow @Final public String modid;
@Shadow @Final public String fieldName;
@Shadow Object value;
@Inject(at = @At(value = "TAIL"), method = "updateFieldValue")
private void blur$instantlyApplyRadius(CallbackInfo ci) {
if (Objects.equals(modid, Blur.MOD_ID) && Objects.equals(fieldName, "radius"))
MinecraftClient.getInstance().options.getMenuBackgroundBlurriness().setValue((int) value);
}
}

View File

@@ -0,0 +1,17 @@
package eu.midnightdust.blur.mixin;
import eu.midnightdust.blur.config.BlurConfig;
import eu.midnightdust.lib.config.MidnightConfig;
import net.minecraft.client.MinecraftClient;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(MidnightConfig.class)
public abstract class MixinMidnightConfig {
@Inject(at = @At(value = "INVOKE", target = "Lcom/google/gson/Gson;fromJson(Ljava/io/Reader;Ljava/lang/Class;)Ljava/lang/Object;", shift = At.Shift.AFTER), remap = false, method = "loadValuesFromJson")
private static void blur$syncRadius(CallbackInfo ci) {
BlurConfig.radius = MinecraftClient.getInstance().options.getMenuBackgroundBlurrinessValue();
}
}

View File

@@ -0,0 +1,30 @@
package eu.midnightdust.blur.mixin;
import eu.midnightdust.blur.Blur;
import eu.midnightdust.blur.BlurInfo;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
@Mixin(MinecraftClient.class)
public class MixinMinecraftClient {
@Inject(method = "setScreen",
at = @At(value = "FIELD",
target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;",
opcode = Opcodes.PUTFIELD))
private void blur$onScreenOpen(Screen newScreen, CallbackInfo info) {
if (BlurInfo.lastScreenChange < System.currentTimeMillis() - 100) { // For some reason, in certain scenarios the screen is set to a new one multiple times in a tick. We want to avoid that.
// Here, we reset all tests, to check if the new screen has blur and/or a background
BlurInfo.reset(newScreen);
// Manually activate the onScreenChange method when all screens are closed (in-game)
if (newScreen == null) Blur.onScreenChange();
}
}
}

View File

@@ -0,0 +1,65 @@
package eu.midnightdust.blur.mixin;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import eu.midnightdust.blur.BlurInfo;
import eu.midnightdust.blur.config.BlurConfig;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import eu.midnightdust.blur.Blur;
import net.minecraft.client.gui.screen.Screen;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(Screen.class)
public abstract class MixinScreen {
@Shadow @Final protected Text title;
@Shadow protected MinecraftClient client;
@Shadow public int width;
@Shadow public int height;
@Shadow protected abstract void applyBlur();
@Inject(at = @At("HEAD"), method = "render")
public void blur$processScreenChange(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) {
Blur.onRender();
Blur.renderFadeout(context, width, height, client);
}
@Inject(at = @At("HEAD"), method = "applyBlur", cancellable = true)
public void blur$getBlurEnabled(CallbackInfo ci) {
if (BlurConfig.forceDisabledScreens.contains(this.getClass().getCanonicalName())) {
ci.cancel(); return;
}
if (!BlurConfig.excludedScreens.contains(this.getClass().getCanonicalName()))
BlurInfo.screenHasBlur = true; // Test if the screen has blur
}
@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;renderBackgroundTexture(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/util/Identifier;IIFFII)V"), method = "renderDarkening(Lnet/minecraft/client/gui/DrawContext;IIII)V")
private void blur$applyGradient(DrawContext context, Identifier texture, int x, int y, float u, float v, int width, int height, Operation<Void> original) {
if (BlurConfig.useGradient) {
blur$renderGradient(context); // Replaces the background texture with a gradient
} else original.call(context, texture, x, y, u, v, width, height);
}
@WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;fillGradient(IIIIII)V"), method = "renderInGameBackground")
public void blur$rotatedGradient(DrawContext context, int startX, int startY, int endX, int endY, int colorStart, int colorEnd, Operation<Void> original) {
blur$renderGradient(context);
}
@Unique
private void blur$renderGradient(DrawContext context) {
BlurInfo.screenHasBackground = true; // Test if the screen has a background
if (BlurConfig.forceEnabledScreens.contains(this.getClass().getCanonicalName()))
this.applyBlur();
Blur.renderRotatedGradient(context, width, height); // Replaces the default gradient with our rotated one
}
}

View File

@@ -0,0 +1,28 @@
package eu.midnightdust.blur.mixin;
import eu.midnightdust.blur.Blur;
import eu.midnightdust.blur.config.BlurConfig;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.TitleScreen;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(TitleScreen.class)
public abstract class MixinTitleScreen extends Screen {
protected MixinTitleScreen(Text title) {
super(title);
}
@Inject(method = "renderPanoramaBackground", at = @At("TAIL"))
private void blur$renderTitleBlur(DrawContext context, float delta, CallbackInfo ci) { // Applies the blur effect in containers (Inventory, Chest, etc.)
if (BlurConfig.blurTitleScreen) {
Blur.updateProgress(true);
this.applyBlur();
if (BlurConfig.darkenTitleScreen) this.renderDarkening(context);
}
}
}

View File

@@ -0,0 +1,11 @@
package eu.midnightdust.blur.mixin;
import net.minecraft.client.gui.screen.Screen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(Screen.class)
public interface ScreenAccessor {
@Invoker("applyBlur")
void forceApplyBlur();
}

View File

@@ -0,0 +1,21 @@
package eu.midnightdust.blur.util;
import eu.midnightdust.blur.config.BlurConfig;
public class RainbowColor {
public static int rotation;
public static float hue;
public static float hue2 = 0.35f;
public static void tick() {
if (BlurConfig.rainbowMode) {
if (hue >= 1) hue = 0f;
hue += 0.01f;
if (hue2 >= 1) hue2 = 0f;
hue2 += 0.01f;
if (rotation >= 360) rotation = 0;
rotation += 1;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,36 @@
{
"blur.midnightconfig.title": "Blur+ Konfiguration",
"blur.midnightconfig.category.animations": "Animationen",
"blur.midnightconfig.category.screens": "Bildschirme",
"blur.midnightconfig.category.style": "Stil",
"blur.midnightconfig.blurContainers": "Unschärfe in Containern",
"blur.midnightconfig.blurTitleScreen": "Unschärfe im Titelbildschirm",
"blur.midnightconfig.darkenTitleScreen": "Abgedunkelter Titelhintergrund",
"blur.midnightconfig.fadeTimeMillis": "Überblendzeit (in Millisekunden)",
"blur.midnightconfig.fadeOutTimeMillis": "Ausblendzeit (in Millisekunden)",
"blur.midnightconfig.animationCurve": "Animationskurve",
"blur.midnightconfig.enum.Easing.FLAT": "Flach",
"blur.midnightconfig.enum.Easing.SINE": "Sinus",
"blur.midnightconfig.enum.Easing.QUAD": "Quadriert",
"blur.midnightconfig.enum.Easing.CUBIC": "Kubiert",
"blur.midnightconfig.enum.Easing.QUART": "Quart",
"blur.midnightconfig.enum.Easing.QUINT": "Quint",
"blur.midnightconfig.enum.Easing.EXPO": "Expo",
"blur.midnightconfig.enum.Easing.CIRC": "Kreis",
"blur.midnightconfig.enum.Easing.BACK": "Zurück",
"blur.midnightconfig.enum.Easing.ELASTIC": "Elastisch",
"blur.midnightconfig.radius": "Radius",
"blur.midnightconfig.rainbowMode": "Regenbogenmodus \uD83C\uDF08",
"blur.midnightconfig.useGradient": "Farbverlauf im Hintergrund",
"blur.midnightconfig.gradientStart": "Farbverlauf-Anfangsfarbe",
"blur.midnightconfig.gradientEnd": "Farbverlauf-Endfarbe",
"blur.midnightconfig.gradientStartAlpha": "Farbverlauf-Anfangstransparenz",
"blur.midnightconfig.gradientEndAlpha": "Farbverlauf-Endstransparenz",
"blur.midnightconfig.gradientRotation": "Farbverlauf-Rotation",
"blur.midnightconfig.excludedScreens": "Ausgeschlossene Bildschirme",
"blur.midnightconfig._general": "§7⛏ Generell",
"blur.midnightconfig._advanced": "§7⚒ Fortgeschritten",
"blur.midnightconfig._blur": "§7▒ Unschärfe",
"blur.midnightconfig._gradient": "§7\uD83D\uDFE2 Farbverlauf",
"blur.midnightconfig._animations": "§7\uD83D\uDCFD Animationen"
}

View File

@@ -0,0 +1,4 @@
{
"blur.midnightconfig.gradientStart": "Gradient Start Colour",
"blur.midnightconfig.gradientEnd": "Gradient End Colour"
}

View File

@@ -0,0 +1,42 @@
{
"blur.midnightconfig.title": "Blur+ Config",
"blur.midnightconfig.category.animations": "Animations",
"blur.midnightconfig.category.style": "Style",
"blur.midnightconfig.category.screens": "Screens",
"blur.midnightconfig.blurContainers": "Apply Blur to Containers",
"blur.midnightconfig.blurTitleScreen": "Apply Blur to Title Screen",
"blur.midnightconfig.darkenTitleScreen": "Darken Title Screen Background",
"blur.midnightconfig.fadeTimeMillis": "Fade Time (in milliseconds)",
"blur.midnightconfig.fadeOutTimeMillis": "Fade Out Time (in milliseconds)",
"blur.midnightconfig.animationCurve": "Animation Curve",
"blur.midnightconfig.enum.Easing.FLAT": "Flat",
"blur.midnightconfig.enum.Easing.SINE": "Sine",
"blur.midnightconfig.enum.Easing.QUAD": "Quad",
"blur.midnightconfig.enum.Easing.CUBIC": "Cubic",
"blur.midnightconfig.enum.Easing.QUART": "Quart",
"blur.midnightconfig.enum.Easing.QUINT": "Quint",
"blur.midnightconfig.enum.Easing.EXPO": "Expo",
"blur.midnightconfig.enum.Easing.CIRC": "Circ",
"blur.midnightconfig.enum.Easing.BACK": "Back",
"blur.midnightconfig.enum.Easing.ELASTIC": "Elastic",
"blur.midnightconfig.radius": "Radius",
"blur.midnightconfig.radius.label.tooltip": "Mirror of \"Menu Background Blur\" found in Minecraft's Accessibility Settings",
"blur.midnightconfig.rainbowMode": "Rainbow Mode \uD83C\uDF08",
"blur.midnightconfig.useGradient": "Gradient as Background",
"blur.midnightconfig.gradientStart": "Gradient Start Color",
"blur.midnightconfig.gradientEnd": "Gradient End Color",
"blur.midnightconfig.gradientStartAlpha": "Gradient Start Alpha",
"blur.midnightconfig.gradientEndAlpha": "Gradient End Alpha",
"blur.midnightconfig.gradientRotation": "Gradient Rotation",
"blur.midnightconfig.excludedScreens": "Excluded Screens",
"blur.midnightconfig.excludedScreens.tooltip": "Screens that Blur+ should not animate",
"blur.midnightconfig.forceEnabledScreens": "Force-enabled Screens",
"blur.midnightconfig.forceEnabledScreens.tooltip": "Screens where the vanilla blur effect should be force-enabled\nMight not work 100% of the time",
"blur.midnightconfig.forceDisabledScreens": "Force-disabled Screens",
"blur.midnightconfig.forceDisabledScreens.tooltip": "Screens where the vanilla blur effect should be force-disabled",
"blur.midnightconfig._general": "§7⛏ General",
"blur.midnightconfig._advanced": "§7⚒ Advanced",
"blur.midnightconfig._blur": "§7▒ Blur",
"blur.midnightconfig._gradient": "§7\uD83D\uDFE2 Gradient",
"blur.midnightconfig._animations": "§7\uD83D\uDCFD Animations"
}

View File

@@ -0,0 +1,27 @@
{
"blur.midnightconfig.title": "Configuración de Blur+",
"blur.midnightconfig.category.animations": "Animaciones",
"blur.midnightconfig.category.style": "Estilo",
"blur.midnightconfig.blurContainers": "Aplicar desenfoque a los contenedores",
"blur.midnightconfig.fadeTimeMillis": "Tiempo de desvanecimiento (en milisegundos)",
"blur.midnightconfig.fadeOutTimeMillis": "Tiempo de desvanecimiento de salida (en milisegundos)",
"blur.midnightconfig.animationCurve": "Curva de animación",
"blur.midnightconfig.enum.Easing.FLAT": "Plano",
"blur.midnightconfig.enum.Easing.SINE": "Seno",
"blur.midnightconfig.enum.Easing.QUAD": "Cuadrático",
"blur.midnightconfig.enum.Easing.CUBIC": "Cúbico",
"blur.midnightconfig.enum.Easing.QUART": "Cuarto",
"blur.midnightconfig.enum.Easing.QUINT": "Quinto",
"blur.midnightconfig.enum.Easing.EXPO": "Exponencial",
"blur.midnightconfig.enum.Easing.CIRC": "Circular",
"blur.midnightconfig.enum.Easing.BACK": "Atrás",
"blur.midnightconfig.enum.Easing.ELASTIC": "Elástico",
"blur.midnightconfig.radius": "Radio",
"blur.midnightconfig.rainbowMode": "Modo Arcoíris \uD83C\uDF08",
"blur.midnightconfig.useGradient": "Usar degradado como fondo",
"blur.midnightconfig.gradientStart": "Color de inicio del degradado",
"blur.midnightconfig.gradientEnd": "Color de fin del degradado",
"blur.midnightconfig.gradientStartAlpha": "Alfa de inicio del degradado",
"blur.midnightconfig.gradientEndAlpha": "Alfa de fin del degradado",
"blur.midnightconfig.gradientRotation": "Rotación del degradado"
}

View File

@@ -0,0 +1,12 @@
{
"blur.midnightconfig.title": "Configuration du flou",
"blur.midnightconfig.blurExclusions": "Flouter les exclusions",
"blur.midnightconfig.fadeTimeMillis": "Temps de fondu (en millisecondes)",
"blur.midnightconfig.ease": "Fluidité de l'animation",
"blur.midnightconfig.radius": "Rayon",
"blur.midnightconfig.gradientStart": "Couleur de départ du dégradé",
"blur.midnightconfig.gradientEnd": "Couleur de fin du dégradé",
"blur.midnightconfig.gradientStartAlpha": "Alpha de début du dégradé",
"blur.midnightconfig.gradientEndAlpha": "Alpha de fin du dégradé",
"blur.midnightconfig.showScreenTitle": "Montrer le titre de l'écran"
}

View File

@@ -0,0 +1,11 @@
{
"blur.midnightconfig.title": "Blur 설정",
"blur.midnightconfig.blurExclusions": "블러 제외",
"blur.midnightconfig.fadeTimeMillis": "페이드 시간 (밀리초 단위)",
"blur.midnightconfig.radius": "범위",
"blur.midnightconfig.gradientStart": "그라디언트 시작 색상",
"blur.midnightconfig.gradientEnd": "그라디언트 종료 색상",
"blur.midnightconfig.gradientStartAlpha": "그라디언트 시작 알파",
"blur.midnightconfig.gradientEndAlpha": "그라디언트 종료 알파",
"blur.midnightconfig.showScreenTitle": "화면 타이틀 보기"
}

View File

@@ -0,0 +1,12 @@
{
"blur.midnightconfig.title": "Configuração de desfoque",
"blur.midnightconfig.blurExclusions": "Desfocar exclusões",
"blur.midnightconfig.fadeTimeMillis": "Tempo de desvanecimento (em milissegundos)",
"blur.midnightconfig.ease": "Animação fácil",
"blur.midnightconfig.radius": "Raio",
"blur.midnightconfig.gradientStart": "Cor inicial do gradiente",
"blur.midnightconfig.gradientEnd": "Cor final do gradiente",
"blur.midnightconfig.gradientStartAlpha": "Alfa de início gradiente",
"blur.midnightconfig.gradientEndAlpha": "Alfa de Gradiente Final",
"blur.midnightconfig.showScreenTitle": "Mostrar título da tela"
}

View File

@@ -0,0 +1,27 @@
{
"blur.midnightconfig.title": "Настройки Blur+",
"blur.midnightconfig.category.animations": "Анимации",
"blur.midnightconfig.category.style": "Стиль",
"blur.midnightconfig.blurContainers": "Применять размытие к контейнерам",
"blur.midnightconfig.fadeTimeMillis": "Время размытия (в миллисекундах)",
"blur.midnightconfig.fadeOutTimeMillis": "Время затухания (в миллисекундах)",
"blur.midnightconfig.animationCurve": "Кривая анимации",
"blur.midnightconfig.enum.Easing.FLAT": "Плоская",
"blur.midnightconfig.enum.Easing.SINE": "Синусоидальная",
"blur.midnightconfig.enum.Easing.QUAD": "Квадратная",
"blur.midnightconfig.enum.Easing.CUBIC": "Кубическая",
"blur.midnightconfig.enum.Easing.QUART": "Квартовая",
"blur.midnightconfig.enum.Easing.QUINT": "Квинтовая",
"blur.midnightconfig.enum.Easing.EXPO": "Экспоненциальная",
"blur.midnightconfig.enum.Easing.CIRC": "Круговая",
"blur.midnightconfig.enum.Easing.BACK": "Обратная",
"blur.midnightconfig.enum.Easing.ELASTIC": "Упругая",
"blur.midnightconfig.radius": "Радиус размытия",
"blur.midnightconfig.rainbowMode": "Радужный режим \uD83C\uDF08",
"blur.midnightconfig.useGradient": "Градиент в качестве фона",
"blur.midnightconfig.gradientStart": "Верхний цвет градиента",
"blur.midnightconfig.gradientEnd": "Нижний цвет градиента",
"blur.midnightconfig.gradientStartAlpha": "Альфа-начало градиента",
"blur.midnightconfig.gradientEndAlpha": "Альфа-конец градиента",
"blur.midnightconfig.gradientRotation": "Вращение градиента"
}

View File

@@ -0,0 +1,9 @@
{
"blur.midnightconfig.title": "Blur Config",
"blur.midnightconfig.blurExclusions": "Undantag till Blur",
"blur.midnightconfig.fadeTimeMillis": "Toningstid (i millisekunder)",
"blur.midnightconfig.radius": "Radie",
"blur.midnightconfig.gradientStart": "Toningsfärg (start)",
"blur.midnightconfig.gradientEnd": "Toningsfärg (slut)",
"blur.midnightconfig.showScreenTitle": "Visa skärmtitel"
}

View File

@@ -0,0 +1,12 @@
{
"blur.midnightconfig.title": "Конфігурація Blur",
"blur.midnightconfig.blurExclusions": "Винятки розмиття",
"blur.midnightconfig.fadeTimeMillis": "Час появи розмиття (у мілісекундах)",
"blur.midnightconfig.ease": "Пом'якшення анімації",
"blur.midnightconfig.radius": "Радіус",
"blur.midnightconfig.gradientStart": "Початковий колір градієнта",
"blur.midnightconfig.gradientEnd": "Кінцевий колір градієнта",
"blur.midnightconfig.gradientStartAlpha": "Початкова прозорість градієнта",
"blur.midnightconfig.gradientEndAlpha": "Кінцева прозорість градієнтаa",
"blur.midnightconfig.showScreenTitle": "Показати назву екрана"
}

View File

@@ -0,0 +1,28 @@
{
"blur.midnightconfig.title": "模糊 (Blur+) 配置",
"blur.midnightconfig.category.animations": "动画",
"blur.midnightconfig.category.style": "样式",
"blur.midnightconfig.blurContainers": "使用容器时启用",
"blur.midnightconfig.fadeTimeMillis": "淡入时间(毫秒)",
"blur.midnightconfig.fadeOutTimeMillis": "淡出时间(毫秒)",
"blur.midnightconfig.animationCurve": "动画曲线",
"blur.midnightconfig.enum.Easing.FLAT": "平滑Flat",
"blur.midnightconfig.enum.Easing.SINE": "正弦Sine",
"blur.midnightconfig.enum.Easing.QUAD": "二次Quad",
"blur.midnightconfig.enum.Easing.CUBIC": "三次Cubic",
"blur.midnightconfig.enum.Easing.QUART": "四次Quart",
"blur.midnightconfig.enum.Easing.QUINT": "五次Quint",
"blur.midnightconfig.enum.Easing.EXPO": "指数Expo",
"blur.midnightconfig.enum.Easing.CIRC": "圆周Circ",
"blur.midnightconfig.enum.Easing.BACK": "回弹Back",
"blur.midnightconfig.enum.Easing.ELASTIC": "弹性Elastic",
"blur.midnightconfig.radius": "半径",
"blur.midnightconfig.rainbowMode": "彩虹模式 \uD83C\uDF08",
"blur.midnightconfig.useGradient": "背景渐变",
"blur.midnightconfig.gradientStart": "渐变起始色",
"blur.midnightconfig.gradientEnd": "渐变结束色",
"blur.midnightconfig.gradientStartAlpha": "渐变起始 Alpha 通道",
"blur.midnightconfig.gradientEndAlpha": "渐变结束 Alpha 通道",
"blur.midnightconfig.gradientRotation": "渐变旋转",
"blur.midnightconfig.excludedScreens": "禁用的界面"
}

View File

@@ -0,0 +1,28 @@
{
"blur.midnightconfig.title": "Blur+ 設定",
"blur.midnightconfig.category.animations": "動畫",
"blur.midnightconfig.category.style": "風格",
"blur.midnightconfig.blurContainers": "對容器套用模糊",
"blur.midnightconfig.fadeTimeMillis": "淡入時間(毫秒)",
"blur.midnightconfig.fadeOutTimeMillis": "淡出時間(毫秒)",
"blur.midnightconfig.animationCurve": "動畫曲線",
"blur.midnightconfig.enum.Easing.FLAT": "線性Flat",
"blur.midnightconfig.enum.Easing.SINE": "正弦Sine",
"blur.midnightconfig.enum.Easing.QUAD": "二次Quad",
"blur.midnightconfig.enum.Easing.CUBIC": "三次Cubic",
"blur.midnightconfig.enum.Easing.QUART": "四次Quart",
"blur.midnightconfig.enum.Easing.QUINT": "五次Quint",
"blur.midnightconfig.enum.Easing.EXPO": "指數Expo",
"blur.midnightconfig.enum.Easing.CIRC": "圓形Circ",
"blur.midnightconfig.enum.Easing.BACK": "回彈Back",
"blur.midnightconfig.enum.Easing.ELASTIC": "彈性Elastic",
"blur.midnightconfig.radius": "半徑",
"blur.midnightconfig.rainbowMode": "彩虹模式 🌈",
"blur.midnightconfig.useGradient": "漸變背景",
"blur.midnightconfig.gradientStart": "漸變起始顏色",
"blur.midnightconfig.gradientEnd": "漸變結束顏色",
"blur.midnightconfig.gradientStartAlpha": "漸變起始 Alpha",
"blur.midnightconfig.gradientEndAlpha": "漸變結束 Alpha",
"blur.midnightconfig.gradientRotation": "漸變旋轉",
"blur.midnightconfig.excludedScreens": "排除畫面"
}

View File

@@ -0,0 +1,21 @@
{
"required": true,
"minVersion": "0.8",
"package": "eu.midnightdust.blur.mixin",
"compatibilityLevel": "JAVA_21",
"client": [
"MixinGameOptions",
"MixinGameRenderer",
"MixinHandledScreen",
"MixinInGameHud",
"MixinMidnightConfig",
"MixinMidnightConfig$EntryInfo",
"MixinMinecraftClient",
"MixinScreen",
"MixinTitleScreen",
"ScreenAccessor"
],
"injectors": {
"defaultRequire": 1
}
}

102
fabric/build.gradle Normal file
View File

@@ -0,0 +1,102 @@
plugins {
id 'com.github.johnrengelman.shadow'
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
archivesBaseName = rootProject.archives_base_name + "-fabric"
version = rootProject.mod_version + "+" + rootProject.minecraft_version
}
dependencies {
modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}"
modImplementation include ("maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric")
common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false }
}
processResources {
inputs.property "version", rootProject.version
filesMatching("fabric.mod.json") {
expand "version": rootProject.version
}
}
shadowJar {
exclude "architectury.common.json"
configurations = [project.configurations.shadowCommon]
archiveClassifier = "dev-shadow"
}
remapJar {
input.set shadowJar.archiveFile
dependsOn shadowJar
}
sourcesJar {
def commonSources = project(":common").sourcesJar
dependsOn commonSources
from commonSources.archiveFile.map { zipTree(it) }
}
components.java {
withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
skip()
}
}
unifiedPublishing {
project {
displayName = "Blur+ $rootProject.version - Fabric $project.minecraft_version"
releaseType = "$project.release_type"
changelog = releaseChangelog()
gameVersions = []
gameLoaders = ["fabric","quilt"]
mainPublication remapJar
relations {
depends {
curseforge = "fabric-api"
modrinth = "fabric-api"
}
includes {
curseforge = "midnightlib"
modrinth = "midnightlib"
}
}
var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN")
if (CURSEFORGE_TOKEN != null) {
curseforge {
token = CURSEFORGE_TOKEN
id = rootProject.curseforge_id
gameVersions.addAll "Java 21", project.minecraft_version
if (project.supported_versions != "") gameVersions.addAll project.supported_versions
}
}
var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN")
if (MODRINTH_TOKEN != null) {
modrinth {
token = MODRINTH_TOKEN
id = rootProject.modrinth_id
version = "$rootProject.version-$project.name"
gameVersions.addAll project.minecraft_version
if (project.supported_versions != "") gameVersions.addAll project.supported_versions
}
}
}
}

View File

@@ -0,0 +1,18 @@
package eu.midnightdust.blur.fabric;
import eu.midnightdust.blur.Blur;
import eu.midnightdust.blur.util.RainbowColor;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
public class BlurFabric implements ModInitializer, ClientModInitializer {
@Override
public void onInitialize() {
Blur.init();
}
@Override
public void onInitializeClient() {
ClientTickEvents.END_CLIENT_TICK.register(client -> RainbowColor.tick());
}
}

View File

@@ -0,0 +1,36 @@
{
"schemaVersion": 1,
"id": "blur",
"name": "Blur+",
"version": "$version",
"environment": "client",
"license": "MIT",
"icon": "assets/blur/icon.png",
"entrypoints": {
"main": [
"eu.midnightdust.blur.fabric.BlurFabric"
],
"client": [
"eu.midnightdust.blur.fabric.BlurFabric"
]
},
"contact": {
"homepage": "https://modrinth.com/mod/blur-fabric",
"sources": "https://github.com/Motschen/Blur",
"issues": "https://github.com/Motschen/Blur/issues"
},
"authors": [
"Motschen",
"tterrag1098",
"Pyrofab",
"backryun",
"byquanton"
],
"description": "Various enhancements for the blur effect behind Minecraft GUIs",
"mixins": [
"blur.mixins.json"
],
"depends": {
"minecraft": ">=1.21.2"
}
}

38
gradle.properties Normal file → Executable file
View File

@@ -1,19 +1,27 @@
# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx1G
org.gradle.jvmargs=-Xmx2G
org.gradle.parallel=true
minecraft_version=1.21.4
supported_versions=1.21.5
yarn_mappings=1.21.4+build.1
enabled_platforms=fabric,neoforge
# Fabric Properties
# check these on https://fabricmc.net/use
minecraft_version=1.17-pre3
yarn_mappings=1.17-pre3+build.2
loader_version=0.11.3
# Mod Properties
mod_version = 2.2.1-1.17+fabric
maven_group = com.tterrag.blur
archives_base_name = Blur
mod_version=5.2.0
maven_group=eu.midnightdust.blur
archives_base_name=blur
release_type=release
curseforge_id=393563
modrinth_id=NK39zBp2
# Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
fabric_version = 0.34.8+1.17
modmenu_version = 2.0.0-beta.7
satin_version = 1.6.0-nightly.1.17-pre3
# Modloaders
fabric_loader_version=0.16.9
fabric_api_version=0.111.0+1.21.4
neoforge_version=21.4.10-beta
yarn_mappings_patch_neoforge_version = 1.21+build.4
# Libraries
midnightlib_version = 1.7.0+1.21.4
modmenu_version = 11.0.2

Binary file not shown.

View File

@@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
zipStorePath=wrapper/dists

269
gradlew vendored Normal file → Executable file
View File

@@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,67 +17,101 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

178
gradlew.bat vendored
View File

@@ -1,89 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

115
neoforge/build.gradle Normal file
View File

@@ -0,0 +1,115 @@
plugins {
id 'com.github.johnrengelman.shadow'
id "me.shedaniel.unified-publishing"
}
repositories {
maven {
name = 'NeoForged'
url = 'https://maven.neoforged.net/releases'
}
}
architectury {
platformSetupLoomIde()
neoForge()
}
loom {
accessWidenerPath = project(":common").loom.accessWidenerPath
}
configurations {
common {
canBeResolved = true
canBeConsumed = false
}
compileClasspath.extendsFrom common
runtimeClasspath.extendsFrom common
developmentNeoForge.extendsFrom common
// Files in this configuration will be bundled into your mod using the Shadow plugin.
// Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files.
shadowBundle {
canBeResolved = true
canBeConsumed = false
}
archivesBaseName = rootProject.archives_base_name + "-neoforge"
version = rootProject.mod_version + "+" + rootProject.minecraft_version
}
dependencies {
neoForge "net.neoforged:neoforge:$rootProject.neoforge_version"
modImplementation ("maven.modrinth:midnightlib:${rootProject.midnightlib_version}-neoforge")
common(project(path: ':common', configuration: 'namedElements')) { transitive false }
shadowBundle project(path: ':common', configuration: 'transformProductionNeoForge')
}
processResources {
inputs.property 'version', rootProject.version
filesMatching('META-INF/neoforge.mods.toml') {
expand version: rootProject.version
}
}
shadowJar {
configurations = [project.configurations.shadowBundle]
archiveClassifier = 'dev-shadow'
}
remapJar {
input.set shadowJar.archiveFile
}
sourcesJar {
def commonSources = project(":common").sourcesJar
dependsOn commonSources
from commonSources.archiveFile.map { zipTree(it) }
}
components.java {
withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) {
skip()
}
}
unifiedPublishing {
project {
displayName = "Blur+ $rootProject.version - NeoForge $project.minecraft_version"
releaseType = "$project.release_type"
changelog = releaseChangelog()
gameVersions = []
gameLoaders = ["neoforge"]
mainPublication remapJar
relations {
depends {
curseforge = "midnightlib"
modrinth = "midnightlib"
}
}
var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN")
if (CURSEFORGE_TOKEN != null) {
curseforge {
token = CURSEFORGE_TOKEN
id = rootProject.curseforge_id
gameVersions.addAll "Java 21", project.minecraft_version
if (project.supported_versions != "") gameVersions.addAll project.supported_versions
}
}
var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN")
if (MODRINTH_TOKEN != null) {
modrinth {
token = MODRINTH_TOKEN
id = rootProject.modrinth_id
version = "$rootProject.version-$project.name"
gameVersions.addAll project.minecraft_version
if (project.supported_versions != "") gameVersions.addAll project.supported_versions
}
}
}
}

View File

@@ -0,0 +1 @@
loom.platform=neoforge

View File

@@ -0,0 +1,24 @@
package eu.midnightdust.blur.neoforge;
import eu.midnightdust.blur.Blur;
import eu.midnightdust.blur.util.RainbowColor;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.client.event.ClientTickEvent;
@Mod(value = Blur.MOD_ID, dist = Dist.CLIENT)
public class BlurNeoForge {
public BlurNeoForge() {
Blur.init();
}
@EventBusSubscriber(modid = Blur.MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT)
public static class ClientGameEvents {
@SubscribeEvent
public static void endClientTick(ClientTickEvent.Post event) {
RainbowColor.tick();
}
}
}

View File

@@ -0,0 +1,31 @@
modLoader = "javafml"
loaderVersion = "[2,)"
#issueTrackerURL = ""
license = "MIT License"
[[mods]]
modId = "blur"
version = "${version}"
displayName = "Blur+"
logoFile = "blur.png"
authors = "Motschen, tterrag1098, Pyrofab, backryun, byquanton"
description = '''
Various enhancements for the blur effect behind Minecraft GUIs
'''
[[mixins]]
config = "blur.mixins.json"
[[dependencies.blur]]
modId = "neoforge"
mandatory = true
versionRange = "[21.0,)"
ordering = "NONE"
side = "CLIENT"
[[dependencies.blur]]
modId = "minecraft"
mandatory = true
versionRange = "[1.21.2,)"
ordering = "NONE"
side = "CLIENT"

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -1,12 +1,15 @@
pluginManagement {
repositories {
jcenter()
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
maven { url "https://maven.fabricmc.net/" }
maven { url "https://maven.architectury.dev/" }
maven { url "https://maven.neoforged.net/releases" }
gradlePluginPortal()
}
}
rootProject.name = "blur"
include("common")
include("fabric")
include("neoforge")
//include("quilt")
rootProject.name = "blur"

View File

@@ -1,75 +0,0 @@
package com.tterrag.blur;
import com.tterrag.blur.config.BlurConfig;
import ladysnake.satin.api.event.ShaderEffectRenderCallback;
import ladysnake.satin.api.managed.ManagedShaderEffect;
import ladysnake.satin.api.managed.ShaderEffectManager;
import ladysnake.satin.api.managed.uniform.Uniform1f;
import net.fabricmc.api.ClientModInitializer;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.util.Identifier;
import org.apache.commons.lang3.ArrayUtils;
public class Blur implements ClientModInitializer {
public static final String MODID = "blur";
private long start;
public int colorFirst, colorSecond;
private final ManagedShaderEffect blur = ShaderEffectManager.getInstance().manage(new Identifier(MODID, "shaders/post/fade_in_blur.json"),
shader -> shader.setUniformValue("Radius", (float) BlurConfig.radius));
private final Uniform1f blurProgress = blur.findUniform1f("Progress");
public static final Blur INSTANCE = new Blur();
@Override
public void onInitializeClient() {
BlurConfig.init("blur", BlurConfig.class);
ShaderEffectRenderCallback.EVENT.register((deltaTick) -> {
if (start > 0) {
blurProgress.set(getProgress());
blur.render(deltaTick);
}
});
}
private boolean doFade = false;
public void onScreenChange(Screen newGui) {
if (MinecraftClient.getInstance().world != null) {
boolean excluded = newGui == null || ArrayUtils.contains(BlurConfig.blurExclusions, newGui.getClass().getName());
if (!excluded) {
blur.setUniformValue("Radius", (float) BlurConfig.radius);
colorFirst = Integer.parseUnsignedInt(String.valueOf(BlurConfig.gradientStartColor), 16);
colorSecond = Integer.parseUnsignedInt(String.valueOf(BlurConfig.gradientEndColor), 16);
if (doFade) {
start = System.currentTimeMillis();
doFade = false;
}
} else {
start = -1;
doFade = true;
}
}
}
private float getProgress() {
return Math.min((System.currentTimeMillis() - start) / (float) BlurConfig.fadeTimeMillis, 1);
}
public int getBackgroundColor(boolean second) {
int color = second ? colorSecond : colorFirst;
int a = color >>> 24;
int r = (color >> 16) & 0xFF;
int b = (color >> 8) & 0xFF;
int g = color & 0xFF;
float prog = INSTANCE.getProgress();
a *= prog;
r *= prog;
g *= prog;
b *= prog;
return a << 24 | r << 16 | b << 8 | g;
}
}

View File

@@ -1,17 +0,0 @@
package com.tterrag.blur.config;
import eu.midnightdust.lib.config.MidnightConfig;
import net.minecraft.client.gui.screen.ChatScreen;
public class BlurConfig extends MidnightConfig {
@Entry
public static String[] blurExclusions = new String[]{ ChatScreen.class.getName() };
@Entry(min = 0, max = 5000, width = 4)
public static int fadeTimeMillis = 200;
@Entry(min = 0, max = 500, width = 3)
public static int radius = 8;
@Entry(min = 0, max = 99999999, width = 8)
public static int gradientStartColor = 75000000;
@Entry(min = 0, max = 99999999, width = 8)
public static int gradientEndColor = 75000000;
}

View File

@@ -1,15 +0,0 @@
package com.tterrag.blur.config;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@Environment(EnvType.CLIENT)
public class ModMenuIntegration implements ModMenuApi {
@Override
public ConfigScreenFactory<?> getModConfigScreenFactory() {
return parent -> BlurConfig.getScreen(parent,"blur");
}
}

View File

@@ -1,26 +0,0 @@
package com.tterrag.blur.mixin;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.At.Shift;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.tterrag.blur.Blur;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.resource.ReloadableResourceManager;
@Mixin(MinecraftClient.class)
public class MixinMinecraftClient {
@Inject(method = "openScreen",
at = @At(value = "FIELD",
target = "Lnet/minecraft/client/MinecraftClient;currentScreen:Lnet/minecraft/client/gui/screen/Screen;",
opcode = Opcodes.PUTFIELD))
private void onScreenOpen(Screen newScreen, CallbackInfo info) {
Blur.INSTANCE.onScreenChange(newScreen);
}
}

View File

@@ -1,27 +0,0 @@
package com.tterrag.blur.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.Constant;
import org.spongepowered.asm.mixin.injection.ModifyConstant;
import com.tterrag.blur.Blur;
import net.minecraft.client.gui.screen.Screen;
@Mixin(Screen.class)
public class MixinScreen {
@ModifyConstant(
method = "renderBackground(Lnet/minecraft/client/util/math/MatrixStack;I)V",
constant = @Constant(intValue = -1072689136))
private int getFirstBackgroundColor(int color) {
return Blur.INSTANCE.getBackgroundColor(false);
}
@ModifyConstant(
method = "renderBackground(Lnet/minecraft/client/util/math/MatrixStack;I)V",
constant = @Constant(intValue = -804253680))
private int getSecondBackgroundColor(int color) {
return Blur.INSTANCE.getBackgroundColor(true);
}
}

View File

@@ -1,390 +0,0 @@
package eu.midnightdust.lib.config;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.Selectable;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ScreenTexts;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.widget.ElementListWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
// MidnightConfig v1.0.4
// Single class config library - feel free to copy!
// Changelog:
// - 1.0.4:
// - Number field length is now configurable
// - Fixed number fields being empty
// - 1.0.3:
// - Text field length is now configurable
// - Better separation of client and server
// - 1.0.2:
// - Update to 21w20a
// - 1.0.1:
// - Fixed buttons not working in fullscreen
// - 1.0.0:
// - The config screen no longer shows the entries of all instances of MidnightConfig
// - Compatible with servers!
// - Scrollable!
// - Comment support!
// - Fresh New Design
/** Based on https://github.com/Minenash/TinyConfig
* Credits to Minenash */
@SuppressWarnings("unchecked")
public class MidnightConfig {
public static boolean useTooltipForTitle = true; // Render title as tooltip or as simple text
private static final Pattern INTEGER_ONLY = Pattern.compile("(-?[0-9]*)");
private static final Pattern DECIMAL_ONLY = Pattern.compile("-?([\\d]+\\.?[\\d]*|[\\d]*\\.?[\\d]+|\\.)");
private static final List<EntryInfo> entries = new ArrayList<>();
protected static class EntryInfo {
Field field;
Object widget;
int width;
int max;
Map.Entry<TextFieldWidget,Text> error;
Object defaultValue;
Object value;
String tempValue;
boolean inLimits = true;
String id;
}
public static final Map<String,Class<?>> configClass = new HashMap<>();
private static Path path;
private static final Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).excludeFieldsWithModifiers(Modifier.PRIVATE).addSerializationExclusionStrategy(new HiddenAnnotationExclusionStrategy()).setPrettyPrinting().create();
public static void init(String modid, Class<?> config) {
path = FabricLoader.getInstance().getConfigDir().resolve(modid + ".json");
configClass.put(modid, config);
for (Field field : config.getFields()) {
EntryInfo info = new EntryInfo();
if (field.isAnnotationPresent(Entry.class) || field.isAnnotationPresent(Comment.class))
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) initClient(modid, field, info);
if (field.isAnnotationPresent(Entry.class))
try {
info.defaultValue = field.get(null);
} catch (IllegalAccessException ignored) {}
}
try { gson.fromJson(Files.newBufferedReader(path), config); }
catch (Exception e) { write(modid); }
for (EntryInfo info : entries) {
if (info.field.isAnnotationPresent(Entry.class))
try {
info.value = info.field.get(null);
info.tempValue = info.value.toString();
} catch (IllegalAccessException ignored) {
}
}
}
@Environment(EnvType.CLIENT)
private static void initClient(String modid, Field field, EntryInfo info) {
Class<?> type = field.getType();
Entry e = field.getAnnotation(Entry.class);
info.width = e != null ? e.width() : 0;
info.field = field;
info.id = modid;
if (e != null) {
if (type == int.class) textField(info, Integer::parseInt, INTEGER_ONLY, e.min(), e.max(), true);
else if (type == double.class) textField(info, Double::parseDouble, DECIMAL_ONLY, e.min(), e.max(), false);
else if (type == String.class) {
info.max = e.max() == Double.MAX_VALUE ? Integer.MAX_VALUE : (int) e.max();
textField(info, String::length, null, Math.min(e.min(), 0), Math.max(e.max(), 1), true);
} else if (type == boolean.class) {
Function<Object, Text> func = value -> new LiteralText((Boolean) value ? "True" : "False").formatted((Boolean) value ? Formatting.GREEN : Formatting.RED);
info.widget = new AbstractMap.SimpleEntry<ButtonWidget.PressAction, Function<Object, Text>>(button -> {
info.value = !(Boolean) info.value;
button.setMessage(func.apply(info.value));
}, func);
} else if (type.isEnum()) {
List<?> values = Arrays.asList(field.getType().getEnumConstants());
Function<Object, Text> func = value -> new TranslatableText(modid + ".midnightconfig." + "enum." + type.getSimpleName() + "." + info.value.toString());
info.widget = new AbstractMap.SimpleEntry<ButtonWidget.PressAction, Function<Object, Text>>(button -> {
int index = values.indexOf(info.value) + 1;
info.value = values.get(index >= values.size() ? 0 : index);
button.setMessage(func.apply(info.value));
}, func);
}
}
entries.add(info);
}
private static void textField(EntryInfo info, Function<String,Number> f, Pattern pattern, double min, double max, boolean cast) {
boolean isNumber = pattern != null;
info.widget = (BiFunction<TextFieldWidget, ButtonWidget, Predicate<String>>) (t, b) -> s -> {
s = s.trim();
if (!(s.isEmpty() || !isNumber || pattern.matcher(s).matches())) return false;
Number value = 0;
boolean inLimits = false;
System.out.println(((isNumber ^ s.isEmpty())));
System.out.println(!s.equals("-") && !s.equals("."));
info.error = null;
if (!(isNumber && s.isEmpty()) && !s.equals("-") && !s.equals(".")) {
value = f.apply(s);
inLimits = value.doubleValue() >= min && value.doubleValue() <= max;
info.error = inLimits? null : new AbstractMap.SimpleEntry<>(t, new LiteralText(value.doubleValue() < min ?
"§cMinimum " + (isNumber? "value" : "length") + (cast? " is " + (int)min : " is " + min) :
"§cMaximum " + (isNumber? "value" : "length") + (cast? " is " + (int)max : " is " + max)));
}
info.tempValue = s;
t.setEditableColor(inLimits? 0xFFFFFFFF : 0xFFFF7777);
info.inLimits = inLimits;
b.active = entries.stream().allMatch(e -> e.inLimits);
if (inLimits)
info.value = isNumber? value : s;
return true;
};
}
public static void write(String modid) {
path = FabricLoader.getInstance().getConfigDir().resolve(modid + ".json");
try {
if (!Files.exists(path)) Files.createFile(path);
Files.write(path, gson.toJson(configClass.get(modid).getDeclaredConstructor().newInstance()).getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
@Environment(EnvType.CLIENT)
public static Screen getScreen(Screen parent, String modid) {
return new MidnightConfigScreen(parent, modid);
}
@Environment(EnvType.CLIENT)
private static class MidnightConfigScreen extends Screen {
protected MidnightConfigScreen(Screen parent, String modid) {
super(new TranslatableText(modid + ".midnightconfig." + "title"));
this.parent = parent;
this.modid = modid;
this.translationPrefix = modid + ".midnightconfig.";
}
private final String translationPrefix;
private final Screen parent;
private final String modid;
private MidnightConfigListWidget list;
// Real Time config update //
@Override
public void tick() {
for (EntryInfo info : entries)
try { info.field.set(null, info.value); }
catch (IllegalAccessException ignored) {}
}
@Override
protected void init() {
super.init();
this.addDrawableChild(new ButtonWidget(this.width / 2 - 154, this.height - 28, 150, 20, ScreenTexts.CANCEL, button -> {
try { gson.fromJson(Files.newBufferedReader(path), configClass.get(modid)); }
catch (Exception e) { write(modid); }
for (EntryInfo info : entries) {
if (info.field.isAnnotationPresent(Entry.class)) {
try {
info.value = info.field.get(null);
info.tempValue = info.value.toString();
} catch (IllegalAccessException ignored) {
}
}
}
Objects.requireNonNull(client).openScreen(parent);
}));
ButtonWidget done = this.addDrawableChild(new ButtonWidget(this.width / 2 + 4, this.height - 28, 150, 20, ScreenTexts.DONE, (button) -> {
for (EntryInfo info : entries)
if (info.id.equals(modid)) {
try {
info.field.set(null, info.value);
} catch (IllegalAccessException ignored) {}
}
write(modid);
Objects.requireNonNull(client).openScreen(parent);
}));
this.list = new MidnightConfigListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
this.addSelectableChild(this.list);
for (EntryInfo info : entries) {
if (info.id.equals(modid)) {
TranslatableText name = new TranslatableText(translationPrefix + info.field.getName());
ButtonWidget resetButton = new ButtonWidget(width - 155, 0, 40, 20, new LiteralText("Reset").formatted(Formatting.RED), (button -> {
info.value = info.defaultValue;
info.tempValue = info.value.toString();
double scrollAmount = list.getScrollAmount();
Objects.requireNonNull(client).openScreen(this);
list.setScrollAmount(scrollAmount);
}));
if (info.widget instanceof Map.Entry) {
Map.Entry<ButtonWidget.PressAction, Function<Object, Text>> widget = (Map.Entry<ButtonWidget.PressAction, Function<Object, Text>>) info.widget;
if (info.field.getType().isEnum()) widget.setValue(value -> new TranslatableText(translationPrefix + "enum." + info.field.getType().getSimpleName() + "." + info.value.toString()));
this.list.addButton(new ButtonWidget(width - 110, 0,100, 20, widget.getValue().apply(info.value), widget.getKey()),resetButton,name);
} else if (info.widget != null) {
TextFieldWidget widget = new TextFieldWidget(textRenderer, width - 110, 0, 100, 20, null);
widget.setMaxLength(info.width);
widget.setText(info.tempValue);
Predicate<String> processor = ((BiFunction<TextFieldWidget, ButtonWidget, Predicate<String>>) info.widget).apply(widget, done);
widget.setTextPredicate(processor);
this.list.addButton(widget, resetButton, name);
} else {
ButtonWidget dummy = new ButtonWidget(-10, 0, 0, 0, Text.of(""), null);
this.list.addButton(dummy,dummy,name);
}
}
}
}
@Override
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
this.renderBackground(matrices);
this.list.render(matrices, mouseX, mouseY, delta);
int stringWidth = (int) (title.getString().length() * 2.75f);
if (useTooltipForTitle) renderTooltip(matrices, title, width/2 - stringWidth, 27);
else drawCenteredText(matrices, textRenderer, title, width / 2, 15, 0xFFFFFF);
for (EntryInfo info : entries) {
if (info.id.equals(modid)) {
if (list.getHoveredButton(mouseX,mouseY).isPresent()) {
ClickableWidget buttonWidget = list.getHoveredButton(mouseX,mouseY).get();
Text text = ButtonEntry.buttonsWithText.get(buttonWidget);
TranslatableText name = new TranslatableText(this.translationPrefix + info.field.getName());
String key = translationPrefix + info.field.getName() + ".tooltip";
if (info.error != null && text.equals(name)) renderTooltip(matrices, info.error.getValue(), mouseX, mouseY);
else if (I18n.hasTranslation(key) && text.equals(name)) {
List<Text> list = new ArrayList<>();
for (String str : I18n.translate(key).split("\n"))
list.add(new LiteralText(str));
renderTooltip(matrices, list, mouseX, mouseY);
}
}
}
}
super.render(matrices,mouseX,mouseY,delta);
}
}
@Environment(EnvType.CLIENT)
public static class MidnightConfigListWidget extends ElementListWidget<ButtonEntry> {
TextRenderer textRenderer;
public MidnightConfigListWidget(MinecraftClient minecraftClient, int i, int j, int k, int l, int m) {
super(minecraftClient, i, j, k, l, m);
this.centerListVertically = false;
textRenderer = minecraftClient.textRenderer;
}
@Override
public int getScrollbarPositionX() { return this.width -7; }
public void addButton(ClickableWidget button, ClickableWidget resetButton, Text text) {
this.addEntry(ButtonEntry.create(button, text, resetButton));
}
@Override
public int getRowWidth() { return 10000; }
public Optional<ClickableWidget> getHoveredButton(double mouseX, double mouseY) {
for (ButtonEntry buttonEntry : this.children()) {
for (ClickableWidget ClickableWidget : buttonEntry.buttons) {
if (ClickableWidget.isMouseOver(mouseX, mouseY)) {
return Optional.of(ClickableWidget);
}
}
}
return Optional.empty();
}
}
public static class ButtonEntry extends ElementListWidget.Entry<ButtonEntry> {
private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
private final List<ClickableWidget> buttons = new ArrayList<>();
private final List<ClickableWidget> resetButtons = new ArrayList<>();
private final List<Text> texts = new ArrayList<>();
private final List<ClickableWidget> buttonsWithResetButtons = new ArrayList<>();
public static final Map<ClickableWidget, Text> buttonsWithText = new HashMap<>();
private ButtonEntry(ClickableWidget button, Text text, ClickableWidget resetButton) {
buttonsWithText.put(button,text);
this.buttons.add(button);
this.resetButtons.add(resetButton);
this.texts.add(text);
this.buttonsWithResetButtons.add(button);
this.buttonsWithResetButtons.add(resetButton);
}
public static ButtonEntry create(ClickableWidget button, Text text, ClickableWidget resetButton) {
return new ButtonEntry(button, text, resetButton);
}
public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
this.buttons.forEach(button -> {
button.y = y;
button.render(matrices, mouseX, mouseY, tickDelta);
});
this.texts.forEach(text -> DrawableHelper.drawTextWithShadow(matrices,textRenderer, text,12,y+5,0xFFFFFF));
this.resetButtons.forEach((button) -> {
button.y = y;
button.render(matrices, mouseX, mouseY, tickDelta);
});
}
public List<? extends Element> children() {
return buttonsWithResetButtons;
}
public List<? extends Selectable> method_37025() {
return buttonsWithResetButtons;
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Entry {
int width() default 100;
double min() default Double.MIN_NORMAL;
double max() default Double.MAX_VALUE;
}
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Comment {}
public static class HiddenAnnotationExclusionStrategy implements ExclusionStrategy {
public boolean shouldSkipClass(Class<?> clazz) { return false; }
public boolean shouldSkipField(FieldAttributes fieldAttributes) {
return fieldAttributes.getAnnotation(Entry.class) == null;
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,7 +0,0 @@
{
"blur.midnightconfig.title": "Blur Konfiguration",
"blur.midnightconfig.fadeTimeMillis": "Überblendzeit (in Millisekunden)",
"blur.midnightconfig.radius": "Radius",
"blur.midnightconfig.gradientStartColor": "Farbverlauf-Anfangsfarbe",
"blur.midnightconfig.gradientEndColor": "Farbverlauf-Endfarbe"
}

View File

@@ -1,7 +0,0 @@
{
"blur.midnightconfig.title": "Blur Config",
"blur.midnightconfig.fadeTimeMillis": "Fade Time (in milliseconds)",
"blur.midnightconfig.radius": "Radius",
"blur.midnightconfig.gradientStartColor": "Gradient Start Colour",
"blur.midnightconfig.gradientEndColor": "Gradient End Colour"
}

View File

@@ -1,8 +0,0 @@
{
"blur.midnightconfig.title": "Blur Config",
"blur.midnightconfig.blurExclusions": "Blur Exclusions are currently not configurable in-game!",
"blur.midnightconfig.fadeTimeMillis": "Fade Time (in milliseconds)",
"blur.midnightconfig.radius": "Radius",
"blur.midnightconfig.gradientStartColor": "Gradient Start Color",
"blur.midnightconfig.gradientEndColor": "Gradient End Color"
}

View File

@@ -1,7 +0,0 @@
{
"blur.midnightconfig.title": "模糊配置",
"blur.midnightconfig.fadeTimeMillis": "淡入时间(毫秒)",
"blur.midnightconfig.radius": "半径",
"blur.midnightconfig.gradientStartColor": "渐变起始色",
"blur.midnightconfig.gradientEndColor": "渐变结束色"
}

View File

@@ -1,67 +0,0 @@
{
"targets": [
"swap"
],
"passes": [
{
"name": "blur:fade_in_blur",
"intarget": "minecraft:main",
"outtarget": "swap",
"uniforms": [
{
"name": "BlurDir",
"values": [ 1.0, 0.0 ]
},
{
"name": "Radius",
"values": [ 8.0 ]
}
]
},
{
"name": "blur:fade_in_blur",
"intarget": "swap",
"outtarget": "minecraft:main",
"uniforms": [
{
"name": "BlurDir",
"values": [ 0.0, 1.0 ]
},
{
"name": "Radius",
"values": [ 8.0 ]
}
]
},
{
"name": "blur:fade_in_blur",
"intarget": "minecraft:main",
"outtarget": "swap",
"uniforms": [
{
"name": "BlurDir",
"values": [ 1.0, 0.0 ]
},
{
"name": "Radius",
"values": [ 8.0 ]
}
]
},
{
"name": "blur:fade_in_blur",
"intarget": "swap",
"outtarget": "minecraft:main",
"uniforms": [
{
"name": "BlurDir",
"values": [ 0.0, 1.0 ]
},
{
"name": "Radius",
"values": [ 8.0 ]
}
]
}
]
}

View File

@@ -1,35 +0,0 @@
#version 150
uniform sampler2D DiffuseSampler;
in vec2 texCoord;
in vec2 oneTexel;
uniform vec2 InSize;
uniform vec2 BlurDir;
uniform float Radius;
uniform float Progress;
out vec4 fragColor;
void main() {
vec4 blurred = vec4(0.0);
float totalStrength = 0.0;
float totalAlpha = 0.0;
float totalSamples = 0.0;
float progRadius = floor(Radius * Progress);
for(float r = -progRadius; r <= progRadius; r += 1.0) {
vec4 sample = texture(DiffuseSampler, texCoord + oneTexel * r * BlurDir);
// Accumulate average alpha
totalAlpha = totalAlpha + sample.a;
totalSamples = totalSamples + 1.0;
// Accumulate smoothed blur
float strength = 1.0 - abs(r / progRadius);
totalStrength = totalStrength + strength;
blurred = blurred + sample;
}
fragColor = vec4(blurred.rgb / (progRadius * 2.0 + 1.0), totalAlpha);
}

View File

@@ -1,21 +0,0 @@
{
"blend": {
"func": "add",
"srcrgb": "srcalpha",
"dstrgb": "1-srcalpha"
},
"vertex": "sobel",
"fragment": "blur:fade_in_blur",
"attributes": [ "Position" ],
"samplers": [
{ "name": "DiffuseSampler" }
],
"uniforms": [
{ "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
{ "name": "InSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] },
{ "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] },
{ "name": "BlurDir", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] },
{ "name": "Radius", "type": "float", "count": 1, "values": [ 5.0 ] },
{ "name": "Progress", "type": "float", "count": 1, "values": [ 0.0 ] }
]
}

View File

@@ -1,30 +0,0 @@
{
"schemaVersion": 1,
"id": "blur",
"name": "Blur (Fabric)",
"version": "2.1.0",
"environment": "client",
"license": "MIT",
"icon": "assets/blur/icon.png",
"entrypoints": {
"client": [
"com.tterrag.blur.Blur::INSTANCE"
],
"modmenu": [
"com.tterrag.blur.config.ModMenuIntegration"
]
},
"contact": {
"homepage": "https://www.curseforge.com/minecraft/mc-mods/blur-fabric",
"issues": "https://github.com/Motschen/Blur/issues"
},
"authors": [
"tterrag1098",
"Pyrofab",
"Motschen"
],
"description": "Modifies the background behind Minecraft GUIs to have a blur effect",
"mixins": [
"mixins.blur.json"
]
}

View File

@@ -1,12 +0,0 @@
{
"required": true,
"package": "com.tterrag.blur.mixin",
"compatibilityLevel": "JAVA_8",
"client": [
"MixinScreen",
"MixinMinecraftClient"
],
"injectors": {
"defaultRequire": 1
}
}