├── .github └── workflows │ ├── build.yml │ └── upstream.yml ├── .gitignore ├── LICENSE ├── README.md ├── build-data ├── dev-imports.txt └── tentacles.at ├── build.gradle.kts ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── scripts ├── apatch.sh ├── updateUpstream.sh └── upstreamCommit.sh ├── settings.gradle.kts ├── tentacles-api ├── build.gradle.kts.patch └── paper-patches │ └── features │ └── 0001-Rebrand.patch ├── tentacles-server ├── build.gradle.kts.patch └── paper-patches │ └── features │ └── 0001-Rebrand.patch └── test-plugin ├── build.gradle.kts └── src └── main ├── java └── org │ └── purpurmc │ └── testplugin │ ├── TestPlugin.java │ ├── TestPluginBootstrap.java │ └── TestPluginLoader.java └── resources └── paper-plugin.yml /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: [ push, pull_request ] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v4 8 | - uses: gradle/wrapper-validation-action@v3 9 | - uses: actions/setup-java@v4 10 | with: 11 | distribution: temurin 12 | java-version: 21 13 | - name: Configure Git 14 | run: git config --global user.email "action@github.com" && git config --global user.name "Github Action" 15 | - name: Apply patches 16 | run: ./gradlew applyAllPatches --stacktrace 17 | - name: Build 18 | run: ./gradlew build --stacktrace 19 | -------------------------------------------------------------------------------- /.github/workflows/upstream.yml: -------------------------------------------------------------------------------- 1 | name: Upstream 2 | on: 3 | schedule: 4 | - cron: "*/15 * * * *" 5 | jobs: 6 | upstream: 7 | runs-on: ubuntu-latest 8 | if: "!contains(github.event.commits[0].message, '[ci-skip]')" 9 | steps: 10 | - uses: actions/checkout@v4 11 | - uses: gradle/wrapper-validation-action@v3 12 | - uses: actions/setup-java@v4 13 | with: 14 | distribution: temurin 15 | java-version: 21 16 | - name: Configure Git 17 | run: git config --global user.email "action@github.com" && git config --global user.name "Github Action" 18 | - name: Update upstream 19 | run: | 20 | ./scripts/updateUpstream.sh 21 | - name: Push changes 22 | uses: ad-m/github-push-action@master 23 | with: 24 | github_token: ${{ secrets.GITHUB_TOKEN }} 25 | branch: ${{ github.ref }} 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # JVM crash related 2 | core.* 3 | hs_err_pid* 4 | 5 | # Intellij 6 | .idea/ 7 | *.iml 8 | *.ipr 9 | *.iws 10 | out/ 11 | 12 | # Eclipse 13 | .classpath 14 | .project 15 | .settings/ 16 | 17 | # netbeans 18 | nbproject/ 19 | nbactions.xml 20 | 21 | # Gradle 22 | !gradle-wrapper.jar 23 | .gradle/ 24 | build/ 25 | */build/ 26 | 27 | # we use maven! 28 | build.xml 29 | 30 | # Maven 31 | log/ 32 | target/ 33 | dependency-reduced-pom.xml 34 | 35 | # various other potential build files 36 | build/ 37 | bin/ 38 | dist/ 39 | manifest.mf 40 | 41 | # Mac 42 | .DS_Store/ 43 | .DS_Store 44 | 45 | # vim 46 | .*.sw[a-p] 47 | 48 | # Linux temp files 49 | *~ 50 | 51 | # other stuff 52 | run/ 53 | 54 | tentacles-api/build.gradle.kts 55 | tentacles-server/build.gradle.kts 56 | tentacles-server/src/minecraft 57 | purpur-api 58 | purpur-server 59 | paper-api 60 | paper-server 61 | *.jar 62 | test-plugin.settings.gradle.kts 63 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | ===================== 3 | 4 | Permission is hereby granted, free of charge, to any person 5 | obtaining a copy of this software and associated documentation 6 | files (the “Software”), to deal in the Software without 7 | restriction, including without limitation the rights to use, 8 | copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | OTHER DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [Purpur]: https://purpurmc.org 2 | 3 | ## Tentacles 4 | Template to create a mantainable fork of [Purpur]. 5 | 6 | This readme will eventually contain instructions regarding the patch system. For now, visit Purpur's [CONTRIBUTING.md](https://github.com/PurpurMC/Purpur/blob/HEAD/CONTRIBUTING.md). 7 | -------------------------------------------------------------------------------- /build-data/dev-imports.txt: -------------------------------------------------------------------------------- 1 | # You can use this file to import files from minecraft libraries into the project 2 | # format: 3 | # 4 | # both fully qualified and a file based syntax are accepted for : 5 | # authlib com/mojang/authlib/yggdrasil/YggdrasilGameProfileRepository.java 6 | # datafixerupper com.mojang.datafixers.DataFixerBuilder 7 | # datafixerupper com/mojang/datafixers/util/Either.java 8 | # To import classes from the vanilla Minecraft jar use `minecraft` as the artifactId: 9 | # minecraft net.minecraft.world.level.entity.LevelEntityGetterAdapter 10 | # minecraft net/minecraft/world/level/entity/LevelEntityGetter.java 11 | # To import minecraft data files, like the default chat type, use `mc_data` as the prefix: 12 | # mc_data chat_type/chat.json 13 | # mc_data dimension_type/overworld.json 14 | # -------------------------------------------------------------------------------- /build-data/tentacles.at: -------------------------------------------------------------------------------- 1 | # This file is auto generated, any changes may be overridden! 2 | # See CONTRIBUTING.md on how to add access transformers. 3 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.gradle.api.tasks.testing.logging.TestExceptionFormat 2 | import org.gradle.api.tasks.testing.logging.TestLogEvent 3 | 4 | plugins { 5 | java 6 | id("io.papermc.paperweight.patcher") version "2.0.0-beta.16" 7 | } 8 | 9 | val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" 10 | 11 | paperweight { 12 | upstreams.register("purpur") { 13 | repo = github("PurpurMC", "Purpur") 14 | ref = providers.gradleProperty("purpurCommit") 15 | 16 | patchFile { 17 | path = "purpur-server/build.gradle.kts" 18 | outputFile = file("tentacles-server/build.gradle.kts") 19 | patchFile = file("tentacles-server/build.gradle.kts.patch") 20 | } 21 | patchFile { 22 | path = "purpur-api/build.gradle.kts" 23 | outputFile = file("tentacles-api/build.gradle.kts") 24 | patchFile = file("tentacles-api/build.gradle.kts.patch") 25 | } 26 | patchRepo("paperApi") { 27 | upstreamPath = "paper-api" 28 | patchesDir = file("tentacles-api/paper-patches") 29 | outputDir = file("paper-api") 30 | } 31 | patchDir("purpurApi") { 32 | upstreamPath = "purpur-api" 33 | excludes = listOf("build.gradle.kts", "build.gradle.kts.patch", "paper-patches") 34 | patchesDir = file("tentacles-api/purpur-patches") 35 | outputDir = file("purpur-api") 36 | } 37 | } 38 | } 39 | 40 | subprojects { 41 | apply(plugin = "java-library") 42 | apply(plugin = "maven-publish") 43 | 44 | extensions.configure { 45 | toolchain { 46 | languageVersion = JavaLanguageVersion.of(21) 47 | } 48 | } 49 | 50 | repositories { 51 | mavenCentral() 52 | maven(paperMavenPublicUrl) 53 | } 54 | 55 | tasks.withType().configureEach { 56 | isPreserveFileTimestamps = false 57 | isReproducibleFileOrder = true 58 | } 59 | tasks.withType { 60 | options.encoding = Charsets.UTF_8.name() 61 | options.release = 21 62 | options.isFork = true 63 | options.compilerArgs.addAll(listOf("-Xlint:-deprecation", "-Xlint:-removal")) 64 | } 65 | tasks.withType { 66 | options.encoding = Charsets.UTF_8.name() 67 | } 68 | tasks.withType { 69 | filteringCharset = Charsets.UTF_8.name() 70 | } 71 | tasks.withType { 72 | testLogging { 73 | showStackTraces = true 74 | exceptionFormat = TestExceptionFormat.FULL 75 | events(TestLogEvent.STANDARD_OUT) 76 | } 77 | } 78 | 79 | extensions.configure { 80 | repositories { 81 | maven("https://repo.purpurmc.org/snapshots") { 82 | name = "tentacles" 83 | credentials(PasswordCredentials::class) 84 | } 85 | } 86 | } 87 | } 88 | 89 | tasks.register("printMinecraftVersion") { 90 | doLast { 91 | println(providers.gradleProperty("mcVersion").get().trim()) 92 | } 93 | } 94 | 95 | tasks.register("printTentaclesVersion") { 96 | doLast { 97 | println(project.version) 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | group = org.purpurmc.tentacles 2 | version = 1.21.5-R0.1-SNAPSHOT 3 | 4 | mcVersion=1.21.5 5 | purpurCommit = 4fdf1d117cc32d0b125d7a67378a50d1d3ff44de 6 | 7 | org.gradle.caching = true 8 | org.gradle.parallel = true 9 | org.gradle.vfs.watch = false 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PurpurMC/Tentacles/1911d9727cc197920c0063062fc059ae55bf8c68/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | # This is normally unused 84 | # shellcheck disable=SC2034 85 | APP_BASE_NAME=${0##*/} 86 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 87 | APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit 88 | 89 | # Use the maximum available, or set MAX_FD != -1 to use that value. 90 | MAX_FD=maximum 91 | 92 | warn () { 93 | echo "$*" 94 | } >&2 95 | 96 | die () { 97 | echo 98 | echo "$*" 99 | echo 100 | exit 1 101 | } >&2 102 | 103 | # OS specific support (must be 'true' or 'false'). 104 | cygwin=false 105 | msys=false 106 | darwin=false 107 | nonstop=false 108 | case "$( uname )" in #( 109 | CYGWIN* ) cygwin=true ;; #( 110 | Darwin* ) darwin=true ;; #( 111 | MSYS* | MINGW* ) msys=true ;; #( 112 | NONSTOP* ) nonstop=true ;; 113 | esac 114 | 115 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 116 | 117 | 118 | # Determine the Java command to use to start the JVM. 119 | if [ -n "$JAVA_HOME" ] ; then 120 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 121 | # IBM's JDK on AIX uses strange locations for the executables 122 | JAVACMD=$JAVA_HOME/jre/sh/java 123 | else 124 | JAVACMD=$JAVA_HOME/bin/java 125 | fi 126 | if [ ! -x "$JAVACMD" ] ; then 127 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 128 | 129 | Please set the JAVA_HOME variable in your environment to match the 130 | location of your Java installation." 131 | fi 132 | else 133 | JAVACMD=java 134 | if ! command -v java >/dev/null 2>&1 135 | then 136 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 137 | 138 | Please set the JAVA_HOME variable in your environment to match the 139 | location of your Java installation." 140 | fi 141 | fi 142 | 143 | # Increase the maximum file descriptors if we can. 144 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 145 | case $MAX_FD in #( 146 | max*) 147 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 148 | # shellcheck disable=SC3045 149 | MAX_FD=$( ulimit -H -n ) || 150 | warn "Could not query maximum file descriptor limit" 151 | esac 152 | case $MAX_FD in #( 153 | '' | soft) :;; #( 154 | *) 155 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 156 | # shellcheck disable=SC3045 157 | ulimit -n "$MAX_FD" || 158 | warn "Could not set maximum file descriptor limit to $MAX_FD" 159 | esac 160 | fi 161 | 162 | # Collect all arguments for the java command, stacking in reverse order: 163 | # * args from the command line 164 | # * the main class name 165 | # * -classpath 166 | # * -D...appname settings 167 | # * --module-path (only if needed) 168 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 169 | 170 | # For Cygwin or MSYS, switch paths to Windows format before running java 171 | if "$cygwin" || "$msys" ; then 172 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 173 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 174 | 175 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 176 | 177 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 178 | for arg do 179 | if 180 | case $arg in #( 181 | -*) false ;; # don't mess with options #( 182 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 183 | [ -e "$t" ] ;; #( 184 | *) false ;; 185 | esac 186 | then 187 | arg=$( cygpath --path --ignore --mixed "$arg" ) 188 | fi 189 | # Roll the args list around exactly as many times as the number of 190 | # args, so each arg winds up back in the position where it started, but 191 | # possibly modified. 192 | # 193 | # NB: a `for` loop captures its iteration list before it begins, so 194 | # changing the positional parameters here affects neither the number of 195 | # iterations, nor the values presented in `arg`. 196 | shift # remove old arg 197 | set -- "$@" "$arg" # push replacement arg 198 | done 199 | fi 200 | 201 | 202 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 203 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 204 | 205 | # Collect all arguments for the java command; 206 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of 207 | # shell script including quotes and variable substitutions, so put them in 208 | # double quotes to make sure that they get re-expanded; and 209 | # * put everything else in single quotes, so that it's not re-expanded. 210 | 211 | set -- \ 212 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 213 | -classpath "$CLASSPATH" \ 214 | org.gradle.wrapper.GradleWrapperMain \ 215 | "$@" 216 | 217 | # Stop when "xargs" is not available. 218 | if ! command -v xargs >/dev/null 2>&1 219 | then 220 | die "xargs is not available" 221 | fi 222 | 223 | # Use "xargs" to parse quoted args. 224 | # 225 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 226 | # 227 | # In Bash we could simply go: 228 | # 229 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 230 | # set -- "${ARGS[@]}" "$@" 231 | # 232 | # but POSIX shell has neither arrays nor command substitution, so instead we 233 | # post-process each arg (as a line of input to sed) to backslash-escape any 234 | # character that might be a shell metacharacter, then use eval to reverse 235 | # that process (while maintaining the separation between arguments), and wrap 236 | # the whole thing up as a single "set" statement. 237 | # 238 | # This will of course break if any of these variables contains a newline or 239 | # an unmatched quote. 240 | # 241 | 242 | eval "set -- $( 243 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 244 | xargs -n1 | 245 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 246 | tr '\n' ' ' 247 | )" '"$@"' 248 | 249 | exec "$JAVACMD" "$@" 250 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | @rem This is normally unused 30 | set APP_BASE_NAME=%~n0 31 | set APP_HOME=%DIRNAME% 32 | 33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 35 | 36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 38 | 39 | @rem Find java.exe 40 | if defined JAVA_HOME goto findJavaFromJavaHome 41 | 42 | set JAVA_EXE=java.exe 43 | %JAVA_EXE% -version >NUL 2>&1 44 | if %ERRORLEVEL% equ 0 goto execute 45 | 46 | echo. 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 48 | echo. 49 | echo Please set the JAVA_HOME variable in your environment to match the 50 | echo location of your Java installation. 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto execute 59 | 60 | echo. 61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 62 | echo. 63 | echo Please set the JAVA_HOME variable in your environment to match the 64 | echo location of your Java installation. 65 | 66 | goto fail 67 | 68 | :execute 69 | @rem Setup the command line 70 | 71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 72 | 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if %ERRORLEVEL% equ 0 goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | set EXIT_CODE=%ERRORLEVEL% 85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 87 | exit /b %EXIT_CODE% 88 | 89 | :mainEnd 90 | if "%OS%"=="Windows_NT" endlocal 91 | 92 | :omega 93 | -------------------------------------------------------------------------------- /scripts/apatch.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | gitcmd="git -c commit.gpgsign=false" 4 | 5 | noapply=1 6 | isreject=0 7 | if [[ $1 == "--noapplied" ]]; then 8 | noapply=1 9 | shift 10 | fi 11 | 12 | if [ ! -z "$1" ]; then 13 | file="$1" 14 | elif [ -z "$1" ] && [ -f .git/rebase-apply/patch ]; then 15 | file=".git/rebase-apply/patch" 16 | noapply=1 17 | isreject=1 18 | else 19 | echo "Please specify a file" 20 | exit 1 21 | fi 22 | applied=$(echo $file | sed 's/.patch$/-applied\.patch/g') 23 | if [ "$1" == "--reset" ]; then 24 | $gitcmd am --abort 25 | $gitcmd reset --hard 26 | $gitcmd clean -f 27 | exit 0 28 | fi 29 | 30 | 31 | (test "$isreject" != "1" && $gitcmd am -3 $file) || ( 32 | echo "Failures - Wiggling" 33 | $gitcmd reset --hard 34 | $gitcmd clean -f 35 | errors=$($gitcmd apply --rej $file 2>&1) 36 | echo "$errors" >> ~/patch.log 37 | export missingfiles="" 38 | export summaryfail="" 39 | export summarygood="" 40 | for i in $(find . -name \*.rej); do 41 | base=$(echo "$i" | sed 's/.rej//g') 42 | if [ -f "$i" ]; then 43 | sed -e 's/^diff a\/\(.*\) b\/\(.*\)[[:space:]].*rejected.*$/--- \1\n+++ \2/' -i $i && wiggle -v -l --replace "$base" "$i" 44 | rm "$base.porig" "$i" 45 | else 46 | echo "No such file: $base" 47 | missingfiles="$missingfiles\n$base" 48 | fi 49 | done 50 | for i in $($gitcmd status --porcelain | awk '{print $2}'); do 51 | filedata=$(cat "$i") 52 | if [ -f "$file" ] && [[ "$filedata" == *"<<<<<"* ]]; then 53 | export summaryfail="$summaryfail\nFAILED TO APPLY: $i" 54 | else 55 | $gitcmd add --force "$i" 56 | export summarygood="$summarygood\nAPPLIED CLEAN: $i" 57 | fi 58 | done 59 | echo -e "$summarygood" 60 | echo -e "$summaryfail" 61 | if [[ "$errors" == *"No such file"* ]]; then 62 | echo "==========================="; 63 | echo " " 64 | echo " MISSING FILES" 65 | echo $(echo "$errors" | grep "No such file") 66 | echo -e "$missingfiles" 67 | echo " " 68 | echo "==========================="; 69 | fi 70 | $gitcmd status 71 | $gitcmd diff 72 | ) 73 | if [[ "$noapply" != "1" ]] && [[ "$file" != *-applied.patch ]]; then 74 | mv "$file" "$applied" 75 | fi 76 | -------------------------------------------------------------------------------- /scripts/updateUpstream.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # file utilized in github actions to automatically update upstream 4 | 5 | ( 6 | set -e 7 | PS1="$" 8 | 9 | current=$(cat gradle.properties | grep purpurCommit | sed 's/purpurCommit = //') 10 | upstream=$(git ls-remote https://github.com/PurpurMC/Purpur | grep ver/1.21.5 | cut -f 1) 11 | 12 | if [ "$current" != "$upstream" ]; then 13 | sed -i 's/purpurCommit = .*/purpurCommit = '"$upstream"'/' gradle.properties 14 | { 15 | ./gradlew applyAllPatches --stacktrace && ./gradlew build --stacktrace && ./gradlew rebuildPurpurPatches --stacktrace && ./gradlew rebuildAllServerPatches --stacktrace 16 | } || exit 17 | 18 | git add . 19 | ./scripts/upstreamCommit.sh "$current" 20 | fi 21 | 22 | ) || exit 1 23 | -------------------------------------------------------------------------------- /scripts/upstreamCommit.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # requires curl & jq 4 | 5 | # upstreamCommit 6 | # param: bashHash - the commit hash to use for comparing commits (baseHash...HEAD) 7 | 8 | ( 9 | set -e 10 | PS1="$" 11 | 12 | purpur=$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/PurpurMC/Purpur/compare/$1...ver/1.21.5 | jq -r '.commits[] | "PurpurMC/Purpur@\(.sha[:7]) \(.commit.message | split("\r\n")[0] | split("\n")[0])"') 13 | 14 | updated="" 15 | logsuffix="" 16 | if [ ! -z "$purpur" ]; then 17 | logsuffix="$logsuffix\n\nPurpur Changes:\n$purpur" 18 | updated="Purpur" 19 | fi 20 | disclaimer="Upstream has released updates that appear to apply and compile correctly" 21 | 22 | log="${UP_LOG_PREFIX}Updated Upstream ($updated)\n\n${disclaimer}${logsuffix}" 23 | 24 | echo -e "$log" | git commit -F - 25 | 26 | ) || exit 1 27 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | import java.util.Locale 2 | 3 | pluginManagement { 4 | repositories { 5 | gradlePluginPortal() 6 | maven("https://repo.papermc.io/repository/maven-public/") 7 | } 8 | } 9 | 10 | plugins { 11 | id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0" 12 | } 13 | 14 | if (!file(".git").exists()) { 15 | val errorText = """ 16 | 17 | =====================[ ERROR ]===================== 18 | The Tentacles project directory is not a properly cloned Git repository. 19 | 20 | In order to build Tentacles from source you must clone 21 | the repository using Git, not download a code zip from GitHub. 22 | 23 | See https://github.com/PurpurMC/Purpur/blob/HEAD/CONTRIBUTING.md 24 | for further information on building and modifying Purpur. 25 | =================================================== 26 | """.trimIndent() 27 | error(errorText) 28 | } 29 | 30 | rootProject.name = "tentacles" 31 | 32 | for (name in listOf("tentacles-api", "tentacles-server")) { 33 | val projName = name.lowercase(Locale.ENGLISH) 34 | include(projName) 35 | findProject(":$projName")!!.projectDir = file(name) 36 | } 37 | 38 | optionalInclude("test-plugin") 39 | 40 | fun optionalInclude(name: String, op: (ProjectDescriptor.() -> Unit)? = null) { 41 | val settingsFile = file("$name.settings.gradle.kts") 42 | if (settingsFile.exists()) { 43 | apply(from = settingsFile) 44 | findProject(":$name")?.let { op?.invoke(it) } 45 | } else { 46 | settingsFile.writeText( 47 | """ 48 | // Uncomment to enable the '$name' project 49 | // include(":$name") 50 | 51 | """.trimIndent() 52 | ) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /tentacles-api/build.gradle.kts.patch: -------------------------------------------------------------------------------- 1 | --- a/purpur-api/build.gradle.kts 2 | +++ b/purpur-api/build.gradle.kts 3 | @@ -104,17 +_,21 @@ 4 | java { 5 | srcDir(generatedDir) 6 | srcDir(file("../paper-api/src/main/java")) 7 | + srcDir(file("../purpur-api/src/main/java")) 8 | } 9 | resources { 10 | srcDir(file("../paper-api/src/main/resources")) 11 | + srcDir(file("../purpur-api/src/main/resources")) 12 | } 13 | } 14 | test { 15 | java { 16 | srcDir(file("../paper-api/src/test/java")) 17 | + srcDir(file("../purpur-api/src/test/java")) 18 | } 19 | resources { 20 | srcDir(file("../paper-api/src/test/resources")) 21 | + srcDir(file("../purpur-api/src/test/resources")) 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /tentacles-api/paper-patches/features/0001-Rebrand.patch: -------------------------------------------------------------------------------- 1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 2 | From: GideonWhite1029 3 | Date: Fri, 11 Apr 2025 10:35:11 +0300 4 | Subject: [PATCH] Rebrand 5 | 6 | 7 | diff --git a/src/main/java/io/papermc/paper/ServerBuildInfo.java b/src/main/java/io/papermc/paper/ServerBuildInfo.java 8 | index fb1fe2651e53a9bf46b3632c638e13eea9dcda93..3681474fda6094cfe578a1a0541ee051eb2546c4 100644 9 | --- a/src/main/java/io/papermc/paper/ServerBuildInfo.java 10 | +++ b/src/main/java/io/papermc/paper/ServerBuildInfo.java 11 | @@ -25,6 +25,12 @@ public interface ServerBuildInfo { 12 | */ 13 | Key BRAND_PURPUR_ID = Key.key("purpurmc", "purpur"); 14 | // Purpur end 15 | + // Tentacles start 16 | + /** 17 | + * The brand id for Tentacles. 18 | + */ 19 | + Key BRAND_TENTACLES_ID = Key.key("tentaclesmc", "tentacles"); 20 | + // Tentacles end 21 | /** 22 | * Gets the {@code ServerBuildInfo}. 23 | * 24 | diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java 25 | index 52f65c556f23b65560f33a169f709fb0d405cfba..b44b70ab5036baf0e075f5ae9ccfacb9b6c30361 100644 26 | --- a/src/main/java/org/bukkit/Server.java 27 | +++ b/src/main/java/org/bukkit/Server.java 28 | @@ -2380,6 +2380,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi 29 | } 30 | // Purpur end 31 | 32 | + // Tentacles start 33 | + @NotNull 34 | + public org.bukkit.configuration.file.YamlConfiguration getTentaclesConfig() { 35 | + throw new UnsupportedOperationException("Not supported yet."); 36 | + } 37 | + // Tentacles end 38 | + 39 | /** 40 | * Sends the component to the player 41 | * 42 | -------------------------------------------------------------------------------- /tentacles-server/build.gradle.kts.patch: -------------------------------------------------------------------------------- 1 | --- a/purpur-server/build.gradle.kts 2 | +++ b/purpur-server/build.gradle.kts 3 | @@ -37,9 +_,33 @@ 4 | outputDir = rootDirectory.dir("paper-server") 5 | } 6 | } 7 | - activeFork = purpur 8 | + //activeFork = purpur // Tentacles 9 | // Purpur end - Rebrand 10 | 11 | + // Tentacles start - Rebrand 12 | + val tentacles = forks.register("tentacles") { 13 | + forks = purpur 14 | + upstream.patchRepo("paperServer") { 15 | + upstreamRepo = purpur.patchedRepo("paperServer") 16 | + patchesDir = rootDirectory.dir("tentacles-server/paper-patches") 17 | + outputDir = rootDirectory.dir("paper-server") 18 | + } 19 | + upstream.patchDir("purpurServer") { 20 | + upstreamPath = "purpur-server" 21 | + excludes = setOf( 22 | + "src/minecraft", 23 | + "paper-patches", 24 | + "minecraft-patches", 25 | + "build.gradle.kts", 26 | + "build.gradle.kts.patch" 27 | + ) 28 | + patchesDir = rootDirectory.dir("tentacles-server/purpur-patches") 29 | + outputDir = rootDirectory.dir("purpur-server") 30 | + } 31 | + } 32 | + activeFork = tentacles 33 | + // Tentacles end - Rebrand 34 | + 35 | spigot { 36 | buildDataRef = "702e1a0a5072b2c4082371d5228cb30525687efc" 37 | packageVersion = "v1_21_R4" // also needs to be updated in MappingEnvironment 38 | @@ -125,10 +_,14 @@ 39 | main { 40 | java { srcDir("../paper-server/src/main/java") } 41 | resources { srcDir("../paper-server/src/main/resources") } 42 | + java { srcDir("../purpur-server/src/main/java") } 43 | + resources { srcDir("../purpur-server/src/main/resources") } 44 | } 45 | test { 46 | java { srcDir("../paper-server/src/test/java") } 47 | resources { srcDir("../paper-server/src/test/resources") } 48 | + java { srcDir("../purpur-server/src/test/java") } 49 | + resources { srcDir("../purpur-server/src/test/resources") } 50 | } 51 | } 52 | val log4jPlugins = sourceSets.create("log4jPlugins") { 53 | @@ -156,7 +_,7 @@ 54 | } 55 | 56 | dependencies { 57 | - implementation(project(":purpur-api")) // Purpur 58 | + implementation(project(":tentacles-api")) // Purpur // Tentacles 59 | implementation("ca.spottedleaf:concurrentutil:0.0.3") 60 | implementation("org.jline:jline-terminal-ffm:3.27.1") // use ffm on java 22+ 61 | implementation("org.jline:jline-terminal-jni:3.27.1") // fall back to jni on java 21 62 | @@ -236,14 +_,14 @@ 63 | val gitBranch = git.exec(providers, "rev-parse", "--abbrev-ref", "HEAD").get().trim() 64 | attributes( 65 | "Main-Class" to "org.bukkit.craftbukkit.Main", 66 | - "Implementation-Title" to "Purpur", // Purpur 67 | + "Implementation-Title" to "Tentacles", // Purpur // Tentacles 68 | "Implementation-Version" to implementationVersion, 69 | "Implementation-Vendor" to date, 70 | - "Specification-Title" to "Purpur", // Purpur 71 | + "Specification-Title" to "Tentacles", // Purpur // Tentacles 72 | "Specification-Version" to project.version, 73 | - "Specification-Vendor" to "Purpur Team", // Purpur 74 | - "Brand-Id" to "purpurmc:purpur", // Purpur 75 | - "Brand-Name" to "Purpur", // Purpur 76 | + "Specification-Vendor" to "Tentacles Team", // Purpur // Tentacles 77 | + "Brand-Id" to "tentaclesmc:tentacles", // Purpur // Tentacles 78 | + "Brand-Name" to "Tentacles", // Purpur // Tentacles 79 | "Build-Number" to (build ?: ""), 80 | "Build-Time" to buildTime.toString(), 81 | "Git-Branch" to gitBranch, 82 | -------------------------------------------------------------------------------- /tentacles-server/paper-patches/features/0001-Rebrand.patch: -------------------------------------------------------------------------------- 1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 2 | From: GideonWhite1029 3 | Date: Fri, 11 Apr 2025 10:35:57 +0300 4 | Subject: [PATCH] Rebrand 5 | 6 | 7 | diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java 8 | index 6ac291288f1e71f56a45e50b650dea4b4adeb763..bf627be29b75236fe037bd8059b0b0476bc508eb 100644 9 | --- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java 10 | +++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java 11 | @@ -36,7 +36,7 @@ public class PaperVersionFetcher implements VersionFetcher { 12 | private static final int DISTANCE_ERROR = -1; 13 | private static final int DISTANCE_UNKNOWN = -2; 14 | // Purpur start - Rebrand 15 | - private static final String DOWNLOAD_PAGE = "https://purpurmc.org/downloads"; 16 | + private static final String DOWNLOAD_PAGE = "https://api.example.com/nonexistent/downloads"; // Tentacles 17 | private static int distance = DISTANCE_UNKNOWN; public int distance() { return distance; } 18 | // Purpur end - Rebrand 19 | 20 | @@ -52,7 +52,7 @@ public class PaperVersionFetcher implements VersionFetcher { 21 | if (build.buildNumber().isEmpty() && build.gitCommit().isEmpty()) { 22 | updateMessage = text("You are running a development version without access to version information", color(0xFF5300)); 23 | } else { 24 | - updateMessage = getUpdateStatusMessage("PurpurMC/Purpur", build); // Purpur - Rebrand 25 | + updateMessage = getUpdateStatusMessage("PurpurMC/Tentacles", build); // Purpur - Rebrand // Tentacles 26 | } 27 | final @Nullable Component history = this.getHistory(); 28 | 29 | @@ -62,16 +62,18 @@ public class PaperVersionFetcher implements VersionFetcher { 30 | private static Component getUpdateStatusMessage(final String repo, final ServerBuildInfo build) { 31 | //int distance = DISTANCE_ERROR; // Purpur - use field - Rebrand 32 | 33 | + /* // Tentacles start 34 | final OptionalInt buildNumber = build.buildNumber(); 35 | if (buildNumber.isPresent()) { 36 | distance = fetchDistanceFromSiteApi(build, buildNumber.getAsInt()); 37 | } else { 38 | + */ // Tentacles end 39 | final Optional gitBranch = build.gitBranch(); 40 | final Optional gitCommit = build.gitCommit(); 41 | if (gitBranch.isPresent() && gitCommit.isPresent()) { 42 | distance = fetchDistanceFromGitHub(repo, gitBranch.get(), gitCommit.get()); 43 | } 44 | - } 45 | + //} // Tentacles 46 | 47 | return switch (distance) { 48 | case DISTANCE_ERROR -> text("* Error obtaining version information", NamedTextColor.RED); // Purpur - Rebrand 49 | @@ -89,7 +91,7 @@ public class PaperVersionFetcher implements VersionFetcher { 50 | private static int fetchDistanceFromSiteApi(final ServerBuildInfo build, final int jenkinsBuild) { 51 | try { 52 | try (final BufferedReader reader = Resources.asCharSource( 53 | - URI.create("https://api.purpurmc.org/v2/purpur/" + build.minecraftVersionId()).toURL(), // Purpur - Rebrand 54 | + URI.create("https://api.example.com/nonexistent/" + build.minecraftVersionId()).toURL(), // Purpur - Rebrand // Tentacles 55 | StandardCharsets.UTF_8 56 | ).openBufferedStream()) { 57 | final JsonObject json = new Gson().fromJson(reader, JsonObject.class); 58 | @@ -97,7 +99,7 @@ public class PaperVersionFetcher implements VersionFetcher { 59 | final int latest = json.getAsJsonObject("builds").getAsJsonPrimitive("latest").getAsInt(); // Purpur - Rebrand 60 | return latest - jenkinsBuild; 61 | } catch (final JsonSyntaxException ex) { 62 | - LOGGER.error("Error parsing json from Purpur's downloads API", ex); // Purpur - Rebrand 63 | + LOGGER.error("Error parsing json from nonexistent downloads API", ex); // Purpur - Rebrand // Tentacles 64 | return DISTANCE_ERROR; 65 | } 66 | } catch (final IOException e) { 67 | diff --git a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java 68 | index bc7e4e5560708fea89c584b1d8b471f4966f311a..cd548a2a63ad99c0d91eeb7bb4600efd50ae4da6 100644 69 | --- a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java 70 | +++ b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java 71 | @@ -20,7 +20,7 @@ public final class PaperConsole extends SimpleTerminalConsole { 72 | @Override 73 | protected LineReader buildReader(LineReaderBuilder builder) { 74 | builder 75 | - .appName("Purpur") // Purpur - Rebrand 76 | + .appName("Tentacles") // Purpur - Rebrand // Tentacles 77 | .variable(LineReader.HISTORY_FILE, java.nio.file.Paths.get(".console_history")) 78 | .completer(new ConsoleCommandCompleter(this.server)) 79 | .option(LineReader.Option.COMPLETE_IN_WORD, true); 80 | diff --git a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java 81 | index b36e30fd4057a938e4d90cb42a2dca661f16478e..2bc6dfa41f76203320ff60b248dfa68e2acea12b 100644 82 | --- a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java 83 | +++ b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java 84 | @@ -32,6 +32,7 @@ public record ServerBuildInfoImpl( 85 | 86 | private static final String BRAND_PAPER_NAME = "Paper"; 87 | private static final String BRAND_PURPUR_NAME = "Purpur"; // Purpur - Rebrand 88 | + private static final String BRAND_TENTACLES_NAME = "Tentacles"; // Tentacles 89 | 90 | private static final String BUILD_DEV = "DEV"; 91 | 92 | @@ -43,9 +44,9 @@ public record ServerBuildInfoImpl( 93 | this( 94 | getManifestAttribute(manifest, ATTRIBUTE_BRAND_ID) 95 | .map(Key::key) 96 | - .orElse(BRAND_PURPUR_ID), // Purpur - Fix pufferfish issues // Purpur - Rebrand 97 | + .orElse(BRAND_TENTACLES_ID), // Purpur - Fix pufferfish issues // Purpur - Rebrand // Tentacles 98 | getManifestAttribute(manifest, ATTRIBUTE_BRAND_NAME) 99 | - .orElse(BRAND_PURPUR_NAME), // Purpur - Fix pufferfish issues // Purpur - Rebrand 100 | + .orElse(BRAND_TENTACLES_NAME), // Purpur - Fix pufferfish issues // Purpur - Rebrand 101 | SharedConstants.getCurrentVersion().getId(), 102 | SharedConstants.getCurrentVersion().getName(), 103 | getManifestAttribute(manifest, ATTRIBUTE_BUILD_NUMBER) 104 | @@ -62,7 +63,7 @@ public record ServerBuildInfoImpl( 105 | 106 | @Override 107 | public boolean isBrandCompatible(final @NotNull Key brandId) { 108 | - return brandId.equals(this.brandId) || brandId.equals(BRAND_PAPER_ID); // Purpur - Fix pufferfish issues // Purpur - Rebrand 109 | + return brandId.equals(this.brandId) || brandId.equals(BRAND_PAPER_ID) || brandId.equals(BRAND_PURPUR_ID); // Purpur - Fix pufferfish issues // Purpur - Rebrand // Tentacles 110 | } 111 | 112 | @Override 113 | diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java 114 | index 2e7c3d4befeb6256ce81ecaa9ed4e8fbcb21651e..b141d13265063500d915f848697c2e8d3dd44d6e 100644 115 | --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java 116 | +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java 117 | @@ -491,7 +491,7 @@ public class CraftScheduler implements BukkitScheduler { 118 | this.parsePending(); 119 | } else { 120 | // this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(this.currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper 121 | - task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Purpur"); // Paper // Purpur - Rebrand 122 | + task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Tentacles"); // Paper // Purpur - Rebrand // Tentacles 123 | // We don't need to parse pending 124 | // (async tasks must live with race-conditions if they attempt to cancel between these few lines of code) 125 | } 126 | diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java 127 | index 99eb04643fce44c37fd96c99756837ccafe7b559..49111df856edb29cf351a4b71348a639c2da7239 100644 128 | --- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java 129 | +++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java 130 | @@ -11,7 +11,7 @@ public final class Versioning { 131 | public static String getBukkitVersion() { 132 | String result = "Unknown-Version"; 133 | 134 | - InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Pufferfish // Purpur - Rebrand 135 | + InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.tentacles/tentacles-api/pom.properties"); // Pufferfish // Purpur - Rebrand // Tentacles 136 | Properties properties = new Properties(); 137 | 138 | if (stream != null) { 139 | diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java 140 | index b8b5c2da54a4875d0d23ae6f3efb6052ef25463a..48eee291e72b7fcf9bac0dcbb3c5f32fef107a47 100644 141 | --- a/src/main/java/org/spigotmc/WatchdogThread.java 142 | +++ b/src/main/java/org/spigotmc/WatchdogThread.java 143 | @@ -75,14 +75,14 @@ public class WatchdogThread extends ca.spottedleaf.moonrise.common.util.TickThre 144 | this.lastEarlyWarning = currentTime; 145 | if (isLongTimeout) { 146 | logger.log(Level.SEVERE, "------------------------------"); 147 | - logger.log(Level.SEVERE, "The server has stopped responding! This is (probably) not a Purpur bug."); // Paper // Purpur - Rebrand 148 | + logger.log(Level.SEVERE, "The server has stopped responding! This is (probably) not a Tentacles bug."); // Paper // Purpur - Rebrand // Tentacles 149 | logger.log(Level.SEVERE, "If you see a plugin in the Server thread dump below, then please report it to that author"); 150 | logger.log(Level.SEVERE, "\t *Especially* if it looks like HTTP or MySQL operations are occurring"); 151 | logger.log(Level.SEVERE, "If you see a world save or edit, then it means you did far more than your server can handle at once"); 152 | logger.log(Level.SEVERE, "\t If this is the case, consider increasing timeout-time in spigot.yml but note that this will replace the crash with LARGE lag spikes"); 153 | - logger.log(Level.SEVERE, "If you are unsure or still think this is a Purpur bug, please report this to https://github.com/PurpurMC/Purpur/issues"); // Purpur - Rebrand 154 | + logger.log(Level.SEVERE, "If you are unsure or still think this is a Tentacles bug, please report this to https://github.com/PurpurMC/Tentacles/issues"); // Purpur - Rebrand // Tentacles 155 | logger.log(Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports"); 156 | - logger.log(Level.SEVERE, "Purpur version: " + Bukkit.getServer().getVersion()); // Purpur - Rebrand 157 | + logger.log(Level.SEVERE, "Tentacles version: " + Bukkit.getServer().getVersion()); // Purpur - Rebrand // Tentacles 158 | 159 | if (net.minecraft.world.level.Level.lastPhysicsProblem != null) { 160 | logger.log(Level.SEVERE, "------------------------------"); 161 | @@ -102,7 +102,7 @@ public class WatchdogThread extends ca.spottedleaf.moonrise.common.util.TickThre 162 | } 163 | // Paper end 164 | } else { 165 | - logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Purpur - Rebrand 166 | + logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO TENTACLES - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Purpur - Rebrand // Tentacles 167 | logger.log(Level.SEVERE, "The server has not responded for " + (currentTime - lastTick) / 1000 + " seconds! Creating thread dump"); 168 | } 169 | // Paper end - Different message for short timeout 170 | @@ -120,7 +120,7 @@ public class WatchdogThread extends ca.spottedleaf.moonrise.common.util.TickThre 171 | WatchdogThread.dumpThread(thread, logger); 172 | } 173 | } else { 174 | - logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH ---"); // Purpur - Rebrand 175 | + logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO TENTACLES - THIS IS NOT A BUG OR A CRASH ---"); // Purpur - Rebrand // Tentacles 176 | } 177 | 178 | logger.log(Level.SEVERE, "------------------------------"); 179 | -------------------------------------------------------------------------------- /test-plugin/build.gradle.kts: -------------------------------------------------------------------------------- 1 | version = "1.0.0-SNAPSHOT" 2 | 3 | dependencies { 4 | compileOnly(project(":tentacles-api")) 5 | } 6 | 7 | tasks.processResources { 8 | val apiVersion = rootProject.providers.gradleProperty("mcVersion").get() 9 | val props = mapOf( 10 | "version" to project.version, 11 | "apiversion" to "\"$apiVersion\"", 12 | ) 13 | inputs.properties(props) 14 | filesMatching("paper-plugin.yml") { 15 | expand(props) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test-plugin/src/main/java/org/purpurmc/testplugin/TestPlugin.java: -------------------------------------------------------------------------------- 1 | package org.purpurmc.testplugin; 2 | 3 | import org.bukkit.event.Listener; 4 | import org.bukkit.plugin.java.JavaPlugin; 5 | 6 | public class TestPlugin extends JavaPlugin implements Listener { 7 | 8 | @Override 9 | public void onEnable() { 10 | this.getServer().getPluginManager().registerEvents(this, this); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /test-plugin/src/main/java/org/purpurmc/testplugin/TestPluginBootstrap.java: -------------------------------------------------------------------------------- 1 | package org.purpurmc.testplugin; 2 | 3 | public class TestPluginBootstrap { 4 | } 5 | -------------------------------------------------------------------------------- /test-plugin/src/main/java/org/purpurmc/testplugin/TestPluginLoader.java: -------------------------------------------------------------------------------- 1 | package org.purpurmc.testplugin; 2 | 3 | public class TestPluginLoader { 4 | } 5 | -------------------------------------------------------------------------------- /test-plugin/src/main/resources/paper-plugin.yml: -------------------------------------------------------------------------------- 1 | name: Tentacles-Test-Plugin 2 | version: ${version} 3 | main: org.purpurmc.testplugin.TestPlugin 4 | description: Purpur Test Plugin 5 | author: TentaclesMC 6 | api-version: ${apiversion} 7 | load: STARTUP 8 | #bootstrapper: org.purpurmc.testplugin.TestPluginBootstrap 9 | #loader: org.purpurmc.testplugin.TestPluginLoader 10 | defaultPerm: FALSE 11 | permissions: 12 | dependencies: 13 | --------------------------------------------------------------------------------