Archiviert
13
0

1.21.3-update #16

Zusammengeführt
Lixfel hat 329 Commits von 1.21.1-update nach master 2024-11-24 20:47:52 +01:00 zusammengeführt
1557 geänderte Dateien mit 70774 neuen und 54530 gelöschten Zeilen

Datei anzeigen

@ -1,7 +1,21 @@
name: Behavior Bug or Plugin Incompatibility name: "🐛 Bug or Incompatibility"
description: Report issues with plugin incompatbility or other behavior related issues. description: Report issues related to unexpected behavior or vanilla/plugin incompatibility.
labels: [ "status: needs triage", "type: bug" ] type: "Bug"
labels:
- "status: needs triage"
body: body:
- type: markdown
attributes:
value: |
Before submitting this issue, please ensure the following:
1. You are using the latest version of Paper, available on our [our downloads page](https://papermc.io/downloads/paper).
2. You have searched to confirm there isnt [an existing open issue](https://github.com/PaperMC/Paper/issues?q=is%3Aissue%20state%3Aopen%20type%3ABug) on this topic.
3. Your version of Minecraft is supported by Paper.
If you're unsure whether you've encountered a bug, feel free to ask in the `#paper-help` channel on our
[Discord](https://discord.gg/papermc).
- type: textarea - type: textarea
attributes: attributes:
label: Expected behavior label: Expected behavior
@ -63,15 +77,3 @@ body:
validations: validations:
required: false required: false
- type: markdown
attributes:
value: |
Before submitting this issue, please ensure the following:
1. You are running the latest version of Paper from [our downloads page](https://papermc.io/downloads/paper).
2. You searched for and ensured there isn't already an open issue regarding this.
3. Your version of Minecraft is supported by Paper.
If you think you have a bug but are not sure, feel free to ask the `#paper-help` channel of our
[Discord](https://discord.gg/papermc).

Datei anzeigen

@ -1,13 +1,10 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: Feature Request - name: "❗Exploits"
url: https://github.com/PaperMC/Paper/discussions/new?category=ideas
about: Suggest an idea for Paper
- name: PaperMC Discord
url: https://discord.gg/papermc
about: If you are having issues with spark or have other minor issues, come ask us on our Discord server!
- name: Exploit Report
url: https://discord.gg/papermc url: https://discord.gg/papermc
about: | about: |
Due to GitHub not currently allowing private issues, exploit reports are currently handled via our Discord. Since GitHub doesnt currently support private issues, exploit reports are managed through our Discord.
To report an exploit, see the #paper-exploit-report channel. To report an exploit, please visit the #paper-exploit-report channel.
- name: "🗨 Questions"
url: https://discord.gg/papermc
about: If you have questions or need help with any minor issues, feel free to ask us on our Discord server!

Datei anzeigen

@ -1,16 +1,30 @@
name: Server crash or Stacktrace name: "💥 Crash or Stacktrace"
description: Report server crashes or scary stacktraces description: Report any server crashes or alarming stack traces.
labels: [ "status: needs triage" ] type: "Bug"
labels:
- "status: needs triage"
body: body:
- type: markdown
attributes:
value: |
Before submitting this issue, please ensure the following:
1. You are running the latest version of Paper from [our downloads page](https://papermc.io/downloads/paper).
2. Your version of Minecraft is supported by Paper.
If your server crash log contains `DO NOT REPORT THIS TO PAPER`, please ask in our
[Discord](https://discord.gg/papermc) before opening this issue. These messages are informing you of server
lag and providing debug information.
- type: textarea - type: textarea
attributes: attributes:
label: Stack trace label: Stack trace
description: | description: |
We need all of the stack trace! Do not cut off parts of it. Please do not use attachments. We need all of the stack trace! Do not cut off parts of it. Please do not use attachments.
If you prefer, you can use a paste site like https://paste.gg. If you prefer, you can use a paste site like https://mclo.gs.
value: | value: |
``` ```
paste your stack trace or a paste.gg link here! paste your stack trace or a mclo.gs link here!
``` ```
placeholder: Please don't remove the backticks; it makes your issue a lot harder to read! placeholder: Please don't remove the backticks; it makes your issue a lot harder to read!
validations: validations:
@ -62,15 +76,3 @@ body:
The more information we receive, the quicker and more effective we can be at finding the solution to the issue. The more information we receive, the quicker and more effective we can be at finding the solution to the issue.
validations: validations:
required: false required: false
- type: markdown
attributes:
value: |
Before submitting this issue, please ensure the following:
1. You are running the latest version of Paper from [our downloads page](https://papermc.io/downloads/paper).
2. Your version of Minecraft is supported by Paper.
If your server crash log contains `DO NOT REPORT THIS TO PAPER`, please ask in our
[Discord](https://discord.gg/papermc) before opening this issue. These messages are informing you of server
lag and providing debug information.

53
.github/ISSUE_TEMPLATE/new-feature.yml vendored Normale Datei
Datei anzeigen

@ -0,0 +1,53 @@
name: "💡 New Feature"
description: Propose a new idea for Paper.
type: "Feature"
labels:
- "status: needs triage"
body:
- type: markdown
attributes:
value: |
Thank you for submitting a feature request for Paper! Please be as detailed as possible to help us review and consider your request effectively.
Before submitting, please ensure the following:
1. You are using a supported version of Paper.
2. The feature youre requesting isnt already included in the version youre using.
3. Youve searched for and confirmed there isnt already [an open request](https://github.com/PaperMC/Paper/issues?q=is%3Aissue%20is%3Aopen%20type%3AFeature) for this feature.
- If a similar request exists, feel free to add any additional details you think are helpful.
If you have any questions, feel free to ask in the `#paper-help` or `#paper-dev` channels on our [Discord](https://discord.gg/papermc).
- type: textarea
attributes:
label: Is your feature request related to a problem?
description: Please provide some context for this request. Why do you want it added?
validations:
required: true
- type: textarea
attributes:
label: Describe the solution you'd like.
description: A clear and concise description of what you want.
validations:
required: true
- type: textarea
attributes:
label: Describe alternatives you've considered.
description: List any alternatives you might have tried to get the feature you want.
validations:
required: true
- type: textarea
attributes:
label: Other
description: Add any other context or screenshots about the feature request below.
validations:
required: false
- type: markdown
attributes:
value: |
Before submitting this feature request, please search our issue tracker to ensure your feature has not
already been requested.

Datei anzeigen

@ -1,7 +1,19 @@
name: Performance Problem name: "🐌 Performance Problem"
description: Report performance related problems or other areas of concern description: Report any performance issues.
labels: [ "status: needs triage", "type: performance" ] type: "Bug"
labels:
- "scope: performance"
- "status: needs triage"
body: body:
- type: markdown
attributes:
value: |
Before submitting this issue, please ensure the following:
1. You are running the latest version of Paper from [our downloads page](https://papermc.io/downloads/paper).
2. You searched for and ensured there isn't already [an open issue](https://github.com/PaperMC/Paper/issues?q=is%3Aissue%20state%3Aopen%20type%3ABug) regarding this.
3. Your version of Minecraft is supported by Paper.
- type: markdown - type: markdown
attributes: attributes:
value: | value: |
@ -10,8 +22,11 @@ body:
- type: input - type: input
attributes: attributes:
label: Profile link label: Spark Profile
description: We ask that all profiles are a link, not a screenshot. Screenshots inhibit our ability to figure out the real cause of the issue. description: |
Please provide all profiles as links rather than screenshots. Screenshots limit our ability to investigate the root cause of the issue.
For more information, see our [profiling documentation](https://docs.papermc.io/paper/profiling).
placeholder: "Example: https://spark.lucko.me/XsN0hxGfsi" placeholder: "Example: https://spark.lucko.me/XsN0hxGfsi"
validations: validations:
required: true required: true
@ -35,10 +50,10 @@ body:
- type: textarea - type: textarea
attributes: attributes:
label: Server config files label: Server config files
description: We need bukkit.yml, spigot.yml, paper-global.yml, paper-world-defaults.yml and server.properties. If you use per-world Paper configs, make sure to include them. You can paste it below or use a paste site like https://paste.gg. description: We need bukkit.yml, spigot.yml, paper-global.yml, paper-world-defaults.yml and server.properties. If you use per-world Paper configs, make sure to include them. You can paste it below or use a paste site like https://mclo.gs.
value: | value: |
``` ```
Paste configs or paste.gg link here! Paste configs or mclo.gs link here!
``` ```
placeholder: Please don't remove the backticks; it makes your issue a lot harder to read! placeholder: Please don't remove the backticks; it makes your issue a lot harder to read!
validations: validations:
@ -74,11 +89,3 @@ body:
The more information we receive, the quicker and more effective we can be at finding the solution to the issue. The more information we receive, the quicker and more effective we can be at finding the solution to the issue.
validations: validations:
required: false required: false
- type: markdown
attributes:
value: |
Before submitting this issue, please ensure the following:
1. You are running the latest version of Paper from [our downloads page](https://papermc.io/downloads/paper).
2. You searched for and ensured there isn't already an open issue regarding this.
3. Your version of Minecraft is supported by Paper.

Datei anzeigen

@ -56,7 +56,6 @@ split into different directories which target certain parts of the code. These
directories are: directories are:
- `Paper-API` - Modifications to `Spigot-API`/`Bukkit`; - `Paper-API` - Modifications to `Spigot-API`/`Bukkit`;
- `Paper-MojangAPI` - An API for [Mojang's Brigadier](https://github.com/Mojang/brigadier);
- `Paper-Server` - Modifications to `Spigot`/`CraftBukkit`. - `Paper-Server` - Modifications to `Spigot`/`CraftBukkit`.
Because the entire structure is based on patches and git, a basic understanding Because the entire structure is based on patches and git, a basic understanding
@ -97,7 +96,9 @@ Your commit will be converted into a patch that you can then PR into Paper.
## Modifying Patches ## Modifying Patches
Modifying previous patches is a bit more complex: Modifying previous patches is a bit more complex.
Similar to adding patches, the methods to modify a patch are applied inside
the `Paper-Server` and/or `Paper-API` folders.
### Method 1 ### Method 1
@ -184,6 +185,8 @@ These steps assume the `origin` remote is your fork of this repository and `upst
1. Checkout feature/fix branch and rebase on master: `git checkout patch-branch && git rebase master`. 1. Checkout feature/fix branch and rebase on master: `git checkout patch-branch && git rebase master`.
1. Apply updated patches: `./gradlew applyPatches`. 1. Apply updated patches: `./gradlew applyPatches`.
1. If there are conflicts, fix them. 1. If there are conflicts, fix them.
* If there are conflicts within `Paper-API`, after fixing them run `./gradlew rebuildApiPatches` before re-running `./gradlew applyPatches`.
* The API patches are applied first, so if there are conflicts in the API patches, the server patches will not be applied.
1. If your PR creates new patches instead of modifying existing ones, in both the `Paper-Server` and `Paper-API` directories, ensure your newly-created patch is the last commit by either: 1. If your PR creates new patches instead of modifying existing ones, in both the `Paper-Server` and `Paper-API` directories, ensure your newly-created patch is the last commit by either:
* Renaming the patch file with a large 4-digit number in front (e.g. 9999-Patch-to-add-some-new-stuff.patch), and re-applying patches. * Renaming the patch file with a large 4-digit number in front (e.g. 9999-Patch-to-add-some-new-stuff.patch), and re-applying patches.
* Running `git rebase --interactive base` and moving the commits to the end. * Running `git rebase --interactive base` and moving the commits to the end.
@ -248,6 +251,17 @@ instead of adding a new import to the top of the file. If you are using a type a
can add an import with a comment. However, if its only used a couple of times, the FQN is preferred to prevent future can add an import with a comment. However, if its only used a couple of times, the FQN is preferred to prevent future
patch conflicts in the import section of the file. patch conflicts in the import section of the file.
### Nullability annotations
We are in the process of switching nullability annotation libraries, so you might need to use one or the other:
**For classes we add**: Fields, method parameters and return types that are nullable should be marked via the
`@Nullable` annotation from `org.jspecify.annotations`. Whenever you create a new class, add `@NullMarked`, meaning types
are assumed to be non-null by default. For less obvious placing such as on generics or arrays, see the [JSpecify docs](https://jspecify.dev/docs/user-guide/).
**For classes added by upstream**: Keep using both `@Nullable` and `@NotNull` from `org.jetbrains.annotations`. These
will be replaced later.
```java ```java
import org.bukkit.event.Event; import org.bukkit.event.Event;
// don't add import here, use FQN like below // don't add import here, use FQN like below

Datei anzeigen

@ -43,7 +43,7 @@ ysl3000 <yannicklamprecht@live.de>
Machine_Maker <machine@machinemaker.me> Machine_Maker <machine@machinemaker.me>
Ivan Pekov <ivan@mrivanplays.com> Ivan Pekov <ivan@mrivanplays.com>
Camotoy <20743703+Camotoy@users.noreply.github.com> Camotoy <20743703+Camotoy@users.noreply.github.com>
Bjarne Koll <lynxplay101@gmail.com> Bjarne Koll <git@lynxplay.dev>
MeFisto94 <MeFisto94@users.noreply.github.com> MeFisto94 <MeFisto94@users.noreply.github.com>
Owen1212055 <23108066+Owen1212055@users.noreply.github.com> Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
LemonCaramel <admin@caramel.moe> LemonCaramel <admin@caramel.moe>
@ -64,4 +64,5 @@ Oliwier Miodun <naczs@blueflow.pl>
aerulion <aerulion@gmail.com> aerulion <aerulion@gmail.com>
Lukas Planz <lukas.planz@web.de> Lukas Planz <lukas.planz@web.de>
granny <contact@granny.dev> granny <contact@granny.dev>
mja00 <me@mja00.dev>
``` ```

Datei anzeigen

@ -40,7 +40,7 @@ How To (Plugin Developers)
<dependency> <dependency>
<groupId>io.papermc.paper</groupId> <groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId> <artifactId>paper-api</artifactId>
<version>1.21.1-R0.1-SNAPSHOT</version> <version>1.21.3-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
``` ```
@ -53,7 +53,7 @@ repositories {
} }
dependencies { dependencies {
compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.21.3-R0.1-SNAPSHOT")
} }
java { java {

14
SECURITY.md Normale Datei
Datei anzeigen

@ -0,0 +1,14 @@
# Security Policy
## Supported Versions
We generally only fully support the latest version, the same applies to exploits such as server crashes and item
duplication bugs. In the transition period during larger Minecraft updates, we may still backport important fixes to the
last minor or major release.
## Reporting a Vulnerability
For any issues that are NOT duplication bugs, server/client crashes, or otherwise serious exploits, please open an issue
through the [Issues tab](https://github.com/PaperMC/Paper/issues).
For exploits, please [join our Discord](https://discord.gg/papermc) and see the [#paper-exploit-report channel](https://discord.com/channels/289587909051416579/1208749386348101682) for
further instructions.

Datei anzeigen

@ -14,7 +14,7 @@ tiny 2 0 mojang+yarn spigot
# CraftBukkit changes type # CraftBukkit changes type
c net/minecraft/server/level/ServerLevel net/minecraft/server/level/WorldServer c net/minecraft/server/level/ServerLevel net/minecraft/server/level/WorldServer
f Lnet/minecraft/world/level/storage/PrimaryLevelData; serverLevelData K f Lnet/minecraft/world/level/storage/PrimaryLevelData; serverLevelData L
c net/minecraft/world/level/chunk/LevelChunk net/minecraft/world/level/chunk/Chunk c net/minecraft/world/level/chunk/LevelChunk net/minecraft/world/level/chunk/Chunk
f Lnet/minecraft/server/level/ServerLevel; level r f Lnet/minecraft/server/level/ServerLevel; level r

Datei anzeigen

@ -11,7 +11,7 @@ import kotlin.io.path.*
plugins { plugins {
java java
`maven-publish` `maven-publish`
id("io.papermc.paperweight.core") version "1.7.1" id("io.papermc.paperweight.core") version "1.7.5"
} }
allprojects { allprojects {
@ -67,7 +67,7 @@ repositories {
} }
dependencies { dependencies {
paramMappings("net.fabricmc:yarn:1.21.1+build.3:mergedv2") paramMappings("net.fabricmc:yarn:1.21.3+build.1:mergedv2")
remapper("net.fabricmc:tiny-remapper:0.10.3:fat") remapper("net.fabricmc:tiny-remapper:0.10.3:fat")
decompiler("org.vineflower:vineflower:1.10.1") decompiler("org.vineflower:vineflower:1.10.1")
spigotDecompiler("io.papermc:patched-spigot-fernflower:0.1+build.13") spigotDecompiler("io.papermc:patched-spigot-fernflower:0.1+build.13")

Datei anzeigen

@ -1,6 +1,6 @@
group=io.papermc.paper group=io.papermc.paper
version=1.21.1-R0.1-SNAPSHOT version=1.21.3-R0.1-SNAPSHOT
mcVersion=1.21.1 mcVersion=1.21.3
# Set to true while updating Minecraft version # Set to true while updating Minecraft version
updatingMinecraft=false updatingMinecraft=false

Binäre Datei nicht angezeigt.

Datei anzeigen

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

5
gradlew vendored
Datei anzeigen

@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@ -84,7 +86,8 @@ done
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum

2
gradlew.bat vendored
Datei anzeigen

@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################

Datei anzeigen

@ -15,7 +15,7 @@ dependencies {
implementation("com.squareup:javapoet:1.13.0") implementation("com.squareup:javapoet:1.13.0")
implementation(project(":paper-api")) implementation(project(":paper-api"))
implementation("io.github.classgraph:classgraph:4.8.47") implementation("io.github.classgraph:classgraph:4.8.47")
implementation("org.jetbrains:annotations:24.0.1") implementation("org.jetbrains:annotations:24.1.0")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
testRuntimeOnly("org.junit.platform:junit-platform-launcher") testRuntimeOnly("org.junit.platform:junit-platform-launcher")
} }

Datei anzeigen

@ -51,7 +51,7 @@ import org.bukkit.entity.WanderingTrader;
import org.bukkit.entity.Wither; import org.bukkit.entity.Wither;
import org.bukkit.entity.Wolf; import org.bukkit.entity.Wolf;
import org.bukkit.entity.Zombie; import org.bukkit.entity.Zombie;
import org.checkerframework.checker.nullness.qual.NonNull; import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for Mob Goals. * Vanilla keys for Mob Goals.
@ -66,7 +66,8 @@ import org.checkerframework.checker.nullness.qual.NonNull;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
public interface VanillaGoal<T extends Mob> extends Goal<T> { public interface VanillaGoal<T extends Mob> extends Goal<T> {
GoalKey<AbstractHorse> RANDOM_STAND = create("random_stand", AbstractHorse.class); GoalKey<AbstractHorse> RANDOM_STAND = create("random_stand", AbstractHorse.class);
@ -102,6 +103,10 @@ public interface VanillaGoal<T extends Mob> extends Goal<T> {
GoalKey<Bee> BEE_WANDER = create("bee_wander", Bee.class); GoalKey<Bee> BEE_WANDER = create("bee_wander", Bee.class);
GoalKey<Bee> VALIDATE_FLOWER = create("validate_flower", Bee.class);
GoalKey<Bee> VALIDATE_HIVE = create("validate_hive", Bee.class);
GoalKey<Blaze> BLAZE_ATTACK = create("blaze_attack", Blaze.class); GoalKey<Blaze> BLAZE_ATTACK = create("blaze_attack", Blaze.class);
GoalKey<Cat> CAT_AVOID_ENTITY = create("cat_avoid_entity", Cat.class); GoalKey<Cat> CAT_AVOID_ENTITY = create("cat_avoid_entity", Cat.class);
@ -436,8 +441,7 @@ public interface VanillaGoal<T extends Mob> extends Goal<T> {
GoalKey<Zombie> ZOMBIE_ATTACK_TURTLE_EGG = create("zombie_attack_turtle_egg", Zombie.class); GoalKey<Zombie> ZOMBIE_ATTACK_TURTLE_EGG = create("zombie_attack_turtle_egg", Zombie.class);
private static <T extends Mob> @NonNull GoalKey<T> create(final @NonNull String key, private static <T extends Mob> GoalKey<T> create(final String key, final Class<T> type) {
final @NonNull Class<T> type) {
return GoalKey.of(type, NamespacedKey.minecraft(key)); return GoalKey.of(type, NamespacedKey.minecraft(key));
} }
} }

Datei anzeigen

@ -0,0 +1,260 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.attribute.Attribute;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#ATTRIBUTE}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class AttributeKeys {
/**
* {@code minecraft:armor}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> ARMOR = create(key("armor"));
/**
* {@code minecraft:armor_toughness}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> ARMOR_TOUGHNESS = create(key("armor_toughness"));
/**
* {@code minecraft:attack_damage}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> ATTACK_DAMAGE = create(key("attack_damage"));
/**
* {@code minecraft:attack_knockback}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> ATTACK_KNOCKBACK = create(key("attack_knockback"));
/**
* {@code minecraft:attack_speed}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> ATTACK_SPEED = create(key("attack_speed"));
/**
* {@code minecraft:block_break_speed}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> BLOCK_BREAK_SPEED = create(key("block_break_speed"));
/**
* {@code minecraft:block_interaction_range}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> BLOCK_INTERACTION_RANGE = create(key("block_interaction_range"));
/**
* {@code minecraft:burning_time}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> BURNING_TIME = create(key("burning_time"));
/**
* {@code minecraft:entity_interaction_range}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> ENTITY_INTERACTION_RANGE = create(key("entity_interaction_range"));
/**
* {@code minecraft:explosion_knockback_resistance}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> EXPLOSION_KNOCKBACK_RESISTANCE = create(key("explosion_knockback_resistance"));
/**
* {@code minecraft:fall_damage_multiplier}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> FALL_DAMAGE_MULTIPLIER = create(key("fall_damage_multiplier"));
/**
* {@code minecraft:flying_speed}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> FLYING_SPEED = create(key("flying_speed"));
/**
* {@code minecraft:follow_range}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> FOLLOW_RANGE = create(key("follow_range"));
/**
* {@code minecraft:gravity}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> GRAVITY = create(key("gravity"));
/**
* {@code minecraft:jump_strength}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> JUMP_STRENGTH = create(key("jump_strength"));
/**
* {@code minecraft:knockback_resistance}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> KNOCKBACK_RESISTANCE = create(key("knockback_resistance"));
/**
* {@code minecraft:luck}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> LUCK = create(key("luck"));
/**
* {@code minecraft:max_absorption}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> MAX_ABSORPTION = create(key("max_absorption"));
/**
* {@code minecraft:max_health}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> MAX_HEALTH = create(key("max_health"));
/**
* {@code minecraft:mining_efficiency}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> MINING_EFFICIENCY = create(key("mining_efficiency"));
/**
* {@code minecraft:movement_efficiency}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> MOVEMENT_EFFICIENCY = create(key("movement_efficiency"));
/**
* {@code minecraft:movement_speed}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> MOVEMENT_SPEED = create(key("movement_speed"));
/**
* {@code minecraft:oxygen_bonus}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> OXYGEN_BONUS = create(key("oxygen_bonus"));
/**
* {@code minecraft:safe_fall_distance}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> SAFE_FALL_DISTANCE = create(key("safe_fall_distance"));
/**
* {@code minecraft:scale}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> SCALE = create(key("scale"));
/**
* {@code minecraft:sneaking_speed}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> SNEAKING_SPEED = create(key("sneaking_speed"));
/**
* {@code minecraft:spawn_reinforcements}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> SPAWN_REINFORCEMENTS = create(key("spawn_reinforcements"));
/**
* {@code minecraft:step_height}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> STEP_HEIGHT = create(key("step_height"));
/**
* {@code minecraft:submerged_mining_speed}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> SUBMERGED_MINING_SPEED = create(key("submerged_mining_speed"));
/**
* {@code minecraft:sweeping_damage_ratio}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> SWEEPING_DAMAGE_RATIO = create(key("sweeping_damage_ratio"));
/**
* {@code minecraft:tempt_range}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> TEMPT_RANGE = create(key("tempt_range"));
/**
* {@code minecraft:water_movement_efficiency}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Attribute> WATER_MOVEMENT_EFFICIENCY = create(key("water_movement_efficiency"));
private AttributeKeys() {
}
private static TypedKey<Attribute> create(final Key key) {
return TypedKey.create(RegistryKey.ATTRIBUTE, key);
}
}

Datei anzeigen

@ -0,0 +1,344 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.block.banner.PatternType;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#BANNER_PATTERN}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class BannerPatternKeys {
/**
* {@code minecraft:base}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> BASE = create(key("base"));
/**
* {@code minecraft:border}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> BORDER = create(key("border"));
/**
* {@code minecraft:bricks}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> BRICKS = create(key("bricks"));
/**
* {@code minecraft:circle}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> CIRCLE = create(key("circle"));
/**
* {@code minecraft:creeper}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> CREEPER = create(key("creeper"));
/**
* {@code minecraft:cross}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> CROSS = create(key("cross"));
/**
* {@code minecraft:curly_border}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> CURLY_BORDER = create(key("curly_border"));
/**
* {@code minecraft:diagonal_left}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> DIAGONAL_LEFT = create(key("diagonal_left"));
/**
* {@code minecraft:diagonal_right}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> DIAGONAL_RIGHT = create(key("diagonal_right"));
/**
* {@code minecraft:diagonal_up_left}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> DIAGONAL_UP_LEFT = create(key("diagonal_up_left"));
/**
* {@code minecraft:diagonal_up_right}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> DIAGONAL_UP_RIGHT = create(key("diagonal_up_right"));
/**
* {@code minecraft:flow}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> FLOW = create(key("flow"));
/**
* {@code minecraft:flower}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> FLOWER = create(key("flower"));
/**
* {@code minecraft:globe}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> GLOBE = create(key("globe"));
/**
* {@code minecraft:gradient}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> GRADIENT = create(key("gradient"));
/**
* {@code minecraft:gradient_up}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> GRADIENT_UP = create(key("gradient_up"));
/**
* {@code minecraft:guster}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> GUSTER = create(key("guster"));
/**
* {@code minecraft:half_horizontal}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> HALF_HORIZONTAL = create(key("half_horizontal"));
/**
* {@code minecraft:half_horizontal_bottom}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> HALF_HORIZONTAL_BOTTOM = create(key("half_horizontal_bottom"));
/**
* {@code minecraft:half_vertical}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> HALF_VERTICAL = create(key("half_vertical"));
/**
* {@code minecraft:half_vertical_right}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> HALF_VERTICAL_RIGHT = create(key("half_vertical_right"));
/**
* {@code minecraft:mojang}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> MOJANG = create(key("mojang"));
/**
* {@code minecraft:piglin}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> PIGLIN = create(key("piglin"));
/**
* {@code minecraft:rhombus}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> RHOMBUS = create(key("rhombus"));
/**
* {@code minecraft:skull}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> SKULL = create(key("skull"));
/**
* {@code minecraft:small_stripes}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> SMALL_STRIPES = create(key("small_stripes"));
/**
* {@code minecraft:square_bottom_left}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> SQUARE_BOTTOM_LEFT = create(key("square_bottom_left"));
/**
* {@code minecraft:square_bottom_right}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> SQUARE_BOTTOM_RIGHT = create(key("square_bottom_right"));
/**
* {@code minecraft:square_top_left}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> SQUARE_TOP_LEFT = create(key("square_top_left"));
/**
* {@code minecraft:square_top_right}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> SQUARE_TOP_RIGHT = create(key("square_top_right"));
/**
* {@code minecraft:straight_cross}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> STRAIGHT_CROSS = create(key("straight_cross"));
/**
* {@code minecraft:stripe_bottom}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> STRIPE_BOTTOM = create(key("stripe_bottom"));
/**
* {@code minecraft:stripe_center}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> STRIPE_CENTER = create(key("stripe_center"));
/**
* {@code minecraft:stripe_downleft}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> STRIPE_DOWNLEFT = create(key("stripe_downleft"));
/**
* {@code minecraft:stripe_downright}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> STRIPE_DOWNRIGHT = create(key("stripe_downright"));
/**
* {@code minecraft:stripe_left}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> STRIPE_LEFT = create(key("stripe_left"));
/**
* {@code minecraft:stripe_middle}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> STRIPE_MIDDLE = create(key("stripe_middle"));
/**
* {@code minecraft:stripe_right}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> STRIPE_RIGHT = create(key("stripe_right"));
/**
* {@code minecraft:stripe_top}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> STRIPE_TOP = create(key("stripe_top"));
/**
* {@code minecraft:triangle_bottom}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> TRIANGLE_BOTTOM = create(key("triangle_bottom"));
/**
* {@code minecraft:triangle_top}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> TRIANGLE_TOP = create(key("triangle_top"));
/**
* {@code minecraft:triangles_bottom}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> TRIANGLES_BOTTOM = create(key("triangles_bottom"));
/**
* {@code minecraft:triangles_top}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<PatternType> TRIANGLES_TOP = create(key("triangles_top"));
private BannerPatternKeys() {
}
/**
* Creates a key for {@link PatternType} in the registry {@code minecraft:banner_pattern}.
*
* @param key the value's key in the registry
* @return a new typed key
*/
@ApiStatus.Experimental
public static TypedKey<PatternType> create(final Key key) {
return TypedKey.create(RegistryKey.BANNER_PATTERN, key);
}
}

Datei anzeigen

@ -6,9 +6,10 @@ import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey; import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.MinecraftExperimental;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#BIOME}. * Vanilla keys for {@link RegistryKey#BIOME}.
@ -23,7 +24,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class BiomeKeys { public final class BiomeKeys {
/** /**
@ -299,6 +301,15 @@ public final class BiomeKeys {
*/ */
public static final TypedKey<Biome> OLD_GROWTH_SPRUCE_TAIGA = create(key("old_growth_spruce_taiga")); public static final TypedKey<Biome> OLD_GROWTH_SPRUCE_TAIGA = create(key("old_growth_spruce_taiga"));
/**
* {@code minecraft:pale_garden}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
@ApiStatus.Experimental
@MinecraftExperimental(MinecraftExperimental.Requires.WINTER_DROP)
public static final TypedKey<Biome> PALE_GARDEN = create(key("pale_garden"));
/** /**
* {@code minecraft:plains} * {@code minecraft:plains}
* *
@ -484,7 +495,7 @@ public final class BiomeKeys {
* @return a new typed key * @return a new typed key
*/ */
@ApiStatus.Experimental @ApiStatus.Experimental
public static @NonNull TypedKey<Biome> create(final @NonNull Key key) { public static TypedKey<Biome> create(final Key key) {
return TypedKey.create(RegistryKey.BIOME, key); return TypedKey.create(RegistryKey.BIOME, key);
} }
} }

Datei anzeigen

@ -0,0 +1,113 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.entity.Cat;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#CAT_VARIANT}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class CatVariantKeys {
/**
* {@code minecraft:all_black}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> ALL_BLACK = create(key("all_black"));
/**
* {@code minecraft:black}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> BLACK = create(key("black"));
/**
* {@code minecraft:british_shorthair}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> BRITISH_SHORTHAIR = create(key("british_shorthair"));
/**
* {@code minecraft:calico}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> CALICO = create(key("calico"));
/**
* {@code minecraft:jellie}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> JELLIE = create(key("jellie"));
/**
* {@code minecraft:persian}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> PERSIAN = create(key("persian"));
/**
* {@code minecraft:ragdoll}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> RAGDOLL = create(key("ragdoll"));
/**
* {@code minecraft:red}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> RED = create(key("red"));
/**
* {@code minecraft:siamese}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> SIAMESE = create(key("siamese"));
/**
* {@code minecraft:tabby}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> TABBY = create(key("tabby"));
/**
* {@code minecraft:white}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Cat.Type> WHITE = create(key("white"));
private CatVariantKeys() {
}
private static TypedKey<Cat.Type> create(final Key key) {
return TypedKey.create(RegistryKey.CAT_VARIANT, key);
}
}

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.damage.DamageType; import org.bukkit.damage.DamageType;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#DAMAGE_TYPE}. * Vanilla keys for {@link RegistryKey#DAMAGE_TYPE}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class DamageTypeKeys { public final class DamageTypeKeys {
/** /**
@ -82,6 +83,13 @@ public final class DamageTypeKeys {
*/ */
public static final TypedKey<DamageType> DRY_OUT = create(key("dry_out")); public static final TypedKey<DamageType> DRY_OUT = create(key("dry_out"));
/**
* {@code minecraft:ender_pearl}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<DamageType> ENDER_PEARL = create(key("ender_pearl"));
/** /**
* {@code minecraft:explosion} * {@code minecraft:explosion}
* *
@ -201,6 +209,13 @@ public final class DamageTypeKeys {
*/ */
public static final TypedKey<DamageType> LIGHTNING_BOLT = create(key("lightning_bolt")); public static final TypedKey<DamageType> LIGHTNING_BOLT = create(key("lightning_bolt"));
/**
* {@code minecraft:mace_smash}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<DamageType> MACE_SMASH = create(key("mace_smash"));
/** /**
* {@code minecraft:magic} * {@code minecraft:magic}
* *
@ -365,7 +380,7 @@ public final class DamageTypeKeys {
* @return a new typed key * @return a new typed key
*/ */
@ApiStatus.Experimental @ApiStatus.Experimental
public static @NonNull TypedKey<DamageType> create(final @NonNull Key key) { public static TypedKey<DamageType> create(final Key key) {
return TypedKey.create(RegistryKey.DAMAGE_TYPE, key); return TypedKey.create(RegistryKey.DAMAGE_TYPE, key);
} }
} }

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#ENCHANTMENT}. * Vanilla keys for {@link RegistryKey#ENCHANTMENT}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class EnchantmentKeys { public final class EnchantmentKeys {
/** /**
@ -323,7 +324,14 @@ public final class EnchantmentKeys {
private EnchantmentKeys() { private EnchantmentKeys() {
} }
private static @NonNull TypedKey<Enchantment> create(final @NonNull Key key) { /**
* Creates a key for {@link Enchantment} in the registry {@code minecraft:enchantment}.
*
* @param key the value's key in the registry
* @return a new typed key
*/
@ApiStatus.Experimental
public static TypedKey<Enchantment> create(final Key key) {
return TypedKey.create(RegistryKey.ENCHANTMENT, key); return TypedKey.create(RegistryKey.ENCHANTMENT, key);
} }
} }

Datei anzeigen

@ -0,0 +1,71 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.Fluid;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#FLUID}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class FluidKeys {
/**
* {@code minecraft:empty}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Fluid> EMPTY = create(key("empty"));
/**
* {@code minecraft:flowing_lava}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Fluid> FLOWING_LAVA = create(key("flowing_lava"));
/**
* {@code minecraft:flowing_water}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Fluid> FLOWING_WATER = create(key("flowing_water"));
/**
* {@code minecraft:lava}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Fluid> LAVA = create(key("lava"));
/**
* {@code minecraft:water}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Fluid> WATER = create(key("water"));
private FluidKeys() {
}
private static TypedKey<Fluid> create(final Key key) {
return TypedKey.create(RegistryKey.FLUID, key);
}
}

Datei anzeigen

@ -0,0 +1,57 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.entity.Frog;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#FROG_VARIANT}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class FrogVariantKeys {
/**
* {@code minecraft:cold}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Frog.Variant> COLD = create(key("cold"));
/**
* {@code minecraft:temperate}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Frog.Variant> TEMPERATE = create(key("temperate"));
/**
* {@code minecraft:warm}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Frog.Variant> WARM = create(key("warm"));
private FrogVariantKeys() {
}
private static TypedKey<Frog.Variant> create(final Key key) {
return TypedKey.create(RegistryKey.FROG_VARIANT, key);
}
}

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.GameEvent; import org.bukkit.GameEvent;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#GAME_EVENT}. * Vanilla keys for {@link RegistryKey#GAME_EVENT}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class GameEventKeys { public final class GameEventKeys {
/** /**
@ -449,7 +450,14 @@ public final class GameEventKeys {
private GameEventKeys() { private GameEventKeys() {
} }
private static @NonNull TypedKey<GameEvent> create(final @NonNull Key key) { /**
* Creates a key for {@link GameEvent} in the registry {@code minecraft:game_event}.
*
* @param key the value's key in the registry
* @return a new typed key
*/
@ApiStatus.Experimental
public static TypedKey<GameEvent> create(final Key key) {
return TypedKey.create(RegistryKey.GAME_EVENT, key); return TypedKey.create(RegistryKey.GAME_EVENT, key);
} }
} }

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.MusicInstrument; import org.bukkit.MusicInstrument;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#INSTRUMENT}. * Vanilla keys for {@link RegistryKey#INSTRUMENT}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class InstrumentKeys { public final class InstrumentKeys {
/** /**
@ -85,7 +86,14 @@ public final class InstrumentKeys {
private InstrumentKeys() { private InstrumentKeys() {
} }
private static @NonNull TypedKey<MusicInstrument> create(final @NonNull Key key) { /**
* Creates a key for {@link MusicInstrument} in the registry {@code minecraft:instrument}.
*
* @param key the value's key in the registry
* @return a new typed key
*/
@ApiStatus.Experimental
public static TypedKey<MusicInstrument> create(final Key key) {
return TypedKey.create(RegistryKey.INSTRUMENT, key); return TypedKey.create(RegistryKey.INSTRUMENT, key);
} }
} }

Datei anzeigen

@ -0,0 +1,176 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.JukeboxSong;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#JUKEBOX_SONG}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class JukeboxSongKeys {
/**
* {@code minecraft:11}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> ELEVEN = create(key("11"));
/**
* {@code minecraft:13}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> THIRTEEN = create(key("13"));
/**
* {@code minecraft:5}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> FIVE = create(key("5"));
/**
* {@code minecraft:blocks}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> BLOCKS = create(key("blocks"));
/**
* {@code minecraft:cat}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> CAT = create(key("cat"));
/**
* {@code minecraft:chirp}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> CHIRP = create(key("chirp"));
/**
* {@code minecraft:creator}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> CREATOR = create(key("creator"));
/**
* {@code minecraft:creator_music_box}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> CREATOR_MUSIC_BOX = create(key("creator_music_box"));
/**
* {@code minecraft:far}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> FAR = create(key("far"));
/**
* {@code minecraft:mall}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> MALL = create(key("mall"));
/**
* {@code minecraft:mellohi}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> MELLOHI = create(key("mellohi"));
/**
* {@code minecraft:otherside}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> OTHERSIDE = create(key("otherside"));
/**
* {@code minecraft:pigstep}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> PIGSTEP = create(key("pigstep"));
/**
* {@code minecraft:precipice}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> PRECIPICE = create(key("precipice"));
/**
* {@code minecraft:relic}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> RELIC = create(key("relic"));
/**
* {@code minecraft:stal}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> STAL = create(key("stal"));
/**
* {@code minecraft:strad}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> STRAD = create(key("strad"));
/**
* {@code minecraft:wait}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> WAIT = create(key("wait"));
/**
* {@code minecraft:ward}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<JukeboxSong> WARD = create(key("ward"));
private JukeboxSongKeys() {
}
/**
* Creates a key for {@link JukeboxSong} in the registry {@code minecraft:jukebox_song}.
*
* @param key the value's key in the registry
* @return a new typed key
*/
@ApiStatus.Experimental
public static TypedKey<JukeboxSong> create(final Key key) {
return TypedKey.create(RegistryKey.JUKEBOX_SONG, key);
}
}

Datei anzeigen

@ -0,0 +1,281 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.map.MapCursor;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#MAP_DECORATION_TYPE}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class MapDecorationTypeKeys {
/**
* {@code minecraft:banner_black}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_BLACK = create(key("banner_black"));
/**
* {@code minecraft:banner_blue}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_BLUE = create(key("banner_blue"));
/**
* {@code minecraft:banner_brown}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_BROWN = create(key("banner_brown"));
/**
* {@code minecraft:banner_cyan}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_CYAN = create(key("banner_cyan"));
/**
* {@code minecraft:banner_gray}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_GRAY = create(key("banner_gray"));
/**
* {@code minecraft:banner_green}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_GREEN = create(key("banner_green"));
/**
* {@code minecraft:banner_light_blue}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_LIGHT_BLUE = create(key("banner_light_blue"));
/**
* {@code minecraft:banner_light_gray}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_LIGHT_GRAY = create(key("banner_light_gray"));
/**
* {@code minecraft:banner_lime}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_LIME = create(key("banner_lime"));
/**
* {@code minecraft:banner_magenta}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_MAGENTA = create(key("banner_magenta"));
/**
* {@code minecraft:banner_orange}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_ORANGE = create(key("banner_orange"));
/**
* {@code minecraft:banner_pink}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_PINK = create(key("banner_pink"));
/**
* {@code minecraft:banner_purple}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_PURPLE = create(key("banner_purple"));
/**
* {@code minecraft:banner_red}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_RED = create(key("banner_red"));
/**
* {@code minecraft:banner_white}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_WHITE = create(key("banner_white"));
/**
* {@code minecraft:banner_yellow}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BANNER_YELLOW = create(key("banner_yellow"));
/**
* {@code minecraft:blue_marker}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> BLUE_MARKER = create(key("blue_marker"));
/**
* {@code minecraft:frame}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> FRAME = create(key("frame"));
/**
* {@code minecraft:jungle_temple}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> JUNGLE_TEMPLE = create(key("jungle_temple"));
/**
* {@code minecraft:mansion}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> MANSION = create(key("mansion"));
/**
* {@code minecraft:monument}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> MONUMENT = create(key("monument"));
/**
* {@code minecraft:player}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> PLAYER = create(key("player"));
/**
* {@code minecraft:player_off_limits}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> PLAYER_OFF_LIMITS = create(key("player_off_limits"));
/**
* {@code minecraft:player_off_map}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> PLAYER_OFF_MAP = create(key("player_off_map"));
/**
* {@code minecraft:red_marker}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> RED_MARKER = create(key("red_marker"));
/**
* {@code minecraft:red_x}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> RED_X = create(key("red_x"));
/**
* {@code minecraft:swamp_hut}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> SWAMP_HUT = create(key("swamp_hut"));
/**
* {@code minecraft:target_point}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> TARGET_POINT = create(key("target_point"));
/**
* {@code minecraft:target_x}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> TARGET_X = create(key("target_x"));
/**
* {@code minecraft:trial_chambers}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> TRIAL_CHAMBERS = create(key("trial_chambers"));
/**
* {@code minecraft:village_desert}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> VILLAGE_DESERT = create(key("village_desert"));
/**
* {@code minecraft:village_plains}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> VILLAGE_PLAINS = create(key("village_plains"));
/**
* {@code minecraft:village_savanna}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> VILLAGE_SAVANNA = create(key("village_savanna"));
/**
* {@code minecraft:village_snowy}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> VILLAGE_SNOWY = create(key("village_snowy"));
/**
* {@code minecraft:village_taiga}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MapCursor.Type> VILLAGE_TAIGA = create(key("village_taiga"));
private MapDecorationTypeKeys() {
}
private static TypedKey<MapCursor.Type> create(final Key key) {
return TypedKey.create(RegistryKey.MAP_DECORATION_TYPE, key);
}
}

Datei anzeigen

@ -0,0 +1,211 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.inventory.MenuType;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#MENU}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class MenuTypeKeys {
/**
* {@code minecraft:anvil}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> ANVIL = create(key("anvil"));
/**
* {@code minecraft:beacon}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> BEACON = create(key("beacon"));
/**
* {@code minecraft:blast_furnace}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> BLAST_FURNACE = create(key("blast_furnace"));
/**
* {@code minecraft:brewing_stand}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> BREWING_STAND = create(key("brewing_stand"));
/**
* {@code minecraft:cartography_table}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> CARTOGRAPHY_TABLE = create(key("cartography_table"));
/**
* {@code minecraft:crafter_3x3}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> CRAFTER_3X3 = create(key("crafter_3x3"));
/**
* {@code minecraft:crafting}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> CRAFTING = create(key("crafting"));
/**
* {@code minecraft:enchantment}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> ENCHANTMENT = create(key("enchantment"));
/**
* {@code minecraft:furnace}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> FURNACE = create(key("furnace"));
/**
* {@code minecraft:generic_3x3}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> GENERIC_3X3 = create(key("generic_3x3"));
/**
* {@code minecraft:generic_9x1}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> GENERIC_9X1 = create(key("generic_9x1"));
/**
* {@code minecraft:generic_9x2}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> GENERIC_9X2 = create(key("generic_9x2"));
/**
* {@code minecraft:generic_9x3}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> GENERIC_9X3 = create(key("generic_9x3"));
/**
* {@code minecraft:generic_9x4}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> GENERIC_9X4 = create(key("generic_9x4"));
/**
* {@code minecraft:generic_9x5}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> GENERIC_9X5 = create(key("generic_9x5"));
/**
* {@code minecraft:generic_9x6}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> GENERIC_9X6 = create(key("generic_9x6"));
/**
* {@code minecraft:grindstone}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> GRINDSTONE = create(key("grindstone"));
/**
* {@code minecraft:hopper}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> HOPPER = create(key("hopper"));
/**
* {@code minecraft:lectern}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> LECTERN = create(key("lectern"));
/**
* {@code minecraft:loom}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> LOOM = create(key("loom"));
/**
* {@code minecraft:merchant}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> MERCHANT = create(key("merchant"));
/**
* {@code minecraft:shulker_box}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> SHULKER_BOX = create(key("shulker_box"));
/**
* {@code minecraft:smithing}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> SMITHING = create(key("smithing"));
/**
* {@code minecraft:smoker}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> SMOKER = create(key("smoker"));
/**
* {@code minecraft:stonecutter}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<MenuType> STONECUTTER = create(key("stonecutter"));
private MenuTypeKeys() {
}
private static TypedKey<MenuType> create(final Key key) {
return TypedKey.create(RegistryKey.MENU, key);
}
}

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#MOB_EFFECT}. * Vanilla keys for {@link RegistryKey#MOB_EFFECT}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class MobEffectKeys { public final class MobEffectKeys {
/** /**
@ -302,7 +303,7 @@ public final class MobEffectKeys {
private MobEffectKeys() { private MobEffectKeys() {
} }
private static @NonNull TypedKey<PotionEffectType> create(final @NonNull Key key) { private static TypedKey<PotionEffectType> create(final Key key) {
return TypedKey.create(RegistryKey.MOB_EFFECT, key); return TypedKey.create(RegistryKey.MOB_EFFECT, key);
} }
} }

Datei anzeigen

@ -0,0 +1,393 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.Art;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#PAINTING_VARIANT}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class PaintingVariantKeys {
/**
* {@code minecraft:alban}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> ALBAN = create(key("alban"));
/**
* {@code minecraft:aztec}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> AZTEC = create(key("aztec"));
/**
* {@code minecraft:aztec2}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> AZTEC2 = create(key("aztec2"));
/**
* {@code minecraft:backyard}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> BACKYARD = create(key("backyard"));
/**
* {@code minecraft:baroque}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> BAROQUE = create(key("baroque"));
/**
* {@code minecraft:bomb}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> BOMB = create(key("bomb"));
/**
* {@code minecraft:bouquet}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> BOUQUET = create(key("bouquet"));
/**
* {@code minecraft:burning_skull}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> BURNING_SKULL = create(key("burning_skull"));
/**
* {@code minecraft:bust}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> BUST = create(key("bust"));
/**
* {@code minecraft:cavebird}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> CAVEBIRD = create(key("cavebird"));
/**
* {@code minecraft:changing}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> CHANGING = create(key("changing"));
/**
* {@code minecraft:cotan}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> COTAN = create(key("cotan"));
/**
* {@code minecraft:courbet}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> COURBET = create(key("courbet"));
/**
* {@code minecraft:creebet}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> CREEBET = create(key("creebet"));
/**
* {@code minecraft:donkey_kong}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> DONKEY_KONG = create(key("donkey_kong"));
/**
* {@code minecraft:earth}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> EARTH = create(key("earth"));
/**
* {@code minecraft:endboss}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> ENDBOSS = create(key("endboss"));
/**
* {@code minecraft:fern}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> FERN = create(key("fern"));
/**
* {@code minecraft:fighters}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> FIGHTERS = create(key("fighters"));
/**
* {@code minecraft:finding}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> FINDING = create(key("finding"));
/**
* {@code minecraft:fire}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> FIRE = create(key("fire"));
/**
* {@code minecraft:graham}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> GRAHAM = create(key("graham"));
/**
* {@code minecraft:humble}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> HUMBLE = create(key("humble"));
/**
* {@code minecraft:kebab}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> KEBAB = create(key("kebab"));
/**
* {@code minecraft:lowmist}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> LOWMIST = create(key("lowmist"));
/**
* {@code minecraft:match}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> MATCH = create(key("match"));
/**
* {@code minecraft:meditative}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> MEDITATIVE = create(key("meditative"));
/**
* {@code minecraft:orb}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> ORB = create(key("orb"));
/**
* {@code minecraft:owlemons}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> OWLEMONS = create(key("owlemons"));
/**
* {@code minecraft:passage}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> PASSAGE = create(key("passage"));
/**
* {@code minecraft:pigscene}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> PIGSCENE = create(key("pigscene"));
/**
* {@code minecraft:plant}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> PLANT = create(key("plant"));
/**
* {@code minecraft:pointer}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> POINTER = create(key("pointer"));
/**
* {@code minecraft:pond}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> POND = create(key("pond"));
/**
* {@code minecraft:pool}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> POOL = create(key("pool"));
/**
* {@code minecraft:prairie_ride}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> PRAIRIE_RIDE = create(key("prairie_ride"));
/**
* {@code minecraft:sea}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> SEA = create(key("sea"));
/**
* {@code minecraft:skeleton}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> SKELETON = create(key("skeleton"));
/**
* {@code minecraft:skull_and_roses}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> SKULL_AND_ROSES = create(key("skull_and_roses"));
/**
* {@code minecraft:stage}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> STAGE = create(key("stage"));
/**
* {@code minecraft:sunflowers}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> SUNFLOWERS = create(key("sunflowers"));
/**
* {@code minecraft:sunset}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> SUNSET = create(key("sunset"));
/**
* {@code minecraft:tides}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> TIDES = create(key("tides"));
/**
* {@code minecraft:unpacked}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> UNPACKED = create(key("unpacked"));
/**
* {@code minecraft:void}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> VOID = create(key("void"));
/**
* {@code minecraft:wanderer}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> WANDERER = create(key("wanderer"));
/**
* {@code minecraft:wasteland}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> WASTELAND = create(key("wasteland"));
/**
* {@code minecraft:water}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> WATER = create(key("water"));
/**
* {@code minecraft:wind}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> WIND = create(key("wind"));
/**
* {@code minecraft:wither}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Art> WITHER = create(key("wither"));
private PaintingVariantKeys() {
}
/**
* Creates a key for {@link Art} in the registry {@code minecraft:painting_variant}.
*
* @param key the value's key in the registry
* @return a new typed key
*/
@ApiStatus.Experimental
public static TypedKey<Art> create(final Key key) {
return TypedKey.create(RegistryKey.PAINTING_VARIANT, key);
}
}

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.generator.structure.Structure; import org.bukkit.generator.structure.Structure;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#STRUCTURE}. * Vanilla keys for {@link RegistryKey#STRUCTURE}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class StructureKeys { public final class StructureKeys {
/** /**
@ -274,7 +275,7 @@ public final class StructureKeys {
* @return a new typed key * @return a new typed key
*/ */
@ApiStatus.Experimental @ApiStatus.Experimental
public static @NonNull TypedKey<Structure> create(final @NonNull Key key) { public static TypedKey<Structure> create(final Key key) {
return TypedKey.create(RegistryKey.STRUCTURE, key); return TypedKey.create(RegistryKey.STRUCTURE, key);
} }
} }

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.generator.structure.StructureType; import org.bukkit.generator.structure.StructureType;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#STRUCTURE_TYPE}. * Vanilla keys for {@link RegistryKey#STRUCTURE_TYPE}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class StructureTypeKeys { public final class StructureTypeKeys {
/** /**
@ -141,7 +142,7 @@ public final class StructureTypeKeys {
private StructureTypeKeys() { private StructureTypeKeys() {
} }
private static @NonNull TypedKey<StructureType> create(final @NonNull Key key) { private static TypedKey<StructureType> create(final Key key) {
return TypedKey.create(RegistryKey.STRUCTURE_TYPE, key); return TypedKey.create(RegistryKey.STRUCTURE_TYPE, key);
} }
} }

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.inventory.meta.trim.TrimMaterial; import org.bukkit.inventory.meta.trim.TrimMaterial;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#TRIM_MATERIAL}. * Vanilla keys for {@link RegistryKey#TRIM_MATERIAL}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class TrimMaterialKeys { public final class TrimMaterialKeys {
/** /**
@ -106,7 +107,7 @@ public final class TrimMaterialKeys {
* @return a new typed key * @return a new typed key
*/ */
@ApiStatus.Experimental @ApiStatus.Experimental
public static @NonNull TypedKey<TrimMaterial> create(final @NonNull Key key) { public static TypedKey<TrimMaterial> create(final Key key) {
return TypedKey.create(RegistryKey.TRIM_MATERIAL, key); return TypedKey.create(RegistryKey.TRIM_MATERIAL, key);
} }
} }

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.inventory.meta.trim.TrimPattern; import org.bukkit.inventory.meta.trim.TrimPattern;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#TRIM_PATTERN}. * Vanilla keys for {@link RegistryKey#TRIM_PATTERN}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class TrimPatternKeys { public final class TrimPatternKeys {
/** /**
@ -162,7 +163,7 @@ public final class TrimPatternKeys {
* @return a new typed key * @return a new typed key
*/ */
@ApiStatus.Experimental @ApiStatus.Experimental
public static @NonNull TypedKey<TrimPattern> create(final @NonNull Key key) { public static TypedKey<TrimPattern> create(final Key key) {
return TypedKey.create(RegistryKey.TRIM_PATTERN, key); return TypedKey.create(RegistryKey.TRIM_PATTERN, key);
} }
} }

Datei anzeigen

@ -0,0 +1,141 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.entity.Villager;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#VILLAGER_PROFESSION}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class VillagerProfessionKeys {
/**
* {@code minecraft:armorer}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> ARMORER = create(key("armorer"));
/**
* {@code minecraft:butcher}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> BUTCHER = create(key("butcher"));
/**
* {@code minecraft:cartographer}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> CARTOGRAPHER = create(key("cartographer"));
/**
* {@code minecraft:cleric}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> CLERIC = create(key("cleric"));
/**
* {@code minecraft:farmer}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> FARMER = create(key("farmer"));
/**
* {@code minecraft:fisherman}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> FISHERMAN = create(key("fisherman"));
/**
* {@code minecraft:fletcher}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> FLETCHER = create(key("fletcher"));
/**
* {@code minecraft:leatherworker}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> LEATHERWORKER = create(key("leatherworker"));
/**
* {@code minecraft:librarian}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> LIBRARIAN = create(key("librarian"));
/**
* {@code minecraft:mason}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> MASON = create(key("mason"));
/**
* {@code minecraft:nitwit}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> NITWIT = create(key("nitwit"));
/**
* {@code minecraft:none}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> NONE = create(key("none"));
/**
* {@code minecraft:shepherd}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> SHEPHERD = create(key("shepherd"));
/**
* {@code minecraft:toolsmith}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> TOOLSMITH = create(key("toolsmith"));
/**
* {@code minecraft:weaponsmith}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Profession> WEAPONSMITH = create(key("weaponsmith"));
private VillagerProfessionKeys() {
}
private static TypedKey<Villager.Profession> create(final Key key) {
return TypedKey.create(RegistryKey.VILLAGER_PROFESSION, key);
}
}

Datei anzeigen

@ -0,0 +1,85 @@
package io.papermc.paper.registry.keys;
import static net.kyori.adventure.key.Key.key;
import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key;
import org.bukkit.entity.Villager;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Vanilla keys for {@link RegistryKey#VILLAGER_TYPE}.
*
* @apiNote The fields provided here are a direct representation of
* what is available from the vanilla game source. They may be
* changed (including removals) on any Minecraft version
* bump, so cross-version compatibility is not provided on the
* same level as it is on most of the other API.
*/
@SuppressWarnings({
"unused",
"SpellCheckingInspection"
})
@GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental
public final class VillagerTypeKeys {
/**
* {@code minecraft:desert}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Type> DESERT = create(key("desert"));
/**
* {@code minecraft:jungle}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Type> JUNGLE = create(key("jungle"));
/**
* {@code minecraft:plains}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Type> PLAINS = create(key("plains"));
/**
* {@code minecraft:savanna}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Type> SAVANNA = create(key("savanna"));
/**
* {@code minecraft:snow}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Type> SNOW = create(key("snow"));
/**
* {@code minecraft:swamp}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Type> SWAMP = create(key("swamp"));
/**
* {@code minecraft:taiga}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TypedKey<Villager.Type> TAIGA = create(key("taiga"));
private VillagerTypeKeys() {
}
private static TypedKey<Villager.Type> create(final Key key) {
return TypedKey.create(RegistryKey.VILLAGER_TYPE, key);
}
}

Datei anzeigen

@ -7,8 +7,8 @@ import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.TypedKey; import io.papermc.paper.registry.TypedKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.entity.Wolf; import org.bukkit.entity.Wolf;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#WOLF_VARIANT}. * Vanilla keys for {@link RegistryKey#WOLF_VARIANT}.
@ -23,7 +23,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class WolfVariantKeys { public final class WolfVariantKeys {
/** /**
@ -99,7 +100,7 @@ public final class WolfVariantKeys {
* @return a new typed key * @return a new typed key
*/ */
@ApiStatus.Experimental @ApiStatus.Experimental
public static @NonNull TypedKey<Wolf.Variant> create(final @NonNull Key key) { public static TypedKey<Wolf.Variant> create(final Key key) {
return TypedKey.create(RegistryKey.WOLF_VARIANT, key); return TypedKey.create(RegistryKey.WOLF_VARIANT, key);
} }
} }

Datei anzeigen

@ -8,8 +8,8 @@ import io.papermc.paper.registry.tag.TagKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.MinecraftExperimental; import org.bukkit.MinecraftExperimental;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#ENCHANTMENT}. * Vanilla keys for {@link RegistryKey#ENCHANTMENT}.
@ -24,7 +24,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class EnchantmentTagKeys { public final class EnchantmentTagKeys {
/** /**
@ -317,7 +318,7 @@ public final class EnchantmentTagKeys {
* @return a new tag key * @return a new tag key
*/ */
@ApiStatus.Experimental @ApiStatus.Experimental
public static @NonNull TagKey<Enchantment> create(final @NonNull Key key) { public static TagKey<Enchantment> create(final Key key) {
return TagKey.create(RegistryKey.ENCHANTMENT, key); return TagKey.create(RegistryKey.ENCHANTMENT, key);
} }
} }

Datei anzeigen

@ -6,9 +6,10 @@ import io.papermc.paper.generated.GeneratedFrom;
import io.papermc.paper.registry.RegistryKey; import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.tag.TagKey; import io.papermc.paper.registry.tag.TagKey;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.bukkit.MinecraftExperimental;
import org.bukkit.inventory.ItemType; import org.bukkit.inventory.ItemType;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/** /**
* Vanilla keys for {@link RegistryKey#ITEM}. * Vanilla keys for {@link RegistryKey#ITEM}.
@ -23,7 +24,8 @@ import org.jetbrains.annotations.ApiStatus;
"unused", "unused",
"SpellCheckingInspection" "SpellCheckingInspection"
}) })
@GeneratedFrom("1.21.1") @GeneratedFrom("1.21.3")
@NullMarked
@ApiStatus.Experimental @ApiStatus.Experimental
public final class ItemTypeTagKeys { public final class ItemTypeTagKeys {
/** /**
@ -131,6 +133,20 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> BREAKS_DECORATED_POTS = create(key("breaks_decorated_pots")); public static final TagKey<ItemType> BREAKS_DECORATED_POTS = create(key("breaks_decorated_pots"));
/**
* {@code #minecraft:brewing_fuel}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> BREWING_FUEL = create(key("brewing_fuel"));
/**
* {@code #minecraft:bundles}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> BUNDLES = create(key("bundles"));
/** /**
* {@code #minecraft:buttons} * {@code #minecraft:buttons}
* *
@ -292,6 +308,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> DIAMOND_ORES = create(key("diamond_ores")); public static final TagKey<ItemType> DIAMOND_ORES = create(key("diamond_ores"));
/**
* {@code #minecraft:diamond_tool_materials}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> DIAMOND_TOOL_MATERIALS = create(key("diamond_tool_materials"));
/** /**
* {@code #minecraft:dirt} * {@code #minecraft:dirt}
* *
@ -306,6 +329,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> DOORS = create(key("doors")); public static final TagKey<ItemType> DOORS = create(key("doors"));
/**
* {@code #minecraft:duplicates_allays}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> DUPLICATES_ALLAYS = create(key("duplicates_allays"));
/** /**
* {@code #minecraft:dyeable} * {@code #minecraft:dyeable}
* *
@ -509,6 +539,20 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> FROG_FOOD = create(key("frog_food")); public static final TagKey<ItemType> FROG_FOOD = create(key("frog_food"));
/**
* {@code #minecraft:furnace_minecart_fuel}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> FURNACE_MINECART_FUEL = create(key("furnace_minecart_fuel"));
/**
* {@code #minecraft:gaze_disguise_equipment}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> GAZE_DISGUISE_EQUIPMENT = create(key("gaze_disguise_equipment"));
/** /**
* {@code #minecraft:goat_food} * {@code #minecraft:goat_food}
* *
@ -523,6 +567,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> GOLD_ORES = create(key("gold_ores")); public static final TagKey<ItemType> GOLD_ORES = create(key("gold_ores"));
/**
* {@code #minecraft:gold_tool_materials}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> GOLD_TOOL_MATERIALS = create(key("gold_tool_materials"));
/** /**
* {@code #minecraft:hanging_signs} * {@code #minecraft:hanging_signs}
* *
@ -579,6 +630,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> IRON_ORES = create(key("iron_ores")); public static final TagKey<ItemType> IRON_ORES = create(key("iron_ores"));
/**
* {@code #minecraft:iron_tool_materials}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> IRON_TOOL_MATERIALS = create(key("iron_tool_materials"));
/** /**
* {@code #minecraft:jungle_logs} * {@code #minecraft:jungle_logs}
* *
@ -649,6 +707,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> MANGROVE_LOGS = create(key("mangrove_logs")); public static final TagKey<ItemType> MANGROVE_LOGS = create(key("mangrove_logs"));
/**
* {@code #minecraft:map_invisibility_equipment}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> MAP_INVISIBILITY_EQUIPMENT = create(key("map_invisibility_equipment"));
/** /**
* {@code #minecraft:meat} * {@code #minecraft:meat}
* *
@ -656,6 +721,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> MEAT = create(key("meat")); public static final TagKey<ItemType> MEAT = create(key("meat"));
/**
* {@code #minecraft:netherite_tool_materials}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> NETHERITE_TOOL_MATERIALS = create(key("netherite_tool_materials"));
/** /**
* {@code #minecraft:non_flammable_wood} * {@code #minecraft:non_flammable_wood}
* *
@ -684,6 +756,22 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> OCELOT_FOOD = create(key("ocelot_food")); public static final TagKey<ItemType> OCELOT_FOOD = create(key("ocelot_food"));
/**
* {@code #minecraft:pale_oak_logs}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
@ApiStatus.Experimental
@MinecraftExperimental(MinecraftExperimental.Requires.WINTER_DROP)
public static final TagKey<ItemType> PALE_OAK_LOGS = create(key("pale_oak_logs"));
/**
* {@code #minecraft:panda_eats_from_ground}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> PANDA_EATS_FROM_GROUND = create(key("panda_eats_from_ground"));
/** /**
* {@code #minecraft:panda_food} * {@code #minecraft:panda_food}
* *
@ -740,6 +828,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> PIGLIN_REPELLENTS = create(key("piglin_repellents")); public static final TagKey<ItemType> PIGLIN_REPELLENTS = create(key("piglin_repellents"));
/**
* {@code #minecraft:piglin_safe_armor}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> PIGLIN_SAFE_ARMOR = create(key("piglin_safe_armor"));
/** /**
* {@code #minecraft:planks} * {@code #minecraft:planks}
* *
@ -768,6 +863,62 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> REDSTONE_ORES = create(key("redstone_ores")); public static final TagKey<ItemType> REDSTONE_ORES = create(key("redstone_ores"));
/**
* {@code #minecraft:repairs_chain_armor}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> REPAIRS_CHAIN_ARMOR = create(key("repairs_chain_armor"));
/**
* {@code #minecraft:repairs_diamond_armor}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> REPAIRS_DIAMOND_ARMOR = create(key("repairs_diamond_armor"));
/**
* {@code #minecraft:repairs_gold_armor}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> REPAIRS_GOLD_ARMOR = create(key("repairs_gold_armor"));
/**
* {@code #minecraft:repairs_iron_armor}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> REPAIRS_IRON_ARMOR = create(key("repairs_iron_armor"));
/**
* {@code #minecraft:repairs_leather_armor}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> REPAIRS_LEATHER_ARMOR = create(key("repairs_leather_armor"));
/**
* {@code #minecraft:repairs_netherite_armor}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> REPAIRS_NETHERITE_ARMOR = create(key("repairs_netherite_armor"));
/**
* {@code #minecraft:repairs_turtle_helmet}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> REPAIRS_TURTLE_HELMET = create(key("repairs_turtle_helmet"));
/**
* {@code #minecraft:repairs_wolf_armor}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> REPAIRS_WOLF_ARMOR = create(key("repairs_wolf_armor"));
/** /**
* {@code #minecraft:sand} * {@code #minecraft:sand}
* *
@ -796,6 +947,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> SHOVELS = create(key("shovels")); public static final TagKey<ItemType> SHOVELS = create(key("shovels"));
/**
* {@code #minecraft:shulker_boxes}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> SHULKER_BOXES = create(key("shulker_boxes"));
/** /**
* {@code #minecraft:signs} * {@code #minecraft:signs}
* *
@ -957,6 +1115,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> TURTLE_FOOD = create(key("turtle_food")); public static final TagKey<ItemType> TURTLE_FOOD = create(key("turtle_food"));
/**
* {@code #minecraft:villager_picks_up}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> VILLAGER_PICKS_UP = create(key("villager_picks_up"));
/** /**
* {@code #minecraft:villager_plantable_seeds} * {@code #minecraft:villager_plantable_seeds}
* *
@ -1034,6 +1199,13 @@ public final class ItemTypeTagKeys {
*/ */
public static final TagKey<ItemType> WOODEN_STAIRS = create(key("wooden_stairs")); public static final TagKey<ItemType> WOODEN_STAIRS = create(key("wooden_stairs"));
/**
* {@code #minecraft:wooden_tool_materials}
*
* @apiNote This field is version-dependant and may be removed in future Minecraft versions
*/
public static final TagKey<ItemType> WOODEN_TOOL_MATERIALS = create(key("wooden_tool_materials"));
/** /**
* {@code #minecraft:wooden_trapdoors} * {@code #minecraft:wooden_trapdoors}
* *
@ -1065,7 +1237,7 @@ public final class ItemTypeTagKeys {
* @return a new tag key * @return a new tag key
*/ */
@ApiStatus.Experimental @ApiStatus.Experimental
public static @NonNull TagKey<ItemType> create(final @NonNull Key key) { public static TagKey<ItemType> create(final Key key) {
return TagKey.create(RegistryKey.ITEM, key); return TagKey.create(RegistryKey.ITEM, key);
} }
} }

Datei anzeigen

@ -8,35 +8,64 @@ import io.papermc.paper.registry.RegistryKey;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import org.bukkit.Art;
import org.bukkit.Fluid;
import org.bukkit.GameEvent; import org.bukkit.GameEvent;
import org.bukkit.JukeboxSong;
import org.bukkit.MusicInstrument; import org.bukkit.MusicInstrument;
import org.bukkit.Sound;
import org.bukkit.attribute.Attribute;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.BlockType;
import org.bukkit.block.banner.PatternType;
import org.bukkit.damage.DamageType; import org.bukkit.damage.DamageType;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Cat;
import org.bukkit.entity.Frog;
import org.bukkit.entity.Villager;
import org.bukkit.entity.Wolf; import org.bukkit.entity.Wolf;
import org.bukkit.generator.structure.Structure; import org.bukkit.generator.structure.Structure;
import org.bukkit.generator.structure.StructureType; import org.bukkit.generator.structure.StructureType;
import org.bukkit.inventory.ItemType; import org.bukkit.inventory.ItemType;
import org.bukkit.inventory.MenuType;
import org.bukkit.inventory.meta.trim.TrimMaterial; import org.bukkit.inventory.meta.trim.TrimMaterial;
import org.bukkit.inventory.meta.trim.TrimPattern; import org.bukkit.inventory.meta.trim.TrimPattern;
import org.bukkit.map.MapCursor;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
public interface Generators { public interface Generators {
SourceGenerator[] API = { SourceGenerator[] API = {
simpleKey("GameEventKeys", GameEvent.class, Registries.GAME_EVENT, RegistryKey.GAME_EVENT, false), // built-ins
simpleKey("GameEventKeys", GameEvent.class, Registries.GAME_EVENT, RegistryKey.GAME_EVENT, true),
simpleKey("StructureTypeKeys", StructureType.class, Registries.STRUCTURE_TYPE, RegistryKey.STRUCTURE_TYPE, false),
simpleKey("MobEffectKeys", PotionEffectType.class, Registries.MOB_EFFECT, RegistryKey.MOB_EFFECT, false),
simpleKey("BlockTypeKeys", BlockType.class, Registries.BLOCK, RegistryKey.BLOCK, false),
simpleKey("ItemTypeKeys", ItemType.class, Registries.ITEM, RegistryKey.ITEM, false),
simpleKey("CatVariantKeys", Cat.Type.class, Registries.CAT_VARIANT, RegistryKey.CAT_VARIANT, false),
simpleKey("FrogVariantKeys", Frog.Variant.class, Registries.FROG_VARIANT, RegistryKey.FROG_VARIANT, false),
simpleKey("VillagerProfessionKeys", Villager.Profession.class, Registries.VILLAGER_PROFESSION, RegistryKey.VILLAGER_PROFESSION, false),
simpleKey("VillagerTypeKeys", Villager.Type.class, Registries.VILLAGER_TYPE, RegistryKey.VILLAGER_TYPE, false),
simpleKey("MapDecorationTypeKeys", MapCursor.Type.class, Registries.MAP_DECORATION_TYPE, RegistryKey.MAP_DECORATION_TYPE, false),
simpleKey("MenuTypeKeys", MenuType.class, Registries.MENU, RegistryKey.MENU, false),
simpleKey("AttributeKeys", Attribute.class, Registries.ATTRIBUTE, RegistryKey.ATTRIBUTE, false),
simpleKey("FluidKeys", Fluid.class, Registries.FLUID, RegistryKey.FLUID, false),
simpleKey("SoundEventKeys", Sound.class, Registries.SOUND_EVENT, RegistryKey.SOUND_EVENT, false),
// data-driven
simpleKey("BiomeKeys", Biome.class, Registries.BIOME, RegistryKey.BIOME, true), simpleKey("BiomeKeys", Biome.class, Registries.BIOME, RegistryKey.BIOME, true),
simpleKey("StructureKeys", Structure.class, Registries.STRUCTURE, RegistryKey.STRUCTURE, true),
simpleKey("TrimMaterialKeys", TrimMaterial.class, Registries.TRIM_MATERIAL, RegistryKey.TRIM_MATERIAL, true), simpleKey("TrimMaterialKeys", TrimMaterial.class, Registries.TRIM_MATERIAL, RegistryKey.TRIM_MATERIAL, true),
simpleKey("TrimPatternKeys", TrimPattern.class, Registries.TRIM_PATTERN, RegistryKey.TRIM_PATTERN, true), simpleKey("TrimPatternKeys", TrimPattern.class, Registries.TRIM_PATTERN, RegistryKey.TRIM_PATTERN, true),
simpleKey("StructureKeys", Structure.class, Registries.STRUCTURE, RegistryKey.STRUCTURE, true),
simpleKey("StructureTypeKeys", StructureType.class, Registries.STRUCTURE_TYPE, RegistryKey.STRUCTURE_TYPE, false),
simpleKey("InstrumentKeys", MusicInstrument.class, Registries.INSTRUMENT, RegistryKey.INSTRUMENT, false),
simpleKey("EnchantmentKeys", Enchantment.class, Registries.ENCHANTMENT, RegistryKey.ENCHANTMENT, false),
simpleKey("MobEffectKeys", PotionEffectType.class, Registries.MOB_EFFECT, RegistryKey.MOB_EFFECT, false),
simpleKey("DamageTypeKeys", DamageType.class, Registries.DAMAGE_TYPE, RegistryKey.DAMAGE_TYPE, true), simpleKey("DamageTypeKeys", DamageType.class, Registries.DAMAGE_TYPE, RegistryKey.DAMAGE_TYPE, true),
simpleKey("WolfVariantKeys", Wolf.Variant.class, Registries.WOLF_VARIANT, RegistryKey.WOLF_VARIANT, true), simpleKey("WolfVariantKeys", Wolf.Variant.class, Registries.WOLF_VARIANT, RegistryKey.WOLF_VARIANT, true),
simpleKey("ItemTypeKeys", ItemType.class, Registries.ITEM, RegistryKey.ITEM, false), simpleKey("EnchantmentKeys", Enchantment.class, Registries.ENCHANTMENT, RegistryKey.ENCHANTMENT, true),
simpleKey("JukeboxSongKeys", JukeboxSong.class, Registries.JUKEBOX_SONG, RegistryKey.JUKEBOX_SONG, true),
simpleKey("BannerPatternKeys", PatternType.class, Registries.BANNER_PATTERN, RegistryKey.BANNER_PATTERN, true),
simpleKey("PaintingVariantKeys", Art.class, Registries.PAINTING_VARIANT, RegistryKey.PAINTING_VARIANT, true),
simpleKey("InstrumentKeys", MusicInstrument.class, Registries.INSTRUMENT, RegistryKey.INSTRUMENT, true),
// tags
simpleTagKey("EnchantmentTagKeys", Enchantment.class, Registries.ENCHANTMENT, RegistryKey.ENCHANTMENT), simpleTagKey("EnchantmentTagKeys", Enchantment.class, Registries.ENCHANTMENT, RegistryKey.ENCHANTMENT),
simpleTagKey("ItemTypeTagKeys", ItemType.class, Registries.ITEM, RegistryKey.ITEM), simpleTagKey("ItemTypeTagKeys", ItemType.class, Registries.ITEM, RegistryKey.ITEM),
new MobGoalGenerator("VanillaGoal", "com.destroystokyo.paper.entity.ai") new MobGoalGenerator("VanillaGoal", "com.destroystokyo.paper.entity.ai")

Datei anzeigen

@ -7,22 +7,25 @@ import io.papermc.generator.utils.TagCollector;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.List;
import java.util.Map; import java.util.Map;
import net.minecraft.SharedConstants; import net.minecraft.SharedConstants;
import net.minecraft.commands.Commands; import net.minecraft.commands.Commands;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.LayeredRegistryAccess; import net.minecraft.core.LayeredRegistryAccess;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.RegistryDataLoader; import net.minecraft.resources.RegistryDataLoader;
import net.minecraft.server.Bootstrap; import net.minecraft.server.Bootstrap;
import net.minecraft.server.RegistryLayer; import net.minecraft.server.RegistryLayer;
import net.minecraft.server.ReloadableServerResources; import net.minecraft.server.ReloadableServerResources;
import net.minecraft.server.WorldLoader;
import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.PackType;
import net.minecraft.server.packs.repository.Pack; import net.minecraft.server.packs.repository.Pack;
import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.server.packs.repository.PackRepository;
import net.minecraft.server.packs.repository.ServerPacksSource; import net.minecraft.server.packs.repository.ServerPacksSource;
import net.minecraft.server.packs.resources.MultiPackResourceManager; import net.minecraft.server.packs.resources.MultiPackResourceManager;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.tags.TagLoader;
import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.flag.FeatureFlags;
import org.apache.commons.io.file.PathUtils; import org.apache.commons.io.file.PathUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -42,11 +45,22 @@ public final class Main {
resourceRepository.reload(); resourceRepository.reload();
final MultiPackResourceManager resourceManager = new MultiPackResourceManager(PackType.SERVER_DATA, resourceRepository.getAvailablePacks().stream().map(Pack::open).toList()); final MultiPackResourceManager resourceManager = new MultiPackResourceManager(PackType.SERVER_DATA, resourceRepository.getAvailablePacks().stream().map(Pack::open).toList());
LayeredRegistryAccess<RegistryLayer> layers = RegistryLayer.createRegistryAccess(); LayeredRegistryAccess<RegistryLayer> layers = RegistryLayer.createRegistryAccess();
layers = WorldLoader.loadAndReplaceLayer(resourceManager, layers, RegistryLayer.WORLDGEN, RegistryDataLoader.WORLDGEN_REGISTRIES); final List<Registry.PendingTags<?>> pendingTags = TagLoader.loadTagsForExistingRegistries(resourceManager, layers.getLayer(RegistryLayer.STATIC));
final List<HolderLookup.RegistryLookup<?>> worldGenLayer = TagLoader.buildUpdatedLookups(layers.getAccessForLoading(RegistryLayer.WORLDGEN), pendingTags);
final RegistryAccess.Frozen frozenWorldgenRegistries = RegistryDataLoader.load(resourceManager, worldGenLayer, RegistryDataLoader.WORLDGEN_REGISTRIES);
layers = layers.replaceFrom(RegistryLayer.WORLDGEN, frozenWorldgenRegistries);
REGISTRY_ACCESS = layers.compositeAccess().freeze(); REGISTRY_ACCESS = layers.compositeAccess().freeze();
final ReloadableServerResources datapack = ReloadableServerResources.loadResources(resourceManager, layers, FeatureFlags.REGISTRY.allFlags(), Commands.CommandSelection.DEDICATED, 0, MoreExecutors.directExecutor(), MoreExecutors.directExecutor()).join(); final ReloadableServerResources reloadableServerResources = ReloadableServerResources.loadResources(
datapack.updateRegistryTags(); resourceManager,
layers,
pendingTags,
FeatureFlags.VANILLA_SET,
Commands.CommandSelection.DEDICATED,
0,
MoreExecutors.directExecutor(),
MoreExecutors.directExecutor()
).join();
reloadableServerResources.updateStaticRegistryTags();
EXPERIMENTAL_TAGS = TagCollector.grabExperimental(resourceManager); EXPERIMENTAL_TAGS = TagCollector.grabExperimental(resourceManager);
} }

Datei anzeigen

@ -23,21 +23,25 @@ import java.util.IdentityHashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.lang.model.SourceVersion;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderLookup;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.RegistrySetBuilder;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.registries.VanillaRegistries; import net.minecraft.data.registries.VanillaRegistries;
import net.minecraft.data.registries.WinterDropRegistries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.flag.FeatureElement; import net.minecraft.world.flag.FeatureElement;
import net.minecraft.world.flag.FeatureFlags;
import org.bukkit.MinecraftExperimental;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.framework.qual.DefaultQualifier; import org.checkerframework.framework.qual.DefaultQualifier;
import static com.squareup.javapoet.TypeSpec.classBuilder; import static com.squareup.javapoet.TypeSpec.classBuilder;
import static io.papermc.generator.utils.Annotations.EXPERIMENTAL_API_ANNOTATION; import static io.papermc.generator.utils.Annotations.EXPERIMENTAL_API_ANNOTATION;
import static io.papermc.generator.utils.Annotations.NOT_NULL;
import static io.papermc.generator.utils.Annotations.experimentalAnnotations; import static io.papermc.generator.utils.Annotations.experimentalAnnotations;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.FINAL;
@ -51,7 +55,8 @@ public class GeneratedKeyType<T, A> extends SimpleGenerator {
private static final Map<ResourceKey<? extends Registry<?>>, RegistrySetBuilder.RegistryBootstrap<?>> VANILLA_REGISTRY_ENTRIES = VanillaRegistries.BUILDER.entries.stream() private static final Map<ResourceKey<? extends Registry<?>>, RegistrySetBuilder.RegistryBootstrap<?>> VANILLA_REGISTRY_ENTRIES = VanillaRegistries.BUILDER.entries.stream()
.collect(Collectors.toMap(RegistrySetBuilder.RegistryStub::key, RegistrySetBuilder.RegistryStub::bootstrap)); .collect(Collectors.toMap(RegistrySetBuilder.RegistryStub::key, RegistrySetBuilder.RegistryStub::bootstrap));
private static final Map<ResourceKey<? extends Registry<?>>, RegistrySetBuilder.RegistryBootstrap<?>> EXPERIMENTAL_REGISTRY_ENTRIES = Collections.emptyMap(); // Update for Experimental API private static final Map<ResourceKey<? extends Registry<?>>, RegistrySetBuilder.RegistryBootstrap<?>> EXPERIMENTAL_REGISTRY_ENTRIES = WinterDropRegistries.BUILDER.entries.stream()
.collect(Collectors.toMap(RegistrySetBuilder.RegistryStub::key, RegistrySetBuilder.RegistryStub::bootstrap)); // Update for Experimental API
private static final Map<RegistryKey<?>, String> REGISTRY_KEY_FIELD_NAMES; private static final Map<RegistryKey<?>, String> REGISTRY_KEY_FIELD_NAMES;
static { static {
@ -90,14 +95,14 @@ public class GeneratedKeyType<T, A> extends SimpleGenerator {
} }
private MethodSpec.Builder createMethod(final TypeName returnType) { private MethodSpec.Builder createMethod(final TypeName returnType) {
final TypeName keyType = TypeName.get(Key.class).annotated(NOT_NULL); final TypeName keyType = TypeName.get(Key.class);
final ParameterSpec keyParam = ParameterSpec.builder(keyType, "key", FINAL).build(); final ParameterSpec keyParam = ParameterSpec.builder(keyType, "key", FINAL).build();
final MethodSpec.Builder create = MethodSpec.methodBuilder("create") final MethodSpec.Builder create = MethodSpec.methodBuilder("create")
.addModifiers(this.publicCreateKeyMethod ? PUBLIC : PRIVATE, STATIC) .addModifiers(this.publicCreateKeyMethod ? PUBLIC : PRIVATE, STATIC)
.addParameter(keyParam) .addParameter(keyParam)
.addCode("return $T.create($T.$L, $N);", TypedKey.class, RegistryKey.class, requireNonNull(REGISTRY_KEY_FIELD_NAMES.get(this.apiRegistryKey), "Missing field for " + this.apiRegistryKey), keyParam) .addCode("return $T.create($T.$L, $N);", TypedKey.class, RegistryKey.class, requireNonNull(REGISTRY_KEY_FIELD_NAMES.get(this.apiRegistryKey), "Missing field for " + this.apiRegistryKey), keyParam)
.returns(returnType.annotated(NOT_NULL)); .returns(returnType);
if (this.publicCreateKeyMethod) { if (this.publicCreateKeyMethod) {
create.addAnnotation(EXPERIMENTAL_API_ANNOTATION); // TODO remove once not experimental create.addAnnotation(EXPERIMENTAL_API_ANNOTATION); // TODO remove once not experimental
create.addJavadoc(CREATE_JAVADOC, this.apiType, this.registryKey.location().toString()); create.addJavadoc(CREATE_JAVADOC, this.apiType, this.registryKey.location().toString());
@ -116,6 +121,13 @@ public class GeneratedKeyType<T, A> extends SimpleGenerator {
); );
} }
@Deprecated
private static final Map<String, String> JUKEBOX_SONG_NAMES = Map.of(
"5", "FIVE",
"11", "ELEVEN",
"13", "THIRTEEN"
);
@Override @Override
protected TypeSpec getTypeSpec() { protected TypeSpec getTypeSpec() {
final TypeName typedKey = ParameterizedTypeName.get(TypedKey.class, this.apiType); final TypeName typedKey = ParameterizedTypeName.get(TypedKey.class, this.apiType);
@ -123,19 +135,23 @@ public class GeneratedKeyType<T, A> extends SimpleGenerator {
final TypeSpec.Builder typeBuilder = this.keyHolderType(); final TypeSpec.Builder typeBuilder = this.keyHolderType();
final MethodSpec.Builder createMethod = this.createMethod(typedKey); final MethodSpec.Builder createMethod = this.createMethod(typedKey);
final Registry<T> registry = Main.REGISTRY_ACCESS.registryOrThrow(this.registryKey); final Registry<T> registry = Main.REGISTRY_ACCESS.lookupOrThrow(this.registryKey);
final Set<ResourceKey<T>> experimental = this.collectExperimentalKeys(registry); final Set<ResourceKey<T>> experimental = this.collectExperimentalKeys(registry);
boolean allExperimental = true; boolean allExperimental = true;
for (final Holder.Reference<T> reference : registry.holders().sorted(Formatting.alphabeticKeyOrder(reference -> reference.key().location().getPath())).toList()) { for (final Holder.Reference<T> reference : registry.listElements().sorted(Formatting.alphabeticKeyOrder(reference -> reference.key().location().getPath())).toList()) {
final ResourceKey<T> key = reference.key(); final ResourceKey<T> key = reference.key();
final String keyPath = key.location().getPath(); final String keyPath = key.location().getPath();
final String fieldName = Formatting.formatKeyAsField(keyPath); String fieldName = Formatting.formatKeyAsField(keyPath);
if (!SourceVersion.isIdentifier(fieldName) && this.registryKey.equals(Registries.JUKEBOX_SONG) && JUKEBOX_SONG_NAMES.containsKey(fieldName)) {
fieldName = JUKEBOX_SONG_NAMES.get(fieldName);
}
final FieldSpec.Builder fieldBuilder = FieldSpec.builder(typedKey, fieldName, PUBLIC, STATIC, FINAL) final FieldSpec.Builder fieldBuilder = FieldSpec.builder(typedKey, fieldName, PUBLIC, STATIC, FINAL)
.initializer("$N(key($S))", createMethod.build(), keyPath) .initializer("$N(key($S))", createMethod.build(), keyPath)
.addJavadoc(Javadocs.getVersionDependentField("{@code $L}"), key.location().toString()); .addJavadoc(Javadocs.getVersionDependentField("{@code $L}"), key.location().toString());
if (experimental.contains(key)) { if (experimental.contains(key)) {
fieldBuilder.addAnnotations(experimentalAnnotations(null)); // Update for Experimental API fieldBuilder.addAnnotations(experimentalAnnotations(MinecraftExperimental.Requires.WINTER_DROP)); // Update for Experimental API
} else { } else {
allExperimental = false; allExperimental = false;
} }
@ -150,6 +166,7 @@ public class GeneratedKeyType<T, A> extends SimpleGenerator {
return typeBuilder.addMethod(createMethod.build()).build(); return typeBuilder.addMethod(createMethod.build()).build();
} }
// todo at some point this should be per feature data pack not all merged
private Set<ResourceKey<T>> collectExperimentalKeys(final Registry<T> registry) { private Set<ResourceKey<T>> collectExperimentalKeys(final Registry<T> registry) {
if (FeatureElement.FILTERED_REGISTRIES.contains(registry.key())) { if (FeatureElement.FILTERED_REGISTRIES.contains(registry.key())) {
return this.collectExperimentalKeysBuiltIn(registry); return this.collectExperimentalKeysBuiltIn(registry);
@ -159,8 +176,8 @@ public class GeneratedKeyType<T, A> extends SimpleGenerator {
} }
private Set<ResourceKey<T>> collectExperimentalKeysBuiltIn(final Registry<T> registry) { private Set<ResourceKey<T>> collectExperimentalKeysBuiltIn(final Registry<T> registry) {
final HolderLookup.RegistryLookup<T> filteredLookup = registry.asLookup().filterElements(v -> { final HolderLookup.RegistryLookup<T> filteredLookup = registry.filterElements(v -> {
return false; // Update for Experimental API return v instanceof final FeatureElement featureElement && FeatureFlags.isExperimental(featureElement.requiredFeatures()); // Update for Experimental API
}); });
return filteredLookup.listElementIds().collect(Collectors.toUnmodifiableSet()); return filteredLookup.listElementIds().collect(Collectors.toUnmodifiableSet());
} }

Datei anzeigen

@ -16,6 +16,7 @@ import io.papermc.paper.registry.tag.TagKey;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
@ -25,7 +26,6 @@ import org.bukkit.MinecraftExperimental;
import static com.squareup.javapoet.TypeSpec.classBuilder; import static com.squareup.javapoet.TypeSpec.classBuilder;
import static io.papermc.generator.utils.Annotations.EXPERIMENTAL_API_ANNOTATION; import static io.papermc.generator.utils.Annotations.EXPERIMENTAL_API_ANNOTATION;
import static io.papermc.generator.utils.Annotations.NOT_NULL;
import static io.papermc.generator.utils.Annotations.experimentalAnnotations; import static io.papermc.generator.utils.Annotations.experimentalAnnotations;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.FINAL;
@ -72,14 +72,14 @@ public class GeneratedTagKeyType<T, A> extends SimpleGenerator {
} }
private MethodSpec.Builder createMethod(final TypeName returnType) { private MethodSpec.Builder createMethod(final TypeName returnType) {
final TypeName keyType = TypeName.get(Key.class).annotated(NOT_NULL); final TypeName keyType = TypeName.get(Key.class);
final ParameterSpec keyParam = ParameterSpec.builder(keyType, "key", FINAL).build(); final ParameterSpec keyParam = ParameterSpec.builder(keyType, "key", FINAL).build();
final MethodSpec.Builder create = MethodSpec.methodBuilder("create") final MethodSpec.Builder create = MethodSpec.methodBuilder("create")
.addModifiers(this.publicCreateKeyMethod ? PUBLIC : PRIVATE, STATIC) .addModifiers(this.publicCreateKeyMethod ? PUBLIC : PRIVATE, STATIC)
.addParameter(keyParam) .addParameter(keyParam)
.addCode("return $T.create($T.$L, $N);", TagKey.class, RegistryKey.class, requireNonNull(REGISTRY_KEY_FIELD_NAMES.get(this.apiRegistryKey), "Missing field for " + this.apiRegistryKey), keyParam) .addCode("return $T.create($T.$L, $N);", TagKey.class, RegistryKey.class, requireNonNull(REGISTRY_KEY_FIELD_NAMES.get(this.apiRegistryKey), "Missing field for " + this.apiRegistryKey), keyParam)
.returns(returnType.annotated(NOT_NULL)); .returns(returnType);
if (this.publicCreateKeyMethod) { if (this.publicCreateKeyMethod) {
create.addAnnotation(EXPERIMENTAL_API_ANNOTATION); // TODO remove once not experimental create.addAnnotation(EXPERIMENTAL_API_ANNOTATION); // TODO remove once not experimental
create.addJavadoc(CREATE_JAVADOC, this.apiType, this.registryKey.location().toString()); create.addJavadoc(CREATE_JAVADOC, this.apiType, this.registryKey.location().toString());
@ -105,16 +105,17 @@ public class GeneratedTagKeyType<T, A> extends SimpleGenerator {
final TypeSpec.Builder typeBuilder = this.keyHolderType(); final TypeSpec.Builder typeBuilder = this.keyHolderType();
final MethodSpec.Builder createMethod = this.createMethod(tagKey); final MethodSpec.Builder createMethod = this.createMethod(tagKey);
final Registry<T> registry = Main.REGISTRY_ACCESS.registryOrThrow(this.registryKey); final Registry<T> registry = Main.REGISTRY_ACCESS.lookupOrThrow(this.registryKey);
final AtomicBoolean allExperimental = new AtomicBoolean(true); final AtomicBoolean allExperimental = new AtomicBoolean(true);
registry.getTagNames().sorted(Formatting.alphabeticKeyOrder(nmsTagKey -> nmsTagKey.location().getPath())).forEach(nmsTagKey -> { registry.listTagIds().sorted(Formatting.alphabeticKeyOrder(nmsTagKey -> nmsTagKey.location().getPath())).forEach(nmsTagKey -> {
final String fieldName = Formatting.formatKeyAsField(nmsTagKey.location().getPath()); final String fieldName = Formatting.formatKeyAsField(nmsTagKey.location().getPath());
final FieldSpec.Builder fieldBuilder = FieldSpec.builder(tagKey, fieldName, PUBLIC, STATIC, FINAL) final FieldSpec.Builder fieldBuilder = FieldSpec.builder(tagKey, fieldName, PUBLIC, STATIC, FINAL)
.initializer("$N(key($S))", createMethod.build(), nmsTagKey.location().getPath()) .initializer("$N(key($S))", createMethod.build(), nmsTagKey.location().getPath())
.addJavadoc(Javadocs.getVersionDependentField("{@code $L}"), "#" + nmsTagKey.location()); .addJavadoc(Javadocs.getVersionDependentField("{@code $L}"), "#" + nmsTagKey.location());
if (Main.EXPERIMENTAL_TAGS.containsKey(nmsTagKey)) { final String featureFlagName = Main.EXPERIMENTAL_TAGS.get(nmsTagKey);
fieldBuilder.addAnnotations(experimentalAnnotations(MinecraftExperimental.Requires.TRADE_REBALANCE)); // Update for Experimental API if (featureFlagName != null) {
fieldBuilder.addAnnotations(experimentalAnnotations(MinecraftExperimental.Requires.valueOf(featureFlagName.toUpperCase(Locale.ENGLISH)))); // Update for Experimental API
} else { } else {
allExperimental.set(false); allExperimental.set(false);
} }

Datei anzeigen

@ -31,5 +31,4 @@ public abstract class SimpleGenerator implements SourceGenerator {
builder.build().writeTo(parent, StandardCharsets.UTF_8); builder.build().writeTo(parent, StandardCharsets.UTF_8);
} }
} }

Datei anzeigen

@ -1,6 +1,5 @@
package io.papermc.generator.types.goal; package io.papermc.generator.types.goal;
import com.destroystokyo.paper.entity.RangedEntity;
import com.destroystokyo.paper.entity.ai.GoalKey; import com.destroystokyo.paper.entity.ai.GoalKey;
import com.squareup.javapoet.ClassName; import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.FieldSpec; import com.squareup.javapoet.FieldSpec;
@ -19,44 +18,10 @@ import io.papermc.generator.utils.Formatting;
import io.papermc.generator.utils.Javadocs; import io.papermc.generator.utils.Javadocs;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import javax.lang.model.element.Modifier;
import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.goal.Goal;
import net.minecraft.world.entity.ai.goal.WrappedGoal; import net.minecraft.world.entity.ai.goal.WrappedGoal;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.entity.AbstractHorse;
import org.bukkit.entity.Blaze;
import org.bukkit.entity.Cat;
import org.bukkit.entity.Creature;
import org.bukkit.entity.Dolphin;
import org.bukkit.entity.Drowned;
import org.bukkit.entity.Enderman;
import org.bukkit.entity.Evoker;
import org.bukkit.entity.Fish;
import org.bukkit.entity.Fox;
import org.bukkit.entity.Ghast;
import org.bukkit.entity.Llama;
import org.bukkit.entity.Mob; import org.bukkit.entity.Mob;
import org.bukkit.entity.Monster;
import org.bukkit.entity.Panda;
import org.bukkit.entity.Parrot;
import org.bukkit.entity.PigZombie;
import org.bukkit.entity.PolarBear;
import org.bukkit.entity.Rabbit;
import org.bukkit.entity.Raider;
import org.bukkit.entity.Ravager;
import org.bukkit.entity.Shulker;
import org.bukkit.entity.Silverfish;
import org.bukkit.entity.SkeletonHorse;
import org.bukkit.entity.Slime;
import org.bukkit.entity.Spellcaster;
import org.bukkit.entity.Spider;
import org.bukkit.entity.Squid;
import org.bukkit.entity.Tameable;
import org.bukkit.entity.TraderLlama;
import org.bukkit.entity.Turtle;
import org.bukkit.entity.Vex;
import org.bukkit.entity.Vindicator;
import org.bukkit.entity.WanderingTrader;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.framework.qual.DefaultQualifier; import org.checkerframework.framework.qual.DefaultQualifier;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -85,10 +50,8 @@ public class MobGoalGenerator extends SimpleGenerator {
.addAnnotations(Annotations.CLASS_HEADER) .addAnnotations(Annotations.CLASS_HEADER)
.addJavadoc(CLASS_HEADER); .addJavadoc(CLASS_HEADER);
TypeName mobType = ParameterizedTypeName.get(ClassName.get(Class.class), type) TypeName mobType = ParameterizedTypeName.get(ClassName.get(Class.class), type);
.annotated(Annotations.NOT_NULL); TypeName keyType = TypeName.get(String.class);
TypeName keyType = TypeName.get(String.class)
.annotated(Annotations.NOT_NULL);
ParameterSpec keyParam = ParameterSpec.builder(keyType, "key", FINAL).build(); ParameterSpec keyParam = ParameterSpec.builder(keyType, "key", FINAL).build();
ParameterSpec typeParam = ParameterSpec.builder(mobType, "type", FINAL).build(); ParameterSpec typeParam = ParameterSpec.builder(mobType, "type", FINAL).build();
@ -98,7 +61,7 @@ public class MobGoalGenerator extends SimpleGenerator {
.addParameter(typeParam) .addParameter(typeParam)
.addCode("return $T.of($N, $T.minecraft($N));", GoalKey.class, typeParam, NamespacedKey.class, keyParam) .addCode("return $T.of($N, $T.minecraft($N));", GoalKey.class, typeParam, NamespacedKey.class, keyParam)
.addTypeVariable(type) .addTypeVariable(type)
.returns(ParameterizedTypeName.get(ClassName.get(GoalKey.class), type).annotated(Annotations.NOT_NULL)); .returns(ParameterizedTypeName.get(ClassName.get(GoalKey.class), type));
List<Class<Goal>> classes; List<Class<Goal>> classes;
try (ScanResult scanResult = new ClassGraph().enableAllInfo().whitelistPackages("net.minecraft").scan()) { try (ScanResult scanResult = new ClassGraph().enableAllInfo().whitelistPackages("net.minecraft").scan()) {
@ -134,10 +97,4 @@ public class MobGoalGenerator extends SimpleGenerator {
protected JavaFile.Builder file(JavaFile.Builder builder) { protected JavaFile.Builder file(JavaFile.Builder builder) {
return builder; return builder;
} }
record DeprecatedEntry(Class<?> entity, String entryName, @Nullable String removalVersion,
@Nullable String removedVersion) {
}
} }

Datei anzeigen

@ -236,6 +236,9 @@ public class MobGoalNames {
bukkitMap.put(net.minecraft.world.entity.monster.breeze.Breeze.class, org.bukkit.entity.Breeze.class); bukkitMap.put(net.minecraft.world.entity.monster.breeze.Breeze.class, org.bukkit.entity.Breeze.class);
bukkitMap.put(net.minecraft.world.entity.animal.armadillo.Armadillo.class, org.bukkit.entity.Armadillo.class); bukkitMap.put(net.minecraft.world.entity.animal.armadillo.Armadillo.class, org.bukkit.entity.Armadillo.class);
bukkitMap.put(net.minecraft.world.entity.monster.Bogged.class, org.bukkit.entity.Bogged.class); bukkitMap.put(net.minecraft.world.entity.monster.Bogged.class, org.bukkit.entity.Bogged.class);
bukkitMap.put(net.minecraft.world.entity.monster.creaking.Creaking.class, org.bukkit.entity.Creaking.class);
bukkitMap.put(net.minecraft.world.entity.monster.creaking.CreakingTransient.class, org.bukkit.entity.CreakingTransient.class);
bukkitMap.put(net.minecraft.world.entity.animal.AgeableWaterCreature.class, org.bukkit.entity.Squid.class); // close enough
//</editor-fold> //</editor-fold>
} }
@ -268,6 +271,7 @@ public class MobGoalNames {
name = cut; name = cut;
} }
} }
name = name.replace("PathfinderGoal", ""); name = name.replace("PathfinderGoal", "");
name = name.replace("TargetGoal", ""); name = name.replace("TargetGoal", "");
name = name.replace("Goal", ""); name = name.replace("Goal", "");

Datei anzeigen

@ -7,9 +7,9 @@ import java.util.List;
import io.papermc.paper.generated.GeneratedFrom; import io.papermc.paper.generated.GeneratedFrom;
import net.minecraft.SharedConstants; import net.minecraft.SharedConstants;
import org.bukkit.MinecraftExperimental; import org.bukkit.MinecraftExperimental;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jspecify.annotations.NullMarked;
public final class Annotations { public final class Annotations {
@ -46,7 +46,7 @@ public final class Annotations {
@ApiStatus.Experimental @ApiStatus.Experimental
public static final AnnotationSpec EXPERIMENTAL_API_ANNOTATION = AnnotationSpec.builder(ApiStatus.Experimental.class).build(); public static final AnnotationSpec EXPERIMENTAL_API_ANNOTATION = AnnotationSpec.builder(ApiStatus.Experimental.class).build();
public static final AnnotationSpec NOT_NULL = AnnotationSpec.builder(NonNull.class).build(); public static final AnnotationSpec NULL_MARKED = AnnotationSpec.builder(NullMarked.class).build();
private static final AnnotationSpec SUPPRESS_WARNINGS = AnnotationSpec.builder(SuppressWarnings.class) private static final AnnotationSpec SUPPRESS_WARNINGS = AnnotationSpec.builder(SuppressWarnings.class)
.addMember("value", "$S", "unused") .addMember("value", "$S", "unused")
.addMember("value", "$S", "SpellCheckingInspection") .addMember("value", "$S", "SpellCheckingInspection")
@ -56,7 +56,8 @@ public final class Annotations {
.build(); .build();
public static final Iterable<AnnotationSpec> CLASS_HEADER = List.of( public static final Iterable<AnnotationSpec> CLASS_HEADER = List.of(
SUPPRESS_WARNINGS, SUPPRESS_WARNINGS,
GENERATED_FROM GENERATED_FROM,
NULL_MARKED
); );
private Annotations() { private Annotations() {

Datei anzeigen

@ -18,11 +18,11 @@ public record CollectingContext<T>(Set<ResourceKey<T>> registered,
@Override @Override
public Holder.Reference<T> register(final ResourceKey<T> resourceKey, final @NonNull T t, final Lifecycle lifecycle) { public Holder.Reference<T> register(final ResourceKey<T> resourceKey, final @NonNull T t, final Lifecycle lifecycle) {
this.registered.add(resourceKey); this.registered.add(resourceKey);
return Holder.Reference.createStandAlone(this.registry.holderOwner(), resourceKey); return Holder.Reference.createStandAlone(this.registry, resourceKey);
} }
@Override @Override
public <S> HolderGetter<S> lookup(final ResourceKey<? extends Registry<? extends S>> resourceKey) { public <S> HolderGetter<S> lookup(final ResourceKey<? extends Registry<? extends S>> resourceKey) {
return Main.REGISTRY_ACCESS.registryOrThrow(resourceKey).asLookup(); return Main.REGISTRY_ACCESS.lookupOrThrow(resourceKey);
} }
} }

Datei anzeigen

@ -47,7 +47,7 @@ public final class TagCollector {
return; return;
} }
result.put(entry.value().getTagNames() result.put(entry.value().listTagIds()
.filter(tagKey -> tagKey.location().getPath().equals(path)) .filter(tagKey -> tagKey.location().getPath().equals(path))
.findFirst() .findFirst()
.orElseThrow(), packId); .orElseThrow(), packId);

Datei anzeigen

@ -1,7 +1,6 @@
public net/minecraft/server/WorldLoader loadAndReplaceLayer(Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/core/LayeredRegistryAccess;Lnet/minecraft/server/RegistryLayer;Ljava/util/List;)Lnet/minecraft/core/LayeredRegistryAccess;
# for auto-marking experimental stuff # for auto-marking experimental stuff
public net/minecraft/core/RegistrySetBuilder entries public net/minecraft/core/RegistrySetBuilder entries
public net/minecraft/core/RegistrySetBuilder$RegistryStub public net/minecraft/core/RegistrySetBuilder$RegistryStub
public net/minecraft/data/registries/UpdateOneTwentyOneRegistries BUILDER
public net/minecraft/data/registries/VanillaRegistries BUILDER public net/minecraft/data/registries/VanillaRegistries BUILDER
public net/minecraft/data/registries/WinterDropRegistries BUILDER
public net/minecraft/data/registries/TradeRebalanceRegistries BUILDER

Datei anzeigen

@ -27,7 +27,7 @@ index 5dd700a956e915c00b25d91dea8d6f285ddab72b..97e78e27ee0eea2c8b24886eeb19164d
+/.factorypath +/.factorypath
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..6271e2bad0ed937c2c46a8c8fdf186c46b0b620e index 0000000000000000000000000000000000000000..7ac6af074d76b782ef14fe4690bb5b630ededa32
--- /dev/null --- /dev/null
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
@ -63,8 +63,8 @@ index 0000000000000000000000000000000000000000..6271e2bad0ed937c2c46a8c8fdf186c4
+ testImplementation("org.apache.commons:commons-lang3:3.12.0") + testImplementation("org.apache.commons:commons-lang3:3.12.0")
+ testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") + testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
+ testImplementation("org.hamcrest:hamcrest:2.2") + testImplementation("org.hamcrest:hamcrest:2.2")
+ testImplementation("org.mockito:mockito-core:5.11.0") + testImplementation("org.mockito:mockito-core:5.14.1")
+ testImplementation("org.ow2.asm:asm-tree:9.7") + testImplementation("org.ow2.asm:asm-tree:9.7.1")
+} +}
+ +
+configure<PublishingExtension> { +configure<PublishingExtension> {
@ -124,7 +124,7 @@ index 0000000000000000000000000000000000000000..6271e2bad0ed937c2c46a8c8fdf186c4
+} +}
diff --git a/pom.xml b/pom.xml diff --git a/pom.xml b/pom.xml
deleted file mode 100644 deleted file mode 100644
index 2c5ac393cffbe61330c5aa95115e7e906c0775d3..0000000000000000000000000000000000000000 index bdde86ea96da233c802e98dc203cb4cb7f8616b0..0000000000000000000000000000000000000000
--- a/pom.xml --- a/pom.xml
+++ /dev/null +++ /dev/null
@@ -1,267 +0,0 @@ @@ -1,267 +0,0 @@
@ -135,7 +135,7 @@ index 2c5ac393cffbe61330c5aa95115e7e906c0775d3..00000000000000000000000000000000
- -
- <groupId>org.spigotmc</groupId> - <groupId>org.spigotmc</groupId>
- <artifactId>spigot-api</artifactId> - <artifactId>spigot-api</artifactId>
- <version>1.21.1-R0.1-SNAPSHOT</version> - <version>1.21.3-R0.1-SNAPSHOT</version>
- <packaging>jar</packaging> - <packaging>jar</packaging>
- -
- <name>Spigot-API</name> - <name>Spigot-API</name>
@ -236,13 +236,13 @@ index 2c5ac393cffbe61330c5aa95115e7e906c0775d3..00000000000000000000000000000000
- <dependency> - <dependency>
- <groupId>org.mockito</groupId> - <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId> - <artifactId>mockito-core</artifactId>
- <version>5.11.0</version> - <version>5.14.1</version>
- <scope>test</scope> - <scope>test</scope>
- </dependency> - </dependency>
- <dependency> - <dependency>
- <groupId>org.ow2.asm</groupId> - <groupId>org.ow2.asm</groupId>
- <artifactId>asm-tree</artifactId> - <artifactId>asm-tree</artifactId>
- <version>9.7</version> - <version>9.7.1</version>
- <scope>test</scope> - <scope>test</scope>
- </dependency> - </dependency>
- </dependencies> - </dependencies>

Datei anzeigen

@ -5,10 +5,10 @@ Subject: [PATCH] Build system changes
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index 6271e2bad0ed937c2c46a8c8fdf186c46b0b620e..a918fd14c95e714e935758d60bccd72755e00b11 100644 index 7ac6af074d76b782ef14fe4690bb5b630ededa32..0b837b485bec96fa37ed65c18df97e55cecd0e9d 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -18,15 +18,26 @@ dependencies { @@ -18,15 +18,27 @@ dependencies {
api("net.md-5:bungeecord-chat:$bungeeCordChatVersion") api("net.md-5:bungeecord-chat:$bungeeCordChatVersion")
api("org.yaml:snakeyaml:2.2") api("org.yaml:snakeyaml:2.2")
api("org.joml:joml:1.10.5") api("org.joml:joml:1.10.5")
@ -32,11 +32,12 @@ index 6271e2bad0ed937c2c46a8c8fdf186c46b0b620e..a918fd14c95e714e935758d60bccd727
+ compileOnlyApi(checkerQual) + compileOnlyApi(checkerQual)
+ testCompileOnly(checkerQual) + testCompileOnly(checkerQual)
+ // Paper end + // Paper end
+ api("org.jspecify:jspecify:1.0.0") // Paper - add jspecify
+ +
testImplementation("org.apache.commons:commons-lang3:3.12.0") testImplementation("org.apache.commons:commons-lang3:3.12.0")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
testImplementation("org.hamcrest:hamcrest:2.2") testImplementation("org.hamcrest:hamcrest:2.2")
@@ -69,8 +80,12 @@ tasks.withType<Javadoc> { @@ -69,8 +81,13 @@ tasks.withType<Javadoc> {
options.links( options.links(
"https://guava.dev/releases/32.1.2-jre/api/docs/", "https://guava.dev/releases/32.1.2-jre/api/docs/",
"https://javadoc.io/doc/org.yaml/snakeyaml/2.2/", "https://javadoc.io/doc/org.yaml/snakeyaml/2.2/",
@ -46,11 +47,12 @@ index 6271e2bad0ed937c2c46a8c8fdf186c46b0b620e..a918fd14c95e714e935758d60bccd727
+ // Paper start - add missing javadoc links + // Paper start - add missing javadoc links
+ "https://javadoc.io/doc/org.joml/joml/1.10.5/index.html", + "https://javadoc.io/doc/org.joml/joml/1.10.5/index.html",
+ "https://www.javadoc.io/doc/com.google.code.gson/gson/2.10.1", + "https://www.javadoc.io/doc/com.google.code.gson/gson/2.10.1",
+ "https://jspecify.dev/docs/api/",
+ // Paper end + // Paper end
) )
options.tags("apiNote:a:API Note:") options.tags("apiNote:a:API Note:")
@@ -89,3 +104,14 @@ tasks.withType<Javadoc> { @@ -89,3 +106,14 @@ tasks.withType<Javadoc> {
tasks.test { tasks.test {
useJUnitPlatform() useJUnitPlatform()
} }

Datei anzeigen

@ -7,16 +7,52 @@ Subject: [PATCH] Test changes
- Ignore package-private methods for nullability annotations - Ignore package-private methods for nullability annotations
- Add excludes for classes which don't pass - Add excludes for classes which don't pass
- Disable stupid BukkitMirrorTest - Disable stupid BukkitMirrorTest
- configure mockito agent to address changes in newer java versions see https://openjdk.org/jeps/451
Co-authored-by: Riley Park <rileysebastianpark@gmail.com> Co-authored-by: Riley Park <rileysebastianpark@gmail.com>
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com> Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
Co-authored-by: Yannick Lamprecht <yannicklamprecht@live.de>
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index a918fd14c95e714e935758d60bccd72755e00b11..768024b2b4584fd7dd86f068c0e79c89ffc5faa1 100644 index 0b837b485bec96fa37ed65c18df97e55cecd0e9d..c7f660d52e1b5f085919a8aebf8476918705a391 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -105,6 +105,12 @@ tasks.test { @@ -11,6 +11,18 @@ java {
val annotationsVersion = "24.1.0"
val bungeeCordChatVersion = "1.20-R0.2"
+// Paper start - configure mockito agent that is needed in newer java versions
+val mockitoAgent = configurations.register("mockitoAgent")
+abstract class MockitoAgentProvider : CommandLineArgumentProvider {
+ @get:CompileClasspath
+ abstract val fileCollection: ConfigurableFileCollection
+
+ override fun asArguments(): Iterable<String> {
+ return listOf("-javaagent:" + fileCollection.files.single().absolutePath)
+ }
+}
+// Paper end - configure mockito agent that is needed in newer java versions
+
dependencies {
// api dependencies are listed transitively to API consumers
api("com.google.guava:guava:32.1.2-jre")
@@ -44,6 +56,7 @@ dependencies {
testImplementation("org.hamcrest:hamcrest:2.2")
testImplementation("org.mockito:mockito-core:5.14.1")
testImplementation("org.ow2.asm:asm-tree:9.7.1")
+ mockitoAgent("org.mockito:mockito-core:5.14.1") { isTransitive = false } // Paper - configure mockito agent that is needed in newer java versions
}
configure<PublishingExtension> {
@@ -105,8 +118,19 @@ tasks.withType<Javadoc> {
tasks.test {
useJUnitPlatform() useJUnitPlatform()
+ // Paper start - configure mockito agent that is needed in newer java versions
+ val provider = objects.newInstance<MockitoAgentProvider>()
+ provider.fileCollection.from(mockitoAgent)
+ jvmArgumentProviders.add(provider)
+ // Paper end - configure mockito agent that is needed in newer java versions
} }
+// Paper start - compile tests with -parameters for better junit parameterized test names +// Paper start - compile tests with -parameters for better junit parameterized test names
@ -66,7 +102,7 @@ index 0000000000000000000000000000000000000000..77154095cfb8b259bdb318e8ff40cb6f
+ } + }
+} +}
diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java
index 64e7aef6220097edefdff3b98a771b988365930d..d9091ba1e5a55e03adca98305233cce9d6888609 100644 index 64e7aef6220097edefdff3b98a771b988365930d..f8b8969ee7a0b6f7b3224ff081e35c14a398c9d0 100644
--- a/src/test/java/org/bukkit/AnnotationTest.java --- a/src/test/java/org/bukkit/AnnotationTest.java
+++ b/src/test/java/org/bukkit/AnnotationTest.java +++ b/src/test/java/org/bukkit/AnnotationTest.java
@@ -29,7 +29,13 @@ public class AnnotationTest { @@ -29,7 +29,13 @@ public class AnnotationTest {
@ -103,7 +139,19 @@ index 64e7aef6220097edefdff3b98a771b988365930d..d9091ba1e5a55e03adca98305233cce9
}; };
@Test @Test
@@ -67,14 +83,48 @@ public class AnnotationTest { @@ -61,20 +77,60 @@ public class AnnotationTest {
continue;
}
+ // Paper start - skip class if it's @NullMarked
+ if (isClassNullMarked(clazz, foundClasses)) {
+ continue;
+ }
+ // Paper end - skip class if it's @NullMarked
+
for (MethodNode method : clazz.methods) {
if (!isMethodIncluded(clazz, method, foundClasses)) {
continue;
} }
if (mustBeAnnotated(Type.getReturnType(method.desc)) && !isWellAnnotated(method.invisibleAnnotations)) { if (mustBeAnnotated(Type.getReturnType(method.desc)) && !isWellAnnotated(method.invisibleAnnotations)) {
@ -152,7 +200,7 @@ index 64e7aef6220097edefdff3b98a771b988365930d..d9091ba1e5a55e03adca98305233cce9
ParameterNode paramNode = parameters == null ? null : parameters.get(i); ParameterNode paramNode = parameters == null ? null : parameters.get(i);
String paramName = paramNode == null ? null : paramNode.name; String paramName = paramNode == null ? null : paramNode.name;
@@ -91,13 +141,18 @@ public class AnnotationTest { @@ -91,13 +147,18 @@ public class AnnotationTest {
Collections.sort(errors); Collections.sort(errors);
@ -175,7 +223,31 @@ index 64e7aef6220097edefdff3b98a771b988365930d..d9091ba1e5a55e03adca98305233cce9
} }
private static void collectClasses(@NotNull File from, @NotNull Map<String, ClassNode> to) throws IOException { private static void collectClasses(@NotNull File from, @NotNull Map<String, ClassNode> to) throws IOException {
@@ -140,6 +195,11 @@ public class AnnotationTest { @@ -125,6 +186,23 @@ public class AnnotationTest {
}
}
+ // Paper start - skip class if it's @NullMarked
+ private static boolean isClassNullMarked(@NotNull ClassNode clazz, @NotNull Map<String, ClassNode> allClasses) {
+ if (clazz.nestHostClass != null) {
+ final ClassNode nestHostNode = allClasses.get(clazz.nestHostClass);
+ if (nestHostNode != null) {
+ return isClassNullMarked0(nestHostNode);
+ }
+ }
+
+ return isClassNullMarked0(clazz);
+ }
+
+ private static boolean isClassNullMarked0(@NotNull ClassNode clazz) {
+ return clazz.visibleAnnotations != null && clazz.visibleAnnotations.stream().anyMatch(node -> "Lorg/jspecify/annotations/NullMarked;".equals(node.desc));
+ }
+ // Paper end - skip class if it's @NullMarked
+
private static boolean isClassIncluded(@NotNull ClassNode clazz, @NotNull Map<String, ClassNode> allClasses) {
// Exclude private, synthetic or deprecated classes and annotations, since their members can't be null
if ((clazz.access & (Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_DEPRECATED | Opcodes.ACC_ANNOTATION)) != 0) {
@@ -140,6 +218,11 @@ public class AnnotationTest {
// Exceptions are excluded // Exceptions are excluded
return false; return false;
} }
@ -187,7 +259,7 @@ index 64e7aef6220097edefdff3b98a771b988365930d..d9091ba1e5a55e03adca98305233cce9
for (String excludedClass : EXCLUDED_CLASSES) { for (String excludedClass : EXCLUDED_CLASSES) {
if (excludedClass.equals(clazz.name)) { if (excludedClass.equals(clazz.name)) {
@@ -152,7 +212,7 @@ public class AnnotationTest { @@ -152,7 +235,7 @@ public class AnnotationTest {
private static boolean isMethodIncluded(@NotNull ClassNode clazz, @NotNull MethodNode method, @NotNull Map<String, ClassNode> allClasses) { private static boolean isMethodIncluded(@NotNull ClassNode clazz, @NotNull MethodNode method, @NotNull Map<String, ClassNode> allClasses) {
// Exclude private, synthetic and deprecated methods // Exclude private, synthetic and deprecated methods
@ -196,7 +268,7 @@ index 64e7aef6220097edefdff3b98a771b988365930d..d9091ba1e5a55e03adca98305233cce9
return false; return false;
} }
@@ -170,11 +230,30 @@ public class AnnotationTest { @@ -170,11 +253,30 @@ public class AnnotationTest {
if ("<init>".equals(method.name) && isAnonymous(clazz)) { if ("<init>".equals(method.name) && isAnonymous(clazz)) {
return false; return false;
} }
@ -241,10 +313,10 @@ index 89ca06ebecdaadd5dfc7bc74473ca15ad36f6eff..5974ceea58940e1799f3589eac0e39b9
public static Stream<Arguments> data() { public static Stream<Arguments> data() {
diff --git a/src/test/java/org/bukkit/support/TestServer.java b/src/test/java/org/bukkit/support/TestServer.java diff --git a/src/test/java/org/bukkit/support/TestServer.java b/src/test/java/org/bukkit/support/TestServer.java
index 5709d52ed4ac4ce8dd8b0569281279f7305c5fb9..a47ee3ce660ec4467b5ed6a4b41fb2d19179a189 100644 index c67e0784c043ed194f6acde32411e156412a9b24..eb1fd4b911c4af76cdd3eac85d5365e7941a4a2e 100644
--- a/src/test/java/org/bukkit/support/TestServer.java --- a/src/test/java/org/bukkit/support/TestServer.java
+++ b/src/test/java/org/bukkit/support/TestServer.java +++ b/src/test/java/org/bukkit/support/TestServer.java
@@ -72,6 +72,11 @@ public final class TestServer { @@ -83,6 +83,11 @@ public final class TestServer {
UnsafeValues unsafeValues = mock(withSettings().stubOnly()); UnsafeValues unsafeValues = mock(withSettings().stubOnly());
when(instance.getUnsafe()).thenReturn(unsafeValues); when(instance.getUnsafe()).thenReturn(unsafeValues);

Datei anzeigen

@ -7,7 +7,7 @@ Currently includes generated key holder classes for types
used in the Registry Modification API used in the Registry Modification API
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index 768024b2b4584fd7dd86f068c0e79c89ffc5faa1..f11a22ab01e97e51619c96f2d8a78a99297efc59 100644 index c7f660d52e1b5f085919a8aebf8476918705a391..89208fed89181f890bb7a2bb237ed744ec2aea96 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
@ -18,8 +18,8 @@ index 768024b2b4584fd7dd86f068c0e79c89ffc5faa1..f11a22ab01e97e51619c96f2d8a78a99
} }
java { java {
@@ -45,6 +46,22 @@ dependencies { @@ -59,6 +60,22 @@ dependencies {
testImplementation("org.ow2.asm:asm-tree:9.7") mockitoAgent("org.mockito:mockito-core:5.14.1") { isTransitive = false } // Paper - configure mockito agent that is needed in newer java versions
} }
+// Paper start +// Paper start
@ -41,7 +41,7 @@ index 768024b2b4584fd7dd86f068c0e79c89ffc5faa1..f11a22ab01e97e51619c96f2d8a78a99
configure<PublishingExtension> { configure<PublishingExtension> {
publications.create<MavenPublication>("maven") { publications.create<MavenPublication>("maven") {
from(components["java"]) from(components["java"])
@@ -121,3 +138,14 @@ tasks.check { @@ -141,3 +158,14 @@ tasks.check {
dependsOn(scanJar) dependsOn(scanJar)
} }
// Paper end // Paper end
@ -85,10 +85,10 @@ index 0000000000000000000000000000000000000000..2512dba27edfdccbc4430815b6cba048
+} +}
diff --git a/src/main/java/io/papermc/paper/registry/RegistryKey.java b/src/main/java/io/papermc/paper/registry/RegistryKey.java diff --git a/src/main/java/io/papermc/paper/registry/RegistryKey.java b/src/main/java/io/papermc/paper/registry/RegistryKey.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..76daccf4ea502e1747a6f9176dc16fd20c561286 index 0000000000000000000000000000000000000000..647f6a1ec1f9d3c203b41f90a99bfd415bf67366
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/registry/RegistryKey.java +++ b/src/main/java/io/papermc/paper/registry/RegistryKey.java
@@ -0,0 +1,147 @@ @@ -0,0 +1,196 @@
+package io.papermc.paper.registry; +package io.papermc.paper.registry;
+ +
+import net.kyori.adventure.key.Keyed; +import net.kyori.adventure.key.Keyed;
@ -114,12 +114,14 @@ index 0000000000000000000000000000000000000000..76daccf4ea502e1747a6f9176dc16fd2
+import org.bukkit.generator.structure.Structure; +import org.bukkit.generator.structure.Structure;
+import org.bukkit.generator.structure.StructureType; +import org.bukkit.generator.structure.StructureType;
+import org.bukkit.inventory.ItemType; +import org.bukkit.inventory.ItemType;
+import org.bukkit.inventory.MenuType;
+import org.bukkit.inventory.meta.trim.TrimMaterial; +import org.bukkit.inventory.meta.trim.TrimMaterial;
+import org.bukkit.inventory.meta.trim.TrimPattern; +import org.bukkit.inventory.meta.trim.TrimPattern;
+import org.bukkit.map.MapCursor; +import org.bukkit.map.MapCursor;
+import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionEffectType;
+import org.bukkit.potion.PotionType; +import org.bukkit.potion.PotionType;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+ +
+import static io.papermc.paper.registry.RegistryKeyImpl.create; +import static io.papermc.paper.registry.RegistryKeyImpl.create;
+ +
@ -136,6 +138,7 @@ index 0000000000000000000000000000000000000000..76daccf4ea502e1747a6f9176dc16fd2
+ * @param <T> the value type + * @param <T> the value type
+ */ + */
+@SuppressWarnings("unused") +@SuppressWarnings("unused")
+@NullMarked
+public sealed interface RegistryKey<T> extends Keyed permits RegistryKeyImpl { +public sealed interface RegistryKey<T> extends Keyed permits RegistryKeyImpl {
+ +
+ /* ******************* * + /* ******************* *
@ -152,11 +155,6 @@ index 0000000000000000000000000000000000000000..76daccf4ea502e1747a6f9176dc16fd2
+ */ + */
+ RegistryKey<StructureType> STRUCTURE_TYPE = create("worldgen/structure_type"); + RegistryKey<StructureType> STRUCTURE_TYPE = create("worldgen/structure_type");
+ /** + /**
+ * Built-in registry for instruments.
+ * @see io.papermc.paper.registry.keys.InstrumentKeys
+ */
+ RegistryKey<MusicInstrument> INSTRUMENT = create("instrument");
+ /**
+ * Built-in registry for potion effect types (mob effects). + * Built-in registry for potion effect types (mob effects).
+ * @see io.papermc.paper.registry.keys.MobEffectKeys + * @see io.papermc.paper.registry.keys.MobEffectKeys
+ */ + */
@ -171,6 +169,52 @@ index 0000000000000000000000000000000000000000..76daccf4ea502e1747a6f9176dc16fd2
+ */ + */
+ @ApiStatus.Internal + @ApiStatus.Internal
+ RegistryKey<ItemType> ITEM = create("item"); + RegistryKey<ItemType> ITEM = create("item");
+ /**
+ * Built-in registry for cat variants.
+ * @see io.papermc.paper.registry.keys.CatVariantKeys
+ */
+ RegistryKey<Cat.Type> CAT_VARIANT = create("cat_variant");
+ /**
+ * Built-in registry for frog variants.
+ * @see io.papermc.paper.registry.keys.FrogVariantKeys
+ */
+ RegistryKey<Frog.Variant> FROG_VARIANT = create("frog_variant");
+ /**
+ * Built-in registry for villager professions.
+ * @see io.papermc.paper.registry.keys.VillagerProfessionKeys
+ */
+ RegistryKey<Villager.Profession> VILLAGER_PROFESSION = create("villager_profession");
+ /**
+ * Built-in registry for villager types.
+ * @see io.papermc.paper.registry.keys.VillagerTypeKeys
+ */
+ RegistryKey<Villager.Type> VILLAGER_TYPE = create("villager_type");
+ /**
+ * Built-in registry for map decoration types.
+ * @see io.papermc.paper.registry.keys.MapDecorationTypeKeys
+ */
+ RegistryKey<MapCursor.Type> MAP_DECORATION_TYPE = create("map_decoration_type");
+ /**
+ * Built-in registry for menu types.
+ * @see io.papermc.paper.registry.keys.MenuTypeKeys
+ */
+ RegistryKey<MenuType> MENU = create("menu");
+ /**
+ * Built-in registry for attributes.
+ * @see io.papermc.paper.registry.keys.AttributeKeys
+ */
+ RegistryKey<Attribute> ATTRIBUTE = create("attribute");
+ /**
+ * Built-in registry for fluids.
+ * @see io.papermc.paper.registry.keys.FluidKeys
+ */
+ RegistryKey<Fluid> FLUID = create("fluid");
+ /**
+ * Built-in registry for sound events.
+ * @see io.papermc.paper.registry.keys.SoundEventKeys
+ */
+ RegistryKey<Sound> SOUND_EVENT = create("sound_event");
+
+ +
+ +
+ /* ********************** * + /* ********************** *
@ -213,44 +257,51 @@ index 0000000000000000000000000000000000000000..76daccf4ea502e1747a6f9176dc16fd2
+ RegistryKey<Enchantment> ENCHANTMENT = create("enchantment"); + RegistryKey<Enchantment> ENCHANTMENT = create("enchantment");
+ /** + /**
+ * Data-driven registry for jukebox songs. + * Data-driven registry for jukebox songs.
+ * @see io.papermc.paper.registry.keys.JukeboxSongKeys
+ */ + */
+ @ApiStatus.Experimental
+ RegistryKey<JukeboxSong> JUKEBOX_SONG = create("jukebox_song"); + RegistryKey<JukeboxSong> JUKEBOX_SONG = create("jukebox_song");
+ /**
+ * Data-driven registry for banner patterns.
+ * @see io.papermc.paper.registry.keys.BannerPatternKeys
+ */
+ RegistryKey<PatternType> BANNER_PATTERN = create("banner_pattern");
+ /**
+ * Data-driven registry for painting variants.
+ * @see io.papermc.paper.registry.keys.PaintingVariantKeys
+ */
+ RegistryKey<Art> PAINTING_VARIANT = create("painting_variant");
+ /**
+ * Data-driven registry for instruments.
+ * @see io.papermc.paper.registry.keys.InstrumentKeys
+ */
+ RegistryKey<MusicInstrument> INSTRUMENT = create("instrument");
+ +
+ +
+ /* ******************* * + /* ******************* *
+ * API-only Registries * + * API-only Registries *
+ * ******************* */ + * ******************* */
+ RegistryKey<Art> PAINTING_VARIANT = create("painting_variant");
+ RegistryKey<Attribute> ATTRIBUTE = create("attribute");
+ RegistryKey<PatternType> BANNER_PATTERN = create("banner_pattern");
+ RegistryKey<Cat.Type> CAT_VARIANT = create("cat_variant");
+ RegistryKey<EntityType> ENTITY_TYPE = create("entity_type"); + RegistryKey<EntityType> ENTITY_TYPE = create("entity_type");
+ RegistryKey<Particle> PARTICLE_TYPE = create("particle_type"); + RegistryKey<Particle> PARTICLE_TYPE = create("particle_type");
+ RegistryKey<PotionType> POTION = create("potion"); + RegistryKey<PotionType> POTION = create("potion");
+ RegistryKey<Sound> SOUND_EVENT = create("sound_event");
+ RegistryKey<Villager.Profession> VILLAGER_PROFESSION = create("villager_profession");
+ RegistryKey<Villager.Type> VILLAGER_TYPE = create("villager_type");
+ RegistryKey<MemoryKey<?>> MEMORY_MODULE_TYPE = create("memory_module_type"); + RegistryKey<MemoryKey<?>> MEMORY_MODULE_TYPE = create("memory_module_type");
+ RegistryKey<Fluid> FLUID = create("fluid");
+ RegistryKey<Frog.Variant> FROG_VARIANT = create("frog_variant");
+ RegistryKey<MapCursor.Type> MAP_DECORATION_TYPE = create("map_decoration_type");
+} +}
diff --git a/src/main/java/io/papermc/paper/registry/RegistryKeyImpl.java b/src/main/java/io/papermc/paper/registry/RegistryKeyImpl.java diff --git a/src/main/java/io/papermc/paper/registry/RegistryKeyImpl.java b/src/main/java/io/papermc/paper/registry/RegistryKeyImpl.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..791813220b2504214b1adecc69093cd600fb0f8c index 0000000000000000000000000000000000000000..80e3e64f47ac55a4978c9e5b430e2f2d1c871d1b
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/registry/RegistryKeyImpl.java +++ b/src/main/java/io/papermc/paper/registry/RegistryKeyImpl.java
@@ -0,0 +1,24 @@ @@ -0,0 +1,26 @@
+package io.papermc.paper.registry; +package io.papermc.paper.registry;
+ +
+import com.google.common.collect.Sets; +import com.google.common.collect.Sets;
+import java.util.Set; +import java.util.Set;
+import net.kyori.adventure.key.Key; +import net.kyori.adventure.key.Key;
+import org.intellij.lang.annotations.Subst; +import org.intellij.lang.annotations.Subst;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+ +
+record RegistryKeyImpl<T>(@NotNull Key key) implements RegistryKey<T> { +@NullMarked
+record RegistryKeyImpl<T>(Key key) implements RegistryKey<T> {
+ +
+ static final Set<RegistryKey<?>> REGISTRY_KEYS = Sets.newIdentityHashSet(); + static final Set<RegistryKey<?>> REGISTRY_KEYS = Sets.newIdentityHashSet();
+ +
@ -268,16 +319,16 @@ index 0000000000000000000000000000000000000000..791813220b2504214b1adecc69093cd6
+} +}
diff --git a/src/main/java/io/papermc/paper/registry/TypedKey.java b/src/main/java/io/papermc/paper/registry/TypedKey.java diff --git a/src/main/java/io/papermc/paper/registry/TypedKey.java b/src/main/java/io/papermc/paper/registry/TypedKey.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..6f5a062ba7ee7173468ecea3c1855a233bf3855e index 0000000000000000000000000000000000000000..81bee5224196008662ddda528b5dcb8dd7cb9f21
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/registry/TypedKey.java +++ b/src/main/java/io/papermc/paper/registry/TypedKey.java
@@ -0,0 +1,44 @@ @@ -0,0 +1,45 @@
+package io.papermc.paper.registry; +package io.papermc.paper.registry;
+ +
+import net.kyori.adventure.key.Key; +import net.kyori.adventure.key.Key;
+import net.kyori.adventure.key.Keyed; +import net.kyori.adventure.key.Keyed;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Represents a key for a value in a specific registry. + * Represents a key for a value in a specific registry.
@ -285,7 +336,8 @@ index 0000000000000000000000000000000000000000..6f5a062ba7ee7173468ecea3c1855a23
+ * @param <T> the value type for the registry + * @param <T> the value type for the registry
+ */ + */
+@ApiStatus.Experimental +@ApiStatus.Experimental
+public sealed interface TypedKey<T> extends Keyed permits TypedKeyImpl { +@NullMarked
+public sealed interface TypedKey<T> extends Key permits TypedKeyImpl {
+ +
+ /** + /**
+ * Gets the key for the value in the registry. + * Gets the key for the value in the registry.
@ -293,7 +345,7 @@ index 0000000000000000000000000000000000000000..6f5a062ba7ee7173468ecea3c1855a23
+ * @return the value's key + * @return the value's key
+ */ + */
+ @Override + @Override
+ @NotNull Key key(); + Key key();
+ +
+ /** + /**
+ * Gets the registry key for the value this key + * Gets the registry key for the value this key
@ -301,7 +353,7 @@ index 0000000000000000000000000000000000000000..6f5a062ba7ee7173468ecea3c1855a23
+ * + *
+ * @return the registry key + * @return the registry key
+ */ + */
+ @NotNull RegistryKey<T> registryKey(); + RegistryKey<T> registryKey();
+ +
+ /** + /**
+ * Create a typed key from a key and a registry key. + * Create a typed key from a key and a registry key.
@ -312,32 +364,51 @@ index 0000000000000000000000000000000000000000..6f5a062ba7ee7173468ecea3c1855a23
+ * @return a new key for the value key and registry key + * @return a new key for the value key and registry key
+ */ + */
+ @ApiStatus.Experimental + @ApiStatus.Experimental
+ static <T> @NotNull TypedKey<T> create(final @NotNull RegistryKey<T> registryKey, final @NotNull Key key) { + static <T> TypedKey<T> create(final RegistryKey<T> registryKey, final Key key) {
+ return new TypedKeyImpl<>(key, registryKey); + return new TypedKeyImpl<>(key, registryKey);
+ } + }
+} +}
diff --git a/src/main/java/io/papermc/paper/registry/TypedKeyImpl.java b/src/main/java/io/papermc/paper/registry/TypedKeyImpl.java diff --git a/src/main/java/io/papermc/paper/registry/TypedKeyImpl.java b/src/main/java/io/papermc/paper/registry/TypedKeyImpl.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..1a97b3359c4ece5c29131da7c3f208aaa8fab66e index 0000000000000000000000000000000000000000..3e29f7007500582cdc3f84b91f11ebeb58f68bbf
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/registry/TypedKeyImpl.java +++ b/src/main/java/io/papermc/paper/registry/TypedKeyImpl.java
@@ -0,0 +1,8 @@ @@ -0,0 +1,23 @@
+package io.papermc.paper.registry; +package io.papermc.paper.registry;
+ +
+import net.kyori.adventure.key.Key; +import net.kyori.adventure.key.Key;
+import net.kyori.adventure.key.Keyed; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.NotNull;
+ +
+record TypedKeyImpl<T>(@NotNull Key key, @NotNull RegistryKey<T> registryKey) implements TypedKey<T> { +@NullMarked
+record TypedKeyImpl<T>(Key key, RegistryKey<T> registryKey) implements TypedKey<T> {
+ // Wrap key methods to make this easier to use
+ @Override
+ public String namespace() {
+ return this.key.namespace();
+ }
+
+ @Override
+ public String value() {
+ return this.key.value();
+ }
+
+ @Override
+ public String asString() {
+ return this.key.asString();
+ }
+} +}
diff --git a/src/main/java/org/bukkit/MinecraftExperimental.java b/src/main/java/org/bukkit/MinecraftExperimental.java diff --git a/src/main/java/org/bukkit/MinecraftExperimental.java b/src/main/java/org/bukkit/MinecraftExperimental.java
index a86b87e4c3332202e40e484c3f9c6562b419c70f..305532968f9f7dd497c77259ed147ea2f081bc74 100644 index b7845523e8587e13b86516c0012fe097d904846c..d92a75f610cb2a95203b3f22dc67bdbfb5c3405a 100644
--- a/src/main/java/org/bukkit/MinecraftExperimental.java --- a/src/main/java/org/bukkit/MinecraftExperimental.java
+++ b/src/main/java/org/bukkit/MinecraftExperimental.java +++ b/src/main/java/org/bukkit/MinecraftExperimental.java
@@ -47,5 +47,6 @@ public @interface MinecraftExperimental { @@ -48,5 +48,10 @@ public @interface MinecraftExperimental {
@ApiStatus.Internal
public enum Requires { public enum Requires {
+ BUNDLE, TRADE_REBALANCE // Paper WINTER_DROP,
+ // Paper start
+ TRADE_REBALANCE,
+ REDSTONE_EXPERIMENTS,
+ MINECART_IMPROVEMENTS
+ // Paper end
} }
} }

Datei anzeigen

@ -6,10 +6,10 @@ Subject: [PATCH] Add FastUtil to Bukkit
Doesn't expose to plugins, just allows Paper-API to use it for optimization Doesn't expose to plugins, just allows Paper-API to use it for optimization
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index f11a22ab01e97e51619c96f2d8a78a99297efc59..2f266350a787a4cfdfda1b0e760bfb7604cac43c 100644 index 89208fed89181f890bb7a2bb237ed744ec2aea96..1a80f7c7e7f4ae9857b732897dc2ee7cfc187626 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -23,6 +23,7 @@ dependencies { @@ -35,6 +35,7 @@ dependencies {
api("com.googlecode.json-simple:json-simple:1.1.1") { api("com.googlecode.json-simple:json-simple:1.1.1") {
isTransitive = false // includes junit isTransitive = false // includes junit
} }

Datei-Diff unterdrückt, da er zu groß ist Diff laden

Datei anzeigen

@ -6,22 +6,25 @@ Subject: [PATCH] Paper Utils
diff --git a/src/main/java/com/destroystokyo/paper/util/SneakyThrow.java b/src/main/java/com/destroystokyo/paper/util/SneakyThrow.java diff --git a/src/main/java/com/destroystokyo/paper/util/SneakyThrow.java b/src/main/java/com/destroystokyo/paper/util/SneakyThrow.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..9db0056ab94145819628b3ad8d8d26130d117fcf index 0000000000000000000000000000000000000000..fbcd82b513b4cb9839f9d2b38d9c6c73148e30a6
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/util/SneakyThrow.java +++ b/src/main/java/com/destroystokyo/paper/util/SneakyThrow.java
@@ -0,0 +1,16 @@ @@ -0,0 +1,19 @@
+package com.destroystokyo.paper.util; +package com.destroystokyo.paper.util;
+ +
+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+ +
+public class SneakyThrow { +@ApiStatus.Internal
+@NullMarked
+public final class SneakyThrow {
+ +
+ public static void sneaky(@NotNull Throwable exception) { + public static void sneaky(final Throwable exception) {
+ SneakyThrow.<RuntimeException>throwSneaky(exception); + SneakyThrow.throwSneaky(exception);
+ } + }
+ +
+ @SuppressWarnings("unchecked") + @SuppressWarnings("unchecked")
+ private static <T extends Throwable> void throwSneaky(@NotNull Throwable exception) throws T { + private static <T extends Throwable> void throwSneaky(final Throwable exception) throws T {
+ throw (T) exception; + throw (T) exception;
+ } + }
+ +

Datei anzeigen

@ -6,142 +6,153 @@ Subject: [PATCH] Use ASM for event executors.
Uses method handles for private or static methods. Uses method handles for private or static methods.
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index af3514113abdf3f42c41f1e7ff0f930cc1a417f5..ed0b67ac322aa22b191cd35502ae5b4f20af19f8 100644 index f57827e724bff2bf586b468cc4e5ba6a1901bd57..783513d3c7ea143997f2eb1a1b53826e51a51079 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -47,6 +47,9 @@ dependencies { @@ -59,6 +59,9 @@ dependencies {
apiAndDocs("net.kyori:adventure-text-serializer-legacy") apiAndDocs("net.kyori:adventure-text-serializer-legacy")
apiAndDocs("net.kyori:adventure-text-serializer-plain") apiAndDocs("net.kyori:adventure-text-serializer-plain")
apiAndDocs("net.kyori:adventure-text-logger-slf4j") apiAndDocs("net.kyori:adventure-text-logger-slf4j")
+ +
+ implementation("org.ow2.asm:asm:9.7") + implementation("org.ow2.asm:asm:9.7.1")
+ implementation("org.ow2.asm:asm-commons:9.7") + implementation("org.ow2.asm:asm-commons:9.7.1")
// Paper end // Paper end
compileOnly("org.apache.maven:maven-resolver-provider:3.9.6") compileOnly("org.apache.maven:maven-resolver-provider:3.9.6")
diff --git a/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java b/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java diff --git a/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java b/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..5b28e9b1daba7834af67dbc193dd656bedd9a994 index 0000000000000000000000000000000000000000..5a702481d28d90cb503faad0d9b9c3231bbff940
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java +++ b/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java
@@ -0,0 +1,42 @@ @@ -0,0 +1,46 @@
+package com.destroystokyo.paper.event.executor; +package com.destroystokyo.paper.event.executor;
+ +
+import com.destroystokyo.paper.util.SneakyThrow;
+import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Method; +import java.lang.reflect.Method;
+
+import com.destroystokyo.paper.util.SneakyThrow;
+import org.bukkit.event.Event; +import org.bukkit.event.Event;
+import org.bukkit.event.EventException; +import org.bukkit.event.EventException;
+import org.bukkit.event.Listener; +import org.bukkit.event.Listener;
+import org.bukkit.plugin.EventExecutor; +import org.bukkit.plugin.EventExecutor;
+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+ +
+@ApiStatus.Internal
+@NullMarked
+public class MethodHandleEventExecutor implements EventExecutor { +public class MethodHandleEventExecutor implements EventExecutor {
+
+ private final Class<? extends Event> eventClass; + private final Class<? extends Event> eventClass;
+ private final MethodHandle handle; + private final MethodHandle handle;
+ +
+ public MethodHandleEventExecutor(@NotNull Class<? extends Event> eventClass, @NotNull MethodHandle handle) { + public MethodHandleEventExecutor(final Class<? extends Event> eventClass, final MethodHandle handle) {
+ this.eventClass = eventClass; + this.eventClass = eventClass;
+ this.handle = handle; + this.handle = handle;
+ } + }
+ +
+ public MethodHandleEventExecutor(@NotNull Class<? extends Event> eventClass, @NotNull Method m) { + public MethodHandleEventExecutor(final Class<? extends Event> eventClass, final Method m) {
+ this.eventClass = eventClass; + this.eventClass = eventClass;
+ try { + try {
+ m.setAccessible(true); + m.setAccessible(true);
+ this.handle = MethodHandles.lookup().unreflect(m); + this.handle = MethodHandles.lookup().unreflect(m);
+ } catch (IllegalAccessException e) { + } catch (final IllegalAccessException e) {
+ throw new AssertionError("Unable to set accessible", e); + throw new AssertionError("Unable to set accessible", e);
+ } + }
+ } + }
+ +
+ @Override + @Override
+ public void execute(@NotNull Listener listener, @NotNull Event event) throws EventException { + public void execute(final Listener listener, final Event event) throws EventException {
+ if (!eventClass.isInstance(event)) return; + if (!this.eventClass.isInstance(event)) return;
+ try { + try {
+ handle.invoke(listener, event); + this.handle.invoke(listener, event);
+ } catch (Throwable t) { + } catch (final Throwable t) {
+ SneakyThrow.sneaky(t); + SneakyThrow.sneaky(t);
+ } + }
+ } + }
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java b/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java diff --git a/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java b/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..827f2b27f70a7ec0bc11d039305c3e58c02a4ef4 index 0000000000000000000000000000000000000000..bbdb5b472df116b71c459bdc6cc4b74267ea0f5e
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java +++ b/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java
@@ -0,0 +1,42 @@ @@ -0,0 +1,44 @@
+package com.destroystokyo.paper.event.executor; +package com.destroystokyo.paper.event.executor;
+ +
+import com.destroystokyo.paper.util.SneakyThrow;
+import com.google.common.base.Preconditions;
+import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Method; +import java.lang.reflect.Method;
+import java.lang.reflect.Modifier; +import java.lang.reflect.Modifier;
+
+import com.destroystokyo.paper.util.SneakyThrow;
+import com.google.common.base.Preconditions;
+
+import org.bukkit.event.Event; +import org.bukkit.event.Event;
+import org.bukkit.event.EventException; +import org.bukkit.event.EventException;
+import org.bukkit.event.Listener; +import org.bukkit.event.Listener;
+import org.bukkit.plugin.EventExecutor; +import org.bukkit.plugin.EventExecutor;
+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+ +
+@ApiStatus.Internal
+@NullMarked
+public class StaticMethodHandleEventExecutor implements EventExecutor { +public class StaticMethodHandleEventExecutor implements EventExecutor {
+
+ private final Class<? extends Event> eventClass; + private final Class<? extends Event> eventClass;
+ private final MethodHandle handle; + private final MethodHandle handle;
+ +
+ public StaticMethodHandleEventExecutor(@NotNull Class<? extends Event> eventClass, @NotNull Method m) { + public StaticMethodHandleEventExecutor(final Class<? extends Event> eventClass, final Method m) {
+ Preconditions.checkArgument(Modifier.isStatic(m.getModifiers()), "Not a static method: %s", m); + Preconditions.checkArgument(Modifier.isStatic(m.getModifiers()), "Not a static method: %s", m);
+ Preconditions.checkArgument(eventClass != null, "eventClass is null"); + Preconditions.checkArgument(eventClass != null, "eventClass is null");
+ this.eventClass = eventClass; + this.eventClass = eventClass;
+ try { + try {
+ m.setAccessible(true); + m.setAccessible(true);
+ this.handle = MethodHandles.lookup().unreflect(m); + this.handle = MethodHandles.lookup().unreflect(m);
+ } catch (IllegalAccessException e) { + } catch (final IllegalAccessException e) {
+ throw new AssertionError("Unable to set accessible", e); + throw new AssertionError("Unable to set accessible", e);
+ } + }
+ } + }
+ +
+ @Override + @Override
+ public void execute(@NotNull Listener listener, @NotNull Event event) throws EventException { + public void execute(final Listener listener, final Event event) throws EventException {
+ if (!eventClass.isInstance(event)) return; + if (!this.eventClass.isInstance(event)) return;
+ try { + try {
+ handle.invoke(event); + this.handle.invoke(event);
+ } catch (Throwable throwable) { + } catch (final Throwable throwable) {
+ SneakyThrow.sneaky(throwable); + SneakyThrow.sneaky(throwable);
+ } + }
+ } + }
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/event/executor/asm/ASMEventExecutorGenerator.java b/src/main/java/com/destroystokyo/paper/event/executor/asm/ASMEventExecutorGenerator.java diff --git a/src/main/java/com/destroystokyo/paper/event/executor/asm/ASMEventExecutorGenerator.java b/src/main/java/com/destroystokyo/paper/event/executor/asm/ASMEventExecutorGenerator.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..084c31af1a7ba32bb4c3dc8f16f67fd09ce0b6a4 index 0000000000000000000000000000000000000000..abfcb6e8383ff311940d82afe4ff990649a082dc
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/executor/asm/ASMEventExecutorGenerator.java +++ b/src/main/java/com/destroystokyo/paper/event/executor/asm/ASMEventExecutorGenerator.java
@@ -0,0 +1,54 @@ @@ -0,0 +1,59 @@
+package com.destroystokyo.paper.event.executor.asm; +package com.destroystokyo.paper.event.executor.asm;
+ +
+import java.lang.reflect.Method; +import java.lang.reflect.Method;
+import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicInteger;
+
+import org.bukkit.plugin.EventExecutor; +import org.bukkit.plugin.EventExecutor;
+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Type; +import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.GeneratorAdapter; +import org.objectweb.asm.commons.GeneratorAdapter;
+ +
+import static org.objectweb.asm.Opcodes.*; +import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.INVOKEINTERFACE;
+import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
+import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
+import static org.objectweb.asm.Opcodes.V1_8;
+ +
+public class ASMEventExecutorGenerator { +@ApiStatus.Internal
+@NullMarked
+public final class ASMEventExecutorGenerator {
+ +
+ private static final String EXECUTE_DESCRIPTOR = "(Lorg/bukkit/event/Listener;Lorg/bukkit/event/Event;)V"; + private static final String EXECUTE_DESCRIPTOR = "(Lorg/bukkit/event/Listener;Lorg/bukkit/event/Event;)V";
+ +
+ @NotNull + public static byte[] generateEventExecutor(final Method m, final String name) {
+ public static byte[] generateEventExecutor(@NotNull Method m, @NotNull String name) { + final ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
+ ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); + writer.visit(V1_8, ACC_PUBLIC, name.replace('.', '/'), null, Type.getInternalName(Object.class), new String[]{Type.getInternalName(EventExecutor.class)});
+ writer.visit(V1_8, ACC_PUBLIC, name.replace('.', '/'), null, Type.getInternalName(Object.class), new String[] {Type.getInternalName(EventExecutor.class)});
+ // Generate constructor + // Generate constructor
+ GeneratorAdapter methodGenerator = new GeneratorAdapter(writer.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null), ACC_PUBLIC, "<init>", "()V"); + GeneratorAdapter methodGenerator = new GeneratorAdapter(writer.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null), ACC_PUBLIC, "<init>", "()V");
+ methodGenerator.loadThis(); + methodGenerator.loadThis();
@ -169,22 +180,25 @@ index 0000000000000000000000000000000000000000..084c31af1a7ba32bb4c3dc8f16f67fd0
+ } + }
+ +
+ public static AtomicInteger NEXT_ID = new AtomicInteger(1); + public static AtomicInteger NEXT_ID = new AtomicInteger(1);
+ @NotNull +
+ public static String generateName() { + public static String generateName() {
+ int id = NEXT_ID.getAndIncrement(); + final int id = NEXT_ID.getAndIncrement();
+ return "com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor" + id; + return "com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor" + id;
+ } + }
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/event/executor/asm/ClassDefiner.java b/src/main/java/com/destroystokyo/paper/event/executor/asm/ClassDefiner.java diff --git a/src/main/java/com/destroystokyo/paper/event/executor/asm/ClassDefiner.java b/src/main/java/com/destroystokyo/paper/event/executor/asm/ClassDefiner.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..f79685b48bb581277a6891927988b6f7a4389dc4 index 0000000000000000000000000000000000000000..581561fbd32c81ab1774ba8f0b7f3cec9392d99a
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/executor/asm/ClassDefiner.java +++ b/src/main/java/com/destroystokyo/paper/event/executor/asm/ClassDefiner.java
@@ -0,0 +1,34 @@ @@ -0,0 +1,35 @@
+package com.destroystokyo.paper.event.executor.asm; +package com.destroystokyo.paper.event.executor.asm;
+ +
+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+ +
+@ApiStatus.Internal
+@NullMarked
+public interface ClassDefiner { +public interface ClassDefiner {
+ +
+ /** + /**
@ -192,7 +206,7 @@ index 0000000000000000000000000000000000000000..f79685b48bb581277a6891927988b6f7
+ * + *
+ * @return if classes bypass access checks + * @return if classes bypass access checks
+ */ + */
+ public default boolean isBypassAccessChecks() { + default boolean isBypassAccessChecks() {
+ return false; + return false;
+ } + }
+ +
@ -206,79 +220,79 @@ index 0000000000000000000000000000000000000000..f79685b48bb581277a6891927988b6f7
+ * @throws ClassFormatError if the class data is invalid + * @throws ClassFormatError if the class data is invalid
+ * @throws NullPointerException if any of the arguments are null + * @throws NullPointerException if any of the arguments are null
+ */ + */
+ @NotNull + Class<?> defineClass(ClassLoader parentLoader, String name, byte[] data);
+ public Class<?> defineClass(@NotNull ClassLoader parentLoader, @NotNull String name, @NotNull byte[] data);
+ +
+ @NotNull + static ClassDefiner getInstance() {
+ public static ClassDefiner getInstance() {
+ return SafeClassDefiner.INSTANCE; + return SafeClassDefiner.INSTANCE;
+ } + }
+ +
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/event/executor/asm/SafeClassDefiner.java b/src/main/java/com/destroystokyo/paper/event/executor/asm/SafeClassDefiner.java diff --git a/src/main/java/com/destroystokyo/paper/event/executor/asm/SafeClassDefiner.java b/src/main/java/com/destroystokyo/paper/event/executor/asm/SafeClassDefiner.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..abcc966d8ee01d73c1d1480237ab46fa0ab55fdc index 0000000000000000000000000000000000000000..48bcc72293c2a31b6e2dd2dcd6a79d618c72a137
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/executor/asm/SafeClassDefiner.java +++ b/src/main/java/com/destroystokyo/paper/event/executor/asm/SafeClassDefiner.java
@@ -0,0 +1,64 @@ @@ -0,0 +1,66 @@
+package com.destroystokyo.paper.event.executor.asm; +package com.destroystokyo.paper.event.executor.asm;
+ +
+import java.util.concurrent.ConcurrentMap;
+
+import com.google.common.base.Preconditions; +import com.google.common.base.Preconditions;
+
+import com.google.common.collect.MapMaker; +import com.google.common.collect.MapMaker;
+import org.jetbrains.annotations.NotNull; +import java.util.concurrent.ConcurrentMap;
+import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+ +
+@ApiStatus.Internal
+@NullMarked
+public class SafeClassDefiner implements ClassDefiner { +public class SafeClassDefiner implements ClassDefiner {
+
+ /* default */ static final SafeClassDefiner INSTANCE = new SafeClassDefiner(); + /* default */ static final SafeClassDefiner INSTANCE = new SafeClassDefiner();
+ +
+ private SafeClassDefiner() {} + private SafeClassDefiner() {
+ }
+ +
+ private final ConcurrentMap<ClassLoader, GeneratedClassLoader> loaders = new MapMaker().weakKeys().makeMap(); + private final ConcurrentMap<ClassLoader, GeneratedClassLoader> loaders = new MapMaker().weakKeys().makeMap();
+ +
+ @NotNull
+ @Override + @Override
+ public Class<?> defineClass(@NotNull ClassLoader parentLoader, @NotNull String name, @NotNull byte[] data) { + public Class<?> defineClass(final ClassLoader parentLoader, final String name, final byte[] data) {
+ GeneratedClassLoader loader = loaders.computeIfAbsent(parentLoader, GeneratedClassLoader::new); + final GeneratedClassLoader loader = this.loaders.computeIfAbsent(parentLoader, GeneratedClassLoader::new);
+ synchronized (loader.getClassLoadingLock(name)) { + synchronized (loader.getClassLoadingLock(name)) {
+ Preconditions.checkState(!loader.hasClass(name), "%s already defined", name); + Preconditions.checkState(!loader.hasClass(name), "%s already defined", name);
+ Class<?> c = loader.define(name, data); + final Class<?> c = loader.define(name, data);
+ assert c.getName().equals(name); + assert c.getName().equals(name);
+ return c; + return c;
+ } + }
+ } + }
+ +
+ private static class GeneratedClassLoader extends ClassLoader { + private static class GeneratedClassLoader extends ClassLoader {
+
+ static { + static {
+ ClassLoader.registerAsParallelCapable(); + ClassLoader.registerAsParallelCapable();
+ } + }
+ +
+ protected GeneratedClassLoader(@NotNull ClassLoader parent) { + protected GeneratedClassLoader(final ClassLoader parent) {
+ super(parent); + super(parent);
+ } + }
+ +
+ private Class<?> define(@NotNull String name, byte[] data) { + private Class<?> define(final String name, final byte[] data) {
+ synchronized (getClassLoadingLock(name)) { + synchronized (this.getClassLoadingLock(name)) {
+ assert !hasClass(name); + assert !this.hasClass(name);
+ Class<?> c = defineClass(name, data, 0, data.length); + final Class<?> c = this.defineClass(name, data, 0, data.length);
+ resolveClass(c); + this.resolveClass(c);
+ return c; + return c;
+ } + }
+ } + }
+ +
+ @Override + @Override
+ @NotNull + public Object getClassLoadingLock(final String name) {
+ public Object getClassLoadingLock(@NotNull String name) {
+ return super.getClassLoadingLock(name); + return super.getClassLoadingLock(name);
+ } + }
+ +
+ public boolean hasClass(@NotNull String name) { + public boolean hasClass(final String name) {
+ synchronized (getClassLoadingLock(name)) { + synchronized (this.getClassLoadingLock(name)) {
+ try { + try {
+ Class.forName(name); + Class.forName(name);
+ return true; + return true;
+ } catch (ClassNotFoundException e) { + } catch (final ClassNotFoundException e) {
+ return false; + return false;
+ } + }
+ } + }

Datei anzeigen

@ -5,11 +5,11 @@ Subject: [PATCH] Paper Plugins
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index ed0b67ac322aa22b191cd35502ae5b4f20af19f8..258d7010d24c529c9bbc76cc26adf226c641ee58 100644 index 783513d3c7ea143997f2eb1a1b53826e51a51079..5ee8db3fcf3d3ac1c8b998b227aff0965960896a 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -52,7 +52,7 @@ dependencies { @@ -64,7 +64,7 @@ dependencies {
implementation("org.ow2.asm:asm-commons:9.7") implementation("org.ow2.asm:asm-commons:9.7.1")
// Paper end // Paper end
- compileOnly("org.apache.maven:maven-resolver-provider:3.9.6") - compileOnly("org.apache.maven:maven-resolver-provider:3.9.6")
@ -17,7 +17,7 @@ index ed0b67ac322aa22b191cd35502ae5b4f20af19f8..258d7010d24c529c9bbc76cc26adf226
compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18") compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18")
compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18") compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18")
@@ -139,6 +139,7 @@ tasks.withType<Javadoc> { @@ -154,6 +154,7 @@ tasks.withType<Javadoc> {
"https://jd.advntr.dev/text-serializer-plain/$adventureVersion/", "https://jd.advntr.dev/text-serializer-plain/$adventureVersion/",
"https://jd.advntr.dev/text-logger-slf4j/$adventureVersion/", "https://jd.advntr.dev/text-logger-slf4j/$adventureVersion/",
// Paper end // Paper end
@ -27,26 +27,26 @@ index ed0b67ac322aa22b191cd35502ae5b4f20af19f8..258d7010d24c529c9bbc76cc26adf226
diff --git a/src/main/java/io/papermc/paper/plugin/PermissionManager.java b/src/main/java/io/papermc/paper/plugin/PermissionManager.java diff --git a/src/main/java/io/papermc/paper/plugin/PermissionManager.java b/src/main/java/io/papermc/paper/plugin/PermissionManager.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c27846933 index 0000000000000000000000000000000000000000..c78ada48e27c5552529fe8d5bc23db1dac94e481
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/PermissionManager.java +++ b/src/main/java/io/papermc/paper/plugin/PermissionManager.java
@@ -0,0 +1,171 @@ @@ -0,0 +1,166 @@
+package io.papermc.paper.plugin; +package io.papermc.paper.plugin;
+ +
+import org.bukkit.permissions.Permissible;
+import org.bukkit.permissions.Permission;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List; +import java.util.List;
+import java.util.Set; +import java.util.Set;
+import org.bukkit.permissions.Permissible;
+import org.bukkit.permissions.Permission;
+import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+ +
+/** +/**
+ * A permission manager implementation to keep backwards compatibility partially alive with existing plugins that used + * A permission manager implementation to keep backwards compatibility partially alive with existing plugins that used
+ * the bukkit one before. + * the bukkit one before.
+ */ + */
+@ApiStatus.Experimental +@ApiStatus.Experimental
+@NullMarked
+public interface PermissionManager { +public interface PermissionManager {
+ +
+ /** + /**
@ -55,8 +55,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * @param name Name of the permission + * @param name Name of the permission
+ * @return Permission, or null if none + * @return Permission, or null if none
+ */ + */
+ @Nullable + @Nullable Permission getPermission(String name);
+ Permission getPermission(@NotNull String name);
+ +
+ /** + /**
+ * Adds a {@link Permission} to this plugin manager. + * Adds a {@link Permission} to this plugin manager.
@ -68,7 +67,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * @throws IllegalArgumentException Thrown when a permission with the same + * @throws IllegalArgumentException Thrown when a permission with the same
+ * name already exists + * name already exists
+ */ + */
+ void addPermission(@NotNull Permission perm); + void addPermission(Permission perm);
+ +
+ /** + /**
+ * Removes a {@link Permission} registration from this plugin manager. + * Removes a {@link Permission} registration from this plugin manager.
@ -81,7 +80,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * + *
+ * @param perm Permission to remove + * @param perm Permission to remove
+ */ + */
+ void removePermission(@NotNull Permission perm); + void removePermission(Permission perm);
+ +
+ /** + /**
+ * Removes a {@link Permission} registration from this plugin manager. + * Removes a {@link Permission} registration from this plugin manager.
@ -94,7 +93,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * + *
+ * @param name Permission to remove + * @param name Permission to remove
+ */ + */
+ void removePermission(@NotNull String name); + void removePermission(String name);
+ +
+ /** + /**
+ * Gets the default permissions for the given op status + * Gets the default permissions for the given op status
@ -102,7 +101,6 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * @param op Which set of default permissions to get + * @param op Which set of default permissions to get
+ * @return The default permissions + * @return The default permissions
+ */ + */
+ @NotNull
+ Set<Permission> getDefaultPermissions(boolean op); + Set<Permission> getDefaultPermissions(boolean op);
+ +
+ /** + /**
@ -113,7 +111,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * + *
+ * @param perm Permission to recalculate + * @param perm Permission to recalculate
+ */ + */
+ void recalculatePermissionDefaults(@NotNull Permission perm); + void recalculatePermissionDefaults(Permission perm);
+ +
+ /** + /**
+ * Subscribes the given Permissible for information about the requested + * Subscribes the given Permissible for information about the requested
@ -125,7 +123,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * @param permission Permission to subscribe to + * @param permission Permission to subscribe to
+ * @param permissible Permissible subscribing + * @param permissible Permissible subscribing
+ */ + */
+ void subscribeToPermission(@NotNull String permission, @NotNull Permissible permissible); + void subscribeToPermission(String permission, Permissible permissible);
+ +
+ /** + /**
+ * Unsubscribes the given Permissible for information about the requested + * Unsubscribes the given Permissible for information about the requested
@ -134,7 +132,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * @param permission Permission to unsubscribe from + * @param permission Permission to unsubscribe from
+ * @param permissible Permissible subscribing + * @param permissible Permissible subscribing
+ */ + */
+ void unsubscribeFromPermission(@NotNull String permission, @NotNull Permissible permissible); + void unsubscribeFromPermission(String permission, Permissible permissible);
+ +
+ /** + /**
+ * Gets a set containing all subscribed {@link Permissible}s to the given + * Gets a set containing all subscribed {@link Permissible}s to the given
@ -143,8 +141,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * @param permission Permission to query for + * @param permission Permission to query for
+ * @return Set containing all subscribed permissions + * @return Set containing all subscribed permissions
+ */ + */
+ @NotNull + Set<Permissible> getPermissionSubscriptions(String permission);
+ Set<Permissible> getPermissionSubscriptions(@NotNull String permission);
+ +
+ /** + /**
+ * Subscribes to the given Default permissions by operator status + * Subscribes to the given Default permissions by operator status
@ -155,7 +152,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * @param op Default list to subscribe to + * @param op Default list to subscribe to
+ * @param permissible Permissible subscribing + * @param permissible Permissible subscribing
+ */ + */
+ void subscribeToDefaultPerms(boolean op, @NotNull Permissible permissible); + void subscribeToDefaultPerms(boolean op, Permissible permissible);
+ +
+ /** + /**
+ * Unsubscribes from the given Default permissions by operator status + * Unsubscribes from the given Default permissions by operator status
@ -163,7 +160,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * @param op Default list to unsubscribe from + * @param op Default list to unsubscribe from
+ * @param permissible Permissible subscribing + * @param permissible Permissible subscribing
+ */ + */
+ void unsubscribeFromDefaultPerms(boolean op, @NotNull Permissible permissible); + void unsubscribeFromDefaultPerms(boolean op, Permissible permissible);
+ +
+ /** + /**
+ * Gets a set containing all subscribed {@link Permissible}s to the given + * Gets a set containing all subscribed {@link Permissible}s to the given
@ -172,7 +169,6 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * @param op Default list to query for + * @param op Default list to query for
+ * @return Set containing all subscribed permissions + * @return Set containing all subscribed permissions
+ */ + */
+ @NotNull
+ Set<Permissible> getDefaultPermSubscriptions(boolean op); + Set<Permissible> getDefaultPermSubscriptions(boolean op);
+ +
+ /** + /**
@ -182,7 +178,6 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * + *
+ * @return Set containing all current registered permissions + * @return Set containing all current registered permissions
+ */ + */
+ @NotNull
+ Set<Permission> getPermissions(); + Set<Permission> getPermissions();
+ +
+ /** + /**
@ -192,7 +187,7 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+ * + *
+ * @param perm permission + * @param perm permission
+ */ + */
+ void addPermissions(@NotNull List<Permission> perm); + void addPermissions(List<Permission> perm);
+ +
+ /** + /**
+ * Clears the current registered permissinos. + * Clears the current registered permissinos.
@ -204,13 +199,14 @@ index 0000000000000000000000000000000000000000..cdbc93b317b3bab47bf6552c29cfbb2c
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/bootstrap/BootstrapContext.java b/src/main/java/io/papermc/paper/plugin/bootstrap/BootstrapContext.java diff --git a/src/main/java/io/papermc/paper/plugin/bootstrap/BootstrapContext.java b/src/main/java/io/papermc/paper/plugin/bootstrap/BootstrapContext.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..70d5f9802f90605a5120ff2a000a2e9395f0aecc index 0000000000000000000000000000000000000000..4c47414fc08e1183b1e59369bacc4d7f7042f262
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/bootstrap/BootstrapContext.java +++ b/src/main/java/io/papermc/paper/plugin/bootstrap/BootstrapContext.java
@@ -0,0 +1,14 @@ @@ -0,0 +1,16 @@
+package io.papermc.paper.plugin.bootstrap; +package io.papermc.paper.plugin.bootstrap;
+ +
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Represents the context provided to a {@link PluginBootstrap} during both the bootstrapping and plugin + * Represents the context provided to a {@link PluginBootstrap} during both the bootstrapping and plugin
@ -219,12 +215,13 @@ index 0000000000000000000000000000000000000000..70d5f9802f90605a5120ff2a000a2e93
+ * like the plugin's configuration or logger during the plugins bootstrap. + * like the plugin's configuration or logger during the plugins bootstrap.
+ */ + */
+@ApiStatus.Experimental +@ApiStatus.Experimental
+@NullMarked
+@ApiStatus.NonExtendable +@ApiStatus.NonExtendable
+public interface BootstrapContext extends PluginProviderContext { +public interface BootstrapContext extends PluginProviderContext {
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/bootstrap/PluginBootstrap.java b/src/main/java/io/papermc/paper/plugin/bootstrap/PluginBootstrap.java diff --git a/src/main/java/io/papermc/paper/plugin/bootstrap/PluginBootstrap.java b/src/main/java/io/papermc/paper/plugin/bootstrap/PluginBootstrap.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..81e09abd2128d8cc54d1fd6454aea7d8d287a11f index 0000000000000000000000000000000000000000..e6696dcd8049e869bd1733f7c67ff802c54d7c37
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/bootstrap/PluginBootstrap.java +++ b/src/main/java/io/papermc/paper/plugin/bootstrap/PluginBootstrap.java
@@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
@ -233,7 +230,7 @@ index 0000000000000000000000000000000000000000..81e09abd2128d8cc54d1fd6454aea7d8
+import io.papermc.paper.plugin.provider.util.ProviderUtil; +import io.papermc.paper.plugin.provider.util.ProviderUtil;
+import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * A plugin bootstrap is meant for loading certain parts of the plugin before the server is loaded. + * A plugin bootstrap is meant for loading certain parts of the plugin before the server is loaded.
@ -245,8 +242,9 @@ index 0000000000000000000000000000000000000000..81e09abd2128d8cc54d1fd6454aea7d8
+ * <p> + * <p>
+ * <b>All calls to Bukkit may throw a NullPointerExceptions or return null unexpectedly. You should only call api methods that are explicitly documented to work in the bootstrapper</b> + * <b>All calls to Bukkit may throw a NullPointerExceptions or return null unexpectedly. You should only call api methods that are explicitly documented to work in the bootstrapper</b>
+ */ + */
+@ApiStatus.OverrideOnly
+@ApiStatus.Experimental +@ApiStatus.Experimental
+@NullMarked
+@ApiStatus.OverrideOnly
+public interface PluginBootstrap { +public interface PluginBootstrap {
+ +
+ /** + /**
@ -254,7 +252,7 @@ index 0000000000000000000000000000000000000000..81e09abd2128d8cc54d1fd6454aea7d8
+ * + *
+ * @param context the server provided context + * @param context the server provided context
+ */ + */
+ void bootstrap(@NotNull BootstrapContext context); + void bootstrap(BootstrapContext context);
+ +
+ /** + /**
+ * Called by the server to instantiate your main class. + * Called by the server to instantiate your main class.
@ -264,25 +262,23 @@ index 0000000000000000000000000000000000000000..81e09abd2128d8cc54d1fd6454aea7d8
+ * @param context the server created bootstrap object + * @param context the server created bootstrap object
+ * @return the server requested instance of the plugins main class. + * @return the server requested instance of the plugins main class.
+ */ + */
+ @NotNull + default JavaPlugin createPlugin(final PluginProviderContext context) {
+ default JavaPlugin createPlugin(@NotNull PluginProviderContext context) {
+ return ProviderUtil.loadClass(context.getConfiguration().getMainClass(), JavaPlugin.class, this.getClass().getClassLoader()); + return ProviderUtil.loadClass(context.getConfiguration().getMainClass(), JavaPlugin.class, this.getClass().getClassLoader());
+ } + }
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/bootstrap/PluginProviderContext.java b/src/main/java/io/papermc/paper/plugin/bootstrap/PluginProviderContext.java diff --git a/src/main/java/io/papermc/paper/plugin/bootstrap/PluginProviderContext.java b/src/main/java/io/papermc/paper/plugin/bootstrap/PluginProviderContext.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..c1ce2a8bdf2e3bd9ad2fc7f32fba46282bea5d1a index 0000000000000000000000000000000000000000..19bb302ab264b72306d9bd15e9c40ade6dde7ee7
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/bootstrap/PluginProviderContext.java +++ b/src/main/java/io/papermc/paper/plugin/bootstrap/PluginProviderContext.java
@@ -0,0 +1,52 @@ @@ -0,0 +1,48 @@
+package io.papermc.paper.plugin.bootstrap; +package io.papermc.paper.plugin.bootstrap;
+ +
+import io.papermc.paper.plugin.configuration.PluginMeta; +import io.papermc.paper.plugin.configuration.PluginMeta;
+import java.nio.file.Path;
+import net.kyori.adventure.text.logger.slf4j.ComponentLogger; +import net.kyori.adventure.text.logger.slf4j.ComponentLogger;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+
+import java.nio.file.Path;
+ +
+/** +/**
+ * Represents the context provided to a {@link PluginBootstrap} during both the bootstrapping and plugin + * Represents the context provided to a {@link PluginBootstrap} during both the bootstrapping and plugin
@ -290,8 +286,9 @@ index 0000000000000000000000000000000000000000..c1ce2a8bdf2e3bd9ad2fc7f32fba4628
+ * A bootstrap context may be used to access data or logic usually provided to {@link org.bukkit.plugin.Plugin} instances + * A bootstrap context may be used to access data or logic usually provided to {@link org.bukkit.plugin.Plugin} instances
+ * like the plugin's configuration or logger during the plugins bootstrap. + * like the plugin's configuration or logger during the plugins bootstrap.
+ */ + */
+@ApiStatus.NonExtendable
+@ApiStatus.Experimental +@ApiStatus.Experimental
+@NullMarked
+@ApiStatus.NonExtendable
+public interface PluginProviderContext { +public interface PluginProviderContext {
+ +
+ /** + /**
@ -299,7 +296,6 @@ index 0000000000000000000000000000000000000000..c1ce2a8bdf2e3bd9ad2fc7f32fba4628
+ * + *
+ * @return the plugin's configuration + * @return the plugin's configuration
+ */ + */
+ @NotNull
+ PluginMeta getConfiguration(); + PluginMeta getConfiguration();
+ +
+ /** + /**
@ -307,7 +303,6 @@ index 0000000000000000000000000000000000000000..c1ce2a8bdf2e3bd9ad2fc7f32fba4628
+ * + *
+ * @return the previously described path + * @return the previously described path
+ */ + */
+ @NotNull
+ Path getDataDirectory(); + Path getDataDirectory();
+ +
+ /** + /**
@ -315,7 +310,6 @@ index 0000000000000000000000000000000000000000..c1ce2a8bdf2e3bd9ad2fc7f32fba4628
+ * + *
+ * @return the logger instance + * @return the logger instance
+ */ + */
+ @NotNull
+ ComponentLogger getLogger(); + ComponentLogger getLogger();
+ +
+ /** + /**
@ -323,33 +317,32 @@ index 0000000000000000000000000000000000000000..c1ce2a8bdf2e3bd9ad2fc7f32fba4628
+ * + *
+ * @return the previously described path + * @return the previously described path
+ */ + */
+ @NotNull
+ Path getPluginSource(); + Path getPluginSource();
+ +
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java b/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java diff --git a/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java b/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9ada2e585f index 0000000000000000000000000000000000000000..3c768d5ccf490e962d9638e92d4ea7c85670bad8
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java +++ b/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java
@@ -0,0 +1,203 @@ @@ -0,0 +1,186 @@
+package io.papermc.paper.plugin.configuration; +package io.papermc.paper.plugin.configuration;
+ +
+import java.util.List;
+import org.bukkit.permissions.Permission; +import org.bukkit.permissions.Permission;
+import org.bukkit.permissions.PermissionDefault; +import org.bukkit.permissions.PermissionDefault;
+import org.bukkit.plugin.PluginLoadOrder; +import org.bukkit.plugin.PluginLoadOrder;
+import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+
+import java.util.List;
+ +
+/** +/**
+ * This class acts as an abstraction for a plugin configuration. + * This class acts as an abstraction for a plugin configuration.
+ */ + */
+@ApiStatus.NonExtendable
+@ApiStatus.Experimental // Subject to change! +@ApiStatus.Experimental // Subject to change!
+@NullMarked
+@ApiStatus.NonExtendable
+public interface PluginMeta { +public interface PluginMeta {
+ +
+ /** + /**
@ -369,7 +362,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return the name of the plugin + * @return the name of the plugin
+ */ + */
+ @NotNull
+ String getName(); + String getName();
+ +
+ /** + /**
@ -377,7 +369,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return a descriptive name of the plugin and respective version + * @return a descriptive name of the plugin and respective version
+ */ + */
+ @NotNull
+ default String getDisplayName() { + default String getDisplayName() {
+ return this.getName() + " v" + this.getVersion(); + return this.getName() + " v" + this.getVersion();
+ } + }
@ -388,7 +379,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return the fully qualified class name of the plugin's main class. + * @return the fully qualified class name of the plugin's main class.
+ */ + */
+ @NotNull
+ String getMainClass(); + String getMainClass();
+ +
+ /** + /**
@ -397,7 +387,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * @return the plugin load order + * @return the plugin load order
+ * @see PluginLoadOrder for further details regards the available load orders. + * @see PluginLoadOrder for further details regards the available load orders.
+ */ + */
+ @NotNull
+ PluginLoadOrder getLoadOrder(); + PluginLoadOrder getLoadOrder();
+ +
+ /** + /**
@ -407,7 +396,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return the string representation of the plugin's version + * @return the string representation of the plugin's version
+ */ + */
+ @NotNull
+ String getVersion(); + String getVersion();
+ +
+ /** + /**
@ -418,8 +406,7 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * @return the specific overwrite of the logger prefix as defined by the plugin. If the plugin did not define a + * @return the specific overwrite of the logger prefix as defined by the plugin. If the plugin did not define a
+ * custom logger prefix, this method will return null + * custom logger prefix, this method will return null
+ */ + */
+ @Nullable + @Nullable String getLoggerPrefix();
+ String getLoggerPrefix();
+ +
+ /** + /**
+ * Provides a list of dependencies that are required for this plugin to load. + * Provides a list of dependencies that are required for this plugin to load.
@ -430,7 +417,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return an immutable list of required dependency names + * @return an immutable list of required dependency names
+ */ + */
+ @NotNull
+ List<String> getPluginDependencies(); + List<String> getPluginDependencies();
+ +
+ /** + /**
@ -443,7 +429,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return immutable list of soft dependencies + * @return immutable list of soft dependencies
+ */ + */
+ @NotNull
+ List<String> getPluginSoftDependencies(); + List<String> getPluginSoftDependencies();
+ +
+ /** + /**
@ -456,7 +441,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return immutable list of plugins to load before this plugin + * @return immutable list of plugins to load before this plugin
+ */ + */
+ @NotNull
+ List<String> getLoadBeforePlugins(); + List<String> getLoadBeforePlugins();
+ +
+ /** + /**
@ -466,7 +450,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return immutable list of provided plugins/dependencies + * @return immutable list of provided plugins/dependencies
+ */ + */
+ @NotNull
+ List<String> getProvidedPlugins(); + List<String> getProvidedPlugins();
+ +
+ /** + /**
@ -475,7 +458,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return an immutable list of the plugin's authors + * @return an immutable list of the plugin's authors
+ */ + */
+ @NotNull
+ List<String> getAuthors(); + List<String> getAuthors();
+ +
+ /** + /**
@ -484,7 +466,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return an immutable list of the plugin's contributors + * @return an immutable list of the plugin's contributors
+ */ + */
+ @NotNull
+ List<String> getContributors(); + List<String> getContributors();
+ +
+ /** + /**
@ -493,8 +474,7 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return description or null if the plugin did not define a human readable description. + * @return description or null if the plugin did not define a human readable description.
+ */ + */
+ @Nullable + @Nullable String getDescription();
+ String getDescription();
+ +
+ /** + /**
+ * Provides the website for the plugin or the plugin's author. + * Provides the website for the plugin or the plugin's author.
@ -502,8 +482,7 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * + *
+ * @return a string representation of the website that serves as the main hub for this plugin/its author. + * @return a string representation of the website that serves as the main hub for this plugin/its author.
+ */ + */
+ @Nullable + @Nullable String getWebsite();
+ String getWebsite();
+ +
+ /** + /**
+ * Provides the list of permissions that are defined via the plugin meta instance. + * Provides the list of permissions that are defined via the plugin meta instance.
@ -511,7 +490,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * @return an immutable list of permissions + * @return an immutable list of permissions
+ */ + */
+ // TODO: Do we even want this? Why not just use the bootstrapper + // TODO: Do we even want this? Why not just use the bootstrapper
+ @NotNull
+ List<Permission> getPermissions(); + List<Permission> getPermissions();
+ +
+ /** + /**
@ -521,7 +499,6 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * @see #getPermissions() + * @see #getPermissions()
+ */ + */
+ // TODO: Do we even want this? Why not just use the bootstrapper + // TODO: Do we even want this? Why not just use the bootstrapper
+ @NotNull
+ PermissionDefault getPermissionDefault(); + PermissionDefault getPermissionDefault();
+ +
+ /** + /**
@ -532,8 +509,7 @@ index 0000000000000000000000000000000000000000..bcf91d048d84144f6acf9bfd2095df9a
+ * @return the version string made up of the major and minor version (e.g. 1.18 or 1.19). Minor versions like 1.18.2 + * @return the version string made up of the major and minor version (e.g. 1.18 or 1.19). Minor versions like 1.18.2
+ * are unified to their major release version (in this example 1.18) + * are unified to their major release version (in this example 1.18)
+ */ + */
+ @Nullable + @Nullable String getAPIVersion();
+ String getAPIVersion();
+ +
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/configuration/package-info.java b/src/main/java/io/papermc/paper/plugin/configuration/package-info.java diff --git a/src/main/java/io/papermc/paper/plugin/configuration/package-info.java b/src/main/java/io/papermc/paper/plugin/configuration/package-info.java
@ -552,10 +528,10 @@ index 0000000000000000000000000000000000000000..ddb3076124365d0d1a5caa32d4dcb1f4
+package io.papermc.paper.plugin.configuration; +package io.papermc.paper.plugin.configuration;
diff --git a/src/main/java/io/papermc/paper/plugin/loader/PluginClasspathBuilder.java b/src/main/java/io/papermc/paper/plugin/loader/PluginClasspathBuilder.java diff --git a/src/main/java/io/papermc/paper/plugin/loader/PluginClasspathBuilder.java b/src/main/java/io/papermc/paper/plugin/loader/PluginClasspathBuilder.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..28cbc09b7c1ded1f4515969cef4a669adac85703 index 0000000000000000000000000000000000000000..ddb768057cdfd9202e4386494fd5f643692c73a1
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/loader/PluginClasspathBuilder.java +++ b/src/main/java/io/papermc/paper/plugin/loader/PluginClasspathBuilder.java
@@ -0,0 +1,38 @@ @@ -0,0 +1,37 @@
+package io.papermc.paper.plugin.loader; +package io.papermc.paper.plugin.loader;
+ +
+import io.papermc.paper.plugin.bootstrap.PluginProviderContext; +import io.papermc.paper.plugin.bootstrap.PluginProviderContext;
@ -563,14 +539,15 @@ index 0000000000000000000000000000000000000000..28cbc09b7c1ded1f4515969cef4a669a
+import io.papermc.paper.plugin.loader.library.LibraryStore; +import io.papermc.paper.plugin.loader.library.LibraryStore;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * A mutable builder that may be used to collect and register all {@link ClassPathLibrary} instances a + * A mutable builder that may be used to collect and register all {@link ClassPathLibrary} instances a
+ * {@link PluginLoader} aims to provide to its plugin at runtime. + * {@link PluginLoader} aims to provide to its plugin at runtime.
+ */ + */
+@ApiStatus.NonExtendable
+@ApiStatus.Experimental +@ApiStatus.Experimental
+@NullMarked
+@ApiStatus.NonExtendable
+public interface PluginClasspathBuilder { +public interface PluginClasspathBuilder {
+ +
+ /** + /**
@ -587,23 +564,21 @@ index 0000000000000000000000000000000000000000..28cbc09b7c1ded1f4515969cef4a669a
+ * @see io.papermc.paper.plugin.loader.library.impl.JarLibrary + * @see io.papermc.paper.plugin.loader.library.impl.JarLibrary
+ * @see io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver + * @see io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver
+ */ + */
+ @NotNull
+ @Contract("_ -> this") + @Contract("_ -> this")
+ PluginClasspathBuilder addLibrary(@NotNull ClassPathLibrary classPathLibrary); + PluginClasspathBuilder addLibrary(ClassPathLibrary classPathLibrary);
+ +
+ @NotNull
+ PluginProviderContext getContext(); + PluginProviderContext getContext();
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/loader/PluginLoader.java b/src/main/java/io/papermc/paper/plugin/loader/PluginLoader.java diff --git a/src/main/java/io/papermc/paper/plugin/loader/PluginLoader.java b/src/main/java/io/papermc/paper/plugin/loader/PluginLoader.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..c9e31f78ff6ff969436c6d99755845786c4d383f index 0000000000000000000000000000000000000000..c2d029e4474cc00c84e5b3f7fceec4c3f30b486b
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/loader/PluginLoader.java +++ b/src/main/java/io/papermc/paper/plugin/loader/PluginLoader.java
@@ -0,0 +1,30 @@ @@ -0,0 +1,31 @@
+package io.papermc.paper.plugin.loader; +package io.papermc.paper.plugin.loader;
+ +
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * A plugin loader is responsible for creating certain aspects of a plugin before it is created. + * A plugin loader is responsible for creating certain aspects of a plugin before it is created.
@ -615,8 +590,9 @@ index 0000000000000000000000000000000000000000..c9e31f78ff6ff969436c6d9975584578
+ * It should be noted that this class will be called from a different classloader, this will cause any static values + * It should be noted that this class will be called from a different classloader, this will cause any static values
+ * set in this class/any other classes loaded not to persist when the plugin loads. + * set in this class/any other classes loaded not to persist when the plugin loads.
+ */ + */
+@ApiStatus.OverrideOnly
+@ApiStatus.Experimental +@ApiStatus.Experimental
+@NullMarked
+@ApiStatus.OverrideOnly
+public interface PluginLoader { +public interface PluginLoader {
+ +
+ /** + /**
@ -627,23 +603,24 @@ index 0000000000000000000000000000000000000000..c9e31f78ff6ff969436c6d9975584578
+ * @param classpathBuilder a mutable classpath builder that may be used to register custom runtime dependencies + * @param classpathBuilder a mutable classpath builder that may be used to register custom runtime dependencies
+ * for the plugin the loader was registered for. + * for the plugin the loader was registered for.
+ */ + */
+ void classloader(@NotNull PluginClasspathBuilder classpathBuilder); + void classloader(PluginClasspathBuilder classpathBuilder);
+ +
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/ClassPathLibrary.java b/src/main/java/io/papermc/paper/plugin/loader/library/ClassPathLibrary.java diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/ClassPathLibrary.java b/src/main/java/io/papermc/paper/plugin/loader/library/ClassPathLibrary.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..1347b535d90c2c281c184d0459e7ac59c0350c9f index 0000000000000000000000000000000000000000..8a07333a592056bab1d26d811316bb5ea5f30e18
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/loader/library/ClassPathLibrary.java +++ b/src/main/java/io/papermc/paper/plugin/loader/library/ClassPathLibrary.java
@@ -0,0 +1,20 @@ @@ -0,0 +1,21 @@
+package io.papermc.paper.plugin.loader.library; +package io.papermc.paper.plugin.loader.library;
+ +
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * The classpath library interface represents libraries that are capable of registering themselves via + * The classpath library interface represents libraries that are capable of registering themselves via
+ * {@link #register(LibraryStore)} on any given {@link LibraryStore}. + * {@link #register(LibraryStore)} on any given {@link LibraryStore}.
+ */ + */
+@NullMarked
+public interface ClassPathLibrary { +public interface ClassPathLibrary {
+ +
+ /** + /**
@ -654,7 +631,7 @@ index 0000000000000000000000000000000000000000..1347b535d90c2c281c184d0459e7ac59
+ * @param store the library store instance to register this library into + * @param store the library store instance to register this library into
+ * @throws LibraryLoadingException if library loading failed for this classpath library + * @throws LibraryLoadingException if library loading failed for this classpath library
+ */ + */
+ void register(@NotNull LibraryStore store) throws LibraryLoadingException; + void register(LibraryStore store) throws LibraryLoadingException;
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/LibraryLoadingException.java b/src/main/java/io/papermc/paper/plugin/loader/library/LibraryLoadingException.java diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/LibraryLoadingException.java b/src/main/java/io/papermc/paper/plugin/loader/library/LibraryLoadingException.java
new file mode 100644 new file mode 100644
@ -679,16 +656,15 @@ index 0000000000000000000000000000000000000000..79ba423a364b50588f3ee87fdc69155c
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/LibraryStore.java b/src/main/java/io/papermc/paper/plugin/loader/library/LibraryStore.java diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/LibraryStore.java b/src/main/java/io/papermc/paper/plugin/loader/library/LibraryStore.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..0546fa1e9dcd7155086a8650806a8c086b6fc458 index 0000000000000000000000000000000000000000..93ef8e369a158c25bc4fdd553faf13c1826ad872
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/loader/library/LibraryStore.java +++ b/src/main/java/io/papermc/paper/plugin/loader/library/LibraryStore.java
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
+package io.papermc.paper.plugin.loader.library; +package io.papermc.paper.plugin.loader.library;
+ +
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+import java.nio.file.Path; +import java.nio.file.Path;
+import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Represents a storage that stores library jars. + * Represents a storage that stores library jars.
@ -699,6 +675,7 @@ index 0000000000000000000000000000000000000000..0546fa1e9dcd7155086a8650806a8c08
+ * @see io.papermc.paper.plugin.loader.PluginLoader + * @see io.papermc.paper.plugin.loader.PluginLoader
+ */ + */
+@ApiStatus.Internal +@ApiStatus.Internal
+@NullMarked
+public interface LibraryStore { +public interface LibraryStore {
+ +
+ /** + /**
@ -706,12 +683,12 @@ index 0000000000000000000000000000000000000000..0546fa1e9dcd7155086a8650806a8c08
+ * + *
+ * @param library path to the libraries jar file on the disk + * @param library path to the libraries jar file on the disk
+ */ + */
+ void addLibrary(@NotNull Path library); + void addLibrary(Path library);
+ +
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/impl/JarLibrary.java b/src/main/java/io/papermc/paper/plugin/loader/library/impl/JarLibrary.java diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/impl/JarLibrary.java b/src/main/java/io/papermc/paper/plugin/loader/library/impl/JarLibrary.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..e3da0d67cab01e1233dccde1a12ff25961ee79fb index 0000000000000000000000000000000000000000..9efcd9a62d6439eb27fc4e08498b4b7fbbdecb3c
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/loader/library/impl/JarLibrary.java +++ b/src/main/java/io/papermc/paper/plugin/loader/library/impl/JarLibrary.java
@@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
@ -720,10 +697,9 @@ index 0000000000000000000000000000000000000000..e3da0d67cab01e1233dccde1a12ff259
+import io.papermc.paper.plugin.loader.library.ClassPathLibrary; +import io.papermc.paper.plugin.loader.library.ClassPathLibrary;
+import io.papermc.paper.plugin.loader.library.LibraryLoadingException; +import io.papermc.paper.plugin.loader.library.LibraryLoadingException;
+import io.papermc.paper.plugin.loader.library.LibraryStore; +import io.papermc.paper.plugin.loader.library.LibraryStore;
+import org.jetbrains.annotations.NotNull;
+
+import java.nio.file.Files; +import java.nio.file.Files;
+import java.nio.file.Path; +import java.nio.file.Path;
+import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * A simple jar library implementation of the {@link ClassPathLibrary} that allows {@link io.papermc.paper.plugin.loader.PluginLoader}s to + * A simple jar library implementation of the {@link ClassPathLibrary} that allows {@link io.papermc.paper.plugin.loader.PluginLoader}s to
@ -738,6 +714,7 @@ index 0000000000000000000000000000000000000000..e3da0d67cab01e1233dccde1a12ff259
+ * <p> + * <p>
+ * The jar library implementation will error if the file does not exist at the specified path. + * The jar library implementation will error if the file does not exist at the specified path.
+ */ + */
+@NullMarked
+public class JarLibrary implements ClassPathLibrary { +public class JarLibrary implements ClassPathLibrary {
+ +
+ private final Path path; + private final Path path;
@ -747,12 +724,12 @@ index 0000000000000000000000000000000000000000..e3da0d67cab01e1233dccde1a12ff259
+ * + *
+ * @param path the path, relative to the JVMs start directory. + * @param path the path, relative to the JVMs start directory.
+ */ + */
+ public JarLibrary(@NotNull Path path) { + public JarLibrary(final Path path) {
+ this.path = path; + this.path = path;
+ } + }
+ +
+ @Override + @Override
+ public void register(@NotNull LibraryStore store) throws LibraryLoadingException { + public void register(final LibraryStore store) throws LibraryLoadingException {
+ if (Files.notExists(this.path)) { + if (Files.notExists(this.path)) {
+ throw new LibraryLoadingException("Could not find library at " + this.path); + throw new LibraryLoadingException("Could not find library at " + this.path);
+ } + }
@ -762,7 +739,7 @@ index 0000000000000000000000000000000000000000..e3da0d67cab01e1233dccde1a12ff259
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java diff --git a/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..70f352630de71f575d1aea5a3126da19a94791ab index 0000000000000000000000000000000000000000..107705db2d82b7c191e5e625ec888e0bc3b03831
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java +++ b/src/main/java/io/papermc/paper/plugin/loader/library/impl/MavenLibraryResolver.java
@@ -0,0 +1,133 @@ @@ -0,0 +1,133 @@
@ -771,6 +748,9 @@ index 0000000000000000000000000000000000000000..70f352630de71f575d1aea5a3126da19
+import io.papermc.paper.plugin.loader.library.ClassPathLibrary; +import io.papermc.paper.plugin.loader.library.ClassPathLibrary;
+import io.papermc.paper.plugin.loader.library.LibraryLoadingException; +import io.papermc.paper.plugin.loader.library.LibraryLoadingException;
+import io.papermc.paper.plugin.loader.library.LibraryStore; +import io.papermc.paper.plugin.loader.library.LibraryStore;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.maven.repository.internal.MavenRepositorySystemUtils; +import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystem;
@ -791,14 +771,10 @@ index 0000000000000000000000000000000000000000..70f352630de71f575d1aea5a3126da19
+import org.eclipse.aether.transfer.TransferCancelledException; +import org.eclipse.aether.transfer.TransferCancelledException;
+import org.eclipse.aether.transfer.TransferEvent; +import org.eclipse.aether.transfer.TransferEvent;
+import org.eclipse.aether.transport.http.HttpTransporterFactory; +import org.eclipse.aether.transport.http.HttpTransporterFactory;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.slf4j.Logger; +import org.slf4j.Logger;
+import org.slf4j.LoggerFactory; +import org.slf4j.LoggerFactory;
+ +
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/** +/**
+ * The maven library resolver acts as a resolver for yet to be resolved jar libraries that may be pulled from a + * The maven library resolver acts as a resolver for yet to be resolved jar libraries that may be pulled from a
+ * remote maven repository. + * remote maven repository.
@ -813,12 +789,13 @@ index 0000000000000000000000000000000000000000..70f352630de71f575d1aea5a3126da19
+ * "central", "default", "https://repo1.maven.org/maven2/" + * "central", "default", "https://repo1.maven.org/maven2/"
+ * ).build()); + * ).build());
+ * }</pre> + * }</pre>
+ * + * <p>
+ * Plugins may create and register a {@link MavenLibraryResolver} after configuring it. + * Plugins may create and register a {@link MavenLibraryResolver} after configuring it.
+ */ + */
+@NullMarked
+public class MavenLibraryResolver implements ClassPathLibrary { +public class MavenLibraryResolver implements ClassPathLibrary {
+ +
+ private static final Logger logger = LoggerFactory.getLogger("MavenLibraryResolver"); + private static final Logger LOGGER = LoggerFactory.getLogger("MavenLibraryResolver");
+ +
+ private final RepositorySystem repository; + private final RepositorySystem repository;
+ private final DefaultRepositorySystemSession session; + private final DefaultRepositorySystemSession session;
@ -834,7 +811,7 @@ index 0000000000000000000000000000000000000000..70f352630de71f575d1aea5a3126da19
+ * submitting the {@link MavenLibraryResolver} to the {@link io.papermc.paper.plugin.loader.PluginClasspathBuilder}. + * submitting the {@link MavenLibraryResolver} to the {@link io.papermc.paper.plugin.loader.PluginClasspathBuilder}.
+ */ + */
+ public MavenLibraryResolver() { + public MavenLibraryResolver() {
+ DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); + final DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
+ locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); + locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
+ locator.addService(TransporterFactory.class, HttpTransporterFactory.class); + locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
+ +
@ -846,8 +823,8 @@ index 0000000000000000000000000000000000000000..70f352630de71f575d1aea5a3126da19
+ this.session.setLocalRepositoryManager(this.repository.newLocalRepositoryManager(this.session, new LocalRepository("libraries"))); + this.session.setLocalRepositoryManager(this.repository.newLocalRepositoryManager(this.session, new LocalRepository("libraries")));
+ this.session.setTransferListener(new AbstractTransferListener() { + this.session.setTransferListener(new AbstractTransferListener() {
+ @Override + @Override
+ public void transferInitiated(@NotNull TransferEvent event) throws TransferCancelledException { + public void transferInitiated(final TransferEvent event) throws TransferCancelledException {
+ logger.info("Downloading {}", event.getResource().getRepositoryUrl() + event.getResource().getResourceName()); + LOGGER.info("Downloading {}", event.getResource().getRepositoryUrl() + event.getResource().getResourceName());
+ } + }
+ }); + });
+ this.session.setReadOnly(); + this.session.setReadOnly();
@ -860,7 +837,7 @@ index 0000000000000000000000000000000000000000..70f352630de71f575d1aea5a3126da19
+ * @param dependency the definition of the dependency the maven library resolver should resolve when running + * @param dependency the definition of the dependency the maven library resolver should resolve when running
+ * @see MavenLibraryResolver#addRepository(RemoteRepository) + * @see MavenLibraryResolver#addRepository(RemoteRepository)
+ */ + */
+ public void addDependency(@NotNull Dependency dependency) { + public void addDependency(final Dependency dependency) {
+ this.dependencies.add(dependency); + this.dependencies.add(dependency);
+ } + }
+ +
@ -870,9 +847,9 @@ index 0000000000000000000000000000000000000000..70f352630de71f575d1aea5a3126da19
+ * repository. + * repository.
+ * + *
+ * @param remoteRepository the configuration that defines the maven repository this library resolver should fetch + * @param remoteRepository the configuration that defines the maven repository this library resolver should fetch
+ * dependencies from + * dependencies from
+ */ + */
+ public void addRepository(@NotNull RemoteRepository remoteRepository) { + public void addRepository(final RemoteRepository remoteRepository) {
+ this.repositories.add(remoteRepository); + this.repositories.add(remoteRepository);
+ } + }
+ +
@ -883,32 +860,32 @@ index 0000000000000000000000000000000000000000..70f352630de71f575d1aea5a3126da19
+ * @throws LibraryLoadingException if resolving a dependency failed + * @throws LibraryLoadingException if resolving a dependency failed
+ */ + */
+ @Override + @Override
+ public void register(@NotNull LibraryStore store) throws LibraryLoadingException { + public void register(final LibraryStore store) throws LibraryLoadingException {
+ List<RemoteRepository> repos = this.repository.newResolutionRepositories(this.session, this.repositories); + final List<RemoteRepository> repos = this.repository.newResolutionRepositories(this.session, this.repositories);
+ +
+ DependencyResult result; + final DependencyResult result;
+ try { + try {
+ result = this.repository.resolveDependencies(this.session, new DependencyRequest(new CollectRequest((Dependency) null, this.dependencies, repos), null)); + result = this.repository.resolveDependencies(this.session, new DependencyRequest(new CollectRequest((Dependency) null, this.dependencies, repos), null));
+ } catch (DependencyResolutionException ex) { + } catch (final DependencyResolutionException ex) {
+ throw new LibraryLoadingException("Error resolving libraries", ex); + throw new LibraryLoadingException("Error resolving libraries", ex);
+ } + }
+ +
+ for (ArtifactResult artifact : result.getArtifactResults()) { + for (final ArtifactResult artifact : result.getArtifactResults()) {
+ File file = artifact.getArtifact().getFile(); + final File file = artifact.getArtifact().getFile();
+ store.addLibrary(file.toPath()); + store.addLibrary(file.toPath());
+ } + }
+ } + }
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/provider/classloader/ClassLoaderAccess.java b/src/main/java/io/papermc/paper/plugin/provider/classloader/ClassLoaderAccess.java diff --git a/src/main/java/io/papermc/paper/plugin/provider/classloader/ClassLoaderAccess.java b/src/main/java/io/papermc/paper/plugin/provider/classloader/ClassLoaderAccess.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..64e46fdfa4d404cb08c67a456e5990b729296b98 index 0000000000000000000000000000000000000000..75fe408ec742319c3cba2461b33b2a6e8b22d231
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/provider/classloader/ClassLoaderAccess.java +++ b/src/main/java/io/papermc/paper/plugin/provider/classloader/ClassLoaderAccess.java
@@ -0,0 +1,34 @@ @@ -0,0 +1,35 @@
+package io.papermc.paper.plugin.provider.classloader; +package io.papermc.paper.plugin.provider.classloader;
+ +
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * The class loader access interface is an <b>internal</b> representation of a class accesses' ability to see types + * The class loader access interface is an <b>internal</b> representation of a class accesses' ability to see types
@ -919,6 +896,7 @@ index 0000000000000000000000000000000000000000..64e46fdfa4d404cb08c67a456e5990b7
+ * is owned by a direct or transitive dependency of the plugin, preventing the plugin for accidentally discovering and + * is owned by a direct or transitive dependency of the plugin, preventing the plugin for accidentally discovering and
+ * using class types that are supplied by plugins/libraries the plugin did not actively define as a dependency. + * using class types that are supplied by plugins/libraries the plugin did not actively define as a dependency.
+ */ + */
+@NullMarked
+@ApiStatus.Internal +@ApiStatus.Internal
+public interface ClassLoaderAccess { +public interface ClassLoaderAccess {
+ +
@ -941,19 +919,18 @@ index 0000000000000000000000000000000000000000..64e46fdfa4d404cb08c67a456e5990b7
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/provider/classloader/ConfiguredPluginClassLoader.java b/src/main/java/io/papermc/paper/plugin/provider/classloader/ConfiguredPluginClassLoader.java diff --git a/src/main/java/io/papermc/paper/plugin/provider/classloader/ConfiguredPluginClassLoader.java b/src/main/java/io/papermc/paper/plugin/provider/classloader/ConfiguredPluginClassLoader.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..a21bdc57564aef7caf43dde3b2bcb2fc7f30461c index 0000000000000000000000000000000000000000..7c23e0a1a38f8b89484aee160647f751088903cd
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/provider/classloader/ConfiguredPluginClassLoader.java +++ b/src/main/java/io/papermc/paper/plugin/provider/classloader/ConfiguredPluginClassLoader.java
@@ -0,0 +1,71 @@ @@ -0,0 +1,70 @@
+package io.papermc.paper.plugin.provider.classloader; +package io.papermc.paper.plugin.provider.classloader;
+ +
+import io.papermc.paper.plugin.configuration.PluginMeta; +import io.papermc.paper.plugin.configuration.PluginMeta;
+import java.io.Closeable;
+import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +import org.jspecify.annotations.Nullable;
+import java.io.Closeable;
+import org.jetbrains.annotations.Nullable;
+ +
+/** +/**
+ * The configured plugin class loader represents an <b>internal</b> abstraction over the classloaders used by the server + * The configured plugin class loader represents an <b>internal</b> abstraction over the classloaders used by the server
@ -962,6 +939,7 @@ index 0000000000000000000000000000000000000000..a21bdc57564aef7caf43dde3b2bcb2fc
+ * It implements {@link Closeable} to define the ability to shutdown and close the classloader that implements this + * It implements {@link Closeable} to define the ability to shutdown and close the classloader that implements this
+ * interface. + * interface.
+ */ + */
+@NullMarked
+@ApiStatus.Internal +@ApiStatus.Internal
+public interface ConfiguredPluginClassLoader extends Closeable { +public interface ConfiguredPluginClassLoader extends Closeable {
+ +
@ -987,7 +965,7 @@ index 0000000000000000000000000000000000000000..a21bdc57564aef7caf43dde3b2bcb2fc
+ * @see ClassLoader#loadClass(String) + * @see ClassLoader#loadClass(String)
+ * @see Class#forName(String, boolean, ClassLoader) + * @see Class#forName(String, boolean, ClassLoader)
+ */ + */
+ Class<?> loadClass(@NotNull String name, + Class<?> loadClass(String name,
+ boolean resolve, + boolean resolve,
+ boolean checkGlobal, + boolean checkGlobal,
+ boolean checkLibraries) throws ClassNotFoundException; + boolean checkLibraries) throws ClassNotFoundException;
@ -1013,8 +991,7 @@ index 0000000000000000000000000000000000000000..a21bdc57564aef7caf43dde3b2bcb2fc
+ * that is used by the underlying classloader + * that is used by the underlying classloader
+ * @return classloader + * @return classloader
+ */ + */
+ @Nullable + @Nullable PluginClassLoaderGroup getGroup();
+ PluginClassLoaderGroup getGroup();
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/provider/classloader/PaperClassLoaderStorage.java b/src/main/java/io/papermc/paper/plugin/provider/classloader/PaperClassLoaderStorage.java diff --git a/src/main/java/io/papermc/paper/plugin/provider/classloader/PaperClassLoaderStorage.java b/src/main/java/io/papermc/paper/plugin/provider/classloader/PaperClassLoaderStorage.java
new file mode 100644 new file mode 100644
@ -1139,15 +1116,16 @@ index 0000000000000000000000000000000000000000..2c0e5ba6f8eba7a632180491843071b8
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/provider/classloader/PluginClassLoaderGroup.java b/src/main/java/io/papermc/paper/plugin/provider/classloader/PluginClassLoaderGroup.java diff --git a/src/main/java/io/papermc/paper/plugin/provider/classloader/PluginClassLoaderGroup.java b/src/main/java/io/papermc/paper/plugin/provider/classloader/PluginClassLoaderGroup.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..885151cb932d9b8c09a7887edc879e154225f416 index 0000000000000000000000000000000000000000..dd3bfbf8a30c9ac6a82dcbdf879bbf120d920e20
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/provider/classloader/PluginClassLoaderGroup.java +++ b/src/main/java/io/papermc/paper/plugin/provider/classloader/PluginClassLoaderGroup.java
@@ -0,0 +1,65 @@ @@ -0,0 +1,66 @@
+package io.papermc.paper.plugin.provider.classloader; +package io.papermc.paper.plugin.provider.classloader;
+ +
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+ +
+/** +/**
+ * A plugin classloader group represents a group of classloaders that a plugins classloader may access. + * A plugin classloader group represents a group of classloaders that a plugins classloader may access.
@ -1155,6 +1133,7 @@ index 0000000000000000000000000000000000000000..885151cb932d9b8c09a7887edc879e15
+ * An example of this would be a classloader group that holds all direct and transitive dependencies a plugin declared, + * An example of this would be a classloader group that holds all direct and transitive dependencies a plugin declared,
+ * allowing a plugins classloader to access classes included in these dependencies via this group. + * allowing a plugins classloader to access classes included in these dependencies via this group.
+ */ + */
+@NullMarked
+@ApiStatus.Internal +@ApiStatus.Internal
+public interface PluginClassLoaderGroup { +public interface PluginClassLoaderGroup {
+ +
@ -1172,8 +1151,7 @@ index 0000000000000000000000000000000000000000..885151cb932d9b8c09a7887edc879e15
+ * will be returned. + * will be returned.
+ * @see ConfiguredPluginClassLoader#loadClass(String, boolean, boolean, boolean) + * @see ConfiguredPluginClassLoader#loadClass(String, boolean, boolean, boolean)
+ */ + */
+ @Nullable + @Nullable Class<?> getClassByName(String name, boolean resolve, ConfiguredPluginClassLoader requester);
+ Class<?> getClassByName(String name, boolean resolve, ConfiguredPluginClassLoader requester);
+ +
+ /** + /**
+ * Removes a configured plugin classloader from this class loader group. + * Removes a configured plugin classloader from this class loader group.
@ -1210,15 +1188,15 @@ index 0000000000000000000000000000000000000000..885151cb932d9b8c09a7887edc879e15
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/provider/entrypoint/DependencyContext.java b/src/main/java/io/papermc/paper/plugin/provider/entrypoint/DependencyContext.java diff --git a/src/main/java/io/papermc/paper/plugin/provider/entrypoint/DependencyContext.java b/src/main/java/io/papermc/paper/plugin/provider/entrypoint/DependencyContext.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..44d630c3eb2670c36134b9907519dc986b3761b4 index 0000000000000000000000000000000000000000..338dc25d5161b7378dd17b17d6f603c92eb0a894
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/provider/entrypoint/DependencyContext.java +++ b/src/main/java/io/papermc/paper/plugin/provider/entrypoint/DependencyContext.java
@@ -0,0 +1,48 @@ @@ -0,0 +1,49 @@
+package io.papermc.paper.plugin.provider.entrypoint; +package io.papermc.paper.plugin.provider.entrypoint;
+ +
+import io.papermc.paper.plugin.configuration.PluginMeta; +import io.papermc.paper.plugin.configuration.PluginMeta;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * A dependency context is a read-only abstraction of a type/concept that can resolve dependencies between plugins. + * A dependency context is a read-only abstraction of a type/concept that can resolve dependencies between plugins.
@ -1226,6 +1204,7 @@ index 0000000000000000000000000000000000000000..44d630c3eb2670c36134b9907519dc98
+ * This may for example be the server wide plugin manager itself, capable of validating if a dependency exists between + * This may for example be the server wide plugin manager itself, capable of validating if a dependency exists between
+ * two {@link PluginMeta} instances, however the implementation is not limited to such a concrete use-case. + * two {@link PluginMeta} instances, however the implementation is not limited to such a concrete use-case.
+ */ + */
+@NullMarked
+@ApiStatus.Internal +@ApiStatus.Internal
+public interface DependencyContext { +public interface DependencyContext {
+ +
@ -1245,7 +1224,7 @@ index 0000000000000000000000000000000000000000..44d630c3eb2670c36134b9907519dc98
+ * @param depend the potential transitive dependency of the {@code plugin} parameter. + * @param depend the potential transitive dependency of the {@code plugin} parameter.
+ * @return a simple boolean flag indicating if {@code plugin} considers {@code depend} as a transitive dependency. + * @return a simple boolean flag indicating if {@code plugin} considers {@code depend} as a transitive dependency.
+ */ + */
+ boolean isTransitiveDependency(@NotNull PluginMeta plugin, @NotNull PluginMeta depend); + boolean isTransitiveDependency(PluginMeta plugin, PluginMeta depend);
+ +
+ /** + /**
+ * Computes if this dependency context is aware of a dependency that provides/matches the passed identifier. + * Computes if this dependency context is aware of a dependency that provides/matches the passed identifier.
@ -1259,29 +1238,30 @@ index 0000000000000000000000000000000000000000..44d630c3eb2670c36134b9907519dc98
+ * @return a plain boolean flag indicating if this dependency context is aware of a potential dependency with the + * @return a plain boolean flag indicating if this dependency context is aware of a potential dependency with the
+ * passed identifier. + * passed identifier.
+ */ + */
+ boolean hasDependency(@NotNull String pluginIdentifier); + boolean hasDependency(String pluginIdentifier);
+ +
+} +}
diff --git a/src/main/java/io/papermc/paper/plugin/provider/util/ProviderUtil.java b/src/main/java/io/papermc/paper/plugin/provider/util/ProviderUtil.java diff --git a/src/main/java/io/papermc/paper/plugin/provider/util/ProviderUtil.java b/src/main/java/io/papermc/paper/plugin/provider/util/ProviderUtil.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..6bf3d212a6156ad9ab0e82d1ca0a04f83f6e4b83 index 0000000000000000000000000000000000000000..48a67c1b6070292dbf4ea3081f89b530207f9f6d
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/provider/util/ProviderUtil.java +++ b/src/main/java/io/papermc/paper/plugin/provider/util/ProviderUtil.java
@@ -0,0 +1,78 @@ @@ -0,0 +1,77 @@
+package io.papermc.paper.plugin.provider.util; +package io.papermc.paper.plugin.provider.util;
+ +
+import com.destroystokyo.paper.util.SneakyThrow; +import com.destroystokyo.paper.util.SneakyThrow;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+ +
+/** +/**
+ * An <b>internal</b> utility type that holds logic for loading a provider-like type from a classloaders. + * An <b>internal</b> utility type that holds logic for loading a provider-like type from a classloaders.
+ * Provides, at least in the context of this utility, define themselves as implementations of a specific parent + * Provides, at least in the context of this utility, define themselves as implementations of a specific parent
+ * interface/type, e.g. {@link org.bukkit.plugin.java.JavaPlugin} and implement a no-args constructor. + * interface/type, e.g. {@link org.bukkit.plugin.java.JavaPlugin} and implement a no-args constructor.
+ */ + */
+@NullMarked
+@ApiStatus.Internal +@ApiStatus.Internal
+public class ProviderUtil { +public final class ProviderUtil {
+ +
+ /** + /**
+ * Loads the class found at the provided fully qualified class name from the passed classloader, creates a new + * Loads the class found at the provided fully qualified class name from the passed classloader, creates a new
@ -1294,8 +1274,7 @@ index 0000000000000000000000000000000000000000..6bf3d212a6156ad9ab0e82d1ca0a04f8
+ * @param <T> the generic type of the parent class the created object will be cast to + * @param <T> the generic type of the parent class the created object will be cast to
+ * @return the object instantiated from the class found at the provided FQN, cast to the parent type + * @return the object instantiated from the class found at the provided FQN, cast to the parent type
+ */ + */
+ @NotNull + public static <T> T loadClass(final String clazz, final Class<T> classType, final ClassLoader loader) {
+ public static <T> T loadClass(@NotNull String clazz, @NotNull Class<T> classType, @NotNull ClassLoader loader) {
+ return loadClass(clazz, classType, loader, null); + return loadClass(clazz, classType, loader, null);
+ } + }
+ +
@ -1312,30 +1291,29 @@ index 0000000000000000000000000000000000000000..6bf3d212a6156ad9ab0e82d1ca0a04f8
+ * @return the object instantiated from the class found at the provided fully qualified class name, cast to the + * @return the object instantiated from the class found at the provided fully qualified class name, cast to the
+ * parent type + * parent type
+ */ + */
+ @NotNull + public static <T> T loadClass(final String clazz, final Class<T> classType, final ClassLoader loader, final @Nullable Runnable onError) {
+ public static <T> T loadClass(@NotNull String clazz, @NotNull Class<T> classType, @NotNull ClassLoader loader, @Nullable Runnable onError) {
+ try { + try {
+ T clazzInstance; + final T clazzInstance;
+ +
+ try { + try {
+ Class<?> jarClass = Class.forName(clazz, true, loader); + final Class<?> jarClass = Class.forName(clazz, true, loader);
+ +
+ Class<? extends T> pluginClass; + final Class<? extends T> pluginClass;
+ try { + try {
+ pluginClass = jarClass.asSubclass(classType); + pluginClass = jarClass.asSubclass(classType);
+ } catch (ClassCastException ex) { + } catch (final ClassCastException ex) {
+ throw new ClassCastException("class '%s' does not extend '%s'".formatted(clazz, classType)); + throw new ClassCastException("class '%s' does not extend '%s'".formatted(clazz, classType));
+ } + }
+ +
+ clazzInstance = pluginClass.getDeclaredConstructor().newInstance(); + clazzInstance = pluginClass.getDeclaredConstructor().newInstance();
+ } catch (IllegalAccessException exception) { + } catch (final IllegalAccessException exception) {
+ throw new RuntimeException("No public constructor"); + throw new RuntimeException("No public constructor");
+ } catch (InstantiationException exception) { + } catch (final InstantiationException exception) {
+ throw new RuntimeException("Abnormal class instantiation", exception); + throw new RuntimeException("Abnormal class instantiation", exception);
+ } + }
+ +
+ return clazzInstance; + return clazzInstance;
+ } catch (Throwable e) { + } catch (final Throwable e) {
+ if (onError != null) { + if (onError != null) {
+ onError.run(); + onError.run();
+ } + }
@ -1347,13 +1325,13 @@ index 0000000000000000000000000000000000000000..6bf3d212a6156ad9ab0e82d1ca0a04f8
+ +
+} +}
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
index 9ba1a4e838538ecd55f4f8e50ffb0c5f1f474382..d8b346fe0f9634218954fe818d53272a0896af9c 100644 index 1ed3f8dae84c10cb3245d08fa776396a695b5c2f..e320729782245b5511cd744c417141508020fd26 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java --- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java +++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -141,4 +141,14 @@ public interface UnsafeValues { @@ -146,4 +146,14 @@ public interface UnsafeValues {
@ApiStatus.Internal @ApiStatus.Internal
<B extends Keyed> B get(Registry<B> registry, NamespacedKey key); Biome getCustomBiome();
+ +
+ // Paper start + // Paper start
+ @Deprecated(forRemoval = true) + @Deprecated(forRemoval = true)
@ -2557,10 +2535,10 @@ index a8be3e23e3e280ad301d9530de50028515612966..43b58e920e739bb949ac0673e9ef73ba
@Override @Override
public FileConfiguration getConfig() { public FileConfiguration getConfig() {
diff --git a/src/test/java/org/bukkit/support/TestServer.java b/src/test/java/org/bukkit/support/TestServer.java diff --git a/src/test/java/org/bukkit/support/TestServer.java b/src/test/java/org/bukkit/support/TestServer.java
index a47ee3ce660ec4467b5ed6a4b41fb2d19179a189..c79faf4197f9c0a7256cefe2b001182102d2b796 100644 index eb1fd4b911c4af76cdd3eac85d5365e7941a4a2e..2a3ae4afef2716a5fdcefbb6d5e0e011d1db9934 100644
--- a/src/test/java/org/bukkit/support/TestServer.java --- a/src/test/java/org/bukkit/support/TestServer.java
+++ b/src/test/java/org/bukkit/support/TestServer.java +++ b/src/test/java/org/bukkit/support/TestServer.java
@@ -26,8 +26,7 @@ public final class TestServer { @@ -27,8 +27,7 @@ public final class TestServer {
Thread creatingThread = Thread.currentThread(); Thread creatingThread = Thread.currentThread();
when(instance.isPrimaryThread()).then(mock -> Thread.currentThread().equals(creatingThread)); when(instance.isPrimaryThread()).then(mock -> Thread.currentThread().equals(creatingThread));

Datei anzeigen

@ -6,25 +6,27 @@ Subject: [PATCH] Add Position
diff --git a/src/main/java/io/papermc/paper/math/BlockPosition.java b/src/main/java/io/papermc/paper/math/BlockPosition.java diff --git a/src/main/java/io/papermc/paper/math/BlockPosition.java b/src/main/java/io/papermc/paper/math/BlockPosition.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..f0fdabce4af640da2a406412e67020761ded3ac1 index 0000000000000000000000000000000000000000..c358bfdefc9bc7598dbd0d89a6b0b8a9408b5bb3
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/math/BlockPosition.java +++ b/src/main/java/io/papermc/paper/math/BlockPosition.java
@@ -0,0 +1,98 @@ @@ -0,0 +1,100 @@
+package io.papermc.paper.math; +package io.papermc.paper.math;
+ +
+import org.bukkit.Axis; +import org.bukkit.Axis;
+import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockFace;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * A position represented with integers. + * A position represented with integers.
+ * <p> + * <p>
+ * <b>May see breaking changes until Experimental annotation is removed.</b> + * <b>May see breaking changes until Experimental annotation is removed.</b>
+ *
+ * @see FinePosition + * @see FinePosition
+ */ + */
+@ApiStatus.Experimental +@ApiStatus.Experimental
+@NullMarked
+public interface BlockPosition extends Position { +public interface BlockPosition extends Position {
+ +
+ @Override + @Override
@ -53,17 +55,17 @@ index 0000000000000000000000000000000000000000..f0fdabce4af640da2a406412e6702076
+ } + }
+ +
+ @Override + @Override
+ default @NotNull BlockPosition toBlock() { + default BlockPosition toBlock() {
+ return this; + return this;
+ } + }
+ +
+ @Override + @Override
+ default @NotNull BlockPosition offset(int x, int y, int z) { + default BlockPosition offset(final int x, final int y, final int z) {
+ return x == 0 && y == 0 && z == 0 ? this : new BlockPositionImpl(this.blockX() + x, this.blockY() + y, this.blockZ() + z); + return x == 0 && y == 0 && z == 0 ? this : new BlockPositionImpl(this.blockX() + x, this.blockY() + y, this.blockZ() + z);
+ } + }
+ +
+ @Override + @Override
+ default @NotNull FinePosition offset(double x, double y, double z) { + default FinePosition offset(final double x, final double y, final double z) {
+ return new FinePositionImpl(this.blockX() + x, this.blockY() + y, this.blockZ() + z); + return new FinePositionImpl(this.blockX() + x, this.blockY() + y, this.blockZ() + z);
+ } + }
+ +
@ -74,7 +76,7 @@ index 0000000000000000000000000000000000000000..f0fdabce4af640da2a406412e6702076
+ * @return the offset block position + * @return the offset block position
+ */ + */
+ @Contract(value = "_ -> new", pure = true) + @Contract(value = "_ -> new", pure = true)
+ default @NotNull BlockPosition offset(@NotNull BlockFace blockFace) { + default BlockPosition offset(final BlockFace blockFace) {
+ return this.offset(blockFace, 1); + return this.offset(blockFace, 1);
+ } + }
+ +
@ -87,7 +89,7 @@ index 0000000000000000000000000000000000000000..f0fdabce4af640da2a406412e6702076
+ * @return the offset block position + * @return the offset block position
+ */ + */
+ @Contract(pure = true) + @Contract(pure = true)
+ default @NotNull BlockPosition offset(@NotNull BlockFace blockFace, int amount) { + default BlockPosition offset(final BlockFace blockFace, final int amount) {
+ return amount == 0 ? this : new BlockPositionImpl(this.blockX() + (blockFace.getModX() * amount), this.blockY() + (blockFace.getModY() * amount), this.blockZ() + (blockFace.getModZ() * amount)); + return amount == 0 ? this : new BlockPositionImpl(this.blockX() + (blockFace.getModX() * amount), this.blockY() + (blockFace.getModY() * amount), this.blockZ() + (blockFace.getModZ() * amount));
+ } + }
+ +
@ -100,7 +102,7 @@ index 0000000000000000000000000000000000000000..f0fdabce4af640da2a406412e6702076
+ * @return the offset block position + * @return the offset block position
+ */ + */
+ @Contract(pure = true) + @Contract(pure = true)
+ default @NotNull BlockPosition offset(@NotNull Axis axis, int amount) { + default BlockPosition offset(final Axis axis, final int amount) {
+ return amount == 0 ? this : switch (axis) { + return amount == 0 ? this : switch (axis) {
+ case X -> new BlockPositionImpl(this.blockX() + amount, this.blockY(), this.blockZ()); + case X -> new BlockPositionImpl(this.blockX() + amount, this.blockY(), this.blockZ());
+ case Y -> new BlockPositionImpl(this.blockX(), this.blockY() + amount, this.blockZ()); + case Y -> new BlockPositionImpl(this.blockX(), this.blockY() + amount, this.blockZ());
@ -120,24 +122,25 @@ index 0000000000000000000000000000000000000000..eb5a3f26c7ba56c6715827f52c0013a8
+} +}
diff --git a/src/main/java/io/papermc/paper/math/FinePosition.java b/src/main/java/io/papermc/paper/math/FinePosition.java diff --git a/src/main/java/io/papermc/paper/math/FinePosition.java b/src/main/java/io/papermc/paper/math/FinePosition.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..d8df70d731573cf2446044925f218876d62fd7cf index 0000000000000000000000000000000000000000..b9c0065d8a9dedc3bd1a2d8bfbedfbc7f952ff93
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/math/FinePosition.java +++ b/src/main/java/io/papermc/paper/math/FinePosition.java
@@ -0,0 +1,56 @@ @@ -0,0 +1,57 @@
+package io.papermc.paper.math; +package io.papermc.paper.math;
+ +
+import org.bukkit.util.NumberConversions; +import org.bukkit.util.NumberConversions;
+import org.bukkit.util.Vector;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * A position represented with doubles. + * A position represented with doubles.
+ * <p> + * <p>
+ * <b>May see breaking changes until Experimental annotation is removed.</b> + * <b>May see breaking changes until Experimental annotation is removed.</b>
+ *
+ * @see BlockPosition + * @see BlockPosition
+ */ + */
+@ApiStatus.Experimental +@ApiStatus.Experimental
+@NullMarked
+public interface FinePosition extends Position { +public interface FinePosition extends Position {
+ +
+ @Override + @Override
@ -166,17 +169,17 @@ index 0000000000000000000000000000000000000000..d8df70d731573cf2446044925f218876
+ } + }
+ +
+ @Override + @Override
+ default @NotNull BlockPosition toBlock() { + default BlockPosition toBlock() {
+ return new BlockPositionImpl(this.blockX(), this.blockY(), this.blockZ()); + return new BlockPositionImpl(this.blockX(), this.blockY(), this.blockZ());
+ } + }
+ +
+ @Override + @Override
+ default @NotNull FinePosition offset(int x, int y, int z) { + default FinePosition offset(final int x, final int y, final int z) {
+ return this.offset((double) x, y, z); + return this.offset((double) x, y, z);
+ } + }
+ +
+ @Override + @Override
+ default @NotNull FinePosition offset(double x, double y, double z) { + default FinePosition offset(final double x, final double y, final double z) {
+ return x == 0.0 && y == 0.0 && z == 0.0 ? this : new FinePositionImpl(this.x() + x, this.y() + y, this.z() + z); + return x == 0.0 && y == 0.0 && z == 0.0 ? this : new FinePositionImpl(this.x() + x, this.y() + y, this.z() + z);
+ } + }
+} +}
@ -192,10 +195,10 @@ index 0000000000000000000000000000000000000000..93476aaf8d21efb5a30b6d2cc2eeda81
+} +}
diff --git a/src/main/java/io/papermc/paper/math/Position.java b/src/main/java/io/papermc/paper/math/Position.java diff --git a/src/main/java/io/papermc/paper/math/Position.java b/src/main/java/io/papermc/paper/math/Position.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d9f242740 index 0000000000000000000000000000000000000000..0e6a6a6738353b118e0ed093994dda06750700c4
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/math/Position.java +++ b/src/main/java/io/papermc/paper/math/Position.java
@@ -0,0 +1,191 @@ @@ -0,0 +1,192 @@
+package io.papermc.paper.math; +package io.papermc.paper.math;
+ +
+import org.bukkit.Location; +import org.bukkit.Location;
@ -203,7 +206,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+import org.bukkit.util.Vector; +import org.bukkit.util.Vector;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Common interface for {@link FinePosition} and {@link BlockPosition}. + * Common interface for {@link FinePosition} and {@link BlockPosition}.
@ -211,6 +214,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * <b>May see breaking changes until Experimental annotation is removed.</b> + * <b>May see breaking changes until Experimental annotation is removed.</b>
+ */ + */
+@ApiStatus.Experimental +@ApiStatus.Experimental
+@NullMarked
+public interface Position { +public interface Position {
+ +
+ FinePosition FINE_ZERO = new FinePositionImpl(0, 0, 0); + FinePosition FINE_ZERO = new FinePositionImpl(0, 0, 0);
@ -287,7 +291,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @param z z value to offset + * @param z z value to offset
+ * @return the offset position + * @return the offset position
+ */ + */
+ @NotNull Position offset(int x, int y, int z); + Position offset(int x, int y, int z);
+ +
+ /** + /**
+ * Returns a position offset by the specified amounts. + * Returns a position offset by the specified amounts.
@ -297,7 +301,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @param z z value to offset + * @param z z value to offset
+ * @return the offset position + * @return the offset position
+ */ + */
+ @NotNull FinePosition offset(double x, double y, double z); + FinePosition offset(double x, double y, double z);
+ +
+ /** + /**
+ * Returns a new position at the center of the block position this represents + * Returns a new position at the center of the block position this represents
@ -305,7 +309,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @return a new center position + * @return a new center position
+ */ + */
+ @Contract(value = "-> new", pure = true) + @Contract(value = "-> new", pure = true)
+ default @NotNull FinePosition toCenter() { + default FinePosition toCenter() {
+ return new FinePositionImpl(this.blockX() + 0.5, this.blockY() + 0.5, this.blockZ() + 0.5); + return new FinePositionImpl(this.blockX() + 0.5, this.blockY() + 0.5, this.blockZ() + 0.5);
+ } + }
+ +
@ -316,7 +320,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @return the block position + * @return the block position
+ */ + */
+ @Contract(pure = true) + @Contract(pure = true)
+ @NotNull BlockPosition toBlock(); + BlockPosition toBlock();
+ +
+ /** + /**
+ * Converts this position to a vector + * Converts this position to a vector
@ -324,7 +328,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @return a new vector + * @return a new vector
+ */ + */
+ @Contract(value = "-> new", pure = true) + @Contract(value = "-> new", pure = true)
+ default @NotNull Vector toVector() { + default Vector toVector() {
+ return new Vector(this.x(), this.y(), this.z()); + return new Vector(this.x(), this.y(), this.z());
+ } + }
+ +
@ -335,7 +339,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @return a new location + * @return a new location
+ */ + */
+ @Contract(value = "_ -> new", pure = true) + @Contract(value = "_ -> new", pure = true)
+ default @NotNull Location toLocation(@NotNull World world) { + default Location toLocation(final World world) {
+ return new Location(world, this.x(), this.y(), this.z()); + return new Location(world, this.x(), this.y(), this.z());
+ } + }
+ +
@ -348,7 +352,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @return a position with those coords + * @return a position with those coords
+ */ + */
+ @Contract(value = "_, _, _ -> new", pure = true) + @Contract(value = "_, _, _ -> new", pure = true)
+ static @NotNull BlockPosition block(int x, int y, int z) { + static BlockPosition block(final int x, final int y, final int z) {
+ return new BlockPositionImpl(x, y, z); + return new BlockPositionImpl(x, y, z);
+ } + }
+ +
@ -359,7 +363,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @return a new position at that location + * @return a new position at that location
+ */ + */
+ @Contract(value = "_ -> new", pure = true) + @Contract(value = "_ -> new", pure = true)
+ static @NotNull BlockPosition block(@NotNull Location location) { + static BlockPosition block(final Location location) {
+ return new BlockPositionImpl(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + return new BlockPositionImpl(location.getBlockX(), location.getBlockY(), location.getBlockZ());
+ } + }
+ +
@ -372,7 +376,7 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @return a position with those coords + * @return a position with those coords
+ */ + */
+ @Contract(value = "_, _, _ -> new", pure = true) + @Contract(value = "_, _, _ -> new", pure = true)
+ static @NotNull FinePosition fine(double x, double y, double z) { + static FinePosition fine(final double x, final double y, final double z) {
+ return new FinePositionImpl(x, y, z); + return new FinePositionImpl(x, y, z);
+ } + }
+ +
@ -383,12 +387,12 @@ index 0000000000000000000000000000000000000000..26bc5a0fa67855af87c8fd4cd8229b4d
+ * @return a new position at that location + * @return a new position at that location
+ */ + */
+ @Contract(value = "_ -> new", pure = true) + @Contract(value = "_ -> new", pure = true)
+ static @NotNull FinePosition fine(@NotNull Location location) { + static FinePosition fine(final Location location) {
+ return new FinePositionImpl(location.getX(), location.getY(), location.getZ()); + return new FinePositionImpl(location.getX(), location.getY(), location.getZ());
+ } + }
+} +}
diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java
index 7c4db051472fb6a6c6d24092dc6f75487356690a..85c342fc50f2fe0ce9a1b3980df9e088c3dea92d 100644 index 734054f1e8dad74c13d7ae0b1c1af2d9f45b2636..bc8a64d54e001eae6ef4520a49e261b96c5ae9f3 100644
--- a/src/main/java/org/bukkit/Location.java --- a/src/main/java/org/bukkit/Location.java
+++ b/src/main/java/org/bukkit/Location.java +++ b/src/main/java/org/bukkit/Location.java
@@ -20,7 +20,7 @@ import org.jetbrains.annotations.Nullable; @@ -20,7 +20,7 @@ import org.jetbrains.annotations.Nullable;

Datei anzeigen

@ -8,7 +8,7 @@ expose isRunning
diff --git a/src/main/java/co/aikar/timings/FullServerTickHandler.java b/src/main/java/co/aikar/timings/FullServerTickHandler.java diff --git a/src/main/java/co/aikar/timings/FullServerTickHandler.java b/src/main/java/co/aikar/timings/FullServerTickHandler.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..3e747abde6fefae90f1c15cb00158bc5303cbe50 index 0000000000000000000000000000000000000000..73b125979e2f2dfd13cbf689a90b29cc68a36e09
--- /dev/null --- /dev/null
+++ b/src/main/java/co/aikar/timings/FullServerTickHandler.java +++ b/src/main/java/co/aikar/timings/FullServerTickHandler.java
@@ -0,0 +1,89 @@ @@ -0,0 +1,89 @@
@ -94,7 +94,7 @@ index 0000000000000000000000000000000000000000..3e747abde6fefae90f1c15cb00158bc5
+ TimingsManager.HISTORY.add(new TimingHistory()); + TimingsManager.HISTORY.add(new TimingHistory());
+ TimingsManager.resetTimings(); + TimingsManager.resetTimings();
+ } + }
+ Bukkit.getUnsafe().reportTimings(); + //Bukkit.getUnsafe().reportTimings();
+ } + }
+ +
+ boolean isViolated() { + boolean isViolated() {
@ -1275,10 +1275,10 @@ index 0000000000000000000000000000000000000000..df142a89b8c43acb81eb383eac0ef048
+} +}
diff --git a/src/main/java/co/aikar/timings/Timings.java b/src/main/java/co/aikar/timings/Timings.java diff --git a/src/main/java/co/aikar/timings/Timings.java b/src/main/java/co/aikar/timings/Timings.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..e81d0bc309de877ed2b5da6122f55c162e9b5f10 index 0000000000000000000000000000000000000000..95b7cdf0677ef71e6885fa78aa5c75bb500f5f53
--- /dev/null --- /dev/null
+++ b/src/main/java/co/aikar/timings/Timings.java +++ b/src/main/java/co/aikar/timings/Timings.java
@@ -0,0 +1,331 @@ @@ -0,0 +1,325 @@
+/* +/*
+ * This file is licensed under the MIT License (MIT). + * This file is licensed under the MIT License (MIT).
+ * + *
@ -1426,14 +1426,8 @@ index 0000000000000000000000000000000000000000..e81d0bc309de877ed2b5da6122f55c16
+ * @param enabled Should timings be reported + * @param enabled Should timings be reported
+ */ + */
+ public static void setTimingsEnabled(boolean enabled) { + public static void setTimingsEnabled(boolean enabled) {
+ timingsEnabled = enabled; + if (enabled && !warnedAboutDeprecationOnEnable) {
+ warnAboutDeprecationOnEnable(); + Bukkit.getLogger().severe(PlainTextComponentSerializer.plainText().serialize(deprecationMessage()));
+ reset();
+ }
+
+ private static void warnAboutDeprecationOnEnable() {
+ if (timingsEnabled && !warnedAboutDeprecationOnEnable) {
+ Bukkit.getLogger().warning(PlainTextComponentSerializer.plainText().serialize(deprecationMessage()));
+ warnedAboutDeprecationOnEnable = true; + warnedAboutDeprecationOnEnable = true;
+ } + }
+ } + }
@ -1441,7 +1435,7 @@ index 0000000000000000000000000000000000000000..e81d0bc309de877ed2b5da6122f55c16
+ public static Component deprecationMessage() { + public static Component deprecationMessage() {
+ return Component.text() + return Component.text()
+ .color(TextColor.color(0xffc93a)) + .color(TextColor.color(0xffc93a))
+ .append(Component.text("[!] The timings profiler has been enabled but has been scheduled for removal from Paper in the future.")) + .append(Component.text("[!] The timings profiler is in no-op mode and will be fully removed in a later update."))
+ .append(Component.newline()) + .append(Component.newline())
+ .append(Component.text(" We recommend migrating to the spark profiler.")) + .append(Component.text(" We recommend migrating to the spark profiler."))
+ .append(Component.newline()) + .append(Component.newline())
@ -1612,10 +1606,10 @@ index 0000000000000000000000000000000000000000..e81d0bc309de877ed2b5da6122f55c16
+ +
diff --git a/src/main/java/co/aikar/timings/TimingsCommand.java b/src/main/java/co/aikar/timings/TimingsCommand.java diff --git a/src/main/java/co/aikar/timings/TimingsCommand.java b/src/main/java/co/aikar/timings/TimingsCommand.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..95d87c9dbf2b237787294dfbe7fed87a36e6dedf index 0000000000000000000000000000000000000000..b83e5ff7ada8771fdf27ba9807c77ba6a4ce12da
--- /dev/null --- /dev/null
+++ b/src/main/java/co/aikar/timings/TimingsCommand.java +++ b/src/main/java/co/aikar/timings/TimingsCommand.java
@@ -0,0 +1,126 @@ @@ -0,0 +1,127 @@
+/* +/*
+ * This file is licensed under the MIT License (MIT). + * This file is licensed under the MIT License (MIT).
+ * + *
@ -1674,8 +1668,9 @@ index 0000000000000000000000000000000000000000..95d87c9dbf2b237787294dfbe7fed87a
+ if (!testPermission(sender)) { + if (!testPermission(sender)) {
+ return true; + return true;
+ } + }
+ if (false) { + if (true) {
+ sender.sendMessage(Timings.deprecationMessage()); + sender.sendMessage(Timings.deprecationMessage());
+ return true;
+ } + }
+ if (args.length < 1) { + if (args.length < 1) {
+ sender.sendMessage(text("Usage: " + this.usageMessage, NamedTextColor.RED)); + sender.sendMessage(text("Usage: " + this.usageMessage, NamedTextColor.RED));
@ -2864,7 +2859,7 @@ index 0000000000000000000000000000000000000000..3e61a926620a67daec3af54b72a1b911
+ } + }
+} +}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index fe6c43405e3f11272c1ff015f1dcd47129a68d41..8d729fb196d83e01e4652fb1f77f5cab7b57cc31 100644 index fed32ada5a5ba6906c0f8e854ad71fd691fe5811..ad4e37b2ce25c5a1d23d663511fff137ce2f29cb 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -870,7 +870,6 @@ public final class Bukkit { @@ -870,7 +870,6 @@ public final class Bukkit {
@ -2876,10 +2871,10 @@ index fe6c43405e3f11272c1ff015f1dcd47129a68d41..8d729fb196d83e01e4652fb1f77f5cab
/** /**
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index fa6ad07214d5e38866bf6bee9139c6c938e9f51a..57c9b560c77a56588870598acb543469040ceec1 100644 index 862f18d72deb1cb56de3f3f31275297a03d9ba0a..c11d3686ff770b25b7fd165426f0bfaa224a5916 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -1960,6 +1960,26 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -1978,6 +1978,26 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
@ -2906,35 +2901,6 @@ index fa6ad07214d5e38866bf6bee9139c6c938e9f51a..57c9b560c77a56588870598acb543469
/** /**
* Sends the component to the player * Sends the component to the player
* *
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
index d8b346fe0f9634218954fe818d53272a0896af9c..12ef99f1c91b92a133611c5f5aeaaeebd02ce232 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -40,6 +40,11 @@ public interface UnsafeValues {
net.kyori.adventure.text.Component resolveWithContext(net.kyori.adventure.text.Component component, org.bukkit.command.CommandSender context, org.bukkit.entity.Entity scoreboardSubject, boolean bypassPermissions) throws java.io.IOException;
// Paper end
+ /**
+ * @deprecated Timings will be removed in the future
+ */
+ @Deprecated(forRemoval = true)
+ void reportTimings(); // Paper
Material toLegacy(Material material);
Material fromLegacy(Material material);
@@ -151,4 +156,12 @@ public interface UnsafeValues {
return !Bukkit.getUnsafe().isSupportedApiVersion(plugin.getDescription().getAPIVersion());
}
// Paper end
+
+ // Paper start
+ /**
+ * @deprecated Timings will be removed in the future
+ */
+ @Deprecated(forRemoval = true)
+ String getTimingsServerName();
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/command/BufferedCommandSender.java b/src/main/java/org/bukkit/command/BufferedCommandSender.java diff --git a/src/main/java/org/bukkit/command/BufferedCommandSender.java b/src/main/java/org/bukkit/command/BufferedCommandSender.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..45ed63797b13e114bf3795c80a6c3967d8eb2351 index 0000000000000000000000000000000000000000..45ed63797b13e114bf3795c80a6c3967d8eb2351
@ -3484,10 +3450,10 @@ index 516d7fc7812aac343782861d0d567f54aa578c2a..00000000000000000000000000000000
- // Spigot end - // Spigot end
-} -}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 5bcec42a91859002409cab9756999e5adc4c867f..3594b0eb4068c83c93efe948a8ef4ba217edce17 100644 index cab45a41e54599588007c9b02a23d1b148dd89f1..205455c3a4ff9664e978814c839f8f2190a180e2 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -2731,7 +2731,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -2771,7 +2771,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@Deprecated // Paper @Deprecated // Paper
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @Nullable java.util.UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent... components) { public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @Nullable java.util.UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
@ -3508,7 +3474,7 @@ index 5bcec42a91859002409cab9756999e5adc4c867f..3594b0eb4068c83c93efe948a8ef4ba2
@NotNull @NotNull
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
index 46c7be5fa69f13900860b9944523beea16f2409b..6018574cd15b802833613beefa88da15dc2730cb 100644 index 46c7be5fa69f13900860b9944523beea16f2409b..f97669c8b58bc287fc289eeb098836ae314b053a 100644
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
@@ -381,7 +381,6 @@ public final class SimplePluginManager implements PluginManager { @@ -381,7 +381,6 @@ public final class SimplePluginManager implements PluginManager {
@ -3559,9 +3525,11 @@ index 46c7be5fa69f13900860b9944523beea16f2409b..6018574cd15b802833613beefa88da15
} }
/** /**
@@ -933,7 +933,7 @@ public final class SimplePluginManager implements PluginManager { @@ -932,8 +932,9 @@ public final class SimplePluginManager implements PluginManager {
*
* @param use True if per event timing code should be used * @param use True if per event timing code should be used
*/ */
+ @Deprecated(forRemoval = true)
public void useTimings(boolean use) { public void useTimings(boolean use) {
- useTimings = use; - useTimings = use;
+ co.aikar.timings.Timings.setTimingsEnabled(use); // Paper + co.aikar.timings.Timings.setTimingsEnabled(use); // Paper

Datei anzeigen

@ -7,7 +7,7 @@ Subject: [PATCH] Add command line option to load extra plugin jars not in the
ex: java -jar paperclip.jar nogui -add-plugin=/path/to/plugin.jar -add-plugin=/path/to/another/plugin_jar.jar ex: java -jar paperclip.jar nogui -add-plugin=/path/to/plugin.jar -add-plugin=/path/to/another/plugin_jar.jar
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index 6ecab28705afc0e3652677b516d8a5398e8b2666..db51751d2dc1ac419e8fac32466ad3a7727fa2fe 100644 index 8d729fb196d83e01e4652fb1f77f5cab7b57cc31..d978c72cdbc10792f852a4ba372518073893d02b 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -83,6 +83,20 @@ public final class Bukkit { @@ -83,6 +83,20 @@ public final class Bukkit {
@ -32,7 +32,7 @@ index 6ecab28705afc0e3652677b516d8a5398e8b2666..db51751d2dc1ac419e8fac32466ad3a7
* Attempts to set the {@link Server} singleton. * Attempts to set the {@link Server} singleton.
* <p> * <p>
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index f4b2ad91c7a46af5fc16f31369d155e4e3ab3aae..638e98416fdf7ac065abe058d625b1c924be5abb 100644 index 57c9b560c77a56588870598acb543469040ceec1..8949b8e29ae7f412481291630a5cb7b5b8809842 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -68,6 +68,18 @@ import org.jetbrains.annotations.Nullable; @@ -68,6 +68,18 @@ import org.jetbrains.annotations.Nullable;
@ -55,7 +55,7 @@ index f4b2ad91c7a46af5fc16f31369d155e4e3ab3aae..638e98416fdf7ac065abe058d625b1c9
* Used for all administrative messages, such as an operator using a * Used for all administrative messages, such as an operator using a
* command. * command.
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
index 6018574cd15b802833613beefa88da15dc2730cb..e7b1895d3918487d711afcbe41d76863d85c0a62 100644 index f97669c8b58bc287fc289eeb098836ae314b053a..2c77b6ab388bd689acb8d84ec62bd5df1eb9373e 100644
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
@@ -117,9 +117,22 @@ public final class SimplePluginManager implements PluginManager { @@ -117,9 +117,22 @@ public final class SimplePluginManager implements PluginManager {

Datei anzeigen

@ -5,10 +5,10 @@ Subject: [PATCH] Player affects spawning API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 3594b0eb4068c83c93efe948a8ef4ba217edce17..1ba2f706a62ee6962451305b1895654453b485cd 100644 index 22de066aef71ad2cf135d5b6f5d6f224de5fcd2d..1c25725a2abb36a81b1821102daee447c7170197 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -2583,6 +2583,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -2623,6 +2623,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@Deprecated // Paper @Deprecated // Paper
public String getLocale(); public String getLocale();

Datei anzeigen

@ -5,10 +5,10 @@ Subject: [PATCH] Add getTPS method
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index d978c72cdbc10792f852a4ba372518073893d02b..5780003631beae773231afe3afc6b834bfe1f84d 100644 index 027e96c0e42d701417e16acaa5470d836146ffa6..d0f618136bf5e1f2dcafc9f7c01cebf0f285f20c 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -2108,6 +2108,17 @@ public final class Bukkit { @@ -2132,6 +2132,17 @@ public final class Bukkit {
return server.getEntity(uuid); return server.getEntity(uuid);
} }
@ -27,10 +27,10 @@ index d978c72cdbc10792f852a4ba372518073893d02b..5780003631beae773231afe3afc6b834
* Get the advancement specified by this key. * Get the advancement specified by this key.
* *
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 8949b8e29ae7f412481291630a5cb7b5b8809842..ba28d9f3213ca4b5f15178dc637bff37a8896edc 100644 index f2cab649bc0771254c7aa9ef0e3f47b4d86b329d..aecba92a6842fba3642bb2596239489230629439 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -1797,6 +1797,16 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -1815,6 +1815,16 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@Nullable @Nullable
Entity getEntity(@NotNull UUID uuid); Entity getEntity(@NotNull UUID uuid);

Datei anzeigen

@ -10,18 +10,21 @@ Co-authored-by: Riley Park <rileysebastianpark@gmail.com>
diff --git a/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java b/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java diff --git a/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java b/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..a736d7bcdc5861a01b66ba36158db1c716339346 index 0000000000000000000000000000000000000000..023cc52a9e28e1238c7452c0f3f577f2850fd861
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java +++ b/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java
@@ -0,0 +1,45 @@ @@ -0,0 +1,47 @@
+package com.destroystokyo.paper.util; +package com.destroystokyo.paper.util;
+ +
+import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.NamedTextColor;
+import org.bukkit.Bukkit; +import org.bukkit.Bukkit;
+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+ +
+@NullMarked
+public interface VersionFetcher { +public interface VersionFetcher {
+
+ /** + /**
+ * Amount of time to cache results for in milliseconds + * Amount of time to cache results for in milliseconds
+ * <p> + * <p>
@ -39,9 +42,9 @@ index 0000000000000000000000000000000000000000..a736d7bcdc5861a01b66ba36158db1c7
+ * @param serverVersion the current version of the server (will match {@link Bukkit#getVersion()}) + * @param serverVersion the current version of the server (will match {@link Bukkit#getVersion()})
+ * @return the message to show when requesting a version + * @return the message to show when requesting a version
+ */ + */
+ @NotNull + Component getVersionMessage(String serverVersion);
+ Component getVersionMessage(@NotNull String serverVersion);
+ +
+ @ApiStatus.Internal
+ class DummyVersionFetcher implements VersionFetcher { + class DummyVersionFetcher implements VersionFetcher {
+ +
+ @Override + @Override
@ -49,9 +52,8 @@ index 0000000000000000000000000000000000000000..a736d7bcdc5861a01b66ba36158db1c7
+ return -1; + return -1;
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public Component getVersionMessage(@NotNull String serverVersion) { + public Component getVersionMessage(final String serverVersion) {
+ Bukkit.getLogger().warning("Version provider has not been set, cannot check for updates!"); + Bukkit.getLogger().warning("Version provider has not been set, cannot check for updates!");
+ Bukkit.getLogger().info("Override the default implementation of org.bukkit.UnsafeValues#getVersionFetcher()"); + Bukkit.getLogger().info("Override the default implementation of org.bukkit.UnsafeValues#getVersionFetcher()");
+ new Throwable().printStackTrace(); + new Throwable().printStackTrace();
@ -61,10 +63,10 @@ index 0000000000000000000000000000000000000000..a736d7bcdc5861a01b66ba36158db1c7
+} +}
diff --git a/src/main/java/io/papermc/paper/ServerBuildInfo.java b/src/main/java/io/papermc/paper/ServerBuildInfo.java diff --git a/src/main/java/io/papermc/paper/ServerBuildInfo.java b/src/main/java/io/papermc/paper/ServerBuildInfo.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..9df9d09aa477d4cd3c496ba0933c816df1ef0964 index 0000000000000000000000000000000000000000..652ff54e7c50412503725d628bfe72ed03059790
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/ServerBuildInfo.java +++ b/src/main/java/io/papermc/paper/ServerBuildInfo.java
@@ -0,0 +1,121 @@ @@ -0,0 +1,122 @@
+package io.papermc.paper; +package io.papermc.paper;
+ +
+import java.time.Instant; +import java.time.Instant;
@ -73,11 +75,12 @@ index 0000000000000000000000000000000000000000..9df9d09aa477d4cd3c496ba0933c816d
+import net.kyori.adventure.key.Key; +import net.kyori.adventure.key.Key;
+import net.kyori.adventure.util.Services; +import net.kyori.adventure.util.Services;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Information about the current server build. + * Information about the current server build.
+ */ + */
+@NullMarked
+@ApiStatus.NonExtendable +@ApiStatus.NonExtendable
+public interface ServerBuildInfo { +public interface ServerBuildInfo {
+ /** + /**
@ -90,7 +93,7 @@ index 0000000000000000000000000000000000000000..9df9d09aa477d4cd3c496ba0933c816d
+ * + *
+ * @return the {@code ServerBuildInfo} + * @return the {@code ServerBuildInfo}
+ */ + */
+ static @NotNull ServerBuildInfo buildInfo() { + static ServerBuildInfo buildInfo() {
+ //<editor-fold defaultstate="collapsed" desc="Holder"> + //<editor-fold defaultstate="collapsed" desc="Holder">
+ final class Holder { + final class Holder {
+ static final Optional<ServerBuildInfo> INSTANCE = Services.service(ServerBuildInfo.class); + static final Optional<ServerBuildInfo> INSTANCE = Services.service(ServerBuildInfo.class);
@ -104,7 +107,7 @@ index 0000000000000000000000000000000000000000..9df9d09aa477d4cd3c496ba0933c816d
+ * + *
+ * @return the brand id of the server (e.g. "papermc:paper") + * @return the brand id of the server (e.g. "papermc:paper")
+ */ + */
+ @NotNull Key brandId(); + Key brandId();
+ +
+ /** + /**
+ * Checks if the current server supports the specified brand. + * Checks if the current server supports the specified brand.
@ -113,56 +116,56 @@ index 0000000000000000000000000000000000000000..9df9d09aa477d4cd3c496ba0933c816d
+ * @return {@code true} if the server supports the specified brand + * @return {@code true} if the server supports the specified brand
+ */ + */
+ @ApiStatus.Experimental + @ApiStatus.Experimental
+ boolean isBrandCompatible(final @NotNull Key brandId); + boolean isBrandCompatible(final Key brandId);
+ +
+ /** + /**
+ * Gets the brand name of the server. + * Gets the brand name of the server.
+ * + *
+ * @return the brand name of the server (e.g. "Paper") + * @return the brand name of the server (e.g. "Paper")
+ */ + */
+ @NotNull String brandName(); + String brandName();
+ +
+ /** + /**
+ * Gets the Minecraft version id. + * Gets the Minecraft version id.
+ * + *
+ * @return the Minecraft version id (e.g. "1.20.4", "1.20.2-pre2", "23w31a") + * @return the Minecraft version id (e.g. "1.20.4", "1.20.2-pre2", "23w31a")
+ */ + */
+ @NotNull String minecraftVersionId(); + String minecraftVersionId();
+ +
+ /** + /**
+ * Gets the Minecraft version name. + * Gets the Minecraft version name.
+ * + *
+ * @return the Minecraft version name (e.g. "1.20.4", "1.20.2 Pre-release 2", "23w31a") + * @return the Minecraft version name (e.g. "1.20.4", "1.20.2 Pre-release 2", "23w31a")
+ */ + */
+ @NotNull String minecraftVersionName(); + String minecraftVersionName();
+ +
+ /** + /**
+ * Gets the build number. + * Gets the build number.
+ * + *
+ * @return the build number + * @return the build number
+ */ + */
+ @NotNull OptionalInt buildNumber(); + OptionalInt buildNumber();
+ +
+ /** + /**
+ * Gets the build time. + * Gets the build time.
+ * + *
+ * @return the build time + * @return the build time
+ */ + */
+ @NotNull Instant buildTime(); + Instant buildTime();
+ +
+ /** + /**
+ * Gets the git commit branch. + * Gets the git commit branch.
+ * + *
+ * @return the git commit branch + * @return the git commit branch
+ */ + */
+ @NotNull Optional<String> gitBranch(); + Optional<String> gitBranch();
+ +
+ /** + /**
+ * Gets the git commit hash. + * Gets the git commit hash.
+ * + *
+ * @return the git commit hash + * @return the git commit hash
+ */ + */
+ @NotNull Optional<String> gitCommit(); + Optional<String> gitCommit();
+ +
+ /** + /**
+ * Creates a string representation of the server build information. + * Creates a string representation of the server build information.
@ -170,7 +173,7 @@ index 0000000000000000000000000000000000000000..9df9d09aa477d4cd3c496ba0933c816d
+ * @param representation the type of representation + * @param representation the type of representation
+ * @return a string + * @return a string
+ */ + */
+ @NotNull String asString(final @NotNull StringRepresentation representation); + String asString(final StringRepresentation representation);
+ +
+ /** + /**
+ * String representation types. + * String representation types.
@ -188,10 +191,10 @@ index 0000000000000000000000000000000000000000..9df9d09aa477d4cd3c496ba0933c816d
+} +}
diff --git a/src/main/java/io/papermc/paper/util/JarManifests.java b/src/main/java/io/papermc/paper/util/JarManifests.java diff --git a/src/main/java/io/papermc/paper/util/JarManifests.java b/src/main/java/io/papermc/paper/util/JarManifests.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..909617079db61b675cc7b60b44ef96b306076343 index 0000000000000000000000000000000000000000..7915a70d676b1205dcae39259f670af258a1ab9b
--- /dev/null --- /dev/null
+++ b/src/main/java/io/papermc/paper/util/JarManifests.java +++ b/src/main/java/io/papermc/paper/util/JarManifests.java
@@ -0,0 +1,37 @@ @@ -0,0 +1,38 @@
+package io.papermc.paper.util; +package io.papermc.paper.util;
+ +
+import java.io.IOException; +import java.io.IOException;
@ -202,9 +205,10 @@ index 0000000000000000000000000000000000000000..909617079db61b675cc7b60b44ef96b3
+import java.util.WeakHashMap; +import java.util.WeakHashMap;
+import java.util.jar.Manifest; +import java.util.jar.Manifest;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+ +
+@NullMarked
+@ApiStatus.Internal +@ApiStatus.Internal
+public final class JarManifests { +public final class JarManifests {
+ private JarManifests() { + private JarManifests() {
@ -212,7 +216,7 @@ index 0000000000000000000000000000000000000000..909617079db61b675cc7b60b44ef96b3
+ +
+ private static final Map<ClassLoader, Manifest> MANIFESTS = Collections.synchronizedMap(new WeakHashMap<>()); + private static final Map<ClassLoader, Manifest> MANIFESTS = Collections.synchronizedMap(new WeakHashMap<>());
+ +
+ public static @Nullable Manifest manifest(final @NotNull Class<?> clazz) { + public static @Nullable Manifest manifest(final Class<?> clazz) {
+ return MANIFESTS.computeIfAbsent(clazz.getClassLoader(), classLoader -> { + return MANIFESTS.computeIfAbsent(clazz.getClassLoader(), classLoader -> {
+ final String classLocation = "/" + clazz.getName().replace(".", "/") + ".class"; + final String classLocation = "/" + clazz.getName().replace(".", "/") + ".class";
+ final URL resource = clazz.getResource(classLocation); + final URL resource = clazz.getResource(classLocation);
@ -312,21 +316,22 @@ index ba28d9f3213ca4b5f15178dc637bff37a8896edc..8a07f21eeb04fb54032ce377a1478f60
* Gets a view of all currently logged in players. This {@linkplain * Gets a view of all currently logged in players. This {@linkplain
* Collections#unmodifiableCollection(Collection) view} is a reused * Collections#unmodifiableCollection(Collection) view} is a reused
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
index 12ef99f1c91b92a133611c5f5aeaaeebd02ce232..6e67fdb091a006d2d13bc2d93db4d55348af4c8f 100644 index e320729782245b5511cd744c417141508020fd26..8b5e4756d1c80e55be166dbe1faf57799f9cc03b 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java --- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java +++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -163,5 +163,12 @@ public interface UnsafeValues { @@ -156,4 +156,13 @@ public interface UnsafeValues {
*/ return !Bukkit.getUnsafe().isSupportedApiVersion(plugin.getDescription().getAPIVersion());
@Deprecated(forRemoval = true) }
String getTimingsServerName(); // Paper end
+ +
+ // Paper start
+ /** + /**
+ * Called once by the version command on first use, then cached. + * Called once by the version command on first use, then cached.
+ */ + */
+ default com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { + default com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() {
+ return new com.destroystokyo.paper.util.VersionFetcher.DummyVersionFetcher(); + return new com.destroystokyo.paper.util.VersionFetcher.DummyVersionFetcher();
+ } + }
// Paper end + // Paper end
} }
diff --git a/src/main/java/org/bukkit/command/defaults/VersionCommand.java b/src/main/java/org/bukkit/command/defaults/VersionCommand.java diff --git a/src/main/java/org/bukkit/command/defaults/VersionCommand.java b/src/main/java/org/bukkit/command/defaults/VersionCommand.java
index 263208d3cba36cb80c9ee4e3022ef702ea113df2..e64bb57f74e6d6f78927be228825b3e0bdf41f48 100644 index 263208d3cba36cb80c9ee4e3022ef702ea113df2..e64bb57f74e6d6f78927be228825b3e0bdf41f48 100644

Datei anzeigen

@ -79,10 +79,10 @@ index 9732929b666b0a5e1a2a41c8e8794cc4f2535e41..0a3a66e04f8785874f10a76603bff464
* Gets all generated structures that intersect the chunk at the given * Gets all generated structures that intersect the chunk at the given
* coordinates. <br> * coordinates. <br>
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 1ba2f706a62ee6962451305b1895654453b485cd..7d530bd0e4d833da760d1cf82aba966b7fb480b1 100644 index 1c25725a2abb36a81b1821102daee447c7170197..28e821ca1ec8ec3eba160ef2ed06ab1bb7387cae 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -2597,6 +2597,82 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -2637,6 +2637,82 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param affects Whether the player can affect mob spawning * @param affects Whether the player can affect mob spawning
*/ */
public void setAffectsSpawning(boolean affects); public void setAffectsSpawning(boolean affects);

Datei anzeigen

@ -6,10 +6,10 @@ Subject: [PATCH] Add BeaconEffectEvent
diff --git a/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java b/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java b/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..7270c1feece2dc15a4a0503c4bca93a1288f8f13 index 0000000000000000000000000000000000000000..741d0e73bc635a545c94c4b1254cee8f41ba8925
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java
@@ -0,0 +1,91 @@ @@ -0,0 +1,88 @@
+package com.destroystokyo.paper.event.block; +package com.destroystokyo.paper.event.block;
+ +
+import org.bukkit.block.Block; +import org.bukkit.block.Block;
@ -19,11 +19,12 @@ index 0000000000000000000000000000000000000000..7270c1feece2dc15a4a0503c4bca93a1
+import org.bukkit.event.block.BlockEvent; +import org.bukkit.event.block.BlockEvent;
+import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffect;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Called when a beacon effect is being applied to a player. + * Called when a beacon effect is being applied to a player.
+ */ + */
+@NullMarked
+public class BeaconEffectEvent extends BlockEvent implements Cancellable { +public class BeaconEffectEvent extends BlockEvent implements Cancellable {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
@ -35,7 +36,7 @@ index 0000000000000000000000000000000000000000..7270c1feece2dc15a4a0503c4bca93a1
+ private boolean cancelled; + private boolean cancelled;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public BeaconEffectEvent(@NotNull Block block, @NotNull PotionEffect effect, @NotNull Player player, boolean primary) { + public BeaconEffectEvent(final Block block, final PotionEffect effect, final Player player, final boolean primary) {
+ super(block); + super(block);
+ this.effect = effect; + this.effect = effect;
+ this.player = player; + this.player = player;
@ -47,7 +48,6 @@ index 0000000000000000000000000000000000000000..7270c1feece2dc15a4a0503c4bca93a1
+ * + *
+ * @return Potion effect + * @return Potion effect
+ */ + */
+ @NotNull
+ public PotionEffect getEffect() { + public PotionEffect getEffect() {
+ return this.effect; + return this.effect;
+ } + }
@ -57,7 +57,7 @@ index 0000000000000000000000000000000000000000..7270c1feece2dc15a4a0503c4bca93a1
+ * + *
+ * @param effect Potion effect + * @param effect Potion effect
+ */ + */
+ public void setEffect(@NotNull PotionEffect effect) { + public void setEffect(final PotionEffect effect) {
+ this.effect = effect; + this.effect = effect;
+ } + }
+ +
@ -66,7 +66,6 @@ index 0000000000000000000000000000000000000000..7270c1feece2dc15a4a0503c4bca93a1
+ * + *
+ * @return Affected player + * @return Affected player
+ */ + */
+ @NotNull
+ public Player getPlayer() { + public Player getPlayer() {
+ return this.player; + return this.player;
+ } + }
@ -86,17 +85,15 @@ index 0000000000000000000000000000000000000000..7270c1feece2dc15a4a0503c4bca93a1
+ } + }
+ +
+ @Override + @Override
+ public void setCancelled(boolean cancel) { + public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel; + this.cancelled = cancel;
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }

Datei anzeigen

@ -5,10 +5,10 @@ Subject: [PATCH] Expose server CommandMap
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index a005d5f8879262c763d8c4fbd09b9a99810d5e8c..26f3ac9c15ff554becfe8ea53a48f67b2de60ed6 100644 index f5a014c23766f1373c0e6abd0c68c2aca097f73b..603adc3be2444c0a575c4027b963a7642a34d0ca 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -2337,6 +2337,19 @@ public final class Bukkit { @@ -2361,6 +2361,19 @@ public final class Bukkit {
return server.getUnsafe(); return server.getUnsafe();
} }
@ -29,10 +29,10 @@ index a005d5f8879262c763d8c4fbd09b9a99810d5e8c..26f3ac9c15ff554becfe8ea53a48f67b
public static Server.Spigot spigot() { public static Server.Spigot spigot() {
return server.spigot(); return server.spigot();
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 8a07f21eeb04fb54032ce377a1478f60303e1824..d78481bf17818415524f14417caf86d5684b2235 100644 index 8c248efe16829c4715a9382c3e79d4a4594d193c..65ad3ee200d3899ac17abf55043857c9331add8b 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -1817,6 +1817,15 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -1835,6 +1835,15 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
public double[] getTPS(); public double[] getTPS();
// Paper end // Paper end

Datei anzeigen

@ -6,7 +6,7 @@ Subject: [PATCH] Graduate bungeecord chat API from spigot subclasses
Change Javadoc to be accurate Change Javadoc to be accurate
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index fe074fe9553f61bdd72b64830532a78415348781..4c5327da1468cb1f9af00a99e7e79f578c47ee2a 100644 index 26f3ac9c15ff554becfe8ea53a48f67b2de60ed6..bd3fa2bcee24ab7e8f740722f55ed6294fdb294a 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -472,6 +472,30 @@ public final class Bukkit { @@ -472,6 +472,30 @@ public final class Bukkit {
@ -41,7 +41,7 @@ index fe074fe9553f61bdd72b64830532a78415348781..4c5327da1468cb1f9af00a99e7e79f57
* Gets the name of the update folder. The update folder is used to safely * Gets the name of the update folder. The update folder is used to safely
* update plugins at the right moment on a plugin load. * update plugins at the right moment on a plugin load.
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 9545da2adacaf0bd719c2baef929588cd1042d25..19b75704ed9eee0c929df417e1e5d0ea3718e2f8 100644 index d78481bf17818415524f14417caf86d5684b2235..067eb3a5f5676f3b1b3f49a65df9c4054c48a1e7 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -383,6 +383,30 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -383,6 +383,30 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@ -76,10 +76,10 @@ index 9545da2adacaf0bd719c2baef929588cd1042d25..19b75704ed9eee0c929df417e1e5d0ea
* Gets the name of the update folder. The update folder is used to safely * Gets the name of the update folder. The update folder is used to safely
* update plugins at the right moment on a plugin load. * update plugins at the right moment on a plugin load.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 7d530bd0e4d833da760d1cf82aba966b7fb480b1..f9bacbfa223826b3b54525648080fda306a1ec36 100644 index 28e821ca1ec8ec3eba160ef2ed06ab1bb7387cae..fefd6b8a4171c9ec3d2a09d1accb9f37d66aa5b9 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -1214,6 +1214,42 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1254,6 +1254,42 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/ */
public void sendMap(@NotNull MapView map); public void sendMap(@NotNull MapView map);

Datei anzeigen

@ -6,30 +6,31 @@ Subject: [PATCH] Add exception reporting event
diff --git a/src/main/java/com/destroystokyo/paper/event/server/ServerExceptionEvent.java b/src/main/java/com/destroystokyo/paper/event/server/ServerExceptionEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/server/ServerExceptionEvent.java b/src/main/java/com/destroystokyo/paper/event/server/ServerExceptionEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..9377ee1c2368ce058397037952d17bc010f66957 index 0000000000000000000000000000000000000000..95a5a59e6bd88345177fca0b12008ddd689cb448
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/server/ServerExceptionEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/server/ServerExceptionEvent.java
@@ -0,0 +1,45 @@ @@ -0,0 +1,43 @@
+package com.destroystokyo.paper.event.server; +package com.destroystokyo.paper.event.server;
+ +
+import com.destroystokyo.paper.exception.ServerException;
+import org.bukkit.Bukkit; +import org.bukkit.Bukkit;
+import org.bukkit.event.Event; +import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+import com.destroystokyo.paper.exception.ServerException;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Called whenever an exception is thrown in a recoverable section of the server. + * Called whenever an exception is thrown in a recoverable section of the server.
+ */ + */
+@NullMarked
+public class ServerExceptionEvent extends Event { +public class ServerExceptionEvent extends Event {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final ServerException exception; + private final ServerException exception;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public ServerExceptionEvent(@NotNull ServerException exception) { + public ServerExceptionEvent(final ServerException exception) {
+ super(!Bukkit.isPrimaryThread()); + super(!Bukkit.isPrimaryThread());
+ this.exception = exception; + this.exception = exception;
+ } + }
@ -39,18 +40,15 @@ index 0000000000000000000000000000000000000000..9377ee1c2368ce058397037952d17bc0
+ * + *
+ * @return Exception thrown + * @return Exception thrown
+ */ + */
+ @NotNull
+ public ServerException getException() { + public ServerException getException() {
+ return this.exception; + return this.exception;
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
@ -496,7 +494,7 @@ index 36fc2c35395c72f8b81a2a2f3265fd205384ce26..c7fa1d235cea78bda4656ed66b8d42b1
} }
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
index e7b1895d3918487d711afcbe41d76863d85c0a62..003bece642b682985625db93cad93026352bfc66 100644 index 2c77b6ab388bd689acb8d84ec62bd5df1eb9373e..b878e7167cfcdea0e224c182b40abeadd339d3b3 100644
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
@@ -528,7 +528,8 @@ public final class SimplePluginManager implements PluginManager { @@ -528,7 +528,8 @@ public final class SimplePluginManager implements PluginManager {

Datei anzeigen

@ -432,10 +432,10 @@ index 0000000000000000000000000000000000000000..20a028450667edf102b59b6b50ac6e89
+ } + }
+} +}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index f9bacbfa223826b3b54525648080fda306a1ec36..a0317801b5a41d523324c1482356f26935f6a330 100644 index fefd6b8a4171c9ec3d2a09d1accb9f37d66aa5b9..2685a6fcda7afa23d3f5067af1d5d2fc89bdb0e6 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -1248,6 +1248,131 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1288,6 +1288,131 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
public default void sendMessage(net.md_5.bungee.api.ChatMessageType position, net.md_5.bungee.api.chat.BaseComponent... components) { public default void sendMessage(net.md_5.bungee.api.ChatMessageType position, net.md_5.bungee.api.chat.BaseComponent... components) {
spigot().sendMessage(position, components); spigot().sendMessage(position, components);
} }

Datei anzeigen

@ -7,7 +7,7 @@ Upstream added methods for this so the original methods
are now deprecated are now deprecated
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
index 67115810d5e837f154c3accd92dbb5e4192d264f..32e89741ffd895e31af0104a0126c2f72742a1bb 100644 index b5a302ba913d2de97f1bcd7c60fd5cd4f245d275..cafa79f80eec5ec6d8d31d40cc2b46acc06831f9 100644
--- a/src/main/java/org/bukkit/entity/LivingEntity.java --- a/src/main/java/org/bukkit/entity/LivingEntity.java
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java +++ b/src/main/java/org/bukkit/entity/LivingEntity.java
@@ -243,12 +243,44 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource @@ -243,12 +243,44 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
@ -56,7 +56,7 @@ index 67115810d5e837f154c3accd92dbb5e4192d264f..32e89741ffd895e31af0104a0126c2f7
/** /**
* Returns the living entity's current maximum no damage ticks. * Returns the living entity's current maximum no damage ticks.
@@ -777,4 +809,24 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource @@ -787,4 +819,24 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
* @return Whether the entity is invisible * @return Whether the entity is invisible
*/ */
public boolean isInvisible(); public boolean isInvisible();

Datei anzeigen

@ -5,10 +5,10 @@ Subject: [PATCH] Complete resource pack API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index a0317801b5a41d523324c1482356f26935f6a330..47c792202e8cc6d97fcb5e9bed98d327ecc5ab2b 100644 index 2685a6fcda7afa23d3f5067af1d5d2fc89bdb0e6..47a0d09b433024cd464737eced8a31f995b1ffaf 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -2212,6 +2212,180 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -2252,6 +2252,180 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
void setResourcePack(@NotNull UUID uuid, @NotNull String url, byte @Nullable [] hash, net.kyori.adventure.text.@Nullable Component prompt, boolean force); void setResourcePack(@NotNull UUID uuid, @NotNull String url, byte @Nullable [] hash, net.kyori.adventure.text.@Nullable Component prompt, boolean force);
// Paper end // Paper end

Datei anzeigen

@ -6,10 +6,10 @@ Subject: [PATCH] Add command to reload permissions.yml and require confirm to
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index bd3fa2bcee24ab7e8f740722f55ed6294fdb294a..d9f84c4a5bc5609e7d9fd0970696a46a32f3f5ff 100644 index 7d49ffba8e507762a61563b536dfbf93bffa644d..0360e070d9fbb45c84e0b95d4f4d2253202191a8 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -2372,6 +2372,13 @@ public final class Bukkit { @@ -2396,6 +2396,13 @@ public final class Bukkit {
public static org.bukkit.command.CommandMap getCommandMap() { public static org.bukkit.command.CommandMap getCommandMap() {
return server.getCommandMap(); return server.getCommandMap();
} }
@ -24,10 +24,10 @@ index bd3fa2bcee24ab7e8f740722f55ed6294fdb294a..d9f84c4a5bc5609e7d9fd0970696a46a
@NotNull @NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 067eb3a5f5676f3b1b3f49a65df9c4054c48a1e7..990d0d02d1bd95886126efe08e8107322e3199d5 100644 index 42ea960fe29a1638b9ef69bdd5c58caf963fe30a..b36b9bd8aa71ea5b9ea20d2752e6e59d33c9f978 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -2078,4 +2078,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -2096,4 +2096,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@NotNull @NotNull
Spigot spigot(); Spigot spigot();
// Spigot end // Spigot end

Datei anzeigen

@ -6,10 +6,10 @@ Subject: [PATCH] Entity AddTo/RemoveFrom World Events
diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EntityAddToWorldEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EntityAddToWorldEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EntityAddToWorldEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EntityAddToWorldEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..1d8e3c93a139bba11affca74b742269f24300d2c index 0000000000000000000000000000000000000000..11f8540a4752cf4d2112eff48bcca3b935c9f8b1
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/entity/EntityAddToWorldEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/entity/EntityAddToWorldEvent.java
@@ -0,0 +1,45 @@ @@ -0,0 +1,44 @@
+package com.destroystokyo.paper.event.entity; +package com.destroystokyo.paper.event.entity;
+ +
+import org.bukkit.World; +import org.bukkit.World;
@ -18,21 +18,22 @@ index 0000000000000000000000000000000000000000..1d8e3c93a139bba11affca74b742269f
+import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.CreatureSpawnEvent;
+import org.bukkit.event.entity.EntityEvent; +import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Fired any time an entity is being added to the world for any reason (including a chunk loading). + * Fired any time an entity is being added to the world for any reason (including a chunk loading).
+ * <p> + * <p>
+ * Not to be confused with {@link CreatureSpawnEvent} + * Not to be confused with {@link CreatureSpawnEvent}
+ */ + */
+@NullMarked
+public class EntityAddToWorldEvent extends EntityEvent { +public class EntityAddToWorldEvent extends EntityEvent {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final World world; + private final World world;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public EntityAddToWorldEvent(@NotNull Entity entity, @NotNull World world) { + public EntityAddToWorldEvent(final Entity entity, final World world) {
+ super(entity); + super(entity);
+ this.world = world; + this.world = world;
+ } + }
@ -40,27 +41,25 @@ index 0000000000000000000000000000000000000000..1d8e3c93a139bba11affca74b742269f
+ /** + /**
+ * @return The world that the entity is being added to + * @return The world that the entity is being added to
+ */ + */
+ @NotNull
+ public World getWorld() { + public World getWorld() {
+ return this.world; + return this.world;
+ } + }
+ +
+ @NotNull + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EntityRemoveFromWorldEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EntityRemoveFromWorldEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EntityRemoveFromWorldEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EntityRemoveFromWorldEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..d75e6a8334c7408ea8c3f155414fc14dc427f190 index 0000000000000000000000000000000000000000..5ad5632d4d47d8b42e4f2af19c0fe6cf94ac5643
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/entity/EntityRemoveFromWorldEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/entity/EntityRemoveFromWorldEvent.java
@@ -0,0 +1,43 @@ @@ -0,0 +1,42 @@
+package com.destroystokyo.paper.event.entity; +package com.destroystokyo.paper.event.entity;
+ +
+import org.bukkit.World; +import org.bukkit.World;
@ -68,20 +67,21 @@ index 0000000000000000000000000000000000000000..d75e6a8334c7408ea8c3f155414fc14d
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent; +import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Fired any time an entity is being removed from a world for any reason (including a chunk unloading). + * Fired any time an entity is being removed from a world for any reason (including a chunk unloading).
+ * Note: The entity is updated prior to this event being called, as such, the entity's world may not be equal to {@link #getWorld()}. + * Note: The entity is updated prior to this event being called, as such, the entity's world may not be equal to {@link #getWorld()}.
+ */ + */
+@NullMarked
+public class EntityRemoveFromWorldEvent extends EntityEvent { +public class EntityRemoveFromWorldEvent extends EntityEvent {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final World world; + private final World world;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public EntityRemoveFromWorldEvent(@NotNull Entity entity, @NotNull World world) { + public EntityRemoveFromWorldEvent(final Entity entity, final World world) {
+ super(entity); + super(entity);
+ this.world = world; + this.world = world;
+ } + }
@ -89,17 +89,15 @@ index 0000000000000000000000000000000000000000..d75e6a8334c7408ea8c3f155414fc14d
+ /** + /**
+ * @return The world that the entity is being removed from + * @return The world that the entity is being removed from
+ */ + */
+ @NotNull
+ public World getWorld() { + public World getWorld() {
+ return this.world; + return this.world;
+ } + }
+ +
+ @NotNull + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }

Datei anzeigen

@ -7,10 +7,10 @@ Fires when an Entity decides to start moving to a location.
diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EntityPathfindEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EntityPathfindEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EntityPathfindEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EntityPathfindEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..8267e8f1f0ade29a284831069e1268ee4b29e109 index 0000000000000000000000000000000000000000..8624e0a528985c9b118f5e8a0f33d3286af2fc36
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/entity/EntityPathfindEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/entity/EntityPathfindEvent.java
@@ -0,0 +1,87 @@ @@ -0,0 +1,84 @@
+package com.destroystokyo.paper.event.entity; +package com.destroystokyo.paper.event.entity;
+ +
+import org.bukkit.Location; +import org.bukkit.Location;
@ -19,8 +19,8 @@ index 0000000000000000000000000000000000000000..8267e8f1f0ade29a284831069e1268ee
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent; +import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+ +
+/** +/**
+ * Fired when an Entity decides to start moving towards a location. + * Fired when an Entity decides to start moving towards a location.
@ -28,16 +28,17 @@ index 0000000000000000000000000000000000000000..8267e8f1f0ade29a284831069e1268ee
+ * This event does not fire for the entities actual movement. Only when it + * This event does not fire for the entities actual movement. Only when it
+ * is choosing to start moving to a location. + * is choosing to start moving to a location.
+ */ + */
+@NullMarked
+public class EntityPathfindEvent extends EntityEvent implements Cancellable { +public class EntityPathfindEvent extends EntityEvent implements Cancellable {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @Nullable private final Entity targetEntity; + private final @Nullable Entity targetEntity;
+ @NotNull private final Location location; + private final Location location;
+ private boolean cancelled; + private boolean cancelled;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public EntityPathfindEvent(@NotNull Entity entity, @NotNull Location location, @Nullable Entity targetEntity) { + public EntityPathfindEvent(final Entity entity, final Location location, final @Nullable Entity targetEntity) {
+ super(entity); + super(entity);
+ this.targetEntity = targetEntity; + this.targetEntity = targetEntity;
+ this.location = location; + this.location = location;
@ -48,7 +49,7 @@ index 0000000000000000000000000000000000000000..8267e8f1f0ade29a284831069e1268ee
+ * + *
+ * @return The Entity that is pathfinding. + * @return The Entity that is pathfinding.
+ */ + */
+ @NotNull + @Override
+ public Entity getEntity() { + public Entity getEntity() {
+ return this.entity; + return this.entity;
+ } + }
@ -56,12 +57,11 @@ index 0000000000000000000000000000000000000000..8267e8f1f0ade29a284831069e1268ee
+ /** + /**
+ * If the Entity is trying to pathfind to an entity, this is the entity in relation. + * If the Entity is trying to pathfind to an entity, this is the entity in relation.
+ * <br> + * <br>
+ * Otherwise this will return {@code null}. + * Otherwise, this will return {@code null}.
+ * + *
+ * @return The entity target or {@code null} + * @return The entity target or {@code null}
+ */ + */
+ @Nullable + public @Nullable Entity getTargetEntity() {
+ public Entity getTargetEntity() {
+ return this.targetEntity; + return this.targetEntity;
+ } + }
+ +
@ -72,7 +72,6 @@ index 0000000000000000000000000000000000000000..8267e8f1f0ade29a284831069e1268ee
+ * + *
+ * @return Location of where the entity is trying to pathfind to. + * @return Location of where the entity is trying to pathfind to.
+ */ + */
+ @NotNull
+ public Location getLoc() { + public Location getLoc() {
+ return this.location.clone(); + return this.location.clone();
+ } + }
@ -83,17 +82,15 @@ index 0000000000000000000000000000000000000000..8267e8f1f0ade29a284831069e1268ee
+ } + }
+ +
+ @Override + @Override
+ public void setCancelled(boolean cancel) { + public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel; + this.cancelled = cancel;
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }

Datei anzeigen

@ -10,10 +10,10 @@ Co-authored-by: Nassim Jahnke <nassim@njahnke.dev>
diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerUseUnknownEntityEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerUseUnknownEntityEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerUseUnknownEntityEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerUseUnknownEntityEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..dbb635686e9108b9d3df5d373e6972cca07c0621 index 0000000000000000000000000000000000000000..9ff2bbf7f99df45cc626cad60bec4d14a8a04e3e
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerUseUnknownEntityEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerUseUnknownEntityEvent.java
@@ -0,0 +1,86 @@ @@ -0,0 +1,85 @@
+package com.destroystokyo.paper.event.player; +package com.destroystokyo.paper.event.player;
+ +
+import org.bukkit.entity.Player; +import org.bukkit.entity.Player;
@ -23,8 +23,8 @@ index 0000000000000000000000000000000000000000..dbb635686e9108b9d3df5d373e6972cc
+import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.EquipmentSlot;
+import org.bukkit.util.Vector; +import org.bukkit.util.Vector;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+ +
+/** +/**
+ * Represents an event that is called when a player right-clicks an unknown entity. + * Represents an event that is called when a player right-clicks an unknown entity.
@ -33,17 +33,18 @@ index 0000000000000000000000000000000000000000..dbb635686e9108b9d3df5d373e6972cc
+ * This event may be called multiple times per interaction with different interaction hands + * This event may be called multiple times per interaction with different interaction hands
+ * and with or without the clicked position. + * and with or without the clicked position.
+ */ + */
+@NullMarked
+public class PlayerUseUnknownEntityEvent extends PlayerEvent { +public class PlayerUseUnknownEntityEvent extends PlayerEvent {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ private final int entityId; + private final int entityId;
+ private final boolean attack; + private final boolean attack;
+ private final @NotNull EquipmentSlot hand; + private final EquipmentSlot hand;
+ private final @Nullable Vector clickedPosition; + private final @Nullable Vector clickedPosition;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public PlayerUseUnknownEntityEvent(@NotNull Player player, int entityId, boolean attack, @NotNull EquipmentSlot hand, @Nullable Vector clickedPosition) { + public PlayerUseUnknownEntityEvent(final Player player, final int entityId, final boolean attack, final EquipmentSlot hand, final @Nullable Vector clickedPosition) {
+ super(player); + super(player);
+ this.entityId = entityId; + this.entityId = entityId;
+ this.attack = attack; + this.attack = attack;
@ -74,7 +75,7 @@ index 0000000000000000000000000000000000000000..dbb635686e9108b9d3df5d373e6972cc
+ * + *
+ * @return the hand used to interact + * @return the hand used to interact
+ */ + */
+ public @NotNull EquipmentSlot getHand() { + public EquipmentSlot getHand() {
+ return this.hand; + return this.hand;
+ } + }
+ +
@ -89,13 +90,11 @@ index 0000000000000000000000000000000000000000..dbb635686e9108b9d3df5d373e6972cc
+ return this.clickedPosition != null ? this.clickedPosition.clone() : null; + return this.clickedPosition != null ? this.clickedPosition.clone() : null;
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }

Datei anzeigen

@ -7,13 +7,14 @@ Subject: [PATCH] Add handshake event to allow plugins to handle client
diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4ce03ef477 index 0000000000000000000000000000000000000000..aea04fb357f5728195fd9c9bdcd6304a0b953c45
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java
@@ -0,0 +1,267 @@ @@ -0,0 +1,257 @@
+package com.destroystokyo.paper.event.player; +package com.destroystokyo.paper.event.player;
+ +
+import com.google.common.base.Preconditions; +import com.google.common.base.Preconditions;
+import java.util.UUID;
+import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.NamedTextColor;
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
@ -21,10 +22,8 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+import org.bukkit.event.Event; +import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+
+import java.util.UUID;
+ +
+/** +/**
+ * This event is fired during a player handshake. + * This event is fired during a player handshake.
@ -34,16 +33,17 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * <p>WARNING: TAMPERING WITH THIS EVENT CAN BE DANGEROUS</p> + * <p>WARNING: TAMPERING WITH THIS EVENT CAN BE DANGEROUS</p>
+ */ + */
+@NullMarked
+public class PlayerHandshakeEvent extends Event implements Cancellable { +public class PlayerHandshakeEvent extends Event implements Cancellable {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final String originalHandshake; + private final String originalHandshake;
+ @NotNull private final String originalSocketAddressHostname; + private final String originalSocketAddressHostname;
+ @Nullable private String serverHostname; + private @Nullable String serverHostname;
+ @Nullable private String socketAddressHostname; + private @Nullable String socketAddressHostname;
+ @Nullable private UUID uniqueId; + private @Nullable UUID uniqueId;
+ @Nullable private String propertiesJson; + private @Nullable String propertiesJson;
+ private boolean failed; + private boolean failed;
+ private Component failMessage = Component.text("If you wish to use IP forwarding, please enable it in your BungeeCord config as well!", NamedTextColor.YELLOW); + private Component failMessage = Component.text("If you wish to use IP forwarding, please enable it in your BungeeCord config as well!", NamedTextColor.YELLOW);
+ +
@ -51,12 +51,12 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ +
+ @Deprecated + @Deprecated
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public PlayerHandshakeEvent(@NotNull String originalHandshake, boolean cancelled) { + public PlayerHandshakeEvent(final String originalHandshake, final boolean cancelled) {
+ this(originalHandshake, "127.0.0.1", cancelled); + this(originalHandshake, "127.0.0.1", cancelled);
+ } + }
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public PlayerHandshakeEvent(@NotNull String originalHandshake, @NotNull String originalSocketAddressHostname, boolean cancelled) { + public PlayerHandshakeEvent(final String originalHandshake, final String originalSocketAddressHostname, final boolean cancelled) {
+ super(true); + super(true);
+ this.originalHandshake = originalHandshake; + this.originalHandshake = originalHandshake;
+ this.originalSocketAddressHostname = originalSocketAddressHostname; + this.originalSocketAddressHostname = originalSocketAddressHostname;
@ -85,7 +85,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * @param cancel {@code true} if this event is cancelled, {@code false} otherwise + * @param cancel {@code true} if this event is cancelled, {@code false} otherwise
+ */ + */
+ @Override + @Override
+ public void setCancelled(boolean cancel) { + public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel; + this.cancelled = cancel;
+ } + }
+ +
@ -94,7 +94,6 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @return the original handshake string + * @return the original handshake string
+ */ + */
+ @NotNull
+ public String getOriginalHandshake() { + public String getOriginalHandshake() {
+ return this.originalHandshake; + return this.originalHandshake;
+ } + }
@ -107,7 +106,6 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @return the original socket address hostname + * @return the original socket address hostname
+ */ + */
+ @NotNull
+ public String getOriginalSocketAddressHostname() { + public String getOriginalSocketAddressHostname() {
+ return this.originalSocketAddressHostname; + return this.originalSocketAddressHostname;
+ } + }
@ -119,8 +117,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @return the server hostname string + * @return the server hostname string
+ */ + */
+ @Nullable + public @Nullable String getServerHostname() {
+ public String getServerHostname() {
+ return this.serverHostname; + return this.serverHostname;
+ } + }
+ +
@ -131,7 +128,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @param serverHostname the server hostname string + * @param serverHostname the server hostname string
+ */ + */
+ public void setServerHostname(@NotNull String serverHostname) { + public void setServerHostname(final String serverHostname) {
+ this.serverHostname = serverHostname; + this.serverHostname = serverHostname;
+ } + }
+ +
@ -142,8 +139,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @return the socket address hostname string + * @return the socket address hostname string
+ */ + */
+ @Nullable + public @Nullable String getSocketAddressHostname() {
+ public String getSocketAddressHostname() {
+ return this.socketAddressHostname; + return this.socketAddressHostname;
+ } + }
+ +
@ -154,7 +150,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @param socketAddressHostname the socket address hostname string + * @param socketAddressHostname the socket address hostname string
+ */ + */
+ public void setSocketAddressHostname(@NotNull String socketAddressHostname) { + public void setSocketAddressHostname(final String socketAddressHostname) {
+ this.socketAddressHostname = socketAddressHostname; + this.socketAddressHostname = socketAddressHostname;
+ } + }
+ +
@ -163,8 +159,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @return the unique id + * @return the unique id
+ */ + */
+ @Nullable + public @Nullable UUID getUniqueId() {
+ public UUID getUniqueId() {
+ return this.uniqueId; + return this.uniqueId;
+ } + }
+ +
@ -173,7 +168,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @param uniqueId the unique id + * @param uniqueId the unique id
+ */ + */
+ public void setUniqueId(@NotNull UUID uniqueId) { + public void setUniqueId(final UUID uniqueId) {
+ this.uniqueId = uniqueId; + this.uniqueId = uniqueId;
+ } + }
+ +
@ -184,8 +179,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @return the profile properties, as JSON + * @return the profile properties, as JSON
+ */ + */
+ @Nullable + public @Nullable String getPropertiesJson() {
+ public String getPropertiesJson() {
+ return this.propertiesJson; + return this.propertiesJson;
+ } + }
+ +
@ -209,7 +203,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @param failed {@code true} if authentication failed, {@code false} otherwise + * @param failed {@code true} if authentication failed, {@code false} otherwise
+ */ + */
+ public void setFailed(boolean failed) { + public void setFailed(final boolean failed) {
+ this.failed = failed; + this.failed = failed;
+ } + }
+ +
@ -220,7 +214,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @param propertiesJson the profile properties, as JSON + * @param propertiesJson the profile properties, as JSON
+ */ + */
+ public void setPropertiesJson(@NotNull String propertiesJson) { + public void setPropertiesJson(final String propertiesJson) {
+ this.propertiesJson = propertiesJson; + this.propertiesJson = propertiesJson;
+ } + }
+ +
@ -229,7 +223,6 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @return the message to display to the client + * @return the message to display to the client
+ */ + */
+ @NotNull
+ public Component failMessage() { + public Component failMessage() {
+ return this.failMessage; + return this.failMessage;
+ } + }
@ -239,7 +232,7 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * + *
+ * @param failMessage the message to display to the client + * @param failMessage the message to display to the client
+ */ + */
+ public void failMessage(@NotNull Component failMessage) { + public void failMessage(final Component failMessage) {
+ this.failMessage = failMessage; + this.failMessage = failMessage;
+ } + }
+ +
@ -249,7 +242,6 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * @return the message to display to the client + * @return the message to display to the client
+ * @deprecated use {@link #failMessage()} + * @deprecated use {@link #failMessage()}
+ */ + */
+ @NotNull
+ @Deprecated + @Deprecated
+ public String getFailMessage() { + public String getFailMessage() {
+ return LegacyComponentSerializer.legacySection().serialize(this.failMessage()); + return LegacyComponentSerializer.legacySection().serialize(this.failMessage());
@ -262,18 +254,16 @@ index 0000000000000000000000000000000000000000..7c049bad187b94331f42f96833d1cf4c
+ * @deprecated use {@link #failMessage(Component)} + * @deprecated use {@link #failMessage(Component)}
+ */ + */
+ @Deprecated + @Deprecated
+ public void setFailMessage(@NotNull String failMessage) { + public void setFailMessage(final String failMessage) {
+ Preconditions.checkArgument(failMessage != null && !failMessage.isEmpty(), "fail message cannot be null or empty"); + Preconditions.checkArgument(failMessage != null && !failMessage.isEmpty(), "fail message cannot be null or empty");
+ this.failMessage(LegacyComponentSerializer.legacySection().deserialize(failMessage)); + this.failMessage(LegacyComponentSerializer.legacySection().deserialize(failMessage));
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }

Datei anzeigen

@ -12,96 +12,98 @@ Provides methods to determine players looted state for an object
diff --git a/src/main/java/com/destroystokyo/paper/loottable/LootableBlockInventory.java b/src/main/java/com/destroystokyo/paper/loottable/LootableBlockInventory.java diff --git a/src/main/java/com/destroystokyo/paper/loottable/LootableBlockInventory.java b/src/main/java/com/destroystokyo/paper/loottable/LootableBlockInventory.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..92d7b853a2ccaae5afa8ac141bead840942944ef index 0000000000000000000000000000000000000000..6a03252d66a3e13c1960568ea23f6dcc673f34af
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/loottable/LootableBlockInventory.java +++ b/src/main/java/com/destroystokyo/paper/loottable/LootableBlockInventory.java
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
+package com.destroystokyo.paper.loottable; +package com.destroystokyo.paper.loottable;
+ +
+import org.bukkit.block.Block; +import org.bukkit.block.Block;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Represents an Inventory that can generate loot, such as Chests inside of Fortresses and Mineshafts + * Represents an Inventory that can generate loot, such as Chests inside of Fortresses and Mineshafts
+ */ + */
+@NullMarked
+public interface LootableBlockInventory extends LootableInventory { +public interface LootableBlockInventory extends LootableInventory {
+ +
+ /** + /**
+ * Gets the block that is lootable + * Gets the block that is lootable
+ * @return The Block + * @return The Block
+ */ + */
+ @NotNull
+ Block getBlock(); + Block getBlock();
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/loottable/LootableEntityInventory.java b/src/main/java/com/destroystokyo/paper/loottable/LootableEntityInventory.java diff --git a/src/main/java/com/destroystokyo/paper/loottable/LootableEntityInventory.java b/src/main/java/com/destroystokyo/paper/loottable/LootableEntityInventory.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..b387894fe8001edb41ad2ad2b70ebabe065b682e index 0000000000000000000000000000000000000000..31ca54dea65dc0363a0ff7991ba5be3b06533876
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/loottable/LootableEntityInventory.java +++ b/src/main/java/com/destroystokyo/paper/loottable/LootableEntityInventory.java
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
+package com.destroystokyo.paper.loottable; +package com.destroystokyo.paper.loottable;
+ +
+import org.bukkit.entity.Entity; +import org.bukkit.entity.Entity;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Represents an Inventory that can generate loot, such as Minecarts inside of Mineshafts + * Represents an Inventory that can generate loot, such as Minecarts inside of Mineshafts
+ */ + */
+@NullMarked
+public interface LootableEntityInventory extends LootableInventory { +public interface LootableEntityInventory extends LootableInventory {
+ +
+ /** + /**
+ * Gets the entity that is lootable + * Gets the entity that is lootable
+ * @return The Entity + * @return The Entity
+ */ + */
+ @NotNull
+ Entity getEntity(); + Entity getEntity();
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/loottable/LootableInventory.java b/src/main/java/com/destroystokyo/paper/loottable/LootableInventory.java diff --git a/src/main/java/com/destroystokyo/paper/loottable/LootableInventory.java b/src/main/java/com/destroystokyo/paper/loottable/LootableInventory.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..b18a0b50c12fe8d8c954e5c070f2ecd1854a2583 index 0000000000000000000000000000000000000000..9fb621200fb3969e8e440341e906acc3547b4039
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/loottable/LootableInventory.java +++ b/src/main/java/com/destroystokyo/paper/loottable/LootableInventory.java
@@ -0,0 +1,124 @@ @@ -0,0 +1,128 @@
+package com.destroystokyo.paper.loottable; +package com.destroystokyo.paper.loottable;
+ +
+import java.util.UUID;
+import org.bukkit.entity.Player; +import org.bukkit.entity.Player;
+import org.bukkit.loot.Lootable; +import org.bukkit.loot.Lootable;
+ +import org.jspecify.annotations.NullMarked;
+import java.util.UUID; +import org.jspecify.annotations.Nullable;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+ +
+/** +/**
+ * Represents an Inventory that contains a Loot Table associated to it that will + * Represents an Inventory that contains a Loot Table associated to it that will
+ * automatically fill on first open. + * automatically fill on first open.
+ * + * <p>
+ * A new feature and API is provided to support automatically refreshing the contents + * A new feature and API is provided to support automatically refreshing the contents
+ * of the inventory based on that Loot Table after a configurable amount of time has passed. + * of the inventory based on that Loot Table after a configurable amount of time has passed.
+ * + * <p>
+ * The behavior of how the Inventory is filled based on the loot table may vary based + * The behavior of how the Inventory is filled based on the loot table may vary based
+ * on Minecraft versions and the Loot Table feature. + * on Minecraft versions and the Loot Table feature.
+ */ + */
+@NullMarked
+public interface LootableInventory extends Lootable { +public interface LootableInventory extends Lootable {
+ +
+ /** + /**
+ * Server owners have to enable whether or not an object in a world should refill + * Server owners have to enable whether an object in a world should refill
+ * + *
+ * @return If the world this inventory is currently in has Replenishable Lootables enabled + * @return If the world this inventory is currently in has Replenishable Lootables enabled
+ */ + */
+ boolean isRefillEnabled(); + boolean isRefillEnabled();
+ +
+ /** + /**
+ * Whether or not this object has ever been filled + * Whether this object has ever been filled
+ *
+ * @return Has ever been filled + * @return Has ever been filled
+ */ + */
+ boolean hasBeenFilled(); + boolean hasBeenFilled();
+ +
+ /** + /**
+ * Has this player ever looted this block + * Has this player ever looted this block
+ *
+ * @param player The player to check + * @param player The player to check
+ * @return Whether or not this player has looted this block + * @return Whether this player has looted this block
+ */ + */
+ default boolean hasPlayerLooted(final @NotNull Player player) { + default boolean hasPlayerLooted(final Player player) {
+ return this.hasPlayerLooted(player.getUniqueId()); + return this.hasPlayerLooted(player.getUniqueId());
+ } + }
+ +
@ -109,17 +111,17 @@ index 0000000000000000000000000000000000000000..b18a0b50c12fe8d8c954e5c070f2ecd1
+ * Checks if this player can loot this block. Takes into account the "restrict player reloot" settings + * Checks if this player can loot this block. Takes into account the "restrict player reloot" settings
+ * + *
+ * @param player the player to check + * @param player the player to check
+ *
+ * @return Whether this player can loot this block + * @return Whether this player can loot this block
+ */ + */
+ boolean canPlayerLoot(@NotNull UUID player); + boolean canPlayerLoot(UUID player);
+ +
+ /** + /**
+ * Has this player ever looted this block + * Has this player ever looted this block
+ *
+ * @param player The player to check + * @param player The player to check
+ * @return Whether or not this player has looted this block + * @return Whether this player has looted this block
+ */ + */
+ boolean hasPlayerLooted(@NotNull UUID player); + boolean hasPlayerLooted(UUID player);
+ +
+ /** + /**
+ * Gets the timestamp, in milliseconds, of when the player last looted this object + * Gets the timestamp, in milliseconds, of when the player last looted this object
@ -127,7 +129,7 @@ index 0000000000000000000000000000000000000000..b18a0b50c12fe8d8c954e5c070f2ecd1
+ * @param player The player to check + * @param player The player to check
+ * @return Timestamp last looted, or null if player has not looted this object + * @return Timestamp last looted, or null if player has not looted this object
+ */ + */
+ default @Nullable Long getLastLooted(final @NotNull Player player) { + default @Nullable Long getLastLooted(final Player player) {
+ return this.getLastLooted(player.getUniqueId()); + return this.getLastLooted(player.getUniqueId());
+ } + }
+ +
@ -137,29 +139,31 @@ index 0000000000000000000000000000000000000000..b18a0b50c12fe8d8c954e5c070f2ecd1
+ * @param player The player to check + * @param player The player to check
+ * @return Timestamp last looted, or null if player has not looted this object + * @return Timestamp last looted, or null if player has not looted this object
+ */ + */
+ @Nullable + @Nullable Long getLastLooted(UUID player);
+ Long getLastLooted(@NotNull UUID player);
+ +
+ /** + /**
+ * Change the state of whether or not a player has looted this block + * Change the state of whether a player has looted this block
+ *
+ * @param player The player to change state for + * @param player The player to change state for
+ * @param looted true to add player to looted list, false to remove + * @param looted true to add player to looted list, false to remove
+ * @return The previous state of whether the player had looted this or not + * @return The previous state of whether the player had looted this or not
+ */ + */
+ default boolean setHasPlayerLooted(final @NotNull Player player, final boolean looted) { + default boolean setHasPlayerLooted(final Player player, final boolean looted) {
+ return this.setHasPlayerLooted(player.getUniqueId(), looted); + return this.setHasPlayerLooted(player.getUniqueId(), looted);
+ } + }
+ +
+ /** + /**
+ * Change the state of whether or not a player has looted this block + * Change the state of whether a player has looted this block
+ *
+ * @param player The player to change state for + * @param player The player to change state for
+ * @param looted true to add player to looted list, false to remove + * @param looted true to add player to looted list, false to remove
+ * @return The previous state of whether the player had looted this or not + * @return The previous state of whether the player had looted this or not
+ */ + */
+ boolean setHasPlayerLooted(@NotNull UUID player, boolean looted); + boolean setHasPlayerLooted(UUID player, boolean looted);
+ +
+ /** + /**
+ * Returns Whether or not this object has been filled and now has a pending refill + * Returns Whether this object has been filled and now has a pending refill
+ *
+ * @return Has pending refill + * @return Has pending refill
+ */ + */
+ boolean hasPendingRefill(); + boolean hasPendingRefill();
@ -188,10 +192,10 @@ index 0000000000000000000000000000000000000000..b18a0b50c12fe8d8c954e5c070f2ecd1
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/loottable/LootableInventoryReplenishEvent.java b/src/main/java/com/destroystokyo/paper/loottable/LootableInventoryReplenishEvent.java diff --git a/src/main/java/com/destroystokyo/paper/loottable/LootableInventoryReplenishEvent.java b/src/main/java/com/destroystokyo/paper/loottable/LootableInventoryReplenishEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..5ee1a04aaaa4ef09559f2cf757811e463e2a1be6 index 0000000000000000000000000000000000000000..994c2183db89fc40d5991d5e1906e4bd04db6291
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/loottable/LootableInventoryReplenishEvent.java +++ b/src/main/java/com/destroystokyo/paper/loottable/LootableInventoryReplenishEvent.java
@@ -0,0 +1,47 @@ @@ -0,0 +1,46 @@
+package com.destroystokyo.paper.loottable; +package com.destroystokyo.paper.loottable;
+ +
+import org.bukkit.entity.Player; +import org.bukkit.entity.Player;
@ -199,22 +203,22 @@ index 0000000000000000000000000000000000000000..5ee1a04aaaa4ef09559f2cf757811e46
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent; +import org.bukkit.event.player.PlayerEvent;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+@NullMarked
+public class LootableInventoryReplenishEvent extends PlayerEvent implements Cancellable { +public class LootableInventoryReplenishEvent extends PlayerEvent implements Cancellable {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final LootableInventory inventory; + private final LootableInventory inventory;
+ private boolean cancelled; + private boolean cancelled;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public LootableInventoryReplenishEvent(@NotNull Player player, @NotNull LootableInventory inventory) { + public LootableInventoryReplenishEvent(final Player player, final LootableInventory inventory) {
+ super(player); + super(player);
+ this.inventory = inventory; + this.inventory = inventory;
+ } + }
+ +
+ @NotNull
+ public LootableInventory getInventory() { + public LootableInventory getInventory() {
+ return this.inventory; + return this.inventory;
+ } + }
@ -225,16 +229,15 @@ index 0000000000000000000000000000000000000000..5ee1a04aaaa4ef09559f2cf757811e46
+ } + }
+ +
+ @Override + @Override
+ public void setCancelled(boolean cancel) { + public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel; + this.cancelled = cancel;
+ } + }
+ +
+ @NotNull + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
@ -423,10 +426,10 @@ index 9ea403e6fd8e960d017660e0aec118abeda2c42b..238d118f7788b13cd86b7e9ea3a0fc38
+public interface StorageMinecart extends Minecart, InventoryHolder, LootableEntityInventory { // Paper +public interface StorageMinecart extends Minecart, InventoryHolder, LootableEntityInventory { // Paper
} }
diff --git a/src/main/java/org/bukkit/loot/Lootable.java b/src/main/java/org/bukkit/loot/Lootable.java diff --git a/src/main/java/org/bukkit/loot/Lootable.java b/src/main/java/org/bukkit/loot/Lootable.java
index 24a3d989db3bc67e7afe8459a3d4bb132f448ea7..ad4b0fb7f55ed44dc74fb5a4bd36be6004231116 100644 index b3e9347496fd60aa4f5d18ff256e8d4d73f2d9cd..649dd959035843604525a637dba639a4fbd34f97 100644
--- a/src/main/java/org/bukkit/loot/Lootable.java --- a/src/main/java/org/bukkit/loot/Lootable.java
+++ b/src/main/java/org/bukkit/loot/Lootable.java +++ b/src/main/java/org/bukkit/loot/Lootable.java
@@ -36,6 +36,31 @@ public interface Lootable { @@ -35,6 +35,31 @@ public interface Lootable {
@Nullable @Nullable
LootTable getLootTable(); LootTable getLootTable();

Datei anzeigen

@ -6,34 +6,34 @@ Subject: [PATCH] Add EntityZapEvent
diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EntityZapEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EntityZapEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EntityZapEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EntityZapEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..dc6d15975a47e68c5bd939e68ddd2773028a6ac8 index 0000000000000000000000000000000000000000..af2b1629f845ffe1559e7d580b482636cc6441d9
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/entity/EntityZapEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/entity/EntityZapEvent.java
@@ -0,0 +1,69 @@ @@ -0,0 +1,65 @@
+package com.destroystokyo.paper.event.entity; +package com.destroystokyo.paper.event.entity;
+ +
+import java.util.Collections;
+import org.bukkit.entity.Entity; +import org.bukkit.entity.Entity;
+import org.bukkit.entity.LightningStrike; +import org.bukkit.entity.LightningStrike;
+import org.bukkit.event.Cancellable; +import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityTransformEvent; +import org.bukkit.event.entity.EntityTransformEvent;
+
+import java.util.Collections;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Fired when lightning strikes an entity + * Fired when lightning strikes an entity
+ */ + */
+@NullMarked
+public class EntityZapEvent extends EntityTransformEvent implements Cancellable { +public class EntityZapEvent extends EntityTransformEvent implements Cancellable {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final LightningStrike bolt; + private final LightningStrike bolt;
+ private boolean cancelled; + private boolean cancelled;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public EntityZapEvent(@NotNull final Entity entity, @NotNull final LightningStrike bolt, @NotNull final Entity replacementEntity) { + public EntityZapEvent(final Entity entity, final LightningStrike bolt, final Entity replacementEntity) {
+ super(entity, Collections.singletonList(replacementEntity), TransformReason.LIGHTNING); + super(entity, Collections.singletonList(replacementEntity), TransformReason.LIGHTNING);
+ this.bolt = bolt; + this.bolt = bolt;
+ } + }
@ -43,7 +43,6 @@ index 0000000000000000000000000000000000000000..dc6d15975a47e68c5bd939e68ddd2773
+ * + *
+ * @return The lightning bolt responsible for this event + * @return The lightning bolt responsible for this event
+ */ + */
+ @NotNull
+ public LightningStrike getBolt() { + public LightningStrike getBolt() {
+ return this.bolt; + return this.bolt;
+ } + }
@ -53,7 +52,6 @@ index 0000000000000000000000000000000000000000..dc6d15975a47e68c5bd939e68ddd2773
+ * + *
+ * @return The entity that will replace the struck entity + * @return The entity that will replace the struck entity
+ */ + */
+ @NotNull
+ public Entity getReplacementEntity() { + public Entity getReplacementEntity() {
+ return super.getTransformedEntity(); + return super.getTransformedEntity();
+ } + }
@ -64,17 +62,15 @@ index 0000000000000000000000000000000000000000..dc6d15975a47e68c5bd939e68ddd2773
+ } + }
+ +
+ @Override + @Override
+ public void setCancelled(boolean cancel) { + public void setCancelled(final boolean cancel) {
+ this.cancelled = cancel; + this.cancelled = cancel;
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }

Datei anzeigen

@ -6,41 +6,44 @@ Subject: [PATCH] Misc Utils
diff --git a/src/main/java/com/destroystokyo/paper/utils/CachedSizeConcurrentLinkedQueue.java b/src/main/java/com/destroystokyo/paper/utils/CachedSizeConcurrentLinkedQueue.java diff --git a/src/main/java/com/destroystokyo/paper/utils/CachedSizeConcurrentLinkedQueue.java b/src/main/java/com/destroystokyo/paper/utils/CachedSizeConcurrentLinkedQueue.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..5bb677ce585b856b3d3e589e29786a29619c56a7 index 0000000000000000000000000000000000000000..ebaa12ecacd169f00e184fed95720d047eda8b9d
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/utils/CachedSizeConcurrentLinkedQueue.java +++ b/src/main/java/com/destroystokyo/paper/utils/CachedSizeConcurrentLinkedQueue.java
@@ -0,0 +1,34 @@ @@ -0,0 +1,37 @@
+package com.destroystokyo.paper.utils; +package com.destroystokyo.paper.utils;
+ +
+import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.LongAdder; +import java.util.concurrent.atomic.LongAdder;
+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+ +
+@NullMarked
+@ApiStatus.Internal
+public class CachedSizeConcurrentLinkedQueue<E> extends ConcurrentLinkedQueue<E> { +public class CachedSizeConcurrentLinkedQueue<E> extends ConcurrentLinkedQueue<E> {
+
+ private final LongAdder cachedSize = new LongAdder(); + private final LongAdder cachedSize = new LongAdder();
+ +
+ @Override + @Override
+ public boolean add(@NotNull E e) { + public boolean add(final E e) {
+ boolean result = super.add(e); + final boolean result = super.add(e);
+ if (result) { + if (result) {
+ cachedSize.increment(); + this.cachedSize.increment();
+ } + }
+ return result; + return result;
+ } + }
+ +
+ @Nullable
+ @Override + @Override
+ public E poll() { + public @Nullable E poll() {
+ E result = super.poll(); + final E result = super.poll();
+ if (result != null) { + if (result != null) {
+ cachedSize.decrement(); + this.cachedSize.decrement();
+ } + }
+ return result; + return result;
+ } + }
+ +
+ @Override + @Override
+ public int size() { + public int size() {
+ return cachedSize.intValue(); + return this.cachedSize.intValue();
+ } + }
+} +}

Datei anzeigen

@ -6,10 +6,10 @@ Subject: [PATCH] Allow Reloading of Command Aliases
Reload the aliases stored in commands.yml Reload the aliases stored in commands.yml
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index d9f84c4a5bc5609e7d9fd0970696a46a32f3f5ff..47c7b0baae47ca263907b0dd70d75f37793517fc 100644 index 0360e070d9fbb45c84e0b95d4f4d2253202191a8..41a645a040561d3dca83a3c1f2ca7cdfb4f7550b 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -2379,6 +2379,15 @@ public final class Bukkit { @@ -2403,6 +2403,15 @@ public final class Bukkit {
public static void reloadPermissions() { public static void reloadPermissions() {
server.reloadPermissions(); server.reloadPermissions();
} }
@ -26,10 +26,10 @@ index d9f84c4a5bc5609e7d9fd0970696a46a32f3f5ff..47c7b0baae47ca263907b0dd70d75f37
@NotNull @NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 990d0d02d1bd95886126efe08e8107322e3199d5..ced9203c81477c802983df2f03b4e4efc517519b 100644 index b36b9bd8aa71ea5b9ea20d2752e6e59d33c9f978..72a472f048107181bc84599836fc2fc64c89ea8a 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -2080,4 +2080,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -2098,4 +2098,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
// Spigot end // Spigot end
void reloadPermissions(); // Paper void reloadPermissions(); // Paper

Datei anzeigen

@ -5,10 +5,10 @@ Subject: [PATCH] Add String based Action Bar API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 47c792202e8cc6d97fcb5e9bed98d327ecc5ab2b..add0826af957c773975f840c28cf77afbab85a09 100644 index 47a0d09b433024cd464737eced8a31f995b1ffaf..9513ce004101bd1bef90ca4a558f6b7c28d97adb 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -1215,6 +1215,39 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1255,6 +1255,39 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
public void sendMap(@NotNull MapView map); public void sendMap(@NotNull MapView map);
// Paper start // Paper start
@ -48,7 +48,7 @@ index 47c792202e8cc6d97fcb5e9bed98d327ecc5ab2b..add0826af957c773975f840c28cf77af
/** /**
* Sends the component to the player * Sends the component to the player
* *
@@ -1242,9 +1275,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1282,9 +1315,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/** /**
* Sends an array of components as a single message to the specified screen position of this player * Sends an array of components as a single message to the specified screen position of this player
* *

Datei anzeigen

@ -7,7 +7,7 @@ Allows you to access the Gateway being used in a teleport event
diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerTeleportEndGatewayEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerTeleportEndGatewayEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerTeleportEndGatewayEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerTeleportEndGatewayEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..40bd79fbe30f19bc93e34da52d2b2bf0768be974 index 0000000000000000000000000000000000000000..4488154d3f99f4281b08eef8a44c13fd896e538f
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerTeleportEndGatewayEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerTeleportEndGatewayEvent.java
@@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
@ -18,17 +18,18 @@ index 0000000000000000000000000000000000000000..40bd79fbe30f19bc93e34da52d2b2bf0
+import org.bukkit.entity.Player; +import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Fired when a teleport is triggered for an End Gateway + * Fired when a teleport is triggered for an End Gateway
+ */ + */
+@NullMarked
+public class PlayerTeleportEndGatewayEvent extends PlayerTeleportEvent { +public class PlayerTeleportEndGatewayEvent extends PlayerTeleportEvent {
+ +
+ @NotNull private final EndGateway gateway; + private final EndGateway gateway;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public PlayerTeleportEndGatewayEvent(@NotNull Player player, @NotNull Location from, @NotNull Location to, @NotNull EndGateway gateway) { + public PlayerTeleportEndGatewayEvent(final Player player, final Location from, final Location to, final EndGateway gateway) {
+ super(player, from, to, PlayerTeleportEvent.TeleportCause.END_GATEWAY); + super(player, from, to, PlayerTeleportEvent.TeleportCause.END_GATEWAY);
+ this.gateway = gateway; + this.gateway = gateway;
+ } + }
@ -38,7 +39,6 @@ index 0000000000000000000000000000000000000000..40bd79fbe30f19bc93e34da52d2b2bf0
+ * + *
+ * @return EndGateway used + * @return EndGateway used
+ */ + */
+ @NotNull
+ public EndGateway getGateway() { + public EndGateway getGateway() {
+ return this.gateway; + return this.gateway;
+ } + }

Datei anzeigen

@ -6,10 +6,10 @@ Subject: [PATCH] Add configuration option to prevent player names from being
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index 47c7b0baae47ca263907b0dd70d75f37793517fc..72983c3ea04382570c4b52e879dab56702bae55a 100644 index 41a645a040561d3dca83a3c1f2ca7cdfb4f7550b..0bd1480af001c86bc526875229f4ffa4e9945491 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -2388,6 +2388,16 @@ public final class Bukkit { @@ -2412,6 +2412,16 @@ public final class Bukkit {
public static boolean reloadCommandAliases() { public static boolean reloadCommandAliases() {
return server.reloadCommandAliases(); return server.reloadCommandAliases();
} }
@ -27,10 +27,10 @@ index 47c7b0baae47ca263907b0dd70d75f37793517fc..72983c3ea04382570c4b52e879dab567
@NotNull @NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index ced9203c81477c802983df2f03b4e4efc517519b..0ba391e6a1e585f29930b4111421e99f6eb11b4a 100644 index 72a472f048107181bc84599836fc2fc64c89ea8a..376712ee54e06fbc9e5f11016ca7ba6d9ae42b32 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -2082,4 +2082,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -2100,4 +2100,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
void reloadPermissions(); // Paper void reloadPermissions(); // Paper
boolean reloadCommandAliases(); // Paper boolean reloadCommandAliases(); // Paper

Datei anzeigen

@ -49,7 +49,7 @@ index a04cde615f8c4bc593f8d9f8f6f1438008aaa707..548f6d28c28d74bed8b58ee828759093
* @param target the target to remove from this list * @param target the target to remove from this list
*/ */
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index 72983c3ea04382570c4b52e879dab56702bae55a..dec72e92fb9e489d1d04cdf60c2f1d34571f9410 100644 index 0bd1480af001c86bc526875229f4ffa4e9945491..c900bde81d8f20ed4775228fbe767d7db62508fa 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -1538,6 +1538,8 @@ public final class Bukkit { @@ -1538,6 +1538,8 @@ public final class Bukkit {
@ -61,6 +61,15 @@ index 72983c3ea04382570c4b52e879dab56702bae55a..dec72e92fb9e489d1d04cdf60c2f1d34
* *
* @return an array containing all previous players * @return an array containing all previous players
*/ */
@@ -2059,7 +2061,7 @@ public final class Bukkit {
* server will pause most functions after this time if there are no players
* online.
* <p>
- * A value of less than 0 will disable the setting
+ * A value of less than 1 will disable the setting
*
* @param seconds the pause threshold in seconds
*/
diff --git a/src/main/java/org/bukkit/ChunkSnapshot.java b/src/main/java/org/bukkit/ChunkSnapshot.java diff --git a/src/main/java/org/bukkit/ChunkSnapshot.java b/src/main/java/org/bukkit/ChunkSnapshot.java
index 0cf808356a1a5c6fc4bcf97a694ed9beb80a776a..dc765dea47a9a1c1520fb16ddb24f81413ed0dd1 100644 index 0cf808356a1a5c6fc4bcf97a694ed9beb80a776a..dc765dea47a9a1c1520fb16ddb24f81413ed0dd1 100644
--- a/src/main/java/org/bukkit/ChunkSnapshot.java --- a/src/main/java/org/bukkit/ChunkSnapshot.java
@ -74,11 +83,25 @@ index 0cf808356a1a5c6fc4bcf97a694ed9beb80a776a..dc765dea47a9a1c1520fb16ddb24f814
* @param z Z-coordinate (0-15) * @param z Z-coordinate (0-15)
* @return temperature at given coordinate * @return temperature at given coordinate
*/ */
diff --git a/src/main/java/org/bukkit/HeightMap.java b/src/main/java/org/bukkit/HeightMap.java
index db6fcd635e295e561642d49941fd8e611247d38e..344b2b5d9207d2645bc5417d1ec00dd0a0b95604 100644
--- a/src/main/java/org/bukkit/HeightMap.java
+++ b/src/main/java/org/bukkit/HeightMap.java
@@ -12,8 +12,7 @@ public enum HeightMap {
*/
MOTION_BLOCKING,
/**
- * The highest block that blocks motion or contains a fluid or is in the
- * {@link Tag#LEAVES}.
+ * The highest block that blocks motion or contains a fluid, excluding leaves.
*/
MOTION_BLOCKING_NO_LEAVES,
/**
diff --git a/src/main/java/org/bukkit/Particle.java b/src/main/java/org/bukkit/Particle.java diff --git a/src/main/java/org/bukkit/Particle.java b/src/main/java/org/bukkit/Particle.java
index 62a8bb18855be13ed1c466b4be7afcd3c91dc7aa..de9fd0fadd6d16ffe883a618bf499214878f443d 100644 index 13557f78a6853fdf0619f0479cab7591ddadf666..a1896780f312a91ab2330d2c850641d66143f23e 100644
--- a/src/main/java/org/bukkit/Particle.java --- a/src/main/java/org/bukkit/Particle.java
+++ b/src/main/java/org/bukkit/Particle.java +++ b/src/main/java/org/bukkit/Particle.java
@@ -195,7 +195,7 @@ public enum Particle implements Keyed { @@ -206,7 +206,7 @@ public enum Particle implements Keyed {
} }
/** /**
@ -127,7 +150,7 @@ index 4c9fd558fbf7f57a948fbb7f80f4651048c0fb57..458119a9ef7ce8e1f59bd47caa5b4bc6
* @param statePredicate The predicate which should get used to test if a block should be set or not. * @param statePredicate The predicate which should get used to test if a block should be set or not.
* @return true if the tree was created successfully, otherwise false * @return true if the tree was created successfully, otherwise false
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 0ba391e6a1e585f29930b4111421e99f6eb11b4a..2f68b766267b53e98dee3054e0a69be8b9cdf70f 100644 index 376712ee54e06fbc9e5f11016ca7ba6d9ae42b32..0588c6c8b30bfe6e1e8ab7e1523a8a9be6b11b6f 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -581,13 +581,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -581,13 +581,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@ -154,6 +177,15 @@ index 0ba391e6a1e585f29930b4111421e99f6eb11b4a..2f68b766267b53e98dee3054e0a69be8
* *
* @return an array containing all previous players * @return an array containing all previous players
*/ */
@@ -1740,7 +1739,7 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
* Sets the pause when empty threshold seconds. To save resources, the
* pause most functions after this time if there are no players online.
* <p>
- * A value of less than 0 will disable the setting
+ * A value of less than 1 will disable the setting
*
* @param seconds the pause threshold in seconds
*/
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
index 9885fd1adc1f93a80d650e6d42dfa3a0b084db9f..c4f2f03ec31998d486dad1d45ef83df3f77b5e28 100644 index 9885fd1adc1f93a80d650e6d42dfa3a0b084db9f..c4f2f03ec31998d486dad1d45ef83df3f77b5e28 100644
--- a/src/main/java/org/bukkit/World.java --- a/src/main/java/org/bukkit/World.java
@ -186,10 +218,10 @@ index 9885fd1adc1f93a80d650e6d42dfa3a0b084db9f..c4f2f03ec31998d486dad1d45ef83df3
* <p> * <p>
* The {@code radius} is not a rigid square radius. Each structure may alter * The {@code radius} is not a rigid square radius. Each structure may alter
diff --git a/src/main/java/org/bukkit/attribute/AttributeModifier.java b/src/main/java/org/bukkit/attribute/AttributeModifier.java diff --git a/src/main/java/org/bukkit/attribute/AttributeModifier.java b/src/main/java/org/bukkit/attribute/AttributeModifier.java
index d66502c9df2592cd18694481e7e90a71a5c3a359..ee39c0b83e558681e8b006172d34c98e2c83cda2 100644 index 6ffc895138088162cab827b3ca6c68961b7bcc64..8c53ac6b4381f3cf8b5e989c8b2a3ba77bd4e475 100644
--- a/src/main/java/org/bukkit/attribute/AttributeModifier.java --- a/src/main/java/org/bukkit/attribute/AttributeModifier.java
+++ b/src/main/java/org/bukkit/attribute/AttributeModifier.java +++ b/src/main/java/org/bukkit/attribute/AttributeModifier.java
@@ -117,8 +117,7 @@ public class AttributeModifier implements ConfigurationSerializable, Keyed { @@ -129,8 +129,7 @@ public class AttributeModifier implements ConfigurationSerializable, Keyed {
} }
/** /**
@ -416,7 +448,7 @@ index 4e1fb0974d061d5bb64899cac576318d2e6f8bf6..539b3527d0c66611e21712f29b90fba9
public int getEntityId(); public int getEntityId();
diff --git a/src/main/java/org/bukkit/entity/HumanEntity.java b/src/main/java/org/bukkit/entity/HumanEntity.java diff --git a/src/main/java/org/bukkit/entity/HumanEntity.java b/src/main/java/org/bukkit/entity/HumanEntity.java
index 8fdfa1d79daf464f8e364fd9e19d1de3a2a6848c..195a7fa0ea8e056cbde7b9152cc014d2c94353ff 100644 index 29f9b380dda2f370e2a1159811167431796ec8a8..46a076bd8dc2f5d1094899638ab255a5a31c2568 100644
--- a/src/main/java/org/bukkit/entity/HumanEntity.java --- a/src/main/java/org/bukkit/entity/HumanEntity.java
+++ b/src/main/java/org/bukkit/entity/HumanEntity.java +++ b/src/main/java/org/bukkit/entity/HumanEntity.java
@@ -22,6 +22,11 @@ import org.jetbrains.annotations.Nullable; @@ -22,6 +22,11 @@ import org.jetbrains.annotations.Nullable;
@ -444,6 +476,19 @@ index b688b3856cb3068a539fcecfbfa113f8ab4160a9..c275b881cbd11307a6dcc7190d7a7d40
* *
* @return whether the item frame is visible or not * @return whether the item frame is visible or not
*/ */
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
index cafa79f80eec5ec6d8d31d40cc2b46acc06831f9..b0fbad5de65c33710ec46734ad6c69ec9b2769d5 100644
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
@@ -502,7 +502,7 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
/**
* Sets the leash on this entity to be held by the supplied entity.
* <p>
- * This method has no effect on EnderDragons, Withers, Players, or Bats.
+ * This method has no effect on players.
* Non-living entities excluding leashes will not persist as leash
* holders.
*
diff --git a/src/main/java/org/bukkit/entity/Mob.java b/src/main/java/org/bukkit/entity/Mob.java diff --git a/src/main/java/org/bukkit/entity/Mob.java b/src/main/java/org/bukkit/entity/Mob.java
index f3f62e13cc1b6172808c52f2d5f520f1f584e6db..ad5dbf310fe7b34c997bb339f09697222f862005 100644 index f3f62e13cc1b6172808c52f2d5f520f1f584e6db..ad5dbf310fe7b34c997bb339f09697222f862005 100644
--- a/src/main/java/org/bukkit/entity/Mob.java --- a/src/main/java/org/bukkit/entity/Mob.java
@ -473,15 +518,15 @@ index ae9eaaa8e38e1d9dfc459926c7fc51ddb89de84a..b2ec535bb1b0ce0c114ddd7638b90218
@Override @Override
public int getConversionTime(); public int getConversionTime();
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index add0826af957c773975f840c28cf77afbab85a09..fea44ddd358b65681d13215244836c21fc88e0fd 100644 index 4195516bc69ab232c6debff157c691ea68b0390f..c8ba70f787a3460c1f9faaeaab086e9e43ecaf6f 100644
--- a/src/main/java/org/bukkit/entity/Player.java --- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java
@@ -476,15 +476,15 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -492,15 +492,15 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/** /**
* Saves the players current location, health, inventory, motion, and * Saves the players current location, health, inventory, motion, and
- * other information into the username.dat file, in the world/player - * other information into the uuid.dat file, in the &lt;main
- * folder - * world&gt;/playerdata folder.
+ * other information into the &lt;uuid&gt;.dat file, in the + * other information into the &lt;uuid&gt;.dat file, in the
+ * &lt;level-name&gt;/playerdata/ folder. + * &lt;level-name&gt;/playerdata/ folder.
*/ */
@ -489,14 +534,14 @@ index add0826af957c773975f840c28cf77afbab85a09..fea44ddd358b65681d13215244836c21
/** /**
* Loads the players current location, health, inventory, motion, and * Loads the players current location, health, inventory, motion, and
- * other information from the username.dat file, in the world/player - * other information from the uuid.dat file, in the &lt;main
- * folder. - * world&gt;/playerdata folder.
+ * other information from the &lt;uuid&gt;.dat file, in the + * other information from the &lt;uuid&gt;.dat file, in the
+ * &lt;level-name&gt;/playerdata/ folder. + * &lt;level-name&gt;/playerdata/ folder.
* <p> * <p>
* Note: This will overwrite the players current inventory, health, * Note: This will overwrite the players current inventory, health,
* motion, etc, with the state from the saved dat file. * motion, etc, with the state from the saved dat file.
@@ -821,7 +821,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -861,7 +861,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/** /**
* Plays an effect to just this player. * Plays an effect to just this player.
* *
@ -505,7 +550,7 @@ index add0826af957c773975f840c28cf77afbab85a09..fea44ddd358b65681d13215244836c21
* @param loc the location to play the effect at * @param loc the location to play the effect at
* @param effect the {@link Effect} * @param effect the {@link Effect}
* @param data a data bit needed for some effects * @param data a data bit needed for some effects
@@ -1232,7 +1232,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1272,7 +1272,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* *
* Use supplied alternative character to the section symbol to represent legacy color codes. * Use supplied alternative character to the section symbol to represent legacy color codes.
* *
@ -514,7 +559,7 @@ index add0826af957c773975f840c28cf77afbab85a09..fea44ddd358b65681d13215244836c21
* @param message The message to send * @param message The message to send
* @deprecated use {@link #sendActionBar(net.kyori.adventure.text.Component)} * @deprecated use {@link #sendActionBar(net.kyori.adventure.text.Component)}
*/ */
@@ -1705,7 +1705,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1745,7 +1745,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/** /**
* Allows this player to see a player that was previously hidden. If * Allows this player to see a player that was previously hidden. If
@ -523,7 +568,7 @@ index add0826af957c773975f840c28cf77afbab85a09..fea44ddd358b65681d13215244836c21
* remain hidden until the other plugin calls this method too. * remain hidden until the other plugin calls this method too.
* *
* @param plugin Plugin that wants to show the player * @param plugin Plugin that wants to show the player
@@ -1732,7 +1732,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1772,7 +1772,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/** /**
* Allows this player to see an entity that was previously hidden. If * Allows this player to see an entity that was previously hidden. If
@ -532,7 +577,7 @@ index add0826af957c773975f840c28cf77afbab85a09..fea44ddd358b65681d13215244836c21
* remain hidden until the other plugin calls this method too. * remain hidden until the other plugin calls this method too.
* *
* @param plugin Plugin that wants to show the entity * @param plugin Plugin that wants to show the entity
@@ -1815,9 +1815,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1855,9 +1855,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* case this method will have no affect on them. Use the * case this method will have no affect on them. Use the
* {@link PlayerResourcePackStatusEvent} to figure out whether or not * {@link PlayerResourcePackStatusEvent} to figure out whether or not
* the player loaded the pack! * the player loaded the pack!
@ -542,7 +587,7 @@ index add0826af957c773975f840c28cf77afbab85a09..fea44ddd358b65681d13215244836c21
* <li>The request is send with "null" as the hash. This might result * <li>The request is send with "null" as the hash. This might result
* in newer versions not loading the pack correctly. * in newer versions not loading the pack correctly.
* </ul> * </ul>
@@ -1851,9 +1848,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1891,9 +1888,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* case this method will have no affect on them. Use the * case this method will have no affect on them. Use the
* {@link PlayerResourcePackStatusEvent} to figure out whether or not * {@link PlayerResourcePackStatusEvent} to figure out whether or not
* the player loaded the pack! * the player loaded the pack!
@ -552,7 +597,7 @@ index add0826af957c773975f840c28cf77afbab85a09..fea44ddd358b65681d13215244836c21
* <li>The request is send with empty string as the hash. This might result * <li>The request is send with empty string as the hash. This might result
* in newer versions not loading the pack correctly. * in newer versions not loading the pack correctly.
* </ul> * </ul>
@@ -1890,9 +1884,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @@ -1930,9 +1924,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* case this method will have no affect on them. Use the * case this method will have no affect on them. Use the
* {@link PlayerResourcePackStatusEvent} to figure out whether or not * {@link PlayerResourcePackStatusEvent} to figure out whether or not
* the player loaded the pack! * the player loaded the pack!
@ -563,7 +608,7 @@ index add0826af957c773975f840c28cf77afbab85a09..fea44ddd358b65681d13215244836c21
* not provided. This might result in newer versions not loading the * not provided. This might result in newer versions not loading the
* pack correctly. * pack correctly.
diff --git a/src/main/java/org/bukkit/entity/Slime.java b/src/main/java/org/bukkit/entity/Slime.java diff --git a/src/main/java/org/bukkit/entity/Slime.java b/src/main/java/org/bukkit/entity/Slime.java
index a5ad3250cebfeb302c58e0bfd6db1295913c927e..bfac874840cf1f36afba16ae4d176c5821a68cfb 100644 index a5ad3250cebfeb302c58e0bfd6db1295913c927e..0a2d603bf6a3f60d3fa7d85df6ef2373fc93d848 100644
--- a/src/main/java/org/bukkit/entity/Slime.java --- a/src/main/java/org/bukkit/entity/Slime.java
+++ b/src/main/java/org/bukkit/entity/Slime.java +++ b/src/main/java/org/bukkit/entity/Slime.java
@@ -11,6 +11,16 @@ public interface Slime extends Mob, Enemy { @@ -11,6 +11,16 @@ public interface Slime extends Mob, Enemy {
@ -573,9 +618,9 @@ index a5ad3250cebfeb302c58e0bfd6db1295913c927e..bfac874840cf1f36afba16ae4d176c58
+ * Setting the size of the slime (regardless of previous size) + * Setting the size of the slime (regardless of previous size)
+ * will set the following attributes: + * will set the following attributes:
+ * <ul> + * <ul>
+ * <li>{@link org.bukkit.attribute.Attribute#GENERIC_MAX_HEALTH}</li> + * <li>{@link org.bukkit.attribute.Attribute#MAX_HEALTH}</li>
+ * <li>{@link org.bukkit.attribute.Attribute#GENERIC_MOVEMENT_SPEED}</li> + * <li>{@link org.bukkit.attribute.Attribute#MOVEMENT_SPEED}</li>
+ * <li>{@link org.bukkit.attribute.Attribute#GENERIC_ATTACK_DAMAGE}</li> + * <li>{@link org.bukkit.attribute.Attribute#ATTACK_DAMAGE}</li>
+ * </ul> + * </ul>
+ * to their per-size defaults and heal the + * to their per-size defaults and heal the
+ * slime to its max health (assuming it's alive). + * slime to its max health (assuming it's alive).
@ -607,10 +652,10 @@ index af5110b4160979c39cc1e5de6fa3bd7957b21403..15a0a733b0e5804655b5957cbf208312
* @param location the location to remove * @param location the location to remove
* @see #getExploredLocations() * @see #getExploredLocations()
diff --git a/src/main/java/org/bukkit/entity/Villager.java b/src/main/java/org/bukkit/entity/Villager.java diff --git a/src/main/java/org/bukkit/entity/Villager.java b/src/main/java/org/bukkit/entity/Villager.java
index 45dd54afa6d6f3d9895ef52f13076d3351036e4b..cfa0d4809f9bb4ac150251efa85ba4d1808ab1b2 100644 index c48f13cc8ece0fa9913450e4402e496ce01a03fb..af4582f3e4687933dac6ccd43667a373f8daedb6 100644
--- a/src/main/java/org/bukkit/entity/Villager.java --- a/src/main/java/org/bukkit/entity/Villager.java
+++ b/src/main/java/org/bukkit/entity/Villager.java +++ b/src/main/java/org/bukkit/entity/Villager.java
@@ -228,7 +228,7 @@ public interface Villager extends AbstractVillager { @@ -224,7 +224,7 @@ public interface Villager extends AbstractVillager {
*/ */
Profession NITWIT = getProfession("nitwit"); Profession NITWIT = getProfession("nitwit");
/** /**
@ -1023,6 +1068,34 @@ index 08a7c564fe5d3d232998d1789d4d4723a59c1430..8a5be3f0322ac19aeac3f00df54add0e
@NotNull @NotNull
@Override @Override
public AnvilView getView() { public AnvilView getView() {
diff --git a/src/main/java/org/bukkit/event/player/PlayerCommandPreprocessEvent.java b/src/main/java/org/bukkit/event/player/PlayerCommandPreprocessEvent.java
index 48a00fb50fe32c732a578d5179b3bb43ffd68b69..6d7ee2c6e053ea9af9116e7c2adb521f12b914df 100644
--- a/src/main/java/org/bukkit/event/player/PlayerCommandPreprocessEvent.java
+++ b/src/main/java/org/bukkit/event/player/PlayerCommandPreprocessEvent.java
@@ -106,7 +106,9 @@ public class PlayerCommandPreprocessEvent extends PlayerEvent implements Cancell
*
* @param player New player which this event will execute as
* @throws IllegalArgumentException if the player provided is null
+ * @deprecated Only works for sign commands; use {@link Player#performCommand(String)}, including those cases
*/
+ @Deprecated(forRemoval = true)
public void setPlayer(@NotNull final Player player) throws IllegalArgumentException {
Preconditions.checkArgument(player != null, "Player cannot be null");
this.player = player;
@@ -123,11 +125,10 @@ public class PlayerCommandPreprocessEvent extends PlayerEvent implements Cancell
* unmodifiable set.
*
* @return All Players who will see this chat message
- * @deprecated This method is provided for backward compatibility with no
- * guarantee to the effect of viewing or modifying the set.
+ * @deprecated This is simply the online players. Modifications have no effect
*/
@NotNull
- @Deprecated
+ @Deprecated(forRemoval = true)
public Set<Player> getRecipients() {
return recipients;
}
diff --git a/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java b/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java diff --git a/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java b/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java
index e4c32b21ab013703a6a1b07a1ad564d914ebe83f..e58fecf0fe54db06e0e944027923a352fd8005d8 100644 index e4c32b21ab013703a6a1b07a1ad564d914ebe83f..e58fecf0fe54db06e0e944027923a352fd8005d8 100644
--- a/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java --- a/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java
@ -1548,26 +1621,11 @@ index 35c6594fd1040a1af1029e7260e5e3a9307b107d..d58719ee75bef8bc265bfc81bc5d88a4
*/ */
void addChargedProjectile(@NotNull ItemStack item); void addChargedProjectile(@NotNull ItemStack item);
} }
diff --git a/src/main/java/org/bukkit/inventory/meta/FireworkMeta.java b/src/main/java/org/bukkit/inventory/meta/FireworkMeta.java
index cdbcc8dbab2456cc2bc1f3084cbb1ced1698b7f5..d528b066c2aaa3fb097931914ff2181f8f64e520 100644
--- a/src/main/java/org/bukkit/inventory/meta/FireworkMeta.java
+++ b/src/main/java/org/bukkit/inventory/meta/FireworkMeta.java
@@ -86,8 +86,8 @@ public interface FireworkMeta extends ItemMeta {
* Sets the approximate power of the firework. Each level of power is half
* a second of flight time.
*
- * @param power the power of the firework, from 0-127
- * @throws IllegalArgumentException if {@literal height<0 or height>127}
+ * @param power the power of the firework, from 0-255
+ * @throws IllegalArgumentException if {@literal power < 0 or power > 255}
*/
void setPower(int power) throws IllegalArgumentException;
diff --git a/src/main/java/org/bukkit/inventory/meta/ItemMeta.java b/src/main/java/org/bukkit/inventory/meta/ItemMeta.java diff --git a/src/main/java/org/bukkit/inventory/meta/ItemMeta.java b/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
index 014c1a0379e532a5c924694a8e0715eb0ba50ec2..10ca843e57c74dfa32d539acd174c8867dfd56ec 100644 index fabddfe3763e143b5a769764cb324f97876ccb1c..480dd9a5ff334e6f32b98aa0108ff02e6f7077ab 100644
--- a/src/main/java/org/bukkit/inventory/meta/ItemMeta.java --- a/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
+++ b/src/main/java/org/bukkit/inventory/meta/ItemMeta.java +++ b/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
@@ -540,7 +540,7 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste @@ -744,7 +744,7 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
* The returned component is a snapshot of its current state and does not * The returned component is a snapshot of its current state and does not
* reflect a live view of what is on an item. After changing any value on * reflect a live view of what is on an item. After changing any value on
* this component, it must be set with * this component, it must be set with
@ -1576,7 +1634,7 @@ index 014c1a0379e532a5c924694a8e0715eb0ba50ec2..10ca843e57c74dfa32d539acd174c886
* to apply the changes. * to apply the changes.
* *
* @return component * @return component
@@ -549,7 +549,7 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste @@ -753,7 +753,7 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
JukeboxPlayableComponent getJukeboxPlayable(); JukeboxPlayableComponent getJukeboxPlayable();
/** /**
@ -1585,7 +1643,7 @@ index 014c1a0379e532a5c924694a8e0715eb0ba50ec2..10ca843e57c74dfa32d539acd174c886
* *
* @param jukeboxPlayable new component * @param jukeboxPlayable new component
*/ */
@@ -576,7 +576,7 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste @@ -780,7 +780,7 @@ public interface ItemMeta extends Cloneable, ConfigurationSerializable, Persiste
/** /**
* Return an immutable copy of all {@link Attribute}s and their * Return an immutable copy of all {@link Attribute}s and their
* {@link AttributeModifier}s for a given {@link EquipmentSlot}.<br> * {@link AttributeModifier}s for a given {@link EquipmentSlot}.<br>
@ -1643,6 +1701,30 @@ index 43f0df04f3cdff7d7db73321a2886f3a737e3c9f..5c741228b2338a7c4de2fe736eb78951
*/ */
public interface OminousBottleMeta extends ItemMeta { public interface OminousBottleMeta extends ItemMeta {
diff --git a/src/main/java/org/bukkit/inventory/meta/components/UseCooldownComponent.java b/src/main/java/org/bukkit/inventory/meta/components/UseCooldownComponent.java
index 4086a413895f82b51bf192ceffdfee4a939c6fed..172032e56ee8e4e1b13ec6b41a5122a33b18bc64 100644
--- a/src/main/java/org/bukkit/inventory/meta/components/UseCooldownComponent.java
+++ b/src/main/java/org/bukkit/inventory/meta/components/UseCooldownComponent.java
@@ -6,8 +6,7 @@ import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
/**
- * Represents a component which determines the cooldown applied to use of this
- * item.
+ * Represents a component which determines the cooldown applied when using this item before it is available for use again.
*/
@ApiStatus.Experimental
public interface UseCooldownComponent extends ConfigurationSerializable {
@@ -39,7 +38,7 @@ public interface UseCooldownComponent extends ConfigurationSerializable {
/**
* Sets the custom cooldown group to be used for similar items.
*
- * @param song the cooldown group
+ * @param group the cooldown group
*/
- void setCooldownGroup(@Nullable NamespacedKey song);
+ void setCooldownGroup(@Nullable NamespacedKey group);
}
diff --git a/src/main/java/org/bukkit/plugin/Plugin.java b/src/main/java/org/bukkit/plugin/Plugin.java diff --git a/src/main/java/org/bukkit/plugin/Plugin.java b/src/main/java/org/bukkit/plugin/Plugin.java
index 8c76716249e44ed8bf6be94c1f5c7b6d9bb35be2..68a0ed5f0ed25e98f4ab4d1e482ec2ccfda9cd3a 100644 index 8c76716249e44ed8bf6be94c1f5c7b6d9bb35be2..68a0ed5f0ed25e98f4ab4d1e482ec2ccfda9cd3a 100644
--- a/src/main/java/org/bukkit/plugin/Plugin.java --- a/src/main/java/org/bukkit/plugin/Plugin.java
@ -1707,6 +1789,32 @@ index b84b37fe27d84574dc5897285f1d9a1437bd322c..281ae60a6be7e39aab4f27b4c7de3d49
* *
* @return Set containing all the channels that this client may accept. * @return Set containing all the channels that this client may accept.
*/ */
diff --git a/src/main/java/org/bukkit/projectiles/ProjectileSource.java b/src/main/java/org/bukkit/projectiles/ProjectileSource.java
index eabd8b926ec1c934cd7e77b7cc6adfae16771021..8557bfefaf02538dec95adb29734ae2cf50f3f8c 100644
--- a/src/main/java/org/bukkit/projectiles/ProjectileSource.java
+++ b/src/main/java/org/bukkit/projectiles/ProjectileSource.java
@@ -12,6 +12,10 @@ public interface ProjectileSource {
/**
* Launches a {@link Projectile} from the ProjectileSource.
+ * <p>
+ * The family of launchProjectile methods only promise the ability to launch projectile types
+ * that the {@link ProjectileSource} is capable of firing in vanilla.
+ * Any other types of projectiles *may* be implemented but are not part of the method contract.
*
* @param <T> a projectile subclass
* @param projectile class of the projectile to launch
@@ -23,6 +27,10 @@ public interface ProjectileSource {
/**
* Launches a {@link Projectile} from the ProjectileSource with an
* initial velocity.
+ * <p>
+ * The family of launchProjectile methods only promise the ability to launch projectile types
+ * that the {@link ProjectileSource} is capable of firing in vanilla.
+ * Any other types of projectiles *may* be implemented but are not part of the method contract.
*
* @param <T> a projectile subclass
* @param projectile class of the projectile to launch
diff --git a/src/main/java/org/bukkit/scoreboard/Objective.java b/src/main/java/org/bukkit/scoreboard/Objective.java diff --git a/src/main/java/org/bukkit/scoreboard/Objective.java b/src/main/java/org/bukkit/scoreboard/Objective.java
index 22b1dc5fd4d453161a5ee520072f8e8f955b3a80..a625bcab8e77b05b3341a52c708fae1542b7e3d5 100644 index 22b1dc5fd4d453161a5ee520072f8e8f955b3a80..a625bcab8e77b05b3341a52c708fae1542b7e3d5 100644
--- a/src/main/java/org/bukkit/scoreboard/Objective.java --- a/src/main/java/org/bukkit/scoreboard/Objective.java

Datei anzeigen

@ -6,10 +6,10 @@ Subject: [PATCH] PlayerAttemptPickupItemEvent
diff --git a/src/main/java/org/bukkit/event/player/PlayerAttemptPickupItemEvent.java b/src/main/java/org/bukkit/event/player/PlayerAttemptPickupItemEvent.java diff --git a/src/main/java/org/bukkit/event/player/PlayerAttemptPickupItemEvent.java b/src/main/java/org/bukkit/event/player/PlayerAttemptPickupItemEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..13e4b1309ea9965a07fc8b276d5a7e606e205824 index 0000000000000000000000000000000000000000..eff29875f6282d8bd04a33cb572c90090742d3b2
--- /dev/null --- /dev/null
+++ b/src/main/java/org/bukkit/event/player/PlayerAttemptPickupItemEvent.java +++ b/src/main/java/org/bukkit/event/player/PlayerAttemptPickupItemEvent.java
@@ -0,0 +1,96 @@ @@ -0,0 +1,94 @@
+package org.bukkit.event.player; +package org.bukkit.event.player;
+ +
+import org.bukkit.entity.Item; +import org.bukkit.entity.Item;
@ -17,16 +17,17 @@ index 0000000000000000000000000000000000000000..13e4b1309ea9965a07fc8b276d5a7e60
+import org.bukkit.event.Cancellable; +import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Thrown when a player attempts to pick an item up from the ground + * Thrown when a player attempts to pick an item up from the ground
+ */ + */
+@NullMarked
+public class PlayerAttemptPickupItemEvent extends PlayerEvent implements Cancellable { +public class PlayerAttemptPickupItemEvent extends PlayerEvent implements Cancellable {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final Item item; + private final Item item;
+ private final int remaining; + private final int remaining;
+ private boolean flyAtPlayer = true; + private boolean flyAtPlayer = true;
+ +
@ -34,12 +35,12 @@ index 0000000000000000000000000000000000000000..13e4b1309ea9965a07fc8b276d5a7e60
+ +
+ @Deprecated // Remove in 1.13 // Remove in 1.14? + @Deprecated // Remove in 1.13 // Remove in 1.14?
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public PlayerAttemptPickupItemEvent(@NotNull final Player player, @NotNull final Item item) { + public PlayerAttemptPickupItemEvent(final Player player, final Item item) {
+ this(player, item, 0); + this(player, item, 0);
+ } + }
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public PlayerAttemptPickupItemEvent(@NotNull final Player player, @NotNull final Item item, final int remaining) { + public PlayerAttemptPickupItemEvent(final Player player, final Item item, final int remaining) {
+ super(player); + super(player);
+ this.item = item; + this.item = item;
+ this.remaining = remaining; + this.remaining = remaining;
@ -50,7 +51,6 @@ index 0000000000000000000000000000000000000000..13e4b1309ea9965a07fc8b276d5a7e60
+ * + *
+ * @return Item + * @return Item
+ */ + */
+ @NotNull
+ public Item getItem() { + public Item getItem() {
+ return this.item; + return this.item;
+ } + }
@ -95,13 +95,11 @@ index 0000000000000000000000000000000000000000..13e4b1309ea9965a07fc8b276d5a7e60
+ this.flyAtPlayer = !cancel; + this.flyAtPlayer = !cancel;
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }

Datei anzeigen

@ -6,10 +6,10 @@ Subject: [PATCH] Add UnknownCommandEvent
diff --git a/src/main/java/org/bukkit/event/command/UnknownCommandEvent.java b/src/main/java/org/bukkit/event/command/UnknownCommandEvent.java diff --git a/src/main/java/org/bukkit/event/command/UnknownCommandEvent.java b/src/main/java/org/bukkit/event/command/UnknownCommandEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..9bdeeecdb6021d61fd9141270011e56b06a58a76 index 0000000000000000000000000000000000000000..58fe8f60ad5e7ca0ffddebb7ba5748bbfb129ddd
--- /dev/null --- /dev/null
+++ b/src/main/java/org/bukkit/event/command/UnknownCommandEvent.java +++ b/src/main/java/org/bukkit/event/command/UnknownCommandEvent.java
@@ -0,0 +1,110 @@ @@ -0,0 +1,105 @@
+package org.bukkit.event.command; +package org.bukkit.event.command;
+ +
+import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.Component;
@ -19,22 +19,23 @@ index 0000000000000000000000000000000000000000..9bdeeecdb6021d61fd9141270011e56b
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+ +
+/** +/**
+ * Thrown when a player executes a command that is not defined + * Thrown when a player executes a command that is not defined
+ */ + */
+@NullMarked
+public class UnknownCommandEvent extends Event { +public class UnknownCommandEvent extends Event {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final CommandSender sender; + private final CommandSender sender;
+ @NotNull private final String commandLine; + private final String commandLine;
+ @Nullable private Component message; + private @Nullable Component message;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public UnknownCommandEvent(@NotNull final CommandSender sender, @NotNull final String commandLine, @Nullable final Component message) { + public UnknownCommandEvent(final CommandSender sender, final String commandLine, final @Nullable Component message) {
+ super(false); + super(false);
+ this.sender = sender; + this.sender = sender;
+ this.commandLine = commandLine; + this.commandLine = commandLine;
@ -46,7 +47,6 @@ index 0000000000000000000000000000000000000000..9bdeeecdb6021d61fd9141270011e56b
+ * + *
+ * @return Sender of the command + * @return Sender of the command
+ */ + */
+ @NotNull
+ public CommandSender getSender() { + public CommandSender getSender() {
+ return this.sender; + return this.sender;
+ } + }
@ -56,7 +56,6 @@ index 0000000000000000000000000000000000000000..9bdeeecdb6021d61fd9141270011e56b
+ * + *
+ * @return Command sent + * @return Command sent
+ */ + */
+ @NotNull
+ public String getCommandLine() { + public String getCommandLine() {
+ return this.commandLine; + return this.commandLine;
+ } + }
@ -67,9 +66,8 @@ index 0000000000000000000000000000000000000000..9bdeeecdb6021d61fd9141270011e56b
+ * @return Unknown command message + * @return Unknown command message
+ * @deprecated use {@link #message()} + * @deprecated use {@link #message()}
+ */ + */
+ @Nullable
+ @Deprecated + @Deprecated
+ public String getMessage() { + public @Nullable String getMessage() {
+ return this.message == null ? null : LegacyComponentSerializer.legacySection().serialize(this.message); + return this.message == null ? null : LegacyComponentSerializer.legacySection().serialize(this.message);
+ } + }
+ +
@ -91,9 +89,8 @@ index 0000000000000000000000000000000000000000..9bdeeecdb6021d61fd9141270011e56b
+ * + *
+ * @return Unknown command message + * @return Unknown command message
+ */ + */
+ @Nullable
+ @Contract(pure = true) + @Contract(pure = true)
+ public Component message() { + public @Nullable Component message() {
+ return this.message; + return this.message;
+ } + }
+ +
@ -108,13 +105,11 @@ index 0000000000000000000000000000000000000000..9bdeeecdb6021d61fd9141270011e56b
+ this.message = message; + this.message = message;
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }

Datei anzeigen

@ -7,29 +7,30 @@ Provides basic elements of a PlayerProfile to be used by future API/events
diff --git a/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java diff --git a/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c274a1ec4cd index 0000000000000000000000000000000000000000..324c1cba46c9eef95cc22ffa231b04f9298a5e00
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java +++ b/src/main/java/com/destroystokyo/paper/profile/PlayerProfile.java
@@ -0,0 +1,234 @@ @@ -0,0 +1,246 @@
+package com.destroystokyo.paper.profile; +package com.destroystokyo.paper.profile;
+ +
+import java.util.Collection; +import java.util.Collection;
+import java.util.Set; +import java.util.Set;
+import java.util.UUID; +import java.util.UUID;
+
+import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletableFuture;
+import org.bukkit.profile.PlayerTextures; +import org.bukkit.profile.PlayerTextures;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+ +
+/** +/**
+ * Represents a players profile for the game, such as UUID, Name, and textures. + * Represents a players profile for the game, such as UUID, Name, and textures.
+ */ + */
+@NullMarked
+public interface PlayerProfile extends org.bukkit.profile.PlayerProfile { +public interface PlayerProfile extends org.bukkit.profile.PlayerProfile {
+ +
+ /** + /**
+ * @return The players name, if set + * @return The players name, if set
+ */ + */
+ @Override
+ @Nullable + @Nullable
+ String getName(); + String getName();
+ +
@ -39,14 +40,14 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ * @param name The new Name + * @param name The new Name
+ * @return The previous Name + * @return The previous Name
+ */ + */
+ @NotNull
+ @Deprecated(forRemoval = true, since = "1.18.1") + @Deprecated(forRemoval = true, since = "1.18.1")
+ String setName(@Nullable String name); + String setName(@Nullable String name);
+ +
+ /** + /**
+ * @return The players unique identifier, if set + * @return The players unique identifier, if set
+ */ + */
+ @Nullable UUID getId(); + @Nullable
+ UUID getId();
+ +
+ /** + /**
+ * Sets this profiles UUID + * Sets this profiles UUID
@ -54,8 +55,8 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ * @param uuid The new UUID + * @param uuid The new UUID
+ * @return The previous UUID + * @return The previous UUID
+ */ + */
+ @Nullable
+ @Deprecated(forRemoval = true, since = "1.18.1") + @Deprecated(forRemoval = true, since = "1.18.1")
+ @Nullable
+ UUID setId(@Nullable UUID uuid); + UUID setId(@Nullable UUID uuid);
+ +
+ /** + /**
@ -65,7 +66,7 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ * + *
+ * @return the textures, not <code>null</code> + * @return the textures, not <code>null</code>
+ */ + */
+ @NotNull + @Override
+ PlayerTextures getTextures(); + PlayerTextures getTextures();
+ +
+ /** + /**
@ -74,16 +75,18 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ * @param textures the textures to copy, or <code>null</code> to clear the + * @param textures the textures to copy, or <code>null</code> to clear the
+ * textures + * textures
+ */ + */
+ @Override
+ void setTextures(@Nullable PlayerTextures textures); + void setTextures(@Nullable PlayerTextures textures);
+ +
+ /** + /**
+ * @return A Mutable set of this players properties, such as textures. + * @return A Mutable set of this players properties, such as textures.
+ * Values specified here are subject to implementation details. + * Values specified here are subject to implementation details.
+ */ + */
+ @NotNull Set<ProfileProperty> getProperties(); + Set<ProfileProperty> getProperties();
+ +
+ /** + /**
+ * Check if the Profile has the specified property + * Check if the Profile has the specified property
+ *
+ * @param property Property name to check + * @param property Property name to check
+ * @return If the property is set + * @return If the property is set
+ */ + */
@ -95,17 +98,19 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ * @param property Property to set. + * @param property Property to set.
+ * @throws IllegalArgumentException if setting the property results in more than 16 properties + * @throws IllegalArgumentException if setting the property results in more than 16 properties
+ */ + */
+ void setProperty(@NotNull ProfileProperty property); + void setProperty(ProfileProperty property);
+ +
+ /** + /**
+ * Sets multiple properties. If any of the set properties already exist, it will be replaced + * Sets multiple properties. If any of the set properties already exist, it will be replaced
+ *
+ * @param properties The properties to set + * @param properties The properties to set
+ * @throws IllegalArgumentException if the number of properties exceeds 16 + * @throws IllegalArgumentException if the number of properties exceeds 16
+ */ + */
+ void setProperties(@NotNull Collection<ProfileProperty> properties); + void setProperties(Collection<ProfileProperty> properties);
+ +
+ /** + /**
+ * Removes a specific property from this profile + * Removes a specific property from this profile
+ *
+ * @param property The property to remove + * @param property The property to remove
+ * @return If a property was removed + * @return If a property was removed
+ */ + */
@ -113,22 +118,24 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ +
+ /** + /**
+ * Removes a specific property from this profile + * Removes a specific property from this profile
+ *
+ * @param property The property to remove + * @param property The property to remove
+ * @return If a property was removed + * @return If a property was removed
+ */ + */
+ default boolean removeProperty(@NotNull ProfileProperty property) { + default boolean removeProperty(final ProfileProperty property) {
+ return removeProperty(property.getName()); + return this.removeProperty(property.getName());
+ } + }
+ +
+ /** + /**
+ * Removes all properties in the collection + * Removes all properties in the collection
+ *
+ * @param properties The properties to remove + * @param properties The properties to remove
+ * @return If any property was removed + * @return If any property was removed
+ */ + */
+ default boolean removeProperties(@NotNull Collection<ProfileProperty> properties) { + default boolean removeProperties(final Collection<ProfileProperty> properties) {
+ boolean removed = false; + boolean removed = false;
+ for (ProfileProperty property : properties) { + for (final ProfileProperty property : properties) {
+ if (removeProperty(property)) { + if (this.removeProperty(property)) {
+ removed = true; + removed = true;
+ } + }
+ } + }
@ -143,6 +150,7 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ /** + /**
+ * @return If the profile is now complete (has UUID and Name) + * @return If the profile is now complete (has UUID and Name)
+ */ + */
+ @Override
+ boolean isComplete(); + boolean isComplete();
+ +
+ /** + /**
@ -175,21 +183,23 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ /** + /**
+ * If this profile is not complete, then make the API call to complete it. + * If this profile is not complete, then make the API call to complete it.
+ * This is a blocking operation and should be done asynchronously. + * This is a blocking operation and should be done asynchronously.
+ * + * <p>
+ * This will also complete textures. If you do not want to load textures, use {{@link #complete(boolean)}} + * This will also complete textures. If you do not want to load textures, use {{@link #complete(boolean)}}
+ *
+ * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail) + * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
+ */ + */
+ default boolean complete() { + default boolean complete() {
+ return complete(true); + return this.complete(true);
+ } + }
+ +
+ /** + /**
+ * If this profile is not complete, then make the API call to complete it. + * If this profile is not complete, then make the API call to complete it.
+ * This is a blocking operation and should be done asynchronously. + * This is a blocking operation and should be done asynchronously.
+ * + * <p>
+ * Optionally will also fill textures. + * Optionally will also fill textures.
+ * + * <p>
+ * Online mode will be automatically determined + * Online mode will be automatically determined
+ *
+ * @param textures controls if we should fill the profile with texture properties + * @param textures controls if we should fill the profile with texture properties
+ * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail) + * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
+ */ + */
@ -198,8 +208,9 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ /** + /**
+ * If this profile is not complete, then make the API call to complete it. + * If this profile is not complete, then make the API call to complete it.
+ * This is a blocking operation and should be done asynchronously. + * This is a blocking operation and should be done asynchronously.
+ * + * <p>
+ * Optionally will also fill textures. + * Optionally will also fill textures.
+ *
+ * @param textures controls if we should fill the profile with texture properties + * @param textures controls if we should fill the profile with texture properties
+ * @param onlineMode Treat this server as online mode or not + * @param onlineMode Treat this server as online mode or not
+ * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail) + * @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
@ -235,43 +246,45 @@ index 0000000000000000000000000000000000000000..b4f9ffbebab8eef99dbd81c816c16c27
+ * </pre> + * </pre>
+ */ + */
+ @Override + @Override
+ @NotNull CompletableFuture<PlayerProfile> update(); + CompletableFuture<PlayerProfile> update();
+ +
+ /** + /**
+ * Whether this Profile has textures associated to it + * Whether this Profile has textures associated to it
+ *
+ * @return If it has a textures property + * @return If it has a textures property
+ */ + */
+ default boolean hasTextures() { + default boolean hasTextures() {
+ return hasProperty("textures"); + return this.hasProperty("textures");
+ } + }
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java b/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java diff --git a/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java b/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..8f913a078dd692a9feafb98a6e6c9583f3253bd4 index 0000000000000000000000000000000000000000..35341d8f1ac2d80f339084ef80d099a545027554
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java +++ b/src/main/java/com/destroystokyo/paper/profile/ProfileProperty.java
@@ -0,0 +1,75 @@ @@ -0,0 +1,73 @@
+package com.destroystokyo.paper.profile; +package com.destroystokyo.paper.profile;
+ +
+import com.google.common.base.Preconditions; +import com.google.common.base.Preconditions;
+
+import java.util.Objects; +import java.util.Objects;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+ +
+/** +/**
+ * Represents a property on a {@link PlayerProfile} + * Represents a property on a {@link PlayerProfile}
+ */ + */
+public class ProfileProperty { +@NullMarked
+public final class ProfileProperty {
+
+ private final String name; + private final String name;
+ private final String value; + private final String value;
+ private final String signature; + private final @Nullable String signature;
+ +
+ public ProfileProperty(@NotNull String name, @NotNull String value) { + public ProfileProperty(final String name, final String value) {
+ this(name, value, null); + this(name, value, null);
+ } + }
+ +
+ public ProfileProperty(@NotNull String name, @NotNull String value, @Nullable String signature) { + public ProfileProperty(final String name, final String value, final @Nullable String signature) {
+ this.name = Preconditions.checkNotNull(name, "ProfileProperty name can not be null"); + this.name = Preconditions.checkNotNull(name, "ProfileProperty name can not be null");
+ this.value = Preconditions.checkNotNull(value, "ProfileProperty value can not be null"); + this.value = Preconditions.checkNotNull(value, "ProfileProperty value can not be null");
+ this.signature = signature; + this.signature = signature;
@ -283,25 +296,22 @@ index 0000000000000000000000000000000000000000..8f913a078dd692a9feafb98a6e6c9583
+ /** + /**
+ * @return The property name, ie "textures" + * @return The property name, ie "textures"
+ */ + */
+ @NotNull
+ public String getName() { + public String getName() {
+ return name; + return this.name;
+ } + }
+ +
+ /** + /**
+ * @return The property value, likely to be base64 encoded + * @return The property value, likely to be base64 encoded
+ */ + */
+ @NotNull
+ public String getValue() { + public String getValue() {
+ return value; + return this.value;
+ } + }
+ +
+ /** + /**
+ * @return A signature from Mojang for signed properties + * @return A signature from Mojang for signed properties
+ */ + */
+ @Nullable + public @Nullable String getSignature() {
+ public String getSignature() { + return this.signature;
+ return signature;
+ } + }
+ +
+ /** + /**
@ -312,25 +322,25 @@ index 0000000000000000000000000000000000000000..8f913a078dd692a9feafb98a6e6c9583
+ } + }
+ +
+ @Override + @Override
+ public boolean equals(Object o) { + public boolean equals(final @Nullable Object o) {
+ if (this == o) return true; + if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false; + if (o == null || this.getClass() != o.getClass()) return false;
+ ProfileProperty that = (ProfileProperty) o; + final ProfileProperty that = (ProfileProperty) o;
+ return Objects.equals(name, that.name) && + return Objects.equals(this.name, that.name) &&
+ Objects.equals(value, that.value) && + Objects.equals(this.value, that.value) &&
+ Objects.equals(signature, that.signature); + Objects.equals(this.signature, that.signature);
+ } + }
+ +
+ @Override + @Override
+ public int hashCode() { + public int hashCode() {
+ return Objects.hash(name); + return Objects.hash(this.name);
+ } + }
+} +}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index dec72e92fb9e489d1d04cdf60c2f1d34571f9410..dcf6b2d04f9e1bc7466feda22069423d638fb4b3 100644 index c900bde81d8f20ed4775228fbe767d7db62508fa..6c44f58551dda4129d37cce100a9c5b9c9810cca 100644
--- a/src/main/java/org/bukkit/Bukkit.java --- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java
@@ -2400,6 +2400,89 @@ public final class Bukkit { @@ -2424,6 +2424,89 @@ public final class Bukkit {
public static boolean suggestPlayerNamesWhenNullTabCompletions() { public static boolean suggestPlayerNamesWhenNullTabCompletions() {
return server.suggestPlayerNamesWhenNullTabCompletions(); return server.suggestPlayerNamesWhenNullTabCompletions();
} }
@ -421,10 +431,10 @@ index dec72e92fb9e489d1d04cdf60c2f1d34571f9410..dcf6b2d04f9e1bc7466feda22069423d
@NotNull @NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 2f68b766267b53e98dee3054e0a69be8b9cdf70f..7a1b80e8d02f23c5d246c3032e5ced909f10bd41 100644 index 0588c6c8b30bfe6e1e8ab7e1523a8a9be6b11b6f..55d8602bb651f85b9d0a80ec015cec5e48948d44 100644
--- a/src/main/java/org/bukkit/Server.java --- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java
@@ -2090,5 +2090,80 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -2108,5 +2108,80 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
* @return true if player names should be suggested * @return true if player names should be suggested
*/ */
boolean suggestPlayerNamesWhenNullTabCompletions(); boolean suggestPlayerNamesWhenNullTabCompletions();

Datei anzeigen

@ -5,10 +5,10 @@ Subject: [PATCH] Shoulder Entities Release API
diff --git a/src/main/java/org/bukkit/entity/HumanEntity.java b/src/main/java/org/bukkit/entity/HumanEntity.java diff --git a/src/main/java/org/bukkit/entity/HumanEntity.java b/src/main/java/org/bukkit/entity/HumanEntity.java
index 195a7fa0ea8e056cbde7b9152cc014d2c94353ff..85eec2e57b03c11f4737addb0fa88b7bf29dc9e5 100644 index 46a076bd8dc2f5d1094899638ab255a5a31c2568..08cef0d9fc27d0c09472cfe7091330d95956d9eb 100644
--- a/src/main/java/org/bukkit/entity/HumanEntity.java --- a/src/main/java/org/bukkit/entity/HumanEntity.java
+++ b/src/main/java/org/bukkit/entity/HumanEntity.java +++ b/src/main/java/org/bukkit/entity/HumanEntity.java
@@ -337,6 +337,26 @@ public interface HumanEntity extends LivingEntity, AnimalTamer, InventoryHolder @@ -377,6 +377,26 @@ public interface HumanEntity extends LivingEntity, AnimalTamer, InventoryHolder
*/ */
public int getExpToLevel(); public int getExpToLevel();

Datei anzeigen

@ -8,19 +8,18 @@ profiles that had to be looked up.
diff --git a/src/main/java/com/destroystokyo/paper/event/profile/LookupProfileEvent.java b/src/main/java/com/destroystokyo/paper/event/profile/LookupProfileEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/profile/LookupProfileEvent.java b/src/main/java/com/destroystokyo/paper/event/profile/LookupProfileEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..2ad2782aafe76f8b10565c0f0419d6b9c665b267 index 0000000000000000000000000000000000000000..9e8ae0ab13cac9a260c9959eb6bf5b93a3c15018
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/profile/LookupProfileEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/profile/LookupProfileEvent.java
@@ -0,0 +1,48 @@ @@ -0,0 +1,45 @@
+package com.destroystokyo.paper.event.profile; +package com.destroystokyo.paper.event.profile;
+ +
+import com.destroystokyo.paper.profile.PlayerProfile; +import com.destroystokyo.paper.profile.PlayerProfile;
+import org.bukkit.Bukkit; +import org.bukkit.Bukkit;
+import org.bukkit.event.Event; +import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList; +import org.bukkit.event.HandlerList;
+
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+ +
+/** +/**
+ * Allows a plugin to be notified anytime AFTER a Profile has been looked up from the Mojang API + * Allows a plugin to be notified anytime AFTER a Profile has been looked up from the Mojang API
@ -29,14 +28,15 @@ index 0000000000000000000000000000000000000000..2ad2782aafe76f8b10565c0f0419d6b9
+ * No guarantees are made about thread execution context for this event. If you need to know, check + * No guarantees are made about thread execution context for this event. If you need to know, check
+ * {@link Event#isAsynchronous()} + * {@link Event#isAsynchronous()}
+ */ + */
+@NullMarked
+public class LookupProfileEvent extends Event { +public class LookupProfileEvent extends Event {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final PlayerProfile profile; + private final PlayerProfile profile;
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public LookupProfileEvent(@NotNull PlayerProfile profile) { + public LookupProfileEvent(final PlayerProfile profile) {
+ super(!Bukkit.isPrimaryThread()); + super(!Bukkit.isPrimaryThread());
+ this.profile = profile; + this.profile = profile;
+ } + }
@ -44,41 +44,37 @@ index 0000000000000000000000000000000000000000..2ad2782aafe76f8b10565c0f0419d6b9
+ /** + /**
+ * @return The profile that was recently looked up. This profile can be mutated + * @return The profile that was recently looked up. This profile can be mutated
+ */ + */
+ @NotNull
+ public PlayerProfile getPlayerProfile() { + public PlayerProfile getPlayerProfile() {
+ return this.profile; + return this.profile;
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+} +}
diff --git a/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java b/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java diff --git a/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java b/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..3f73ec52f9b581001bef3a19a5f1533dfa474356 index 0000000000000000000000000000000000000000..07416cc9e2b8156be2cc92d6d974b881b427fd99
--- /dev/null --- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java +++ b/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java
@@ -0,0 +1,112 @@ @@ -0,0 +1,107 @@
+package com.destroystokyo.paper.event.profile; +package com.destroystokyo.paper.event.profile;
+ +
+import com.destroystokyo.paper.profile.ProfileProperty; +import com.destroystokyo.paper.profile.ProfileProperty;
+import org.bukkit.Bukkit;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+
+import java.util.HashSet; +import java.util.HashSet;
+import java.util.Set; +import java.util.Set;
+import java.util.UUID; +import java.util.UUID;
+import org.bukkit.Bukkit;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NullMarked;
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable;
+ +
+/** +/**
+ * Allows a plugin to intercept a Profile Lookup for a Profile by name + * Allows a plugin to intercept a Profile Lookup for a Profile by name
@ -90,17 +86,18 @@ index 0000000000000000000000000000000000000000..3f73ec52f9b581001bef3a19a5f1533d
+ * No guarantees are made about thread execution context for this event. If you need to know, check + * No guarantees are made about thread execution context for this event. If you need to know, check
+ * {@link Event#isAsynchronous()} + * {@link Event#isAsynchronous()}
+ */ + */
+@NullMarked
+public class PreLookupProfileEvent extends Event { +public class PreLookupProfileEvent extends Event {
+ +
+ private static final HandlerList HANDLER_LIST = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList();
+ +
+ @NotNull private final String name; + private final String name;
+ +
+ private UUID uuid; + private @Nullable UUID uuid;
+ @NotNull private Set<ProfileProperty> properties = new HashSet<>(); + private Set<ProfileProperty> properties = new HashSet<>();
+ +
+ @ApiStatus.Internal + @ApiStatus.Internal
+ public PreLookupProfileEvent(@NotNull String name) { + public PreLookupProfileEvent(final String name) {
+ super(!Bukkit.isPrimaryThread()); + super(!Bukkit.isPrimaryThread());
+ this.name = name; + this.name = name;
+ } + }
@ -108,7 +105,6 @@ index 0000000000000000000000000000000000000000..3f73ec52f9b581001bef3a19a5f1533d
+ /** + /**
+ * @return Name of the profile + * @return Name of the profile
+ */ + */
+ @NotNull
+ public String getName() { + public String getName() {
+ return this.name; + return this.name;
+ } + }
@ -120,8 +116,7 @@ index 0000000000000000000000000000000000000000..3f73ec52f9b581001bef3a19a5f1533d
+ * + *
+ * @return The UUID of the profile if it has already been provided by a plugin + * @return The UUID of the profile if it has already been provided by a plugin
+ */ + */
+ @Nullable + public @Nullable UUID getUUID() {
+ public UUID getUUID() {
+ return this.uuid; + return this.uuid;
+ } + }
+ +
@ -132,7 +127,7 @@ index 0000000000000000000000000000000000000000..3f73ec52f9b581001bef3a19a5f1533d
+ * + *
+ * @param uuid the UUID to set for the profile or {@code null} to reset + * @param uuid the UUID to set for the profile or {@code null} to reset
+ */ + */
+ public void setUUID(@Nullable UUID uuid) { + public void setUUID(final @Nullable UUID uuid) {
+ this.uuid = uuid; + this.uuid = uuid;
+ } + }
+ +
@ -140,7 +135,6 @@ index 0000000000000000000000000000000000000000..3f73ec52f9b581001bef3a19a5f1533d
+ * @return The currently pending pre-populated properties. + * @return The currently pending pre-populated properties.
+ * Any property in this Set will be automatically prefilled on this Profile + * Any property in this Set will be automatically prefilled on this Profile
+ */ + */
+ @NotNull
+ public Set<ProfileProperty> getProfileProperties() { + public Set<ProfileProperty> getProfileProperties() {
+ return this.properties; + return this.properties;
+ } + }
@ -151,7 +145,7 @@ index 0000000000000000000000000000000000000000..3f73ec52f9b581001bef3a19a5f1533d
+ * + *
+ * @param properties The properties to add + * @param properties The properties to add
+ */ + */
+ public void setProfileProperties(@NotNull Set<ProfileProperty> properties) { + public void setProfileProperties(final Set<ProfileProperty> properties) {
+ this.properties = new HashSet<>(); + this.properties = new HashSet<>();
+ this.properties.addAll(properties); + this.properties.addAll(properties);
+ } + }
@ -162,17 +156,15 @@ index 0000000000000000000000000000000000000000..3f73ec52f9b581001bef3a19a5f1533d
+ * + *
+ * @param properties The properties to add + * @param properties The properties to add
+ */ + */
+ public void addProfileProperties(@NotNull Set<ProfileProperty> properties) { + public void addProfileProperties(final Set<ProfileProperty> properties) {
+ this.properties.addAll(properties); + this.properties.addAll(properties);
+ } + }
+ +
+ @NotNull
+ @Override + @Override
+ public HandlerList getHandlers() { + public HandlerList getHandlers() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }
+ +
+ @NotNull
+ public static HandlerList getHandlerList() { + public static HandlerList getHandlerList() {
+ return HANDLER_LIST; + return HANDLER_LIST;
+ } + }

Datei anzeigen

@ -8,14 +8,16 @@ and access their saddle state separately from an interface shared with Armor.
diff --git a/src/main/java/org/bukkit/inventory/ArmoredHorseInventory.java b/src/main/java/org/bukkit/inventory/ArmoredHorseInventory.java diff --git a/src/main/java/org/bukkit/inventory/ArmoredHorseInventory.java b/src/main/java/org/bukkit/inventory/ArmoredHorseInventory.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..163ffe8ff76ded6265d865901d5110fb6a56950d index 0000000000000000000000000000000000000000..994f34ac2062c092c2b4e5ff364067482d19588c
--- /dev/null --- /dev/null
+++ b/src/main/java/org/bukkit/inventory/ArmoredHorseInventory.java +++ b/src/main/java/org/bukkit/inventory/ArmoredHorseInventory.java
@@ -0,0 +1,21 @@ @@ -0,0 +1,22 @@
+package org.bukkit.inventory; +package org.bukkit.inventory;
+ +
+import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+ +
+@NullMarked
+public interface ArmoredHorseInventory extends AbstractHorseInventory { +public interface ArmoredHorseInventory extends AbstractHorseInventory {
+ +
+ /** + /**
@ -23,8 +25,7 @@ index 0000000000000000000000000000000000000000..163ffe8ff76ded6265d865901d5110fb
+ * + *
+ * @return the armor item + * @return the armor item
+ */ + */
+ @Nullable + @Nullable ItemStack getArmor();
+ ItemStack getArmor();
+ +
+ /** + /**
+ * Sets the item in the horse's armor slot. + * Sets the item in the horse's armor slot.
@ -74,10 +75,14 @@ index 2fa2c9d07ecbafaf2396d913af90f1f4d432b238..5ac1afb8a213fa0fe344db4730ecbc5d
* Gets the item in the llama's decor slot. * Gets the item in the llama's decor slot.
diff --git a/src/main/java/org/bukkit/inventory/SaddledHorseInventory.java b/src/main/java/org/bukkit/inventory/SaddledHorseInventory.java diff --git a/src/main/java/org/bukkit/inventory/SaddledHorseInventory.java b/src/main/java/org/bukkit/inventory/SaddledHorseInventory.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..7944f26a3e2a92601c3be0e55c00c39cc16cf177 index 0000000000000000000000000000000000000000..0f508a8df87f1e23764152d00e02a3da5131f034
--- /dev/null --- /dev/null
+++ b/src/main/java/org/bukkit/inventory/SaddledHorseInventory.java +++ b/src/main/java/org/bukkit/inventory/SaddledHorseInventory.java
@@ -0,0 +1,3 @@ @@ -0,0 +1,7 @@
+package org.bukkit.inventory; +package org.bukkit.inventory;
+ +
+public interface SaddledHorseInventory extends AbstractHorseInventory {} +import org.jspecify.annotations.NullMarked;
+
+@NullMarked
+public interface SaddledHorseInventory extends AbstractHorseInventory {
+}

Datei anzeigen

@ -8,7 +8,7 @@ Currently the server only supports the English language. To override this,
You must replace the language file embedded in the server jar. You must replace the language file embedded in the server jar.
diff --git a/src/main/java/org/bukkit/inventory/ItemFactory.java b/src/main/java/org/bukkit/inventory/ItemFactory.java diff --git a/src/main/java/org/bukkit/inventory/ItemFactory.java b/src/main/java/org/bukkit/inventory/ItemFactory.java
index d5342258086066d3b9ef404916bad8440f0cf0cd..c92843d0adb438d7a64a5d00ce67b67efd65ca14 100644 index d5342258086066d3b9ef404916bad8440f0cf0cd..333884bc8fe45c66d37a1bbcebc10ea655d2055f 100644
--- a/src/main/java/org/bukkit/inventory/ItemFactory.java --- a/src/main/java/org/bukkit/inventory/ItemFactory.java
+++ b/src/main/java/org/bukkit/inventory/ItemFactory.java +++ b/src/main/java/org/bukkit/inventory/ItemFactory.java
@@ -220,4 +220,20 @@ public interface ItemFactory { @@ -220,4 +220,20 @@ public interface ItemFactory {
@ -28,7 +28,7 @@ index d5342258086066d3b9ef404916bad8440f0cf0cd..c92843d0adb438d7a64a5d00ce67b67e
+ * {@link net.kyori.adventure.text.Component#translatable(net.kyori.adventure.translation.Translatable)} instead. + * {@link net.kyori.adventure.text.Component#translatable(net.kyori.adventure.translation.Translatable)} instead.
+ */ + */
+ @Nullable + @Nullable
+ @Deprecated(since = "1.18.1") + @Deprecated(since = "1.18.1", forRemoval = true)
+ String getI18NDisplayName(@Nullable ItemStack item); + String getI18NDisplayName(@Nullable ItemStack item);
+ // Paper end - add getI18NDisplayName + // Paper end - add getI18NDisplayName
} }

Datei anzeigen

@ -7,11 +7,11 @@ This will take a Bukkit ItemStack and run it through any conversions a server pr
to ensure it meets latest minecraft expectations. to ensure it meets latest minecraft expectations.
diff --git a/src/main/java/org/bukkit/inventory/ItemFactory.java b/src/main/java/org/bukkit/inventory/ItemFactory.java diff --git a/src/main/java/org/bukkit/inventory/ItemFactory.java b/src/main/java/org/bukkit/inventory/ItemFactory.java
index c92843d0adb438d7a64a5d00ce67b67efd65ca14..3d08beee52f2247db6f6e679206ed6a965fbf9a8 100644 index 333884bc8fe45c66d37a1bbcebc10ea655d2055f..c1ec8efffd5ff2a4dcb1d761be9a431a62284607 100644
--- a/src/main/java/org/bukkit/inventory/ItemFactory.java --- a/src/main/java/org/bukkit/inventory/ItemFactory.java
+++ b/src/main/java/org/bukkit/inventory/ItemFactory.java +++ b/src/main/java/org/bukkit/inventory/ItemFactory.java
@@ -236,4 +236,18 @@ public interface ItemFactory { @@ -236,4 +236,18 @@ public interface ItemFactory {
@Deprecated(since = "1.18.1") @Deprecated(since = "1.18.1", forRemoval = true)
String getI18NDisplayName(@Nullable ItemStack item); String getI18NDisplayName(@Nullable ItemStack item);
// Paper end - add getI18NDisplayName // Paper end - add getI18NDisplayName
+ +

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen