mirror of
http://git.eaglercraft.rip/eaglercraft/eaglercraft-1.8.git
synced 2025-04-29 01:51:58 -05:00
228 lines
5.7 KiB
Java
228 lines
5.7 KiB
Java
package net.lax1dude.eaglercraft.v1_8;
|
|
|
|
import net.lax1dude.eaglercraft.v1_8.touch_gui.TouchControls;
|
|
import net.minecraft.client.Minecraft;
|
|
|
|
/**
|
|
* Copyright (c) 2024 lax1dude, ayunami2000. All Rights Reserved.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
*/
|
|
public class PointerInputAbstraction {
|
|
|
|
protected static Minecraft mc;
|
|
protected static int oldMX = -1;
|
|
protected static int oldMY = -1;
|
|
protected static int oldTX = -1;
|
|
protected static int oldTY = -1;
|
|
protected static int dragStartX = -1;
|
|
protected static int dragStartY = -1;
|
|
protected static int dragStepStartX = -1;
|
|
protected static int dragStepStartY = -1;
|
|
protected static int dragUID = -1;
|
|
|
|
protected static int cursorX = -1;
|
|
protected static int cursorY = -1;
|
|
protected static int cursorDX = 0;
|
|
protected static int cursorDY = 0;
|
|
protected static boolean touchingScreen = false;
|
|
protected static boolean touchingScreenNotButton = false;
|
|
protected static boolean draggingNotTouching = false;
|
|
protected static boolean touchMode = false;
|
|
|
|
public static void init(Minecraft mcIn) {
|
|
mc = mcIn;
|
|
oldMX = -1;
|
|
oldMY = -1;
|
|
oldTX = -1;
|
|
oldTY = -1;
|
|
dragStartX = -1;
|
|
dragStartY = -1;
|
|
dragStepStartX = -1;
|
|
dragStepStartY = -1;
|
|
dragUID = -1;
|
|
cursorX = -1;
|
|
cursorY = -1;
|
|
cursorDX = 0;
|
|
cursorDY = 0;
|
|
touchingScreen = false;
|
|
touchingScreenNotButton = false;
|
|
draggingNotTouching = false;
|
|
touchMode = !mcIn.mouseGrabSupported;
|
|
}
|
|
|
|
public static void runGameLoop() {
|
|
if(touchMode) {
|
|
runTouchUpdate();
|
|
}else {
|
|
oldTX = -1;
|
|
oldTY = -1;
|
|
cursorX = oldMX = Mouse.getX();
|
|
cursorY = oldMY = Mouse.getY();
|
|
cursorDX += Mouse.getDX();
|
|
cursorDY += Mouse.getDY();
|
|
}
|
|
}
|
|
|
|
private static void runTouchUpdate() {
|
|
int tc = Touch.touchPointCount();
|
|
if (tc > 0) {
|
|
TouchControls.update(true);
|
|
touchingScreen = true;
|
|
for(int i = 0; i < tc; ++i) {
|
|
int uid = Touch.touchPointUID(i);
|
|
if(TouchControls.touchControls.containsKey(uid)) {
|
|
continue;
|
|
}
|
|
int tx = Touch.touchPointX(i);
|
|
int ty = Touch.touchPointY(i);
|
|
if(TouchControls.overlappingControl(tx, ty) != null) {
|
|
continue;
|
|
}
|
|
if(mc.currentScreen == null && mc.ingameGUI.isTouchOverlapEagler(uid, tx, ty)) {
|
|
continue;
|
|
}
|
|
cursorX = oldTX = tx;
|
|
cursorY = oldTY = ty;
|
|
oldMX = Mouse.getX();
|
|
oldMY = Mouse.getY();
|
|
touchingScreenNotButton = true;
|
|
runTouchDeltaUpdate(uid);
|
|
return;
|
|
}
|
|
touchingScreenNotButton = false;
|
|
} else {
|
|
TouchControls.update(false);
|
|
touchingScreen = false;
|
|
touchingScreenNotButton = false;
|
|
dragStepStartX = -1;
|
|
dragStepStartY = -1;
|
|
dragStartX = -1;
|
|
dragStartY = -1;
|
|
dragUID = -1;
|
|
final int tmp = Mouse.getX();
|
|
final int tmp2 = Mouse.getY();
|
|
if(oldTX == -1 || oldTY == -1) {
|
|
cursorX = oldMX = tmp;
|
|
cursorY = oldMY = tmp2;
|
|
cursorDX += Mouse.getDX();
|
|
cursorDY += Mouse.getDY();
|
|
return;
|
|
}
|
|
if (oldMX == -1 || oldMY == -1) {
|
|
oldMX = tmp;
|
|
oldMY = tmp2;
|
|
}
|
|
if (oldMX == tmp && oldMY == tmp2) {
|
|
cursorX = oldTX;
|
|
cursorY = oldTY;
|
|
}else {
|
|
cursorX = oldMX = tmp;
|
|
cursorY = oldMY = tmp2;
|
|
cursorDX += Mouse.getDX();
|
|
cursorDY += Mouse.getDY();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void runTouchDeltaUpdate(int uid) {
|
|
if(uid != dragUID) {
|
|
dragStartX = oldTX;
|
|
dragStartY = oldTY;
|
|
dragStepStartX = -1;
|
|
dragStepStartY = -1;
|
|
dragUID = uid;
|
|
draggingNotTouching = false;
|
|
return;
|
|
}
|
|
if(dragStepStartX != -1) {
|
|
cursorDX += oldTX - dragStepStartX;
|
|
}
|
|
dragStepStartX = oldTX;
|
|
if(dragStepStartY != -1) {
|
|
cursorDY += oldTY - dragStepStartY;
|
|
}
|
|
dragStepStartY = oldTY;
|
|
if(dragStartX != -1 && dragStartY != -1) {
|
|
int dx = oldTX - dragStartX;
|
|
int dy = oldTY - dragStartY;
|
|
int len = dx * dx + dy * dy;
|
|
int dm = Math.max((int)(6 * Display.getDPI()), 2);
|
|
if(len > dm * dm) {
|
|
draggingNotTouching = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static boolean isTouchMode() {
|
|
return touchMode;
|
|
}
|
|
|
|
public static boolean isTouchingScreen() {
|
|
return touchingScreen;
|
|
}
|
|
|
|
public static boolean isTouchingScreenNotButton() {
|
|
return touchingScreenNotButton;
|
|
}
|
|
|
|
public static boolean isDraggingNotTouching() {
|
|
return draggingNotTouching;
|
|
}
|
|
|
|
public static void enterTouchModeHook() {
|
|
if(!touchMode) {
|
|
touchMode = true;
|
|
if(mc.mouseGrabSupported) {
|
|
mc.mouseHelper.ungrabMouseCursor();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void enterMouseModeHook() {
|
|
if(touchMode) {
|
|
touchMode = false;
|
|
touchingScreen = false;
|
|
touchingScreenNotButton = false;
|
|
if(mc.inGameHasFocus && mc.mouseGrabSupported) {
|
|
mc.mouseHelper.grabMouseCursor();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static int getVCursorX() {
|
|
return cursorX;
|
|
}
|
|
|
|
public static int getVCursorY() {
|
|
return cursorY;
|
|
}
|
|
|
|
public static int getVCursorDX() {
|
|
int tmp = cursorDX;
|
|
cursorDX = 0;
|
|
return tmp;
|
|
}
|
|
|
|
public static int getVCursorDY() {
|
|
int tmp = cursorDY;
|
|
cursorDY = 0;
|
|
return tmp;
|
|
}
|
|
|
|
public static boolean getVCursorButtonDown(int bt) {
|
|
return (touchingScreenNotButton && bt == 0) || Mouse.isButtonDown(bt);
|
|
}
|
|
|
|
}
|