From 5c1f88b2902a19bb6a16af60c05de80670f5cc2b Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Mon, 30 Oct 2023 12:54:40 +0500 Subject: [PATCH] Initial commit --- .github/workflows/build.yml | 40 +++ .gitignore | 40 +++ LICENSE | 121 +++++++++ build.gradle | 88 +++++++ gradle.properties | 17 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 249 ++++++++++++++++++ gradlew.bat | 92 +++++++ settings.gradle | 10 + .../knockdowns/KnockdownsClient.java | 166 ++++++++++++ .../mixin/client/ClientPlayerEntityMixin.java | 15 ++ .../resources/knockdowns.client.mixins.json | 11 + .../ru/octol1ttle/knockdowns/Knockdowns.java | 215 +++++++++++++++ .../knockdowns/api/IKnockableDown.java | 15 ++ .../knockdowns/mixin/PlayerEntityMixin.java | 60 +++++ .../KnockdownsNetworkingConstants.java | 13 + src/main/resources/assets/knockdowns/icon.png | Bin 0 -> 453 bytes .../assets/knockdowns/lang/en_us.json | 102 +++++++ .../assets/knockdowns/lang/ru_ru.json | 102 +++++++ .../resources/assets/knockdowns/sounds.json | 10 + .../assets/knockdowns/sounds/knocked_down.ogg | Bin 0 -> 45653 bytes src/main/resources/fabric.mod.json | 38 +++ src/main/resources/knockdowns.mixins.json | 11 + 24 files changed, 1422 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 LICENSE 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 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/client/java/ru/octol1ttle/knockdowns/KnockdownsClient.java create mode 100644 src/client/java/ru/octol1ttle/knockdowns/mixin/client/ClientPlayerEntityMixin.java create mode 100644 src/client/resources/knockdowns.client.mixins.json create mode 100644 src/main/java/ru/octol1ttle/knockdowns/Knockdowns.java create mode 100644 src/main/java/ru/octol1ttle/knockdowns/api/IKnockableDown.java create mode 100644 src/main/java/ru/octol1ttle/knockdowns/mixin/PlayerEntityMixin.java create mode 100644 src/main/java/ru/octol1ttle/knockdowns/network/KnockdownsNetworkingConstants.java create mode 100644 src/main/resources/assets/knockdowns/icon.png create mode 100644 src/main/resources/assets/knockdowns/lang/en_us.json create mode 100644 src/main/resources/assets/knockdowns/lang/ru_ru.json create mode 100644 src/main/resources/assets/knockdowns/sounds.json create mode 100644 src/main/resources/assets/knockdowns/sounds/knocked_down.ogg create mode 100644 src/main/resources/fabric.mod.json create mode 100644 src/main/resources/knockdowns.mixins.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..2ca3795 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,40 @@ +# 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: + strategy: + matrix: + # Use these Java versions + java: [ + 17, # Current Java LTS & minimum supported by Minecraft + ] + # and run on both Linux and Windows + os: [ubuntu-22.04, windows-2022] + runs-on: ${{ matrix.os }} + steps: + - name: checkout repository + uses: actions/checkout@v3 + - name: validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: setup jdk ${{ matrix.java }} + uses: actions/setup-java@v3 + with: + java-version: ${{ matrix.java }} + distribution: 'microsoft' + - name: make gradle wrapper executable + if: ${{ runner.os != 'Windows' }} + run: chmod +x ./gradlew + - name: build + run: ./gradlew build + - name: capture build artifacts + if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS + uses: actions/upload-artifact@v3 + with: + name: Artifacts + path: build/libs/ \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c476faf --- /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..1625c17 --- /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/build.gradle b/build.gradle new file mode 100644 index 0000000..ac4bfa3 --- /dev/null +++ b/build.gradle @@ -0,0 +1,88 @@ +plugins { + id 'fabric-loom' version '1.4-SNAPSHOT' + id 'maven-publish' +} + +version = project.mod_version +group = project.maven_group + +base { + archivesName = project.archives_base_name +} + +repositories { + // Add repositories to retrieve artifacts from in here. + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html + // for more information about repositories. +} + +loom { + splitEnvironmentSourceSets() + + mods { + "knockdowns" { + sourceSet sourceSets.main + sourceSet sourceSets.client + } + } + +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + + include(implementation(annotationProcessor("io.github.llamalad7:mixinextras-fabric:0.2.0"))) +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 17 +} + +java { + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() + + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +jar { + from("LICENSE") { + rename { "${it}_${project.base.archivesName.get()}"} + } +} + +// configure the maven publication +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..0ddbc52 --- /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 + +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.20.2 +yarn_mappings=1.20.2+build.4 +loader_version=0.14.24 + +# Mod Properties +mod_version=1.0.0 +maven_group=ru.octol1ttle.knockdowns +archives_base_name=knockdowns + +# Dependencies +fabric_version=0.90.4+1.20.2 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ac72c34 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..0adc8e1 --- /dev/null +++ b/gradlew @@ -0,0 +1,249 @@ +#!/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 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 +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 "${APP_HOME:-./}" > /dev/null && pwd -P ) || 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 + +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 + 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=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 + +# 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" ) + + # 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 $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 new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@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 new file mode 100644 index 0000000..75c4d72 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + mavenCentral() + gradlePluginPortal() + } +} \ No newline at end of file diff --git a/src/client/java/ru/octol1ttle/knockdowns/KnockdownsClient.java b/src/client/java/ru/octol1ttle/knockdowns/KnockdownsClient.java new file mode 100644 index 0000000..889224a --- /dev/null +++ b/src/client/java/ru/octol1ttle/knockdowns/KnockdownsClient.java @@ -0,0 +1,166 @@ +package ru.octol1ttle.knockdowns; + +import java.util.UUID; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientEntityEvents; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; +import net.fabricmc.fabric.api.event.player.UseEntityCallback; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.minecraft.SharedConstants; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.ActionResult; +import net.minecraft.util.hit.EntityHitResult; +import net.minecraft.util.hit.HitResult; +import ru.octol1ttle.knockdowns.api.IKnockableDown; +import ru.octol1ttle.knockdowns.network.KnockdownsNetworkingConstants; + +public class KnockdownsClient implements ClientModInitializer { + private static final int REVIVAL_WAIT_TIME = 10 * SharedConstants.TICKS_PER_SECOND; + private static IKnockableDown reviving = null; + private static int revivalTimer = -1; + + @Override + public void onInitializeClient() { + registerOnReceiveKnockedDown(); + registerOnReceiveReviving(); + registerOnEntityLoad(); + registerOnEntityUse(); + registerOnStartWorldTick(); + registerOnHudRender(); + } + + private static void registerOnReceiveKnockedDown() { + ClientPlayNetworking.registerGlobalReceiver(KnockdownsNetworkingConstants.S2C_SEND_PLAYER_KNOCKED_DOWN, (client, handler, buf, responseSender) -> { + UUID uuid = buf.readUuid(); + boolean knockedDown = buf.readBoolean(); + + client.execute(() -> { + IKnockableDown knockableDown = (IKnockableDown) handler.getWorld().getPlayerByUuid(uuid); + if (knockableDown != null) { + knockableDown.knockdowns$setKnockedDown(knockedDown); + } + }); + }); + } + + private static void registerOnReceiveReviving() { + ClientPlayNetworking.registerGlobalReceiver(KnockdownsNetworkingConstants.S2C_SEND_PLAYER_REVIVING, (client, handler, buf, responseSender) -> { + UUID uuid = buf.readUuid(); + boolean beingRevived = buf.readBoolean(); + + client.execute(() -> { + IKnockableDown knockableDown = (IKnockableDown) handler.getWorld().getPlayerByUuid(uuid); + if (knockableDown != null) { + knockableDown.knockdowns$setBeingRevived(beingRevived); + + if (client.player != null && uuid.equals(client.player.getUuid())) { + if (knockableDown.knockdowns$isBeingRevived()) { + revivalTimer = REVIVAL_WAIT_TIME; + } else { + revivalTimer = -1; + } + } + + if (reviving != null && knockableDown.knockdowns$getUuid().equals(reviving.knockdowns$getUuid()) + && !knockableDown.knockdowns$isBeingRevived()) { + reviving = null; + revivalTimer = -1; + } + } + }); + }); + } + + private static void registerOnEntityLoad() { + ClientEntityEvents.ENTITY_LOAD.register((entity, world) -> { + if (entity instanceof IKnockableDown) { + PacketByteBuf buf = PacketByteBufs.create(); + buf.writeUuid(entity.getUuid()); + + ClientPlayNetworking.send(KnockdownsNetworkingConstants.C2S_REQUEST_PLAYER_KNOCKED_DOWN, buf); + ClientPlayNetworking.send(KnockdownsNetworkingConstants.C2S_REQUEST_PLAYER_REVIVING, buf); + } + }); + } + + private static void registerOnEntityUse() { + UseEntityCallback.EVENT.register((player, world, hand, entity, hitResult) -> { + if (!(entity instanceof IKnockableDown knockableDown) || !knockableDown.knockdowns$isKnockedDown() + || knockableDown.knockdowns$isBeingRevived()) { + return ActionResult.PASS; + } + if (((IKnockableDown)player).knockdowns$isKnockedDown()) { + return ActionResult.FAIL; + } + + knockableDown.knockdowns$setBeingRevived(true); + + PacketByteBuf buf = PacketByteBufs.create(); + buf.writeUuid(entity.getUuid()); + buf.writeBoolean(true); + + ClientPlayNetworking.send(KnockdownsNetworkingConstants.C2S_SEND_PLAYER_REVIVING, buf); + + reviving = knockableDown; + revivalTimer = REVIVAL_WAIT_TIME; + + return ActionResult.SUCCESS; + }); + } + + private static void registerOnStartWorldTick() { + ClientTickEvents.START_WORLD_TICK.register(world -> { + boolean revived = false; + revivalTimer--; + if (revivalTimer <= 0) { + revivalTimer = -1; + revived = true; + } + + if (reviving == null) { + return; + } + + HitResult crosshairTarget = MinecraftClient.getInstance().crosshairTarget; + if (revived || crosshairTarget == null || crosshairTarget.getType() != HitResult.Type.ENTITY + || !((EntityHitResult) crosshairTarget).getEntity().getUuid().equals(reviving.knockdowns$getUuid())) { + reviving.knockdowns$setBeingRevived(false); + + PacketByteBuf buf = PacketByteBufs.create(); + buf.writeUuid(reviving.knockdowns$getUuid()); + buf.writeBoolean(false); + + ClientPlayNetworking.send(KnockdownsNetworkingConstants.C2S_SEND_PLAYER_REVIVING, buf); + if (revived) { + reviving.knockdowns$setKnockedDown(false); + + PacketByteBuf revivedBuf = PacketByteBufs.create(); + revivedBuf.writeUuid(reviving.knockdowns$getUuid()); + + ClientPlayNetworking.send(KnockdownsNetworkingConstants.C2S_SEND_PLAYER_REVIVED, revivedBuf); + } + + reviving = null; + revivalTimer = -1; + } + }); + } + + private static void registerOnHudRender() { + HudRenderCallback.EVENT.register((drawContext, tickDelta) -> { + if (revivalTimer == -1) { + return; + } + + TextRenderer renderer = MinecraftClient.getInstance().textRenderer; + String text = String.format("%.1f", revivalTimer / (float) SharedConstants.TICKS_PER_SECOND); + int x = (drawContext.getScaledWindowWidth() - renderer.getWidth(text)) / 2; + + drawContext.drawTextWithShadow(renderer, text, x, drawContext.getScaledWindowHeight() / 2 + 15, 0xFFFFFF); + }); + } +} \ No newline at end of file diff --git a/src/client/java/ru/octol1ttle/knockdowns/mixin/client/ClientPlayerEntityMixin.java b/src/client/java/ru/octol1ttle/knockdowns/mixin/client/ClientPlayerEntityMixin.java new file mode 100644 index 0000000..aed34f1 --- /dev/null +++ b/src/client/java/ru/octol1ttle/knockdowns/mixin/client/ClientPlayerEntityMixin.java @@ -0,0 +1,15 @@ +package ru.octol1ttle.knockdowns.mixin.client; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import net.minecraft.client.network.ClientPlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import ru.octol1ttle.knockdowns.api.IKnockableDown; + +@Mixin(ClientPlayerEntity.class) +public abstract class ClientPlayerEntityMixin { + @ModifyReturnValue(method = "shouldSlowDown", at = @At("RETURN")) + private boolean shouldSlowDown(boolean original) { + return original || ((IKnockableDown) this).knockdowns$isKnockedDown(); + } +} diff --git a/src/client/resources/knockdowns.client.mixins.json b/src/client/resources/knockdowns.client.mixins.json new file mode 100644 index 0000000..ccd33aa --- /dev/null +++ b/src/client/resources/knockdowns.client.mixins.json @@ -0,0 +1,11 @@ +{ + "required": true, + "package": "ru.octol1ttle.knockdowns.mixin.client", + "compatibilityLevel": "JAVA_17", + "client": [ + "ClientPlayerEntityMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/src/main/java/ru/octol1ttle/knockdowns/Knockdowns.java b/src/main/java/ru/octol1ttle/knockdowns/Knockdowns.java new file mode 100644 index 0000000..39c228f --- /dev/null +++ b/src/main/java/ru/octol1ttle/knockdowns/Knockdowns.java @@ -0,0 +1,215 @@ +package ru.octol1ttle.knockdowns; + +import java.util.UUID; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents; +import net.fabricmc.fabric.api.event.player.AttackBlockCallback; +import net.fabricmc.fabric.api.event.player.AttackEntityCallback; +import net.fabricmc.fabric.api.event.player.UseBlockCallback; +import net.fabricmc.fabric.api.event.player.UseItemCallback; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.fabricmc.fabric.api.networking.v1.PlayerLookup; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableTextContent; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.Identifier; +import net.minecraft.util.TypedActionResult; +import ru.octol1ttle.knockdowns.api.IKnockableDown; +import ru.octol1ttle.knockdowns.network.KnockdownsNetworkingConstants; + +public class Knockdowns implements ModInitializer { + public static final String MOD_ID = "knockdowns"; + private static final Identifier KNOCKED_DOWN_ID = new Identifier("knockdowns:knocked_down"); + private static final SoundEvent KNOCKED_DOWN = SoundEvent.of(KNOCKED_DOWN_ID); + + @Override + public void onInitialize() { + registerSoundEvents(); + registerOnDeath(); + registerOnRequestKnockedDown(); + registerOnRequestReviving(); + registerOnReceiveReviving(); + registerOnReceiveRevived(); + registerOnPlayerInteractions(); + } + + private static void registerSoundEvents() { + Registry.register(Registries.SOUND_EVENT, KNOCKED_DOWN_ID, KNOCKED_DOWN); + } + + private static void registerOnDeath() { + ServerLivingEntityEvents.ALLOW_DEATH.register((entity, damageSource, damageAmount) -> { + if (!(entity instanceof IKnockableDown knockableDown) || knockableDown.knockdowns$isKnockedDown()) { + return true; + } + + // TODO: timer + entity.setHealth(1.0f); + entity.setInvulnerable(true); + entity.setGlowing(true); + entity.setAir(entity.getMaxAir()); + entity.setFireTicks(0); + entity.setFrozenTicks(0); + entity.clearStatusEffects(); + + knockableDown.knockdowns$setKnockedDown(true); + + PacketByteBuf buf = PacketByteBufs.create(); + buf.writeUuid(entity.getUuid()); + buf.writeBoolean(true); + + ServerPlayerEntity serverPlayer = (ServerPlayerEntity) entity; + + ServerPlayNetworking.send(serverPlayer, KnockdownsNetworkingConstants.S2C_SEND_PLAYER_KNOCKED_DOWN, buf); + for (ServerPlayerEntity player : PlayerLookup.tracking(entity)) { + ServerPlayNetworking.send(player, KnockdownsNetworkingConstants.S2C_SEND_PLAYER_KNOCKED_DOWN, buf); + } + + for (ServerPlayerEntity player : serverPlayer.getServerWorld().getPlayers()) { + player.networkHandler.sendPacket(new PlaySoundS2CPacket(Registries.SOUND_EVENT.getEntry(KNOCKED_DOWN), SoundCategory.PLAYERS, + player.getX(), player.getY(), player.getZ(), 1.0f, 1.0f, 0L)); + } + + TranslatableTextContent content = (TranslatableTextContent) entity.getDamageTracker().getDeathMessage().getContent(); + Text replaced = Text.translatable(content.getKey().replace("death.", "knockdown."), content.getArgs()); + MinecraftServer server = serverPlayer.getServer(); + if (server != null) { + server.getPlayerManager().broadcast(replaced, false); + } + + return false; + }); + } + + private static void registerOnRequestKnockedDown() { + ServerPlayNetworking.registerGlobalReceiver(KnockdownsNetworkingConstants.C2S_REQUEST_PLAYER_KNOCKED_DOWN, (server, player, handler, buf, responseSender) -> { + UUID uuid = buf.readUuid(); + + server.execute(() -> { + IKnockableDown knockableDown = (IKnockableDown) player.getWorld().getPlayerByUuid(uuid); + if (knockableDown == null) { + return; + } + + PacketByteBuf responseBuf = PacketByteBufs.create(); + responseBuf.writeUuid(uuid); + responseBuf.writeBoolean(knockableDown.knockdowns$isKnockedDown()); + + responseSender.sendPacket(KnockdownsNetworkingConstants.S2C_SEND_PLAYER_KNOCKED_DOWN, responseBuf); + }); + }); + } + + private static void registerOnRequestReviving() { + ServerPlayNetworking.registerGlobalReceiver(KnockdownsNetworkingConstants.C2S_REQUEST_PLAYER_REVIVING, (server, player, handler, buf, responseSender) -> { + UUID uuid = buf.readUuid(); + + server.execute(() -> { + IKnockableDown knockableDown = (IKnockableDown) player.getWorld().getPlayerByUuid(uuid); + if (knockableDown == null) { + return; + } + + PacketByteBuf responseBuf = PacketByteBufs.create(); + responseBuf.writeUuid(uuid); + responseBuf.writeBoolean(knockableDown.knockdowns$isBeingRevived()); + + responseSender.sendPacket(KnockdownsNetworkingConstants.S2C_SEND_PLAYER_REVIVING, responseBuf); + }); + }); + } + + private static void registerOnReceiveReviving() { + ServerPlayNetworking.registerGlobalReceiver(KnockdownsNetworkingConstants.C2S_SEND_PLAYER_REVIVING, (server, player, handler, buf, responseSender) -> { + UUID uuid = buf.readUuid(); + boolean beingRevived = buf.readBoolean(); + + // TODO: revival by multiple players + server.execute(() -> { + PlayerEntity reviving = player.getWorld().getPlayerByUuid(uuid); + IKnockableDown knockableDown = (IKnockableDown) reviving; + if (knockableDown == null) { + return; + } + + knockableDown.knockdowns$setBeingRevived(beingRevived); + + PacketByteBuf broadcastBuf = PacketByteBufs.create(); + broadcastBuf.writeUuid(uuid); + broadcastBuf.writeBoolean(beingRevived); + + ServerPlayNetworking.send((ServerPlayerEntity) reviving, KnockdownsNetworkingConstants.S2C_SEND_PLAYER_REVIVING, broadcastBuf); + for (ServerPlayerEntity entity : PlayerLookup.tracking(reviving)) { + ServerPlayNetworking.send(entity, KnockdownsNetworkingConstants.S2C_SEND_PLAYER_REVIVING, broadcastBuf); + } + }); + }); + } + + private static void registerOnReceiveRevived() { + ServerPlayNetworking.registerGlobalReceiver(KnockdownsNetworkingConstants.C2S_SEND_PLAYER_REVIVED, (server, player, handler, buf, responseSender) -> { + UUID uuid = buf.readUuid(); + + server.execute(() -> { + PlayerEntity reviving = player.getWorld().getPlayerByUuid(uuid); + IKnockableDown knockableDown = (IKnockableDown) reviving; + if (knockableDown == null || !knockableDown.knockdowns$isKnockedDown()) { + return; + } + + reviving.setInvulnerable(false); + reviving.setGlowing(false); + reviving.setHealth(reviving.getHealth() + 5.0f); + + knockableDown.knockdowns$setKnockedDown(false); + + PacketByteBuf sendBuf = PacketByteBufs.create(); + sendBuf.writeUuid(reviving.getUuid()); + sendBuf.writeBoolean(false); + + ServerPlayNetworking.send((ServerPlayerEntity) reviving, KnockdownsNetworkingConstants.S2C_SEND_PLAYER_KNOCKED_DOWN, sendBuf); + for (ServerPlayerEntity entity : PlayerLookup.tracking(reviving)) { + ServerPlayNetworking.send(entity, KnockdownsNetworkingConstants.S2C_SEND_PLAYER_KNOCKED_DOWN, sendBuf); + } + }); + }); + } + + private static void registerOnPlayerInteractions() { + AttackBlockCallback.EVENT.register((player, world, hand, pos, direction) -> { + if (player instanceof IKnockableDown && ((IKnockableDown) player).knockdowns$isKnockedDown()) { + return ActionResult.FAIL; + } + return ActionResult.PASS; + }); + AttackEntityCallback.EVENT.register((player, world, hand, entity, hitResult) -> { + if (player instanceof IKnockableDown && ((IKnockableDown) player).knockdowns$isKnockedDown()) { + return ActionResult.FAIL; + } + return ActionResult.PASS; + }); + UseItemCallback.EVENT.register((player, world, hand) -> { + if (player instanceof IKnockableDown && ((IKnockableDown) player).knockdowns$isKnockedDown()) { + return TypedActionResult.fail(hand == Hand.MAIN_HAND ? player.getMainHandStack() : player.getOffHandStack()); + } + return TypedActionResult.pass(hand == Hand.MAIN_HAND ? player.getMainHandStack() : player.getOffHandStack()); + }); + UseBlockCallback.EVENT.register((player, world, hand, hitResult) -> { + if (player instanceof IKnockableDown && ((IKnockableDown) player).knockdowns$isKnockedDown()) { + return ActionResult.FAIL; + } + return ActionResult.PASS; + }); + } +} \ No newline at end of file diff --git a/src/main/java/ru/octol1ttle/knockdowns/api/IKnockableDown.java b/src/main/java/ru/octol1ttle/knockdowns/api/IKnockableDown.java new file mode 100644 index 0000000..b06d4a4 --- /dev/null +++ b/src/main/java/ru/octol1ttle/knockdowns/api/IKnockableDown.java @@ -0,0 +1,15 @@ +package ru.octol1ttle.knockdowns.api; + +import java.util.UUID; + +public interface IKnockableDown { + boolean knockdowns$isKnockedDown(); + + void knockdowns$setKnockedDown(boolean knockedDown); + + boolean knockdowns$isBeingRevived(); + + void knockdowns$setBeingRevived(boolean beingRevived); + + UUID knockdowns$getUuid(); +} diff --git a/src/main/java/ru/octol1ttle/knockdowns/mixin/PlayerEntityMixin.java b/src/main/java/ru/octol1ttle/knockdowns/mixin/PlayerEntityMixin.java new file mode 100644 index 0000000..28a70a1 --- /dev/null +++ b/src/main/java/ru/octol1ttle/knockdowns/mixin/PlayerEntityMixin.java @@ -0,0 +1,60 @@ +package ru.octol1ttle.knockdowns.mixin; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import java.util.UUID; +import net.minecraft.entity.player.PlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import ru.octol1ttle.knockdowns.api.IKnockableDown; + +@Mixin(PlayerEntity.class) +public abstract class PlayerEntityMixin implements IKnockableDown { + @Unique + private boolean knockedDown; + @Unique + private boolean beingRevived; + @Unique + private int reviveAt; + + @ModifyExpressionValue(method = "updatePose", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isSwimming()Z")) + private boolean isKnockedDown(boolean original) { + PlayerEntity player = (PlayerEntity)(Object)this; + if (!(player instanceof IKnockableDown knockableDown)) { + throw new IllegalStateException(); + } + + return original || knockableDown.knockdowns$isKnockedDown(); + } + + @ModifyReturnValue(method = "canFoodHeal", at = @At("RETURN")) + private boolean canFoodHeal(boolean original) { + return original && !this.knockdowns$isKnockedDown(); + } + + @Override + public boolean knockdowns$isKnockedDown() { + return knockedDown; + } + + @Override + public void knockdowns$setKnockedDown(boolean knockedDown) { + this.knockedDown = knockedDown; + } + + @Override + public boolean knockdowns$isBeingRevived() { + return beingRevived; + } + + @Override + public void knockdowns$setBeingRevived(boolean beingRevived) { + this.beingRevived = beingRevived; + } + + @Override + public UUID knockdowns$getUuid() { + return ((PlayerEntity)(Object)this).getUuid(); + } +} diff --git a/src/main/java/ru/octol1ttle/knockdowns/network/KnockdownsNetworkingConstants.java b/src/main/java/ru/octol1ttle/knockdowns/network/KnockdownsNetworkingConstants.java new file mode 100644 index 0000000..a618797 --- /dev/null +++ b/src/main/java/ru/octol1ttle/knockdowns/network/KnockdownsNetworkingConstants.java @@ -0,0 +1,13 @@ +package ru.octol1ttle.knockdowns.network; + +import net.minecraft.util.Identifier; +import ru.octol1ttle.knockdowns.Knockdowns; + +public class KnockdownsNetworkingConstants { + public static final Identifier S2C_SEND_PLAYER_KNOCKED_DOWN = new Identifier(Knockdowns.MOD_ID, "s2c_send_player_knocked_down"); + public static final Identifier S2C_SEND_PLAYER_REVIVING = new Identifier(Knockdowns.MOD_ID, "s2c_send_player_reviving"); + public static final Identifier C2S_REQUEST_PLAYER_KNOCKED_DOWN = new Identifier(Knockdowns.MOD_ID, "c2s_request_player_knocked_down"); + public static final Identifier C2S_REQUEST_PLAYER_REVIVING = new Identifier(Knockdowns.MOD_ID, "c2s_request_player_reviving"); + public static final Identifier C2S_SEND_PLAYER_REVIVING = new Identifier(Knockdowns.MOD_ID, "c2s_send_player_reviving"); + public static final Identifier C2S_SEND_PLAYER_REVIVED = new Identifier(Knockdowns.MOD_ID, "c2s_send_player_revived"); +} diff --git a/src/main/resources/assets/knockdowns/icon.png b/src/main/resources/assets/knockdowns/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..047b91f2347de5cf95f23284476fddbe21ba23fe GIT binary patch literal 453 zcmV;$0XqJPP)QAFYGys`80vegN0XDFh0OXKz&i8?Le#x7{1X)R+00000NkvXXu0mjf73i~T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/knockdowns/lang/en_us.json b/src/main/resources/assets/knockdowns/lang/en_us.json new file mode 100644 index 0000000..256bd9b --- /dev/null +++ b/src/main/resources/assets/knockdowns/lang/en_us.json @@ -0,0 +1,102 @@ +{ + "knockdown.attack.anvil": "%1$s was knocked down by a falling anvil", + "knockdown.attack.anvil.player": "%1$s was knocked down by a falling anvil while fighting %2$s", + "knockdown.attack.arrow": "%1$s was knocked down due to an arrow fired by %2$s", + "knockdown.attack.arrow.item": "%1$s was knocked down due to an arrow fired by %2$s using %3$s", + "knockdown.attack.badRespawnPoint.link": "Intentional Game Design", + "knockdown.attack.badRespawnPoint.message": "%1$s was knocked down by %2$s", + "knockdown.attack.cactus": "%1$s was knocked down by a cactus", + "knockdown.attack.cactus.player": "%1$s was knocked down into a cactus while trying to escape %2$s", + "knockdown.attack.cramming": "%1$s was knocked down by squishing", + "knockdown.attack.cramming.player": "%1$s was knocked down due to being squashed by %2$s", + "knockdown.attack.dragonBreath": "%1$s was knocked down by dragon's breath", + "knockdown.attack.dragonBreath.player": "%1$s was knocked down by dragon's breath by %2$s", + "knockdown.attack.drown": "%1$s was knocked down by drowning", + "knockdown.attack.drown.player": "%1$s was knocked down by drowning while trying to escape %2$s", + "knockdown.attack.dryout": "%1$s was knocked down by dehydration", + "knockdown.attack.dryout.player": "%1$s was knocked down by dehydration while trying to escape %2$s", + "knockdown.attack.even_more_magic": "%1$s was knocked down by even more magic", + "knockdown.attack.explosion": "%1$s was knocked down due to an explosion", + "knockdown.attack.explosion.player": "%1$s was knocked down due to an explosion caused by %2$s", + "knockdown.attack.explosion.player.item": "%1$s was knocked down due to an explosion caused by %2$s using %3$s", + "knockdown.attack.fall": "%1$s was knocked down by a fall", + "knockdown.attack.fall.player": "%1$s was knocked down by a fall while trying to escape %2$s", + "knockdown.attack.fallingBlock": "%1$s was knocked down by a falling block", + "knockdown.attack.fallingBlock.player": "%1$s was knocked down by a falling block while fighting %2$s", + "knockdown.attack.fallingStalactite": "%1$s was knocked down by a falling stalactite", + "knockdown.attack.fallingStalactite.player": "%1$s was knocked down by a falling stalactite while fighting %2$s", + "knockdown.attack.fireball": "%1$s was knocked down due to a fireball fired by %2$s", + "knockdown.attack.fireball.item": "%1$s was knocked down due to a fireball fired by %2$s using %3$s", + "knockdown.attack.fireworks": "%1$s was knocked down with a bang", + "knockdown.attack.fireworks.item": "%1$s was knocked down with a bang due to a firework fired from %3$s by %2$s", + "knockdown.attack.fireworks.player": "%1$s was knocked down with a bang while fighting %2$s", + "knockdown.attack.flyIntoWall": "%1$s was knocked down by kinetic energy", + "knockdown.attack.flyIntoWall.player": "%1$s was knocked down by kinetic energy while trying to escape %2$s", + "knockdown.attack.freeze": "%1$s was knocked down by freezing", + "knockdown.attack.freeze.player": "%1$s was knocked down by freezing by %2$s", + "knockdown.attack.generic": "%1$s was knocked down", + "knockdown.attack.generic.player": "%1$s was knocked down because of %2$s", + "knockdown.attack.genericKill": "%1$s was knocked down", + "knockdown.attack.genericKill.player": "%1$s was knocked down while fighting %2$s", + "knockdown.attack.hotFloor": "%1$s was knocked down by the lava floor", + "knockdown.attack.hotFloor.player": "%1$s was knocked down by the lava floor due to %2$s", + "knockdown.attack.indirectMagic": "%1$s was knocked down by %2$s using magic", + "knockdown.attack.indirectMagic.item": "%1$s was knocked down by %2$s using %3$s", + "knockdown.attack.inFire": "%1$s was knocked down by fire", + "knockdown.attack.inFire.player": "%1$s was knocked down by fire while fighting %2$s", + "knockdown.attack.inWall": "%1$s was knocked down by suffocation", + "knockdown.attack.inWall.player": "%1$s was knocked down by suffocation while fighting %2$s", + "knockdown.attack.lava": "%1$s was knocked down by lava", + "knockdown.attack.lava.player": "%1$s was knocked down by lava while trying to escape %2$s", + "knockdown.attack.lightningBolt": "%1$s was knocked down by lightning", + "knockdown.attack.lightningBolt.player": "%1$s was knocked down by lightning while fighting %2$s", + "knockdown.attack.magic": "%1$s was knocked down by magic", + "knockdown.attack.magic.player": "%1$s was knocked down by magic while trying to escape %2$s", + "knockdown.attack.message_too_long": "Actually, the message was too long to deliver fully. Sorry! Here's a stripped version: %s", + "knockdown.attack.mob": "%1$s was knocked down by %2$s", + "knockdown.attack.mob.item": "%1$s was knocked down by %2$s using %3$s", + "knockdown.attack.onFire": "%1$s was knocked down by fire", + "knockdown.attack.onFire.item": "%1$s was knocked down by fire while fighting %2$s wielding %3$s", + "knockdown.attack.onFire.player": "%1$s was knocked down by fire while fighting %2$s", + "knockdown.attack.outOfWorld": "%1$s was knocked down by the void", + "knockdown.attack.outOfWorld.player": "%1$s was knocked down by the void while fighting %2$s", + "knockdown.attack.outsideBorder": "%1$s was knocked down by the world border", + "knockdown.attack.outsideBorder.player": "%1$s was knocked down by the world border while fighting %2$s", + "knockdown.attack.player": "%1$s was knocked down by %2$s", + "knockdown.attack.player.item": "%1$s was knocked down by %2$s using %3$s", + "knockdown.attack.sonic_boom": "%1$s was knocked down by a sonically-charged shriek", + "knockdown.attack.sonic_boom.item": "%1$s was knocked down by a sonically-charged shriek while trying to escape %2$s wielding %3$s", + "knockdown.attack.sonic_boom.player": "%1$s was knocked down by a sonically-charged shriek while trying to escape %2$s", + "knockdown.attack.stalagmite": "%1$s was knocked down by a stalagmite", + "knockdown.attack.stalagmite.player": "%1$s was knocked down by a stalagmite while fighting %2$s", + "knockdown.attack.starve": "%1$s was knocked down by starving", + "knockdown.attack.starve.player": "%1$s was knocked down by starving while fighting %2$s", + "knockdown.attack.sting": "%1$s was knocked down by stings", + "knockdown.attack.sting.item": "%1$s was knocked down by stings by %2$s using %3$s", + "knockdown.attack.sting.player": "%1$s was knocked down by stings by %2$s", + "knockdown.attack.sweetBerryBush": "%1$s was knocked down by a sweet berry bush", + "knockdown.attack.sweetBerryBush.player": "%1$s was knocked down by a sweet berry bush while trying to escape %2$s", + "knockdown.attack.thorns": "%1$s was knocked down while trying to hurt %2$s", + "knockdown.attack.thorns.item": "%1$s was knocked down by %3$s while trying to hurt %2$s", + "knockdown.attack.thrown": "%1$s was knocked down due to being thrown by %2$s", + "knockdown.attack.thrown.item": "%1$s was knocked down due to being thrown by %2$s using %3$s", + "knockdown.attack.trident": "%1$s was knocked down due to being impaled by %2$s", + "knockdown.attack.trident.item": "%1$s was knocked down due to being impaled by %2$s with %3$s", + "knockdown.attack.wither": "%1$s was knocked down by withering", + "knockdown.attack.wither.player": "%1$s was knocked down by withering while fighting %2$s", + "knockdown.attack.witherSkull": "%1$s was knocked down by a skull from %2$s", + "knockdown.attack.witherSkull.item": "%1$s was knocked down by a skull from %2$s using %3$s", + "knockdown.fell.accident.generic": "%1$s was knocked down by a fall", + "knockdown.fell.accident.ladder": "%1$s was knocked down by a fall off a ladder", + "knockdown.fell.accident.other_climbable": "%1$s was knocked down by a fall while climbing", + "knockdown.fell.accident.scaffolding": "%1$s was knocked down by a fall off scaffolding", + "knockdown.fell.accident.twisting_vines": "%1$s was knocked down by a fall off some twisting vines", + "knockdown.fell.accident.vines": "%1$s was knocked down by a fall off some vines", + "knockdown.fell.accident.weeping_vines": "%1$s was knocked down by a fall off some weeping vines", + "knockdown.fell.assist": "%1$s was doomed to get knocked down by %2$s", + "knockdown.fell.assist.item": "%1$s was doomed to get knocked down by %2$s using %3$s", + "knockdown.fell.finish": "%1$s fell too far and was knocked down by %2$s", + "knockdown.fell.finish.item": "%1$s fell too far and was knocked down by %2$s using %3$s", + "knockdown.fell.killer": "%1$s was doomed to get knocked down by a fall", + "subtitles.knockdowns.knocked_down": "Player knocked down" +} \ No newline at end of file diff --git a/src/main/resources/assets/knockdowns/lang/ru_ru.json b/src/main/resources/assets/knockdowns/lang/ru_ru.json new file mode 100644 index 0000000..5cdd965 --- /dev/null +++ b/src/main/resources/assets/knockdowns/lang/ru_ru.json @@ -0,0 +1,102 @@ +{ + "knockdown.attack.anvil": "%1$s был тяжело ранен упавшей наковальней", + "knockdown.attack.anvil.player": "%1$s был тяжело ранен упавшей наковальней, пока сражался с %2$s", + "knockdown.attack.arrow": "%1$s тяжело ранен стрелой %2$s", + "knockdown.attack.arrow.item": "%1$s тяжело ранен стрелой %2$s из %3$s", + "knockdown.attack.badRespawnPoint.link": "жестокими правилами игры", + "knockdown.attack.badRespawnPoint.message": "%1$s был тяжело ранен %2$s", + "knockdown.attack.cactus": "%1$s был тяжело ранен кактусом", + "knockdown.attack.cactus.player": "%1$s был тяжело ранен кактусом, спасаясь от %2$s", + "knockdown.attack.cramming": "%1$s был тяжело ранен расплющиванием", + "knockdown.attack.cramming.player": "%1$s был тяжело ранен расплющиванием %2$s", + "knockdown.attack.dragonBreath": "%1$s был тяжело ранен в драконьем дыхании", + "knockdown.attack.dragonBreath.player": "%1$s был тяжело ранен в драконьем дыхании из-за %2$s", + "knockdown.attack.drown": "%1$s был тяжело ранен утоплением", + "knockdown.attack.drown.player": "%1$s был тяжело ранен утоплением, спасаясь от %2$s", + "knockdown.attack.dryout": "%1$s был тяжело ранен обезвоживанием", + "knockdown.attack.dryout.player": "%1$s был тяжело ранен обезвоживанием, спасаясь от %2$s", + "knockdown.attack.even_more_magic": "%1$s был тяжело ранен неизведанной магией", + "knockdown.attack.explosion": "%1$s был тяжело ранен взрывом", + "knockdown.attack.explosion.player": "%1$s был тяжело ранен взрывом %2$s", + "knockdown.attack.explosion.player.item": "%1$s был тяжело ранен взрывом %2$s с помощью %3$s", + "knockdown.attack.fall": "%1$s был тяжело ранен падением", + "knockdown.attack.fall.player": "%1$s был тяжело ранен падением, спасаясь от %2$s", + "knockdown.attack.fallingBlock": "%1$s был тяжело ранен упавшим блоком", + "knockdown.attack.fallingBlock.player": "%1$s был тяжело ранен упавшим блоком, пока боролся с %2$s", + "knockdown.attack.fallingStalactite": "%1$s был тяжело ранен обрушившимся сталактитом", + "knockdown.attack.fallingStalactite.player": "%1$s был тяжело ранен обрушившимся сталактитом, пока боролся с %2$s", + "knockdown.attack.fireball": "%1$s был тяжело ранен файерболом %2$s", + "knockdown.attack.fireball.item": "%1$s был тяжело ранен файерболом %2$s с помощью %3$s", + "knockdown.attack.fireworks": "%1$s был тяжело ранен взрывом фейерверка", + "knockdown.attack.fireworks.item": "%1$s был тяжело ранен взрывом фейерверка %2$s, выпущенного из %3$s", + "knockdown.attack.fireworks.player": "%1$s был тяжело ранен взрывом фейерверка, пока боролся с %2$s", + "knockdown.attack.flyIntoWall": "%1$s был тяжело ранен кинетической энергией", + "knockdown.attack.flyIntoWall.player": "%1$s был тяжело ранен кинетической энергией, спасаясь от %2$s", + "knockdown.attack.freeze": "%1$s был тяжело ранен замерзанием", + "knockdown.attack.freeze.player": "%1$s был тяжело ранен замерзанием благодаря %2$s", + "knockdown.attack.generic": "%1$s тяжело ранен", + "knockdown.attack.generic.player": "%1$s тяжело ранен из-за %2$s", + "knockdown.attack.genericKill": "%1$s тяжело ранен", + "knockdown.attack.genericKill.player": "%1$s был тяжело ранен, пока боролся с %2$s", + "knockdown.attack.hotFloor": "%1$s был тяжело ранен, обнаружив, что пол — это лава", + "knockdown.attack.hotFloor.player": "%1$s был тяжело ранен, так как зашёл в опасную зону из-за %2$s", + "knockdown.attack.inFire": "%1$s был тяжело ранен в огне", + "knockdown.attack.inFire.player": "%1$s был тяжело ранен в огне, пока боролся с %2$s", + "knockdown.attack.inWall": "%1$s был тяжело ранен погребением заживо", + "knockdown.attack.inWall.player": "%1$s был тяжело ранен погребением заживо, пока боролся с %2$s", + "knockdown.attack.indirectMagic": "%1$s был тяжело ранен %2$s с помощью магии", + "knockdown.attack.indirectMagic.item": "%1$s был тяжело ранен %2$s с помощью %3$s", + "knockdown.attack.lava": "%1$s был тяжело ранен лавой", + "knockdown.attack.lava.player": "%1$s был тяжело ранен лавой, убегая от %2$s", + "knockdown.attack.lightningBolt": "%1$s был тяжело ранен молнией", + "knockdown.attack.lightningBolt.player": "%1$s был тяжело ранен молнией, пока сражался с %2$s", + "knockdown.attack.magic": "%1$s был тяжело ранен магией", + "knockdown.attack.magic.player": "%1$s был тяжело ранен магией, убегая от %2$s", + "knockdown.attack.message_too_long": "Сообщение слишком длинное для доставки. Извините! Вот сокращённая версия: %s", + "knockdown.attack.mob": "%1$s был тяжело ранен %2$s", + "knockdown.attack.mob.item": "%1$s был тяжело ранен %2$s с помощью %3$s", + "knockdown.attack.onFire": "%1$s был тяжело ранен огнём", + "knockdown.attack.onFire.item": "%1$s был тяжело ранен огнём, пока боролся с %2$s, с помощью %3$s", + "knockdown.attack.onFire.player": "%1$s был тяжело ранен огнём, пока боролся с %2$s", + "knockdown.attack.outOfWorld": "%1$s был тяжело ранен пустотой", + "knockdown.attack.outOfWorld.player": "%1$s был тяжело ранен пустотой, благодаря %2$s", + "knockdown.attack.outsideBorder": "%1$s был тяжело ранен пределами этого мира", + "knockdown.attack.outsideBorder.player": "%1$s был тяжело ранен пределами этого мира, пока боролся с %2$s", + "knockdown.attack.player": "%1$s был тяжело ранен %2$s", + "knockdown.attack.player.item": "%1$s был тяжело ранен %2$s с помощью %3$s", + "knockdown.attack.sonic_boom": "%1$s был тяжело ранен звуковым зарядом", + "knockdown.attack.sonic_boom.item": "%1$s был тяжело ранен звуковым ударом, спасаясь от %2$s c %3$s", + "knockdown.attack.sonic_boom.player": "%1$s был тяжело ранен звуковым ударом, спасаясь от %2$s", + "knockdown.attack.stalagmite": "%1$s был тяжело ранен сталагмитом", + "knockdown.attack.stalagmite.player": "%1$s был тяжело ранен сталагмитом, пока боролся с %2$s", + "knockdown.attack.starve": "%1$s был тяжело ранен голодом", + "knockdown.attack.starve.player": "%1$s был тяжело ранен голодом, пока боролся с %2$s", + "knockdown.attack.sting": "%1$s был тяжело ранен изжалением", + "knockdown.attack.sting.item": "%1$s был тяжело ранен изжалением %2$s с помощью %3$s", + "knockdown.attack.sting.player": "%1$s был тяжело ранен изжалением %2$s", + "knockdown.attack.sweetBerryBush": "%1$s был тяжело ранен исколением в кустах сладких ягод", + "knockdown.attack.sweetBerryBush.player": "%1$s был тяжело ранен исколением в кустах сладких ягод, спасаясь от %2$s", + "knockdown.attack.thorns": "%1$s был тяжело ранен, пытаясь навредить %2$s", + "knockdown.attack.thorns.item": "%1$s был тяжело ранен %3$s, пытаясь навредить %2$s", + "knockdown.attack.thrown": "%1$s был тяжело ранен %2$s", + "knockdown.attack.thrown.item": "%1$s был тяжело ранен %2$s с помощью %3$s", + "knockdown.attack.trident": "%1$s был тяжело ранен пронзанием %2$s", + "knockdown.attack.trident.item": "%1$s был тяжело ранен пронзанием %2$s с помощью %3$s", + "knockdown.attack.wither": "%1$s был тяжело ранен иссушением", + "knockdown.attack.wither.player": "%1$s был тяжело ранен иссушением, пока боролся с %2$s", + "knockdown.attack.witherSkull": "%1$s был тяжело ранен поражением черепом из %2$s", + "knockdown.attack.witherSkull.item": "%1$s был тяжело ранен поражением черепом из %2$s с помощью %3$s", + "knockdown.fell.accident.generic": "%1$s был тяжело ранен падением", + "knockdown.fell.accident.ladder": "%1$s был тяжело ранен падением с лестницы", + "knockdown.fell.accident.other_climbable": "%1$s был тяжело ранен падением", + "knockdown.fell.accident.scaffolding": "%1$s был тяжело ранен падением с подмосток", + "knockdown.fell.accident.twisting_vines": "%1$s был тяжело ранен падением с вьющейся лозы", + "knockdown.fell.accident.vines": "%1$s был тяжело ранен падением с лианы", + "knockdown.fell.accident.weeping_vines": "%1$s был тяжело ранен падением с плакучей лозы", + "knockdown.fell.assist": "%1$s был тяжело ранен падением благодаря %2$s", + "knockdown.fell.assist.item": "%1$s был тяжело ранен падением благодаря %2$s с помощью %3$s", + "knockdown.fell.finish": "%1$s упал с высоты и был тяжело ранен %2$s", + "knockdown.fell.finish.item": "%1$s упал с высоты и был тяжело ранен %2$s с помощью %3$s", + "knockdown.fell.killer": "%1$s был тяжело ранен падением", + "subtitles.knockdowns.knocked_down": "Игрок тяжело ранен" +} \ No newline at end of file diff --git a/src/main/resources/assets/knockdowns/sounds.json b/src/main/resources/assets/knockdowns/sounds.json new file mode 100644 index 0000000..52d77b8 --- /dev/null +++ b/src/main/resources/assets/knockdowns/sounds.json @@ -0,0 +1,10 @@ +{ + "knocked_down": { + "subtitle": "subtitles.knockdowns.knocked_down", + "sounds": [ + { + "name": "knockdowns:knocked_down" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/knockdowns/sounds/knocked_down.ogg b/src/main/resources/assets/knockdowns/sounds/knocked_down.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a01bae84c53c5b42085083f32cfe8a2b4732b162 GIT binary patch literal 45653 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..c4330c1 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,38 @@ +{ + "schemaVersion": 1, + "id": "knockdowns", + "version": "${version}", + "name": "Knockdowns", + "description": "man hardcode is difficult", + "authors": [ + "Octol1ttle" + ], + "contact": { + "homepage": "https://fabricmc.net/", + "sources": "https://github.com/FabricMC/fabric-example-mod" + }, + "license": "ARR", + "icon": "assets/knockdowns/icon.png", + "environment": "*", + "entrypoints": { + "main": [ + "ru.octol1ttle.knockdowns.Knockdowns" + ], + "client": [ + "ru.octol1ttle.knockdowns.KnockdownsClient" + ] + }, + "mixins": [ + "knockdowns.mixins.json", + { + "config": "knockdowns.client.mixins.json", + "environment": "client" + } + ], + "depends": { + "fabricloader": ">=0.14.23", + "minecraft": "~1.20.2", + "java": ">=17", + "fabric-api": "*" + } +} \ No newline at end of file diff --git a/src/main/resources/knockdowns.mixins.json b/src/main/resources/knockdowns.mixins.json new file mode 100644 index 0000000..81139b2 --- /dev/null +++ b/src/main/resources/knockdowns.mixins.json @@ -0,0 +1,11 @@ +{ + "required": true, + "package": "ru.octol1ttle.knockdowns.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "PlayerEntityMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file