diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3fe7fd56..9606f20c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,7 @@ on: push: branches: - 'master' + - 'dev/paper-modules' # TODO remove later tags-ignore: - '**' paths-ignore: @@ -21,14 +22,11 @@ jobs: with: distribution: 'temurin' java-version: '21' - cache: 'maven' - # Install Spigot dependencies if necessary. - - name: Install Spigot Dependencies - run: . scripts/install_spigot_dependencies.sh + - uses: gradle/actions/setup-gradle@v4 - - name: Build With Maven - run: mvn -e clean package -am -P all + - name: Build with Gradle + run: ./gradlew build # Upload artifacts - name: Upload Distributable Jar @@ -36,10 +34,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: dist - path: ./target/*.jar - - name: Upload API Jar - id: upload-api - uses: actions/upload-artifact@v4 - with: - name: api - path: ./api/target/openinvapi*.jar + path: ./dist/* diff --git a/.github/workflows/draft_release.yml b/.github/workflows/draft_release.yml index 93cf9e26..f0612b57 100644 --- a/.github/workflows/draft_release.yml +++ b/.github/workflows/draft_release.yml @@ -12,26 +12,12 @@ jobs: needs: [ run-ci ] runs-on: ubuntu-latest steps: - # Fetch all history - used to assemble changelog. - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set Release Variables - run: bash ./scripts/set_release_env.sh - - name: Download build uses: actions/download-artifact@v4 with: name: dist path: dist - - name: Package resource pack - run: |- - pushd resource-pack - zip -r ../dist/openinv-legibility-pack.zip . - popd - - name: Create Release id: create-release uses: softprops/action-gh-release@v2.2.1 @@ -39,7 +25,19 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: name: ${{ env.VERSIONED_NAME }} - body: ${{ env.GENERATED_CHANGELOG }} + # TODO fetch from Gradle? + # May actually want to manually specify Paper versions all the time; they won't all + # need to be specified in code thanks to Mojang-mapped server internals. + # A bit annoying, but not terribly so. + # Instead, fetch min and max (which will also be Spigot version) and manually list intermediate versions? + body: |- + ## Supported server versions + ### Paper + TODO COMMA-SEPARATED VERSIONS + ### Spigot + TODO VERSION + + TODO HELLO HUMAN, PRESS THE GENERATE CHANGELOG BUTTON PLEASE. draft: true prerelease: false files: ./dist/** diff --git a/.github/workflows/external_release.yml b/.github/workflows/external_release.yml index 87a2d692..a6b5b15b 100644 --- a/.github/workflows/external_release.yml +++ b/.github/workflows/external_release.yml @@ -23,6 +23,7 @@ jobs: - name: Set CurseForge Variables run: . scripts/set_curseforge_env.sh "${{ github.event.release.body }}" + # TODO Investigate swap to Kir-Antipov/mc-publish - name: Create CurseForge Release uses: itsmeow/curseforge-upload@v3 with: @@ -34,4 +35,4 @@ jobs: game_versions: "${{ env.CURSEFORGE_MINECRAFT_VERSIONS }}" release_type: release changelog_type: markdown - changelog: "${{ env.CURSEFORGE_CHANGELOG }}" + changelog: "${{ github.event.release.body }}" diff --git a/.github/workflows/resource_pack_ci.yml b/.github/workflows/resource_pack_ci.yml index 557701ac..824248ae 100644 --- a/.github/workflows/resource_pack_ci.yml +++ b/.github/workflows/resource_pack_ci.yml @@ -20,5 +20,5 @@ jobs: uses: actions/upload-artifact@v4 with: name: openinv-legibility-pack - path: ./resource-pack/ + path: ./resource-pack/openinv-legibility-pack/ compression-level: 9 diff --git a/.gitignore b/.gitignore index b48a4778..27ac0af7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,12 @@ **/.project **/.classpath **/.idea/ +**/.gradle/ **.iml **/target/ **/bin/ **/out/ +**/build/ +**/dist/ **/dependency-reduced-pom.xml **/pom.xml.versionsBackup diff --git a/addon/togglepersist/build.gradle.kts b/addon/togglepersist/build.gradle.kts new file mode 100644 index 00000000..78cb9095 --- /dev/null +++ b/addon/togglepersist/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + `openinv-base` +} + +dependencies { + implementation(project(":openinvapi")) +} + +tasks.processResources { + expand("version" to version) +} + +tasks.register("distributeAddons") { + into(rootProject.layout.projectDirectory.dir("dist")) + from(tasks.jar) + rename("openinvtogglepersist.*\\.jar", "OITogglePersist.jar") +} + +tasks.assemble { + dependsOn(tasks.named("distributeAddons")) +} diff --git a/addon/togglepersist/pom.xml b/addon/togglepersist/pom.xml deleted file mode 100644 index e927bf53..00000000 --- a/addon/togglepersist/pom.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - 4.0.0 - - - openinvparent - com.lishid - ../../pom.xml - 5.1.7-SNAPSHOT - - - openinvtogglepersist - - - - annotations - org.jetbrains - - - org.spigotmc - spigot-api - - - openinvapi - com.lishid - provided - - - - - OITogglePersist - - - src/main/resources - true - - - - - - maven-compiler-plugin - - - maven-resources-plugin - - - copy-final-jar - package - - copy-resources - - - ${project.parent.build.directory} - - - ${project.build.directory} - - ${project.build.finalName}.jar - - - - - - - - - - - - diff --git a/addon/togglepersist/src/main/resources/plugin.yml b/addon/togglepersist/src/main/resources/plugin.yml index 50a77051..3760e30f 100644 --- a/addon/togglepersist/src/main/resources/plugin.yml +++ b/addon/togglepersist/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: OITogglePersist main: com.github.jikoo.openinv.togglepersist.TogglePersist -version: ${project.version} +version: ${version} author: Jikoo description: An OpenInv addon allowing /anycontainer and /silentcontainer to persist across sessions. api-version: "1.20" diff --git a/api/build.gradle.kts b/api/build.gradle.kts new file mode 100644 index 00000000..4cf32f46 --- /dev/null +++ b/api/build.gradle.kts @@ -0,0 +1,4 @@ + +plugins { + `openinv-base` +} diff --git a/api/gradle.properties b/api/gradle.properties new file mode 100644 index 00000000..c5be5dad --- /dev/null +++ b/api/gradle.properties @@ -0,0 +1 @@ +artifactId = openinvapi diff --git a/api/pom.xml b/api/pom.xml deleted file mode 100644 index 8f93172e..00000000 --- a/api/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - 4.0.0 - - - openinvparent - com.lishid - 5.1.7-SNAPSHOT - - - openinvapi - OpenInvAPI - - - - annotations - org.jetbrains - - - spigot-api - org.spigotmc - - - - - - - maven-compiler-plugin - - - - - diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..7b53201e --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + `java-library` + alias(libs.plugins.paperweight) apply false + alias(libs.plugins.shadow) apply false +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") +} + +// Allow submodules to target higher Java release versions. +// Not currently necessary (as lowest supported version is in the 1.21 range) +// but may become relevant in the future. +java.disableAutoTargetJvm() + +// Task to delete ./dist where final files are output. +tasks.register("cleanDist") { + delete("dist") +} + +tasks.clean { + // Also delete distribution folder when cleaning. + dependsOn(tasks.named("cleanDist")) +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 00000000..52b9cc0a --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() +} diff --git a/buildSrc/src/main/kotlin/openinv-base.gradle.kts b/buildSrc/src/main/kotlin/openinv-base.gradle.kts new file mode 100644 index 00000000..74cb9e29 --- /dev/null +++ b/buildSrc/src/main/kotlin/openinv-base.gradle.kts @@ -0,0 +1,35 @@ +import org.gradle.jvm.toolchain.JavaLanguageVersion +import org.gradle.kotlin.dsl.maven +import org.gradle.kotlin.dsl.repositories +import org.gradle.kotlin.dsl.dependencies + +plugins { + `java-library` +} + +java { + toolchain.languageVersion = JavaLanguageVersion.of(21) +} + +repositories { + mavenLocal() + mavenCentral() + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://hub.spigotmc.org/nexus/content/groups/public/") +} + +dependencies { + val libs = versionCatalogs.named("libs") + compileOnly(libs.findLibrary("annotations").orElseThrow()) + compileOnly(libs.findLibrary("spigot.api").orElseThrow()) +} + +tasks { + withType().configureEach { + options.release = 21 + options.encoding = Charsets.UTF_8.name() + } + withType().configureEach { + options.encoding = Charsets.UTF_8.name() + } +} diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 00000000..1be01183 --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `openinv-base` +} + +dependencies { + implementation(project(":openinvapi")) +} diff --git a/common/pom.xml b/common/pom.xml deleted file mode 100644 index b8d9a944..00000000 --- a/common/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - 4.0.0 - - - com.lishid - openinvparent - 5.1.7-SNAPSHOT - - - openinvcommon - - - - annotations - org.jetbrains - - - org.spigotmc - spigot-api - - - openinvapi - com.lishid - - - - diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..72adefbb --- /dev/null +++ b/gradle.properties @@ -0,0 +1,9 @@ +# Project meta +group = com.lishid.openinv +version = 5.1.7-SNAPSHOT +description = A Bukkit plugin for opening normally-inaccessible inventories. + +# Gradle configuration +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configuration-cache=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..4318a690 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,15 @@ +[versions] +spigot-api = "1.21.4-R0.1-SNAPSHOT" +planarwrappers = "3.3.0" +annotations = "26.0.1" +paperweight = "2.0.0-beta.14" +shadow = "8.3.5" + +[libraries] +spigot-api = { module = "org.spigotmc:spigot-api", version.ref = "spigot-api" } +planarwrappers = { module = "com.github.jikoo:planarwrappers", version.ref = "planarwrappers" } +annotations = { module = "org.jetbrains:annotations", version.ref = "annotations" } + +[plugins] +paperweight = { id = "io.papermc.paperweight.userdev", version.ref = "paperweight" } +shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } \ 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 00000000..41d9927a Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..d6e308a6 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..1b6c7873 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/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/master/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 + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# 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"' + +# 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 + which java >/dev/null 2>&1 || 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 + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + 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 + +# 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 \ + "$@" + +# 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 00000000..107acd32 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@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=. +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%" == "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%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/internal/common/build.gradle.kts b/internal/common/build.gradle.kts new file mode 100644 index 00000000..79172d6b --- /dev/null +++ b/internal/common/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + `openinv-base` + alias(libs.plugins.paperweight) +} + +configurations.all { + resolutionStrategy.capabilitiesResolution.withCapability("org.spigotmc:spigot-api") { + val paper = candidates.firstOrNull { + it.id.let { + id -> id is ModuleComponentIdentifier && id.module == "paper-api" + } + } + if (paper != null) { + select(paper) + } + because("module is written for Paper servers") + } +} + +dependencies { + implementation(project(":openinvapi")) + implementation(project(":openinvcommon")) + + paperweight.paperDevBundle("1.21.4-R0.1-SNAPSHOT") +} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/InternalAccessor.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/InternalAccessor.java similarity index 83% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/InternalAccessor.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/InternalAccessor.java index 4b22c13c..c9aea82d 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/InternalAccessor.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/InternalAccessor.java @@ -1,19 +1,19 @@ -package com.lishid.openinv.internal.v1_21_R3; +package com.lishid.openinv.internal.common; import com.lishid.openinv.internal.Accessor; import com.lishid.openinv.internal.IAnySilentContainer; import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.internal.v1_21_R3.container.AnySilentContainer; -import com.lishid.openinv.internal.v1_21_R3.container.OpenEnderChest; -import com.lishid.openinv.internal.v1_21_R3.container.OpenInventory; -import com.lishid.openinv.internal.v1_21_R3.container.Placeholders; -import com.lishid.openinv.internal.v1_21_R3.player.PlayerManager; +import com.lishid.openinv.internal.common.container.AnySilentContainer; +import com.lishid.openinv.internal.common.container.OpenEnderChest; +import com.lishid.openinv.internal.common.container.OpenInventory; +import com.lishid.openinv.internal.common.container.Placeholders; +import com.lishid.openinv.internal.common.player.PlayerManager; import com.lishid.openinv.util.lang.LanguageManager; import net.minecraft.world.Container; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventory; +import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.jetbrains.annotations.NotNull; diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/AnySilentContainer.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/AnySilentContainer.java similarity index 96% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/AnySilentContainer.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/AnySilentContainer.java index 39b52b67..823d3b5f 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/AnySilentContainer.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/AnySilentContainer.java @@ -14,11 +14,11 @@ * along with this program. If not, see . */ -package com.lishid.openinv.internal.v1_21_R2.container; +package com.lishid.openinv.internal.common.container; import com.lishid.openinv.internal.AnySilentContainerBase; -import com.lishid.openinv.internal.v1_21_R2.container.menu.OpenChestMenu; -import com.lishid.openinv.internal.v1_21_R2.player.PlayerManager; +import com.lishid.openinv.internal.common.container.menu.OpenChestMenu; +import com.lishid.openinv.internal.common.player.PlayerManager; import com.lishid.openinv.util.ReflectionHelper; import com.lishid.openinv.util.lang.LanguageManager; import net.minecraft.core.BlockPos; @@ -61,10 +61,10 @@ public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) this.lang = lang; try { try { - this.serverPlayerGameModeGameType = ServerPlayerGameMode.class.getDeclaredField("b"); + this.serverPlayerGameModeGameType = ServerPlayerGameMode.class.getDeclaredField("gameModeForPlayer"); this.serverPlayerGameModeGameType.setAccessible(true); } catch (NoSuchFieldException e) { - logger.warning("ServerPlayerGameMode#gameModeForPlayer's obfuscated name has changed!"); + logger.warning("The field ServerPlayerGameMode#gameModeForPlayer is no longer present!"); logger.warning("Please report this at https://github.com/Jikoo/OpenInv/issues"); logger.warning("Attempting to fall through using reflection. Please verify that SilentContainer does not fail."); // N.B. gameModeForPlayer is (for now) declared before previousGameModeForPlayer so silent shouldn't break. diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/OpenEnderChest.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenEnderChest.java similarity index 83% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/OpenEnderChest.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenEnderChest.java index eee8f317..4567ea1e 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/OpenEnderChest.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenEnderChest.java @@ -1,9 +1,9 @@ -package com.lishid.openinv.internal.v1_21_R3.container; +package com.lishid.openinv.internal.common.container; import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.v1_21_R3.container.menu.OpenEnderChestMenu; -import com.lishid.openinv.internal.v1_21_R3.player.PlayerManager; +import com.lishid.openinv.internal.common.container.menu.OpenEnderChestMenu; +import com.lishid.openinv.internal.common.player.PlayerManager; import net.minecraft.core.NonNullList; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -15,8 +15,8 @@ import net.minecraft.world.inventory.StackedContentsCompatible; import net.minecraft.world.item.ItemStack; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventory; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.entity.HumanEntity; import org.bukkit.event.inventory.InventoryType; import org.jetbrains.annotations.NotNull; @@ -90,12 +90,12 @@ public boolean isEmpty() { } @Override - public ItemStack getItem(int index) { + public @NotNull ItemStack getItem(int index) { return index >= 0 && index < items.size() ? items.get(index) : ItemStack.EMPTY; } @Override - public ItemStack removeItem(int index, int amount) { + public @NotNull ItemStack removeItem(int index, int amount) { ItemStack itemstack = ContainerHelper.removeItem(items, index, amount); if (!itemstack.isEmpty()) { @@ -106,12 +106,12 @@ public ItemStack removeItem(int index, int amount) { } @Override - public ItemStack removeItemNoUpdate(int index) { + public @NotNull ItemStack removeItemNoUpdate(int index) { return index >= 0 && index < items.size() ? items.set(index, ItemStack.EMPTY) : ItemStack.EMPTY; } @Override - public void setItem(int index, ItemStack itemStack) { + public void setItem(int index, @NotNull ItemStack itemStack) { if (index >= 0 && index < items.size()) { items.set(index, itemStack); } @@ -128,27 +128,27 @@ public void setChanged() { } @Override - public boolean stillValid(Player player) { + public boolean stillValid(@NotNull Player player) { return true; } @Override - public List getContents() { + public @NotNull List getContents() { return items; } @Override - public void onOpen(CraftHumanEntity craftHumanEntity) { + public void onOpen(@NotNull CraftHumanEntity craftHumanEntity) { transaction.add(craftHumanEntity); } @Override - public void onClose(CraftHumanEntity craftHumanEntity) { + public void onClose(@NotNull CraftHumanEntity craftHumanEntity) { transaction.remove(craftHumanEntity); } @Override - public List getViewers() { + public @NotNull List getViewers() { return transaction; } @@ -174,7 +174,7 @@ public void clearContent() { } @Override - public void fillStackedContents(StackedItemContents stackedContents) { + public void fillStackedContents(@NotNull StackedItemContents stackedContents) { for (ItemStack itemstack : items) { stackedContents.accountStack(itemstack); } diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/OpenInventory.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenInventory.java similarity index 89% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/OpenInventory.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenInventory.java index 8f227240..899be70f 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/OpenInventory.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/OpenInventory.java @@ -1,20 +1,20 @@ -package com.lishid.openinv.internal.v1_21_R3.container; +package com.lishid.openinv.internal.common.container; import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.v1_21_R3.container.bukkit.OpenPlayerInventory; -import com.lishid.openinv.internal.v1_21_R3.container.menu.OpenInventoryMenu; -import com.lishid.openinv.internal.v1_21_R3.container.slot.Content; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentCrafting; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentCraftingResult; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentCursor; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentDrop; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentEquipment; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentList; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentOffHand; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentViewOnly; -import com.lishid.openinv.internal.v1_21_R3.container.slot.SlotViewOnly; -import com.lishid.openinv.internal.v1_21_R3.player.PlayerManager; +import com.lishid.openinv.internal.common.container.bukkit.OpenPlayerInventory; +import com.lishid.openinv.internal.common.container.menu.OpenInventoryMenu; +import com.lishid.openinv.internal.common.container.slot.Content; +import com.lishid.openinv.internal.common.container.slot.ContentCrafting; +import com.lishid.openinv.internal.common.container.slot.ContentCraftingResult; +import com.lishid.openinv.internal.common.container.slot.ContentCursor; +import com.lishid.openinv.internal.common.container.slot.ContentDrop; +import com.lishid.openinv.internal.common.container.slot.ContentEquipment; +import com.lishid.openinv.internal.common.container.slot.ContentList; +import com.lishid.openinv.internal.common.container.slot.ContentOffHand; +import com.lishid.openinv.internal.common.container.slot.ContentViewOnly; +import com.lishid.openinv.internal.common.container.slot.SlotViewOnly; +import com.lishid.openinv.internal.common.player.PlayerManager; import net.minecraft.ChatFormatting; import net.minecraft.core.NonNullList; import net.minecraft.network.chat.Component; @@ -29,8 +29,8 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventory; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.entity.HumanEntity; import org.bukkit.event.inventory.InventoryType; import org.jetbrains.annotations.NotNull; @@ -308,12 +308,12 @@ public void setMaxStackSize(int maxStackSize) { public void setChanged() {} @Override - public boolean stillValid(Player player) { + public boolean stillValid(@NotNull Player player) { return true; } @Override - public List getContents() { + public @NotNull List getContents() { NonNullList contents = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); for (int i = 0; i < getContainerSize(); ++i) { contents.set(i, getItem(i)); @@ -337,7 +337,7 @@ public List getViewers() { } @Override - public org.bukkit.entity.Player getOwner() { + public @NotNull org.bukkit.entity.Player getOwner() { return owner.getBukkitEntity(); } diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/Placeholders.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/Placeholders.java similarity index 97% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/Placeholders.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/Placeholders.java index 7a95351c..75a0834e 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/Placeholders.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/Placeholders.java @@ -1,5 +1,6 @@ -package com.lishid.openinv.internal.v1_21_R3.container; +package com.lishid.openinv.internal.common.container; +import com.lishid.openinv.internal.common.player.OpenPlayer; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; import net.minecraft.core.component.DataComponents; @@ -20,7 +21,7 @@ import net.minecraft.world.level.block.entity.BannerPatternLayers; import net.minecraft.world.level.block.entity.BannerPatterns; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.v1_21_R3.CraftRegistry; +import org.bukkit.craftbukkit.CraftRegistry; import org.jetbrains.annotations.NotNull; import java.util.EnumMap; @@ -84,7 +85,7 @@ public static void load(@NotNull ConfigurationSection section) throws Exception } public static ItemStack survivalOnly(@NotNull ServerPlayer serverPlayer) { - if (serverPlayer.connection == null || serverPlayer.connection.isDisconnected()) { + if (!OpenPlayer.isConnected(serverPlayer.connection)) { return blockedOffline; } diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenDummyInventory.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenDummyInventory.java similarity index 96% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenDummyInventory.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenDummyInventory.java index 6fdab659..840bbaae 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenDummyInventory.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenDummyInventory.java @@ -1,9 +1,9 @@ -package com.lishid.openinv.internal.v1_21_R2.container.bukkit; +package com.lishid.openinv.internal.common.container.bukkit; import com.lishid.openinv.internal.ViewOnly; import net.minecraft.world.Container; import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; +import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenDummyPlayerInventory.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenDummyPlayerInventory.java similarity index 97% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenDummyPlayerInventory.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenDummyPlayerInventory.java index 17bb2a04..0347e135 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenDummyPlayerInventory.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenDummyPlayerInventory.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.v1_21_R2.container.bukkit; +package com.lishid.openinv.internal.common.container.bukkit; import net.minecraft.world.Container; import org.bukkit.Material; diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenPlayerInventory.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenPlayerInventory.java similarity index 96% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenPlayerInventory.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenPlayerInventory.java index 01be5ba1..a5a6339d 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenPlayerInventory.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenPlayerInventory.java @@ -1,12 +1,12 @@ -package com.lishid.openinv.internal.v1_21_R2.container.bukkit; +package com.lishid.openinv.internal.common.container.bukkit; import com.google.common.base.Preconditions; -import com.lishid.openinv.internal.v1_21_R2.container.OpenInventory; +import com.lishid.openinv.internal.common.container.OpenInventory; import net.minecraft.core.NonNullList; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftInventory; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.ItemStack; diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenPlayerInventorySelf.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenPlayerInventorySelf.java similarity index 79% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenPlayerInventorySelf.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenPlayerInventorySelf.java index e44eb4c9..165211f2 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/bukkit/OpenPlayerInventorySelf.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/bukkit/OpenPlayerInventorySelf.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.v1_21_R2.container.bukkit; +package com.lishid.openinv.internal.common.container.bukkit; -import com.lishid.openinv.internal.v1_21_R2.container.OpenInventory; +import com.lishid.openinv.internal.common.container.OpenInventory; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/menu/OpenChestMenu.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/menu/OpenChestMenu.java similarity index 94% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/menu/OpenChestMenu.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/menu/OpenChestMenu.java index de3dcf29..9c73170c 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/menu/OpenChestMenu.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/menu/OpenChestMenu.java @@ -1,11 +1,11 @@ -package com.lishid.openinv.internal.v1_21_R3.container.menu; +package com.lishid.openinv.internal.common.container.menu; import com.google.common.base.Suppliers; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.v1_21_R3.container.bukkit.OpenDummyInventory; -import com.lishid.openinv.internal.v1_21_R3.container.slot.SlotPlaceholder; -import com.lishid.openinv.internal.v1_21_R3.container.slot.SlotViewOnly; +import com.lishid.openinv.internal.common.container.bukkit.OpenDummyInventory; +import com.lishid.openinv.internal.common.container.slot.SlotPlaceholder; +import com.lishid.openinv.internal.common.container.slot.SlotViewOnly; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.server.level.ServerPlayer; @@ -21,7 +21,7 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.inventory.CraftInventoryView; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; @@ -177,9 +177,7 @@ public int convertSlot(int rawSlot) { private int getTopSize(ServerPlayer viewer) { MenuType menuType = getType(); - if (menuType == null) { - throw new IllegalStateException("MenuType cannot be null!"); - } else if (menuType == MenuType.GENERIC_9x1) { + if (menuType == MenuType.GENERIC_9x1) { return 9; } else if (menuType == MenuType.GENERIC_9x2) { return 18; @@ -285,7 +283,7 @@ private static boolean addToExistingStack(ItemStack itemStack, Slot slot) { } @Override - public void clicked(int i, int j, ClickType clickType, Player player) { + public void clicked(int i, int j, @NotNull ClickType clickType, @NotNull Player player) { if (viewOnly) { if (clickType == ClickType.QUICK_CRAFT) { sendAllDataToRemote(); @@ -296,13 +294,13 @@ public void clicked(int i, int j, ClickType clickType, Player player) { } @Override - public boolean stillValid(Player player) { + public boolean stillValid(@NotNull Player player) { return true; } // Overrides from here on are purely to modify the sync process to send placeholder items. @Override - protected Slot addSlot(Slot slot) { + protected @NotNull Slot addSlot(@NotNull Slot slot) { slot.index = this.slots.size(); this.slots.add(slot); this.lastSlots.add(ItemStack.EMPTY); @@ -311,7 +309,7 @@ protected Slot addSlot(Slot slot) { } @Override - protected DataSlot addDataSlot(DataSlot dataSlot) { + protected @NotNull DataSlot addDataSlot(@NotNull DataSlot dataSlot) { this.dataSlots.add(dataSlot); this.remoteDataSlots.add(0); return dataSlot; @@ -325,7 +323,7 @@ protected void addDataSlots(ContainerData containerData) { } @Override - public void addSlotListener(ContainerListener containerListener) { + public void addSlotListener(@NotNull ContainerListener containerListener) { if (!this.containerListeners.contains(containerListener)) { this.containerListeners.add(containerListener); this.broadcastChanges(); @@ -333,7 +331,7 @@ public void addSlotListener(ContainerListener containerListener) { } @Override - public void setSynchronizer(ContainerSynchronizer containerSynchronizer) { + public void setSynchronizer(@NotNull ContainerSynchronizer containerSynchronizer) { this.synchronizer = containerSynchronizer; this.sendAllDataToRemote(); } @@ -365,7 +363,7 @@ public void broadcastCarriedItem() { } @Override - public void removeSlotListener(ContainerListener containerListener) { + public void removeSlotListener(@NotNull ContainerListener containerListener) { this.containerListeners.remove(containerListener); } diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/menu/OpenEnderChestMenu.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/menu/OpenEnderChestMenu.java similarity index 85% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/menu/OpenEnderChestMenu.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/menu/OpenEnderChestMenu.java index 075c0849..bfd6c619 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/menu/OpenEnderChestMenu.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/menu/OpenEnderChestMenu.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.v1_21_R3.container.menu; +package com.lishid.openinv.internal.common.container.menu; -import com.lishid.openinv.internal.v1_21_R3.container.OpenEnderChest; +import com.lishid.openinv.internal.common.container.OpenEnderChest; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; @@ -18,7 +18,7 @@ public OpenEnderChestMenu( } @Override - public ItemStack quickMoveStack(Player player, int index) { + public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { if (viewOnly) { return ItemStack.EMPTY; } diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/menu/OpenInventoryMenu.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/menu/OpenInventoryMenu.java similarity index 91% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/menu/OpenInventoryMenu.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/menu/OpenInventoryMenu.java index dc80ae30..afe70bad 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/menu/OpenInventoryMenu.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/menu/OpenInventoryMenu.java @@ -1,12 +1,12 @@ -package com.lishid.openinv.internal.v1_21_R2.container.menu; +package com.lishid.openinv.internal.common.container.menu; import com.google.common.base.Preconditions; -import com.lishid.openinv.internal.v1_21_R2.container.OpenInventory; -import com.lishid.openinv.internal.v1_21_R2.container.bukkit.OpenDummyPlayerInventory; -import com.lishid.openinv.internal.v1_21_R2.container.bukkit.OpenPlayerInventorySelf; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentDrop; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentEquipment; -import com.lishid.openinv.internal.v1_21_R2.container.slot.SlotViewOnly; +import com.lishid.openinv.internal.common.container.OpenInventory; +import com.lishid.openinv.internal.common.container.bukkit.OpenDummyPlayerInventory; +import com.lishid.openinv.internal.common.container.bukkit.OpenPlayerInventorySelf; +import com.lishid.openinv.internal.common.container.slot.ContentDrop; +import com.lishid.openinv.internal.common.container.slot.ContentEquipment; +import com.lishid.openinv.internal.common.container.slot.SlotViewOnly; import com.lishid.openinv.util.Permissions; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; @@ -15,8 +15,8 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; @@ -195,7 +195,7 @@ public int countSlots() { } @Override - public ItemStack quickMoveStack(Player player, int index) { + public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { if (viewOnly) { return ItemStack.EMPTY; } diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/Content.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/Content.java similarity index 96% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/Content.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/Content.java index 15c04fef..9b63ed54 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/Content.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/Content.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; +package com.lishid.openinv.internal.common.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentCrafting.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentCrafting.java similarity index 89% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentCrafting.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentCrafting.java index fb71cf40..4621af79 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentCrafting.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentCrafting.java @@ -1,6 +1,7 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; +package com.lishid.openinv.internal.common.container.slot; -import com.lishid.openinv.internal.v1_21_R2.container.Placeholders; +import com.lishid.openinv.internal.common.container.Placeholders; +import com.lishid.openinv.internal.common.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; @@ -34,7 +35,7 @@ static boolean isAvailable(@NotNull ServerPlayer holder) { // Player must be online and not in creative - since the creative client is (semi-)authoritative, // it ignores changes without extra help, and will delete the item as a result. // Spectator mode is technically possible but may cause the item to be dropped if the client opens an inventory. - return holder.connection != null && !holder.connection.isDisconnected() && holder.gameMode.isSurvival(); + return OpenPlayer.isConnected(holder.connection) && holder.gameMode.isSurvival(); } @Override @@ -107,12 +108,12 @@ public ItemStack getOrDefault() { } @Override - public boolean mayPickup(Player player) { + public boolean mayPickup(@NotNull Player player) { return isAvailable(); } @Override - public boolean mayPlace(ItemStack itemStack) { + public boolean mayPlace(@NotNull ItemStack itemStack) { return isAvailable(); } diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentCraftingResult.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentCraftingResult.java similarity index 90% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentCraftingResult.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentCraftingResult.java index 62e9a62b..57b612e5 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentCraftingResult.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentCraftingResult.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; +package com.lishid.openinv.internal.common.container.slot; -import com.lishid.openinv.internal.v1_21_R2.container.Placeholders; +import com.lishid.openinv.internal.common.container.Placeholders; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.inventory.InventoryMenu; diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentCursor.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentCursor.java similarity index 88% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentCursor.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentCursor.java index 41cbb3f7..d0b16f17 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentCursor.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentCursor.java @@ -1,6 +1,7 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; +package com.lishid.openinv.internal.common.container.slot; -import com.lishid.openinv.internal.v1_21_R2.container.Placeholders; +import com.lishid.openinv.internal.common.container.Placeholders; +import com.lishid.openinv.internal.common.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; @@ -63,7 +64,7 @@ private boolean isAvailable() { // Player must be online and not in creative - since the creative client is (semi-)authoritative, // it ignores changes without extra help, and will delete the item as a result. // Spectator mode is technically possible but may cause the item to be dropped if the client opens an inventory. - return holder.connection != null && !holder.connection.isDisconnected() && holder.gameMode.isSurvival(); + return OpenPlayer.isConnected(holder.connection) && holder.gameMode.isSurvival(); } @Override @@ -93,12 +94,12 @@ public ItemStack getOrDefault() { } @Override - public boolean mayPickup(Player player) { + public boolean mayPickup(@NotNull Player player) { return isAvailable(); } @Override - public boolean mayPlace(ItemStack itemStack) { + public boolean mayPlace(@NotNull ItemStack itemStack) { return isAvailable(); } diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentDrop.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentDrop.java similarity index 82% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentDrop.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentDrop.java index ebe52541..1d3d8b0e 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentDrop.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentDrop.java @@ -1,6 +1,7 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; +package com.lishid.openinv.internal.common.container.slot; -import com.lishid.openinv.internal.v1_21_R2.container.Placeholders; +import com.lishid.openinv.internal.common.container.Placeholders; +import com.lishid.openinv.internal.common.player.OpenPlayer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; @@ -63,14 +64,14 @@ private SlotDrop(Container container, int index, int x, int y) { @Override public ItemStack getOrDefault() { - return holder.connection != null && !holder.connection.isDisconnected() + return OpenPlayer.isConnected(holder.connection) ? Placeholders.drop : Placeholders.blockedOffline; } @Override - public boolean mayPlace(ItemStack itemStack) { - return holder.connection != null && !holder.connection.isDisconnected(); + public boolean mayPlace(@NotNull ItemStack itemStack) { + return OpenPlayer.isConnected(holder.connection); } @Override diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentEquipment.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentEquipment.java similarity index 89% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentEquipment.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentEquipment.java index 9fe03914..60731e4a 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentEquipment.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentEquipment.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; +package com.lishid.openinv.internal.common.container.slot; -import com.lishid.openinv.internal.v1_21_R3.container.Placeholders; +import com.lishid.openinv.internal.common.container.Placeholders; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.EquipmentSlot; @@ -65,12 +65,12 @@ public void onlyEquipmentFor(ServerPlayer viewer) { } @Override - public boolean mayPlace(ItemStack var0) { + public boolean mayPlace(@NotNull ItemStack itemStack) { if (viewer == null) { return true; } - return equipmentSlot == EquipmentSlot.OFFHAND || viewer.getEquipmentSlotForItem(var0) == equipmentSlot; + return equipmentSlot == EquipmentSlot.OFFHAND || viewer.getEquipmentSlotForItem(itemStack) == equipmentSlot; } } diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentList.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentList.java similarity index 95% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentList.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentList.java index e9483b95..5748c51a 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentList.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentList.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; +package com.lishid.openinv.internal.common.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentOffHand.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentOffHand.java similarity index 86% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentOffHand.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentOffHand.java index cc7f3337..465472df 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentOffHand.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentOffHand.java @@ -1,5 +1,6 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; +package com.lishid.openinv.internal.common.container.slot; +import com.lishid.openinv.internal.common.player.OpenPlayer; import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; @@ -36,9 +37,7 @@ public Slot asSlot(Container container, int slot, int x, int y) { return new SlotEquipment(container, slot, x, y) { @Override public void setChanged() { - if (holder.connection != null - && !holder.connection.isDisconnected() - && holder.containerMenu != holder.inventoryMenu) { + if (OpenPlayer.isConnected(holder.connection) && holder.containerMenu != holder.inventoryMenu) { holder.connection.send( new ClientboundContainerSetSlotPacket( holder.inventoryMenu.containerId, diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentViewOnly.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentViewOnly.java similarity index 95% rename from internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentViewOnly.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentViewOnly.java index 6d78e6e0..46076658 100644 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentViewOnly.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/ContentViewOnly.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; +package com.lishid.openinv.internal.common.container.slot; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/SlotPlaceholder.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/SlotPlaceholder.java similarity index 89% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/SlotPlaceholder.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/SlotPlaceholder.java index ef0bf7a0..7e7a79ad 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/SlotPlaceholder.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/SlotPlaceholder.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; +package com.lishid.openinv.internal.common.container.slot; import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/SlotViewOnly.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/SlotViewOnly.java similarity index 65% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/SlotViewOnly.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/SlotViewOnly.java index 7727775d..7fb43763 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/SlotViewOnly.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/container/slot/SlotViewOnly.java @@ -1,6 +1,6 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; +package com.lishid.openinv.internal.common.container.slot; -import com.lishid.openinv.internal.v1_21_R2.container.Placeholders; +import com.lishid.openinv.internal.common.container.Placeholders; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.Slot; @@ -45,20 +45,20 @@ public ItemStack getOrDefault() { } @Override - public void onQuickCraft(ItemStack var0, ItemStack var1) { + public void onQuickCraft(@NotNull ItemStack itemStack1, @NotNull ItemStack itemStack2) { } @Override - public void onTake(Player var0, ItemStack var1) { + public void onTake(@NotNull Player player, @NotNull ItemStack itemStack) { } @Override - public boolean mayPlace(ItemStack var0) { + public boolean mayPlace(@NotNull ItemStack itemStack) { return false; } @Override - public ItemStack getItem() { + public @NotNull ItemStack getItem() { return ItemStack.EMPTY; } @@ -68,15 +68,15 @@ public boolean hasItem() { } @Override - public void setByPlayer(ItemStack newStack) { + public void setByPlayer(@NotNull ItemStack newStack) { } @Override - public void setByPlayer(ItemStack newStack, ItemStack oldStack) { + public void setByPlayer(@NotNull ItemStack newStack, @NotNull ItemStack oldStack) { } @Override - public void set(ItemStack var0) { + public void set(@NotNull ItemStack itemStack) { } @Override @@ -89,17 +89,17 @@ public int getMaxStackSize() { } @Override - public int getMaxStackSize(ItemStack itemStack) { + public int getMaxStackSize(@NotNull ItemStack itemStack) { return 0; } @Override - public ItemStack remove(int amount) { + public @NotNull ItemStack remove(int amount) { return ItemStack.EMPTY; } @Override - public boolean mayPickup(Player var0) { + public boolean mayPickup(@NotNull Player player) { return false; } @@ -109,27 +109,27 @@ public boolean isActive() { } @Override - public Optional tryRemove(int var0, int var1, Player var2) { + public @NotNull Optional tryRemove(int var0, int var1, @NotNull Player player) { return Optional.empty(); } @Override - public ItemStack safeTake(int var0, int var1, Player var2) { + public @NotNull ItemStack safeTake(int var0, int var1, @NotNull Player player) { return ItemStack.EMPTY; } @Override - public ItemStack safeInsert(ItemStack itemStack) { + public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack) { return itemStack; } @Override - public ItemStack safeInsert(ItemStack itemStack, int amount) { + public @NotNull ItemStack safeInsert(@NotNull ItemStack itemStack, int amount) { return itemStack; } @Override - public boolean allowModification(Player var0) { + public boolean allowModification(@NotNull Player player) { return false; } diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/player/OpenPlayer.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/player/OpenPlayer.java similarity index 93% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/player/OpenPlayer.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/player/OpenPlayer.java index 4005359a..54a770f7 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/player/OpenPlayer.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/player/OpenPlayer.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal.v1_21_R2.player; +package com.lishid.openinv.internal.common.player; import com.lishid.openinv.event.OpenEvents; import com.mojang.logging.LogUtils; @@ -8,9 +8,10 @@ import net.minecraft.nbt.NumericTag; import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.level.storage.PlayerDataStorage; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -175,4 +176,8 @@ private void setTag( } } + public static boolean isConnected(@Nullable ServerGamePacketListenerImpl connection) { + return connection != null && !connection.isDisconnected(); + } + } diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/player/PlayerManager.java b/internal/common/src/main/java/com/lishid/openinv/internal/common/player/PlayerManager.java similarity index 91% rename from internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/player/PlayerManager.java rename to internal/common/src/main/java/com/lishid/openinv/internal/common/player/PlayerManager.java index 2bc534ec..c1e31815 100644 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/player/PlayerManager.java +++ b/internal/common/src/main/java/com/lishid/openinv/internal/common/player/PlayerManager.java @@ -1,8 +1,8 @@ -package com.lishid.openinv.internal.v1_21_R2.player; +package com.lishid.openinv.internal.common.player; import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.v1_21_R2.container.OpenEnderChest; -import com.lishid.openinv.internal.v1_21_R2.container.OpenInventory; +import com.lishid.openinv.internal.common.container.OpenEnderChest; +import com.lishid.openinv.internal.common.container.OpenInventory; import com.mojang.authlib.GameProfile; import com.mojang.serialization.Dynamic; import net.minecraft.nbt.CompoundTag; @@ -23,10 +23,10 @@ import org.bukkit.OfflinePlayer; import org.bukkit.Server; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R2.CraftServer; -import org.bukkit.craftbukkit.v1_21_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R2.event.CraftEventFactory; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; import org.jetbrains.annotations.NotNull; @@ -181,16 +181,25 @@ private void parseWorld(@NotNull ServerPlayer player, @NotNull CompoundTag loade .resultOrPartial(logger::warning) .map(player.server::getLevel) // If ServerLevel exists, set, otherwise move to spawn. - .ifPresentOrElse(player::setServerLevel, () -> player.spawnIn(null)); + .ifPresentOrElse(player::setServerLevel, () -> spawnInDefaultWorld(player)); return; } if (bukkitWorld == null) { - player.spawnIn(null); + spawnInDefaultWorld(player); return; } player.setServerLevel(((CraftWorld) bukkitWorld).getHandle()); } + private void spawnInDefaultWorld(ServerPlayer player) { + ServerLevel level = player.server.getLevel(Level.OVERWORLD); + if (level != null) { + player.spawnIn(level); + } else { + logger.warning("Tried to load player with invalid world when no fallback was available!"); + } + } + private void injectPlayer(ServerPlayer player) throws IllegalAccessException { if (bukkitEntity == null) { return; @@ -223,7 +232,7 @@ private void injectPlayer(ServerPlayer player) throws IllegalAccessException { public @Nullable InventoryView openInventory(@NotNull Player bukkitPlayer, @NotNull ISpecialInventory inventory, boolean viewOnly) { ServerPlayer player = getHandle(bukkitPlayer); - if (player.connection == null) { + if (!OpenPlayer.isConnected(player.connection)) { return null; } diff --git a/internal/spigot/build.gradle.kts b/internal/spigot/build.gradle.kts new file mode 100644 index 00000000..5d6e85e8 --- /dev/null +++ b/internal/spigot/build.gradle.kts @@ -0,0 +1,33 @@ +plugins { + `openinv-base` + alias(libs.plugins.paperweight) + alias(libs.plugins.shadow) +} + +configurations.all { + resolutionStrategy.capabilitiesResolution.withCapability("org.spigotmc:spigot-api") { + val spigot = candidates.firstOrNull { + it.id.let { + id -> id is ModuleComponentIdentifier && id.module == "spigot-api" + } + } + if (spigot != null) { + select(spigot) + } + because("module is written for Spigot servers") + } +} + +dependencies { + implementation(project(":openinvadaptercommon", configuration = "reobf")) + + paperweight.paperDevBundle("1.21.4-R0.1-SNAPSHOT") +} + +tasks.jar { + dependsOn(tasks.shadowJar) +} + +tasks.shadowJar { + relocate("com.lishid.openinv.internal.common", "com.lishid.openinv.internal.reobf") +} diff --git a/internal/v1_21_R2/pom.xml b/internal/v1_21_R2/pom.xml deleted file mode 100644 index ea088dfe..00000000 --- a/internal/v1_21_R2/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - 4.0.0 - - - openinvparent - com.lishid - ../../pom.xml - 5.1.7-SNAPSHOT - - - openinvadapter1_21_R2 - OpenInvAdapter1_21_R2 - - - 21 - 21 - 1.21.3-R0.1-SNAPSHOT - - - - - org.spigotmc - spigot-api - ${spigot.version} - - - spigot - org.spigotmc - provided - ${spigot.version} - remapped-mojang - - - openinvapi - com.lishid - - - openinvcommon - com.lishid - - - annotations - org.jetbrains - - - - - - - maven-compiler-plugin - - - net.md-5 - specialsource-maven-plugin - - - - - diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/InternalAccessor.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/InternalAccessor.java deleted file mode 100644 index 3b873935..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/InternalAccessor.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2; - -import com.lishid.openinv.internal.Accessor; -import com.lishid.openinv.internal.IAnySilentContainer; -import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.internal.v1_21_R2.container.AnySilentContainer; -import com.lishid.openinv.internal.v1_21_R2.container.OpenEnderChest; -import com.lishid.openinv.internal.v1_21_R2.container.OpenInventory; -import com.lishid.openinv.internal.v1_21_R2.container.Placeholders; -import com.lishid.openinv.internal.v1_21_R2.player.PlayerManager; -import com.lishid.openinv.util.lang.LanguageManager; -import net.minecraft.world.Container; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.logging.Level; -import java.util.logging.Logger; - -public class InternalAccessor implements Accessor { - - private final @NotNull Logger logger; - private final @NotNull PlayerManager manager; - private final @NotNull AnySilentContainer anySilentContainer; - - public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { - this.logger = logger; - manager = new PlayerManager(logger); - anySilentContainer = new AnySilentContainer(logger, lang); - } - - @Override - public @NotNull PlayerManager getPlayerManager() { - return manager; - } - - @Override - public @NotNull IAnySilentContainer getAnySilentContainer() { - return anySilentContainer; - } - - @Override - public @NotNull ISpecialPlayerInventory createPlayerInventory(@NotNull Player player) { - return new OpenInventory(player); - } - - @Override - public @NotNull ISpecialEnderChest createEnderChest(@NotNull Player player) { - return new OpenEnderChest(player); - } - - @Override - public @Nullable T get(@NotNull Inventory bukkitInventory, @NotNull Class clazz) { - if (!(bukkitInventory instanceof CraftInventory craftInventory)) { - return null; - } - Container container = craftInventory.getInventory(); - if (clazz.isInstance(container)) { - return clazz.cast(container); - } - return null; - } - - @Override - public void reload(@NotNull ConfigurationSection config) { - ConfigurationSection placeholders = config.getConfigurationSection("placeholders"); - if (placeholders != null) { - try { - Placeholders.load(placeholders); - } catch (Exception e) { - logger.log(Level.WARNING, "Caught exception loading placeholder overrides!", e); - } - } - } - -} diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/OpenEnderChest.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/OpenEnderChest.java deleted file mode 100644 index 2f0b3d97..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/OpenEnderChest.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2.container; - -import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.v1_21_R2.container.menu.OpenEnderChestMenu; -import com.lishid.openinv.internal.v1_21_R2.player.PlayerManager; -import net.minecraft.core.NonNullList; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.ContainerHelper; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.player.StackedItemContents; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.StackedContentsCompatible; -import net.minecraft.world.item.ItemStack; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; - -public class OpenEnderChest implements Container, StackedContentsCompatible, InternalOwned, - ISpecialEnderChest { - - private CraftInventory inventory; - private @NotNull ServerPlayer owner; - private NonNullList items; - private int maxStack = 64; - private final List transaction = new ArrayList<>(); - - public OpenEnderChest(@NotNull org.bukkit.entity.Player player) { - this.owner = PlayerManager.getHandle(player); - this.items = owner.getEnderChestInventory().items; - } - - @Override - public @NotNull ServerPlayer getOwnerHandle() { - return owner; - } - - @Override - public @NotNull org.bukkit.inventory.Inventory getBukkitInventory() { - if (inventory == null) { - inventory = new CraftInventory(this) { - @Override - public @NotNull InventoryType getType() { - return InventoryType.ENDER_CHEST; - } - }; - } - return inventory; - } - - @Override - public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { - owner = PlayerManager.getHandle(player); - NonNullList activeItems = owner.getEnderChestInventory().items; - - // Guard against size changing. Theoretically on Purpur all row variations still have 6 rows internally. - int max = Math.min(items.size(), activeItems.size()); - for (int index = 0; index < max; ++index) { - activeItems.set(index, items.get(index)); - } - - items = activeItems; - } - - @Override - public void setPlayerOffline() {} - - @Override - public @NotNull org.bukkit.entity.Player getPlayer() { - return owner.getBukkitEntity(); - } - - @Override - public int getContainerSize() { - return items.size(); - } - - @Override - public boolean isEmpty() { - return items.stream().allMatch(ItemStack::isEmpty); - } - - @Override - public ItemStack getItem(int index) { - return index >= 0 && index < items.size() ? items.get(index) : ItemStack.EMPTY; - } - - @Override - public ItemStack removeItem(int index, int amount) { - ItemStack itemstack = ContainerHelper.removeItem(items, index, amount); - - if (!itemstack.isEmpty()) { - setChanged(); - } - - return itemstack; - } - - @Override - public ItemStack removeItemNoUpdate(int index) { - return index >= 0 && index < items.size() ? items.set(index, ItemStack.EMPTY) : ItemStack.EMPTY; - } - - @Override - public void setItem(int index, ItemStack itemStack) { - if (index >= 0 && index < items.size()) { - items.set(index, itemStack); - } - } - - @Override - public int getMaxStackSize() { - return maxStack; - } - - @Override - public void setChanged() { - this.owner.getEnderChestInventory().setChanged(); - } - - @Override - public boolean stillValid(Player player) { - return true; - } - - @Override - public List getContents() { - return items; - } - - @Override - public void onOpen(CraftHumanEntity craftHumanEntity) { - transaction.add(craftHumanEntity); - } - - @Override - public void onClose(CraftHumanEntity craftHumanEntity) { - transaction.remove(craftHumanEntity); - } - - @Override - public List getViewers() { - return transaction; - } - - @Override - public org.bukkit.entity.Player getOwner() { - return getPlayer(); - } - - @Override - public void setMaxStackSize(int size) { - maxStack = size; - } - - @Override - public @Nullable Location getLocation() { - return null; - } - - @Override - public void clearContent() { - items.clear(); - setChanged(); - } - - @Override - public void fillStackedContents(StackedItemContents stackedContents) { - for (ItemStack itemstack : items) { - stackedContents.accountStack(itemstack); - } - } - - public Component getTitle() { - return Component.translatableWithFallback("openinv.container.enderchest.prefix", "", owner.getName()) - .append(Component.translatable("container.enderchest")) - .append(Component.translatableWithFallback("openinv.container.enderchest.suffix", " - %s", owner.getName())); - } - - public @Nullable AbstractContainerMenu createMenu(Player player, int i, boolean viewOnly) { - if (player instanceof ServerPlayer serverPlayer) { - return new OpenEnderChestMenu(this, serverPlayer, i, viewOnly); - } - return null; - } - -} diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/OpenInventory.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/OpenInventory.java deleted file mode 100644 index ef3113ff..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/OpenInventory.java +++ /dev/null @@ -1,364 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2.container; - -import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.v1_21_R2.container.bukkit.OpenPlayerInventory; -import com.lishid.openinv.internal.v1_21_R2.container.menu.OpenInventoryMenu; -import com.lishid.openinv.internal.v1_21_R2.container.slot.Content; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentCrafting; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentCraftingResult; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentCursor; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentDrop; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentEquipment; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentList; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentOffHand; -import com.lishid.openinv.internal.v1_21_R2.container.slot.ContentViewOnly; -import com.lishid.openinv.internal.v1_21_R2.container.slot.SlotViewOnly; -import com.lishid.openinv.internal.v1_21_R2.player.PlayerManager; -import net.minecraft.ChatFormatting; -import net.minecraft.core.NonNullList; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_21_R2.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventory; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; - -public class OpenInventory implements Container, InternalOwned, ISpecialPlayerInventory { - - private final List slots; - private final int size; - private ServerPlayer owner; - private int maxStackSize = 99; - private CraftInventory bukkitEntity; - public List transaction = new ArrayList<>(); - - public OpenInventory(@NotNull org.bukkit.entity.Player bukkitPlayer) { - owner = PlayerManager.getHandle(bukkitPlayer); - - // Get total size, rounding up to nearest 9 for client compatibility. - int rawSize = owner.getInventory().getContainerSize() + owner.inventoryMenu.getCraftSlots().getContainerSize() + 1; - size = ((int) Math.ceil(rawSize / 9.0)) * 9; - - slots = NonNullList.withSize(size, new ContentViewOnly(owner)); - setupSlots(); - } - - private void setupSlots() { - // Top of inventory: Regular contents. - int nextIndex = addMainInventory(); - - // If inventory is expected size, we can arrange slots to be pretty. - Inventory ownerInv = owner.getInventory(); - if (ownerInv.items.size() == 36 - && ownerInv.armor.size() == 4 - && ownerInv.offhand.size() == 1 - && owner.inventoryMenu.getCraftSlots().getContainerSize() == 4) { - // Armor slots: Bottom left. - addArmor(36); - // Off-hand: Below chestplate. - addOffHand(46); - // Drop slot: Bottom right. - slots.set(53, new ContentDrop(owner)); - // Cursor slot: Above drop. - slots.set(44, new ContentCursor(owner)); - - // Crafting is displayed in the bottom right corner. - // As we're using the pretty view, this is a 3x2. - addCrafting(41, true); - return; - } - - // Otherwise we'll just add elements linearly. - nextIndex = addArmor(nextIndex); - nextIndex = addOffHand(nextIndex); - nextIndex = addCrafting(nextIndex, false); - slots.set(nextIndex, new ContentCursor(owner)); - // Drop slot last. - slots.set(slots.size() - 1, new ContentDrop(owner)); - } - - private int addMainInventory() { - int listSize = owner.getInventory().items.size(); - // Hotbar slots are 0-8. We want those to appear on the bottom of the inventory like a normal player inventory, - // so everything else needs to move up a row. - int hotbarDiff = listSize - 9; - for (int localIndex = 0; localIndex < listSize; ++localIndex) { - InventoryType.SlotType type; - int invIndex; - if (localIndex < hotbarDiff) { - invIndex = localIndex + 9; - type = InventoryType.SlotType.CONTAINER; - } else { - type = InventoryType.SlotType.QUICKBAR; - invIndex = localIndex - hotbarDiff; - } - - slots.set(localIndex, new ContentList(owner, invIndex, type) { - @Override - public void setHolder(@NotNull ServerPlayer holder) { - items = holder.getInventory().items; - } - }); - } - return listSize; - } - - private int addArmor(int startIndex) { - int listSize = owner.getInventory().armor.size(); - - for (int i = 0; i < listSize; ++i) { - // Armor slots go bottom to top; boots are slot 0, helmet is slot 3. - // Since we have to display horizontally due to space restrictions, - // making the left side the "top" is more user-friendly. - int armorIndex; - EquipmentSlot slot; - switch (i) { - case 3 -> { - armorIndex = 0; - slot = EquipmentSlot.FEET; - } - case 2 -> { - armorIndex = 1; - slot = EquipmentSlot.LEGS; - } - case 1 -> { - armorIndex = 2; - slot = EquipmentSlot.CHEST; - } - case 0 -> { - armorIndex = 3; - slot = EquipmentSlot.HEAD; - } - default -> { - // In the event that new armor slots are added, they can be placed at the end. - armorIndex = i; - slot = EquipmentSlot.MAINHAND; - } - } - - slots.set(startIndex + i, new ContentEquipment(owner, armorIndex, slot)); - } - - return startIndex + listSize; - } - - private int addOffHand(int startIndex) { - int listSize = owner.getInventory().offhand.size(); - for (int localIndex = 0; localIndex < listSize; ++localIndex) { - slots.set(startIndex + localIndex, new ContentOffHand(owner, localIndex)); - } - return startIndex + listSize; - } - - private int addCrafting(int startIndex, boolean pretty) { - int listSize = owner.inventoryMenu.getCraftSlots().getContents().size(); - pretty &= listSize == 4; - - for (int localIndex = 0; localIndex < listSize; ++localIndex) { - // Pretty display is a 2x2 rather than linear. - // If index is in top row, grid is not 2x2, or pretty is disabled, just use current index. - // Otherwise, subtract 2 and add 9 to start in the same position on the next row. - int modIndex = startIndex + (localIndex < 2 || !pretty ? localIndex : localIndex + 7); - - slots.set(modIndex, new ContentCrafting(owner, localIndex)); - } - - if (pretty) { - slots.set(startIndex + 2, new ContentViewOnly(owner) { - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotViewOnly(container, slot, x, y) { - @Override - public ItemStack getOrDefault() { - return Placeholders.craftingOutput; - } - }; - } - }); - slots.set(startIndex + 11, new ContentCraftingResult(owner)); - } - - return startIndex + listSize; - } - - public Slot getMenuSlot(int index, int x, int y) { - return slots.get(index).asSlot(this, index, x, y); - } - - public InventoryType.SlotType getSlotType(int index) { - return slots.get(index).getSlotType(); - } - - public @NotNull Component getTitle(@Nullable ServerPlayer viewer) { - MutableComponent component = Component.empty(); - // Prefix for use with custom bitmap image fonts. - if (owner.equals(viewer)) { - component.append( - Component.translatableWithFallback("openinv.container.inventory.self", "") - .withStyle(style -> style - .withFont(ResourceLocation.parse("openinv:font/inventory")) - .withColor(ChatFormatting.WHITE))); - } else { - component.append( - Component.translatableWithFallback("openinv.container.inventory.other", "") - .withStyle(style -> style - .withFont(ResourceLocation.parse("openinv:font/inventory")) - .withColor(ChatFormatting.WHITE))); - } - // Normal title: "Inventory - OwnerName" - component.append(Component.translatableWithFallback("openinv.container.inventory.prefix", "", owner.getName())) - .append(Component.translatable("container.inventory")) - .append(Component.translatableWithFallback("openinv.container.inventory.suffix", " - %s", owner.getName())); - return component; - } - - @Override - public ServerPlayer getOwnerHandle() { - return owner; - } - - @Override - public @NotNull org.bukkit.inventory.Inventory getBukkitInventory() { - if (bukkitEntity == null) { - bukkitEntity = new OpenPlayerInventory(this); - } - return bukkitEntity; - } - - @Override - public void setPlayerOnline(@NotNull org.bukkit.entity.Player player) { - ServerPlayer newOwner = PlayerManager.getHandle(player); - // Only transfer regular inventory - crafting and cursor slots are transient. - newOwner.getInventory().replaceWith(owner.getInventory()); - owner = newOwner; - // Update slots to point to new inventory. - slots.forEach(slot -> slot.setHolder(newOwner)); - } - - @Override - public void setPlayerOffline() {} - - @Override - public boolean isInUse() { - return !transaction.isEmpty(); - } - - @Override - public @NotNull org.bukkit.entity.Player getPlayer() { - return getOwner(); - } - - @Override - public int getContainerSize() { - return size; - } - - @Override - public boolean isEmpty() { - return slots.stream().map(Content::get).allMatch(ItemStack::isEmpty); - } - - @Override - public ItemStack getItem(int index) { - return slots.get(index).get(); - } - - @Override - public ItemStack removeItem(int index, int amount) { - return slots.get(index).removePartial(amount); - } - - @Override - public ItemStack removeItemNoUpdate(int index) { - return slots.get(index).remove(); - } - - @Override - public void setItem(int index, ItemStack itemStack) { - slots.get(index).set(itemStack); - } - - @Override - public int getMaxStackSize() { - return maxStackSize; - } - - @Override - public void setMaxStackSize(int maxStackSize) { - this.maxStackSize = maxStackSize; - } - - @Override - public void setChanged() {} - - @Override - public boolean stillValid(Player player) { - return true; - } - - @Override - public List getContents() { - NonNullList contents = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); - for (int i = 0; i < getContainerSize(); ++i) { - contents.set(i, getItem(i)); - } - return contents; - } - - @Override - public void onOpen(CraftHumanEntity viewer) { - transaction.add(viewer); - } - - @Override - public void onClose(CraftHumanEntity viewer) { - transaction.remove(viewer); - } - - @Override - public List getViewers() { - return transaction; - } - - @Override - public org.bukkit.entity.Player getOwner() { - return owner.getBukkitEntity(); - } - - @Override - public Location getLocation() { - return owner.getBukkitEntity().getLocation(); - } - - @Override - public void clearContent() { - owner.getInventory().clearContent(); - owner.inventoryMenu.getCraftSlots().clearContent(); - owner.inventoryMenu.slotsChanged(owner.inventoryMenu.getCraftSlots()); - owner.containerMenu.setCarried(ItemStack.EMPTY); - } - - public @Nullable AbstractContainerMenu createMenu(Player player, int i, boolean viewOnly) { - if (player instanceof ServerPlayer serverPlayer) { - return new OpenInventoryMenu(this, serverPlayer, i, viewOnly); - } - return null; - } - -} diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/Placeholders.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/Placeholders.java deleted file mode 100644 index ec9422f5..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/Placeholders.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2.container; - -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.Registries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.TagParser; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.Unit; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.component.CustomModelData; -import net.minecraft.world.item.component.DyedItemColor; -import net.minecraft.world.level.GameType; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.entity.BannerPattern; -import net.minecraft.world.level.block.entity.BannerPatternLayers; -import net.minecraft.world.level.block.entity.BannerPatterns; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.craftbukkit.v1_21_R2.CraftRegistry; -import org.jetbrains.annotations.NotNull; - -import java.util.EnumMap; -import java.util.List; -import java.util.Optional; - -public final class Placeholders { - - private static final CustomModelData DEFAULT_CUSTOM_MODEL_DATA = new CustomModelData(9999); - public static final @NotNull EnumMap BLOCKED_GAME_TYPE = new EnumMap<>(GameType.class); - public static @NotNull ItemStack craftingOutput = defaultCraftingOutput(); - public static @NotNull ItemStack cursor = defaultCursor(); - public static @NotNull ItemStack drop = defaultDrop(); - public static @NotNull ItemStack emptyHelmet = getEmptyArmor(Items.LEATHER_HELMET); - public static @NotNull ItemStack emptyChestplate = getEmptyArmor(Items.LEATHER_CHESTPLATE); - public static @NotNull ItemStack emptyLeggings = getEmptyArmor(Items.LEATHER_LEGGINGS); - public static @NotNull ItemStack emptyBoots = getEmptyArmor(Items.LEATHER_BOOTS); - public static @NotNull ItemStack emptyOffHand = getEmptyShield(); - public static @NotNull ItemStack notSlot = defaultNotSlot(); - public static @NotNull ItemStack blockedOffline = defaultBlockedOffline(); - - static { - for (GameType type : GameType.values()) { - // Barrier: "Not available - Creative" etc. - ItemStack typeItem = new ItemStack(Items.BARRIER); - typeItem.set( - DataComponents.ITEM_NAME, - Component.translatable("options.narrator.notavailable").append(" - ").append(type.getShortDisplayName())); - BLOCKED_GAME_TYPE.put(type, typeItem); - } - } - - public static void load(@NotNull ConfigurationSection section) throws Exception { - craftingOutput = parse(section, "crafting-output", craftingOutput); - cursor = parse(section, "cursor", cursor); - drop = parse(section, "drop", drop); - emptyHelmet = parse(section, "empty-helmet", emptyHelmet); - emptyChestplate = parse(section, "empty-chestplate", emptyChestplate); - emptyLeggings = parse(section, "empty-leggings", emptyLeggings); - emptyBoots = parse(section, "empty-boots", emptyBoots); - emptyOffHand = parse(section, "empty-off-hand", emptyOffHand); - notSlot = parse(section, "not-a-slot", notSlot); - blockedOffline = parse(section, "blocked.offline", blockedOffline); - BLOCKED_GAME_TYPE.put(GameType.CREATIVE, parse(section, "blocked.creative", BLOCKED_GAME_TYPE.get(GameType.CREATIVE))); - BLOCKED_GAME_TYPE.put(GameType.SPECTATOR, parse(section, "blocked.spectator", BLOCKED_GAME_TYPE.get(GameType.SPECTATOR))); - } - - private static @NotNull ItemStack parse( - @NotNull ConfigurationSection section, - @NotNull String path, - @NotNull ItemStack defaultStack) throws Exception { - String itemText = section.getString(path); - - if (itemText == null) { - return defaultStack; - } - - CompoundTag compoundTag = TagParser.parseTag(itemText); - Optional parsed = ItemStack.parse(CraftRegistry.getMinecraftRegistry(), compoundTag); - return parsed.filter(itemStack -> !itemStack.isEmpty()).orElse(defaultStack); - } - - public static ItemStack survivalOnly(@NotNull ServerPlayer serverPlayer) { - if (serverPlayer.connection == null || serverPlayer.connection.isDisconnected()) { - return blockedOffline; - } - - return BLOCKED_GAME_TYPE.getOrDefault(serverPlayer.gameMode.getGameModeForPlayer(), ItemStack.EMPTY); - } - - private static ItemStack defaultCraftingOutput() { - // Crafting table: "Crafting" - ItemStack itemStack = new ItemStack(Items.CRAFTING_TABLE); - itemStack.set(DataComponents.ITEM_NAME, Component.translatable("container.crafting")); - itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); - return itemStack; - } - - private static ItemStack defaultCursor() { - // Cursor-like banner with no tooltip - ItemStack itemStack = new ItemStack(Items.WHITE_BANNER); - RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); - Registry bannerPatterns = minecraftRegistry.lookupOrThrow(Registries.BANNER_PATTERN); - BannerPattern halfDiagBottomRight = bannerPatterns.getOrThrow(BannerPatterns.DIAGONAL_RIGHT).value(); - BannerPattern downRight = bannerPatterns.getOrThrow(BannerPatterns.STRIPE_DOWNRIGHT).value(); - BannerPattern border = bannerPatterns.getOrThrow(BannerPatterns.BORDER).value(); - itemStack.set(DataComponents.BANNER_PATTERNS, - new BannerPatternLayers(List.of( - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(halfDiagBottomRight), DyeColor.GRAY), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(downRight), DyeColor.WHITE), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(border), DyeColor.GRAY)))); - itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); - itemStack.set(DataComponents.HIDE_TOOLTIP, Unit.INSTANCE); - return itemStack; - } - - private static ItemStack defaultDrop() { - // Dropper: "Drop Selected Item" - ItemStack itemStack = new ItemStack(Items.DROPPER); - // Note: translatable component, not keybind component! We want the text identifying the keybind, not the key. - itemStack.set(DataComponents.ITEM_NAME, Component.translatable("key.drop")); - itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); - return itemStack; - } - - private static ItemStack getEmptyArmor(ItemLike item) { - // Inventory-background-grey-ish leather armor with no tooltip - ItemStack itemStack = new ItemStack(item); - DyedItemColor color = new DyedItemColor(0xC8C8C8, false); - itemStack.set(DataComponents.DYED_COLOR, color); - itemStack.set(DataComponents.HIDE_TOOLTIP, Unit.INSTANCE); - itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); - return itemStack; - } - - private static ItemStack getEmptyShield() { - ItemStack itemStack = new ItemStack(Items.SHIELD); - itemStack.set(DataComponents.BASE_COLOR, DyeColor.MAGENTA); - RegistryAccess minecraftRegistry = CraftRegistry.getMinecraftRegistry(); - Registry bannerPatterns = minecraftRegistry.lookupOrThrow(Registries.BANNER_PATTERN); - BannerPattern halfLeft = bannerPatterns.getOrThrow(BannerPatterns.HALF_VERTICAL).value(); - BannerPattern topLeft = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_TOP_LEFT).value(); - BannerPattern topRight = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_TOP_RIGHT).value(); - BannerPattern bottomLeft = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_BOTTOM_LEFT).value(); - BannerPattern bottomRight = bannerPatterns.getOrThrow(BannerPatterns.SQUARE_BOTTOM_RIGHT).value(); - itemStack.set(DataComponents.BANNER_PATTERNS, - new BannerPatternLayers(List.of( - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(halfLeft), DyeColor.BLACK), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(topLeft), DyeColor.MAGENTA), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(bottomLeft), DyeColor.MAGENTA), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(topRight), DyeColor.BLACK), - new BannerPatternLayers.Layer(bannerPatterns.wrapAsHolder(bottomRight), DyeColor.BLACK)))); - itemStack.set(DataComponents.HIDE_TOOLTIP, Unit.INSTANCE); - itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); - return itemStack; - } - - private static ItemStack defaultNotSlot() { - // White pane with no tooltip - ItemStack itemStack = new ItemStack(Items.WHITE_STAINED_GLASS_PANE); - itemStack.set(DataComponents.HIDE_TOOLTIP, Unit.INSTANCE); - itemStack.set(DataComponents.CUSTOM_MODEL_DATA, DEFAULT_CUSTOM_MODEL_DATA); - return itemStack; - } - - private static ItemStack defaultBlockedOffline() { - // Barrier: "Not available - Offline" - ItemStack itemStack = new ItemStack(Items.BARRIER); - itemStack.set(DataComponents.ITEM_NAME, - Component.translatable("options.narrator.notavailable") - .append(Component.literal(" - ")) - .append(Component.translatable("gui.socialInteractions.status_offline"))); - return itemStack; - } - - private Placeholders() { - throw new IllegalStateException("Cannot create instance of utility class."); - } - -} diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/menu/OpenChestMenu.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/menu/OpenChestMenu.java deleted file mode 100644 index 73babce1..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/menu/OpenChestMenu.java +++ /dev/null @@ -1,479 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2.container.menu; - -import com.google.common.base.Suppliers; -import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.InternalOwned; -import com.lishid.openinv.internal.v1_21_R2.container.bukkit.OpenDummyInventory; -import com.lishid.openinv.internal.v1_21_R2.container.slot.SlotPlaceholder; -import com.lishid.openinv.internal.v1_21_R2.container.slot.SlotViewOnly; -import it.unimi.dsi.fastutil.ints.IntArrayList; -import it.unimi.dsi.fastutil.ints.IntList; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ChestMenu; -import net.minecraft.world.inventory.ClickType; -import net.minecraft.world.inventory.ContainerData; -import net.minecraft.world.inventory.ContainerListener; -import net.minecraft.world.inventory.ContainerSynchronizer; -import net.minecraft.world.inventory.DataSlot; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftInventoryView; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -/** - * An extension of {@link AbstractContainerMenu} that supports {@link SlotPlaceholder placeholders}. - */ -public abstract class OpenChestMenu> - extends AbstractContainerMenu { - - protected static final int BOTTOM_INVENTORY_SIZE = 36; - - protected final T container; - protected final ServerPlayer viewer; - protected final boolean viewOnly; - protected final boolean ownContainer; - protected final int topSize; - private CraftInventoryView, Inventory> bukkitEntity; - // Syncher fields - private @Nullable ContainerSynchronizer synchronizer; - private final List dataSlots = new ArrayList<>(); - private final IntList remoteDataSlots = new IntArrayList(); - private final List containerListeners = new ArrayList<>(); - private ItemStack remoteCarried = ItemStack.EMPTY; - private boolean suppressRemoteUpdates; - - protected OpenChestMenu( - @NotNull MenuType type, - int containerCounter, - @NotNull T container, - @NotNull ServerPlayer viewer, - boolean viewOnly) { - super(type, containerCounter); - this.container = container; - this.viewer = viewer; - this.viewOnly = viewOnly; - ownContainer = container.getOwnerHandle().equals(viewer); - topSize = getTopSize(viewer); - - preSlotSetup(); - - int upperRows = topSize / 9; - // View's upper inventory - our container - for (int row = 0; row < upperRows; ++row) { - for (int col = 0; col < 9; ++col) { - // x and y for client purposes, but hey, we're thorough here. - // Adapted from net.minecraft.world.inventory.ChestMenu - int x = 8 + col * 18; - int y = 18 + row * 18; - int index = row * 9 + col; - - // Guard against weird inventory sizes. - if (index >= container.getContainerSize()) { - addSlot(new SlotViewOnly(container, index, x, y)); - continue; - } - - Slot slot = getUpperSlot(index, x, y); - - addSlot(slot); - } - } - - // View's lower inventory - viewer inventory - int playerInvPad = (upperRows - 4) * 18; - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 9; ++col) { - int x = 8 + col * 18; - int y = playerInvPad + row * 18 + 103; - addSlot(new Slot(viewer.getInventory(), row * 9 + col + 9, x, y)); - } - } - // Hotbar - for (int col = 0; col < 9; ++col) { - int x = 8 + col * 18; - int y = playerInvPad + 161; - addSlot(new Slot(viewer.getInventory(), col, x, y)); - } - } - - public static @NotNull MenuType getChestMenuType(int inventorySize) { - inventorySize = ((int) Math.ceil(inventorySize / 9.0)) * 9; - return switch (inventorySize) { - case 9 -> MenuType.GENERIC_9x1; - case 18 -> MenuType.GENERIC_9x2; - case 27 -> MenuType.GENERIC_9x3; - case 36 -> MenuType.GENERIC_9x4; - case 45 -> MenuType.GENERIC_9x5; - case 54 -> MenuType.GENERIC_9x6; - default -> throw new IllegalArgumentException("Inventory size unsupported: " + inventorySize); - }; - } - - protected void preSlotSetup() {} - - protected @NotNull Slot getUpperSlot(int index, int x, int y) { - Slot slot = new Slot(container, index, x, y); - if (viewOnly) { - return SlotViewOnly.wrap(slot); - } - return slot; - } - - - @Override - public final @NotNull CraftInventoryView, Inventory> getBukkitView() { - if (bukkitEntity == null) { - bukkitEntity = createBukkitEntity(); - } - - return bukkitEntity; - } - - protected @NotNull CraftInventoryView, Inventory> createBukkitEntity() { - Inventory top; - if (viewOnly) { - top = new OpenDummyInventory(container, container.getBukkitType()); - } else { - top = container.getBukkitInventory(); - } - return new CraftInventoryView<>(viewer.getBukkitEntity(), top, this) { - @Override - public @Nullable Inventory getInventory(int rawSlot) { - if (viewOnly) { - return null; - } - return super.getInventory(rawSlot); - } - - @Override - public int convertSlot(int rawSlot) { - if (viewOnly) { - return InventoryView.OUTSIDE; - } - return super.convertSlot(rawSlot); - } - - @Override - public @NotNull InventoryType.SlotType getSlotType(int slot) { - if (viewOnly) { - return InventoryType.SlotType.OUTSIDE; - } - return super.getSlotType(slot); - } - }; - } - - private int getTopSize(ServerPlayer viewer) { - MenuType menuType = getType(); - if (menuType == null) { - throw new IllegalStateException("MenuType cannot be null!"); - } else if (menuType == MenuType.GENERIC_9x1) { - return 9; - } else if (menuType == MenuType.GENERIC_9x2) { - return 18; - } else if (menuType == MenuType.GENERIC_9x3) { - return 27; - } else if (menuType == MenuType.GENERIC_9x4) { - return 36; - } else if (menuType == MenuType.GENERIC_9x5) { - return 45; - } else if (menuType == MenuType.GENERIC_9x6) { - return 54; - } - // This is a bit gross, but allows us a safe fallthrough. - return menuType.create(-1, viewer.getInventory()).slots.size() - BOTTOM_INVENTORY_SIZE; - } - - /** - * Reimplementation of {@link AbstractContainerMenu#moveItemStackTo(ItemStack, int, int, boolean)} that ignores fake - * slots and respects {@link Slot#hasItem()}. - * - * @param itemStack the stack to quick-move - * @param rangeLow the start of the range of slots that can be moved to, inclusive - * @param rangeHigh the end of the range of slots that can be moved to, exclusive - * @param topDown whether to start at the top of the range or bottom - * @return whether the stack was modified as a result of being quick-moved - */ - @Override - protected boolean moveItemStackTo(ItemStack itemStack, int rangeLow, int rangeHigh, boolean topDown) { - boolean modified = false; - boolean stackable = itemStack.isStackable(); - Slot firstEmpty = null; - - for (int index = topDown ? rangeHigh - 1 : rangeLow; - !itemStack.isEmpty() && (topDown ? index >= rangeLow : index < rangeHigh); - index += topDown ? -1 : 1 - ) { - Slot slot = slots.get(index); - // If the slot cannot be added to, check the next slot. - if (slot.isFake() || !slot.mayPlace(itemStack)) { - continue; - } - - if (slot.hasItem()) { - // If the item isn't stackable, check the next slot. - if (!stackable) { - continue; - } - // Otherwise, add as many as we can from our stack to the slot. - modified |= addToExistingStack(itemStack, slot); - } else { - // If this is the first empty slot, keep track of it for later use. - if (firstEmpty == null) { - firstEmpty = slot; - } - // If the item isn't stackable, we've located the slot we're adding it to, so we're done. - if (!stackable) { - break; - } - } - } - - // If the item hasn't been fully added yet, add as many as we can to the first open slot. - if (!itemStack.isEmpty() && firstEmpty != null) { - firstEmpty.setByPlayer(itemStack.split(Math.min(itemStack.getCount(), firstEmpty.getMaxStackSize(itemStack)))); - firstEmpty.setChanged(); - modified = true; - } - - return modified; - } - - private static boolean addToExistingStack(ItemStack itemStack, Slot slot) { - ItemStack existing = slot.getItem(); - - // If the items aren't the same, we can't add our item. - if (!ItemStack.isSameItemSameComponents(itemStack, existing)) { - return false; - } - - int max = slot.getMaxStackSize(existing); - int existingCount = existing.getCount(); - - // If the stack is already full, we can't add more. - if (existingCount >= max) { - return false; - } - - int total = existingCount + itemStack.getCount(); - - // If the existing item can accept the entirety of our item, we're done! - if (total <= max) { - itemStack.setCount(0); - existing.setCount(total); - slot.setChanged(); - return true; - } - - // Otherwise, add as many as we can. - itemStack.shrink(max - existingCount); - existing.setCount(max); - slot.setChanged(); - return true; - } - - @Override - public void clicked(int i, int j, ClickType clickType, Player player) { - if (viewOnly) { - if (clickType == ClickType.QUICK_CRAFT) { - sendAllDataToRemote(); - } - return; - } - super.clicked(i, j, clickType, player); - } - - @Override - public boolean stillValid(Player player) { - return true; - } - - // Overrides from here on are purely to modify the sync process to send placeholder items. - @Override - protected Slot addSlot(Slot slot) { - slot.index = this.slots.size(); - this.slots.add(slot); - this.lastSlots.add(ItemStack.EMPTY); - this.remoteSlots.add(ItemStack.EMPTY); - return slot; - } - - @Override - protected DataSlot addDataSlot(DataSlot dataSlot) { - this.dataSlots.add(dataSlot); - this.remoteDataSlots.add(0); - return dataSlot; - } - - @Override - protected void addDataSlots(ContainerData containerData) { - for (int i = 0; i < containerData.getCount(); i++) { - this.addDataSlot(DataSlot.forContainer(containerData, i)); - } - } - - @Override - public void addSlotListener(ContainerListener containerListener) { - if (!this.containerListeners.contains(containerListener)) { - this.containerListeners.add(containerListener); - this.broadcastChanges(); - } - } - - @Override - public void setSynchronizer(ContainerSynchronizer containerSynchronizer) { - this.synchronizer = containerSynchronizer; - this.sendAllDataToRemote(); - } - - @Override - public void sendAllDataToRemote() { - for (int index = 0; index < slots.size(); ++index) { - Slot slot = slots.get(index); - this.remoteSlots.set(index, (slot instanceof SlotPlaceholder placeholder ? placeholder.getOrDefault() : slot.getItem()).copy()); - } - - remoteCarried = getCarried().copy(); - - for (int index = 0; index < this.dataSlots.size(); ++index) { - this.remoteDataSlots.set(index, this.dataSlots.get(index).get()); - } - - if (this.synchronizer != null) { - this.synchronizer.sendInitialData(this, this.remoteSlots, this.remoteCarried, this.remoteDataSlots.toIntArray()); - } - } - - @Override - public void broadcastCarriedItem() { - this.remoteCarried = this.getCarried().copy(); - if (this.synchronizer != null) { - this.synchronizer.sendCarriedChange(this, this.remoteCarried); - } - } - - @Override - public void removeSlotListener(ContainerListener containerListener) { - this.containerListeners.remove(containerListener); - } - - @Override - public void broadcastChanges() { - for (int index = 0; index < this.slots.size(); ++index) { - Slot slot = this.slots.get(index); - ItemStack itemstack = slot instanceof SlotPlaceholder placeholder ? placeholder.getOrDefault() : slot.getItem(); - Supplier supplier = Suppliers.memoize(itemstack::copy); - this.triggerSlotListeners(index, itemstack, supplier); - this.synchronizeSlotToRemote(index, itemstack, supplier); - } - - this.synchronizeCarriedToRemote(); - - for (int index = 0; index < this.dataSlots.size(); ++index) { - DataSlot dataSlot = this.dataSlots.get(index); - int j = dataSlot.get(); - if (dataSlot.checkAndClearUpdateFlag()) { - this.updateDataSlotListeners(index, j); - } - - this.synchronizeDataSlotToRemote(index, j); - } - } - - @Override - public void broadcastFullState() { - for (int index = 0; index < this.slots.size(); ++index) { - ItemStack itemstack = this.slots.get(index).getItem(); - this.triggerSlotListeners(index, itemstack, itemstack::copy); - } - - for (int index = 0; index < this.dataSlots.size(); ++index) { - DataSlot containerproperty = this.dataSlots.get(index); - if (containerproperty.checkAndClearUpdateFlag()) { - this.updateDataSlotListeners(index, containerproperty.get()); - } - } - - this.sendAllDataToRemote(); - } - - private void updateDataSlotListeners(int i, int j) { - for (ContainerListener containerListener : this.containerListeners) { - containerListener.dataChanged(this, i, j); - } - } - - private void triggerSlotListeners(int index, ItemStack itemStack, Supplier supplier) { - ItemStack itemStack1 = this.lastSlots.get(index); - if (!ItemStack.matches(itemStack1, itemStack)) { - ItemStack itemStack2 = supplier.get(); - this.lastSlots.set(index, itemStack2); - - for (ContainerListener containerListener : this.containerListeners) { - containerListener.slotChanged(this, index, itemStack2); - } - } - } - - private void synchronizeSlotToRemote(int i, ItemStack itemStack, Supplier supplier) { - if (!this.suppressRemoteUpdates) { - ItemStack itemStack1 = this.remoteSlots.get(i); - if (!ItemStack.matches(itemStack1, itemStack)) { - ItemStack itemstack2 = supplier.get(); - this.remoteSlots.set(i, itemstack2); - if (this.synchronizer != null) { - this.synchronizer.sendSlotChange(this, i, itemstack2); - } - } - } - } - - private void synchronizeDataSlotToRemote(int index, int value) { - if (!this.suppressRemoteUpdates) { - int existing = this.remoteDataSlots.getInt(index); - if (existing != value) { - this.remoteDataSlots.set(index, value); - if (this.synchronizer != null) { - this.synchronizer.sendDataChange(this, index, value); - } - } - } - } - - private void synchronizeCarriedToRemote() { - if (!this.suppressRemoteUpdates && !ItemStack.matches(this.getCarried(), this.remoteCarried)) { - this.remoteCarried = this.getCarried().copy(); - if (this.synchronizer != null) { - this.synchronizer.sendCarriedChange(this, this.remoteCarried); - } - } - } - - @Override - public void setRemoteCarried(ItemStack itemstack) { - this.remoteCarried = itemstack.copy(); - } - - @Override - public void suppressRemoteUpdates() { - this.suppressRemoteUpdates = true; - } - - @Override - public void resumeRemoteUpdates() { - this.suppressRemoteUpdates = false; - } - -} diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/menu/OpenEnderChestMenu.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/menu/OpenEnderChestMenu.java deleted file mode 100644 index 832efa73..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/menu/OpenEnderChestMenu.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2.container.menu; - -import com.lishid.openinv.internal.v1_21_R2.container.OpenEnderChest; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -public class OpenEnderChestMenu extends OpenChestMenu { - - public OpenEnderChestMenu( - @NotNull OpenEnderChest enderChest, - @NotNull ServerPlayer viewer, - int containerId, - boolean viewOnly) { - super(getChestMenuType(enderChest.getContainerSize()), containerId, enderChest, viewer, viewOnly); - } - - @Override - public ItemStack quickMoveStack(Player player, int index) { - if (viewOnly) { - return ItemStack.EMPTY; - } - - // See ChestMenu - Slot slot = this.slots.get(index); - - if (slot.isFake() || !slot.hasItem()) { - return ItemStack.EMPTY; - } - - ItemStack itemStack = slot.getItem(); - ItemStack original = itemStack.copy(); - - if (index < topSize) { - if (!this.moveItemStackTo(itemStack, topSize, this.slots.size(), true)) { - return ItemStack.EMPTY; - } - } else if (!this.moveItemStackTo(itemStack, 0, topSize, false)) { - return ItemStack.EMPTY; - } - - if (itemStack.isEmpty()) { - slot.setByPlayer(ItemStack.EMPTY); - } else { - slot.setChanged(); - } - - return original; - } - -} diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentEquipment.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentEquipment.java deleted file mode 100644 index def3448b..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentEquipment.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; - -import com.lishid.openinv.internal.v1_21_R2.container.Placeholders; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; - -/** - * A slot for equipment that displays placeholders if empty. - */ -public class ContentEquipment extends ContentList { - - private final ItemStack placeholder; - private final EquipmentSlot equipmentSlot; - - public ContentEquipment(ServerPlayer holder, int index, EquipmentSlot equipmentSlot) { - super(holder, index, InventoryType.SlotType.ARMOR); - placeholder = switch (equipmentSlot) { - case HEAD -> Placeholders.emptyHelmet; - case CHEST -> Placeholders.emptyChestplate; - case LEGS -> Placeholders.emptyLeggings; - case FEET -> Placeholders.emptyBoots; - default -> Placeholders.emptyOffHand; - }; - this.equipmentSlot = equipmentSlot; - } - - @Override - public void setHolder(@NotNull ServerPlayer holder) { - this.items = holder.getInventory().armor; - } - - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotEquipment(container, slot, x, y); - } - - public class SlotEquipment extends SlotPlaceholder { - - private ServerPlayer viewer; - - SlotEquipment(Container container, int index, int x, int y) { - super(container, index, x, y); - } - - @Override - public ItemStack getOrDefault() { - ItemStack itemStack = getItem(); - if (!itemStack.isEmpty()) { - return itemStack; - } - return placeholder; - } - - public EquipmentSlot getEquipmentSlot() { - return equipmentSlot; - } - - public void onlyEquipmentFor(ServerPlayer viewer) { - this.viewer = viewer; - } - - @Override - public boolean mayPlace(ItemStack var0) { - if (viewer == null) { - return true; - } - - return equipmentSlot == EquipmentSlot.OFFHAND || viewer.getEquipmentSlotForItem(var0) == equipmentSlot; - } - - } - -} diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentList.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentList.java deleted file mode 100644 index 27490a50..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentList.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; - -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.ContainerHelper; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.event.inventory.InventoryType; - -import java.util.List; - -/** - * A normal slot backed by an item list. - */ -public abstract class ContentList implements Content { - - private final int index; - private final InventoryType.SlotType slotType; - protected List items; - - public ContentList(ServerPlayer holder, int index, InventoryType.SlotType slotType) { - this.index = index; - this.slotType = slotType; - setHolder(holder); - } - - @Override - public ItemStack get() { - return items.get(index); - } - - @Override - public ItemStack remove() { - ItemStack removed = items.remove(index); - return removed == null || removed.isEmpty() ? ItemStack.EMPTY : removed; - } - - @Override - public ItemStack removePartial(int amount) { - return ContainerHelper.removeItem(items, index, amount); - } - - @Override - public void set(ItemStack itemStack) { - items.set(index, itemStack); - } - - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new Slot(container, slot, x, y); - } - - @Override - public InventoryType.SlotType getSlotType() { - return slotType; - } - -} diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentOffHand.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentOffHand.java deleted file mode 100644 index dc97b4c6..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentOffHand.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; - -import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.inventory.Slot; -import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; - -/** - * A slot for equipment that updates held items if necessary. - */ -public class ContentOffHand extends ContentEquipment { - - private ServerPlayer holder; - - public ContentOffHand(ServerPlayer holder, int localIndex) { - super(holder, localIndex, EquipmentSlot.OFFHAND); - } - - @Override - public void setHolder(@NotNull ServerPlayer holder) { - this.items = holder.getInventory().offhand; - this.holder = holder; - } - - @Override - public InventoryType.SlotType getSlotType() { - return InventoryType.SlotType.QUICKBAR; - } - - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotEquipment(container, slot, x, y) { - @Override - public void setChanged() { - if (holder.connection != null - && !holder.connection.isDisconnected() - && holder.containerMenu != holder.inventoryMenu) { - holder.connection.send( - new ClientboundContainerSetSlotPacket( - holder.inventoryMenu.containerId, - holder.inventoryMenu.incrementStateId(), - InventoryMenu.SHIELD_SLOT, - holder.getOffhandItem())); - } - } - }; - } - -} diff --git a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentViewOnly.java b/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentViewOnly.java deleted file mode 100644 index 37213db0..00000000 --- a/internal/v1_21_R2/src/main/java/com/lishid/openinv/internal/v1_21_R2/container/slot/ContentViewOnly.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R2.container.slot; - -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; - -/** - * A view-only slot that can't be interacted with. - */ -public class ContentViewOnly implements Content { - - @NotNull ServerPlayer holder; - - public ContentViewOnly(@NotNull ServerPlayer holder) { - this.holder = holder; - } - - @Override - public void setHolder(@NotNull ServerPlayer holder) { - this.holder = holder; - } - - @Override - public ItemStack get() { - return ItemStack.EMPTY; - } - - @Override - public ItemStack remove() { - return ItemStack.EMPTY; - } - - @Override - public ItemStack removePartial(int amount) { - return ItemStack.EMPTY; - } - - @Override - public void set(ItemStack itemStack) { - this.holder.drop(itemStack, false); - } - - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotViewOnly(container, slot, x, y); - } - - @Override - public InventoryType.SlotType getSlotType() { - return InventoryType.SlotType.OUTSIDE; - } - -} diff --git a/internal/v1_21_R3/pom.xml b/internal/v1_21_R3/pom.xml deleted file mode 100644 index 733f3b4b..00000000 --- a/internal/v1_21_R3/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - 4.0.0 - - - openinvparent - com.lishid - ../../pom.xml - 5.1.7-SNAPSHOT - - - openinvadapter1_21_R3 - OpenInvAdapter1_21_R3 - - - 21 - 21 - 1.21.4-R0.1-SNAPSHOT - - - - - org.spigotmc - spigot-api - ${spigot.version} - - - spigot - org.spigotmc - provided - ${spigot.version} - remapped-mojang - - - openinvapi - com.lishid - - - openinvcommon - com.lishid - - - annotations - org.jetbrains - - - - - - - maven-compiler-plugin - - - net.md-5 - specialsource-maven-plugin - - - - - diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/AnySilentContainer.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/AnySilentContainer.java deleted file mode 100644 index c2724bad..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/AnySilentContainer.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (C) 2011-2023 lishid. All rights reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.lishid.openinv.internal.v1_21_R3.container; - -import com.lishid.openinv.internal.AnySilentContainerBase; -import com.lishid.openinv.internal.v1_21_R3.container.menu.OpenChestMenu; -import com.lishid.openinv.internal.v1_21_R3.player.PlayerManager; -import com.lishid.openinv.util.ReflectionHelper; -import com.lishid.openinv.util.lang.LanguageManager; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.level.ServerPlayerGameMode; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.SimpleMenuProvider; -import net.minecraft.world.inventory.ChestMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.PlayerEnderChestContainer; -import net.minecraft.world.level.GameType; -import net.minecraft.world.level.block.BarrelBlock; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.ChestBlock; -import net.minecraft.world.level.block.ShulkerBoxBlock; -import net.minecraft.world.level.block.TrappedChestBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.EnderChestBlockEntity; -import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import org.bukkit.GameMode; -import org.bukkit.Material; -import org.bukkit.Statistic; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.util.logging.Logger; - -public class AnySilentContainer extends AnySilentContainerBase { - - private final @NotNull Logger logger; - private final @NotNull LanguageManager lang; - private @Nullable Field serverPlayerGameModeGameType; - - public AnySilentContainer(@NotNull Logger logger, @NotNull LanguageManager lang) { - this.logger = logger; - this.lang = lang; - try { - try { - this.serverPlayerGameModeGameType = ServerPlayerGameMode.class.getDeclaredField("b"); - this.serverPlayerGameModeGameType.setAccessible(true); - } catch (NoSuchFieldException e) { - logger.warning("ServerPlayerGameMode#gameModeForPlayer's obfuscated name has changed!"); - logger.warning("Please report this at https://github.com/Jikoo/OpenInv/issues"); - logger.warning("Attempting to fall through using reflection. Please verify that SilentContainer does not fail."); - // N.B. gameModeForPlayer is (for now) declared before previousGameModeForPlayer so silent shouldn't break. - this.serverPlayerGameModeGameType = ReflectionHelper.grabFieldByType(ServerPlayerGameMode.class, GameType.class); - } - } catch (SecurityException e) { - logger.warning("Unable to directly write player game mode! SilentContainer will fail."); - logger.log(java.util.logging.Level.WARNING, "Error obtaining GameType field", e); - } - } - - @Override - public boolean activateContainer( - @NotNull final Player bukkitPlayer, - final boolean silentchest, - @NotNull final org.bukkit.block.Block bukkitBlock) { - - // Silent ender chest is API-only - if (silentchest && bukkitBlock.getType() == Material.ENDER_CHEST) { - bukkitPlayer.openInventory(bukkitPlayer.getEnderChest()); - bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED); - return true; - } - - ServerPlayer player = PlayerManager.getHandle(bukkitPlayer); - - final net.minecraft.world.level.Level level = player.level(); - final BlockPos blockPos = new BlockPos(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ()); - final BlockEntity blockEntity = level.getBlockEntity(blockPos); - - if (blockEntity == null) { - return false; - } - - if (blockEntity instanceof EnderChestBlockEntity enderChestTile) { - // Anychest ender chest. See net.minecraft.world.level.block.EnderChestBlock - PlayerEnderChestContainer enderChest = player.getEnderChestInventory(); - enderChest.setActiveChest(enderChestTile); - player.openMenu(new SimpleMenuProvider((containerCounter, playerInventory, ignored) -> { - MenuType containers = OpenChestMenu.getChestMenuType(enderChest.getContainerSize()); - int rows = enderChest.getContainerSize() / 9; - return new ChestMenu(containers, containerCounter, playerInventory, enderChest, rows); - }, Component.translatable("container.enderchest"))); - bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED); - return true; - } - - if (!(blockEntity instanceof MenuProvider menuProvider)) { - return false; - } - - BlockState blockState = level.getBlockState(blockPos); - Block block = blockState.getBlock(); - - if (block instanceof ChestBlock chestBlock) { - - // boolean flag: do not check if chest is blocked - menuProvider = chestBlock.getMenuProvider(blockState, level, blockPos, true); - - if (menuProvider == null) { - lang.sendSystemMessage(bukkitPlayer, "messages.error.lootNotGenerated"); - return false; - } - - if (block instanceof TrappedChestBlock) { - bukkitPlayer.incrementStatistic(Statistic.TRAPPED_CHEST_TRIGGERED); - } else { - bukkitPlayer.incrementStatistic(Statistic.CHEST_OPENED); - } - } - - if (block instanceof ShulkerBoxBlock) { - bukkitPlayer.incrementStatistic(Statistic.SHULKER_BOX_OPENED); - } - - if (block instanceof BarrelBlock) { - bukkitPlayer.incrementStatistic(Statistic.OPEN_BARREL); - } - - // AnyChest only - SilentChest not active, container unsupported, or unnecessary. - if (!silentchest || player.gameMode.getGameModeForPlayer() == GameType.SPECTATOR) { - player.openMenu(menuProvider); - return true; - } - - // SilentChest requires access to setting players' game mode directly. - if (this.serverPlayerGameModeGameType == null) { - return false; - } - - if (blockEntity instanceof RandomizableContainerBlockEntity lootable) { - if (lootable.lootTable != null) { - lang.sendSystemMessage(bukkitPlayer, "messages.error.lootNotGenerated"); - return false; - } - } - - GameType gameType = player.gameMode.getGameModeForPlayer(); - this.forceGameType(player, GameType.SPECTATOR); - player.openMenu(menuProvider); - this.forceGameType(player, gameType); - return true; - } - - @Override - public void deactivateContainer(@NotNull final Player bukkitPlayer) { - if (this.serverPlayerGameModeGameType == null || bukkitPlayer.getGameMode() == GameMode.SPECTATOR) { - return; - } - - ServerPlayer player = PlayerManager.getHandle(bukkitPlayer); - - // Force game mode change without informing plugins or players. - // Regular game mode set calls GameModeChangeEvent and is cancellable. - GameType gameType = player.gameMode.getGameModeForPlayer(); - this.forceGameType(player, GameType.SPECTATOR); - - // ServerPlayer#closeContainer cannot be called without entering an - // infinite loop because this method is called during inventory close. - // From ServerPlayer#closeContainer -> CraftEventFactory#handleInventoryCloseEvent - player.containerMenu.transferTo(player.inventoryMenu, player.getBukkitEntity()); - // From ServerPlayer#closeContainer - player.doCloseContainer(); - // Regular inventory close will handle the rest - packet sending, etc. - - // Revert forced game mode. - this.forceGameType(player, gameType); - } - - private void forceGameType(final ServerPlayer player, final GameType gameMode) { - if (this.serverPlayerGameModeGameType == null) { - // No need to warn repeatedly, error on startup and lack of function should be enough. - return; - } - try { - this.serverPlayerGameModeGameType.setAccessible(true); - this.serverPlayerGameModeGameType.set(player.gameMode, gameMode); - } catch (IllegalArgumentException | IllegalAccessException e) { - logger.log(java.util.logging.Level.WARNING, "Error bypassing GameModeChangeEvent", e); - } - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenDummyInventory.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenDummyInventory.java deleted file mode 100644 index d859d8db..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenDummyInventory.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.bukkit; - -import com.lishid.openinv.internal.ViewOnly; -import net.minecraft.world.Container; -import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventory; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.HashMap; -import java.util.ListIterator; - -/** - * A locked down "empty" inventory that rejects plugin interaction. - */ -public class OpenDummyInventory extends CraftInventory implements ViewOnly { - - private final InventoryType type; - - public OpenDummyInventory(Container inventory, InventoryType type) { - super(inventory); - this.type = type; - } - - @Override - public @NotNull InventoryType getType() { - return type; - } - - @Override - public @Nullable ItemStack getItem(int index) { - return null; - } - - @Override - public void setItem(int index, @Nullable ItemStack item) { - - } - - @SuppressWarnings("NonApiType") - @Override - public @NotNull HashMap addItem(@NotNull ItemStack... items) throws IllegalArgumentException { - return arrayToHashMap(items); - } - - @SuppressWarnings("NonApiType") - @Override - public @NotNull HashMap removeItem(@NotNull ItemStack... items) throws IllegalArgumentException { - return arrayToHashMap(items); - } - - @SuppressWarnings("NonApiType") - private static @NotNull HashMap arrayToHashMap(@NotNull ItemStack[] items) { - HashMap ignored = new HashMap<>(); - for (int index = 0; index < items.length; ++index) { - ignored.put(index, items[index]); - } - return ignored; - } - - @Override - public ItemStack[] getContents() { - return new ItemStack[getSize()]; - } - - @Override - public void setContents(@NotNull ItemStack[] items) throws IllegalArgumentException { - - } - - @Override - public @NotNull ItemStack[] getStorageContents() { - return new ItemStack[getSize()]; - } - - @Override - public void setStorageContents(@NotNull ItemStack[] items) throws IllegalArgumentException { - - } - - @Override - public boolean contains(@NotNull Material material) throws IllegalArgumentException { - return false; - } - - @Override - public boolean contains(@Nullable ItemStack item) { - return false; - } - - @Override - public boolean contains(@NotNull Material material, int amount) throws IllegalArgumentException { - return false; - } - - @Override - public boolean contains(@Nullable ItemStack item, int amount) { - return false; - } - - @Override - public boolean containsAtLeast(@Nullable ItemStack item, int amount) { - return false; - } - - @SuppressWarnings("NonApiType") - @Override - public @NotNull HashMap all( - @NotNull Material material) throws IllegalArgumentException { - return new HashMap<>(); - } - - @SuppressWarnings("NonApiType") - @Override - public @NotNull HashMap all(@Nullable ItemStack item) { - return new HashMap<>(); - } - - @Override - public int first(@NotNull Material material) throws IllegalArgumentException { - return -1; - } - - @Override - public int first(@NotNull ItemStack item) { - return -1; - } - - @Override - public int firstEmpty() { - return -1; - } - - @Override - public boolean isEmpty() { - return true; - } - - @Override - public void remove(@NotNull Material material) throws IllegalArgumentException { - - } - - @Override - public void remove(@NotNull ItemStack item) { - - } - - @Override - public void clear(int index) { - - } - - @Override - public void clear() { - - } - - @Override - public @NotNull ListIterator iterator() { - return Collections.emptyListIterator(); - } - - @Override - public @NotNull ListIterator iterator(int index) { - return Collections.emptyListIterator(); - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenDummyPlayerInventory.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenDummyPlayerInventory.java deleted file mode 100644 index ced1128c..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenDummyPlayerInventory.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.bukkit; - -import net.minecraft.world.Container; -import org.bukkit.Material; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class OpenDummyPlayerInventory extends OpenDummyInventory implements PlayerInventory { - - public OpenDummyPlayerInventory(Container inventory) { - super(inventory, InventoryType.PLAYER); - } - - @Override - public HumanEntity getHolder() { - return (HumanEntity) super.getHolder(); - } - - @Override - public @NotNull ItemStack[] getArmorContents() { - return new ItemStack[4]; - } - - @Override - public @NotNull ItemStack[] getExtraContents() { - return new ItemStack[4]; - } - - @Override - public @Nullable ItemStack getHelmet() { - return null; - } - - @Override - public @Nullable ItemStack getChestplate() { - return null; - } - - @Override - public @Nullable ItemStack getLeggings() { - return null; - } - - @Override - public @Nullable ItemStack getBoots() { - return null; - } - - @Override - public void setItem(@NotNull EquipmentSlot slot, @Nullable ItemStack item) { - - } - - @Override - public @Nullable ItemStack getItem(@NotNull EquipmentSlot slot) { - return null; - } - - @Override - public void setArmorContents(@Nullable ItemStack[] items) { - - } - - @Override - public void setExtraContents(@Nullable ItemStack[] items) { - - } - - @Override - public void setHelmet(@Nullable ItemStack helmet) { - - } - - @Override - public void setChestplate(@Nullable ItemStack chestplate) { - - } - - @Override - public void setLeggings(@Nullable ItemStack leggings) { - - } - - @Override - public void setBoots(@Nullable ItemStack boots) { - - } - - @Override - public @NotNull ItemStack getItemInMainHand() { - return new ItemStack(Material.AIR); - } - - @Override - public void setItemInMainHand(@Nullable ItemStack item) { - - } - - @Override - public @NotNull ItemStack getItemInOffHand() { - return new ItemStack(Material.AIR); - } - - @Override - public void setItemInOffHand(@Nullable ItemStack item) { - - } - - @Override - public @NotNull ItemStack getItemInHand() { - return new ItemStack(Material.AIR); - } - - @Override - public void setItemInHand(@Nullable ItemStack stack) { - - } - - @Override - public int getHeldItemSlot() { - return 0; - } - - @Override - public void setHeldItemSlot(int slot) { - - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenPlayerInventory.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenPlayerInventory.java deleted file mode 100644 index 7d612d77..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenPlayerInventory.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.bukkit; - -import com.google.common.base.Preconditions; -import com.lishid.openinv.internal.v1_21_R3.container.OpenInventory; -import net.minecraft.core.NonNullList; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.player.Inventory; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventory; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class OpenPlayerInventory extends CraftInventory implements PlayerInventory { - - public OpenPlayerInventory(@NotNull OpenInventory inventory) { - super(inventory); - } - - @Override - public @NotNull OpenInventory getInventory() { - return (OpenInventory) super.getInventory(); - } - - @Override - public ItemStack[] getContents() { - return asCraftMirror(getInventory().getOwnerHandle().getInventory().getContents()); - } - - @Override - public void setContents(ItemStack[] items) { - Inventory internal = getInventory().getOwnerHandle().getInventory(); - int size = internal.getContainerSize(); - Preconditions.checkArgument(items.length <= size, "items.length must be <= %s", size); - - for (int index = 0; index < size; ++index) { - if (index < items.length) { - internal.setItem(index, CraftItemStack.asNMSCopy(items[index])); - } else { - internal.setItem(index, net.minecraft.world.item.ItemStack.EMPTY); - } - } - } - - @Override - public ItemStack[] getStorageContents() { - return asCraftMirror(getInventory().getOwnerHandle().getInventory().items); - } - - @Override - public void setStorageContents(ItemStack[] items) throws IllegalArgumentException { - NonNullList list = getInventory().getOwnerHandle().getInventory().items; - int size = list.size(); - Preconditions.checkArgument(items.length <= size, "items.length must be <= %s", size); - for (int index = 0; index < items.length; ++index) { - list.set(index, CraftItemStack.asNMSCopy(items[index])); - } - } - - @Override - public @NotNull InventoryType getType() { - return InventoryType.PLAYER; - } - - @Override - public @NotNull Player getHolder() { - return getInventory().getOwner(); - } - - @Override - public @NotNull ItemStack[] getArmorContents() { - return asCraftMirror(getInventory().getOwnerHandle().getInventory().armor); - } - - @Override - public void setArmorContents(@Nullable ItemStack[] items) { - NonNullList list = getInventory().getOwnerHandle().getInventory().armor; - int size = list.size(); - Preconditions.checkArgument(items.length <= size, "items.length must be <= %s", size); - for (int index = 0; index < items.length; ++index) { - list.set(index, CraftItemStack.asNMSCopy(items[index])); - } - } - - @Override - public @NotNull ItemStack[] getExtraContents() { - return asCraftMirror(getInventory().getOwnerHandle().getInventory().offhand); - } - - @Override - public void setExtraContents(@Nullable ItemStack[] items) { - NonNullList list = getInventory().getOwnerHandle().getInventory().offhand; - int size = list.size(); - Preconditions.checkArgument(items.length <= size, "items.length must be <= %s", size); - for (int index = 0; index < items.length; ++index) { - list.set(index, CraftItemStack.asNMSCopy(items[index])); - } - } - - @Override - public @Nullable ItemStack getHelmet() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory() - .getArmor(EquipmentSlot.HEAD.getIndex())); - } - - @Override - public void setHelmet(@Nullable ItemStack helmet) { - getInventory().getOwnerHandle().getInventory().armor - .set(EquipmentSlot.HEAD.getIndex(), CraftItemStack.asNMSCopy(helmet)); - } - - @Override - public @Nullable ItemStack getChestplate() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory() - .getArmor(EquipmentSlot.HEAD.getIndex())); - } - - @Override - public void setChestplate(@Nullable ItemStack chestplate) { - getInventory().getOwnerHandle().getInventory().armor - .set(EquipmentSlot.CHEST.getIndex(), CraftItemStack.asNMSCopy(chestplate)); - } - - @Override - public @Nullable ItemStack getLeggings() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory() - .getArmor(EquipmentSlot.LEGS.getIndex())); - } - - @Override - public void setLeggings(@Nullable ItemStack leggings) { - getInventory().getOwnerHandle().getInventory().armor - .set(EquipmentSlot.LEGS.getIndex(), CraftItemStack.asNMSCopy(leggings)); - } - - @Override - public @Nullable ItemStack getBoots() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory() - .getArmor(EquipmentSlot.FEET.getIndex())); - } - - @Override - public void setBoots(@Nullable ItemStack boots) { - getInventory().getOwnerHandle().getInventory().armor - .set(EquipmentSlot.FEET.getIndex(), CraftItemStack.asNMSCopy(boots)); - } - - @Override - public @NotNull ItemStack getItemInMainHand() { - Inventory internal = getInventory().getOwnerHandle().getInventory(); - return CraftItemStack.asCraftMirror(internal.getItem(internal.selected)); - } - - @Override - public void setItemInMainHand(@Nullable ItemStack item) { - Inventory internal = getInventory().getOwnerHandle().getInventory(); - internal.setItem(internal.selected, CraftItemStack.asNMSCopy(item)); - } - - @Override - public @NotNull ItemStack getItemInOffHand() { - return CraftItemStack.asCraftMirror(getInventory().getOwnerHandle().getInventory().offhand.getFirst()); - } - - @Override - public void setItemInOffHand(@Nullable ItemStack item) { - getInventory().getOwnerHandle().getInventory().offhand.set(0, CraftItemStack.asNMSCopy(item)); - } - - @Override - public @NotNull ItemStack getItemInHand() { - return getItemInMainHand(); - } - - @Override - public void setItemInHand(@Nullable ItemStack stack) { - setItemInMainHand(stack); - } - - @Override - public int getHeldItemSlot() { - Inventory internal = getInventory().getOwnerHandle().getInventory(); - return internal.items.size() - 9 + internal.selected; - } - - @Override - public void setHeldItemSlot(int slot) { - slot %= 9; - getInventory().getOwnerHandle().getInventory().selected = slot; - } - - @Override - public @Nullable ItemStack getItem(@NotNull org.bukkit.inventory.EquipmentSlot slot) { - return switch (slot) { - case HAND -> getItemInMainHand(); - case OFF_HAND -> getItemInOffHand(); - case FEET -> getBoots(); - case LEGS -> getLeggings(); - case CHEST -> getChestplate(); - case HEAD -> getHelmet(); - default -> throw new IllegalArgumentException("Unsupported EquipmentSlot " + slot); - }; - } - - @Override - public void setItem(@NotNull org.bukkit.inventory.EquipmentSlot slot, @Nullable ItemStack item) { - switch (slot) { - case HAND -> setItemInMainHand(item); - case OFF_HAND -> setItemInOffHand(item); - case FEET -> setBoots(item); - case LEGS -> setLeggings(item); - case CHEST -> setChestplate(item); - case HEAD -> setHelmet(item); - default -> throw new IllegalArgumentException("Unsupported EquipmentSlot " + slot); - } - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenPlayerInventorySelf.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenPlayerInventorySelf.java deleted file mode 100644 index a26e75c8..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/bukkit/OpenPlayerInventorySelf.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.bukkit; - -import com.lishid.openinv.internal.v1_21_R3.container.OpenInventory; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; - -public class OpenPlayerInventorySelf extends OpenPlayerInventory { - - private final int offset; - - public OpenPlayerInventorySelf(@NotNull OpenInventory inventory, int offset) { - super(inventory); - this.offset = offset; - } - - @Override - public ItemStack getItem(int index) { - return super.getItem(offset + index); - } - - @Override - public void setItem(int index, ItemStack item) { - super.setItem(offset + index, item); - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/menu/OpenInventoryMenu.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/menu/OpenInventoryMenu.java deleted file mode 100644 index 2d26e091..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/menu/OpenInventoryMenu.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.menu; - -import com.google.common.base.Preconditions; -import com.lishid.openinv.internal.v1_21_R3.container.OpenInventory; -import com.lishid.openinv.internal.v1_21_R3.container.bukkit.OpenDummyPlayerInventory; -import com.lishid.openinv.internal.v1_21_R3.container.bukkit.OpenPlayerInventorySelf; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentDrop; -import com.lishid.openinv.internal.v1_21_R3.container.slot.ContentEquipment; -import com.lishid.openinv.internal.v1_21_R3.container.slot.SlotViewOnly; -import com.lishid.openinv.util.Permissions; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ChestMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class OpenInventoryMenu extends OpenChestMenu { - - private int offset; - - public OpenInventoryMenu(OpenInventory inventory, ServerPlayer viewer, int i, boolean viewOnly) { - super(getMenuType(inventory, viewer), i, inventory, viewer, viewOnly); - } - - private static MenuType getMenuType(OpenInventory inventory, ServerPlayer viewer) { - int size = inventory.getContainerSize(); - // Disallow duplicate access to own main inventory contents. - if (inventory.getOwnerHandle().equals(viewer)) { - size -= viewer.getInventory().items.size(); - size = ((int) Math.ceil(size / 9.0)) * 9; - } - - return getChestMenuType(size); - } - - @Override - protected void preSlotSetup() { - offset = ownContainer ? viewer.getInventory().items.size() : 0; - } - - @Override - protected @NotNull Slot getUpperSlot(int index, int x, int y) { - index += offset; - Slot slot = container.getMenuSlot(index, x, y); - - // If the slot cannot be interacted with there's nothing to configure. - if (slot.getClass().equals(SlotViewOnly.class)) { - return slot; - } - - // Remove drop slot if viewer is not allowed to use it. - if (slot instanceof ContentDrop.SlotDrop - && (viewOnly || !Permissions.INVENTORY_SLOT_DROP.hasPermission(viewer.getBukkitEntity()))) { - return new SlotViewOnly(container, index, x, y); - } - - if (slot instanceof ContentEquipment.SlotEquipment equipment) { - if (viewOnly) { - return SlotViewOnly.wrap(slot); - } - - Permissions perm = switch (equipment.getEquipmentSlot()) { - case HEAD -> Permissions.INVENTORY_SLOT_HEAD_ANY; - case CHEST -> Permissions.INVENTORY_SLOT_CHEST_ANY; - case LEGS -> Permissions.INVENTORY_SLOT_LEGS_ANY; - case FEET -> Permissions.INVENTORY_SLOT_FEET_ANY; - // Off-hand can hold anything, not just equipment. - default -> null; - }; - - // If the viewer doesn't have permission, only allow equipment the viewee can equip in the slot. - if (perm != null && !perm.hasPermission(viewer.getBukkitEntity())) { - equipment.onlyEquipmentFor(container.getOwnerHandle()); - } - - // Equipment slots are a core part of the inventory, so they will always be shown. - return slot; - } - - // When viewing own inventory, only allow access to equipment and drop slots (equipment allowed above). - if (ownContainer && !(slot instanceof ContentDrop.SlotDrop)) { - return new SlotViewOnly(container, index, x, y); - } - - if (viewOnly) { - return SlotViewOnly.wrap(slot); - } - - return slot; - } - - @Override - protected @NotNull CraftInventoryView, Inventory> createBukkitEntity() { - org.bukkit.inventory.Inventory bukkitInventory; - if (viewOnly) { - bukkitInventory = new OpenDummyPlayerInventory(container); - } else if (ownContainer) { - bukkitInventory = new OpenPlayerInventorySelf(container, offset); - } else { - bukkitInventory = container.getBukkitInventory(); - } - - return new CraftInventoryView<>(viewer.getBukkitEntity(), bukkitInventory, this) { - @Override - public org.bukkit.inventory.ItemStack getItem(int index) { - if (viewOnly || index < 0) { - return null; - } - - Slot slot = slots.get(index); - return CraftItemStack.asCraftMirror(slot.hasItem() ? slot.getItem() : ItemStack.EMPTY); - } - - @Override - public boolean isInTop(int rawSlot) { - return rawSlot < topSize; - } - - @Override - public @Nullable Inventory getInventory(int rawSlot) { - if (viewOnly) { - return null; - } - if (rawSlot == InventoryView.OUTSIDE || rawSlot == -1) { - return null; - } - Preconditions.checkArgument(rawSlot >= 0 && rawSlot < topSize + offset + BOTTOM_INVENTORY_SIZE, - "Slot %s outside of inventory", rawSlot); - if (rawSlot > topSize) { - return getBottomInventory(); - } - Slot slot = slots.get(rawSlot); - if (slot.isFake()) { - return null; - } - return getTopInventory(); - } - - @Override - public int convertSlot(int rawSlot) { - if (viewOnly) { - return InventoryView.OUTSIDE; - } - if (rawSlot < 0) { - return rawSlot; - } - if (rawSlot < topSize) { - Slot slot = slots.get(rawSlot); - if (slot.isFake()) { - return InventoryView.OUTSIDE; - } - return rawSlot; - } - - int slot = rawSlot - topSize; - - if (slot >= 27) { - slot -= 27; - } else { - slot += 9; - } - - return slot; - } - - @Override - public @NotNull InventoryType.SlotType getSlotType(int slot) { - if (viewOnly || slot < 0) { - return InventoryType.SlotType.OUTSIDE; - } - if (slot >= topSize) { - slot -= topSize; - if (slot >= 27) { - return InventoryType.SlotType.QUICKBAR; - } - return InventoryType.SlotType.CONTAINER; - } - return OpenInventoryMenu.this.container.getSlotType(offset + slot); - } - - @Override - public int countSlots() { - return topSize + BOTTOM_INVENTORY_SIZE; - } - }; - } - - @Override - public ItemStack quickMoveStack(Player player, int index) { - if (viewOnly) { - return ItemStack.EMPTY; - } - - // See ChestMenu and InventoryMenu - Slot slot = this.slots.get(index); - - if (!slot.hasItem() || slot.isFake()) { - return ItemStack.EMPTY; - } - - ItemStack itemStack = slot.getItem(); - ItemStack originalStack = itemStack.copy(); - - if (index < topSize) { - // If we're moving top to bottom, do a normal transfer. - if (!this.moveItemStackTo(itemStack, topSize, this.slots.size(), true)) { - return ItemStack.EMPTY; - } - } else { - EquipmentSlot equipmentSlot = player.getEquipmentSlotForItem(itemStack); - boolean movedGear = switch (equipmentSlot) { - // If this is gear, try to move it to the correct slot first. - case OFFHAND, FEET, LEGS, CHEST, HEAD -> { - // Locate the correct slot in the contents following the main inventory. - for (int extra = container.getOwnerHandle().getInventory().items.size() - offset; extra < topSize; ++extra) { - Slot extraSlot = getSlot(extra); - if (extraSlot instanceof ContentEquipment.SlotEquipment equipSlot - && equipSlot.getEquipmentSlot() == equipmentSlot) { - // If we've found a matching slot, try to move to it. - // If this succeeds, even partially, we will not attempt to move to other slots. - // Otherwise, armor is already occupied, so we'll fall through to main inventory. - yield this.moveItemStackTo(itemStack, extra, extra + 1, false); - } - } - yield false; - } - // Non-gear gets no special treatment. - default -> false; - }; - - // If main inventory is not available, there's nowhere else to move. - if (offset != 0) { - if (!movedGear) { - return ItemStack.EMPTY; - } - } else { - // If we didn't move to a gear slot, try to move to a main inventory slot. - if (!movedGear && !this.moveItemStackTo(itemStack, 0, container.getOwnerHandle().getInventory().items.size(), true)) { - return ItemStack.EMPTY; - } - } - } - - if (itemStack.isEmpty()) { - slot.setByPlayer(ItemStack.EMPTY); - } else { - slot.setChanged(); - } - - return originalStack; - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/Content.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/Content.java deleted file mode 100644 index fb290de4..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/Content.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; - -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -/** - * An interface defining behaviors for entries in a {@link Container}. Used to reduce duplicate content reordering. - */ -public interface Content { - - /** - * Update internal holder. - * - * @param holder the new holder - */ - void setHolder(@NotNull ServerPlayer holder); - - /** - * Get the current item. - * - * @return the current item - */ - ItemStack get(); - - /** - * Remove the current item. - * - * @return the current item - */ - ItemStack remove(); - - /** - * Remove some of the current item. - * - * @return the current item - */ - ItemStack removePartial(int amount); - - /** - * Set the current item. If slot is currently not usable, will drop item instead. - * - * @param itemStack the item to set - */ - void set(ItemStack itemStack); - - /** - * Get a {@link Slot} for use in a {@link net.minecraft.world.inventory.AbstractContainerMenu ContainerMenu}. Will - * impose any specific restrictions to insertion or removal. - * - * @param container the backing container - * @param slot the slot of the backing container represented - * @param x clientside x dimension from top left of inventory, not used - * @param y clientside y dimension from top left of inventory, not used - * @return a menu slot - */ - Slot asSlot(Container container, int slot, int x, int y); - - /** - * Get a loose Bukkit translation of what this slot stores. For example, any slot that drops items at the owner rather - * than insert them will report itself as being {@link org.bukkit.event.inventory.InventoryType.SlotType#OUTSIDE}. - * - * @return the closes Bukkit slot type - */ - org.bukkit.event.inventory.InventoryType.SlotType getSlotType(); - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentCrafting.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentCrafting.java deleted file mode 100644 index 0479ea8c..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentCrafting.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; - -import com.lishid.openinv.internal.v1_21_R3.container.Placeholders; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.ContainerHelper; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -/** - * A slot in a survival crafting inventory. Unavailable when not online in a survival mode. - */ -public class ContentCrafting implements Content { - - private final int index; - private ServerPlayer holder; - private List items; - - public ContentCrafting(@NotNull ServerPlayer holder, int index) { - setHolder(holder); - this.index = index; - } - - private boolean isAvailable() { - return isAvailable(holder); - } - - static boolean isAvailable(@NotNull ServerPlayer holder) { - // Player must be online and not in creative - since the creative client is (semi-)authoritative, - // it ignores changes without extra help, and will delete the item as a result. - // Spectator mode is technically possible but may cause the item to be dropped if the client opens an inventory. - return holder.connection != null && !holder.connection.isDisconnected() && holder.gameMode.isSurvival(); - } - - @Override - public void setHolder(@NotNull ServerPlayer holder) { - this.holder = holder; - // Note: CraftingContainer#getItems is immutable! Be careful with updates. - this.items = holder.inventoryMenu.getCraftSlots().getContents(); - } - - @Override - public ItemStack get() { - return isAvailable() ? items.get(index) : ItemStack.EMPTY; - } - - @Override - public ItemStack remove() { - if (!this.isAvailable()) { - return ItemStack.EMPTY; - } - ItemStack removed = items.remove(index); - if (removed.isEmpty()) { - return ItemStack.EMPTY; - } - holder.inventoryMenu.slotsChanged(holder.inventoryMenu.getCraftSlots()); - return removed; - } - - @Override - public ItemStack removePartial(int amount) { - if (!this.isAvailable()) { - return ItemStack.EMPTY; - } - ItemStack removed = ContainerHelper.removeItem(items, index, amount); - if (removed.isEmpty()) { - return ItemStack.EMPTY; - } - holder.inventoryMenu.slotsChanged(holder.inventoryMenu.getCraftSlots()); - return removed; - } - - @Override - public void set(ItemStack itemStack) { - if (isAvailable()) { - items.set(index, itemStack); - holder.inventoryMenu.slotsChanged(holder.inventoryMenu.getCraftSlots()); - } else { - holder.drop(itemStack, false); - } - } - - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotCrafting(container, slot, x, y); - } - - @Override - public InventoryType.SlotType getSlotType() { - return isAvailable() ? InventoryType.SlotType.CRAFTING : InventoryType.SlotType.OUTSIDE; - } - - public class SlotCrafting extends SlotPlaceholder { - - private SlotCrafting(Container container, int index, int x, int y) { - super(container, index, x, y); - } - - @Override - public ItemStack getOrDefault() { - return isAvailable() ? items.get(ContentCrafting.this.index) : Placeholders.survivalOnly(holder); - } - - @Override - public boolean mayPickup(Player player) { - return isAvailable(); - } - - @Override - public boolean mayPlace(ItemStack itemStack) { - return isAvailable(); - } - - @Override - public boolean hasItem() { - return isAvailable() && super.hasItem(); - } - - @Override - public boolean isFake() { - return !isAvailable(); - } - - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentCraftingResult.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentCraftingResult.java deleted file mode 100644 index 1fceaca0..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentCraftingResult.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; - -import com.lishid.openinv.internal.v1_21_R3.container.Placeholders; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; - -/** - * A slot allowing viewing of the crafting result. - * - *

