aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/moe/nea/firmament/mixins/PlayerLeftHandedPatch.java27
-rw-r--r--src/main/kotlin/moe/nea/firmament/features/fixes/Fixes.kt20
-rw-r--r--src/main/kotlin/moe/nea/firmament/util/ErrorBoundary.kt14
3 files changed, 56 insertions, 5 deletions
diff --git a/src/main/java/moe/nea/firmament/mixins/PlayerLeftHandedPatch.java b/src/main/java/moe/nea/firmament/mixins/PlayerLeftHandedPatch.java
new file mode 100644
index 0000000..6935cd6
--- /dev/null
+++ b/src/main/java/moe/nea/firmament/mixins/PlayerLeftHandedPatch.java
@@ -0,0 +1,27 @@
+/*
+ * SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+package moe.nea.firmament.mixins;
+
+import moe.nea.firmament.features.fixes.Fixes;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.util.Arm;
+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.CallbackInfoReturnable;
+
+@Mixin(PlayerEntity.class)
+public class PlayerLeftHandedPatch {
+ @Inject(
+ method = "getMainArm",
+ at = @At("HEAD"),
+ cancellable = true
+ )
+ public void onGetMainArm(CallbackInfoReturnable<Arm> cir) {
+ Fixes.INSTANCE.isLeftHandedHook((PlayerEntity) (Object) this, cir);
+ }
+}
diff --git a/src/main/kotlin/moe/nea/firmament/features/fixes/Fixes.kt b/src/main/kotlin/moe/nea/firmament/features/fixes/Fixes.kt
index a6f4965..200bb74 100644
--- a/src/main/kotlin/moe/nea/firmament/features/fixes/Fixes.kt
+++ b/src/main/kotlin/moe/nea/firmament/features/fixes/Fixes.kt
@@ -6,16 +6,19 @@
package moe.nea.firmament.features.fixes
+import moe.nea.jarvis.api.Point
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable
+import net.minecraft.client.MinecraftClient
+import net.minecraft.client.option.KeyBinding
+import net.minecraft.entity.player.PlayerEntity
+import net.minecraft.text.Text
+import net.minecraft.util.Arm
import moe.nea.firmament.events.HudRenderEvent
import moe.nea.firmament.events.WorldKeyboardEvent
import moe.nea.firmament.features.FirmamentFeature
import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.util.MC
-import moe.nea.jarvis.api.Point
-import net.minecraft.client.MinecraftClient
-import net.minecraft.client.option.KeyBinding
-import net.minecraft.text.Text
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable
+import moe.nea.firmament.util.errorBoundary
object Fixes : FirmamentFeature {
override val identifier: String
@@ -27,6 +30,7 @@ object Fixes : FirmamentFeature {
val autoSprintKeyBinding by keyBindingWithDefaultUnbound("auto-sprint-keybinding")
val autoSprintHud by position("auto-sprint-hud", 80, 10) { Point(0.0, 1.0) }
val peekChat by keyBindingWithDefaultUnbound("peek-chat")
+ val useClientSidedHandedness by toggle("clientside-lefthand") { true }
}
override val config: ManagedConfig
@@ -40,6 +44,12 @@ object Fixes : FirmamentFeature {
cir.returnValue = true
}
+ fun isLeftHandedHook(entity: PlayerEntity, cit: CallbackInfoReturnable<Arm>) = errorBoundary {
+ if (TConfig.useClientSidedHandedness && entity.isMainPlayer) {
+ cit.returnValue = MC.instance.options.mainArm.value
+ }
+ }
+
override fun onLoad() {
WorldKeyboardEvent.subscribe {
if (it.matches(TConfig.autoSprintKeyBinding)) {
diff --git a/src/main/kotlin/moe/nea/firmament/util/ErrorBoundary.kt b/src/main/kotlin/moe/nea/firmament/util/ErrorBoundary.kt
new file mode 100644
index 0000000..4341361
--- /dev/null
+++ b/src/main/kotlin/moe/nea/firmament/util/ErrorBoundary.kt
@@ -0,0 +1,14 @@
+/*
+ * SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+package moe.nea.firmament.util
+
+
+fun <T> errorBoundary(block: () -> T): T? {
+ // TODO: implement a proper error boundary here to avoid crashing minecraft code
+ return block()
+}
+