From 3beacf5f58e921471ee389f24df259c88975eb4f Mon Sep 17 00:00:00 2001
From: Sollace <sollacea@gmail.com>
Date: Wed, 15 Apr 2020 15:45:57 +0200
Subject: [PATCH] More cleanup to input

---
 .../client/InversionAwareKeyboardInput.java   | 60 -------------------
 .../unicopia/client/KeyBindingsHandler.java   | 32 ++++------
 .../unicopia/client/MouseControl.java         | 23 -------
 .../unicopia/client/UnicopiaCoreClient.java   | 57 +++++++++++++-----
 .../unicopia/client/UnicopiaReduxClient.java  | 54 -----------------
 .../unicopia/client/mixin/MixinCamera.java    |  3 +-
 .../client/mixin/MixinGameRenderer.java       |  1 -
 .../client/mixin/MixinKeyboardInput.java      | 36 +++++++++++
 .../unicopia/client/mixin/MixinMouse.java     | 31 ++++++++++
 9 files changed, 121 insertions(+), 176 deletions(-)
 delete mode 100644 src/main/java/com/minelittlepony/unicopia/client/InversionAwareKeyboardInput.java
 delete mode 100644 src/main/java/com/minelittlepony/unicopia/client/MouseControl.java
 delete mode 100644 src/main/java/com/minelittlepony/unicopia/client/UnicopiaReduxClient.java
 create mode 100644 src/main/java/com/minelittlepony/unicopia/client/mixin/MixinKeyboardInput.java
 create mode 100644 src/main/java/com/minelittlepony/unicopia/client/mixin/MixinMouse.java

diff --git a/src/main/java/com/minelittlepony/unicopia/client/InversionAwareKeyboardInput.java b/src/main/java/com/minelittlepony/unicopia/client/InversionAwareKeyboardInput.java
deleted file mode 100644
index 843b0253..00000000
--- a/src/main/java/com/minelittlepony/unicopia/client/InversionAwareKeyboardInput.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.minelittlepony.unicopia.client;
-
-import com.minelittlepony.unicopia.SpeciesList;
-import com.minelittlepony.unicopia.entity.player.IPlayer;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.input.Input;
-import net.minecraft.client.input.KeyboardInput;
-
-public class InversionAwareKeyboardInput extends KeyboardInput {
-
-    private static boolean recurseCheck;
-
-    private Input proxy;
-
-    public InversionAwareKeyboardInput(MinecraftClient client, Input inherited) {
-        super(client.options);
-        proxy = inherited;
-    }
-
-    @Override
-    public void tick(boolean one, boolean two) {
-        // Other mods might wrap us, in which case let's just pretend to be the vanilla one.
-        // We'll replace them at the top level and let go of the inner to prevent the chain from growing.
-        if (recurseCheck) {
-            proxy = null;
-            super.tick(one, two);
-        }
-
-        recurseCheck = true;
-        proxy.tick(one, two);
-        recurseCheck = false;
-
-        this.pressingForward = proxy.pressingForward;
-        this.pressingBack = proxy.pressingBack;
-        this.pressingLeft = proxy.pressingLeft;
-        this.pressingRight = proxy.pressingRight;
-        this.jumping = proxy.jumping;
-        this.sneaking = proxy.sneaking;
-        this.movementSideways = proxy.movementSideways;
-        this.movementForward = proxy.movementForward;
-
-        IPlayer player = SpeciesList.instance().getPlayer(MinecraftClient.getInstance().player);
-
-        if (player.getGravity().getGravitationConstant() < 0) {
-            boolean tmp = pressingLeft;
-
-            pressingLeft = pressingRight;
-            pressingRight = tmp;
-
-            movementSideways = -movementSideways;
-
-            if (player.getOwner().abilities.flying) {
-                tmp = jumping;
-                jumping = sneaking;
-                sneaking = tmp;
-            }
-        }
-    }
-}
diff --git a/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java b/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java
index e3377b07..b814d38a 100644
--- a/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java
+++ b/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java
@@ -1,7 +1,7 @@
 package com.minelittlepony.unicopia.client;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 
 import com.minelittlepony.unicopia.IKeyBindingHandler;
 import com.minelittlepony.unicopia.SpeciesList;
@@ -17,13 +17,13 @@ import net.minecraft.client.util.InputUtil;
 import net.minecraft.util.Identifier;
 
 
