diff --git a/.idea/dictionaries/default_user.xml b/.idea/dictionaries/default_user.xml
index eec6c321a802..42695fdf7d16 100644
--- a/.idea/dictionaries/default_user.xml
+++ b/.idea/dictionaries/default_user.xml
@@ -272,6 +272,8 @@
turbomax
twinclaws
typhoeus
+ ubik
+ ubikreminder
ultrasequencer
unobtained
unsummarized
@@ -288,4 +290,4 @@
yolkar
-
+
\ No newline at end of file
diff --git a/annotation-processors/out/production/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider b/annotation-processors/out/production/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider
new file mode 100644
index 000000000000..5f0d42dc4a95
--- /dev/null
+++ b/annotation-processors/out/production/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider
@@ -0,0 +1 @@
+at.hannibal2.skyhanni.skyhannimodule.ModuleProvider
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index c290ef7aefb6..37553f2eeb5e 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -105,6 +105,7 @@
+ Reset search terms in GUIs after closing inventory (Profit Trackers, Area Navigation list, etc.).
+ Enabled by default to reduce confusion caused by the search feature.
+ The Estimated Item Value now displays material names used to unlock gemstone slots. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3089)
++ Added Mithril Infusion to Estimated Item Value. - Empa (https://github.com/hannibal002/SkyHanni/pull/2990)
#### Chat and Command Improvements
@@ -185,6 +186,7 @@
+ Added an option to send the optimal speed warning even when not wearing Rancher's Boots. - Obsidian (https://github.com/hannibal002/SkyHanni/pull/2859)
+ Added a Pest Traps tab widget to the Tab Widget Display. - Luna (https://github.com/hannibal002/SkyHanni/pull/2984)
+ Updated Pest chat and GUI to indicate Pests Widget is disabled when displaying pests. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3022)
++ Changed Anita medal profit display to show profit per copper medal and sort by this value. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3122)
#### Event Improvements
@@ -208,6 +210,7 @@
+ Added a warning for empty messages left behind by Stash Compact. - Daveed (https://github.com/hannibal002/SkyHanni/pull/3009)
+ Added option to hide seconds in the Real Time GUI. - Obsidian (https://github.com/hannibal002/SkyHanni/pull/2979)
+ Improved graph navigation performance. - hannibal2 & Thunderblade (https://github.com/hannibal002/SkyHanni/pull/3083)
++ Added Roman numeral support to slayer names in trackers, Profit Tracker Items, and Scoreboard. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3113)
### Fixes
@@ -260,6 +263,7 @@
+ Fixed a small typo in Bestiary Display. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/2748)
+ Fixed `Line to Slayer Miniboss` not checking for walls. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/2788)
+ Fixed Special Zealots not highlighted after a recent Hypixel update. - Luna (https://github.com/hannibal002/SkyHanni/pull/3099)
++ Fixed Kuudra Lines sometimes not displaying in Custom Scoreboard. - j10a1n15 (https://github.com/hannibal002/SkyHanni/pull/3118)
#### Custom Scoreboard Fixes
@@ -358,6 +362,7 @@
+ Fixed Time Tower warnings showing up on new profiles (e.g. Bingo). - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3012)
+ You can open `/cf` once to make the message disappear without changing settings if a new profile was created before applying the fix for the first time.
+ Fixed stray flash overlaying other Chocolate Factory information. - Daveed (https://github.com/hannibal002/SkyHanni/pull/3054)
++ Fixed error when opening Choc Factory via NEU buttons. - Daveed (https://github.com/hannibal002/SkyHanni/pull/3108)
#### Event Fixes
@@ -392,6 +397,7 @@
+ Fixed the color of material messages.
+ Fixed overly liberal player message detection in Enable Chat Formatting. - !nea (https://github.com/hannibal002/SkyHanni/pull/2871)
+ This should fix many formatting issues related to `[SomethingHere] Something Else: Something Even More`.
++ Fixed /shwords causing blank messages in chat. - nopo (https://github.com/hannibal002/SkyHanni/pull/3110)
#### Misc Fixes
@@ -424,6 +430,10 @@
+ Fixed collection tracker to recognize the current collection. - nopo (https://github.com/hannibal002/SkyHanni/pull/3049)
+ Fixed skill level. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3068)
+ Fixed Replace Roman Numerals replacing random letters. - Mikecraft1224 (https://github.com/hannibal002/SkyHanni/pull/3003)
++ Fixed most incorrect farming skill XP cases. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3121)
+ + Calculation errors when reaching a skill cap below 60 are not fixed yet.
++ Fixed distortion of regular words due to incorrect Roman numeral replacement. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3113)
++ Fixed rare error message in skill progress display. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3105)
### Technical Details
@@ -542,6 +552,14 @@
+ Moved Next Jacobs Contest, Best Crop Milestone & Jyrre Timer to Renderable. - j10a1n15 (https://github.com/hannibal002/SkyHanni/pull/3004)
+ Added /shtestactionbar command: set your clipboard as a fake Action Bar. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3085)
+ Added /shdebug support for SkyBlock island, Bingo, and Tab List data tests. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3085)
++ Added error logging to trevor solver. - CalMWolfs (https://github.com/hannibal002/SkyHanni/pull/3107)
++ Added allowlist for Roman numeral replacement. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3113)
++ Added debug command /shdebugvisualwords. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3112)
+ + Added console logging of all words replaced by /shword.
++ Added contributor rabbit names. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3109)
+ + Replaced rabbit names in the rabbit collection menu with SkyHanni contributor names.
++ Added debug data for crop reading errors. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3114)
++ Improved Detekt and .editorconfig rules. - hannibal2 (https://github.com/hannibal002/SkyHanni/pull/3104)
### Removed Features
diff --git a/root.gradle.kts b/root.gradle.kts
index 3cef4a498e48..0b962be5ed7d 100644
--- a/root.gradle.kts
+++ b/root.gradle.kts
@@ -14,7 +14,7 @@ plugins {
allprojects {
group = "at.hannibal2.skyhanni"
- version = "0.28.Beta.21"
+ version = "0.28.Beta.22"
repositories {
mavenCentral()
mavenLocal()
diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF
new file mode 100644
index 000000000000..877ca5bd8ba8
--- /dev/null
+++ b/src/main/java/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: SkyHanniInstallerFrame
+
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/rift/RiftConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/rift/RiftConfig.java
index 9c24e810fc4c..968463e14e14 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/rift/RiftConfig.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/rift/RiftConfig.java
@@ -55,4 +55,10 @@ public class RiftConfig {
@ConfigEditorBoolean
@FeatureToggle
public boolean horsezookaHider = false;
+
+ @Expose
+ @ConfigOption(name = "Ubik's cube reminder", desc = "Reminder for Ubik's cube in the rift")
+ @ConfigEditorBoolean
+ @FeatureToggle
+ public boolean ubikReminder = false;
}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/Ubikreminder.kt b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/Ubikreminder.kt
new file mode 100644
index 000000000000..a15d5d024237
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/rift/everywhere/Ubikreminder.kt
@@ -0,0 +1,37 @@
+package at.hannibal2.skyhanni.features.rift.everywhere
+
+import at.hannibal2.skyhanni.events.LorenzChatEvent
+import at.hannibal2.skyhanni.features.rift.RiftAPI
+import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
+import at.hannibal2.skyhanni.utils.ChatUtils
+import at.hannibal2.skyhanni.utils.DelayedRun
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import kotlin.time.Duration.Companion.hours
+
+@SkyHanniModule
+object Ubikreminder {
+
+ private val config get() = RiftAPI.config.ubikReminder
+
+ private var isTimerRunning = false
+ private val messageRegex = Regex("ROUND [1-9] \\(FINAL\\):")
+
+
+ @SubscribeEvent
+ fun onChat(event: LorenzChatEvent) {
+ if (!RiftAPI.config.ubikReminder) return
+ val message = event.message
+ if (messageRegex.matches(message) && !isTimerRunning) {
+ startTimer()
+ }
+ }
+ private fun startTimer() {
+ isTimerRunning = true
+
+ DelayedRun.runDelayed(2.hours) { // 2 hours as a Duration
+ ChatUtils.chat("§aUbik's cube is ready in the rift!")
+ isTimerRunning = false
+
+ }
+ }
+}
diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 000000000000..877ca5bd8ba8
--- /dev/null
+++ b/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: SkyHanniInstallerFrame
+
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/META-INF/MANIFEST.MF b/src/main/resources/production/SkyHanni.1.8.9.main/META-INF/MANIFEST.MF
new file mode 100644
index 000000000000..877ca5bd8ba8
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: SkyHanniInstallerFrame
+
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/1.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/1.png
new file mode 100644
index 000000000000..063b624c0861
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/1.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/2.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/2.png
new file mode 100644
index 000000000000..ca09621ab055
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/2.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/3.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/3.png
new file mode 100644
index 000000000000..7a8f10b1f538
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/3.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/4.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/4.png
new file mode 100644
index 000000000000..cbc7c18456c8
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/4.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/5.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/5.png
new file mode 100644
index 000000000000..17367ee37891
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/bars/5.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/cold_overlay.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/cold_overlay.png
new file mode 100644
index 000000000000..da61958e30a0
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/cold_overlay.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/folder.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/folder.png
new file mode 100644
index 000000000000..f4af73530b51
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/folder.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/gui/regexes.xml b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/gui/regexes.xml
new file mode 100644
index 000000000000..d9b20d1719b2
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/gui/regexes.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/gui/slot.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/gui/slot.png
new file mode 100644
index 000000000000..7e15b97d12de
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/gui/slot.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/logo.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/logo.png
new file mode 100644
index 000000000000..8be408cf116e
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/logo.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/scoreboard.png b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/scoreboard.png
new file mode 100644
index 000000000000..acd9d85863a2
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/scoreboard.png differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/darken.fsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/darken.fsh
new file mode 100644
index 000000000000..cfc118eefba6
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/darken.fsh
@@ -0,0 +1,13 @@
+#version 120
+
+// Fragment Shader
+uniform sampler2D texture;
+uniform float darknessLevel;
+
+varying vec4 outColor;
+
+void main() {
+ vec4 color = texture2D(texture, gl_TexCoord[0].st) * outColor;
+ vec3 darkenedColor = color.rgb * darknessLevel;
+ gl_FragColor = vec4(darkenedColor, color.a);
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/darken.vsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/darken.vsh
new file mode 100644
index 000000000000..210bee8725f7
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/darken.vsh
@@ -0,0 +1,9 @@
+#version 120
+
+varying vec4 outColor;
+
+void main() {
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+ outColor = gl_Color;
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect.fsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect.fsh
new file mode 100644
index 000000000000..e728bf43d6a0
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect.fsh
@@ -0,0 +1,34 @@
+#version 120
+
+uniform float scaleFactor;
+uniform float radius;
+uniform float smoothness;
+uniform vec2 halfSize;
+uniform vec2 centerPos;
+
+varying vec4 color;
+
+// From https://www.shadertoy.com/view/WtdSDs
+float roundedRectSDF(vec2 center, vec2 halfSize, float radius) {
+ return length(max(abs(center) - halfSize + radius, 0.0)) - radius;
+}
+
+void main() {
+ float xScale = gl_ModelViewMatrix[0][0];
+ float yScale = gl_ModelViewMatrix[1][1];
+ float xTranslation = gl_ModelViewMatrix[3][0];
+ float yTranslation = gl_ModelViewMatrix[3][1];
+
+ vec2 newHalfSize = vec2(halfSize.x * xScale, halfSize.y * yScale);
+
+ float newCenterPosY = centerPos.y;
+ if (yScale != 1.0) {
+ newCenterPosY = centerPos.y - (halfSize.y * (yScale - 1));
+ }
+
+ vec2 newCenterPos = vec2((centerPos.x * xScale) + (xTranslation * scaleFactor), newCenterPosY - (yTranslation * scaleFactor));
+
+ float distance = roundedRectSDF(gl_FragCoord.xy - newCenterPos, newHalfSize, radius);
+ float smoothed = 1.0 - smoothstep(0.0, smoothness, distance);
+ gl_FragColor = color * vec4(1.0, 1.0, 1.0, smoothed);
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect.vsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect.vsh
new file mode 100644
index 000000000000..acfb526629fd
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect.vsh
@@ -0,0 +1,8 @@
+#version 120
+
+varying vec4 color;
+
+void main() {
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ color = gl_Color;
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect_outline.fsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect_outline.fsh
new file mode 100644
index 000000000000..64c8a54d6bf6
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect_outline.fsh
@@ -0,0 +1,40 @@
+#version 120
+
+// Rect specific uniforms
+uniform float scaleFactor;
+uniform float radius;
+uniform vec2 halfSize;
+uniform vec2 centerPos;
+
+// Outline specific uniforms
+uniform float borderThickness;
+uniform float borderBlur;
+
+varying vec4 color;
+
+// From https://www.shadertoy.com/view/WtdSDs
+float roundedRectSDF(vec2 center, vec2 halfSize, float radius) {
+ return length(max(abs(center) - halfSize + radius, 0.0)) - radius;
+}
+
+void main() {
+ float xScale = gl_ModelViewMatrix[0][0];
+ float yScale = gl_ModelViewMatrix[1][1];
+ float xTranslation = gl_ModelViewMatrix[3][0];
+ float yTranslation = gl_ModelViewMatrix[3][1];
+
+ vec2 newHalfSize = vec2(halfSize.x * xScale, halfSize.y * yScale);
+
+ float newCenterPosY = centerPos.y;
+ if (yScale != 1.0) {
+ newCenterPosY = centerPos.y - (halfSize.y * (yScale - 1));
+ }
+
+ vec2 newCenterPos = vec2((centerPos.x * xScale) + (xTranslation * scaleFactor), newCenterPosY - (yTranslation * scaleFactor));
+
+ float distance = roundedRectSDF(gl_FragCoord.xy - newCenterPos, newHalfSize, max(radius, borderThickness));
+
+ // In testing, keeping the upper bound at 1.0 and letting the lower be changable seemed the most sensible for nice results
+ float smoothed = 1.0 - smoothstep(borderBlur, 1.0, abs(distance / borderThickness));
+ gl_FragColor = color * vec4(1.0, 1.0, 1.0, smoothed);
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect_outline.vsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect_outline.vsh
new file mode 100644
index 000000000000..acfb526629fd
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_rect_outline.vsh
@@ -0,0 +1,8 @@
+#version 120
+
+varying vec4 color;
+
+void main() {
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ color = gl_Color;
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_texture.fsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_texture.fsh
new file mode 100644
index 000000000000..4e5c0e1eacdf
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_texture.fsh
@@ -0,0 +1,37 @@
+#version 120
+
+uniform float scaleFactor;
+uniform float radius;
+uniform float smoothness;
+uniform vec2 halfSize;
+uniform vec2 centerPos;
+
+uniform sampler2D outTexture;
+
+varying vec2 outTextureCoords;
+varying vec4 outColor;
+
+// From https://www.shadertoy.com/view/WtdSDs
+float roundedRectSDF(vec2 center, vec2 halfSize, float radius) {
+ return length(max(abs(center) - halfSize + radius, 0.0)) - radius;
+}
+
+void main() {
+ float xScale = gl_ModelViewMatrix[0][0];
+ float yScale = gl_ModelViewMatrix[1][1];
+ float xTranslation = gl_ModelViewMatrix[3][0];
+ float yTranslation = gl_ModelViewMatrix[3][1];
+
+ vec2 newHalfSize = vec2(halfSize.x * xScale, halfSize.y * yScale);
+
+ float newCenterPosY = centerPos.y;
+ if (yScale != 1.0) {
+ newCenterPosY = centerPos.y - (halfSize.y * (yScale - 1));
+ }
+
+ vec2 newCenterPos = vec2((centerPos.x * xScale) + (xTranslation * scaleFactor), newCenterPosY - (yTranslation * scaleFactor));
+
+ float distance = roundedRectSDF(gl_FragCoord.xy - newCenterPos, newHalfSize, radius);
+ float smoothed = 1.0 - smoothstep(0.0, smoothness, distance);
+ gl_FragColor = (texture2D(outTexture, outTextureCoords) * outColor) * vec4(1.0, 1.0, 1.0, smoothed);
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_texture.vsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_texture.vsh
new file mode 100644
index 000000000000..227f964a1211
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/rounded_texture.vsh
@@ -0,0 +1,10 @@
+#version 120
+
+varying vec2 outTextureCoords;
+varying vec4 outColor;
+
+void main(){
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ outColor = gl_Color;
+ outTextureCoords = gl_MultiTexCoord0.st;
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/standard_chroma.fsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/standard_chroma.fsh
new file mode 100644
index 000000000000..0028fe6ceae8
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/standard_chroma.fsh
@@ -0,0 +1,37 @@
+// Chroma Fragment Shader
+// (Same as textured_chroma.fsh but isn't restricted to textured elements)
+
+#version 120
+
+uniform float chromaSize;
+uniform float timeOffset;
+uniform float saturation;
+uniform bool forwardDirection;
+
+varying vec4 originalColor;
+
+float rgb2b(vec3 rgb) {
+ return max(max(rgb.r, rgb.g), rgb.b);
+}
+
+vec3 hsb2rgb_smooth(vec3 c) {
+ vec3 rgb = clamp(abs(mod(c.x * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);
+ rgb = rgb * rgb * (3.0 - 2.0 * rgb); // Cubic smoothing
+ return c.z * mix(vec3(1.0), rgb, c.y);
+}
+
+void main() {
+ // Determine the direction chroma moves
+ float fragCoord;
+ if (forwardDirection) {
+ fragCoord = gl_FragCoord.x - gl_FragCoord.y;
+ } else {
+ fragCoord = gl_FragCoord.x + gl_FragCoord.y;
+ }
+
+ // The hue takes in account the position, chroma settings, and time
+ float hue = mod(((fragCoord) / chromaSize) - timeOffset, 1.0);
+
+ // Set the color to use the new hue & original saturation/value/alpha values
+ gl_FragColor = vec4(hsb2rgb_smooth(vec3(hue, saturation, rgb2b(originalColor.rgb))), originalColor.a);
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/standard_chroma.vsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/standard_chroma.vsh
new file mode 100644
index 000000000000..abfee20ee579
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/standard_chroma.vsh
@@ -0,0 +1,13 @@
+// Chroma Vertex Shader
+// (Same as textured_chroma.vsh but isn't restricted to only texture elements)
+
+#version 120
+
+varying vec4 originalColor;
+
+void main() {
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ // Pass original color to fragment
+ originalColor = gl_Color;
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/textured_chroma.fsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/textured_chroma.fsh
new file mode 100644
index 000000000000..1ccdc4fe1776
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/textured_chroma.fsh
@@ -0,0 +1,43 @@
+// Textured Chroma Fragment Shader
+// Modified from SkyblockAddons
+// Credit: https://github.com/BiscuitDevelopment/SkyblockAddons/blob/main/src/main/resources/assets/skyblockaddons/shaders/program/chroma_screen_textured.fsh
+
+#version 120
+
+uniform float chromaSize;
+uniform float timeOffset;
+uniform float saturation;
+uniform bool forwardDirection;
+
+uniform sampler2D outTexture;
+
+varying vec2 outTextureCoords;
+varying vec4 outColor;
+
+float rgb2b(vec3 rgb) {
+ return max(max(rgb.r, rgb.g), rgb.b);
+}
+
+vec3 hsb2rgb_smooth(vec3 c) {
+ vec3 rgb = clamp(abs(mod(c.x * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);
+ rgb = rgb * rgb * (3.0 - 2.0 * rgb); // Cubic smoothing
+ return c.z * mix(vec3(1.0), rgb, c.y);
+}
+
+void main() {
+ vec4 originalColor = texture2D(outTexture, outTextureCoords) * outColor;
+
+ // Determine the direction chroma moves
+ float fragCoord;
+ if (forwardDirection) {
+ fragCoord = gl_FragCoord.x - gl_FragCoord.y;
+ } else {
+ fragCoord = gl_FragCoord.x + gl_FragCoord.y;
+ }
+
+ // The hue takes in account the position, chroma settings, and time
+ float hue = mod(((fragCoord) / chromaSize) - timeOffset, 1.0);
+
+ // Set the color to use the new hue & original saturation/value/alpha values
+ gl_FragColor = vec4(hsb2rgb_smooth(vec3(hue, saturation, rgb2b(originalColor.rgb))), originalColor.a);
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/textured_chroma.vsh b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/textured_chroma.vsh
new file mode 100644
index 000000000000..5dad3950f2bc
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/shaders/textured_chroma.vsh
@@ -0,0 +1,15 @@
+// Textured Chroma Vertex Shader
+// Credit: https://github.com/BiscuitDevelopment/SkyblockAddons/blob/main/src/main/resources/assets/skyblockaddons/shaders/program/chroma_screen_textured.vsh
+
+#version 120
+
+varying vec2 outTextureCoords;
+varying vec4 outColor;
+
+void main() {
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ // Pass the color & texture coords to the fragment shader
+ outColor = gl_Color;
+ outTextureCoords = gl_MultiTexCoord0.st;
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/sounds.json b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/sounds.json
new file mode 100644
index 000000000000..4a7c79770598
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/sounds.json
@@ -0,0 +1,11 @@
+{
+ "centurytimer.active": {
+ "category": "neutral",
+ "sounds": [
+ {
+ "name": "itstimetopunchwheat",
+ "stream": false
+ }
+ ]
+ }
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/sounds/itstimetopunchwheat.ogg b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/sounds/itstimetopunchwheat.ogg
new file mode 100644
index 000000000000..b7bd981373da
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/assets/skyhanni/sounds/itstimetopunchwheat.ogg differ
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/fabric.mod.json b/src/main/resources/production/SkyHanni.1.8.9.main/fabric.mod.json
new file mode 100644
index 000000000000..d86c9cd51efb
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/fabric.mod.json
@@ -0,0 +1,12 @@
+{
+ "schemaVersion": 1,
+ "version": "${version}",
+ "id": "skyhanni",
+ "name": "SkyHanni",
+ "description": "SkyHanni is a Minecraft Mod for Hypixel SkyBlock.",
+ "icon": "assets/skyhanni/logo.png",
+ "authors": [],
+ "depends": {
+ "minecraft": "1.8.9"
+ }
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/hotswap-agent.properties b/src/main/resources/production/SkyHanni.1.8.9.main/hotswap-agent.properties
new file mode 100644
index 000000000000..230a7d99ac0a
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/hotswap-agent.properties
@@ -0,0 +1 @@
+pluginPackages=moe.nea.hotswapagentforge.plugin
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/mcmod.info b/src/main/resources/production/SkyHanni.1.8.9.main/mcmod.info
new file mode 100644
index 000000000000..0e135af9dd77
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/mcmod.info
@@ -0,0 +1,20 @@
+[
+ {
+ "modid": "skyhanni",
+ "name": "SkyHanni",
+ "description": "Hypixel SkyBlock Mod",
+ "version": "${version}",
+ "mcversion": "1.8.9",
+ "url": "https://github.com/hannibal002/SkyHanni",
+ "updateUrl": "",
+ "authorList": [
+ "hannibal2"
+ ],
+ "credits": "https://github.com/hannibal002/SkyHanni/graphs/contributors",
+ "logoFile": "assets/skyhanni/logo.png",
+ "screenshots": [],
+ "dependencies": [
+ "NotEnoughUpdates"
+ ]
+ }
+]
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/mixins.skyhanni.json b/src/main/resources/production/SkyHanni.1.8.9.main/mixins.skyhanni.json
new file mode 100644
index 000000000000..b7763efb1401
--- /dev/null
+++ b/src/main/resources/production/SkyHanni.1.8.9.main/mixins.skyhanni.json
@@ -0,0 +1,9 @@
+{
+ "package": "at.hannibal2.skyhanni.mixins.transformers",
+ "refmap": "mixins.skyhanni.refmap.json",
+ "plugin": "at.hannibal2.skyhanni.mixins.init.SkyhanniMixinPlugin",
+ "compatibilityLevel": "JAVA_8",
+ "injectors": {
+ "maxShiftBy": 2
+ }
+}
diff --git a/src/main/resources/production/SkyHanni.1.8.9.main/skyhanni-keystore.jks b/src/main/resources/production/SkyHanni.1.8.9.main/skyhanni-keystore.jks
new file mode 100644
index 000000000000..75039b79a010
Binary files /dev/null and b/src/main/resources/production/SkyHanni.1.8.9.main/skyhanni-keystore.jks differ