aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/at')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java1
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/features/Misc.java30
-rw-r--r--src/main/java/at/hannibal2/skyhanni/events/YawRotateEvent.kt6
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/misc/YawSnapping.kt117
-rw-r--r--src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinEntity.java31
5 files changed, 185 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java
index d5f9a3929..a61134c92 100644
--- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java
+++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java
@@ -210,6 +210,7 @@ public class SkyHanniMod {
loadModule(new SkyMartBestProfit());
loadModule(new GardenVisitorFeatures());
loadModule(new GardenInventoryNumbers());
+ loadModule(new YawSnapping());
loadModule(new GardenVisitorTimer());
loadModule(new GardenNextPlotPrice());
loadModule(new GardenCropMilestoneDisplay());
diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java b/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java
index 09df06dff..97614b46d 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/features/Misc.java
@@ -252,4 +252,34 @@ public class Misc {
@ConfigOption(name = "Config Button", desc = "Add a button to the pause menu to configure SkyHanni.")
@ConfigEditorBoolean
public boolean configButtonOnPause = true;
+
+ @ConfigOption(name = "Yaw Snapping", desc = "")
+ @ConfigEditorAccordion(id = 6)
+ public boolean yawSnappingAccordion = false;
+
+ @Expose
+ @ConfigOption(name = "Enable Yaw Snapping", desc = "Align your yaw with certain angles")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 6)
+ public boolean yawSnapping = false;
+
+ @Expose
+ @ConfigOption(name = "Release Distance", desc = "How much you have to overshoot an angle to release yaw snapping")
+ @ConfigEditorSlider(minValue = 0, maxValue = 180, minStep = 1)
+ @ConfigAccordionId(id = 6)
+ public float yawTightness = 90;
+
+ @Expose
+ @ConfigOption(name = "Intervals", desc = "In which intervals do you want to enable yaw snapping (45°, 90°, etc.)")
+ @ConfigEditorSlider(minValue = 1, maxValue = 180, minStep = 1)
+ @ConfigAccordionId(id = 6)
+ public float yawIntervals = 45;
+
+
+ @Expose
+ @ConfigOption(name = "Yaw Overlay", desc = "Display your current yaw over your cursor")
+ @ConfigEditorBoolean
+ @ConfigAccordionId(id = 6)
+ public boolean displayYawOverlay = true;
+}
}
diff --git a/src/main/java/at/hannibal2/skyhanni/events/YawRotateEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/YawRotateEvent.kt
new file mode 100644
index 000000000..d412b2fe5
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/events/YawRotateEvent.kt
@@ -0,0 +1,6 @@
+package at.hannibal2.skyhanni.events
+
+import net.minecraftforge.fml.common.eventhandler.Cancelable
+
+@Cancelable
+data class YawRotateEvent(val yawDelta: Float, val oldYaw: Float) : LorenzEvent() \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/YawSnapping.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/YawSnapping.kt
new file mode 100644
index 000000000..24d617590
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/misc/YawSnapping.kt
@@ -0,0 +1,117 @@
+package at.hannibal2.skyhanni.features.misc
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.config.core.util.render.TextRenderUtils
+import at.hannibal2.skyhanni.events.YawRotateEvent
+import net.minecraft.client.Minecraft
+import net.minecraft.client.gui.Gui
+import net.minecraft.client.gui.ScaledResolution
+import net.minecraft.client.renderer.GlStateManager
+import net.minecraftforge.client.event.RenderGameOverlayEvent
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import kotlin.math.absoluteValue
+import kotlin.math.sign
+
+class YawSnapping {
+
+ fun isEnabled(): Boolean =
+ /*LorenzUtils.inSkyBlock && // */
+ SkyHanniMod.feature.misc.yawSnapping
+
+
+ var overshot = 0F
+ var isLocking = false
+
+ private val snapPoints
+ get() =
+ generateSequence(0F) { it + SkyHanniMod.feature.misc.yawIntervals }
+ .takeWhile { it <= 360 }
+
+ @SubscribeEvent
+ fun onRenderOverlay(event: RenderGameOverlayEvent.Post) {
+ if (!isEnabled()) return
+ if (!SkyHanniMod.feature.misc.displayYawOverlay) return
+ if (event.type != RenderGameOverlayEvent.ElementType.ALL) return
+ val sr = ScaledResolution(Minecraft.getMinecraft())
+ GlStateManager.pushMatrix()
+ GlStateManager.translate(sr.scaledWidth_double / 2, sr.scaledHeight_double / 2, 0.0)
+ Gui.drawRect(-200, -16, 200, -15, 0xFFFFFFFF.toInt())
+ Gui.drawRect(-200, 15, 200, 16, 0xFFFFFFFF.toInt())
+ Gui.drawRect(0, -16, 1, 16, 0xFFFFFFFF.toInt())
+ Gui.drawRect(-200, -16, -199, 16, 0xFFFFFFFF.toInt())
+ Gui.drawRect(199, -16, 200, 16, 0xFFFFFFFF.toInt())
+ val font = Minecraft.getMinecraft().fontRendererObj
+ val player = Minecraft.getMinecraft().thePlayer
+ val playerYaw = (player.rotationYaw % 360 + 360) % 360
+ fun deltaToPosition(delta: Float) = (if (delta < -180) {
+ (360 + delta) % 360
+ } else if (delta > 180) {
+ -(360 - delta) % 360
+ } else delta) * 3
+
+ for (yawBreak in (generateSequence(0F) { it + 15 }.takeWhile { it < 360 } + snapPoints.filter { it < 360 }).toSet()) {
+ val delta = yawBreak - playerYaw
+ val position = deltaToPosition(delta)
+ if (position.absoluteValue < 200) {
+ TextRenderUtils.drawStringCentered(
+ "${yawBreak.toInt()}",
+ font,
+ position,
+ -font.FONT_HEIGHT / 2F,
+ false,
+ 0xFFFFFFFF.toInt()
+ )
+ Gui.drawRect(
+ position.toInt(),
+ font.FONT_HEIGHT / 2,
+ position.toInt() + 1,
+ 16,
+ if (yawBreak in snapPoints) 0xFF00FF00.toInt() else 0xFFFFFFFF.toInt()
+ )
+ }
+ }
+ if (isLocking) {
+ val overshotPos = overshot * 200 / SkyHanniMod.feature.misc.yawTightness
+ Gui.drawRect(
+ overshotPos.toInt(),
+ font.FONT_HEIGHT / 2,
+ overshotPos.toInt() + 1,
+ 16,
+ 0xFFFFFF00.toInt()
+ )
+ }
+ GlStateManager.enableDepth()
+ GlStateManager.color(1F, 1F, 1F, 1F)
+ GlStateManager.popMatrix()
+ }
+
+ @SubscribeEvent
+ fun onYawRotate(event: YawRotateEvent) {
+ if (!isEnabled()) {
+ isLocking = false
+ return
+ }
+ if (isLocking) {
+ overshot += event.yawDelta
+ if (overshot.absoluteValue > SkyHanniMod.feature.misc.yawTightness) {
+ isLocking = false
+ } else {
+ event.isCanceled = true
+ }
+ return
+ }
+ val old = (360 + event.oldYaw % 360) % 360
+ val new = old + event.yawDelta
+ for (snapPoint in snapPoints) {
+ if (sign(old - snapPoint) != sign(new - snapPoint)) {
+ Minecraft.getMinecraft().thePlayer.rotationYaw = snapPoint
+ Minecraft.getMinecraft().thePlayer.prevRotationYaw = snapPoint
+ event.isCanceled = true
+ overshot = 0F
+ isLocking = true
+ }
+ }
+ }
+
+
+} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinEntity.java b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinEntity.java
new file mode 100644
index 000000000..a721ae168
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/mixins/transformers/MixinEntity.java
@@ -0,0 +1,31 @@
+package at.hannibal2.skyhanni.mixins.transformers;
+
+import at.hannibal2.skyhanni.events.YawRotateEvent;
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.Entity;
+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(Entity.class)
+public abstract class MixinEntity {
+ @Shadow
+ public float rotationYaw;
+
+ @Shadow public abstract void setAngles(float yaw, float pitch);
+
+ @Inject(method = "setAngles", at = @At("HEAD"), cancellable = true)
+ public void skyhanniOnSetAngles(float yaw, float pitch, CallbackInfo ci) {
+ Entity $this = (Entity) (Object) this;
+ if (yaw != 0F && $this == Minecraft.getMinecraft().thePlayer) {
+ YawRotateEvent yawRotateEvent = new YawRotateEvent(yaw, this.rotationYaw);
+ yawRotateEvent.postAndCatch();
+ if (yawRotateEvent.isCanceled()) {
+ ci.cancel();
+ this.setAngles(0, pitch);
+ }
+ }
+ }
+}