a Fabric Minecraft mod that connects the game to the AT Protocol.

init: setup project for Minecraft 1.21.10 with Fabric template

Changed files
+800
.github
workflows
gradle
src
client
java
com
jollywhoppers
kotlin
com
jollywhoppers
resources
main
java
com
jollywhoppers
kotlin
com
jollywhoppers
resources
+9
.gitattributes
··· 1 + # 2 + # https://help.github.com/articles/dealing-with-line-endings/ 3 + # 4 + # Linux start script should use lf 5 + /gradlew text eol=lf 6 + 7 + # These are Windows script files and should use crlf 8 + *.bat text eol=crlf 9 +
+30
.github/workflows/build.yml
··· 1 + # Automatically build the project and run any configured tests for every push 2 + # and submitted pull request. This can help catch issues that only occur on 3 + # certain platforms or Java versions, and provides a first line of defence 4 + # against bad commits. 5 + 6 + name: build 7 + on: [pull_request, push] 8 + 9 + jobs: 10 + build: 11 + runs-on: ubuntu-24.04 12 + steps: 13 + - name: checkout repository 14 + uses: actions/checkout@v4 15 + - name: validate gradle wrapper 16 + uses: gradle/actions/wrapper-validation@v4 17 + - name: setup jdk 18 + uses: actions/setup-java@v4 19 + with: 20 + java-version: '21' 21 + distribution: 'microsoft' 22 + - name: make gradle wrapper executable 23 + run: chmod +x ./gradlew 24 + - name: build 25 + run: ./gradlew build 26 + - name: capture build artifacts 27 + uses: actions/upload-artifact@v4 28 + with: 29 + name: Artifacts 30 + path: build/libs/
+40
.gitignore
··· 1 + # gradle 2 + 3 + .gradle/ 4 + build/ 5 + out/ 6 + classes/ 7 + 8 + # eclipse 9 + 10 + *.launch 11 + 12 + # idea 13 + 14 + .idea/ 15 + *.iml 16 + *.ipr 17 + *.iws 18 + 19 + # vscode 20 + 21 + .settings/ 22 + .vscode/ 23 + bin/ 24 + .classpath 25 + .project 26 + 27 + # macos 28 + 29 + *.DS_Store 30 + 31 + # fabric 32 + 33 + run/ 34 + 35 + # java 36 + 37 + hs_err_*.log 38 + replay_*.log 39 + *.hprof 40 + *.jfr
+121
LICENSE
··· 1 + Creative Commons Legal Code 2 + 3 + CC0 1.0 Universal 4 + 5 + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 + HEREUNDER. 13 + 14 + Statement of Purpose 15 + 16 + The laws of most jurisdictions throughout the world automatically confer 17 + exclusive Copyright and Related Rights (defined below) upon the creator 18 + and subsequent owner(s) (each and all, an "owner") of an original work of 19 + authorship and/or a database (each, a "Work"). 20 + 21 + Certain owners wish to permanently relinquish those rights to a Work for 22 + the purpose of contributing to a commons of creative, cultural and 23 + scientific works ("Commons") that the public can reliably and without fear 24 + of later claims of infringement build upon, modify, incorporate in other 25 + works, reuse and redistribute as freely as possible in any form whatsoever 26 + and for any purposes, including without limitation commercial purposes. 27 + These owners may contribute to the Commons to promote the ideal of a free 28 + culture and the further production of creative, cultural and scientific 29 + works, or to gain reputation or greater distribution for their Work in 30 + part through the use and efforts of others. 31 + 32 + For these and/or other purposes and motivations, and without any 33 + expectation of additional consideration or compensation, the person 34 + associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 + is an owner of Copyright and Related Rights in the Work, voluntarily 36 + elects to apply CC0 to the Work and publicly distribute the Work under its 37 + terms, with knowledge of his or her Copyright and Related Rights in the 38 + Work and the meaning and intended legal effect of CC0 on those rights. 39 + 40 + 1. Copyright and Related Rights. A Work made available under CC0 may be 41 + protected by copyright and related or neighboring rights ("Copyright and 42 + Related Rights"). Copyright and Related Rights include, but are not 43 + limited to, the following: 44 + 45 + i. the right to reproduce, adapt, distribute, perform, display, 46 + communicate, and translate a Work; 47 + ii. moral rights retained by the original author(s) and/or performer(s); 48 + iii. publicity and privacy rights pertaining to a person's image or 49 + likeness depicted in a Work; 50 + iv. rights protecting against unfair competition in regards to a Work, 51 + subject to the limitations in paragraph 4(a), below; 52 + v. rights protecting the extraction, dissemination, use and reuse of data 53 + in a Work; 54 + vi. database rights (such as those arising under Directive 96/9/EC of the 55 + European Parliament and of the Council of 11 March 1996 on the legal 56 + protection of databases, and under any national implementation 57 + thereof, including any amended or successor version of such 58 + directive); and 59 + vii. other similar, equivalent or corresponding rights throughout the 60 + world based on applicable law or treaty, and any national 61 + implementations thereof. 62 + 63 + 2. Waiver. To the greatest extent permitted by, but not in contravention 64 + of, applicable law, Affirmer hereby overtly, fully, permanently, 65 + irrevocably and unconditionally waives, abandons, and surrenders all of 66 + Affirmer's Copyright and Related Rights and associated claims and causes 67 + of action, whether now known or unknown (including existing as well as 68 + future claims and causes of action), in the Work (i) in all territories 69 + worldwide, (ii) for the maximum duration provided by applicable law or 70 + treaty (including future time extensions), (iii) in any current or future 71 + medium and for any number of copies, and (iv) for any purpose whatsoever, 72 + including without limitation commercial, advertising or promotional 73 + purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 + member of the public at large and to the detriment of Affirmer's heirs and 75 + successors, fully intending that such Waiver shall not be subject to 76 + revocation, rescission, cancellation, termination, or any other legal or 77 + equitable action to disrupt the quiet enjoyment of the Work by the public 78 + as contemplated by Affirmer's express Statement of Purpose. 79 + 80 + 3. Public License Fallback. Should any part of the Waiver for any reason 81 + be judged legally invalid or ineffective under applicable law, then the 82 + Waiver shall be preserved to the maximum extent permitted taking into 83 + account Affirmer's express Statement of Purpose. In addition, to the 84 + extent the Waiver is so judged Affirmer hereby grants to each affected 85 + person a royalty-free, non transferable, non sublicensable, non exclusive, 86 + irrevocable and unconditional license to exercise Affirmer's Copyright and 87 + Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 + maximum duration provided by applicable law or treaty (including future 89 + time extensions), (iii) in any current or future medium and for any number 90 + of copies, and (iv) for any purpose whatsoever, including without 91 + limitation commercial, advertising or promotional purposes (the 92 + "License"). The License shall be deemed effective as of the date CC0 was 93 + applied by Affirmer to the Work. Should any part of the License for any 94 + reason be judged legally invalid or ineffective under applicable law, such 95 + partial invalidity or ineffectiveness shall not invalidate the remainder 96 + of the License, and in such case Affirmer hereby affirms that he or she 97 + will not (i) exercise any of his or her remaining Copyright and Related 98 + Rights in the Work or (ii) assert any associated claims and causes of 99 + action with respect to the Work, in either case contrary to Affirmer's 100 + express Statement of Purpose. 101 + 102 + 4. Limitations and Disclaimers. 103 + 104 + a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 + surrendered, licensed or otherwise affected by this document. 106 + b. Affirmer offers the Work as-is and makes no representations or 107 + warranties of any kind concerning the Work, express, implied, 108 + statutory or otherwise, including without limitation warranties of 109 + title, merchantability, fitness for a particular purpose, non 110 + infringement, or the absence of latent or other defects, accuracy, or 111 + the present or absence of errors, whether or not discoverable, all to 112 + the greatest extent permissible under applicable law. 113 + c. Affirmer disclaims responsibility for clearing rights of other persons 114 + that may apply to the Work or any use thereof, including without 115 + limitation any person's Copyright and Related Rights in the Work. 116 + Further, Affirmer disclaims responsibility for obtaining any necessary 117 + consents, permissions or other rights required for any use of the 118 + Work. 119 + d. Affirmer understands and acknowledges that Creative Commons is not a 120 + party to this document and has no duty or obligation with respect to 121 + this CC0 or use of the Work.
+97
build.gradle
··· 1 + plugins { 2 + id 'net.fabricmc.fabric-loom-remap' version "${loom_version}" 3 + id 'maven-publish' 4 + id "org.jetbrains.kotlin.jvm" version "2.3.0" 5 + } 6 + 7 + version = project.mod_version 8 + group = project.maven_group 9 + 10 + base { 11 + archivesName = project.archives_base_name 12 + } 13 + 14 + repositories { 15 + // Add repositories to retrieve artifacts from in here. 16 + // You should only use this when depending on other mods because 17 + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. 18 + // See https://docs.gradle.org/current/userguide/declaring_repositories.html 19 + // for more information about repositories. 20 + } 21 + 22 + loom { 23 + splitEnvironmentSourceSets() 24 + 25 + mods { 26 + "atproto-connect" { 27 + sourceSet sourceSets.main 28 + sourceSet sourceSets.client 29 + } 30 + } 31 + 32 + } 33 + 34 + dependencies { 35 + // To change the versions see the gradle.properties file 36 + minecraft "com.mojang:minecraft:${project.minecraft_version}" 37 + mappings loom.officialMojangMappings() 38 + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" 39 + 40 + // Fabric API. This is technically optional, but you probably want it anyway. 41 + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" 42 + modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}" 43 + } 44 + 45 + processResources { 46 + inputs.property "version", project.version 47 + 48 + filesMatching("fabric.mod.json") { 49 + expand "version": inputs.properties.version 50 + } 51 + } 52 + 53 + tasks.withType(JavaCompile).configureEach { 54 + it.options.release = 21 55 + } 56 + 57 + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { 58 + kotlinOptions { 59 + jvmTarget = 21 60 + } 61 + } 62 + 63 + java { 64 + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task 65 + // if it is present. 66 + // If you remove this line, sources will not be generated. 67 + withSourcesJar() 68 + 69 + sourceCompatibility = JavaVersion.VERSION_21 70 + targetCompatibility = JavaVersion.VERSION_21 71 + } 72 + 73 + jar { 74 + inputs.property "archivesName", project.base.archivesName 75 + 76 + from("LICENSE") { 77 + rename { "${it}_${inputs.properties.archivesName}"} 78 + } 79 + } 80 + 81 + // configure the maven publication 82 + publishing { 83 + publications { 84 + create("mavenJava", MavenPublication) { 85 + artifactId = project.archives_base_name 86 + from components.java 87 + } 88 + } 89 + 90 + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. 91 + repositories { 92 + // Add repositories to publish to here. 93 + // Notice: This block does NOT have the same function as the block in the top level. 94 + // The repositories here will be used for publishing your artifact, not for 95 + // retrieving dependencies. 96 + } 97 + }
+21
gradle.properties
··· 1 + # Done to increase the memory available to gradle. 2 + org.gradle.jvmargs=-Xmx1G 3 + org.gradle.parallel=true 4 + 5 + # IntelliJ IDEA is not yet fully compatible with configuration cache, see: https://github.com/FabricMC/fabric-loom/issues/1349 6 + org.gradle.configuration-cache=false 7 + 8 + # Fabric Properties 9 + # check these on https://fabricmc.net/develop 10 + minecraft_version=1.21.10 11 + loader_version=0.18.3 12 + loom_version=1.14-SNAPSHOT 13 + fabric_kotlin_version=1.13.8+kotlin.2.3.0 14 + 15 + # Mod Properties 16 + mod_version=1.0.0 17 + maven_group=com.jollywhoppers 18 + archives_base_name=atproto-connect 19 + 20 + # Dependencies 21 + fabric_version=0.138.4+1.21.10
gradle/wrapper/gradle-wrapper.jar

This is a binary file and will not be displayed.

+7
gradle/wrapper/gradle-wrapper.properties
··· 1 + distributionBase=GRADLE_USER_HOME 2 + distributionPath=wrapper/dists 3 + distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip 4 + networkTimeout=10000 5 + validateDistributionUrl=true 6 + zipStoreBase=GRADLE_USER_HOME 7 + zipStorePath=wrapper/dists
+248
gradlew
··· 1 + #!/bin/sh 2 + 3 + # 4 + # Copyright © 2015 the original authors. 5 + # 6 + # Licensed under the Apache License, Version 2.0 (the "License"); 7 + # you may not use this file except in compliance with the License. 8 + # You may obtain a copy of the License at 9 + # 10 + # https://www.apache.org/licenses/LICENSE-2.0 11 + # 12 + # Unless required by applicable law or agreed to in writing, software 13 + # distributed under the License is distributed on an "AS IS" BASIS, 14 + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 + # See the License for the specific language governing permissions and 16 + # limitations under the License. 17 + # 18 + # SPDX-License-Identifier: Apache-2.0 19 + # 20 + 21 + ############################################################################## 22 + # 23 + # Gradle start up script for POSIX generated by Gradle. 24 + # 25 + # Important for running: 26 + # 27 + # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 28 + # noncompliant, but you have some other compliant shell such as ksh or 29 + # bash, then to run this script, type that shell name before the whole 30 + # command line, like: 31 + # 32 + # ksh Gradle 33 + # 34 + # Busybox and similar reduced shells will NOT work, because this script 35 + # requires all of these POSIX shell features: 36 + # * functions; 37 + # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 38 + # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 39 + # * compound commands having a testable exit status, especially «case»; 40 + # * various built-in commands including «command», «set», and «ulimit». 41 + # 42 + # Important for patching: 43 + # 44 + # (2) This script targets any POSIX shell, so it avoids extensions provided 45 + # by Bash, Ksh, etc; in particular arrays are avoided. 46 + # 47 + # The "traditional" practice of packing multiple parameters into a 48 + # space-separated string is a well documented source of bugs and security 49 + # problems, so this is (mostly) avoided, by progressively accumulating 50 + # options in "$@", and eventually passing that to Java. 51 + # 52 + # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 53 + # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 54 + # see the in-line comments for details. 55 + # 56 + # There are tweaks for specific operating systems such as AIX, CygWin, 57 + # Darwin, MinGW, and NonStop. 58 + # 59 + # (3) This script is generated from the Groovy template 60 + # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 61 + # within the Gradle project. 62 + # 63 + # You can find Gradle at https://github.com/gradle/gradle/. 64 + # 65 + ############################################################################## 66 + 67 + # Attempt to set APP_HOME 68 + 69 + # Resolve links: $0 may be a link 70 + app_path=$0 71 + 72 + # Need this for daisy-chained symlinks. 73 + while 74 + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 75 + [ -h "$app_path" ] 76 + do 77 + ls=$( ls -ld "$app_path" ) 78 + link=${ls#*' -> '} 79 + case $link in #( 80 + /*) app_path=$link ;; #( 81 + *) app_path=$APP_HOME$link ;; 82 + esac 83 + done 84 + 85 + # This is normally unused 86 + # shellcheck disable=SC2034 87 + APP_BASE_NAME=${0##*/} 88 + # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 89 + APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit 90 + 91 + # Use the maximum available, or set MAX_FD != -1 to use that value. 92 + MAX_FD=maximum 93 + 94 + warn () { 95 + echo "$*" 96 + } >&2 97 + 98 + die () { 99 + echo 100 + echo "$*" 101 + echo 102 + exit 1 103 + } >&2 104 + 105 + # OS specific support (must be 'true' or 'false'). 106 + cygwin=false 107 + msys=false 108 + darwin=false 109 + nonstop=false 110 + case "$( uname )" in #( 111 + CYGWIN* ) cygwin=true ;; #( 112 + Darwin* ) darwin=true ;; #( 113 + MSYS* | MINGW* ) msys=true ;; #( 114 + NONSTOP* ) nonstop=true ;; 115 + esac 116 + 117 + 118 + 119 + # Determine the Java command to use to start the JVM. 120 + if [ -n "$JAVA_HOME" ] ; then 121 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 122 + # IBM's JDK on AIX uses strange locations for the executables 123 + JAVACMD=$JAVA_HOME/jre/sh/java 124 + else 125 + JAVACMD=$JAVA_HOME/bin/java 126 + fi 127 + if [ ! -x "$JAVACMD" ] ; then 128 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 129 + 130 + Please set the JAVA_HOME variable in your environment to match the 131 + location of your Java installation." 132 + fi 133 + else 134 + JAVACMD=java 135 + if ! command -v java >/dev/null 2>&1 136 + then 137 + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 138 + 139 + Please set the JAVA_HOME variable in your environment to match the 140 + location of your Java installation." 141 + fi 142 + fi 143 + 144 + # Increase the maximum file descriptors if we can. 145 + if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 146 + case $MAX_FD in #( 147 + max*) 148 + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 149 + # shellcheck disable=SC2039,SC3045 150 + MAX_FD=$( ulimit -H -n ) || 151 + warn "Could not query maximum file descriptor limit" 152 + esac 153 + case $MAX_FD in #( 154 + '' | soft) :;; #( 155 + *) 156 + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 157 + # shellcheck disable=SC2039,SC3045 158 + ulimit -n "$MAX_FD" || 159 + warn "Could not set maximum file descriptor limit to $MAX_FD" 160 + esac 161 + fi 162 + 163 + # Collect all arguments for the java command, stacking in reverse order: 164 + # * args from the command line 165 + # * the main class name 166 + # * -classpath 167 + # * -D...appname settings 168 + # * --module-path (only if needed) 169 + # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 170 + 171 + # For Cygwin or MSYS, switch paths to Windows format before running java 172 + if "$cygwin" || "$msys" ; then 173 + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 174 + 175 + JAVACMD=$( cygpath --unix "$JAVACMD" ) 176 + 177 + # Now convert the arguments - kludge to limit ourselves to /bin/sh 178 + for arg do 179 + if 180 + case $arg in #( 181 + -*) false ;; # don't mess with options #( 182 + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 183 + [ -e "$t" ] ;; #( 184 + *) false ;; 185 + esac 186 + then 187 + arg=$( cygpath --path --ignore --mixed "$arg" ) 188 + fi 189 + # Roll the args list around exactly as many times as the number of 190 + # args, so each arg winds up back in the position where it started, but 191 + # possibly modified. 192 + # 193 + # NB: a `for` loop captures its iteration list before it begins, so 194 + # changing the positional parameters here affects neither the number of 195 + # iterations, nor the values presented in `arg`. 196 + shift # remove old arg 197 + set -- "$@" "$arg" # push replacement arg 198 + done 199 + fi 200 + 201 + 202 + # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 203 + DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 204 + 205 + # Collect all arguments for the java command: 206 + # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, 207 + # and any embedded shellness will be escaped. 208 + # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be 209 + # treated as '${Hostname}' itself on the command line. 210 + 211 + set -- \ 212 + "-Dorg.gradle.appname=$APP_BASE_NAME" \ 213 + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ 214 + "$@" 215 + 216 + # Stop when "xargs" is not available. 217 + if ! command -v xargs >/dev/null 2>&1 218 + then 219 + die "xargs is not available" 220 + fi 221 + 222 + # Use "xargs" to parse quoted args. 223 + # 224 + # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 225 + # 226 + # In Bash we could simply go: 227 + # 228 + # readarray ARGS < <( xargs -n1 <<<"$var" ) && 229 + # set -- "${ARGS[@]}" "$@" 230 + # 231 + # but POSIX shell has neither arrays nor command substitution, so instead we 232 + # post-process each arg (as a line of input to sed) to backslash-escape any 233 + # character that might be a shell metacharacter, then use eval to reverse 234 + # that process (while maintaining the separation between arguments), and wrap 235 + # the whole thing up as a single "set" statement. 236 + # 237 + # This will of course break if any of these variables contains a newline or 238 + # an unmatched quote. 239 + # 240 + 241 + eval "set -- $( 242 + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 243 + xargs -n1 | 244 + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 245 + tr '\n' ' ' 246 + )" '"$@"' 247 + 248 + exec "$JAVACMD" "$@"
+93
gradlew.bat
··· 1 + @rem 2 + @rem Copyright 2015 the original author or authors. 3 + @rem 4 + @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 + @rem you may not use this file except in compliance with the License. 6 + @rem You may obtain a copy of the License at 7 + @rem 8 + @rem https://www.apache.org/licenses/LICENSE-2.0 9 + @rem 10 + @rem Unless required by applicable law or agreed to in writing, software 11 + @rem distributed under the License is distributed on an "AS IS" BASIS, 12 + @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 + @rem See the License for the specific language governing permissions and 14 + @rem limitations under the License. 15 + @rem 16 + @rem SPDX-License-Identifier: Apache-2.0 17 + @rem 18 + 19 + @if "%DEBUG%"=="" @echo off 20 + @rem ########################################################################## 21 + @rem 22 + @rem Gradle startup script for Windows 23 + @rem 24 + @rem ########################################################################## 25 + 26 + @rem Set local scope for the variables with windows NT shell 27 + if "%OS%"=="Windows_NT" setlocal 28 + 29 + set DIRNAME=%~dp0 30 + if "%DIRNAME%"=="" set DIRNAME=. 31 + @rem This is normally unused 32 + set APP_BASE_NAME=%~n0 33 + set APP_HOME=%DIRNAME% 34 + 35 + @rem Resolve any "." and ".." in APP_HOME to make it shorter. 36 + for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 37 + 38 + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 39 + set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 40 + 41 + @rem Find java.exe 42 + if defined JAVA_HOME goto findJavaFromJavaHome 43 + 44 + set JAVA_EXE=java.exe 45 + %JAVA_EXE% -version >NUL 2>&1 46 + if %ERRORLEVEL% equ 0 goto execute 47 + 48 + echo. 1>&2 49 + echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 50 + echo. 1>&2 51 + echo Please set the JAVA_HOME variable in your environment to match the 1>&2 52 + echo location of your Java installation. 1>&2 53 + 54 + goto fail 55 + 56 + :findJavaFromJavaHome 57 + set JAVA_HOME=%JAVA_HOME:"=% 58 + set JAVA_EXE=%JAVA_HOME%/bin/java.exe 59 + 60 + if exist "%JAVA_EXE%" goto execute 61 + 62 + echo. 1>&2 63 + echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 64 + echo. 1>&2 65 + echo Please set the JAVA_HOME variable in your environment to match the 1>&2 66 + echo location of your Java installation. 1>&2 67 + 68 + goto fail 69 + 70 + :execute 71 + @rem Setup the command line 72 + 73 + 74 + 75 + @rem Execute Gradle 76 + "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* 77 + 78 + :end 79 + @rem End local scope for the variables with windows NT shell 80 + if %ERRORLEVEL% equ 0 goto mainEnd 81 + 82 + :fail 83 + rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 84 + rem the _cmd.exe /c_ return code! 85 + set EXIT_CODE=%ERRORLEVEL% 86 + if %EXIT_CODE% equ 0 set EXIT_CODE=1 87 + if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 88 + exit /b %EXIT_CODE% 89 + 90 + :mainEnd 91 + if "%OS%"=="Windows_NT" endlocal 92 + 93 + :omega
+10
settings.gradle
··· 1 + pluginManagement { 2 + repositories { 3 + maven { 4 + name = 'Fabric' 5 + url = 'https://maven.fabricmc.net/' 6 + } 7 + mavenCentral() 8 + gradlePluginPortal() 9 + } 10 + }
+15
src/client/java/com/jollywhoppers/mixin/client/ExampleClientMixin.java
··· 1 + package com.jollywhoppers.mixin.client; 2 + 3 + import net.minecraft.client.Minecraft; 4 + import org.spongepowered.asm.mixin.Mixin; 5 + import org.spongepowered.asm.mixin.injection.At; 6 + import org.spongepowered.asm.mixin.injection.Inject; 7 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 8 + 9 + @Mixin(Minecraft.class) 10 + public class ExampleClientMixin { 11 + @Inject(at = @At("HEAD"), method = "run") 12 + private void init(CallbackInfo info) { 13 + // This code is injected into the start of Minecraft.run()V 14 + } 15 + }
+9
src/client/kotlin/com/jollywhoppers/AtprotoconnectClient.kt
··· 1 + package com.jollywhoppers 2 + 3 + import net.fabricmc.api.ClientModInitializer 4 + 5 + object AtprotoconnectClient : ClientModInitializer { 6 + override fun onInitializeClient() { 7 + // This entrypoint is suitable for setting up client-specific logic, such as rendering. 8 + } 9 + }
+11
src/client/resources/atproto-connect.client.mixins.json
··· 1 + { 2 + "required": true, 3 + "package": "com.jollywhoppers.mixin.client", 4 + "compatibilityLevel": "JAVA_21", 5 + "client": [ 6 + "ExampleClientMixin" 7 + ], 8 + "injectors": { 9 + "defaultRequire": 1 10 + } 11 + }
+15
src/main/java/com/jollywhoppers/mixin/ExampleMixin.java
··· 1 + package com.jollywhoppers.mixin; 2 + 3 + import net.minecraft.server.MinecraftServer; 4 + import org.spongepowered.asm.mixin.Mixin; 5 + import org.spongepowered.asm.mixin.injection.At; 6 + import org.spongepowered.asm.mixin.injection.Inject; 7 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 8 + 9 + @Mixin(MinecraftServer.class) 10 + public class ExampleMixin { 11 + @Inject(at = @At("HEAD"), method = "loadLevel") 12 + private void init(CallbackInfo info) { 13 + // This code is injected into the start of MinecraftServer.loadLevel()V 14 + } 15 + }
+15
src/main/kotlin/com/jollywhoppers/Atprotoconnect.kt
··· 1 + package com.jollywhoppers 2 + 3 + import net.fabricmc.api.ModInitializer 4 + import org.slf4j.LoggerFactory 5 + 6 + object Atprotoconnect : ModInitializer { 7 + private val logger = LoggerFactory.getLogger("atproto-connect") 8 + 9 + override fun onInitialize() { 10 + // This code runs as soon as Minecraft is in a mod-load-ready state. 11 + // However, some things (like resources) may still be uninitialized. 12 + // Proceed with mild caution. 13 + logger.info("Hello Fabric world!") 14 + } 15 + }
src/main/resources/assets/atproto-connect/icon.png

This is a binary file and will not be displayed.

+14
src/main/resources/atproto-connect.mixins.json
··· 1 + { 2 + "required": true, 3 + "package": "com.jollywhoppers.mixin", 4 + "compatibilityLevel": "JAVA_21", 5 + "mixins": [ 6 + "ExampleMixin" 7 + ], 8 + "injectors": { 9 + "defaultRequire": 1 10 + }, 11 + "overwrites": { 12 + "requireAnnotations": true 13 + } 14 + }
+45
src/main/resources/fabric.mod.json
··· 1 + { 2 + "schemaVersion": 1, 3 + "id": "atproto-connect", 4 + "version": "${version}", 5 + "name": "atproto-connect", 6 + "description": "This is an example description! Tell everyone what your mod is about!", 7 + "authors": [ 8 + "Me!" 9 + ], 10 + "contact": { 11 + "homepage": "https://fabricmc.net/", 12 + "sources": "https://github.com/FabricMC/fabric-example-mod" 13 + }, 14 + "license": "CC0-1.0", 15 + "icon": "assets/atproto-connect/icon.png", 16 + "environment": "*", 17 + "entrypoints": { 18 + "main": [ 19 + { 20 + "value": "com.jollywhoppers.Atprotoconnect", 21 + "adapter": "kotlin" 22 + } 23 + ], 24 + "client": [ 25 + { 26 + "value": "com.jollywhoppers.AtprotoconnectClient", 27 + "adapter": "kotlin" 28 + } 29 + ] 30 + }, 31 + "mixins": [ 32 + "atproto-connect.mixins.json", 33 + { 34 + "config": "atproto-connect.client.mixins.json", 35 + "environment": "client" 36 + } 37 + ], 38 + "depends": { 39 + "fabricloader": ">=0.18.3", 40 + "minecraft": "~1.21.10", 41 + "java": ">=21", 42 + "fabric-api": "*", 43 + "fabric-language-kotlin": "*" 44 + } 45 + }