+9
.gitattributes
+9
.gitattributes
+30
.github/workflows/build.yml
+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
+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
+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
+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
+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
gradle/wrapper/gradle-wrapper.jar
This is a binary file and will not be displayed.
+7
gradle/wrapper/gradle-wrapper.properties
+7
gradle/wrapper/gradle-wrapper.properties
+248
gradlew
+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
+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
+10
settings.gradle
+15
src/client/java/com/jollywhoppers/mixin/client/ExampleClientMixin.java
+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
+9
src/client/kotlin/com/jollywhoppers/AtprotoconnectClient.kt
+11
src/client/resources/atproto-connect.client.mixins.json
+11
src/client/resources/atproto-connect.client.mixins.json
+15
src/main/java/com/jollywhoppers/mixin/ExampleMixin.java
+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
+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
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
+14
src/main/resources/atproto-connect.mixins.json
+45
src/main/resources/fabric.mod.json
+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
+
}