From cbf3fffb340fbaf9cd805a1b40b42ce05663288d Mon Sep 17 00:00:00 2001 From: Yves Date: Mon, 14 Jul 2025 07:28:21 +0200 Subject: [PATCH 1/2] Rewrite mod for 1.8.9 compatibility and clean up project - Complete rewrite from Mixin-based to Forge event system - Add comprehensive JavaDoc documentation - Implement proper CTRL+Q functionality for hotbar and inventory - Fix version specification crash (removed invalid range syntax) - Update build system to Gradle 2.14 for 1.8.9 compatibility - Remove unnecessary dependencies and mixin framework - Streamline README with focus on macOS CMD+Q issue --- LICENSE | 21 -- README.md | 42 ++- build.gradle | 96 ++---- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 56177 -> 61608 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 292 ++++++++++------- gradlew.bat | 176 +++++----- settings.gradle | 34 +- .../java/me/polishkrowa/ctrlq/CtrlQMod.java | 301 ++++++++++++++++++ .../me/polishkrowa/ctrlqforge/CtrlqForge.java | 13 - .../polishkrowa/ctrlqforge/core/CoreMod.java | 42 --- .../ctrlqforge/mixin/MixinHandledScreen.java | 32 -- .../mixin/MixinMinecraftClient.java | 17 - src/main/resources/LICENSE.txt | 21 -- src/main/resources/ctrlq-forge.mixins.json | 9 - src/main/resources/icon.png | Bin 14791 -> 0 bytes src/main/resources/mcmod.info | 27 +- src/main/resources/pack.mcmeta | 6 - 19 files changed, 652 insertions(+), 482 deletions(-) delete mode 100644 LICENSE create mode 100644 src/main/java/me/polishkrowa/ctrlq/CtrlQMod.java delete mode 100644 src/main/java/me/polishkrowa/ctrlqforge/CtrlqForge.java delete mode 100644 src/main/java/me/polishkrowa/ctrlqforge/core/CoreMod.java delete mode 100644 src/main/java/me/polishkrowa/ctrlqforge/mixin/MixinHandledScreen.java delete mode 100644 src/main/java/me/polishkrowa/ctrlqforge/mixin/MixinMinecraftClient.java delete mode 100644 src/main/resources/LICENSE.txt delete mode 100644 src/main/resources/ctrlq-forge.mixins.json delete mode 100644 src/main/resources/icon.png delete mode 100644 src/main/resources/pack.mcmeta diff --git a/LICENSE b/LICENSE deleted file mode 100644 index c6e899e..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index a85295e..eea0a17 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,41 @@ # Ctrl-Q -## DOESN'T WORK!! (1.8) -This **Forge** mod forces CTRL-Q for dropping a stack of items (Helpful for macos users) -CurseForge mod page: https://www.curseforge.com/minecraft/mc-mods/ctrl-q +Client-side mod for Minecraft 1.8.9 Forge that enables CTRL+Q for dropping entire item stacks. Primarily designed for macOS users where CMD+Q quits the application instead of dropping items. -(Basically, it forces the "ctrl" key to be used when dropping a stack of item instead of "cmd" on MacOS) +## Installation -PS: The mod was made and tested in 1.16.5. I think there'll be an error if you go under these versions, so don't do it. +1. Install Minecraft Forge 1.8.9 +2. Place the mod JAR in your `mods` folder +3. Launch Minecraft + +## Usage + +Press CTRL+Q to drop entire item stacks: +- In hotbar (when no GUI is open) +- In inventory containers (chests, furnaces, etc.) + +The mod respects your configured drop key binding. + +## Technical Implementation + +- Uses Forge event system (`InputEvent.KeyInputEvent`, `GuiScreenEvent.KeyboardInputEvent`) +- Implements proper networking via `PlayerController.windowClick()` +- Reflection-based slot access for GUI containers +- Compatible with vanilla servers and anti-cheat plugins + +## Limitations + +- Creative Mode inventory is not supported +- Requires exactly Minecraft 1.8.9 with Forge + +## Building + +```bash +JAVA_HOME=/path/to/java8 ./gradlew build +``` + +Requires Java 8 for compatibility with Minecraft 1.8.9. + +## License + +MIT License \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9129765..8a33fac 100644 --- a/build.gradle +++ b/build.gradle @@ -1,111 +1,59 @@ buildscript { repositories { - maven { url 'https://jitpack.io' } - maven { url 'https://repo.spongepowered.org/maven' } - maven { url 'https://maven.minecraftforge.net/' } + jcenter() + maven { url = 'https://files.minecraftforge.net/maven' } + maven { url = 'https://repo.spongepowered.org/maven' } } - dependencies { - classpath 'com.github.asbyth:ForgeGradle:8708bf3e01' - classpath 'com.github.xcfrg:MixinGradle:0.6-SNAPSHOT' - classpath 'com.github.jengelman.gradle.plugins:shadow:6.1.0' + classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT' + classpath 'org.spongepowered:mixingradle:0.6-SNAPSHOT' } } -apply plugin: 'java' apply plugin: 'net.minecraftforge.gradle.forge' -apply plugin: 'org.spongepowered.mixin' -apply plugin: 'com.github.johnrengelman.shadow' -version = "1.8" -group = "me.polishkrowa" -archivesBaseName = "ctrlq-forge-mc1.8" -String modid = "ctrlq-forge" +version = "1.9.3-1.8.9" +group = "me.polishkrowa.ctrlq" +archivesBaseName = "ctrlq-1.8.9" -sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8 -compileJava.options.encoding = 'UTF-8' +sourceCompatibility = targetCompatibility = '1.8' +compileJava { + sourceCompatibility = targetCompatibility = '1.8' +} minecraft { version = "1.8.9-11.15.1.2318-1.8.9" runDir = "run" mappings = "stable_22" + makeObfSourceJar = false + + // Optimized for Minecraft 1.8.9 with Forge 11.15.1.2318 + replaceIn "me/polishkrowa/ctrlq/CtrlQMod.java" + replace "@VERSION@", project.version } -configurations { - include - implementation.extendsFrom(include) -} repositories { - maven { url 'https://jitpack.io' } - maven { url 'https://repo.spongepowered.org/repository/maven-public/' } - maven { url 'https://maven.minecraftforge.net/' } -} - -dependencies { - include 'com.github.TheNullicorn:Nedit:2.1.0' - - include("org.spongepowered:mixin:0.7.11-SNAPSHOT") { - exclude module: "guava" - exclude module: "commons-io" - exclude module: "gson" - exclude module: "launchwrapper" - } - annotationProcessor "org.spongepowered:mixin:0.7.11-SNAPSHOT" -} - -reobf { - shadowJar { - classpath = sourceSets.main.compileClasspath + maven { + name = 'spongepowered-repo' + url = 'https://repo.spongepowered.org/maven/' } } -mixin { - add sourceSets.main, "ctrlq-forge.mixins.refmap.json" -} - - -shadowJar { - archiveFileName = jar.archiveFileName - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - configurations = [project.configurations.include] -} - -jar { - manifest.attributes( - "TweakClass": "org.spongepowered.asm.launch.MixinTweaker", - "MixinConfigs": "ctrlq-forge.mixins.json", - "FMLCorePluginContainsFMLMod": true, - "ForceLoadAsMod": true - ) - - enabled = false +dependencies { } -tasks.reobfJar.dependsOn(tasks.shadowJar) - processResources { inputs.property "version", project.version inputs.property "mcversion", project.minecraft.version from(sourceSets.main.resources.srcDirs) { include 'mcmod.info' - expand 'version': project.version, 'mcversion': project.minecraft.version } from(sourceSets.main.resources.srcDirs) { exclude 'mcmod.info' } -} - -task moveResources { - doLast { - ant.move file: "${buildDir}/resources/main", - todir: "${buildDir}/classes/java" - } -} - -moveResources.dependsOn processResources -classes.dependsOn moveResources \ No newline at end of file +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 29b2ac4..f237dcf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false +org.gradle.daemon=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 94336fcae912db8a11d55634156fa011f4686124..ccebba7710deaf9f98673a68957ea02138b60d0a 100644 GIT binary patch delta 53251 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 I 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 P?*eZ^Xb!_d3;o}}{R#tI delta 48052 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 442d913..51ef98f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index cccdd3d..79a61d4 100755 --- a/gradlew +++ b/gradlew @@ -1,78 +1,129 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -89,84 +140,105 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,84 +1,92 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle index dcd9981..43a7bf7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,33 +1 @@ -pluginManagement { - repositories { - mavenCentral() - gradlePluginPortal() - - // Add the Forge Repository (ForgeGradle fetches most of its stuff from here) - maven { - name = "Forge" - url = "https://maven.minecraftforge.net" - } - - // Add the Jitpack Repository (We fetch ForgeGradle from this) - maven { - name = "Jitpack" - url = "https://jitpack.io/" - } - } - resolutionStrategy { - eachPlugin { - // If the "net.minecraftforge.gradle.forge" plugin is requested we redirect it to asbyth's ForgeGradle fork - switch (requested.id.id) { - case 'net.minecraftforge.gradle.forge': - useModule "com.github.asbyth:ForgeGradle:${requested.version}" - break - case 'org.spongepowered.mixin': - useModule "com.github.xcfrg:MixinGradle:${requested.version}" - break - } - } - } -} - -rootProject.name = 'ctrlq-forge-mc1.8' +rootProject.name = 'ctrlq-1.8.x' \ No newline at end of file diff --git a/src/main/java/me/polishkrowa/ctrlq/CtrlQMod.java b/src/main/java/me/polishkrowa/ctrlq/CtrlQMod.java new file mode 100644 index 0000000..db65bff --- /dev/null +++ b/src/main/java/me/polishkrowa/ctrlq/CtrlQMod.java @@ -0,0 +1,301 @@ +package me.polishkrowa.ctrlq; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.InputEvent; +import org.apache.logging.log4j.Logger; +import org.lwjgl.input.Keyboard; + +/** + * Ctrl-Q Mod for Minecraft 1.8.9 + * + * This mod enables CTRL+Q functionality for dropping entire item stacks, + * addressing the common issue on macOS where CMD+Q quits the application + * instead of dropping items. + * + * Key Features: + * - Enables CTRL+Q to drop entire item stacks in both hotbar and inventory + * - Client-side only implementation - no server installation required + * - Uses proper Minecraft networking for multiplayer compatibility + * - Anti-cheat friendly implementation using PlayerController + * - Comprehensive error handling and logging + * - Does not interfere with Creative Mode inventory (intentional limitation) + * + * Technical Implementation: + * - Uses Forge's event system for key input detection + * - Reflection-based access to GUI slot information for inventory handling + * - Direct hotbar slot manipulation for non-GUI interactions + * - Proper network packet handling through PlayerController.windowClick() + * + * @author polishkrowa + * @version 1.9.3-1.8.9 + * @since 1.8.9 + */ +@Mod(modid = CtrlQMod.MODID, version = CtrlQMod.VERSION, clientSideOnly = true, acceptedMinecraftVersions = "1.8.9") +public class CtrlQMod { + /** Mod identifier used by Forge */ + public static final String MODID = "ctrlq"; + + /** Current mod version */ + public static final String VERSION = "1.9.3-1.8.9"; + + /** Logger instance for debug and info messages */ + private static Logger logger; + + /** + * Pre-initialization phase of the mod loading process. + * This is where we register our event handlers with the Forge event bus. + * + * @param event The pre-initialization event provided by Forge + */ + @Mod.EventHandler + public void preInit(FMLPreInitializationEvent event) { + logger = event.getModLog(); + MinecraftForge.EVENT_BUS.register(this); + logger.info("Ctrl-Q mod successfully initialized for Minecraft 1.8.9"); + } + + /** + * Main initialization phase of the mod loading process. + * Currently unused as all initialization happens in preInit. + * + * @param event The initialization event provided by Forge + */ + @Mod.EventHandler + public void init(FMLInitializationEvent event) { + // No additional initialization required for this mod + } + + /** + * Handles CTRL+Q key combinations when the player is in-game with no GUI open. + * This method is triggered by Forge's InputEvent system whenever a key is pressed + * while the player is interacting with the hotbar. + * + * The method checks for: + * 1. No GUI is currently open (mc.currentScreen == null) + * 2. Player exists and is valid + * 3. Drop key is currently being pressed + * 4. CTRL key is being held down + * + * When all conditions are met, it delegates to handleHotbarCtrlQ() for actual processing. + * + * @param event The input event triggered by Forge when keys are pressed + */ + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onKeyInput(InputEvent.KeyInputEvent event) { + Minecraft mc = Minecraft.getMinecraft(); + + // Only process hotbar interactions when no GUI is displayed + if (mc.currentScreen == null && mc.thePlayer != null) { + // Check if the configured drop key is currently being pressed + // Keyboard.getEventKeyState() ensures we only trigger on key press, not release + if (mc.gameSettings.keyBindDrop.isKeyDown() && Keyboard.getEventKeyState()) { + boolean isCtrlPressed = isCtrlKeyPressed(); + + if (isCtrlPressed) { + logger.info("CTRL+Drop key combination detected in hotbar context"); + handleHotbarCtrlQ(mc); + } + } + } + } + + /** + * Handles CTRL+Q key combinations when the player has an inventory GUI open. + * This method is triggered by Forge's GUI event system and processes key inputs + * specifically for container interfaces like chests, player inventory, etc. + * + * The method performs several checks: + * 1. Excludes Creative Mode inventory (not supported due to complexity) + * 2. Verifies the GUI is a container-type interface + * 3. Matches the pressed key against the configured drop key + * 4. Confirms CTRL is being held down + * + * When all conditions are met, it delegates to handleInventoryCtrlQ() and cancels + * the event to prevent normal drop behavior (single item instead of stack). + * + * @param event The GUI keyboard event triggered when keys are pressed in inventory + */ + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onGuiKeyInput(GuiScreenEvent.KeyboardInputEvent.Pre event) { + // Log GUI interactions for debugging purposes + logger.debug("GUI keyboard event fired for: " + event.gui.getClass().getSimpleName()); + + // Creative Mode inventory is not supported due to its complex item handling + if (event.gui.getClass().getSimpleName().equals("GuiContainerCreative")) { + logger.debug("Creative Mode inventory detected - skipping (not supported)"); + return; + } + + // Only process events for container-based GUIs (inventories, chests, furnaces, etc.) + if (event.gui instanceof GuiContainer) { + Minecraft mc = Minecraft.getMinecraft(); + + // Get the key code that was pressed and compare with drop key binding + int pressedKey = Keyboard.getEventKey(); + int configuredDropKey = mc.gameSettings.keyBindDrop.getKeyCode(); + + logger.debug("Key pressed: " + pressedKey + ", configured drop key: " + configuredDropKey); + + // Check if the pressed key matches the player's drop key binding + if (pressedKey == configuredDropKey && Keyboard.getEventKeyState()) { + boolean isCtrlPressed = isCtrlKeyPressed(); + logger.debug("Drop key detected, CTRL pressed: " + isCtrlPressed); + + if (isCtrlPressed && mc.thePlayer != null) { + logger.info("CTRL+Drop key combination detected in inventory context"); + handleInventoryCtrlQ((GuiContainer) event.gui); + // Cancel the event to prevent normal single-item drop behavior + event.setCanceled(true); + } + } + } + } + + /** + * Utility method to check if either CTRL key is currently being pressed. + * Checks both left and right CTRL keys to maximize compatibility across + * different keyboard layouts and user preferences. + * + * This method uses LWJGL's direct keyboard state checking rather than + * Minecraft's key binding system to ensure reliable detection regardless + * of user configuration. + * + * @return true if either left or right CTRL key is currently pressed + */ + private boolean isCtrlKeyPressed() { + return Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); + } + + /** + * Handles the actual CTRL+Q functionality for inventory container GUIs. + * This method uses Java reflection to access the currently hovered slot + * and then uses Minecraft's networking system to drop the entire stack. + * + * The process involves: + * 1. Using reflection to access the private 'theSlot' field from GuiContainer + * 2. Checking if a slot is currently being hovered and contains items + * 3. Validating the slot number is within container bounds + * 4. Using PlayerController.windowClick() with DROP mode and CTRL modifier + * 5. Comprehensive error handling for edge cases + * + * The reflection approach is necessary because Minecraft 1.8.9 doesn't provide + * public API access to the currently hovered slot information. + * + * @param gui The inventory container GUI where the CTRL+Q was triggered + */ + private void handleInventoryCtrlQ(GuiContainer gui) { + try { + // Access the currently hovered slot using reflection + // Try both deobfuscated and obfuscated field names for maximum compatibility + java.lang.reflect.Field theSlotField; + try { + // Try deobfuscated name first (development environment) + theSlotField = GuiContainer.class.getDeclaredField("theSlot"); + } catch (NoSuchFieldException e) { + // Fall back to obfuscated name (production environment) + theSlotField = GuiContainer.class.getDeclaredField("field_147006_u"); + } + + // Make the private field accessible + theSlotField.setAccessible(true); + Object theSlot = theSlotField.get(gui); + + if (theSlot != null) { + Slot slot = (Slot) theSlot; + + // Verify the slot contains items before attempting to drop + if (slot.getHasStack()) { + logger.info("Attempting to drop entire stack from slot " + slot.slotNumber + + " in " + gui.getClass().getSimpleName()); + + // Validate slot number is within container bounds to prevent errors + if (slot.slotNumber >= 0 && slot.slotNumber < gui.inventorySlots.inventorySlots.size()) { + Minecraft mc = Minecraft.getMinecraft(); + + // Use PlayerController for proper network handling and anti-cheat compatibility + // Parameters: windowId, slotId, mouseButton (1=CTRL), clickType (4=DROP), player + mc.playerController.windowClick( + gui.inventorySlots.windowId, // Container window ID + slot.slotNumber, // Specific slot to interact with + 1, // Mouse button 1 with CTRL modifier + 4, // Click type 4 = DROP mode + mc.thePlayer // Player performing the action + ); + + logger.info("Successfully executed stack drop via PlayerController"); + } else { + logger.warn("Invalid slot number " + slot.slotNumber + + " for container with " + gui.inventorySlots.inventorySlots.size() + " slots"); + } + } else { + logger.debug("No item stack present in hovered slot"); + } + } else { + logger.debug("No slot currently being hovered"); + } + } catch (Exception e) { + logger.error("Failed to handle inventory CTRL+Q operation: " + e.getMessage(), e); + } + } + + /** + * Handles the actual CTRL+Q functionality for hotbar interactions. + * This method operates when no GUI is open and the player is holding + * items in their hotbar. It drops the entire stack from the currently + * selected hotbar slot. + * + * The process involves: + * 1. Getting the currently selected hotbar slot (0-8) + * 2. Checking if that slot contains any items + * 3. Converting hotbar slot to window slot ID (36-44 for hotbar slots 0-8) + * 4. Using PlayerController.windowClick() with proper parameters + * 5. Comprehensive error handling and logging + * + * The window slot ID conversion is necessary because Minecraft's networking + * system uses a different slot numbering scheme than the player inventory. + * + * @param mc The Minecraft client instance + */ + private void handleHotbarCtrlQ(Minecraft mc) { + try { + // Get the currently selected hotbar slot (0-8) + int selectedSlot = mc.thePlayer.inventory.currentItem; + ItemStack heldStack = mc.thePlayer.inventory.getStackInSlot(selectedSlot); + + if (heldStack != null) { + logger.info("Attempting to drop stack of " + heldStack.stackSize + + " items from hotbar slot " + selectedSlot); + + // Convert hotbar slot (0-8) to window slot ID (36-44) + // This is required because Minecraft's network protocol uses different numbering + int windowSlotId = 36 + selectedSlot; + + // Use PlayerController for proper network handling and anti-cheat compatibility + // Parameters: windowId (0 for player inventory), slotId, mouseButton (1=CTRL), clickType (4=DROP), player + mc.playerController.windowClick( + 0, // Window ID 0 = player inventory + windowSlotId, // Converted slot ID for networking + 1, // Mouse button 1 with CTRL modifier + 4, // Click type 4 = DROP mode + mc.thePlayer // Player performing the action + ); + + logger.info("Successfully executed hotbar stack drop via PlayerController"); + } else { + logger.debug("No item stack present in current hotbar slot"); + } + } catch (Exception e) { + logger.error("Failed to handle hotbar CTRL+Q operation: " + e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/polishkrowa/ctrlqforge/CtrlqForge.java b/src/main/java/me/polishkrowa/ctrlqforge/CtrlqForge.java deleted file mode 100644 index 790de6e..0000000 --- a/src/main/java/me/polishkrowa/ctrlqforge/CtrlqForge.java +++ /dev/null @@ -1,13 +0,0 @@ -package me.polishkrowa.ctrlqforge; - -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; - -@Mod(modid = "ctrlq-forge",clientSideOnly = true) -public class CtrlqForge { - - @Mod.EventHandler - public void onPreInit(FMLPreInitializationEvent event) { -// System.out.println("Hello world!"); - } -} diff --git a/src/main/java/me/polishkrowa/ctrlqforge/core/CoreMod.java b/src/main/java/me/polishkrowa/ctrlqforge/core/CoreMod.java deleted file mode 100644 index dde6f66..0000000 --- a/src/main/java/me/polishkrowa/ctrlqforge/core/CoreMod.java +++ /dev/null @@ -1,42 +0,0 @@ -package me.polishkrowa.ctrlqforge.core; - -import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; -import org.spongepowered.asm.launch.MixinBootstrap; -import org.spongepowered.asm.mixin.MixinEnvironment; -import org.spongepowered.asm.mixin.Mixins; - -import javax.annotation.Nullable; -import java.util.Map; - -@IFMLLoadingPlugin.MCVersion("1.8.9") -@IFMLLoadingPlugin.Name("Ctrl-Q Forge") -public class CoreMod implements IFMLLoadingPlugin { - - @Override - public String[] getASMTransformerClass() { - return new String[0]; - } - - @Override - public String getModContainerClass() { - return null; - } - - @Nullable - @Override - public String getSetupClass() { - return null; - } - - @Override - public void injectData(Map data) { - MixinBootstrap.init(); - Mixins.addConfiguration("ctrlq-forge.mixins.json"); - MixinEnvironment.getDefaultEnvironment().setObfuscationContext("searge"); - } - - @Override - public String getAccessTransformerClass() { - return null; - } -} \ No newline at end of file diff --git a/src/main/java/me/polishkrowa/ctrlqforge/mixin/MixinHandledScreen.java b/src/main/java/me/polishkrowa/ctrlqforge/mixin/MixinHandledScreen.java deleted file mode 100644 index 335fb0b..0000000 --- a/src/main/java/me/polishkrowa/ctrlqforge/mixin/MixinHandledScreen.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.polishkrowa.ctrlqforge.mixin; - -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.inventory.Container; -import org.lwjgl.input.Keyboard; -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.ModifyArgs; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; - -@Mixin(GuiContainer.class) -public class MixinHandledScreen extends GuiScreen { - - @ModifyArgs(method = "keyTyped", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/inventory/GuiContainer;handleMouseClick(Lnet/minecraft/inventory/Slot;III)V",ordinal = 1)) - private void injected(Args args) { - args.set(2, Keyboard.isKeyDown(29) || Keyboard.isKeyDown(157)? 1 : 0); - } - - @Inject(method = "", at = @At(value = "TAIL")) - private void injectedd(Container inventorySlotsIn, CallbackInfo ci) { - Keyboard.enableRepeatEvents(true); - } - - - @Inject(method = "onGuiClosed()V", at = @At(value = "TAIL")) - private void injecteddd(CallbackInfo ci) { - Keyboard.enableRepeatEvents(false); - } -} diff --git a/src/main/java/me/polishkrowa/ctrlqforge/mixin/MixinMinecraftClient.java b/src/main/java/me/polishkrowa/ctrlqforge/mixin/MixinMinecraftClient.java deleted file mode 100644 index 93737a0..0000000 --- a/src/main/java/me/polishkrowa/ctrlqforge/mixin/MixinMinecraftClient.java +++ /dev/null @@ -1,17 +0,0 @@ -package me.polishkrowa.ctrlqforge.mixin; - -import net.minecraft.client.Minecraft; -import org.lwjgl.input.Keyboard; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArgs; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; - -@Mixin(Minecraft.class) -public class MixinMinecraftClient { - - @ModifyArgs(method = "runTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/entity/EntityPlayerSP;dropOneItem(Z)Lnet/minecraft/entity/item/EntityItem;")) - private void injected(Args args) { - args.set(0, Keyboard.isKeyDown(29) || Keyboard.isKeyDown(157)); - } -} diff --git a/src/main/resources/LICENSE.txt b/src/main/resources/LICENSE.txt deleted file mode 100644 index c6e899e..0000000 --- a/src/main/resources/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/src/main/resources/ctrlq-forge.mixins.json b/src/main/resources/ctrlq-forge.mixins.json deleted file mode 100644 index e1829a9..0000000 --- a/src/main/resources/ctrlq-forge.mixins.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "required": true, - "package": "me.polishkrowa.ctrlqforge.mixin", - "compatibilityLevel": "JAVA_8", - "refmap": "ctrlq-forge.refmap.json", - "mixins": [], - "client": ["MixinMinecraftClient","MixinHandledScreen"], - "minVersion": "0.7" -} \ No newline at end of file diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png deleted file mode 100644 index c1f44da45b08231f2be976fcb264cbc5d6cb1d4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14791 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 CQl}>X diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 52f4b28..17b5928 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,16 +1,17 @@ [ - { - "modid": "ctrlq-forge", - "name": "Ctrl-Q Forge", - "description": "This mod forces CTRL Q to be used to drop a stack of item, overwriting the MacOS CMD key.", - "version": "${version}", - "mcversion": "1.8.9", - "url": "https://www.curseforge.com/minecraft/mc-mods/ctrl-q", - "updateUrl": "", - "authorList": ["PolishKrowa"], - "credits": "", - "logoFile": "icon.png", +{ + "modid": "ctrlq", + "name": "Ctrl-Q", + "description": "Forces CTRL+Q for dropping item stacks. Particularly helpful for macOS users where CMD+Q normally quits the application. Works in both inventory GUIs and hotbar.", + "version": "${version}", + "mcversion": "1.8.9", + "url": "https://github.com/polishkrowa/Ctrl-Q", + "updateUrl": "", + "authorList": ["polishkrowa"], + "credits": "Original mod by polishkrowa", + "logoFile": "", "screenshots": [], - "dependencies": [] - } + "dependencies": [], + "acceptedMinecraftVersions": "1.8.9" +} ] \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta deleted file mode 100644 index 59c2a91..0000000 --- a/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "pack_format": 3, - "description": "(Unused) Assets for the CTRL-Q mod" - } -} \ No newline at end of file From e4014fe5ec2a3c1cfb3772ae08013a7ffa7b04ea Mon Sep 17 00:00:00 2001 From: Yves Date: Mon, 14 Jul 2025 07:39:10 +0200 Subject: [PATCH 2/2] Optimize code structure and performance - Extract magic numbers into named constants - Implement reflection field caching for better performance - Split large methods into focused helper functions - Add early returns to reduce nesting complexity - Eliminate code duplication with shared windowClick method - Remove unused initialization method - Improve code readability and maintainability --- .../java/me/polishkrowa/ctrlq/CtrlQMod.java | 218 +++++++++--------- 1 file changed, 105 insertions(+), 113 deletions(-) diff --git a/src/main/java/me/polishkrowa/ctrlq/CtrlQMod.java b/src/main/java/me/polishkrowa/ctrlq/CtrlQMod.java index db65bff..0121a50 100644 --- a/src/main/java/me/polishkrowa/ctrlq/CtrlQMod.java +++ b/src/main/java/me/polishkrowa/ctrlq/CtrlQMod.java @@ -15,6 +15,8 @@ import org.apache.logging.log4j.Logger; import org.lwjgl.input.Keyboard; +import java.lang.reflect.Field; + /** * Ctrl-Q Mod for Minecraft 1.8.9 * @@ -50,6 +52,27 @@ public class CtrlQMod { /** Logger instance for debug and info messages */ private static Logger logger; + + /** Hotbar slot offset for window click operations */ + private static final int HOTBAR_SLOT_OFFSET = 36; + + /** Mouse button ID for CTRL+Drop operations */ + private static final int CTRL_DROP_BUTTON = 1; + + /** Click type for drop operations */ + private static final int DROP_CLICK_TYPE = 4; + + /** Player inventory window ID */ + private static final int PLAYER_INVENTORY_WINDOW_ID = 0; + + /** Field names for reflection access to hovered slot */ + private static final String[] SLOT_FIELD_NAMES = {"theSlot", "field_147006_u"}; + + /** Creative Mode GUI class name */ + private static final String CREATIVE_GUI_CLASS = "GuiContainerCreative"; + + /** Cached reflection field for performance */ + private static Field cachedSlotField; /** * Pre-initialization phase of the mod loading process. @@ -64,16 +87,6 @@ public void preInit(FMLPreInitializationEvent event) { logger.info("Ctrl-Q mod successfully initialized for Minecraft 1.8.9"); } - /** - * Main initialization phase of the mod loading process. - * Currently unused as all initialization happens in preInit. - * - * @param event The initialization event provided by Forge - */ - @Mod.EventHandler - public void init(FMLInitializationEvent event) { - // No additional initialization required for this mod - } /** * Handles CTRL+Q key combinations when the player is in-game with no GUI open. @@ -94,18 +107,11 @@ public void init(FMLInitializationEvent event) { public void onKeyInput(InputEvent.KeyInputEvent event) { Minecraft mc = Minecraft.getMinecraft(); - // Only process hotbar interactions when no GUI is displayed - if (mc.currentScreen == null && mc.thePlayer != null) { - // Check if the configured drop key is currently being pressed - // Keyboard.getEventKeyState() ensures we only trigger on key press, not release - if (mc.gameSettings.keyBindDrop.isKeyDown() && Keyboard.getEventKeyState()) { - boolean isCtrlPressed = isCtrlKeyPressed(); - - if (isCtrlPressed) { - logger.info("CTRL+Drop key combination detected in hotbar context"); - handleHotbarCtrlQ(mc); - } - } + if (mc.currentScreen != null || mc.thePlayer == null) return; + + if (mc.gameSettings.keyBindDrop.isKeyDown() && Keyboard.getEventKeyState() && isCtrlKeyPressed()) { + logger.info("CTRL+Drop key combination detected in hotbar context"); + handleHotbarCtrlQ(mc); } } @@ -127,37 +133,27 @@ public void onKeyInput(InputEvent.KeyInputEvent event) { */ @SubscribeEvent(priority = EventPriority.HIGHEST) public void onGuiKeyInput(GuiScreenEvent.KeyboardInputEvent.Pre event) { - // Log GUI interactions for debugging purposes - logger.debug("GUI keyboard event fired for: " + event.gui.getClass().getSimpleName()); + String guiClassName = event.gui.getClass().getSimpleName(); + logger.debug("GUI keyboard event fired for: " + guiClassName); - // Creative Mode inventory is not supported due to its complex item handling - if (event.gui.getClass().getSimpleName().equals("GuiContainerCreative")) { + if (CREATIVE_GUI_CLASS.equals(guiClassName)) { logger.debug("Creative Mode inventory detected - skipping (not supported)"); return; } - // Only process events for container-based GUIs (inventories, chests, furnaces, etc.) - if (event.gui instanceof GuiContainer) { - Minecraft mc = Minecraft.getMinecraft(); - - // Get the key code that was pressed and compare with drop key binding - int pressedKey = Keyboard.getEventKey(); - int configuredDropKey = mc.gameSettings.keyBindDrop.getKeyCode(); - - logger.debug("Key pressed: " + pressedKey + ", configured drop key: " + configuredDropKey); - - // Check if the pressed key matches the player's drop key binding - if (pressedKey == configuredDropKey && Keyboard.getEventKeyState()) { - boolean isCtrlPressed = isCtrlKeyPressed(); - logger.debug("Drop key detected, CTRL pressed: " + isCtrlPressed); - - if (isCtrlPressed && mc.thePlayer != null) { - logger.info("CTRL+Drop key combination detected in inventory context"); - handleInventoryCtrlQ((GuiContainer) event.gui); - // Cancel the event to prevent normal single-item drop behavior - event.setCanceled(true); - } - } + if (!(event.gui instanceof GuiContainer)) return; + + Minecraft mc = Minecraft.getMinecraft(); + int pressedKey = Keyboard.getEventKey(); + int configuredDropKey = mc.gameSettings.keyBindDrop.getKeyCode(); + + logger.debug("Key pressed: " + pressedKey + ", configured drop key: " + configuredDropKey); + + if (pressedKey == configuredDropKey && Keyboard.getEventKeyState() && + isCtrlKeyPressed() && mc.thePlayer != null) { + logger.info("CTRL+Drop key combination detected in inventory context"); + handleInventoryCtrlQ((GuiContainer) event.gui); + event.setCanceled(true); } } @@ -195,54 +191,29 @@ private boolean isCtrlKeyPressed() { */ private void handleInventoryCtrlQ(GuiContainer gui) { try { - // Access the currently hovered slot using reflection - // Try both deobfuscated and obfuscated field names for maximum compatibility - java.lang.reflect.Field theSlotField; - try { - // Try deobfuscated name first (development environment) - theSlotField = GuiContainer.class.getDeclaredField("theSlot"); - } catch (NoSuchFieldException e) { - // Fall back to obfuscated name (production environment) - theSlotField = GuiContainer.class.getDeclaredField("field_147006_u"); + Slot slot = getHoveredSlot(gui); + if (slot == null) { + logger.debug("No slot currently being hovered"); + return; } - // Make the private field accessible - theSlotField.setAccessible(true); - Object theSlot = theSlotField.get(gui); + if (!slot.getHasStack()) { + logger.debug("No item stack present in hovered slot"); + return; + } - if (theSlot != null) { - Slot slot = (Slot) theSlot; - - // Verify the slot contains items before attempting to drop - if (slot.getHasStack()) { - logger.info("Attempting to drop entire stack from slot " + slot.slotNumber + - " in " + gui.getClass().getSimpleName()); - - // Validate slot number is within container bounds to prevent errors - if (slot.slotNumber >= 0 && slot.slotNumber < gui.inventorySlots.inventorySlots.size()) { - Minecraft mc = Minecraft.getMinecraft(); - - // Use PlayerController for proper network handling and anti-cheat compatibility - // Parameters: windowId, slotId, mouseButton (1=CTRL), clickType (4=DROP), player - mc.playerController.windowClick( - gui.inventorySlots.windowId, // Container window ID - slot.slotNumber, // Specific slot to interact with - 1, // Mouse button 1 with CTRL modifier - 4, // Click type 4 = DROP mode - mc.thePlayer // Player performing the action - ); - - logger.info("Successfully executed stack drop via PlayerController"); - } else { - logger.warn("Invalid slot number " + slot.slotNumber + - " for container with " + gui.inventorySlots.inventorySlots.size() + " slots"); - } - } else { - logger.debug("No item stack present in hovered slot"); - } - } else { - logger.debug("No slot currently being hovered"); + if (!isValidSlot(slot, gui)) { + logger.warn("Invalid slot number " + slot.slotNumber + + " for container with " + gui.inventorySlots.inventorySlots.size() + " slots"); + return; } + + logger.info("Attempting to drop entire stack from slot " + slot.slotNumber + + " in " + gui.getClass().getSimpleName()); + + performWindowClick(gui.inventorySlots.windowId, slot.slotNumber); + logger.info("Successfully executed stack drop via PlayerController"); + } catch (Exception e) { logger.error("Failed to handle inventory CTRL+Q operation: " + e.getMessage(), e); } @@ -268,34 +239,55 @@ private void handleInventoryCtrlQ(GuiContainer gui) { */ private void handleHotbarCtrlQ(Minecraft mc) { try { - // Get the currently selected hotbar slot (0-8) int selectedSlot = mc.thePlayer.inventory.currentItem; ItemStack heldStack = mc.thePlayer.inventory.getStackInSlot(selectedSlot); - if (heldStack != null) { - logger.info("Attempting to drop stack of " + heldStack.stackSize + - " items from hotbar slot " + selectedSlot); - - // Convert hotbar slot (0-8) to window slot ID (36-44) - // This is required because Minecraft's network protocol uses different numbering - int windowSlotId = 36 + selectedSlot; - - // Use PlayerController for proper network handling and anti-cheat compatibility - // Parameters: windowId (0 for player inventory), slotId, mouseButton (1=CTRL), clickType (4=DROP), player - mc.playerController.windowClick( - 0, // Window ID 0 = player inventory - windowSlotId, // Converted slot ID for networking - 1, // Mouse button 1 with CTRL modifier - 4, // Click type 4 = DROP mode - mc.thePlayer // Player performing the action - ); - - logger.info("Successfully executed hotbar stack drop via PlayerController"); - } else { + if (heldStack == null) { logger.debug("No item stack present in current hotbar slot"); + return; } + + logger.info("Attempting to drop stack of " + heldStack.stackSize + + " items from hotbar slot " + selectedSlot); + + int windowSlotId = HOTBAR_SLOT_OFFSET + selectedSlot; + performWindowClick(PLAYER_INVENTORY_WINDOW_ID, windowSlotId); + logger.info("Successfully executed hotbar stack drop via PlayerController"); + } catch (Exception e) { logger.error("Failed to handle hotbar CTRL+Q operation: " + e.getMessage(), e); } } + + private Slot getHoveredSlot(GuiContainer gui) throws Exception { + Field slotField = getSlotField(); + Object theSlot = slotField.get(gui); + return (Slot) theSlot; + } + + private Field getSlotField() throws NoSuchFieldException { + if (cachedSlotField != null) { + return cachedSlotField; + } + + for (String fieldName : SLOT_FIELD_NAMES) { + try { + cachedSlotField = GuiContainer.class.getDeclaredField(fieldName); + cachedSlotField.setAccessible(true); + return cachedSlotField; + } catch (NoSuchFieldException ignored) { + // Try next field name + } + } + throw new NoSuchFieldException("Could not find slot field in GuiContainer"); + } + + private boolean isValidSlot(Slot slot, GuiContainer gui) { + return slot.slotNumber >= 0 && slot.slotNumber < gui.inventorySlots.inventorySlots.size(); + } + + private void performWindowClick(int windowId, int slotId) { + Minecraft mc = Minecraft.getMinecraft(); + mc.playerController.windowClick(windowId, slotId, CTRL_DROP_BUTTON, DROP_CLICK_TYPE, mc.thePlayer); + } } \ No newline at end of file