ForgePatch/src/main/java/net/minecraftforge/client/event/InputEvent.java

326 lines
8.9 KiB
Java

/*
* Minecraft Forge
* Copyright (c) 2016-2020.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.client.event;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.client.util.InputMappings;
import net.minecraft.util.Hand;
import net.minecraftforge.eventbus.api.Cancelable;
import net.minecraftforge.eventbus.api.Event;
import org.lwjgl.glfw.GLFW;
public class InputEvent extends Event
{
/**
* A cancellable mouse event fired before key bindings are updated
*/
@Cancelable
public static class RawMouseEvent extends InputEvent
{
private final int button;
private final int action;
private final int mods;
public RawMouseEvent(int button, int action, int mods)
{
this.button = button;
this.action = action;
this.mods = mods;
}
/**
* The mouse button that triggered this event.
* https://www.glfw.org/docs/latest/group__buttons.html
*
* @see GLFW mouse constants starting with "GLFW_MOUSE_BUTTON_"
*/
public int getButton()
{
return this.button;
}
/**
* Integer representing the mouse button's action.
*
* @see GLFW#GLFW_PRESS
* @see GLFW#GLFW_RELEASE
*/
public int getAction()
{
return this.action;
}
/**
* Bit field representing the modifier keys pressed.
* https://www.glfw.org/docs/latest/group__mods.html
*
* @see GLFW#GLFW_MOD_SHIFT
* @see GLFW#GLFW_MOD_CONTROL
* @see GLFW#GLFW_MOD_ALT
* @see GLFW#GLFW_MOD_SUPER
*/
public int getMods()
{
return this.mods;
}
}
/**
* This event fires when a mouse input is detected.
*/
public static class MouseInputEvent extends InputEvent
{
private final int button;
private final int action;
private final int mods;
public MouseInputEvent(int button, int action, int mods)
{
this.button = button;
this.action = action;
this.mods = mods;
}
/**
* The mouse button that triggered this event.
* https://www.glfw.org/docs/latest/group__buttons.html
*
* @see GLFW mouse constants starting with "GLFW_MOUSE_BUTTON_"
*/
public int getButton()
{
return this.button;
}
/**
* Integer representing the mouse button's action.
*
* @see GLFW#GLFW_PRESS
* @see GLFW#GLFW_RELEASE
*/
public int getAction()
{
return this.action;
}
/**
* Bit field representing the modifier keys pressed.
* https://www.glfw.org/docs/latest/group__mods.html
*
* @see GLFW#GLFW_MOD_SHIFT
* @see GLFW#GLFW_MOD_CONTROL
* @see GLFW#GLFW_MOD_ALT
* @see GLFW#GLFW_MOD_SUPER
*/
public int getMods()
{
return this.mods;
}
}
/**
* This event fires when the mouse scroll wheel is used outside of a gui.
*/
@Cancelable
public static class MouseScrollEvent extends InputEvent
{
private final double scrollDelta;
private final double mouseX;
private final double mouseY;
private final boolean leftDown;
private final boolean middleDown;
private final boolean rightDown;
public MouseScrollEvent(double scrollDelta, boolean leftDown, boolean middleDown, boolean rightDown, double mouseX, double mouseY)
{
this.scrollDelta = scrollDelta;
this.leftDown = leftDown;
this.middleDown = middleDown;
this.rightDown = rightDown;
this.mouseX = mouseX;
this.mouseY = mouseY;
}
public double getScrollDelta()
{
return this.scrollDelta;
}
public boolean isLeftDown()
{
return this.leftDown;
}
public boolean isRightDown()
{
return this.rightDown;
}
public boolean isMiddleDown()
{
return this.middleDown;
}
public double getMouseX()
{
return this.mouseX;
}
public double getMouseY()
{
return this.mouseY;
}
}
/**
* This event fires when a keyboard input is detected.
*/
public static class KeyInputEvent extends InputEvent
{
private final int key;
private final int scanCode;
private final int action;
private final int modifiers;
public KeyInputEvent(int key, int scanCode, int action, int modifiers)
{
this.key = key;
this.scanCode = scanCode;
this.action = action;
this.modifiers = modifiers;
}
/**
* The keyboard key that triggered this event.
* https://www.glfw.org/docs/latest/group__keys.html
*
* @see GLFW key constants starting with "GLFW_KEY_"
*/
public int getKey()
{
return this.key;
}
/**
* Platform-specific scan code.
* Used for {@link InputMappings#getInputByCode(int, int)}
*
* The scan code is unique for every key, regardless of whether it has a key code.
* Scan codes are platform-specific but consistent over time, so keys will have different scan codes depending
* on the platform but they are safe to save to disk as custom key bindings.
*/
public int getScanCode()
{
return this.scanCode;
}
/**
* Integer representing the key's action.
*
* @see GLFW#GLFW_PRESS
* @see GLFW#GLFW_RELEASE
* @see GLFW#GLFW_REPEAT
*/
public int getAction()
{
return this.action;
}
/**
* Bit field representing the modifier keys pressed.
* https://www.glfw.org/docs/latest/group__mods.html
*
* @see GLFW#GLFW_MOD_SHIFT
* @see GLFW#GLFW_MOD_CONTROL
* @see GLFW#GLFW_MOD_ALT
* @see GLFW#GLFW_MOD_SUPER
*/
public int getModifiers()
{
return this.modifiers;
}
}
/**
* This event fires when one of the keybindings that by default involves clicking the mouse buttons
* is triggered.
*
* These key bindings are use item, pick block and attack keybindings. (right, middle and left mouse click)
* In the case that these key bindings are re-bound to a keyboard key the event will still be fired as normal.
*/
@Cancelable
public static class ClickInputEvent extends InputEvent
{
private final int button;
private final KeyBinding keyBinding;
private final Hand hand;
private boolean handSwing = true;
public ClickInputEvent(int button, KeyBinding keyBinding, Hand hand)
{
this.button = button;
this.keyBinding = keyBinding;
this.hand = hand;
}
/**
* Set to false to disable the hand swing animation.
* Has no effect if this is a pick block input.
*/
public void setSwingHand(boolean value)
{
handSwing = value;
}
public boolean shouldSwingHand()
{
return handSwing;
}
/**
* The hand which is causing the event to get triggered.
* The event will be called for both hands if this is a use item input regardless
* of if either gets canceled.
* Will always be MAIN_HAND if this is an attack or pick block input.
*/
public Hand getHand()
{
return hand;
}
public boolean isAttack()
{
return button == 0;
}
public boolean isUseItem()
{
return button == 1;
}
public boolean isPickBlock()
{
return button == 2;
}
public KeyBinding getKeyBinding()
{
return keyBinding;
}
}
}