-public class KeyBindingsHandler implements IKeyBindingHandler {
+class KeyBindingsHandler implements IKeyBindingHandler {
     private final MinecraftClient client = MinecraftClient.getInstance();
 
-    private final List<KeyBinding> bindings = new ArrayList<>();
-    private final List<KeyBinding> removed = new ArrayList<>();
+    private final Set<KeyBinding> bindings = new HashSet<>();
+    private final Set<KeyBinding> removed = new HashSet<>();
 
-    private final List<KeyBinding> pressed = new ArrayList<>();
+    private final Set<KeyBinding> pressed = new HashSet<>();
 
     @Override
     public void addKeybind(IKeyBinding p) {
@@ -46,9 +46,7 @@ public class KeyBindingsHandler implements IKeyBindingHandler {
         for (KeyBinding i : bindings) {
             if (i.isPressed()) {
 
-                if (!pressed.contains(i)) {
-                    pressed.add(i);
-
+                if (pressed.add(i)) {
                     if (!PowersRegistry.instance().hasRegisteredPower(i.getDefaultKeyCode().getKeyCode())) {
                         removed.add(i);
                         System.out.println("Error: Keybinding(" + i.getLocalizedName() + ") does not have a registered pony power. Keybinding will be removed from event.");
@@ -58,19 +56,13 @@ public class KeyBindingsHandler implements IKeyBindingHandler {
                             .ifPresent(iplayer.getAbilities()::tryUseAbility);
                     }
                 }
-            } else {
-                if (pressed.contains(i)) {
-                    pressed.remove(i);
-
-                    iplayer.getAbilities().tryClearAbility();
-                }
+            } else if (pressed.remove(i)) {
+                iplayer.getAbilities().tryClearAbility();
             }
         }
 
-        for (KeyBinding i : removed) {
-            removed.remove(i);
-            bindings.remove(i);
-            pressed.remove(i);
-        }
+        bindings.removeAll(removed);
+        pressed.removeAll(removed);
+        removed.clear();
     }
 }
diff --git a/src/main/java/com/minelittlepony/unicopia/client/MouseControl.java b/src/main/java/com/minelittlepony/unicopia/client/MouseControl.java
deleted file mode 100644
index c5da090d..00000000
--- a/src/main/java/com/minelittlepony/unicopia/client/MouseControl.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.minelittlepony.unicopia.client;
-
-import com.minelittlepony.unicopia.SpeciesList;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.Mouse;
-
-// TODO: we need mixins for this
-public class MouseControl extends Mouse {
-    public MouseControl(MinecraftClient client) {
-        super(client);
-    }
-
-    @Override
-    public void updateMouse() {
-        if (SpeciesList.instance().getPlayer(MinecraftClient.getInstance().player).getGravity().getGravitationConstant() < 0) {
-            //cursorDeltaX = -cursorDeltaX;
-            //cursorDeltaY = -cursorDeltaY;
-        }
-
-        super.updateMouse();
-    }
-}
diff --git a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaCoreClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaCoreClient.java
index 9cc4f64d..fa4a2bf2 100644
--- a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaCoreClient.java
+++ b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaCoreClient.java
@@ -1,5 +1,7 @@
 package com.minelittlepony.unicopia.client;
 
+import static com.minelittlepony.unicopia.EquinePredicates.MAGI;
+
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -10,10 +12,14 @@ import com.minelittlepony.unicopia.IKeyBindingHandler;
 import com.minelittlepony.unicopia.InteractionManager;
 import com.minelittlepony.unicopia.Race;
 import com.minelittlepony.unicopia.SpeciesList;
+import com.minelittlepony.unicopia.UBlocks;
 import com.minelittlepony.unicopia.UnicopiaCore;
 import com.minelittlepony.unicopia.ability.PowersRegistry;
+import com.minelittlepony.unicopia.block.IColourful;
 import com.minelittlepony.unicopia.client.render.DisguiseRenderer;
 import com.minelittlepony.unicopia.entity.player.IPlayer;
+import com.minelittlepony.unicopia.item.UItems;
+import com.minelittlepony.unicopia.magic.spell.SpellRegistry;
 import com.minelittlepony.unicopia.network.MsgRequestCapabilities;
 import com.minelittlepony.unicopia.util.MineLPConnector;
 import com.minelittlepony.unicopia.util.dummy.DummyClientPlayerEntity;
@@ -21,13 +27,19 @@ import com.mojang.authlib.GameProfile;
 import com.mojang.blaze3d.platform.GlStateManager;
 
 import net.fabricmc.api.ClientModInitializer;
+import net.fabricmc.fabric.api.client.render.ColorProviderRegistry;
 import net.fabricmc.fabric.api.event.client.ClientTickCallback;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.input.Input;
-import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.client.color.world.BiomeColors;
+import net.minecraft.client.color.world.GrassColors;
 import net.minecraft.client.world.ClientWorld;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.BlockItem;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.ExtendedBlockView;
 
 public class UnicopiaCoreClient extends InteractionManager implements ClientModInitializer {
 
@@ -134,6 +146,33 @@ public class UnicopiaCoreClient extends InteractionManager implements ClientModI
         ClientReadyCallback.EVENT.register(client -> {
             PowersRegistry.instance().getValues().forEach(keyboard::addKeybind);
         });
+
+        //BuildInTexturesBakery.getBuiltInTextures().add(new Identifier(Unicopia.MODID, "items/empty_slot_gem"));
+
+        ColorProviderRegistry.ITEM.register((stack, tint) -> {
+            return getLeavesColor(((BlockItem)stack.getItem()).getBlock().getDefaultState(), null, null, tint);
+        }, UItems.apple_leaves);
+        ColorProviderRegistry.BLOCK.register(UnicopiaCoreClient::getLeavesColor, UBlocks.apple_leaves);
+        ColorProviderRegistry.ITEM.register((stack, tint) -> {
+            if (MAGI.test(MinecraftClient.getInstance().player)) {
+                return SpellRegistry.instance().getSpellTintFromStack(stack);
+            }
+            return 0xFFFFFF;
+        }, UItems.spell, UItems.curse);
+    }
+
+    private static int getLeavesColor(BlockState state, @Nullable ExtendedBlockView world, @Nullable BlockPos pos, int tint) {
+        Block block = state.getBlock();
+
+        if (block instanceof IColourful) {
+            return ((IColourful)block).getCustomTint(state, tint);
+        }
+
+        if (world != null && pos != null) {
+            return BiomeColors.getGrassColor(world, pos);
+        }
+
+        return GrassColors.getColor(0.5D, 1);
     }
 
     private void tick(MinecraftClient client) {
@@ -150,19 +189,5 @@ public class UnicopiaCoreClient extends InteractionManager implements ClientModI
         }
 
         keyboard.onKeyInput();
-
-        if (player instanceof ClientPlayerEntity) {
-            ClientPlayerEntity sp = (ClientPlayerEntity)player;
-
-            Input movement = sp.input;
-
-            if (!(movement instanceof InversionAwareKeyboardInput)) {
-                sp.input = new InversionAwareKeyboardInput(client, movement);
-            }
-        }
-
-        if (!(client.mouse instanceof MouseControl)) {
-            client.mouse = new MouseControl(client);
-        }
     }
 }
diff --git a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaReduxClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaReduxClient.java
deleted file mode 100644
index 0d0db1c3..00000000
--- a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaReduxClient.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.minelittlepony.unicopia.client;
-
-import static com.minelittlepony.unicopia.EquinePredicates.MAGI;
-
-import javax.annotation.Nullable;
-
-import com.minelittlepony.unicopia.UBlocks;
-import com.minelittlepony.unicopia.block.IColourful;
-import com.minelittlepony.unicopia.item.UItems;
-import com.minelittlepony.unicopia.magic.spell.SpellRegistry;
-
-import net.fabricmc.api.ClientModInitializer;
-import net.fabricmc.fabric.api.client.render.ColorProviderRegistry;
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockState;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.color.world.BiomeColors;
-import net.minecraft.client.color.world.GrassColors;
-import net.minecraft.item.BlockItem;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.ExtendedBlockView;
-
-public class UnicopiaReduxClient implements ClientModInitializer {
-
-    @Override
-    public void onInitializeClient() {
-      //BuildInTexturesBakery.getBuiltInTextures().add(new Identifier(Unicopia.MODID, "items/empty_slot_gem"));
-
-        ColorProviderRegistry.ITEM.register((stack, tint) -> {
-            return getLeavesColor(((BlockItem)stack.getItem()).getBlock().getDefaultState(), null, null, tint);
-        }, UItems.apple_leaves);
-        ColorProviderRegistry.BLOCK.register(UnicopiaReduxClient::getLeavesColor, UBlocks.apple_leaves);
-        ColorProviderRegistry.ITEM.register((stack, tint) -> {
-            if (MAGI.test(MinecraftClient.getInstance().player)) {
-                return SpellRegistry.instance().getSpellTintFromStack(stack);
-            }
-            return 0xFFFFFF;
-        }, UItems.spell, UItems.curse);
-    }
-
-    private static int getLeavesColor(BlockState state, @Nullable ExtendedBlockView world, @Nullable BlockPos pos, int tint) {
-        Block block = state.getBlock();
-
-        if (block instanceof IColourful) {
-            return ((IColourful)block).getCustomTint(state, tint);
-        }
-
-        if (world != null && pos != null) {
-            return BiomeColors.getGrassColor(world, pos);
-        }
-
-        return GrassColors.getColor(0.5D, 1);
-    }
-}
diff --git a/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinCamera.java b/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinCamera.java
index c77b8a4b..62ba03a4 100644
--- a/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinCamera.java
+++ b/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinCamera.java
@@ -13,8 +13,7 @@ import net.minecraft.client.render.Camera;
 import net.minecraft.entity.player.PlayerEntity;
 
 @Mixin(Camera.class)
-public class MixinCamera {
-
+abstract class MixinCamera {
     @Shadow
     private float pitch;
     @Shadow
diff --git a/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinGameRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinGameRenderer.java
index 7584e0bf..22d7f57e 100644
--- a/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinGameRenderer.java
+++ b/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinGameRenderer.java
@@ -14,7 +14,6 @@ import net.minecraft.resource.SynchronousResourceReloadListener;
 
 @Mixin(GameRenderer.class)
 abstract class MixinGameRenderer implements AutoCloseable, SynchronousResourceReloadListener {
-
     @Inject(method = "getFov(Lnet/minecraft/client/render/Camera;FZ)D",
             at = @At("RETURN"),
             cancellable = true)
diff --git a/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinKeyboardInput.java b/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinKeyboardInput.java
new file mode 100644
index 00000000..0c82a53a
--- /dev/null
+++ b/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinKeyboardInput.java
@@ -0,0 +1,36 @@
+package com.minelittlepony.unicopia.client.mixin;
+
+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 com.minelittlepony.unicopia.SpeciesList;
+import com.minelittlepony.unicopia.entity.player.IPlayer;
+
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.input.Input;
+import net.minecraft.client.input.KeyboardInput;
+
+@Mixin(KeyboardInput.class)
+abstract class MixinKeyboardInput extends Input {
+    @Inject(method = "tick(ZZ)V", at = @At("RETURN"))
+    private void onTick(boolean one, boolean two, CallbackInfo info) {
+        IPlayer player = SpeciesList.instance().getPlayer(MinecraftClient.getInstance().player);
+
+        if (player.getGravity().getGravitationConstant() < 0) {
+            boolean tmp = pressingLeft;
+
+            pressingLeft = pressingRight;
+            pressingRight = tmp;
+
+            movementSideways = -movementSideways;
+
+            if (player.getOwner().abilities.flying) {
+                tmp = jumping;
+                jumping = sneaking;
+                sneaking = tmp;
+            }
+        }
+    }
+}
diff --git a/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinMouse.java b/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinMouse.java
new file mode 100644
index 00000000..385bf9e7
--- /dev/null
+++ b/src/main/java/com/minelittlepony/unicopia/client/mixin/MixinMouse.java
@@ -0,0 +1,31 @@
+package com.minelittlepony.unicopia.client.mixin;
+
+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 com.minelittlepony.unicopia.SpeciesList;
+
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.Mouse;
+
+@Mixin(Mouse.class)
+abstract class MixinMouse {
+    @Shadow
+    private @Final MinecraftClient client;
+    @Shadow
+    private double cursorDeltaX;
+    @Shadow
+    private double cursorDeltaY;
+
+    @Inject(method = "updateMouse()V", at = @At("HEAD"))
+    private void onUpdateMouse(CallbackInfo info) {
+        if (SpeciesList.instance().getPlayer(client.player).getGravity().getGravitationConstant() < 0) {
+            cursorDeltaX = -cursorDeltaX;
+            cursorDeltaY = -cursorDeltaY;
+        }
+    }
+}