Unmodifiable because I said so. Use your own crafting grid.

- */ -public class ContentCraftingResult extends ContentViewOnly { - - public ContentCraftingResult(@NotNull ServerPlayer holder) { - super(holder); - } - - @Override - public ItemStack get() { - InventoryMenu inventoryMenu = holder.inventoryMenu; - return inventoryMenu.getResultSlot().getItem(); - } - - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotViewOnly(container, slot, x, y) { - @Override - public ItemStack getOrDefault() { - if (!ContentCrafting.isAvailable(holder)) { - return Placeholders.survivalOnly(holder); - } - InventoryMenu inventoryMenu = holder.inventoryMenu; - return inventoryMenu.getResultSlot().getItem(); - } - }; - } - - @Override - public InventoryType.SlotType getSlotType() { - return InventoryType.SlotType.RESULT; - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentCursor.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentCursor.java deleted file mode 100644 index 46ea737e..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentCursor.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; - -import com.lishid.openinv.internal.v1_21_R3.container.Placeholders; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; - -/** - * A slot wrapping the active menu's cursor. Unavailable when not online in a survival mode. - */ -public class ContentCursor implements Content { - - private @NotNull ServerPlayer holder; - - public ContentCursor(@NotNull ServerPlayer holder) { - this.holder = holder; - } - - @Override - public void setHolder(@NotNull ServerPlayer holder) { - this.holder = holder; - } - - @Override - public ItemStack get() { - return isAvailable() ? holder.containerMenu.getCarried() : ItemStack.EMPTY; - } - - @Override - public ItemStack remove() { - ItemStack carried = holder.containerMenu.getCarried(); - holder.containerMenu.setCarried(ItemStack.EMPTY); - return carried; - } - - @Override - public ItemStack removePartial(int amount) { - ItemStack carried = holder.containerMenu.getCarried(); - if (!carried.isEmpty() && carried.getCount() >= amount) { - ItemStack value = carried.split(amount); - if (carried.isEmpty()) { - holder.containerMenu.setCarried(ItemStack.EMPTY); - } - return value; - } - return ItemStack.EMPTY; - } - - @Override - public void set(ItemStack itemStack) { - if (isAvailable()) { - holder.containerMenu.setCarried(itemStack); - } else { - holder.drop(itemStack, false); - } - } - - private boolean isAvailable() { - // Player must be online and not in creative - since the creative client is (semi-)authoritative, - // it ignores changes without extra help, and will delete the item as a result. - // Spectator mode is technically possible but may cause the item to be dropped if the client opens an inventory. - return holder.connection != null && !holder.connection.isDisconnected() && holder.gameMode.isSurvival(); - } - - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotCursor(container, slot, x, y); - } - - @Override - public InventoryType.SlotType getSlotType() { - // As close as possible to "not real" - return InventoryType.SlotType.OUTSIDE; - } - - public class SlotCursor extends SlotPlaceholder { - - private SlotCursor(Container container, int index, int x, int y) { - super(container, index, x, y); - } - - @Override - public ItemStack getOrDefault() { - if (!isAvailable()) { - return Placeholders.survivalOnly(holder); - } - ItemStack carried = holder.containerMenu.getCarried(); - return carried.isEmpty() ? Placeholders.cursor : carried; - } - - @Override - public boolean mayPickup(Player player) { - return isAvailable(); - } - - @Override - public boolean mayPlace(ItemStack itemStack) { - return isAvailable(); - } - - @Override - public boolean hasItem() { - return isAvailable() && super.hasItem(); - } - - @Override - public boolean isFake() { - return true; - } - - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentDrop.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentDrop.java deleted file mode 100644 index 5e1c5168..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/ContentDrop.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; - -import com.lishid.openinv.internal.v1_21_R3.container.Placeholders; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.bukkit.event.inventory.InventoryType; -import org.jetbrains.annotations.NotNull; - -/** - * A fake slot used to drop items. Unavailable offline. - */ -public class ContentDrop implements Content { - - private ServerPlayer holder; - - public ContentDrop(@NotNull ServerPlayer holder) { - this.holder = holder; - } - - @Override - public void setHolder(@NotNull ServerPlayer holder) { - this.holder = holder; - } - - @Override - public ItemStack get() { - return ItemStack.EMPTY; - } - - @Override - public ItemStack remove() { - return ItemStack.EMPTY; - } - - @Override - public ItemStack removePartial(int amount) { - return ItemStack.EMPTY; - } - - @Override - public void set(ItemStack itemStack) { - holder.drop(itemStack, true); - } - - @Override - public Slot asSlot(Container container, int slot, int x, int y) { - return new SlotDrop(container, slot, x, y); - } - - @Override - public InventoryType.SlotType getSlotType() { - // Behaves like dropping an item outside the screen, just by the target player. - return InventoryType.SlotType.OUTSIDE; - } - - public class SlotDrop extends SlotPlaceholder { - - private SlotDrop(Container container, int index, int x, int y) { - super(container, index, x, y); - } - - @Override - public ItemStack getOrDefault() { - return holder.connection != null && !holder.connection.isDisconnected() - ? Placeholders.drop - : Placeholders.blockedOffline; - } - - @Override - public boolean mayPlace(ItemStack itemStack) { - return holder.connection != null && !holder.connection.isDisconnected(); - } - - @Override - public boolean hasItem() { - return false; - } - - @Override - public boolean isFake() { - return true; - } - - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/SlotPlaceholder.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/SlotPlaceholder.java deleted file mode 100644 index 7ec22a84..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/SlotPlaceholder.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; - -import net.minecraft.world.Container; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; - -/** - * An implementation of a slot as used by a menu that may have fake placeholder items. - * - *

Used to prevent plugins (particularly sorting plugins) from adding placeholders to inventories.

- */ -public abstract class SlotPlaceholder extends Slot { - - public SlotPlaceholder(Container container, int index, int x, int y) { - super(container, index, x, y); - } - - public abstract ItemStack getOrDefault(); - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/SlotViewOnly.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/SlotViewOnly.java deleted file mode 100644 index 76981cff..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/container/slot/SlotViewOnly.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.container.slot; - -import com.lishid.openinv.internal.v1_21_R3.container.Placeholders; -import net.minecraft.world.Container; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -/** - * A view-only {@link Slot}. "Blank" by default, but can wrap another slot to display its content. - */ -public class SlotViewOnly extends SlotPlaceholder { - - public static @NotNull SlotViewOnly wrap(@NotNull Slot wrapped) { - SlotViewOnly wrapper; - if (wrapped instanceof SlotPlaceholder placeholder) { - wrapper = new SlotViewOnly(wrapped.container, wrapped.slot, wrapped.x, wrapped.y) { - @Override - public ItemStack getOrDefault() { - return placeholder.getOrDefault(); - } - }; - } else { - wrapper = new SlotViewOnly(wrapped.container, wrapped.slot, wrapped.x, wrapped.y) { - @Override - public ItemStack getOrDefault() { - return wrapped.getItem(); - } - }; - } - wrapper.index = wrapped.index; - return wrapper; - } - - public SlotViewOnly(Container container, int index, int x, int y) { - super(container, index, x, y); - } - - @Override - public ItemStack getOrDefault() { - return Placeholders.notSlot; - } - - @Override - public void onQuickCraft(ItemStack var0, ItemStack var1) { - } - - @Override - public void onTake(Player var0, ItemStack var1) { - } - - @Override - public boolean mayPlace(ItemStack var0) { - return false; - } - - @Override - public ItemStack getItem() { - return ItemStack.EMPTY; - } - - @Override - public boolean hasItem() { - return false; - } - - @Override - public void setByPlayer(ItemStack newStack) { - } - - @Override - public void setByPlayer(ItemStack newStack, ItemStack oldStack) { - } - - @Override - public void set(ItemStack var0) { - } - - @Override - public void setChanged() { - } - - @Override - public int getMaxStackSize() { - return 0; - } - - @Override - public int getMaxStackSize(ItemStack itemStack) { - return 0; - } - - @Override - public ItemStack remove(int amount) { - return ItemStack.EMPTY; - } - - @Override - public boolean mayPickup(Player var0) { - return false; - } - - @Override - public boolean isActive() { - return false; - } - - @Override - public Optional tryRemove(int var0, int var1, Player var2) { - return Optional.empty(); - } - - @Override - public ItemStack safeTake(int var0, int var1, Player var2) { - return ItemStack.EMPTY; - } - - @Override - public ItemStack safeInsert(ItemStack itemStack) { - return itemStack; - } - - @Override - public ItemStack safeInsert(ItemStack itemStack, int amount) { - return itemStack; - } - - @Override - public boolean allowModification(Player var0) { - return false; - } - - @Override - public int getContainerSlot() { - return this.slot; - } - - @Override - public boolean isHighlightable() { - return false; - } - - @Override - public boolean isFake() { - return true; - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/player/OpenPlayer.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/player/OpenPlayer.java deleted file mode 100644 index 4fd1cb72..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/player/OpenPlayer.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.player; - -import com.lishid.openinv.event.OpenEvents; -import com.mojang.logging.LogUtils; -import net.minecraft.Util; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.NumericTag; -import net.minecraft.nbt.Tag; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.storage.PlayerDataStorage; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Set; - -public class OpenPlayer extends CraftPlayer { - - /** - * List of tags to always reset when saving. - * - * @see net.minecraft.world.entity.Entity#saveWithoutId(CompoundTag) - * @see net.minecraft.server.level.ServerPlayer#addAdditionalSaveData(CompoundTag) - * @see net.minecraft.world.entity.player.Player#addAdditionalSaveData(CompoundTag) - * @see net.minecraft.world.entity.LivingEntity#addAdditionalSaveData(CompoundTag) - */ - private static final Set RESET_TAGS = Set.of( - // Entity#saveWithoutId(CompoundTag) - "CustomName", - "CustomNameVisible", - "Silent", - "NoGravity", - "Glowing", - "TicksFrozen", - "HasVisualFire", - "Tags", - "Passengers", - // ServerPlayer#addAdditionalSaveData(CompoundTag) - // Intentional omissions to prevent mount loss: Attach, Entity, and RootVehicle - "warden_spawn_tracker", - "enteredNetherPosition", - "SpawnX", - "SpawnY", - "SpawnZ", - "SpawnForced", - "SpawnAngle", - "SpawnDimension", - "raid_omen_position", - "ender_pearls", - // Player#addAdditionalSaveData(CompoundTag) - "ShoulderEntityLeft", - "ShoulderEntityRight", - "LastDeathLocation", - "current_explosion_impact_pos", - // LivingEntity#addAdditionalSaveData(CompoundTag) - "active_effects", - "SleepingX", - "SleepingY", - "SleepingZ", - "Brain" - ); - - private final PlayerManager manager; - - OpenPlayer(CraftServer server, ServerPlayer entity, PlayerManager manager) { - super(server, entity); - this.manager = manager; - } - - @Override - public void loadData() { - manager.loadData(getHandle()); - } - - @Override - public void saveData() { - if (OpenEvents.saveCancelled(this)) { - return; - } - - ServerPlayer player = this.getHandle(); - // See net.minecraft.world.level.storage.PlayerDataStorage#save(EntityHuman) - try { - PlayerDataStorage worldNBTStorage = player.server.getPlayerList().playerIo; - - CompoundTag oldData = isOnline() ? null : worldNBTStorage.load(player.getName().getString(), player.getStringUUID()).orElse(null); - CompoundTag playerData = getWritableTag(oldData); - playerData = player.saveWithoutId(playerData); - setExtraData(playerData); - - if (oldData != null) { - // Revert certain special data values when offline. - revertSpecialValues(playerData, oldData); - } - - Path playerDataDir = worldNBTStorage.getPlayerDir().toPath(); - Path tempFile = Files.createTempFile(playerDataDir, player.getStringUUID() + "-", ".dat"); - NbtIo.writeCompressed(playerData, tempFile); - Path dataFile = playerDataDir.resolve(player.getStringUUID() + ".dat"); - Path backupFile = playerDataDir.resolve(player.getStringUUID() + ".dat_old"); - Util.safeReplaceFile(dataFile, tempFile, backupFile); - } catch (Exception e) { - LogUtils.getLogger().warn("Failed to save player data for {}: {}", player.getScoreboardName(), e); - } - } - - @Contract("null -> new") - private @NotNull CompoundTag getWritableTag(@Nullable CompoundTag oldData) { - if (oldData == null) { - return new CompoundTag(); - } - - // Copy old data. This is a deep clone, so operating on it should be safe. - oldData = oldData.copy(); - - // Remove vanilla/server data that is not written every time. - oldData.getAllKeys() - .removeIf(key -> RESET_TAGS.contains(key) || key.startsWith("Bukkit")); - - return oldData; - } - - private void revertSpecialValues(@NotNull CompoundTag newData, @NotNull CompoundTag oldData) { - // Revert automatic updates to play timestamps. - copyValue(oldData, newData, "bukkit", "lastPlayed", NumericTag.class); - copyValue(oldData, newData, "Paper", "LastSeen", NumericTag.class); - copyValue(oldData, newData, "Paper", "LastLogin", NumericTag.class); - } - - private void copyValue( - @NotNull CompoundTag source, - @NotNull CompoundTag target, - @NotNull String container, - @NotNull String key, - @SuppressWarnings("SameParameterValue") @NotNull Class tagType) { - CompoundTag oldContainer = getTag(source, container, CompoundTag.class); - CompoundTag newContainer = getTag(target, container, CompoundTag.class); - - // New container being null means the server implementation doesn't store this data. - if (newContainer == null) { - return; - } - - // If old tag exists, copy it to new location, removing otherwise. - setTag(newContainer, key, getTag(oldContainer, key, tagType)); - } - - private @Nullable T getTag( - @Nullable CompoundTag container, - @NotNull String key, - @NotNull Class dataType) { - if (container == null) { - return null; - } - Tag value = container.get(key); - if (value == null || !dataType.isAssignableFrom(value.getClass())) { - return null; - } - return dataType.cast(value); - } - - private void setTag( - @NotNull CompoundTag container, - @NotNull String key, - @Nullable T data) { - if (data == null) { - container.remove(key); - } else { - container.put(key, data); - } - } - -} diff --git a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/player/PlayerManager.java b/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/player/PlayerManager.java deleted file mode 100644 index ef44fbd1..00000000 --- a/internal/v1_21_R3/src/main/java/com/lishid/openinv/internal/v1_21_R3/player/PlayerManager.java +++ /dev/null @@ -1,267 +0,0 @@ -package com.lishid.openinv.internal.v1_21_R3.player; - -import com.lishid.openinv.internal.ISpecialInventory; -import com.lishid.openinv.internal.v1_21_R3.container.OpenEnderChest; -import com.lishid.openinv.internal.v1_21_R3.container.OpenInventory; -import com.mojang.authlib.GameProfile; -import com.mojang.serialization.Dynamic; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtOps; -import net.minecraft.network.chat.Component; -import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ClientInformation; -import net.minecraft.server.level.ParticleStatus; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.ChatVisiblity; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.dimension.DimensionType; -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_21_R3.CraftServer; -import org.bukkit.craftbukkit.v1_21_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_21_R3.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.util.UUID; -import java.util.logging.Logger; - -public class PlayerManager implements com.lishid.openinv.internal.PlayerManager { - - private static boolean paper; - - static { - try { - Class.forName("io.papermc.paper.configuration.Configuration"); - paper = true; - } catch (ClassNotFoundException ignored) { - paper = false; - } - } - - private final @NotNull Logger logger; - private @Nullable Field bukkitEntity; - - public PlayerManager(@NotNull Logger logger) { - this.logger = logger; - try { - bukkitEntity = Entity.class.getDeclaredField("bukkitEntity"); - } catch (NoSuchFieldException e) { - logger.warning("Unable to obtain field to inject custom save process - certain player data may be lost when saving!"); - logger.log(java.util.logging.Level.WARNING, e.getMessage(), e); - bukkitEntity = null; - } - } - - public static @NotNull ServerPlayer getHandle(final Player player) { - if (player instanceof CraftPlayer) { - return ((CraftPlayer) player).getHandle(); - } - - Server server = player.getServer(); - ServerPlayer nmsPlayer = null; - - if (server instanceof CraftServer) { - nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getUniqueId()); - } - - if (nmsPlayer == null) { - // Could use reflection to examine fields, but it's honestly not worth the bother. - throw new RuntimeException("Unable to fetch EntityPlayer from Player implementation " + player.getClass().getName()); - } - - return nmsPlayer; - } - - @Override - public @Nullable Player loadPlayer(@NotNull final OfflinePlayer offline) { - MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); - ServerLevel worldServer = server.getLevel(Level.OVERWORLD); - - if (worldServer == null) { - return null; - } - - // Create a new ServerPlayer. - ServerPlayer entity = createNewPlayer(server, worldServer, offline); - - // Stop listening for advancement progression - if this is not cleaned up, loading causes a memory leak. - entity.getAdvancements().stopListening(); - - // Try to load the player's data. - if (loadData(entity)) { - // If data is loaded successfully, return the Bukkit entity. - return entity.getBukkitEntity(); - } - - return null; - } - - private @NotNull ServerPlayer createNewPlayer( - @NotNull MinecraftServer server, - @NotNull ServerLevel worldServer, - @NotNull final OfflinePlayer offline) { - // See net.minecraft.server.players.PlayerList#canPlayerLogin(ServerLoginPacketListenerImpl, GameProfile) - // See net.minecraft.server.network.ServerLoginPacketListenerImpl#handleHello(ServerboundHelloPacket) - GameProfile profile = new GameProfile(offline.getUniqueId(), - offline.getName() != null ? offline.getName() : offline.getUniqueId().toString()); - - ClientInformation dummyInfo = new ClientInformation( - "en_us", - 1, // Reduce distance just in case. - ChatVisiblity.HIDDEN, // Don't accept chat. - false, - ServerPlayer.DEFAULT_MODEL_CUSTOMIZATION, - ServerPlayer.DEFAULT_MAIN_HAND, - true, - false, // Don't list in player list (not that this player is in the list anyway). - ParticleStatus.MINIMAL - ); - - ServerPlayer entity = new ServerPlayer(server, worldServer, profile, dummyInfo); - - try { - injectPlayer(entity); - } catch (IllegalAccessException e) { - logger.log( - java.util.logging.Level.WARNING, - e, - () -> "Unable to inject ServerPlayer, certain player data may be lost when saving!"); - } - - return entity; - } - - boolean loadData(@NotNull ServerPlayer player) { - // See CraftPlayer#loadData - CompoundTag loadedData = player.server.getPlayerList().playerIo.load(player).orElse(null); - - if (loadedData == null) { - // Exceptions with loading are logged by Mojang. - return false; - } - - // Read basic data into the player. - player.load(loadedData); - // Also read "extra" data. - player.readAdditionalSaveData(loadedData); - // Game type settings are also loaded separately. - player.loadGameTypes(loadedData); - - if (paper) { - // Paper: world is not loaded by ServerPlayer#load(CompoundTag). - parseWorld(player, loadedData); - } - - return true; - } - - private void parseWorld(@NotNull ServerPlayer player, @NotNull CompoundTag loadedData) { - // See PlayerList#placeNewPlayer - World bukkitWorld; - if (loadedData.contains("WorldUUIDMost") && loadedData.contains("WorldUUIDLeast")) { - // Modern Bukkit world. - bukkitWorld = Bukkit.getServer().getWorld(new UUID(loadedData.getLong("WorldUUIDMost"), loadedData.getLong("WorldUUIDLeast"))); - } else if (loadedData.contains("world", net.minecraft.nbt.Tag.TAG_STRING)) { - // Legacy Bukkit world. - bukkitWorld = Bukkit.getServer().getWorld(loadedData.getString("world")); - } else { - // Vanilla player data. - DimensionType.parseLegacy(new Dynamic<>(NbtOps.INSTANCE, loadedData.get("Dimension"))) - .resultOrPartial(logger::warning) - .map(player.server::getLevel) - // If ServerLevel exists, set, otherwise move to spawn. - .ifPresentOrElse(player::setServerLevel, () -> player.spawnIn(null)); - return; - } - if (bukkitWorld == null) { - player.spawnIn(null); - return; - } - player.setServerLevel(((CraftWorld) bukkitWorld).getHandle()); - } - - private void injectPlayer(ServerPlayer player) throws IllegalAccessException { - if (bukkitEntity == null) { - return; - } - - bukkitEntity.setAccessible(true); - - bukkitEntity.set(player, new OpenPlayer(player.server.server, player, this)); - } - - @Override - public @NotNull Player inject(@NotNull Player player) { - try { - ServerPlayer nmsPlayer = getHandle(player); - if (nmsPlayer.getBukkitEntity() instanceof OpenPlayer openPlayer) { - return openPlayer; - } - injectPlayer(nmsPlayer); - return nmsPlayer.getBukkitEntity(); - } catch (IllegalAccessException e) { - logger.log( - java.util.logging.Level.WARNING, - e, - () -> "Unable to inject ServerPlayer, certain player data may be lost when saving!"); - return player; - } - } - - @Override - public @Nullable InventoryView openInventory(@NotNull Player bukkitPlayer, @NotNull ISpecialInventory inventory, boolean viewOnly) { - ServerPlayer player = getHandle(bukkitPlayer); - - if (player.connection == null) { - return null; - } - - // See net.minecraft.server.level.ServerPlayer#openMenu(MenuProvider) - AbstractContainerMenu menu; - Component title; - if (inventory instanceof OpenInventory playerInv) { - menu = playerInv.createMenu(player, player.nextContainerCounter(), viewOnly); - title = playerInv.getTitle(player); - } else if (inventory instanceof OpenEnderChest enderChest) { - menu = enderChest.createMenu(player, player.nextContainerCounter(), viewOnly); - title = enderChest.getTitle(); - } else { - return null; - } - - // Should never happen, player is a ServerPlayer with an active connection. - if (menu == null) { - return null; - } - - // Set up title. Title can only be set once for a menu, and is set during the open process. - // Further title changes are a hack where the client is sent a "new" inventory with the same ID, - // resulting in a title change but no other state modifications (like cursor position). - menu.setTitle(title); - - menu = CraftEventFactory.callInventoryOpenEvent(player, menu, false); - - // Menu is null if event is cancelled. - if (menu == null) { - return null; - } - - player.containerMenu = menu; - player.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menu.getType(), menu.getTitle())); - player.initMenu(menu); - - return menu.getBukkitView(); - } - -} diff --git a/jitpack.yml b/jitpack.yml index 6fd76428..a3961727 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,4 +1,3 @@ before_install: - sdk install java 21.0.4-tem - sdk use java 21.0.4-tem - - mvn wrapper:wrapper -Dmaven=3.9.8 diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts new file mode 100644 index 00000000..c364e4ae --- /dev/null +++ b/plugin/build.gradle.kts @@ -0,0 +1,41 @@ +plugins { + `openinv-base` + alias(libs.plugins.shadow) +} + +repositories { + maven("https://jitpack.io") +} + +dependencies { + implementation(project(":openinvapi")) + implementation(project(":openinvcommon")) + implementation(project(":openinvadaptercommon")) + implementation(project(":openinvadapterspigot", configuration = "shadow")) + implementation(libs.planarwrappers) +} + +tasks.processResources { + expand("version" to version) +} + +tasks.jar { + manifest.attributes("paperweight-mappings-namespace" to "mojang") +} + +tasks.shadowJar { + minimize { + exclude(":openinv**") + } +} + +tasks.register("distributePlugin") { + into(rootProject.layout.projectDirectory.dir("dist")) + from(tasks.shadowJar) + rename("openinvplugin.*\\.jar", "OpenInv.jar") +} + +tasks.assemble { + dependsOn(tasks.shadowJar) + dependsOn(tasks.named("distributePlugin")) +} diff --git a/plugin/pom.xml b/plugin/pom.xml deleted file mode 100644 index 9657ea6b..00000000 --- a/plugin/pom.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - 4.0.0 - - - openinvparent - com.lishid - 5.1.7-SNAPSHOT - - - openinvplugin - OpenInvPlugin - - - - spigot-api - org.spigotmc - - - planarwrappers - com.github.jikoo - - - openinvapi - com.lishid - - - openinvcommon - com.lishid - - - com.lishid - openinvadapter1_21_R3 - 5.1.7-SNAPSHOT - compile - - - com.lishid - openinvadapter1_21_R2 - 5.1.7-SNAPSHOT - compile - - - annotations - org.jetbrains - - - - - OpenInv - - - src/main/resources - true - - - - - - maven-shade-plugin - - - package - - shade - - - - - - - - com.lishid:openinv* - - ** - - - - *:* - - - META-INF/MANIFEST.MF - - - - - - com.github.jikoo.planarwrappers - com.github.jikoo.openinv.planarwrappers - - - true - - - - maven-compiler-plugin - - - maven-resources-plugin - - - copy-final-jar - package - - copy-resources - - - ${project.parent.build.directory} - - - ${project.build.directory} - - ${project.build.finalName}.jar - - - - - - - - - - - diff --git a/plugin/src/main/java/com/lishid/openinv/OpenInv.java b/plugin/src/main/java/com/lishid/openinv/OpenInv.java index 86f1ecff..c3ee3250 100644 --- a/plugin/src/main/java/com/lishid/openinv/OpenInv.java +++ b/plugin/src/main/java/com/lishid/openinv/OpenInv.java @@ -172,12 +172,6 @@ private void sendVersionError(@NotNull Consumer messageMethod) { if (!accessor.isSupported()) { messageMethod.accept("Your server version (" + accessor.getVersion() + ") is not supported."); messageMethod.accept("Please download the correct version of OpenInv here: " + accessor.getReleasesLink()); - - // We check this property late so users can use jars that were remapped by Paper already. - if (Boolean.getBoolean("paper.disable-plugin-rewriting")) { - messageMethod.accept("OpenInv uses Spigot-mapped internals, but you have disabled plugin rewriting in Paper!"); - messageMethod.accept("Please set system property 'paper.disable-plugin-rewriting' to false."); - } } if (!isSpigot) { messageMethod.accept("OpenInv requires that you use Spigot or a Spigot fork. Per the 1.14 update thread"); diff --git a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java index a29b0f13..9b15c575 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/plugin/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -38,12 +38,25 @@ public class InternalAccessor { private @Nullable Accessor internal; public InternalAccessor(@NotNull Logger logger, @NotNull LanguageManager lang) { + boolean paper = false; + try { + Class.forName("io.papermc.paper.configuration.GlobalConfiguration"); + paper = true; + } catch (ClassNotFoundException ignored) { + // Expect remapped server. + } try { - if (BukkitVersions.MINECRAFT.equals(Version.of(1, 21, 4))) { - internal = new com.lishid.openinv.internal.v1_21_R3.InternalAccessor(logger, lang); - } else if (BukkitVersions.MINECRAFT.equals(Version.of(1, 21, 3))) { - internal = new com.lishid.openinv.internal.v1_21_R2.InternalAccessor(logger, lang); + Version maxSupported = Version.of(1, 21, 4); + // TODO investigate min version - placeholders will change, possibly more. + Version minSupported = Version.of(1, 21, 4); + if (!paper) { + if (BukkitVersions.MINECRAFT.equals(maxSupported)) { + internal = new com.lishid.openinv.internal.reobf.InternalAccessor(logger, lang); + } + } else if (BukkitVersions.MINECRAFT.greaterThanOrEqual(minSupported) + && BukkitVersions.MINECRAFT.lessThanOrEqual(maxSupported)) { + internal = new com.lishid.openinv.internal.common.InternalAccessor(logger, lang); } if (internal != null) { InventoryAccess.setProvider(internal::get); diff --git a/plugin/src/main/resources/plugin.yml b/plugin/src/main/resources/plugin.yml index dd8014a2..79a5c9e5 100644 --- a/plugin/src/main/resources/plugin.yml +++ b/plugin/src/main/resources/plugin.yml @@ -1,10 +1,10 @@ name: OpenInv main: com.lishid.openinv.OpenInv -version: ${project.version} +version: ${version} author: lishid authors: [Jikoo, ShadowRanger] description: Open a player's inventory as a chest and interact with it in real time. -api-version: "1.16" +api-version: "1.13" permissions: diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 0bb06df2..00000000 --- a/pom.xml +++ /dev/null @@ -1,221 +0,0 @@ - - - - 4.0.0 - - com.lishid - openinvparent - OpenInv - http://dev.bukkit.org/bukkit-plugins/openinv/ - - common - - 5.1.7-SNAPSHOT - - pom - - - UTF-8 - 17 - 17 - - unknown - - - - - all - - api - addon/togglepersist - common - internal/v1_21_R3 - internal/v1_21_R2 - plugin - - - - - api-only - - true - - - api - - - - - - - spigot-repo - https://hub.spigotmc.org/nexus/content/groups/public/ - - - jitpack.io - https://jitpack.io - - - - - - - annotations - org.jetbrains - provided - 26.0.1 - - - spigot-api - org.spigotmc - provided - 1.21.1-R0.1-SNAPSHOT - - - openinvapi - com.lishid - compile - ${project.version} - - - openinvcommon - com.lishid - compile - ${project.version} - - - planarwrappers - com.github.jikoo - compile - 3.3.0 - - - - - - - - - - maven-dependency-plugin - org.apache.maven.plugins - 3.8.1 - - - - maven-shade-plugin - org.apache.maven.plugins - 3.6.0 - - - - maven-resources-plugin - org.apache.maven.plugins - 3.3.1 - - - - maven-jar-plugin - org.apache.maven.plugins - 3.4.2 - - - - spigot - - - - - - - maven-compiler-plugin - - - - com.google.errorprone - error_prone_core - 2.36.0 - - - - -XDcompilePolicy=simple - --should-stop=ifError=FLOW - -Xplugin:ErrorProne - -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED - -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED - -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED - -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED - -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED - -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED - -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED - -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED - -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED - -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED - - true - - org.apache.maven.plugins - 3.13.0 - - - - maven-assembly-plugin - org.apache.maven.plugins - 3.7.1 - - - - specialsource-maven-plugin - - - package - - remap - - remap-obf - - org.spigotmc:minecraft-server:${spigot.version}:txt:maps-mojang - true - org.spigotmc:spigot:${spigot.version}:jar:remapped-mojang - true - remapped-obf - - - - package - - remap - - remap-spigot - - ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:${spigot.version}:csrg:maps-spigot - org.spigotmc:spigot:${spigot.version}:jar:remapped-obf - - - - net.md-5 - 2.0.3 - - - - - - diff --git a/resource-pack/build.gradle.kts b/resource-pack/build.gradle.kts new file mode 100644 index 00000000..a5e0996f --- /dev/null +++ b/resource-pack/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + `base` +} + +tasks.register("buildResourcePack") { + archiveFileName = "openinv-legibility-pack.zip" + destinationDirectory = rootProject.layout.projectDirectory.dir("dist") + + from("openinv-legibility-pack") + with (copySpec { + include("**/*.json", "**/*.png", "pack.mcmeta") + }) +} + +tasks.assemble { + dependsOn(tasks.named("buildResourcePack")) +} diff --git a/resource-pack/assets/openinv/models/item/crafting_output.json b/resource-pack/openinv-legibility-pack/assets/openinv/models/item/crafting_output.json similarity index 100% rename from resource-pack/assets/openinv/models/item/crafting_output.json rename to resource-pack/openinv-legibility-pack/assets/openinv/models/item/crafting_output.json diff --git a/resource-pack/assets/openinv/models/item/cursor.json b/resource-pack/openinv-legibility-pack/assets/openinv/models/item/cursor.json similarity index 100% rename from resource-pack/assets/openinv/models/item/cursor.json rename to resource-pack/openinv-legibility-pack/assets/openinv/models/item/cursor.json diff --git a/resource-pack/assets/openinv/models/item/drop.json b/resource-pack/openinv-legibility-pack/assets/openinv/models/item/drop.json similarity index 100% rename from resource-pack/assets/openinv/models/item/drop.json rename to resource-pack/openinv-legibility-pack/assets/openinv/models/item/drop.json diff --git a/resource-pack/assets/openinv/models/item/empty_boots.json b/resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_boots.json similarity index 100% rename from resource-pack/assets/openinv/models/item/empty_boots.json rename to resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_boots.json diff --git a/resource-pack/assets/openinv/models/item/empty_chestplate.json b/resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_chestplate.json similarity index 100% rename from resource-pack/assets/openinv/models/item/empty_chestplate.json rename to resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_chestplate.json diff --git a/resource-pack/assets/openinv/models/item/empty_helmet.json b/resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_helmet.json similarity index 100% rename from resource-pack/assets/openinv/models/item/empty_helmet.json rename to resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_helmet.json diff --git a/resource-pack/assets/openinv/models/item/empty_leggings.json b/resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_leggings.json similarity index 100% rename from resource-pack/assets/openinv/models/item/empty_leggings.json rename to resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_leggings.json diff --git a/resource-pack/assets/openinv/models/item/empty_shield.json b/resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_shield.json similarity index 100% rename from resource-pack/assets/openinv/models/item/empty_shield.json rename to resource-pack/openinv-legibility-pack/assets/openinv/models/item/empty_shield.json diff --git a/resource-pack/assets/openinv/models/item/not_a_slot.json b/resource-pack/openinv-legibility-pack/assets/openinv/models/item/not_a_slot.json similarity index 100% rename from resource-pack/assets/openinv/models/item/not_a_slot.json rename to resource-pack/openinv-legibility-pack/assets/openinv/models/item/not_a_slot.json diff --git a/resource-pack/assets/openinv/textures/item/crafting_output.png b/resource-pack/openinv-legibility-pack/assets/openinv/textures/item/crafting_output.png similarity index 100% rename from resource-pack/assets/openinv/textures/item/crafting_output.png rename to resource-pack/openinv-legibility-pack/assets/openinv/textures/item/crafting_output.png diff --git a/resource-pack/assets/openinv/textures/item/cursor.png b/resource-pack/openinv-legibility-pack/assets/openinv/textures/item/cursor.png similarity index 100% rename from resource-pack/assets/openinv/textures/item/cursor.png rename to resource-pack/openinv-legibility-pack/assets/openinv/textures/item/cursor.png diff --git a/resource-pack/assets/openinv/textures/item/drop.png b/resource-pack/openinv-legibility-pack/assets/openinv/textures/item/drop.png similarity index 100% rename from resource-pack/assets/openinv/textures/item/drop.png rename to resource-pack/openinv-legibility-pack/assets/openinv/textures/item/drop.png diff --git a/resource-pack/assets/openinv/textures/item/empty_boots.png b/resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_boots.png similarity index 100% rename from resource-pack/assets/openinv/textures/item/empty_boots.png rename to resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_boots.png diff --git a/resource-pack/assets/openinv/textures/item/empty_chestplate.png b/resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_chestplate.png similarity index 100% rename from resource-pack/assets/openinv/textures/item/empty_chestplate.png rename to resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_chestplate.png diff --git a/resource-pack/assets/openinv/textures/item/empty_helmet.png b/resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_helmet.png similarity index 100% rename from resource-pack/assets/openinv/textures/item/empty_helmet.png rename to resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_helmet.png diff --git a/resource-pack/assets/openinv/textures/item/empty_leggings.png b/resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_leggings.png similarity index 100% rename from resource-pack/assets/openinv/textures/item/empty_leggings.png rename to resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_leggings.png diff --git a/resource-pack/assets/openinv/textures/item/empty_shield.png b/resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_shield.png similarity index 100% rename from resource-pack/assets/openinv/textures/item/empty_shield.png rename to resource-pack/openinv-legibility-pack/assets/openinv/textures/item/empty_shield.png diff --git a/resource-pack/assets/openinv/textures/item/not_a_slot.png b/resource-pack/openinv-legibility-pack/assets/openinv/textures/item/not_a_slot.png similarity index 100% rename from resource-pack/assets/openinv/textures/item/not_a_slot.png rename to resource-pack/openinv-legibility-pack/assets/openinv/textures/item/not_a_slot.png diff --git a/resource-pack/openinv_34/assets/minecraft/models/item/crafting_table.json b/resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/crafting_table.json similarity index 100% rename from resource-pack/openinv_34/assets/minecraft/models/item/crafting_table.json rename to resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/crafting_table.json diff --git a/resource-pack/openinv_34/assets/minecraft/models/item/dropper.json b/resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/dropper.json similarity index 100% rename from resource-pack/openinv_34/assets/minecraft/models/item/dropper.json rename to resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/dropper.json diff --git a/resource-pack/openinv_34/assets/minecraft/models/item/leather_boots.json b/resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/leather_boots.json similarity index 100% rename from resource-pack/openinv_34/assets/minecraft/models/item/leather_boots.json rename to resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/leather_boots.json diff --git a/resource-pack/openinv_34/assets/minecraft/models/item/leather_chestplate.json b/resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/leather_chestplate.json similarity index 100% rename from resource-pack/openinv_34/assets/minecraft/models/item/leather_chestplate.json rename to resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/leather_chestplate.json diff --git a/resource-pack/openinv_34/assets/minecraft/models/item/leather_helmet.json b/resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/leather_helmet.json similarity index 100% rename from resource-pack/openinv_34/assets/minecraft/models/item/leather_helmet.json rename to resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/leather_helmet.json diff --git a/resource-pack/openinv_34/assets/minecraft/models/item/leather_leggings.json b/resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/leather_leggings.json similarity index 100% rename from resource-pack/openinv_34/assets/minecraft/models/item/leather_leggings.json rename to resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/leather_leggings.json diff --git a/resource-pack/openinv_34/assets/minecraft/models/item/shield.json b/resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/shield.json similarity index 100% rename from resource-pack/openinv_34/assets/minecraft/models/item/shield.json rename to resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/shield.json diff --git a/resource-pack/openinv_34/assets/minecraft/models/item/white_banner.json b/resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/white_banner.json similarity index 100% rename from resource-pack/openinv_34/assets/minecraft/models/item/white_banner.json rename to resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/white_banner.json diff --git a/resource-pack/openinv_34/assets/minecraft/models/item/white_stained_glass_pane.json b/resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/white_stained_glass_pane.json similarity index 100% rename from resource-pack/openinv_34/assets/minecraft/models/item/white_stained_glass_pane.json rename to resource-pack/openinv-legibility-pack/openinv_34/assets/minecraft/models/item/white_stained_glass_pane.json diff --git a/resource-pack/openinv_44/assets/minecraft/items/crafting_table.json b/resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/crafting_table.json similarity index 100% rename from resource-pack/openinv_44/assets/minecraft/items/crafting_table.json rename to resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/crafting_table.json diff --git a/resource-pack/openinv_44/assets/minecraft/items/dropper.json b/resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/dropper.json similarity index 100% rename from resource-pack/openinv_44/assets/minecraft/items/dropper.json rename to resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/dropper.json diff --git a/resource-pack/openinv_44/assets/minecraft/items/leather_boots.json b/resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/leather_boots.json similarity index 100% rename from resource-pack/openinv_44/assets/minecraft/items/leather_boots.json rename to resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/leather_boots.json diff --git a/resource-pack/openinv_44/assets/minecraft/items/leather_chestplate.json b/resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/leather_chestplate.json similarity index 100% rename from resource-pack/openinv_44/assets/minecraft/items/leather_chestplate.json rename to resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/leather_chestplate.json diff --git a/resource-pack/openinv_44/assets/minecraft/items/leather_helmet.json b/resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/leather_helmet.json similarity index 100% rename from resource-pack/openinv_44/assets/minecraft/items/leather_helmet.json rename to resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/leather_helmet.json diff --git a/resource-pack/openinv_44/assets/minecraft/items/leather_leggings.json b/resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/leather_leggings.json similarity index 100% rename from resource-pack/openinv_44/assets/minecraft/items/leather_leggings.json rename to resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/leather_leggings.json diff --git a/resource-pack/openinv_44/assets/minecraft/items/shield.json b/resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/shield.json similarity index 100% rename from resource-pack/openinv_44/assets/minecraft/items/shield.json rename to resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/shield.json diff --git a/resource-pack/openinv_44/assets/minecraft/items/white_banner.json b/resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/white_banner.json similarity index 100% rename from resource-pack/openinv_44/assets/minecraft/items/white_banner.json rename to resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/white_banner.json diff --git a/resource-pack/openinv_44/assets/minecraft/items/white_stained_glass_pane.json b/resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/white_stained_glass_pane.json similarity index 100% rename from resource-pack/openinv_44/assets/minecraft/items/white_stained_glass_pane.json rename to resource-pack/openinv-legibility-pack/openinv_44/assets/minecraft/items/white_stained_glass_pane.json diff --git a/resource-pack/pack.mcmeta b/resource-pack/openinv-legibility-pack/pack.mcmeta similarity index 100% rename from resource-pack/pack.mcmeta rename to resource-pack/openinv-legibility-pack/pack.mcmeta diff --git a/resource-pack/pack.png b/resource-pack/openinv-legibility-pack/pack.png similarity index 100% rename from resource-pack/pack.png rename to resource-pack/openinv-legibility-pack/pack.png diff --git a/scripts/generate_changelog.sh b/scripts/generate_changelog.sh deleted file mode 100644 index bc234b9d..00000000 --- a/scripts/generate_changelog.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2011-2023 lishid. All rights reserved. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# Note that this script is designed for use in GitHub Actions, and is not -# particularly robust nor configurable. Run from project parent directory. - -# Query GitHub for the username of the given email address. -# Falls through to the given author name. -function lookup_email_username() { - lookup=$(curl -G --data-urlencode "q=$1 in:email" https://api.github.com/search/users -H 'Accept: application/vnd.github.v3+json' | grep '"login":' | sed -e 's/^.*": "//g' -e 's/",.*$//g') - - if [[ $lookup ]]; then - echo -n "@$lookup" - else - echo "$2" - fi -} - -# Get a pretty list of supported Minecraft versions -function get_minecraft_versions() { - readarray -t versions <<< "$(. ./scripts/get_spigot_versions.sh)" - - for version in "${versions[@]}"; do - # Append comma if variable is set, then append version - minecraft_versions="${minecraft_versions:+${minecraft_versions}, }${version%%-R*}" - done - - echo "${minecraft_versions}" -} - -previous_tag=$(git describe --tags --abbrev=0 @^) - -# Use formatted log to pull authors list -authors_raw=$(git log --pretty=format:"%ae|%an" "$previous_tag"..@) -readarray -t authors <<<"$authors_raw" - -# Use associative array to map email to author name -declare -A author_data - -for author in "${authors[@]}"; do - # Match author email - author_email=${author%|*} - # Convert to lower case - author_email=${author_email,,} - # Match author name - author_name=${author##*|} - if [[ -n ${author_data[$author_email]} ]]; then - # Skip emails we already have data for - continue - fi - - # Fetch and store author GitHub username by email - author_data[$author_email]=$(lookup_email_username "$author_email" "$author_name") -done - -# Fetch actual formatted changelog -changelog=$(git log --pretty=format:"* %s (%h) - %ae" "$previous_tag"..@) - -for author_email in "${!author_data[@]}"; do - # Ignore case when matching - shopt -s nocasematch - # Match and replace email - changelog=${changelog//$author_email/${author_data[$author_email]}} -done - -minecraft_versions=$(get_minecraft_versions) - -printf "## Supported Minecraft versions\n%s\n\n## Changelog\n%s" "${minecraft_versions}" "${changelog}" diff --git a/scripts/get_spigot_versions.sh b/scripts/get_spigot_versions.sh deleted file mode 100644 index c4e7b264..00000000 --- a/scripts/get_spigot_versions.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2011-2022 lishid. All rights reserved. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# Note that this script is designed for use in GitHub Actions, and is not -# particularly robust nor configurable. Run from project parent directory. - -# Use a nameref as a cache - maven evaluation is pretty slow. -# Re-calling the script and relying on it to handle caching is way easier than passing around info. -declare -a spigot_versions - -# We don't care about concatenation - either it's not null and we handle entries or it's null and we instantiate. -# shellcheck disable=SC2199 -if [[ ${spigot_versions[@]} ]]; then - for spigot_version in "${spigot_versions[@]}"; do - echo "$spigot_version" - done - return -fi - -old_maven_opts=$MAVEN_OPTS -# Add JVM parameters to allow help plugin access to packages it needs. -export MAVEN_OPTS="$old_maven_opts --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.desktop/java.awt.font=ALL-UNNAMED" - -# Pull Spigot dependency information from Maven. -# Since we only care about Spigot versions, only check modules in the folder internal. -readarray -t modules <<< "$(mvn help:evaluate -Dexpression=project.modules -q -DforceStdout -P all | grep -oP '(?<=)(internal/.*)(?=)')" - -declare -n versions="spigot_versions" - -for module in "${modules[@]}"; do - # Get Spigot version. - spigot_version=$(mvn help:evaluate -Dexpression=spigot.version -q -DforceStdout -P all -pl "$module") - versions+=("$spigot_version") - echo "$spigot_version" -done - -# Reset JVM parameters -export MAVEN_OPTS=$old_maven_opts \ No newline at end of file diff --git a/scripts/install_spigot_dependencies.sh b/scripts/install_spigot_dependencies.sh deleted file mode 100644 index 61668d42..00000000 --- a/scripts/install_spigot_dependencies.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2011-2022 lishid. All rights reserved. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# Note that this script is designed for use in GitHub Actions, and is not -# particularly robust nor configurable. Run from project parent directory. - -buildtools_dir=~/buildtools -buildtools=$buildtools_dir/BuildTools.jar - -get_buildtools () { - if [[ -d $buildtools_dir && -f $buildtools ]]; then - return - fi - - mkdir $buildtools_dir - wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -O $buildtools -} - -readarray -t versions <<< "$(. ./scripts/get_spigot_versions.sh)" -echo Found Spigot dependencies: "${versions[@]}" - -# Install dependencies aside from Spigot prior to running in offline mode. -mvn dependency:go-offline -DexcludeArtifactIds=spigot - -for version in "${versions[@]}"; do - set -e - exit_code=0 - mvn dependency:get -Dartifact=org.spigotmc:spigot:"$version":remapped-mojang -q -o || exit_code=$? - if [ $exit_code -ne 0 ]; then - echo Installing missing Spigot version "$version" - revision=${version%%-R*} - get_buildtools - java -jar $buildtools -rev "$revision" --remapped - else - echo Spigot "$version" is already installed - fi -done diff --git a/scripts/set_curseforge_env.sh b/scripts/set_curseforge_env.sh old mode 100644 new mode 100755 index 09f08b45..e345163b --- a/scripts/set_curseforge_env.sh +++ b/scripts/set_curseforge_env.sh @@ -20,7 +20,8 @@ # Parse Spigot dependency information into major Minecraft versions function get_curseforge_minecraft_versions() { - readarray -t versions <<< "$(. ./scripts/get_spigot_versions.sh)" + # TODO convert to parsing event body + readarray -t versions <<< "1.21.4" for version in "${versions[@]}"; do # Parse Minecraft major version @@ -38,18 +39,5 @@ function get_curseforge_minecraft_versions() { echo "${minecraft_versions}" } -# Modify provided changelog to not break when inserted into yaml file. -function get_yaml_safe_changelog() { - changelog=$1 - # Since we're using a flow scalar, newlines need to be doubled. - echo "${changelog// -/ - -}" -} - minecraft_versions=$(get_curseforge_minecraft_versions) echo "CURSEFORGE_MINECRAFT_VERSIONS=$minecraft_versions" >> "$GITHUB_ENV" - -changelog=$(get_yaml_safe_changelog "$1") -printf "CURSEFORGE_CHANGELOG<> "$GITHUB_ENV" \ No newline at end of file diff --git a/scripts/set_release_env.sh b/scripts/set_release_env.sh deleted file mode 100644 index 3d850dcc..00000000 --- a/scripts/set_release_env.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2011-2021 lishid. All rights reserved. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 3. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# Note that this script is designed for use in GitHub Actions, and is not -# particularly robust nor configurable. Run from project parent directory. - -# Get a pretty string of the project's name and version -# Disable SC warning about variable expansion for this function - those are Maven variables. -# shellcheck disable=SC2016 -function get_versioned_name() { - mvn -q -Dexec.executable=echo -Dexec.args='${project.name} ${project.version}' --non-recursive exec:exec -} - -# Set GitHub environmental variables -echo "VERSIONED_NAME=$(get_versioned_name)" >> "$GITHUB_ENV" - -changelog="$(. ./scripts/generate_changelog.sh)" -printf "GENERATED_CHANGELOG<> "$GITHUB_ENV" diff --git a/scripts/tag_release.sh b/scripts/tag_release.sh old mode 100644 new mode 100755 diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..076b86ce --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,33 @@ +rootProject.name = "openinvparent" + +include(":openinvapi") +project(":openinvapi").projectDir = file("api") + +val addons = listOf( + "togglepersist" +) +for (addon in addons) { + include(":addon$addon") + val proj = project(":addon$addon") + proj.projectDir = file("addon/$addon") + proj.name = "openinv$addon" +} + +include(":openinvcommon") +project(":openinvcommon").projectDir = file("common") + +val internals = listOf( + "common", + "spigot" +) +for (internal in internals) { + include(":openinvadapter$internal") + val proj = project(":openinvadapter$internal") + proj.projectDir = file("internal/$internal") + proj.name = "openinvadapter$internal" +} + +include(":resource-pack") + +include(":plugin") +project(":plugin").name = "openinvplugin"