From 1fd90d83e0a5c9ef9d035fa2c09182b90f549c585b7a91e3aad7aed3d2e33a29 Mon Sep 17 00:00:00 2001 From: vel Date: Sun, 25 Oct 2026 17:20:20 -0500 Subject: [PATCH] initial comet --- .gitattributes | 9 + .github/workflows/build.yml | 30 +++ .gitignore | 40 +++ LICENSE | 121 +++++++++ README.md | 9 + build.gradle | 49 ++++ gradle.properties | 17 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 48749 bytes gradle/wrapper/gradle-wrapper.properties | 9 + gradlew | 248 ++++++++++++++++++ settings.gradle | 12 + .../vel/m910qmidgetmod/MidgetifyCommand.java | 89 +++++++ .../net/heizle/vel/m910qmidgetmod/Mod.java | 22 ++ src/main/resources/fabric.mod.json | 25 ++ 14 files changed, 680 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 settings.gradle create mode 100644 src/main/java/net/heizle/vel/m910qmidgetmod/MidgetifyCommand.java create mode 100644 src/main/java/net/heizle/vel/m910qmidgetmod/Mod.java create mode 100644 src/main/resources/fabric.mod.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d07429e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a62662d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,30 @@ +# Automatically build the project and run any configured tests for every push +# and submitted pull request. This can help catch issues that only occur on +# certain platforms or Java versions, and provides a first line of defence +# against bad commits. + +name: build +on: [pull_request, push] + +jobs: + build: + runs-on: ubuntu-24.04 + steps: + - name: checkout repository + uses: actions/checkout@v6 + - name: validate gradle wrapper + uses: gradle/actions/wrapper-validation@v6 + - name: setup jdk + uses: actions/setup-java@v5 + with: + java-version: '25' + distribution: 'microsoft' + - name: make gradle wrapper executable + run: chmod +x ./gradlew + - name: build + run: ./gradlew build + - name: capture build artifacts + uses: actions/upload-artifact@v7 + with: + name: Artifacts + path: build/libs/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..13e78e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# gradle + +.gradle/ +build/ +out/ +classes/ + +# eclipse + +*.launch + +# idea + +.idea/ +*.iml +*.ipr +*.iws + +# vscode + +.settings/ +.vscode/ +bin/ +.classpath +.project + +# macos + +*.DS_Store + +# fabric + +run/ + +# java + +hs_err_*.log +replay_*.log +*.hprof +*.jfr diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1b73696 --- /dev/null +++ b/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c1395e --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Example Mod + +## Setup + +For setup instructions, please see the [Fabric Documentation page](https://docs.fabricmc.net/develop/getting-started/creating-a-project#setting-up) related to the IDE that you are using. + +## License + +This template is available under the CC0 license. Feel free to learn from it and incorporate it in your own projects. diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..d0c8185 --- /dev/null +++ b/build.gradle @@ -0,0 +1,49 @@ +plugins { + id 'net.fabricmc.fabric-loom' version "${loom_version}" +} + +repositories {} + +loom { + splitEnvironmentSourceSets() + + mods { + "m910q-midget-mod" { + sourceSet sourceSets.main + sourceSet sourceSets.client + } + } +} + +dependencies { + minecraft "com.mojang:minecraft:${project.minecraft_version}" + implementation "net.fabricmc:fabric-loader:${project.loader_version}" + implementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" +} + +processResources { + def version = project.version + inputs.property "version", version + + filesMatching("fabric.mod.json") { + expand "version": version + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 25 +} + +java { + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 +} + +jar { + def projectName = project.name + inputs.property "projectName", projectName + + from("LICENSE") { + rename { "${it}_$projectName"} + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..00ce13f --- /dev/null +++ b/gradle.properties @@ -0,0 +1,17 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +org.gradle.parallel=true +org.gradle.configuration-cache=true + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=26.3 +loader_version=0.19.5 +loom_version=1.19-SNAPSHOT + +# Mod Properties +version=1.0.0 +group=com.example + +# Dependencies +fabric_api_version=0.165.0+26.3 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000000000000000000000000000..5214d7d635bc90928fa51daefdd754965124e009f9ddfcf41c2f4ca4f295d1b0 GIT binary patch literal 48749 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c0a9497 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,9 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.2-bin.zip +networkTimeout=10000 +retries=0 +retryBackOffMs=500 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..91acf08 --- /dev/null +++ b/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 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. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# gradlew 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 gradlew +# +# 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/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/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 +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 + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +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 ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# 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 + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + 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 +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +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=SC2039,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=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +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" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + 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 + # 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 +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# 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/settings.gradle b/settings.gradle new file mode 100644 index 0000000..0b4fab4 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,12 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + mavenCentral() + gradlePluginPortal() + } +} + +rootProject.name = 'm910q-midget-mod' diff --git a/src/main/java/net/heizle/vel/m910qmidgetmod/MidgetifyCommand.java b/src/main/java/net/heizle/vel/m910qmidgetmod/MidgetifyCommand.java new file mode 100644 index 0000000..56bcaed --- /dev/null +++ b/src/main/java/net/heizle/vel/m910qmidgetmod/MidgetifyCommand.java @@ -0,0 +1,89 @@ +package net.heizle.vel.m910qmidgetmod; + +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.minecraft.commands.Commands; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextColor; +import net.minecraft.world.entity.ai.attributes.Attributes; + +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class MidgetifyCommand { + private static final ConcurrentHashMap CONFIRMATION_CACHE = new ConcurrentHashMap<>(); + + public static void register() { + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + dispatcher.register( + Commands.literal("midgetify") + .executes(context -> { + CommandSourceStack source = context.getSource(); + + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendSystemMessage(Component.literal("Ay, I'm working here!")); + return 0; + } + + if (player.getAttribute(Attributes.MAX_HEALTH).getBaseValue() == 10) { + source.sendSystemMessage( + Component.literal("You are already a midget.").withColor(TextColor.RED)); + return 0; + } + + UUID playerUuid = player.getUUID(); + + CONFIRMATION_CACHE.put(playerUuid, true); + + Component confirmBtn = Component.literal("[CONFIRM]").withStyle(style -> style + .withColor(TextColor.RED) + .withBold(true) + .withClickEvent(new ClickEvent.RunCommand("/midgetify confirm"))); + + source.sendSystemMessage( + Component.literal( + "Are you sure you want to become a midget? This means being 1 block tall, but also having half health.\n\nYou cannot go back on this decision.\n") + .append(confirmBtn)); + + return 1; + }) + .then(Commands.literal("confirm") + .executes(context -> { + CommandSourceStack source = context.getSource(); + + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendSystemMessage(Component.literal("Ay, I'm working here!")); + return 0; + } + + if (player.getAttribute(Attributes.MAX_HEALTH).getBaseValue() == 10) { + source.sendSystemMessage(Component.literal("You are already a midget.") + .withColor(TextColor.RED)); + return 0; + } + + UUID playerUuid = player.getUUID(); + + if (!CONFIRMATION_CACHE.containsKey(playerUuid)) { + source.sendSystemMessage(Component + .literal("Nuh uh uh. Wrong order, mate.") + .withColor(TextColor.RED)); + return 0; + } + + CONFIRMATION_CACHE.remove(playerUuid); + player.getAttribute(Attributes.MAX_HEALTH).setBaseValue(10); + player.getAttribute(Attributes.SCALE).setBaseValue(0.5); + + source.sendSystemMessage( + Component.literal("Welcome to the midget life.") + .withColor(TextColor.GREEN)); + return 1; + }))); + }); + } +} diff --git a/src/main/java/net/heizle/vel/m910qmidgetmod/Mod.java b/src/main/java/net/heizle/vel/m910qmidgetmod/Mod.java new file mode 100644 index 0000000..cc5a324 --- /dev/null +++ b/src/main/java/net/heizle/vel/m910qmidgetmod/Mod.java @@ -0,0 +1,22 @@ +package net.heizle.vel.m910qmidgetmod; + +import net.fabricmc.api.ModInitializer; +import net.minecraft.resources.Identifier; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Mod implements ModInitializer { + public static final String MOD_ID = "m910q-midget-mod"; + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + + @Override + public void onInitialize() { + MidgetifyCommand.register(); + LOGGER.info("Midgets ready."); + } + + public static Identifier id(String path) { + return Identifier.fromNamespaceAndPath(MOD_ID, path); + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..7699fc9 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,25 @@ +{ + "schemaVersion": 1, + "id": "m910q-midget-mod", + "version": "${version}", + "name": "m910q midget mod", + "description": "", + "authors": [ + "vel" + ], + "contact": {}, + "license": "CC0-1.0", + "environment": "server", + "entrypoints": { + "main": [ + "net.heizle.vel.m910qmidgetmod.Mod" + ] + }, + "mixins": [], + "depends": { + "fabricloader": ">=0.19.5", + "minecraft": ">=26.3", + "java": ">=25", + "fabric-api": "*" + } +} \ No newline at end of file