Compare commits

..
39 Commits
Author SHA1 Message Date
Jake Potrebic fd28d653a2 Fixup some smaller packages, enable on other subprojects (#14458) 2026-11-04 18:15:03 -08:00
CreeamandWarrior 5050b0f333 Fix health capped at their base max health upon join (MC-17876) (#13500)
Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com>
2026-11-04 08:40:23 -03:00
Jason Penilla 6b6835847e Update Mache to 26.3+build.2 (#14461) 2026-11-03 21:04:01 -07:00
Photoπ 13565bc811 Fix cancelled PlayerInteractEvent causing swing packets (#14433) 2026-11-03 19:50:40 -03:00
Pedro df120fd8b5 Add OperatorFeaturesAllowed API for Signs (#14451) 2026-11-02 20:55:58 -03:00
Jason Penilla 7e88a0da38 Sync latest Moonrise changes (#14452) 2026-11-01 20:07:58 +01:00
Bjarne Koll f11902627b Correct data counts for custom inventories (#14449)
Update the hardcoded data counts in CraftContainer to reference the constants used by the menus themselves.
2026-11-01 12:09:17 +00:00
ClexusandWarrior bb10cf0d5b Add EntityLandEvent (#14204)
Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com>
2026-10-31 11:17:23 -03:00
metabrix 55bebded5f Parse pasted multi-line commands separately line by line (#13007) 2026-10-31 10:45:30 -03:00
Michał Fox f728a121f7 Fix respawn radius only covering part of the square (#14390) 2026-10-31 10:31:53 -03:00
balugaq 2401035c89 Add missing ensureSize in MaterialTags (#14438) 2026-10-31 13:27:55 +00:00
Daksh Rawat 174574d871 [ci skip] Fix RedundantNullabilityCheck for nested types (#14430) 2026-10-30 09:15:58 -03:00
Jake Potrebic 8a170a38c6 Update checkstyle (#14431) 2026-10-29 18:53:15 -07:00
Shane Freeder 804dd0c3f0 Centralise TreeType <-> tree feature mapping and test it against TreeGrower (#14417) 2026-10-29 11:28:37 +00:00
Tamion ff31a2c997 Fix cancelled PotionSplashEvent putting out fires (#12194) 2026-10-29 09:29:38 +01:00
Lulu13022002 2e549d651c Call EntityDamageByBlockEvent for fire damage (#12235) 2026-10-29 09:14:15 +01:00
7f9c79794e Fix duplicate dispense events for some items (#13922)
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
Co-authored-by: Bjarne Koll <git@lynxplay.dev>
2026-10-27 19:22:34 +00:00
Daksh Rawat 9d950517d9 [ci skip] Fix JavadocAlignParameterDescriptionCheck with inline tags (#14427) 2026-10-27 16:27:57 +01:00
Marlon Pohl 4f4904928f Add API to query type of PersistentDataContainer value (#14143) 2026-10-26 22:03:51 +01:00
TiggerTakkyTTT 4623163095 Detect rebound middle click clone actions in survival (#14249) 2026-10-26 21:54:48 +01:00
Johan-HynellandWarrior eb9098a546 Made time format output prefix for command block configurable (#14322)
Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com>
2026-10-26 11:18:17 -03:00
Cubicake e415f5e030 Don't refresh entity data if its removed (#14423) 2026-10-25 09:46:40 -03:00
Creeam e3ba7b1dc8 Regen missing worldgen settings file from server.properties (#14233) 2026-10-24 10:18:07 -03:00
metabrix 05c2798ec0 Fix cancelled running scheduled task state (#14109) 2026-10-24 10:13:14 -03:00
TiggerTakkyTTTandDoc 02378ab582 Fire PrepareItemCraftEvent for Crafter preview (#14320)
Co-authored-by: Doc <git@mrdoc.dev>
2026-10-24 09:52:52 -03:00
Warrior 67912d0827 [ci skip] Re-enable using JBR for local run tasks again (#14318) 2026-10-24 09:13:46 -03:00
personalized-advertising e8a1f8fd68 Configurable plugin message channel limit (#14160) 2026-10-24 09:07:27 -03:00
personalized-advertising 1b9bf5c8e9 Add EntityPotentSulfurLaunchEvent (#14237) 2026-10-23 10:47:23 -03:00
Marco N. 325f9071f0 Clear scoreboard team entries on unregister (#14159) 2026-10-23 10:21:43 -03:00
PedroandWarrior d86d427405 Call PlayerBucketEmptyEvent for Sulfur Cube in Bucket (#14150)
Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com>
2026-10-23 09:45:41 -03:00
Gotze 2f1ce01e87 Improve swing hand API to respect item ATTACK_ANIMATION component (#14363) 2026-10-23 09:38:43 -03:00
Bjarne Koll 0d9bf08a23 [ci skip] Fix broken test plugin refs 2026-10-22 18:10:53 +01:00
Mickey42302 e65c0765c6 Add permissions for reset and sequence arguments in /random (#14128) 2026-10-22 15:30:22 +02:00
H. Boyd ac9a1b2c72 Make Color implement adventure ARGBLike (#14349) 2026-10-22 09:59:01 -03:00
Strokkur24andJason Penilla 0db5c93a3d Add helper methods for vanilla-style command feedback (#14331)
Co-authored-by: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
2026-10-22 09:54:34 -03:00
Shane Freeder 2d602d68c1 Split TreeType.POPLAR into per-color poplar tree types (#14416) 2026-10-21 14:12:43 +01:00
TiggerTakkyTTT 2766dd30b1 Add API for explorer maps using specific structures (#14290) 2026-10-21 09:31:41 -03:00
Warrior 03af8b4291 Fix shutdown thread deadlock if it tries to close async (#14410) 2026-10-20 21:49:26 +00:00
Jason Penilla 45fac22871 Sync latest Moonrise changes (#14409) 2026-10-20 21:41:39 +00:00
728 changed files with 9137 additions and 6229 deletions

No files matched your search

+37 -3
View File
@@ -14,11 +14,18 @@
<property name="messageKey" value="annotation\.same\.line"/>
<property name="arguments" value="^(?!(${type_use_annotations}))"/>
</module>
<module name="io.papermc.checkstyle.filters.BetterSuppressionSingleFilter">
<!--Allows @deprecated on packages. Not in the javadoc spec (javadoc warns), but it is still rendered in the deprecation block and list-->
<property name="checks" value="InappropriateJavadocBlockTagsOnPackage"/>
<property name="messageKey" value="javadoc\.inappropriate\.tag"/>
<property name="arguments" value="^deprecated$"/>
</module>
<module name="SuppressWarningsFilter"/>
<!--Javadoc Comments-->
<module name="JavadocPackage"/>
<!--Misc-->
<module name="LineEnding"/>
<module name="NewlineAtEndOfFile"/>
<!--Whitespace-->
<module name="FileTabCharacter"/>
@@ -30,6 +37,12 @@
<property name="optional" value="false"/>
</module>
<module name="SuppressionCommentFilter"/>
<!--per-check variant: // CHECKSTYLE.OFF: CheckName ... // CHECKSTYLE.ON: CheckName-->
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>
<property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>
<property name="checkFormat" value="$1"/>
</module>
<!--Annotations-->
<module name="AnnotationOnSameLine">
@@ -38,6 +51,7 @@
</module>
<module name="AnnotationUseStyle"/>
<module name="MissingDeprecated"/>
<module name="MissingOverrideOnRecordAccessor"/>
<!--Block Checks-->
<module name="AvoidNestedBlocks"/>
@@ -55,7 +69,9 @@
<!--Coding-->
<module name="AvoidDoubleBraceInitialization"/>
<module name="AvoidNoArgumentSuperConstructorCall"/>
<module name="ConstructorsDeclarationGrouping"/>
<module name="ConstructorsDeclarationGrouping">
<property name="orderByIncreasingParameterCount" value="true"/>
</module>
<module name="CovariantEquals"/>
<module name="DeclarationOrder">
<property name="ignoreConstructors" value="true"/>
@@ -63,6 +79,7 @@
<module name="DefaultComesLast"/>
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="ExpressionOverBlockLambda"/>
<module name="FallThrough"/>
<!-- Use non-final variables as an identifier of old code for now -->
<!--<module name="FinalLocalVariable">
@@ -82,10 +99,12 @@
<module name="UnnecessaryNullCheckWithInstanceOf"/>
<module name="UnnecessarySemicolonAfterOuterTypeDeclaration"/>
<module name="UnnecessarySemicolonAfterTypeMemberDeclaration"/>
<module name="UnnecessarySemicolonInEnumeration"/>
<module name="UnnecessarySemicolonInTryWithResources"/>
<module name="UnusedCatchParameterShouldBeUnnamed"/>
<module name="UnusedLocalVariable"/>
<module name="UnusedPrivateField"/>
<module name="UnusedTryResourceShouldBeUnnamed"/>
<module name="UseEnhancedSwitch"/>
<module name="WhenShouldBeUsed"/>
<!--Headers--> <!--N/A-->
@@ -114,9 +133,13 @@
<module name="AtclauseOrder">
<property name="tagOrder" value="@param, @return, @throws, @see, @deprecated, @hidden"/>
</module>
<module name="InappropriateJavadocBlockTagsOnField"/>
<module name="InappropriateJavadocBlockTagsOnPackage"/>
<module name="InappropriateJavadocBlockTagsOnType"/>
<module name="InvalidJavadocPosition"/>
<module name="JavadocBlockTagLocation"/>
<module name="JavadocContentLocation"/>
<module name="JavadocEndCommentDelimiter"/>
<module name="JavadocLeadingAsteriskAlign"/>
<module name="JavadocMethod">
<!--checks all, but doesn't require. If we have a doc, it should be valid-->
@@ -124,11 +147,11 @@
</module>
<module name="JavadocMissingLeadingAsterisk"/>
<module name="JavadocMissingWhitespaceAfterAsterisk"/>
<module name="JavadocStyle"/> <!--checks all, but doesn't require. If we have a doc, it should be valid-->
<module name="JavadocTagContinuationIndentation"/>
<module name="JavadocType"/> <!--checks all, but doesn't require. If we have a doc, it should be valid-->
<module name="NonEmptyAtclauseDescription"/>
<module name="RequireEmptyLineBeforeBlockTagGroup"/>
<module name="SummaryJavadoc"/> <!--checks all, but doesn't require. If we have a doc, it should be valid-->
<!--Metrics--> <!--N/A-->
@@ -136,13 +159,21 @@
<module name="ArrayTypeStyle"/>
<module name="AvoidEscapedUnicodeCharacters"/>
<module name="CommentsIndentation"/>
<module name="HexLiteralCase"/>
<!-- Overlaps with the configured FinalLocalVariable, but is more strict -->
<!--<module name="FinalParameters">
<property name="tokens" value="METHOD_DEF,CTOR_DEF,LITERAL_CATCH,FOR_EACH_CLAUSE,PATTERN_VARIABLE_DEF"/>
</module>-->
<module name="NoCodeInFile"/>
<module name="NumericalPrefixesInfixesSuffixesCharacterCase"/>
<module name="OuterTypeFilename"/>
<!--Leftover Paper/Spigot markers from when these sources were patches on top of upstream (suppressed for the patched paper-server/src/minecraft sources)-->
<module name="TodoComment">
<property name="id" value="PatchMarkerComment"/>
<property name="format" value="(^|//)\s*(Paper|Spigot)\b"/>
<message key="todo.match" value="Remove the leftover ''// Paper'' or ''// Spigot'' patch marker comment."/>
</module>
<module name="UpperEll"/>
<!--Modifiers-->
@@ -180,6 +211,7 @@
<!--Size Violations--> <!--N/A-->
<!--Whitespace-->
<module name="ArrayBracketNoWhitespace"/>
<module name="EmptyForInitializerPad"/>
<module name="EmptyForIteratorPad"/>
<module name="EmptyLineSeparator">
@@ -197,9 +229,11 @@
<module name="TypecastParenPad"/>
<module name="WhitespaceAfter"/>
<module name="WhitespaceAround"/>
<module name="WhitespaceBeforeEmptyBody"/>
<!--Custom-->
<module name="JavadocAlignParameterDescription"/>
<module name="JavadocParamTagOrder"/>
<module name="NullabilityAnnotations"/>
<module name="RedundantNullability"/>
<module name="UnnecessaryFullyQualifiedImport"/>
-1
View File
@@ -3,5 +3,4 @@
"https://checkstyle.org/dtds/suppressions_1_2.dtd">
<suppressions>
<suppress checks="MissingJavadoc.*" files="src[\\/]test[\\/]java[^\\/]*[\\/].*"/>
<suppress checks="JavadocPackage" files="src[\\/]test[\\/]java[^\\/]*[\\/].*"/>
</suppressions>
@@ -1,4 +1,4 @@
name: Release 26.4
name: Release 26.3
on:
workflow_dispatch:
@@ -11,7 +11,7 @@ permissions:
concurrency:
cancel-in-progress: false
group: release-26.4
group: release-26.3
jobs:
release:
+3 -3
View File
@@ -1,4 +1,4 @@
Paper [![Version](https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Fartifactory.papermc.io%2Fartifactory%2Funiverse%2Fio%2Fpapermc%2Fpaper%2Fpaper-api%2Fmaven-metadata.xml&strategy=highestVersion&filter=26.4.*&label=version&color=%23344ceb
Paper [![Version](https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Fartifactory.papermc.io%2Fartifactory%2Funiverse%2Fio%2Fpapermc%2Fpaper%2Fpaper-api%2Fmaven-metadata.xml&strategy=highestVersion&filter=26.3.*&label=version&color=%23344ceb
)](https://papermc.io/downloads/paper)
[![Paper Build Status](https://img.shields.io/github/actions/workflow/status/PaperMC/Paper/release-26.3.yaml?branch=main)](https://github.com/PaperMC/Paper/actions)
[![Discord](https://img.shields.io/discord/289587909051416579.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/papermc)
@@ -39,7 +39,7 @@ repositories {
}
dependencies {
compileOnly("io.papermc.paper:paper-api:26.4.build.+")
compileOnly("io.papermc.paper:paper-api:26.3.build.+")
}
java {
@@ -59,7 +59,7 @@ java {
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>[26.4.build,)</version>
<version>[26.3.build,)</version>
<scope>provided</scope>
</dependency>
```
+4 -2
View File
@@ -477,8 +477,10 @@ public net.minecraft.world.inventory.AbstractMountInventoryMenu mount
public net.minecraft.world.inventory.AnvilMenu cost
public net.minecraft.world.inventory.AnvilMenu itemName
public net.minecraft.world.inventory.AnvilMenu repairItemCountCost
public net.minecraft.world.inventory.BrewingStandMenu DATA_COUNT
public net.minecraft.world.inventory.BrewingStandMenu brewingStandData
public net.minecraft.world.inventory.CraftingMenu access
public net.minecraft.world.inventory.LecternMenu DATA_COUNT
public net.minecraft.world.inventory.MerchantContainer selectionHint
public net.minecraft.world.item.AdventureModePredicate predicates
public net.minecraft.world.item.CrossbowItem FIREWORK_POWER
@@ -583,6 +585,7 @@ public net.minecraft.world.level.block.entity.LecternBlockEntity bookAccess
public net.minecraft.world.level.block.entity.LecternBlockEntity setPage(I)V
public net.minecraft.world.level.block.entity.SculkCatalystBlockEntity$CatalystListener bloom(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/util/RandomSource;)V
public net.minecraft.world.level.block.entity.SculkShriekerBlockEntity warningLevel
public net.minecraft.world.level.block.entity.SignBlockEntity allowOpFeatures
public net.minecraft.world.level.block.entity.SkullBlockEntity customName
public net.minecraft.world.level.block.entity.SkullBlockEntity noteBlockSound
public net.minecraft.world.level.block.entity.SkullBlockEntity owner
@@ -630,15 +633,14 @@ public net.minecraft.world.level.dimension.end.EnderDragonFight spawnNewGateway(
public net.minecraft.world.level.entity.PersistentEntitySectionManager ensureChunkQueuedForLoad(J)V
public net.minecraft.world.level.entity.PersistentEntitySectionManager permanentStorage
public net.minecraft.world.level.gamerules.GameRules rules
public net.minecraft.world.level.levelgen.material.MaterialRuleContext context
public net.minecraft.world.level.levelgen.structure.StructurePiece SHAPE_CHECK_BLOCKS
public net.minecraft.world.level.levelgen.structure.placement.AbstractSpreadingStructurePlacement exclusionZone
public net.minecraft.world.level.levelgen.structure.placement.AbstractSpreadingStructurePlacement frequency
public net.minecraft.world.level.levelgen.structure.placement.AbstractSpreadingStructurePlacement frequencyReductionMethod
public net.minecraft.world.level.levelgen.structure.placement.AbstractSpreadingStructurePlacement locateOffset
public net.minecraft.world.level.levelgen.structure.placement.AbstractSpreadingStructurePlacement salt
public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate <init>()V
public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate entityInfoList
public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate fillFromWorld(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Vec3i;ZLjava/util/List;)V
public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate palettes
public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager resourceManagerSource
public net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager structureRepository
+3 -23
View File
@@ -1,5 +1,3 @@
import io.papermc.paperweight.checkstyle.PaperCheckstyleExt
import io.papermc.paperweight.checkstyle.tasks.PaperCheckstyleTask
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
@@ -11,6 +9,7 @@ subprojects {
apply {
plugin("java-library")
plugin("maven-publish")
plugin("io.papermc.paperweight.paper-checkstyle")
}
extensions.configure<JavaPluginExtension> {
@@ -19,27 +18,8 @@ subprojects {
}
}
val tempDisabled = setOf("paper-server", "paper-generator", "test-plugin")
if (name !in tempDisabled) {
apply { plugin("io.papermc.paperweight.paper-checkstyle") }
extensions.configure<PaperCheckstyleExt> {
typeUseAnnotationsFile.set(rootProject.layout.projectDirectory.file(".checkstyle/type_use_annotations.txt"))
}
/*tasks.withType<PaperCheckstyleTask>().configureEach {
configDirectory = rootProject.layout.projectDirectory.dir(".checkstyle")
// configFile = layout.projectDirectory.file(".checkstyle/checkstyle.xml").asFile // use the base file if not overwritten
maxHeapSize = "2g"
reports {
xml.required = true
html.required = true
}
}*/
dependencies {
"checkstyle"(project(":paper-checkstyle"))
}
dependencies {
"checkstyle"(project(":paper-checkstyle"))
}
}
+4 -4
View File
@@ -1,12 +1,12 @@
group=io.papermc.paper
mcVersion=26.4-snapshot-5
mcVersion=26.3
# This is the current API version for use in (paper-)plugin.yml files
# During snapshot cycles this should be the anticipated version of the release target
apiVersion=26.4
channel=ALPHA
apiVersion=26.3
channel=STABLE
# Set to true while updating Minecraft version
updatingMinecraft=true
updatingMinecraft=false
org.gradle.configuration-cache=true
org.gradle.caching=true
+5
View File
@@ -2,6 +2,11 @@
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<!--generated sources are written by the generator, so we don't control their format-->
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="[\\/]paper-api[\\/]src[\\/]generated[\\/]"/>
</module>
<!--Single Suppression Filters-->
<module name="io.papermc.checkstyle.filters.BetterSuppressionSingleFilter">
<property name="checks" value="Javadoc(Method|Type)"/>
@@ -1,121 +1,59 @@
paper-api/src/generated/java/com/destroystokyo/paper/entity/ai/
paper-api/src/generated/java/io/papermc/paper/registry/keys/
paper-api/src/generated/java/io/papermc/paper/registry/keys/tags/
paper-api/src/main/java/co/aikar/timings/
paper-api/src/main/java/co/aikar/util/
paper-api/src/main/java/com/destroystokyo/paper/
paper-api/src/main/java/com/destroystokyo/paper/block/
paper-api/src/main/java/com/destroystokyo/paper/brigadier/
paper-api/src/main/java/com/destroystokyo/paper/entity/
paper-api/src/main/java/com/destroystokyo/paper/entity/ai/
paper-api/src/main/java/com/destroystokyo/paper/entity/villager/
paper-api/src/main/java/com/destroystokyo/paper/event/block/
paper-api/src/main/java/com/destroystokyo/paper/event/brigadier/
paper-api/src/main/java/com/destroystokyo/paper/event/entity/
paper-api/src/main/java/com/destroystokyo/paper/event/inventory/
paper-api/src/main/java/com/destroystokyo/paper/event/player/
paper-api/src/main/java/com/destroystokyo/paper/event/profile/
paper-api/src/main/java/com/destroystokyo/paper/event/server/
paper-api/src/main/java/com/destroystokyo/paper/exception/
paper-api/src/main/java/com/destroystokyo/paper/inventory/meta/
paper-api/src/main/java/com/destroystokyo/paper/loottable/
paper-api/src/main/java/com/destroystokyo/paper/network/
paper-api/src/main/java/com/destroystokyo/paper/profile/
paper-api/src/main/java/com/destroystokyo/paper/util/
paper-api/src/main/java/com/destroystokyo/paper/utils/
paper-api/src/main/java/io/papermc/paper/advancement/
paper-api/src/main/java/io/papermc/paper/annotation/
paper-api/src/main/java/io/papermc/paper/ban/
paper-api/src/main/java/io/papermc/paper/block/
paper-api/src/main/java/io/papermc/paper/block/bed/
paper-api/src/main/java/io/papermc/paper/block/fluid/
paper-api/src/main/java/io/papermc/paper/block/fluid/type/
paper-api/src/main/java/io/papermc/paper/brigadier/
paper-api/src/main/java/io/papermc/paper/chat/
paper-api/src/main/java/io/papermc/paper/command/
paper-api/src/main/java/io/papermc/paper/command/brigadier/
paper-api/src/main/java/io/papermc/paper/command/brigadier/argument/
paper-api/src/main/java/io/papermc/paper/command/brigadier/argument/position/
paper-api/src/main/java/io/papermc/paper/command/brigadier/argument/predicate/
paper-api/src/main/java/io/papermc/paper/command/brigadier/argument/range/
paper-api/src/main/java/io/papermc/paper/command/brigadier/argument/resolvers/
paper-api/src/main/java/io/papermc/paper/command/brigadier/argument/resolvers/selector/
paper-api/src/main/java/io/papermc/paper/configuration/
paper-api/src/main/java/io/papermc/paper/connection/
paper-api/src/main/java/io/papermc/paper/datacomponent/
paper-api/src/main/java/io/papermc/paper/datacomponent/item/
paper-api/src/main/java/io/papermc/paper/datacomponent/item/attribute/
paper-api/src/main/java/io/papermc/paper/datacomponent/item/blocksattacks/
paper-api/src/main/java/io/papermc/paper/datacomponent/item/consumable/
paper-api/src/main/java/io/papermc/paper/datapack/
paper-api/src/main/java/io/papermc/paper/dialog/
paper-api/src/main/java/io/papermc/paper/enchantments/
paper-api/src/main/java/io/papermc/paper/entity/
paper-api/src/main/java/io/papermc/paper/entity/poi/
paper-api/src/main/java/io/papermc/paper/event/block/
paper-api/src/main/java/io/papermc/paper/event/connection/
paper-api/src/main/java/io/papermc/paper/event/connection/configuration/
paper-api/src/main/java/io/papermc/paper/event/entity/
paper-api/src/main/java/io/papermc/paper/event/executor/
paper-api/src/main/java/io/papermc/paper/event/inventory/
paper-api/src/main/java/io/papermc/paper/event/packet/
paper-api/src/main/java/io/papermc/paper/event/player/
paper-api/src/main/java/io/papermc/paper/event/server/
paper-api/src/main/java/io/papermc/paper/event/world/
paper-api/src/main/java/io/papermc/paper/event/world/border/
paper-api/src/main/java/io/papermc/paper/generated/
paper-api/src/main/java/io/papermc/paper/inventory/
paper-api/src/main/java/io/papermc/paper/inventory/tooltip/
paper-api/src/main/java/io/papermc/paper/item/
paper-api/src/main/java/io/papermc/paper/persistence/
paper-api/src/main/java/io/papermc/paper/plugin/
paper-api/src/main/java/io/papermc/paper/plugin/bootstrap/
paper-api/src/main/java/io/papermc/paper/plugin/configuration/
paper-api/src/main/java/io/papermc/paper/plugin/lifecycle/event/
paper-api/src/main/java/io/papermc/paper/plugin/lifecycle/event/handler/
paper-api/src/main/java/io/papermc/paper/plugin/lifecycle/event/handler/configuration/
paper-api/src/main/java/io/papermc/paper/plugin/lifecycle/event/registrar/
paper-api/src/main/java/io/papermc/paper/plugin/lifecycle/event/types/
paper-api/src/main/java/io/papermc/paper/plugin/loader/
paper-api/src/main/java/io/papermc/paper/plugin/loader/library/
paper-api/src/main/java/io/papermc/paper/plugin/loader/library/impl/
paper-api/src/main/java/io/papermc/paper/plugin/provider/classloader/
paper-api/src/main/java/io/papermc/paper/plugin/provider/entrypoint/
paper-api/src/main/java/io/papermc/paper/plugin/provider/util/
paper-api/src/main/java/io/papermc/paper/potion/
paper-api/src/main/java/io/papermc/paper/raytracing/
paper-api/src/main/java/io/papermc/paper/registry/
paper-api/src/main/java/io/papermc/paper/registry/data/
paper-api/src/main/java/io/papermc/paper/registry/data/client/
paper-api/src/main/java/io/papermc/paper/registry/data/dialog/
paper-api/src/main/java/io/papermc/paper/registry/data/dialog/action/
paper-api/src/main/java/io/papermc/paper/registry/data/dialog/body/
paper-api/src/main/java/io/papermc/paper/registry/data/dialog/input/
paper-api/src/main/java/io/papermc/paper/registry/data/dialog/type/
paper-api/src/main/java/io/papermc/paper/registry/event/
paper-api/src/main/java/io/papermc/paper/registry/event/type/
paper-api/src/main/java/io/papermc/paper/registry/holder/
paper-api/src/main/java/io/papermc/paper/registry/set/
paper-api/src/main/java/io/papermc/paper/registry/tag/
paper-api/src/main/java/io/papermc/paper/scoreboard/numbers/
paper-api/src/main/java/io/papermc/paper/tag/
paper-api/src/main/java/io/papermc/paper/text/
paper-api/src/main/java/io/papermc/paper/threadedregions/
paper-api/src/main/java/io/papermc/paper/threadedregions/scheduler/
paper-api/src/main/java/io/papermc/paper/util/
paper-api/src/main/java/io/papermc/paper/world/
paper-api/src/main/java/io/papermc/paper/world/damagesource/
paper-api/src/main/java/io/papermc/paper/world/flag/
paper-api/src/main/java/org/bukkit/
paper-api/src/main/java/org/bukkit/advancement/
paper-api/src/main/java/org/bukkit/attribute/
paper-api/src/main/java/org/bukkit/ban/
paper-api/src/main/java/org/bukkit/block/
paper-api/src/main/java/org/bukkit/block/banner/
paper-api/src/main/java/org/bukkit/block/data/
paper-api/src/main/java/org/bukkit/block/data/type/
paper-api/src/main/java/org/bukkit/block/sign/
paper-api/src/main/java/org/bukkit/block/spawner/
paper-api/src/main/java/org/bukkit/block/structure/
paper-api/src/main/java/org/bukkit/boss/
paper-api/src/main/java/org/bukkit/command/
@@ -128,12 +66,9 @@ paper-api/src/main/java/org/bukkit/damage/
paper-api/src/main/java/org/bukkit/enchantments/
paper-api/src/main/java/org/bukkit/entity/
paper-api/src/main/java/org/bukkit/entity/boat/
paper-api/src/main/java/org/bukkit/entity/memory/
paper-api/src/main/java/org/bukkit/entity/minecart/
paper-api/src/main/java/org/bukkit/event/
paper-api/src/main/java/org/bukkit/event/block/
paper-api/src/main/java/org/bukkit/event/command/
paper-api/src/main/java/org/bukkit/event/enchantment/
paper-api/src/main/java/org/bukkit/event/entity/
paper-api/src/main/java/org/bukkit/event/hanging/
paper-api/src/main/java/org/bukkit/event/inventory/
@@ -151,51 +86,28 @@ paper-api/src/main/java/org/bukkit/inventory/meta/
paper-api/src/main/java/org/bukkit/inventory/meta/components/
paper-api/src/main/java/org/bukkit/inventory/meta/tags/
paper-api/src/main/java/org/bukkit/inventory/meta/trim/
paper-api/src/main/java/org/bukkit/inventory/recipe/
paper-api/src/main/java/org/bukkit/inventory/view/
paper-api/src/main/java/org/bukkit/inventory/view/builder/
paper-api/src/main/java/org/bukkit/loot/
paper-api/src/main/java/org/bukkit/map/
paper-api/src/main/java/org/bukkit/material/
paper-api/src/main/java/org/bukkit/material/types/
paper-api/src/main/java/org/bukkit/metadata/
paper-api/src/main/java/org/bukkit/packs/
paper-api/src/main/java/org/bukkit/permissions/
paper-api/src/main/java/org/bukkit/persistence/
paper-api/src/main/java/org/bukkit/plugin/
paper-api/src/main/java/org/bukkit/plugin/java/
paper-api/src/main/java/org/bukkit/plugin/messaging/
paper-api/src/main/java/org/bukkit/potion/
paper-api/src/main/java/org/bukkit/profile/
paper-api/src/main/java/org/bukkit/projectiles/
paper-api/src/main/java/org/bukkit/scheduler/
paper-api/src/main/java/org/bukkit/scoreboard/
paper-api/src/main/java/org/bukkit/spawner/
paper-api/src/main/java/org/bukkit/structure/
paper-api/src/main/java/org/bukkit/tag/
paper-api/src/main/java/org/bukkit/util/
paper-api/src/main/java/org/bukkit/util/io/
paper-api/src/main/java/org/bukkit/util/noise/
paper-api/src/main/java/org/bukkit/util/permissions/
paper-api/src/main/java/org/spigotmc/
paper-api/src/main/java/org/spigotmc/event/player/
paper-api/src/test/java/com/destroystokyo/paper/
paper-api/src/test/java/io/papermc/paper/adventure/
paper-api/src/test/java/io/papermc/paper/registry/
paper-api/src/test/java/io/papermc/paper/testing/
paper-api/src/test/java/io/papermc/paper/util/
paper-api/src/test/java/org/bukkit/
paper-api/src/test/java/org/bukkit/configuration/
paper-api/src/test/java/org/bukkit/configuration/file/
paper-api/src/test/java/org/bukkit/conversations/
paper-api/src/test/java/org/bukkit/event/
paper-api/src/test/java/org/bukkit/materials/
paper-api/src/test/java/org/bukkit/metadata/
paper-api/src/test/java/org/bukkit/plugin/
paper-api/src/test/java/org/bukkit/plugin/messaging/
paper-api/src/test/java/org/bukkit/scoreboard/
paper-api/src/test/java/org/bukkit/support/
paper-api/src/test/java/org/bukkit/support/provider/
paper-api/src/test/java/org/bukkit/support/test/
paper-api/src/test/java/org/bukkit/util/
paper-api/src/test/java/org/bukkit/util/io/
-5
View File
@@ -183,11 +183,6 @@ val generateApiVersioningFile = tasks.register<GenerateApiVersioningFile>("gener
tasks.jar {
from(generateApiVersioningFile.flatMap { it.outputFile })
manifest {
attributes(
"Automatic-Module-Name" to "org.bukkit"
)
}
}
abstract class Services {
@@ -234,7 +234,8 @@ public class MaterialTags {
* Covers all music disc items.
*/
public static final MaterialSetTag MUSIC_DISCS = new MaterialSetTag(keyFor("music_discs"))
.startsWith("MUSIC_DISC_").lock();
.startsWith("MUSIC_DISC_")
.ensureSize("MUSIC_DISCS", 22).lock();
/**
* Covers all ores.
@@ -0,0 +1,59 @@
package com.destroystokyo.paper.block;
import org.bukkit.Sound;
import org.bukkit.block.Block;
/**
* Represents the sounds that a {@link Block} makes in certain situations.
* <p>
* The sound group includes break, step, place, hit, and fall sounds.
*
* @deprecated use {@link org.bukkit.SoundGroup}
*/
@Deprecated(forRemoval = true, since = "1.18.2")
public interface BlockSoundGroup {
/**
* Gets the sound that plays when breaking this block.
*
* @return The break sound
* @deprecated use {@link org.bukkit.SoundGroup#getBreakSound()}
*/
@Deprecated(forRemoval = true, since = "1.18.2")
Sound getBreakSound();
/**
* Gets the sound that plays when stepping on this block.
*
* @return The step sound
* @deprecated use {@link org.bukkit.SoundGroup#getStepSound()}
*/
@Deprecated(forRemoval = true, since = "1.18.2")
Sound getStepSound();
/**
* Gets the sound that plays when placing this block.
*
* @return The place sound
* @deprecated use {@link org.bukkit.SoundGroup#getPlaceSound()}
*/
@Deprecated(forRemoval = true, since = "1.18.2")
Sound getPlaceSound();
/**
* Gets the sound that plays when hitting this block.
*
* @return The hit sound
* @deprecated use {@link org.bukkit.SoundGroup#getHitSound()}
*/
@Deprecated(forRemoval = true, since = "1.18.2")
Sound getHitSound();
/**
* Gets the sound that plays when this block falls.
*
* @return The fall sound
* @deprecated use {@link org.bukkit.SoundGroup#getFallSound()}
*/
@Deprecated(forRemoval = true, since = "1.18.2")
Sound getFallSound();
}
@@ -3,10 +3,10 @@ package com.destroystokyo.paper.block;
import org.bukkit.FluidCollisionMode;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.jetbrains.annotations.NotNull;
/**
* Represents information about a targeted block
* Represents information about a targeted block.
*
* @deprecated use {@link org.bukkit.util.RayTraceResult}
*/
@Deprecated(forRemoval = true, since = "1.19.3")
@@ -14,42 +14,41 @@ public class TargetBlockInfo {
private final Block block;
private final BlockFace blockFace;
public TargetBlockInfo(@NotNull Block block, @NotNull BlockFace blockFace) {
public TargetBlockInfo(final Block block, final BlockFace blockFace) {
this.block = block;
this.blockFace = blockFace;
}
/**
* Get the block that is targeted
* Get the block that is targeted.
*
* @return Targeted block
*/
@NotNull
public Block getBlock() {
return block;
return this.block;
}
/**
* Get the targeted BlockFace
* Get the targeted BlockFace.
*
* @return Targeted blockface
*/
@NotNull
public BlockFace getBlockFace() {
return blockFace;
return this.blockFace;
}
/**
* Get the relative Block to the targeted block on the side it is targeted at
* Get the relative Block to the targeted block on the side it is targeted at.
*
* @return Block relative to targeted block
*/
@NotNull
public Block getRelativeBlock() {
return block.getRelative(blockFace);
return this.block.getRelative(this.blockFace);
}
/**
* Determines whether fluids are considered when targeting a block.
*
* @deprecated use {@link org.bukkit.FluidCollisionMode}
*/
@Deprecated(forRemoval = true, since = "1.19.3")
@@ -60,7 +59,7 @@ public class TargetBlockInfo {
public final FluidCollisionMode bukkit;
FluidMode(FluidCollisionMode bukkit) {
FluidMode(final FluidCollisionMode bukkit) {
this.bukkit = bukkit;
}
}
@@ -0,0 +1,7 @@
/**
* Deprecated block API, replaced by {@link org.bukkit.SoundGroup} and {@link org.bukkit.util.RayTraceResult}.
*/
@NullMarked
package com.destroystokyo.paper.block;
import org.jspecify.annotations.NullMarked;
@@ -2,7 +2,6 @@ package com.destroystokyo.paper.brigadier;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.suggestion.SuggestionProvider;
import java.util.function.Predicate;
/**
@@ -12,5 +11,5 @@ import java.util.function.Predicate;
* @deprecated For removal, see {@link io.papermc.paper.command.brigadier.Commands} on how to use the new Brigadier API.
*/
@Deprecated(forRemoval = true, since = "1.20.6")
public interface BukkitBrigadierCommand <S extends BukkitBrigadierCommandSource> extends Command<S>, Predicate<S>, SuggestionProvider<S> {
public interface BukkitBrigadierCommand<S extends BukkitBrigadierCommandSource> extends Command<S>, Predicate<S>, SuggestionProvider<S> {
}
@@ -4,22 +4,21 @@ import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.Nullable;
import org.jspecify.annotations.Nullable;
/**
* A command source that exposes its Bukkit equivalents.
*
* @deprecated For removal, see {@link io.papermc.paper.command.brigadier.Commands} on how to use the new Brigadier API.
*/
@Deprecated(forRemoval = true)
public interface BukkitBrigadierCommandSource {
@Nullable
Entity getBukkitEntity();
@Nullable Entity getBukkitEntity();
@Nullable
World getBukkitWorld();
@Nullable World getBukkitWorld();
@Nullable
Location getBukkitLocation();
@Nullable Location getBukkitLocation();
CommandSender getBukkitSender();
}
@@ -0,0 +1,7 @@
/**
* Deprecated Brigadier integration, replaced by {@link io.papermc.paper.command.brigadier.Commands}.
*/
@NullMarked
package com.destroystokyo.paper.brigadier;
import org.jspecify.annotations.NullMarked;
@@ -2,37 +2,39 @@ package com.destroystokyo.paper.entity;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Mob;
import org.checkerframework.checker.index.qual.NonNegative;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
/**
* Handles pathfinding operations for an Entity
* Handles pathfinding operations for an Entity.
*/
@NullMarked
public interface Pathfinder {
/**
* Gets the entity that is controlled by this pathfinder.
*
* @return The entity that is controlled by this pathfinder
*/
Mob getEntity();
/**
* Instructs the Entity to stop trying to navigate to its current desired location
* Instructs the Entity to stop trying to navigate to its current desired location.
*/
void stopPathfinding();
/**
* If the entity is currently trying to navigate to a destination, this will return true
* If the entity is currently trying to navigate to a destination, this will return true.
*
* @return true if the entity is navigating to a destination
*/
boolean hasPath();
/**
* Gets the path the entity is currently following.
*
* @return The location the entity is trying to navigate to, or null if there is no destination
*/
@Nullable PathResult getCurrentPath();
@@ -44,7 +46,7 @@ public interface Pathfinder {
* @param loc Location to navigate to
* @return The closest Location the Entity can get to for this navigation, or null if no path could be calculated
*/
default @Nullable PathResult findPath(Location loc) {
default @Nullable PathResult findPath(final Location loc) {
return this.findPath(loc, 0);
}
@@ -52,12 +54,12 @@ public interface Pathfinder {
* Calculates a destination for the Entity to navigate to, but does not set it
* as the current target. Useful for calculating what would happen before setting it.
*
* @param loc Location to navigate to
* @param loc Location to navigate to
* @param reachRange The <a href="https://cp-algorithms.com/geometry/manhattan-distance.html">Manhattan-distance</a> threshold
* from the target position at which the path is considered reached, where {@code 0} requires the exact target position
* @return The closest Location the Entity can get to for this navigation, or null if no path could be calculated
*/
@Nullable PathResult findPath(final Location loc, final @NonNegative int reachRange);
@Nullable PathResult findPath(Location loc, @NonNegative int reachRange);
/**
* Calculates a destination for the Entity to navigate to reach the target entity,
@@ -72,8 +74,7 @@ public interface Pathfinder {
* @param target the Entity to navigate to
* @return The closest Location the Entity can get to for this navigation, or null if no path could be calculated
*/
@Nullable
default PathResult findPath(LivingEntity target) {
default @Nullable PathResult findPath(final LivingEntity target) {
return this.findPath((Entity) target);
}
@@ -90,7 +91,7 @@ public interface Pathfinder {
* @param target the Entity to navigate to
* @return The closest Location the Entity can get to for this navigation, or null if no path could be calculated
*/
default @Nullable PathResult findPath(Entity target) {
default @Nullable PathResult findPath(final Entity target) {
return this.findPath(target, 0);
}
@@ -104,12 +105,12 @@ public interface Pathfinder {
* <p>
* However, this behavior is not guaranteed, and is subject to the games behavior.
*
* @param target the Entity to navigate to
* @param target the Entity to navigate to
* @param reachRange The <a href="https://cp-algorithms.com/geometry/manhattan-distance.html">Manhattan-distance</a> threshold
* from the target position at which the path is considered reached, where {@code 0} requires the exact target position
* @return The closest Location the Entity can get to for this navigation, or null if no path could be calculated
*/
@Nullable PathResult findPath(final Entity target, final @NonNegative int reachRange);
@Nullable PathResult findPath(Entity target, @NonNegative int reachRange);
/**
* Calculates a destination for the Entity to navigate to, and sets it with default speed
@@ -118,7 +119,7 @@ public interface Pathfinder {
* @param loc Location to navigate to
* @return If the pathfinding was successfully started
*/
default boolean moveTo(Location loc) {
default boolean moveTo(final Location loc) {
return this.moveTo(loc, 1);
}
@@ -130,8 +131,8 @@ public interface Pathfinder {
* @param speed Speed multiplier to navigate at, where 1 is 'normal'
* @return If the pathfinding was successfully started
*/
default boolean moveTo(Location loc, double speed) {
PathResult path = this.findPath(loc);
default boolean moveTo(final Location loc, final double speed) {
final PathResult path = this.findPath(loc);
return path != null && this.moveTo(path, speed);
}
@@ -147,7 +148,7 @@ public interface Pathfinder {
* @param target the Entity to navigate to
* @return If the pathfinding was successfully started
*/
default boolean moveTo(LivingEntity target) {
default boolean moveTo(final LivingEntity target) {
return this.moveTo(target, 1);
}
@@ -164,7 +165,7 @@ public interface Pathfinder {
* @param speed Speed multiplier to navigate at, where 1 is 'normal'
* @return If the pathfinding was successfully started
*/
default boolean moveTo(LivingEntity target, double speed) {
default boolean moveTo(final LivingEntity target, final double speed) {
return this.moveTo((Entity) target, speed);
}
@@ -180,7 +181,7 @@ public interface Pathfinder {
* @param target the Entity to navigate to
* @return If the pathfinding was successfully started
*/
default boolean moveTo(Entity target) {
default boolean moveTo(final Entity target) {
return this.moveTo(target, 1);
}
@@ -197,8 +198,8 @@ public interface Pathfinder {
* @param speed Speed multiplier to navigate at, where 1 is 'normal'
* @return If the pathfinding was successfully started
*/
default boolean moveTo(Entity target, double speed) {
PathResult path = this.findPath(target);
default boolean moveTo(final Entity target, final double speed) {
final PathResult path = this.findPath(target);
return path != null && this.moveTo(path, speed);
}
@@ -209,13 +210,13 @@ public interface Pathfinder {
* @param path The Path to start following
* @return If the pathfinding was successfully started
*/
default boolean moveTo(PathResult path) {
default boolean moveTo(final PathResult path) {
return this.moveTo(path, 1);
}
/**
* Takes the result of a previous pathfinding calculation and sets it
* as the active pathfinding,
* as the active pathfinding.
*
* @param path The Path to start following
* @param speed Speed multiplier to navigate at, where 1 is 'normal'
@@ -231,7 +232,7 @@ public interface Pathfinder {
boolean canOpenDoors();
/**
* Allows this pathfinder to pass through closed doors, or not
* Allows this pathfinder to pass through closed doors, or not.
*
* @param canOpenDoors if the mob can pass through closed doors, or not
*/
@@ -245,33 +246,33 @@ public interface Pathfinder {
boolean canPassDoors();
/**
* Allows this pathfinder to pass through open doors, or not
* Allows this pathfinder to pass through open doors, or not.
*
* @param canPassDoors if the mob can pass through open doors, or not
*/
void setCanPassDoors(boolean canPassDoors);
/**
* Checks if this pathfinder assumes that the mob can float
* Checks if this pathfinder assumes that the mob can float.
*
* @return if this pathfinder assumes that the mob can float
*/
boolean canFloat();
/**
* Makes this pathfinder assume that the mob can float, or not
* Makes this pathfinder assume that the mob can float, or not.
*
* @param canFloat if the mob can float, or not
*/
void setCanFloat(boolean canFloat);
/**
* Represents the result of a pathfinding calculation
* Represents the result of a pathfinding calculation.
*/
interface PathResult {
/**
* All currently calculated points to follow along the path to reach the destination location
* All currently calculated points to follow along the path to reach the destination location.
* <p>
* Will return points the entity has already moved past, see {@link #getNextPointIndex()}
*
@@ -280,23 +281,29 @@ public interface Pathfinder {
List<Location> getPoints();
/**
* @return Returns the index of the current point along the points returned in {@link #getPoints()} the entity
* Gets the index of the current point along the points returned in {@link #getPoints()} the entity
* is trying to reach. This value will be higher than the maximum index of {@link #getPoints()} if this path finding is done.
*
* @return the index of the next point
*/
int getNextPointIndex();
/**
* Gets the next location in the path points the entity is trying to reach.
*
* @return The next location in the path points the entity is trying to reach, or null if there is no next point
*/
@Nullable Location getNextPoint();
/**
* Gets the closest point the path can get to the target location.
*
* @return The closest point the path can get to the target location
*/
@Nullable Location getFinalPoint();
/**
* Checks whether the final point can be reached
* Checks whether the final point can be reached.
*
* @return whether the final point can be reached
* @see #getFinalPoint()
@@ -2,10 +2,12 @@ package com.destroystokyo.paper.entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Mob;
import org.jspecify.annotations.NullMarked;
@NullMarked
/**
* A mob that can perform ranged attacks.
*/
public interface RangedEntity extends Mob {
/**
* Attack the specified entity using a ranged attack.
*
@@ -16,7 +18,7 @@ public interface RangedEntity extends Mob {
void rangedAttack(LivingEntity target, float charge);
/**
* Sets that the Entity is "charging" up an attack, by raising its hands
* Sets that the Entity is "charging" up an attack, by raising its hands.
*
* @param raiseHands Whether the entities hands are raised to charge attack
* @deprecated use {@link #setAggressive(boolean)}
@@ -25,7 +27,8 @@ public interface RangedEntity extends Mob {
void setChargingAttack(boolean raiseHands);
/**
* Alias to {@link LivingEntity#isHandRaised()}, if the entity is charging an attack
* Alias to {@link LivingEntity#isHandRaised()}, if the entity is charging an attack.
*
* @return If entities hands are raised
* @deprecated use {@link #isHandRaised()}
*/
@@ -2,10 +2,10 @@ package com.destroystokyo.paper.entity;
import org.bukkit.entity.Entity;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
/**
* Represents information about a targeted entity
* Represents information about a targeted entity.
*
* @deprecated use {@link org.bukkit.util.RayTraceResult}
*/
@Deprecated(forRemoval = true, since = "1.19.3")
@@ -13,28 +13,26 @@ public class TargetEntityInfo {
private final Entity entity;
private final Vector hitVec;
public TargetEntityInfo(@NotNull Entity entity, @NotNull Vector hitVec) {
public TargetEntityInfo(final Entity entity, final Vector hitVec) {
this.entity = entity;
this.hitVec = hitVec;
}
/**
* Get the entity that is targeted
* Get the entity that is targeted.
*
* @return Targeted entity
*/
@NotNull
public Entity getEntity() {
return entity;
return this.entity;
}
/**
* Get the position the entity is targeted at
* Get the position the entity is targeted at.
*
* @return Targeted position
*/
@NotNull
public Vector getHitVector() {
return hitVec;
return this.hitVec;
}
}
@@ -0,0 +1,7 @@
/**
* Entity pathfinding, ranged attack and targeting API.
*/
@NullMarked
package com.destroystokyo.paper.entity;
import org.jspecify.annotations.NullMarked;
@@ -3,20 +3,28 @@ package com.destroystokyo.paper.entity.villager;
import com.google.common.base.Preconditions;
import java.util.EnumMap;
import java.util.Map;
import org.jspecify.annotations.NullMarked;
import java.util.Set;
import org.jetbrains.annotations.Unmodifiable;
/**
* A reputation score for a player on a villager.
*/
@NullMarked
public final class Reputation {
private final Map<ReputationType, Integer> reputation;
/**
* Creates an empty reputation.
*/
public Reputation() {
this(new EnumMap<>(ReputationType.class));
}
/**
* Creates a reputation backed by the given map, so changes to the reputation are made to the map.
*
* @param reputation the reputation values by type
*/
public Reputation(final Map<ReputationType, Integer> reputation) {
Preconditions.checkArgument(reputation != null, "reputation cannot be null");
this.reputation = reputation;
@@ -36,7 +44,7 @@ public final class Reputation {
/**
* Sets the reputation value for a specific {@link ReputationType}.
*
* @param type The {@link ReputationType type} of reputation to set.
* @param type The {@link ReputationType type} of reputation to set.
* @param value The value of the {@link ReputationType type}.
*/
public void setReputation(final ReputationType type, final int value) {
@@ -53,4 +61,13 @@ public final class Reputation {
public boolean hasReputationSet(final ReputationType type) {
return this.reputation.containsKey(type);
}
/**
* Gets a set of all {@link ReputationType types} that have a reputation value set.
*
* @return A set of {@link ReputationType types}.
*/
public @Unmodifiable Set<ReputationType> getReputationsSet() {
return Set.copyOf(this.reputation.keySet());
}
}
@@ -0,0 +1,7 @@
/**
* API for villagers.
*/
@NullMarked
package com.destroystokyo.paper.entity.villager;
import org.jspecify.annotations.NullMarked;
@@ -7,7 +7,6 @@ import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Fired any time a Brigadier RootCommandNode is generated for a player to inform the client of commands.
@@ -28,9 +27,10 @@ import org.jspecify.annotations.NullMarked;
* <p>If your logic is not safe to run asynchronously, only react to the synchronous version.</p>
*
* <p>This is a draft/experimental API and is subject to change.</p>
*
* @param <S> the type of the command source
*/
@ApiStatus.Experimental
@NullMarked
public class AsyncPlayerSendCommandsEvent<S extends CommandSourceStack> extends PlayerEvent {
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -7,7 +7,6 @@ import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Called when sending {@link Suggestions} to the client. Will be called asynchronously if a plugin
@@ -16,7 +15,6 @@ import org.jspecify.annotations.NullMarked;
* <p>
* If the suggestions are empty after this event has been called, nothing will be sent to the client.
*/
@NullMarked
public class AsyncPlayerSendSuggestionsEvent extends PlayerEvent implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -1,6 +1,7 @@
package com.destroystokyo.paper.event.brigadier;
import com.destroystokyo.paper.brigadier.BukkitBrigadierCommand;
import com.destroystokyo.paper.brigadier.BukkitBrigadierCommandSource;
import com.mojang.brigadier.tree.ArgumentCommandNode;
import com.mojang.brigadier.tree.LiteralCommandNode;
import com.mojang.brigadier.tree.RootCommandNode;
@@ -9,7 +10,7 @@ import org.bukkit.command.Command;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.server.ServerEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.ApiStatus;
/**
* Fired anytime the server synchronizes Bukkit commands to Brigadier.
@@ -18,18 +19,19 @@ import org.jetbrains.annotations.NotNull;
* This is done at Plugin Enable time after commands have been registered, but may also
* run at a later point in the server lifetime due to plugins, a server reload, etc.</p>
*
* @param <S> the type of the command source
* @deprecated this event has been superseded by the Commands API and will be removed in a future release.
* Listen to {@link io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents#COMMANDS} instead
* Listen to {@link io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents#COMMANDS} instead
*/
@Deprecated(since = "1.20.6")
@Warning(value = true, propagate = false)
public class CommandRegisteredEvent<S extends com.destroystokyo.paper.brigadier.BukkitBrigadierCommandSource> extends ServerEvent implements Cancellable {
public class CommandRegisteredEvent<S extends BukkitBrigadierCommandSource> extends ServerEvent implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final String commandLabel;
private final Command command;
private final com.destroystokyo.paper.brigadier.BukkitBrigadierCommand<S> brigadierCommand;
private final BukkitBrigadierCommand<S> brigadierCommand;
private final RootCommandNode<S> root;
private final ArgumentCommandNode<S, String> defaultArgs;
private LiteralCommandNode<S> literal;
@@ -37,7 +39,15 @@ public class CommandRegisteredEvent<S extends com.destroystokyo.paper.brigadier.
private boolean cancelled;
public CommandRegisteredEvent(String commandLabel, com.destroystokyo.paper.brigadier.BukkitBrigadierCommand<S> brigadierCommand, Command command, RootCommandNode<S> root, LiteralCommandNode<S> literal, ArgumentCommandNode<S, String> defaultArgs) {
@ApiStatus.Internal
public CommandRegisteredEvent(
final String commandLabel,
final BukkitBrigadierCommand<S> brigadierCommand,
final Command command,
final RootCommandNode<S> root,
final LiteralCommandNode<S> literal,
final ArgumentCommandNode<S, String> defaultArgs
) {
this.commandLabel = commandLabel;
this.brigadierCommand = brigadierCommand;
this.command = command;
@@ -110,15 +120,15 @@ public class CommandRegisteredEvent<S extends com.destroystokyo.paper.brigadier.
*
* @param literal new node
*/
public void setLiteral(LiteralCommandNode<S> literal) {
public void setLiteral(final LiteralCommandNode<S> literal) {
this.literal = literal;
}
/**
* Gets whether this command should is treated as "raw".
*
* @see #setRawCommand(boolean)
* @return whether this command is treated as "raw"
* @see #setRawCommand(boolean)
*/
public boolean isRawCommand() {
return this.rawCommand;
@@ -152,16 +162,15 @@ public class CommandRegisteredEvent<S extends com.destroystokyo.paper.brigadier.
* {@inheritDoc}
*/
@Override
public void setCancelled(boolean cancel) {
public void setCancelled(final boolean cancel) {
this.cancelled = cancel;
}
@NotNull
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
@NotNull
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
@@ -0,0 +1,7 @@
/**
* Events relating to the Brigadier command tree, such as the commands and suggestions sent to clients.
*/
@NullMarked
package com.destroystokyo.paper.event.brigadier;
import org.jspecify.annotations.NullMarked;
@@ -5,11 +5,10 @@ import org.bukkit.inventory.GrindstoneInventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jspecify.annotations.Nullable;
/**
* Called when an item is put in a slot for grinding in a Grindstone
* Called when an item is put in a slot for grinding in a Grindstone.
*
* @deprecated use {@link org.bukkit.event.inventory.PrepareGrindstoneEvent}
*/
@@ -18,11 +17,10 @@ import org.jetbrains.annotations.Nullable;
public class PrepareGrindstoneEvent extends PrepareResultEvent {
@ApiStatus.Internal
public PrepareGrindstoneEvent(@NotNull InventoryView inventory, @Nullable ItemStack result) {
public PrepareGrindstoneEvent(final InventoryView inventory, final @Nullable ItemStack result) {
super(inventory, result);
}
@NotNull
@Override
public GrindstoneInventory getInventory() {
return (GrindstoneInventory) super.getInventory();
@@ -4,13 +4,11 @@ import org.bukkit.event.inventory.PrepareInventoryResultEvent;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
/**
* Called when an item is put in an inventory containing a result slot
* Called when an item is put in an inventory containing a result slot.
*/
@NullMarked
public class PrepareResultEvent extends PrepareInventoryResultEvent {
// HandlerList on PrepareInventoryResultEvent to ensure api compat
@@ -0,0 +1,7 @@
/**
* Inventory events.
*/
@NullMarked
package com.destroystokyo.paper.event.inventory;
import org.jspecify.annotations.NullMarked;
@@ -2,75 +2,78 @@ package com.destroystokyo.paper.inventory.meta;
import org.bukkit.inventory.meta.ItemMeta;
/**
* Represents the meta of an armor stand item, which controls the armor stand that is spawned from it.
*/
public interface ArmorStandMeta extends ItemMeta {
/**
* Gets whether the ArmorStand should be invisible when spawned
* Gets whether the ArmorStand should be invisible when spawned.
*
* @return true if this should be invisible
*/
boolean isInvisible();
/**
* Gets whether this ArmorStand should have no base plate when spawned
* Gets whether this ArmorStand should have no base plate when spawned.
*
* @return true if it will not have a base plate
*/
boolean hasNoBasePlate();
/**
* Gets whether this ArmorStand should show arms when spawned
* Gets whether this ArmorStand should show arms when spawned.
*
* @return true if it will show arms
*/
boolean shouldShowArms();
/**
* Gets whether this ArmorStand will be small when spawned
* Gets whether this ArmorStand will be small when spawned.
*
* @return true if it will be small
*/
boolean isSmall();
/**
* Gets whether this ArmorStand will be a marker when spawned
* The exact details of this flag are an implementation detail
* Gets whether this ArmorStand will be a marker when spawned.
* The exact details of this flag are an implementation detail.
*
* @return true if it will be a marker
*/
boolean isMarker();
/**
* Sets that this ArmorStand should be invisible when spawned
* Sets that this ArmorStand should be invisible when spawned.
*
* @param invisible true if set invisible
*/
void setInvisible(boolean invisible);
/**
* Sets that this ArmorStand should have no base plate when spawned
* Sets that this ArmorStand should have no base plate when spawned.
*
* @param noBasePlate true if no base plate
*/
void setNoBasePlate(boolean noBasePlate);
/**
* Sets that this ArmorStand should show arms when spawned
* Sets that this ArmorStand should show arms when spawned.
*
* @param showArms true if show arms
*/
void setShowArms(boolean showArms);
/**
* Sets that this ArmorStand should be small when spawned
* Sets that this ArmorStand should be small when spawned.
*
* @param small true if small
*/
void setSmall(boolean small);
/**
* Sets that this ArmorStand should be a marker when spawned
* The exact details of this flag are an implementation detail
* Sets that this ArmorStand should be a marker when spawned.
* The exact details of this flag are an implementation detail.
*
* @param marker true if a marker
*/
@@ -0,0 +1,7 @@
/**
* Item meta types.
*/
@NullMarked
package com.destroystokyo.paper.inventory.meta;
import org.jspecify.annotations.NullMarked;
@@ -2,13 +2,11 @@ package com.destroystokyo.paper.network;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
/**
* Represents a client connected to the server.
*/
@NullMarked
public interface NetworkClient {
/**
@@ -23,7 +21,7 @@ public interface NetworkClient {
* client's socket address.
*
* @return The client's {@link InetSocketAddress}, or the loopback address
* if this is a Unix domain socket connection
* if this is a Unix domain socket connection
*/
InetSocketAddress getAddress();
@@ -0,0 +1,7 @@
/**
* API for clients connecting to the server.
*/
@NullMarked
package com.destroystokyo.paper.network;
import org.jspecify.annotations.NullMarked;
@@ -8,7 +8,6 @@ import net.kyori.adventure.text.object.ObjectContents;
import net.kyori.adventure.text.object.ObjectContentsLike;
import net.kyori.adventure.text.object.PlayerHeadObjectContents;
import org.bukkit.profile.PlayerTextures;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
import static net.kyori.adventure.text.object.PlayerHeadObjectContents.property;
@@ -16,40 +15,42 @@ import static net.kyori.adventure.text.object.PlayerHeadObjectContents.property;
/**
* Represents a players profile for the game, such as UUID, Name, and textures.
*/
@NullMarked
public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerHeadObjectContents.SkinSource, ObjectContentsLike {
/**
* Gets the name of this profile.
*
* @return The players name, if set
*/
@Override
@Nullable
String getName();
@Nullable String getName();
/**
* Sets this profiles Name
* Sets this profiles Name.
*
* @param name The new Name
* @return The previous Name
* @deprecated create a new profile with {@link org.bukkit.Server#createProfile(UUID, String)} instead
*/
@Deprecated(forRemoval = true, since = "1.18.1")
String setName(@Nullable String name);
@Nullable String setName(@Nullable String name);
/**
* Gets the unique identifier of this profile.
*
* @return The players unique identifier, if set
*/
@Nullable
UUID getId();
@Nullable UUID getId();
/**
* Sets this profiles UUID
* Sets this profiles UUID.
*
* @param uuid The new UUID
* @return The previous UUID
* @deprecated create a new profile with {@link org.bukkit.Server#createProfile(UUID, String)} instead
*/
@Deprecated(forRemoval = true, since = "1.18.1")
@Nullable
UUID setId(@Nullable UUID uuid);
@Nullable UUID setId(@Nullable UUID uuid);
/**
* Gets the {@link PlayerTextures} of this profile.
@@ -65,19 +66,21 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
* Copies the given textures.
*
* @param textures the textures to copy, or {@code null} to clear the
* textures
* textures
*/
@Override
void setTextures(@Nullable PlayerTextures textures);
/**
* Gets the properties of this profile.
*
* @return A Mutable set of this player's properties, such as textures.
* Values specified here are subject to implementation details.
* Values specified here are subject to implementation details.
*/
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
* @return If the property is set
@@ -85,7 +88,7 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
boolean hasProperty(@Nullable String property);
/**
* Sets a property. If the property already exists, the previous one will be replaced
* Sets a property. If the property already exists, the previous one will be replaced.
*
* @param property Property to set.
* @throws IllegalArgumentException if setting the property results in more than 16 properties
@@ -93,7 +96,7 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
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
* @throws IllegalArgumentException if the number of properties exceeds 16
@@ -101,7 +104,7 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
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
* @return If a property was removed
@@ -109,7 +112,7 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
boolean removeProperty(@Nullable String property);
/**
* Removes a specific property from this profile
* Removes a specific property from this profile.
*
* @param property The property to remove
* @return If a property was removed
@@ -119,7 +122,7 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
}
/**
* Removes all properties in the collection
* Removes all properties in the collection.
*
* @param properties The properties to remove
* @return If any property was removed
@@ -135,11 +138,13 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
}
/**
* Clears all properties on this profile
* Clears all properties on this profile.
*/
void clearProperties();
/**
* Checks whether this profile has both a unique identifier and a name.
*
* @return If the profile is now complete (has UUID and Name)
*/
@Override
@@ -203,7 +208,7 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
* <p>
* 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
* @return If the profile is now complete (has UUID and Name) (if you get rate limited, this operation may fail)
*/
@@ -216,7 +221,7 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
* properties (name, unique id, textures, etc.), and updates existing
* properties (e.g. name, textures, etc.) to their official and up-to-date
* values. This operation does not alter the current profile, but produces a
* new updated {@link PlayerProfile}.
* new updated {@code PlayerProfile}.
* <p>
* If no player exists for the unique id or name of this profile, this
* operation yields a profile that is equal to the current profile, which
@@ -241,7 +246,7 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
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
*/
@@ -262,6 +267,7 @@ public interface PlayerProfile extends org.bukkit.profile.PlayerProfile, PlayerH
return ObjectContents.playerHead(this);
}
@SuppressWarnings("UnstableApiUsage")
@Override
default void applySkinToPlayerHeadContents(final PlayerHeadObjectContents.Builder builder) {
if (this.getProperties().isEmpty()) {
@@ -2,23 +2,34 @@ package com.destroystokyo.paper.profile;
import com.google.common.base.Preconditions;
import java.util.Objects;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
/**
* Represents a property on a {@link PlayerProfile}
* Represents a property on a {@link PlayerProfile}.
*/
@NullMarked
public final class ProfileProperty {
private final String name;
private final String value;
private final @Nullable String signature;
/**
* Creates an unsigned property.
*
* @param name the property name
* @param value the property value
*/
public ProfileProperty(final String name, final String value) {
this(name, value, null);
}
/**
* Creates a property.
*
* @param name the property name, at most 64 characters
* @param value the property value, at most 32767 characters
* @param signature the signature, at most 1024 characters, or {@code null} if unsigned
*/
public ProfileProperty(final String name, final String value, final @Nullable String signature) {
this.name = Preconditions.checkNotNull(name, "ProfileProperty name can not be null");
this.value = Preconditions.checkNotNull(value, "ProfileProperty value can not be null");
@@ -29,6 +40,8 @@ public final class ProfileProperty {
}
/**
* Gets the name of this property.
*
* @return The property name, ie "textures"
*/
public String getName() {
@@ -36,6 +49,8 @@ public final class ProfileProperty {
}
/**
* Gets the value of this property.
*
* @return The property value, likely to be base64 encoded
*/
public String getValue() {
@@ -43,13 +58,17 @@ public final class ProfileProperty {
}
/**
* @return A signature from Mojang for signed properties
* Gets the signature of this property.
*
* @return A signature for signed properties
*/
public @Nullable String getSignature() {
return this.signature;
}
/**
* Checks whether this property is signed.
*
* @return If this property has a signature or not
*/
public boolean isSigned() {
@@ -0,0 +1,7 @@
/**
* API for player profiles and their properties.
*/
@NullMarked
package com.destroystokyo.paper.profile;
import org.jspecify.annotations.NullMarked;
@@ -1,15 +1,18 @@
package com.destroystokyo.paper.util;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Rethrows checked exceptions without declaring them.
*
* @hidden
*/
@ApiStatus.Internal
@NullMarked
public final class SneakyThrow {
private SneakyThrow() {
}
public static void sneaky(final Throwable exception) {
SneakyThrow.throwSneaky(exception);
}
@@ -4,13 +4,14 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
@NullMarked
/**
* Provides the message shown by the {@code /version} command about whether the server is up to date.
*/
public interface VersionFetcher {
/**
* Amount of time to cache results for in milliseconds
* Amount of time to cache results for in milliseconds.
* <p>
* Negative values will never cache.
*
@@ -36,11 +37,13 @@ public interface VersionFetcher {
* @deprecated {@code serverVersion} is not required
*/
@Deprecated
default Component getVersionMessage(String serverVersion) {
return getVersionMessage();
default Component getVersionMessage(final String serverVersion) {
return this.getVersionMessage();
}
/**
* A version fetcher used when the server does not provide one.
*
* @hidden
*/
@ApiStatus.Internal
@@ -0,0 +1,7 @@
/**
* Miscellaneous Paper utilities.
*/
@NullMarked
package com.destroystokyo.paper.util;
import org.jspecify.annotations.NullMarked;
@@ -5,19 +5,25 @@ import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import org.bukkit.plugin.PluginDescriptionFile;
import org.jspecify.annotations.NullMarked;
/**
* Prevents plugins (e.g. Essentials) from changing the parent of the plugin logger.
*/
@NullMarked
public class PaperPluginLogger extends Logger {
public final class PaperPluginLogger extends Logger {
@Deprecated(forRemoval = true)
public static Logger getLogger(final PluginDescriptionFile description) {
return getLogger((PluginMeta) description);
}
/**
* Creates a logger for the given plugin and registers it with the {@link LogManager}.
* <p>
* If a logger with the same name is already registered, that logger is returned instead.
*
* @param meta the meta of the plugin to create the logger for
* @return the logger for the plugin
*/
public static Logger getLogger(final PluginMeta meta) {
Logger logger = new PaperPluginLogger(meta);
if (!LogManager.getLogManager().addLogger(logger)) {
@@ -0,0 +1,7 @@
/**
* Miscellaneous Paper utilities.
*/
@NullMarked
package com.destroystokyo.paper.utils;
import org.jspecify.annotations.NullMarked;
@@ -10,6 +10,7 @@ import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager;
import io.papermc.paper.world.damagesource.CombatEntry;
import io.papermc.paper.world.damagesource.FallLocationType;
import java.io.IOException;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.function.BooleanSupplier;
import java.util.function.Function;
@@ -56,10 +57,11 @@ public interface InternalAPIBridge {
* @return the instance.
*/
static InternalAPIBridge get() {
//<editor-fold defaultstate="collapsed" desc="Holder">
class Holder {
public static final InternalAPIBridge INSTANCE = Services.service(InternalAPIBridge.class).orElseThrow();
public static final InternalAPIBridge INSTANCE = Services.service(ServiceLoader.load(InternalAPIBridge.class), InternalAPIBridge.class).orElseThrow();
}
//</editor-fold>
return Holder.INSTANCE;
}
@@ -3,6 +3,7 @@ package io.papermc.paper;
import java.time.Instant;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.ServiceLoader;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.util.Services;
import org.jetbrains.annotations.ApiStatus;
@@ -25,7 +26,7 @@ public interface ServerBuildInfo {
static ServerBuildInfo buildInfo() {
//<editor-fold defaultstate="collapsed" desc="Holder">
final class Holder {
static final Optional<ServerBuildInfo> INSTANCE = Services.service(ServerBuildInfo.class);
static final Optional<ServerBuildInfo> INSTANCE = Services.service(ServiceLoader.load(ServerBuildInfo.class), ServerBuildInfo.class);
}
//</editor-fold>
@@ -7,7 +7,6 @@ import net.kyori.adventure.translation.Translatable;
import net.kyori.adventure.util.Index;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
/**
@@ -16,7 +15,6 @@ import org.jspecify.annotations.Nullable;
* The display is used in the chat, in the toast messages and the advancements
* screen.
*/
@NullMarked
public interface AdvancementDisplay {
/**
@@ -65,7 +63,7 @@ public interface AdvancementDisplay {
*
* @return {@code true} if a message should be sent
* @see org.bukkit.event.player.PlayerAdvancementDoneEvent#message() to edit
* the message
* the message
*/
boolean doesAnnounceToChat();
@@ -0,0 +1,7 @@
/**
* API for advancements.
*/
@NullMarked
package io.papermc.paper.advancement;
import org.jspecify.annotations.NullMarked;
@@ -0,0 +1,7 @@
/**
* Annotations that describe the API.
*/
@NullMarked
package io.papermc.paper.annotation;
import org.jspecify.annotations.NullMarked;
@@ -3,26 +3,26 @@ package io.papermc.paper.ban;
import org.bukkit.BanList;
import org.bukkit.ban.IpBanList;
import org.bukkit.ban.ProfileBanList;
import org.jspecify.annotations.NullMarked;
/**
* Represents a ban-type that a {@link BanList} may track.
* It enforces the correct return value at compile time.
*
* @param <T> the type of ban list
*/
@NullMarked
public interface BanListType<T> {
/**
* Banned IP addresses
* Banned IP addresses.
*/
BanListType<IpBanList> IP = new BanListTypeImpl<>(IpBanList.class);
/**
* Banned player profiles
* Banned player profiles.
*/
BanListType<ProfileBanList> PROFILE = new BanListTypeImpl<>(ProfileBanList.class);
/**
* Returns the type class of the ban list used generically
* Returns the type class of the ban list used generically.
*
* @return the type class
*/
@@ -1,9 +1,7 @@
package io.papermc.paper.ban;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
@ApiStatus.Internal
@NullMarked
record BanListTypeImpl<T>(Class<T> typeClass) implements BanListType<T> {
}
@@ -0,0 +1,7 @@
/**
* Ban list API.
*/
@NullMarked
package io.papermc.paper.ban;
import org.jspecify.annotations.NullMarked;
@@ -4,13 +4,11 @@ import org.bukkit.Fluid;
import org.bukkit.Location;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Range;
import org.jspecify.annotations.NullMarked;
/**
* A representation of a fluid in a specific state of data.
* This type is not linked to a specific location and hence mostly resembles a {@link org.bukkit.block.data.BlockData}.
*/
@NullMarked
public interface FluidData extends Cloneable {
/**
@@ -44,8 +42,7 @@ public interface FluidData extends Cloneable {
*
* @return the amount as an integer, between 0 and 8
*/
@Range(from = 0, to = 8)
int getLevel();
@Range(from = 0, to = 8) int getLevel();
/**
* Computes the height of the fluid in the world.
@@ -57,11 +54,10 @@ public interface FluidData extends Cloneable {
* @param location the location at which to check the high of this fluid data.
* @return the height as a float value
*/
@Range(from = 0, to = 1)
float computeHeight(Location location);
@Range(from = 0, to = 1) float computeHeight(Location location);
/**
* Returns whether this fluid is a source block
* Returns whether this fluid is a source block.
*
* @return true if the fluid is a source block, false otherwise
*/
@@ -0,0 +1,7 @@
/**
* API for fluids and their data.
*/
@NullMarked
package io.papermc.paper.block.fluid;
import org.jspecify.annotations.NullMarked;
@@ -0,0 +1,7 @@
/**
* Specific types of {@link io.papermc.paper.block.fluid.FluidData}.
*/
@NullMarked
package io.papermc.paper.block.fluid.type;
import org.jspecify.annotations.NullMarked;
@@ -5,14 +5,13 @@ import io.papermc.paper.command.brigadier.MessageComponentSerializer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.TextComponent;
import org.checkerframework.checker.nullness.qual.NonNull;
/**
* Helper methods to bridge the gaps between Brigadier and Paper-MojangAPI.
*
* @deprecated for removal. See {@link MessageComponentSerializer} for a direct replacement of functionality found in
* this class.
* As a general entrypoint to brigadier on paper, see {@link io.papermc.paper.command.brigadier.Commands}.
* this class.
* As a general entrypoint to brigadier on paper, see {@link io.papermc.paper.command.brigadier.Commands}.
*/
@Deprecated(forRemoval = true, since = "1.20.6")
public final class PaperBrigadier {
@@ -28,7 +27,7 @@ public final class PaperBrigadier {
* @param componentLike The {@link ComponentLike} to use for the {@link Message} contents
* @return A new Brigadier {@link Message}
*/
public static @NonNull Message message(final @NonNull ComponentLike componentLike) {
public static Message message(final ComponentLike componentLike) {
return MessageComponentSerializer.message().serialize(componentLike.asComponent());
}
@@ -42,7 +41,7 @@ public final class PaperBrigadier {
* @param message The {@link Message} to create a {@link Component} from
* @return The created {@link Component}
*/
public static @NonNull Component componentFromMessage(final @NonNull Message message) {
public static Component componentFromMessage(final Message message) {
return MessageComponentSerializer.message().deserialize(message);
}
}
@@ -0,0 +1,7 @@
/**
* Deprecated helpers for bridging Brigadier and Paper.
*/
@NullMarked
package io.papermc.paper.brigadier;
import org.jspecify.annotations.NullMarked;
@@ -4,22 +4,20 @@ import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* A chat renderer is responsible for rendering chat messages sent by {@link Player}s to the server.
*/
@NullMarked
@FunctionalInterface
public interface ChatRenderer {
/**
* Renders a chat message. This will be called once for each receiving {@link Audience}.
*
* @param source the message source
* @param source the message source
* @param sourceDisplayName the display name of the source player
* @param message the chat message
* @param viewer the receiving {@link Audience}
* @param message the chat message
* @param viewer the receiving {@link Audience}
* @return a rendered chat message
*/
@ApiStatus.OverrideOnly
@@ -59,9 +57,9 @@ public interface ChatRenderer {
/**
* Renders a chat message.
*
* @param source the message source
* @param source the message source
* @param sourceDisplayName the display name of the source player
* @param message the chat message
* @param message the chat message
* @return a rendered chat message
*/
@ApiStatus.OverrideOnly
@@ -4,10 +4,8 @@ import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
@ApiStatus.Internal
@NullMarked
sealed class ViewerUnawareImpl implements ChatRenderer, ChatRenderer.ViewerUnaware permits ViewerUnawareImpl.Default {
private final ViewerUnaware unaware;
@@ -26,7 +24,7 @@ sealed class ViewerUnawareImpl implements ChatRenderer, ChatRenderer.ViewerUnawa
}
static final class Default extends ViewerUnawareImpl implements ChatRenderer.Default {
static final ViewerUnawareImpl.Default INSTANCE = new ViewerUnawareImpl.Default((source, sourceDisplayName, message) -> Component.translatable("chat.type.text", sourceDisplayName, message));
static final ViewerUnawareImpl.Default INSTANCE = new ViewerUnawareImpl.Default((_, sourceDisplayName, message) -> Component.translatable("chat.type.text", sourceDisplayName, message));
Default(final ViewerUnaware unaware) {
super(unaware);
@@ -0,0 +1,7 @@
/**
* API for rendering chat messages.
*/
@NullMarked
package io.papermc.paper.chat;
import org.jspecify.annotations.NullMarked;
@@ -1,10 +1,14 @@
package io.papermc.paper.command;
import net.kyori.adventure.text.Component;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
@NullMarked
/**
* Represents something that holds and runs a command like a command block.
*
* @see org.bukkit.block.CommandBlock
* @see org.bukkit.entity.minecart.CommandMinecart
*/
public interface CommandBlockHolder {
/**
@@ -41,17 +45,17 @@ public interface CommandBlockHolder {
/**
* Gets the success count from this command block.
* @see <a href="https://minecraft.wiki/wiki/Command_Block#Success_count">Command_Block#Success_count</a>
*
* @return the success count
* @see <a href="https://minecraft.wiki/wiki/Command_Block#Success_count">Command_Block#Success_count</a>
*/
int getSuccessCount();
/**
* Sets the success count from this command block.
* @see <a href="https://minecraft.wiki/wiki/Command_Block#Success_count">Command_Block#Success_count</a>
*
* @param successCount the success count
* @see <a href="https://minecraft.wiki/wiki/Command_Block#Success_count">Command_Block#Success_count</a>
*/
void setSuccessCount(int successCount);
}
@@ -1,8 +1,14 @@
package io.papermc.paper.command.brigadier;
import com.google.common.base.Preconditions;
import com.mojang.brigadier.RedirectModifier;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.tree.CommandNode;
import net.kyori.adventure.pointer.Pointered;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.GameRules;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
@@ -81,4 +87,123 @@ public interface CommandSourceStack {
* @see com.mojang.brigadier.builder.ArgumentBuilder#fork(CommandNode, RedirectModifier)
*/
CommandSourceStack withExecutor(Entity executor);
/**
* Sends a system message to the {@link #getExecutor()} if it is a {@link Player},
* otherwise sends a system message to the {@link #getSender()}.
*
* @param message the message to send
* @throws IllegalArgumentException if the message is null
*/
void sendReply(ComponentLike message);
/**
* Sends a system message with the MiniMessage format to the {@link #getExecutor()}
* if it is a {@link Player}, otherwise sends it to the {@link #getSender()}.
*
* <p>See <a href="https://docs.papermc.io/adventure/minimessage/">MiniMessage docs</a> and
* <a href="https://docs.papermc.io/adventure/minimessage/dynamic-replacements/">MiniMessage Placeholders docs</a>
* for more information on the format.</p>
*
* <p>This method provides the target of the system message as a {@link net.kyori.adventure.pointer.Pointered}
* to the MiniMessage {@link MiniMessage#deserialize(String, Pointered, TagResolver...)} method.</p>
*
* @param message the MiniMessage message to send
* @param resolvers resolvers to use
* @throws IllegalArgumentException if the message is null
*/
default void sendRichReply(final String message, final TagResolver... resolvers) {
Preconditions.checkArgument(message != null, "message cannot be null.");
this.sendReply(MiniMessage.miniMessage().deserialize(
message,
this.getExecutor() instanceof final Player player ? player : this.getSender(),
resolvers
));
}
/**
* Sends a system message to the {@link #getSender()}, admins, and console indicating successful command execution
* according to vanilla semantics.
*
* <p>This currently includes checking for environments with suppressed output,
* {@link GameRules#SEND_COMMAND_FEEDBACK}, and {@link GameRules#LOG_ADMIN_COMMANDS}.</p>
*
* @param message the message to send
* @param allowInformingAdmins whether admins and console may be informed of this success
* @throws IllegalArgumentException if the message is null
*/
void sendSuccess(ComponentLike message, boolean allowInformingAdmins);
/**
* Sends a system message to the {@link #getSender()}, admins, and console indicating successful command execution
* according to vanilla semantics. This method informs admins and the console of this success.
*
* <p>This currently includes checking for environments with suppressed output,
* {@link GameRules#SEND_COMMAND_FEEDBACK}, and {@link GameRules#LOG_ADMIN_COMMANDS}.</p>
*
* @param message the message to send
* @see #sendSuccess(ComponentLike, boolean) to disable if admins and console should be informed
* @throws IllegalArgumentException if the message is null
*/
default void sendSuccess(final ComponentLike message) {
this.sendSuccess(message, true);
}
/**
* Sends a system message with the MiniMessage format to the {@link #getSender()}, admins, and console indicating
* successful command execution according to vanilla semantics. This method informs admins and the console of
* this success.
*
* <p>This currently includes checking for environments with suppressed output,
* {@link GameRules#SEND_COMMAND_FEEDBACK}, and {@link GameRules#LOG_ADMIN_COMMANDS}.</p>
*
* <p>See <a href="https://docs.papermc.io/adventure/minimessage/">MiniMessage docs</a> and
* <a href="https://docs.papermc.io/adventure/minimessage/dynamic-replacements/">MiniMessage Placeholders docs</a>
* for more information on the format.</p>
*
* <p>This method provides the {@link CommandSender} of this command as a {@link net.kyori.adventure.pointer.Pointered}
* to the MiniMessage {@link MiniMessage#deserialize(String, Pointered, TagResolver...)} method.</p>
*
* @param message the MiniMessage message to send
* @param resolvers resolvers to use
* @see #sendSuccess(ComponentLike, boolean) to disable if admins and console should be informed
* @throws IllegalArgumentException if the message is null
*/
default void sendRichSuccess(final String message, final TagResolver... resolvers) {
Preconditions.checkArgument(message != null, "message cannot be null.");
this.sendSuccess(MiniMessage.miniMessage().deserialize(message, this.getSender(), resolvers), true);
}
/**
* Sends a system message indicating a failed command execution to the {@link #getSender()}.
* Does not apply red styling to the message as vanilla does to allow for custom failure message styling.
*
* <p>Respects vanilla semantics for accepting failure output and suppressed output environments.</p>
*
* @param message the message to send
* @throws IllegalArgumentException if the message is null
*/
void sendFailure(ComponentLike message);
/**
* Sends a system message with the MiniMessage format indicating a failed command execution to the{@link #getSender()}.
* Does not apply red styling to the message as vanilla does to allow for custom failure message styling.
*
* <p>Respects vanilla semantics for accepting failure output and suppressed output environments.</p>
*
* <p>See <a href="https://docs.papermc.io/adventure/minimessage/">MiniMessage docs</a> and
* <a href="https://docs.papermc.io/adventure/minimessage/dynamic-replacements/">MiniMessage Placeholders docs</a>
* for more information on the format.</p>
*
* <p>This method provides the {@link CommandSender} of this command as a {@link net.kyori.adventure.pointer.Pointered}
* to the MiniMessage {@link MiniMessage#deserialize(String, Pointered, TagResolver...)} method.</p>
*
* @param message the MiniMessage message to send
* @param resolvers resolvers to use
* @throws IllegalArgumentException if the message is null
*/
default void sendRichFailure(final String message, final TagResolver... resolvers) {
Preconditions.checkArgument(message != null, "message cannot be null.");
this.sendFailure(MiniMessage.miniMessage().deserialize(message, this.getSender(), resolvers));
}
}
@@ -3,13 +3,11 @@ package io.papermc.paper.command.brigadier.argument.position;
import io.papermc.paper.math.BlockPosition;
import io.papermc.paper.math.Position;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* A block position, which does not have a y value.
*/
@ApiStatus.Experimental
@NullMarked
public interface ColumnBlockPosition {
/**
@@ -3,13 +3,11 @@ package io.papermc.paper.command.brigadier.argument.position;
import io.papermc.paper.math.FinePosition;
import io.papermc.paper.math.Position;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* A fine position, which does not hold a y value.
*/
@ApiStatus.Experimental
@NullMarked
public interface ColumnFinePosition {
/**
@@ -0,0 +1,7 @@
/**
* Positions resolved from Brigadier arguments.
*/
@NullMarked
package io.papermc.paper.command.brigadier.argument.position;
import org.jspecify.annotations.NullMarked;
@@ -54,8 +54,7 @@ public interface BlockInWorldPredicate {
/**
* The block passed to the predicate was in an unloaded chunk and the {@code loadChunk} flag was false.
*/
UNLOADED_CHUNK,
;
UNLOADED_CHUNK;
/**
* Converts the result into an approximated boolean representation.
@@ -0,0 +1,7 @@
/**
* Command-related APIs.
*/
@NullMarked
package io.papermc.paper.command;
import org.jspecify.annotations.NullMarked;
@@ -0,0 +1,7 @@
/**
* API for reading selected server configuration settings.
*/
@NullMarked
package io.papermc.paper.configuration;
import org.jspecify.annotations.NullMarked;
@@ -10,7 +10,6 @@ import org.checkerframework.checker.index.qual.NonNegative;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.Unmodifiable;
import org.jspecify.annotations.Nullable;
/**
* Holds the properties for this item for when it is consumed.
@@ -31,7 +30,7 @@ public interface Consumable extends BuildableDataComponent<Consumable, Consumabl
ItemUseAnimation animation();
@Contract(pure = true)
@Nullable Key sound();
Key sound();
@Contract(pure = true)
boolean hasConsumeParticles();
@@ -66,11 +65,11 @@ public interface Consumable extends BuildableDataComponent<Consumable, Consumabl
/**
* Sets the sound played when consuming the item.
*
* @param sound the {@link Key} representing the sound to be used, or {@code null} for no sound
* @param sound the {@link Key} representing the sound to be used
* @return the builder for chaining
*/
@Contract(value = "_ -> this", mutates = "this")
Builder sound(@Nullable Key sound);
Builder sound(Key sound);
/**
* Sets whether consuming the item results in particle effects.
@@ -39,10 +39,10 @@ public interface Equippable extends BuildableDataComponent<Equippable, Equippabl
/**
* Gets the equip sound key.
*
* @return the equip sound key, or {@code null} if none
* @return the equip sound key
*/
@Contract(pure = true)
@Nullable Key equipSound();
Key equipSound();
/**
* Gets the asset id if present.
@@ -112,10 +112,10 @@ public interface Equippable extends BuildableDataComponent<Equippable, Equippabl
/**
* Returns the sound that is played when shearing this equipment off an entity.
*
* @return shear sound, or {@code null} if none
* @return shear sound
*/
@Contract(pure = true)
@Nullable Key shearSound();
Key shearSound();
/**
* Builder for {@link Equippable}.
@@ -126,11 +126,11 @@ public interface Equippable extends BuildableDataComponent<Equippable, Equippabl
/**
* Sets the equip sound key for this item.
*
* @param sound the equip sound key, or {@code null} for no sound
* @param sound the equip sound key
* @return the builder for chaining
*/
@Contract(value = "_ -> this", mutates = "this")
Builder equipSound(@Nullable Key sound);
Builder equipSound(Key sound);
/**
* Sets the asset id for this item.
@@ -207,10 +207,10 @@ public interface Equippable extends BuildableDataComponent<Equippable, Equippabl
/**
* Sets the sound that is played when shearing this equipment off an entity.
*
* @param shearSound the shear sound key, or {@code null} for no sound
* @param shearSound the shear sound key
* @return the builder for chaining
*/
@Contract(value = "_ -> this", mutates = "this")
Builder shearSound(@Nullable Key shearSound);
Builder shearSound(Key shearSound);
}
}
@@ -70,7 +70,7 @@ public interface AttributeModifierDisplay {
interface OverrideText extends AttributeModifierDisplay {
/**
* Overridden text
* Overridden text.
*
* @return the overridden text
*/
@@ -3,13 +3,16 @@ package io.papermc.paper.datacomponent.item.attribute;
import java.util.Optional;
import java.util.ServiceLoader;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.util.Services;
interface AttributeModifierDisplayBridge {
Optional<AttributeModifierDisplayBridge> BRIDGE = ServiceLoader.load(AttributeModifierDisplayBridge.class, AttributeModifierDisplayBridge.class.getClassLoader()).findFirst();
static AttributeModifierDisplayBridge bridge() {
return BRIDGE.orElseThrow();
final class Holder {
static final Optional<AttributeModifierDisplayBridge> BRIDGE = Services.service(ServiceLoader.load(AttributeModifierDisplayBridge.class), AttributeModifierDisplayBridge.class);
}
return Holder.BRIDGE.orElseThrow();
}
AttributeModifierDisplay.Default reset();
@@ -1,3 +1,6 @@
/**
* Attribute modifier display API for the {@link io.papermc.paper.datacomponent.DataComponentTypes#ATTRIBUTE_MODIFIERS} data component.
*/
@NullMarked
@MinecraftVersionDependent
package io.papermc.paper.datacomponent.item.attribute;
@@ -45,16 +45,22 @@ public interface Dialog extends Keyed, DialogLike {
}
/**
* @deprecated use {@link Registry#getKey(Keyed)}, {@link io.papermc.paper.registry.RegistryAccess#getRegistry(io.papermc.paper.registry.RegistryKey)},
* and {@link io.papermc.paper.registry.RegistryKey#DIALOG}. Dialogs can exist without a key.
* Gets the key of this dialog.
*
* @return the key of this dialog
* @deprecated use {@link Registry#getKey(Keyed)}, {@link RegistryAccess#getRegistry(RegistryKey)},
* and {@link RegistryKey#DIALOG}. Dialogs can exist without a key.
*/
@Deprecated(since = "1.21.8", forRemoval = true)
@Override
NamespacedKey getKey();
/**
* @deprecated use {@link Registry#getKey(Keyed)}, {@link io.papermc.paper.registry.RegistryAccess#getRegistry(io.papermc.paper.registry.RegistryKey)},
* and {@link io.papermc.paper.registry.RegistryKey#DIALOG}. Dialogs can exist without a key.
* Gets the key of this dialog.
*
* @return the key of this dialog
* @deprecated use {@link Registry#getKey(Keyed)}, {@link RegistryAccess#getRegistry(RegistryKey)},
* and {@link RegistryKey#DIALOG}. Dialogs can exist without a key.
*/
@Deprecated(since = "1.21.8", forRemoval = true)
@Override
@@ -1,6 +1,8 @@
package io.papermc.paper.enchantments;
/**
* Represents the rarity of an enchantment.
*
* @deprecated Enchantments do not have a "rarity" since 1.20.5
*/
@Deprecated(forRemoval = true, since = "1.20.5")
@@ -13,7 +15,7 @@ public enum EnchantmentRarity {
private final int weight;
EnchantmentRarity(int weight) {
EnchantmentRarity(final int weight) {
this.weight = weight;
}
@@ -23,6 +25,6 @@ public enum EnchantmentRarity {
* @return the weight
*/
public int getWeight() {
return weight;
return this.weight;
}
}
@@ -0,0 +1,7 @@
/**
* Enchantment API.
*/
@NullMarked
package io.papermc.paper.enchantments;
import org.jspecify.annotations.NullMarked;
@@ -3,7 +3,6 @@ package io.papermc.paper.entity.poi;
import java.util.function.Predicate;
import org.bukkit.Location;
import org.bukkit.World;
import org.jspecify.annotations.NullMarked;
/**
* Holds the result of searching for a point of interest.
@@ -11,7 +10,6 @@ import org.jspecify.annotations.NullMarked;
* @see World#locateAllPoiInRange(Location, Predicate, int)
* @see World#locateAllPoiInRange(Location, Predicate, int, PoiType.Occupancy)
*/
@NullMarked
public interface PoiSearchResult {
/**
@@ -3,7 +3,6 @@ package io.papermc.paper.entity.poi;
import io.papermc.paper.InternalAPIBridge;
import org.bukkit.Keyed;
import org.bukkit.block.data.BlockData;
import org.jspecify.annotations.NullMarked;
/**
* Represents a point of interest (POI).
@@ -14,7 +13,6 @@ import org.jspecify.annotations.NullMarked;
*
* @see PoiTypes
*/
@NullMarked
public interface PoiType extends Keyed {
/**
@@ -3,12 +3,10 @@ package io.papermc.paper.entity.poi;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.key.KeyPattern;
import org.bukkit.Registry;
import org.jspecify.annotations.NullMarked;
/**
* All the built-in point of interest types.
*/
@NullMarked
public final class PoiTypes {
// Start generate - PoiTypes
@@ -0,0 +1,7 @@
/**
* Point of interest (POI) API.
*/
@NullMarked
package io.papermc.paper.entity.poi;
import org.jspecify.annotations.NullMarked;
@@ -46,7 +46,7 @@ public class PlayerConnectionValidateLoginEvent extends Event {
*
* @return connection
* @apiNote disconnecting the player through this connection
* or using any methods that may send packets is not supported
* or using any methods that may send packets is not supported
*/
public PlayerConnection getConnection() {
return this.connection;
@@ -61,7 +61,7 @@ public class PlayerConnectionValidateLoginEvent extends Event {
}
/**
* Disallows the player from logging in, with the given reason
* Disallows the player from logging in, with the given reason.
*
* @param message Kick message to display to the user
*/
@@ -0,0 +1,91 @@
package io.papermc.paper.event.entity;
import com.google.common.base.Preconditions;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityEvent;
import org.checkerframework.checker.index.qual.NonNegative;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Called when an {@link Entity} lands on the block after falling.
* This event is called before {@link org.bukkit.event.entity.EntityDamageEvent}, {@link org.bukkit.event.entity.EntityChangeBlockEvent}, {@link org.bukkit.event.player.PlayerInteractEvent}
* and {@link org.bukkit.event.entity.EntityInteractEvent}.
*/
@NullMarked
public class EntityLandEvent extends EntityEvent implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final Block block;
private boolean cancelled;
private double fallDistance;
@ApiStatus.Internal
public EntityLandEvent(final Entity entity, final Block block, final double fallDistance) {
super(entity);
this.block = block;
this.fallDistance = fallDistance;
}
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
/**
* {@return the block that the entity landed on}
*/
public Block getBlock() {
return this.block;
}
@Override
public boolean isCancelled() {
return this.cancelled;
}
/**
* Sets whether to cancel the landing, cancelling this event will prevent
* the entity from taking fall damage and interact with the block. (ex: break turtle egg)
*
* @param cancel true if the event should be cancelled, false otherwise
*/
@Override
public void setCancelled(final boolean cancel) {
this.cancelled = cancel;
}
/**
* Gets the fall distance of the entity before landing.
*
* @return the fall distance
*/
public double getFallDistance() {
return this.fallDistance;
}
/**
* Sets the fall distance of the entity before landing.
* Fall distance in the event is used to calculate fall damage and
* the chance of transforming {@link org.bukkit.Material#FARMLAND} to {@link org.bukkit.Material#DIRT} and
* the type of falling sound when the entity lands on {@link org.bukkit.Material#POWDER_SNOW}.
*
* @param fallDistance the fall distance
* @throws IllegalArgumentException if the fall distance is negative or not finite
*/
public void setFallDistance(final @NonNegative double fallDistance) {
Preconditions.checkArgument(
Double.isFinite(fallDistance) && fallDistance >= 0.0,
"Fall distance must be finite and non-negative"
);
this.fallDistance = fallDistance;
}
}
@@ -0,0 +1,69 @@
package io.papermc.paper.event.entity;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityEvent;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Called when an entity is launched upward by a Potent Sulfur geyser.
*/
@NullMarked
public class EntityPotentSulfurLaunchEvent extends EntityEvent {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final Block sulfurBlock;
private final Location sourceLocation;
private final Vector launchVelocity;
@ApiStatus.Internal
public EntityPotentSulfurLaunchEvent(
final Entity entity,
final Block sulfurBlock,
final Location sourceLocation,
final Vector launchVelocity
) {
super(entity);
this.sulfurBlock = sulfurBlock;
this.sourceLocation = sourceLocation;
this.launchVelocity = launchVelocity;
}
/**
* Gets the Potent Sulfur block.
*/
public Block getSulfurBlock() {
return this.sulfurBlock;
}
/**
* Gets the location where the geyser exits the water column.
*/
public Location getSourceLocation() {
return this.sourceLocation.clone();
}
/**
* Gets the velocity that will be added to the entity.
* <br>
* This value is read-only, changes made to it <b>will not</b> have any
* effect on the final launch velocity.
*/
public Vector getLaunchVelocity() {
return this.launchVelocity.clone();
}
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
}
@@ -1,10 +1,5 @@
package io.papermc.paper.event.executor;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.plugin.EventExecutor;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
import java.io.IOException;
import java.io.InputStream;
import java.lang.constant.ConstantDescs;
@@ -15,16 +10,19 @@ import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Objects;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.plugin.EventExecutor;
import org.jetbrains.annotations.ApiStatus;
@ApiStatus.Internal
@NullMarked
public final class EventExecutorFactory {
private static final byte[] TEMPLATE_CLASS_BYTES;
static {
try (final InputStream is = EventExecutorFactory.class.getResourceAsStream("MethodHandleEventExecutorTemplate.class")) {
try (InputStream is = EventExecutorFactory.class.getResourceAsStream("MethodHandleEventExecutorTemplate.class")) {
TEMPLATE_CLASS_BYTES = Objects.requireNonNull(is, "template class is missing").readAllBytes();
} catch (IOException e) {
} catch (final IOException e) {
throw new AssertionError(e);
}
}
@@ -34,17 +32,19 @@ public final class EventExecutorFactory {
}
/**
* {@return an {@link EventExecutor} implemented by a hidden class calling a method handle}
* Creates an {@link EventExecutor} implemented by a hidden class calling a method handle.
*
* @param method the method to be invoked by the created event executor
* @param eventClass the class of the event to handle
* @return the event executor
* @throws AssertionError if the hidden class cannot be defined or instantiated
*/
public static EventExecutor create(final Method method, final Class<? extends Event> eventClass) {
final List<?> classData = List.of(method, eventClass);
try {
final MethodHandles.Lookup newClass = MethodHandles.lookup().defineHiddenClassWithClassData(TEMPLATE_CLASS_BYTES, classData, true);
return newClass.lookupClass().asSubclass(EventExecutor.class).getDeclaredConstructor().newInstance();
} catch (ReflectiveOperationException e) {
} catch (final ReflectiveOperationException e) {
throw new AssertionError(e);
}
}
@@ -56,6 +56,10 @@ public final class EventExecutorFactory {
/**
* Extracts the class data and creates an adjusted MethodHandle directly usable by the lookup class.
* The logic is kept here to minimize memory usage per created class.
*
* @param lookup the lookup of the hidden class, which holds the class data
* @return the class data with a method handle adjusted to the event executor signature
* @throws AssertionError if the class data cannot be read or the method cannot be unreflected
*/
static ClassData classData(final MethodHandles.Lookup lookup) {
try {
@@ -67,7 +71,7 @@ public final class EventExecutorFactory {
mh = mh.asType(MethodType.methodType(void.class, Listener.class, Event.class));
final Class<?> eventClass = MethodHandles.classDataAt(lookup, ConstantDescs.DEFAULT_NAME, Class.class, 1);
return new ClassData(method, mh, eventClass.asSubclass(Event.class));
} catch (ReflectiveOperationException e) {
} catch (final ReflectiveOperationException e) {
throw new AssertionError(e);
}
}
@@ -1,15 +1,14 @@
package io.papermc.paper.event.executor;
import com.destroystokyo.paper.util.SneakyThrow;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
import org.bukkit.event.Event;
import org.bukkit.event.EventException;
import org.bukkit.event.Listener;
import org.bukkit.plugin.EventExecutor;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
/**
* This class is designed to be used as hidden class template.
@@ -25,7 +24,6 @@ import java.lang.reflect.Method;
*/
@SuppressWarnings("unused")
@ApiStatus.Internal
@NullMarked
class MethodHandleEventExecutorTemplate implements EventExecutor {
private static final Method METHOD;
private static final MethodHandle HANDLE;
@@ -44,7 +42,7 @@ class MethodHandleEventExecutorTemplate implements EventExecutor {
if (!EVENT_CLASS.isInstance(event)) return;
try {
HANDLE.invokeExact(listener, event);
} catch (Throwable t) {
} catch (final Throwable t) {
SneakyThrow.sneaky(t);
}
}
@@ -0,0 +1,9 @@
/**
* Internal implementation of event executors.
*/
@NullMarked
@ApiStatus.Internal
package io.papermc.paper.event.executor;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
@@ -5,12 +5,10 @@ import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Called when a player picks up a crafted item from the result slot of a crafting grid.
*/
@NullMarked
public class ItemCraftedEvent extends Event {
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -1,5 +1,6 @@
package io.papermc.paper.event.inventory;
import java.util.OptionalInt;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.inventory.InventoryClickEvent;
@@ -8,15 +9,12 @@ import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
import java.util.OptionalInt;
/**
* Called when a {@link Player} selects an item inside a bundle.
*
* @apiNote This event does not fire for bundle item selections in creative mode player inventories.
*/
@NullMarked
public final class PlayerBundleItemSelectEvent extends InventoryEvent {
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -33,7 +31,16 @@ public final class PlayerBundleItemSelectEvent extends InventoryEvent {
private final Direction direction;
@ApiStatus.Internal
public PlayerBundleItemSelectEvent(final InventoryView view, final ItemStack bundle, final int rawSlot, final ItemStack previousItem, final ItemStack selectedItem, final int previousIndex, final int selectedIndex, final Direction direction) {
public PlayerBundleItemSelectEvent(
final InventoryView view,
final ItemStack bundle,
final int rawSlot,
final ItemStack previousItem,
final ItemStack selectedItem,
final int previousIndex,
final int selectedIndex,
final Direction direction
) {
super(view);
this.bundle = bundle;
@@ -125,9 +132,8 @@ public final class PlayerBundleItemSelectEvent extends InventoryEvent {
/**
* Gets the direction from the previous selection to the new one.
*
* @apiNote The direction cannot be reliably determined if there are less than three item stacks inside the bundle, in which case this returns {@link Direction#UNKNOWN}.
*
* @return the direction
* @apiNote The direction cannot be reliably determined if there are less than three item stacks inside the bundle, in which case this returns {@link Direction#UNKNOWN}.
*/
public Direction getDirection() {
return this.direction;
@@ -6,7 +6,6 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Called when a hopper or hopper minecart is about to choose an item to move,
@@ -15,15 +14,14 @@ import org.jspecify.annotations.NullMarked;
* The hopper treats disallowed slots of the source as if they do not exist, so
* a source with items only in disallowed slots is treated as empty.
*/
@NullMarked
public class PrepareHopperTransferEvent extends Event {
private static final HandlerList HANDLER_LIST = new HandlerList();
protected long disallowedSlots;
private final Inventory source;
private final Inventory destination;
private final boolean didSourceInitiate;
protected long disallowedSlots;
@ApiStatus.Internal
public PrepareHopperTransferEvent(final Inventory source, final Inventory destination, final boolean didSourceInitiate) {
@@ -33,7 +31,7 @@ public class PrepareHopperTransferEvent extends Event {
}
/**
* Gets the Inventory that items are being taken from
* Gets the Inventory that items are being taken from.
*
* @return Inventory that items are being taken from
*/
@@ -42,7 +40,7 @@ public class PrepareHopperTransferEvent extends Event {
}
/**
* Gets the Inventory that items are being put into
* Gets the Inventory that items are being put into.
*
* @return Inventory that items are being put into
*/
@@ -74,7 +72,7 @@ public class PrepareHopperTransferEvent extends Event {
/**
* Sets if the hopper is allowed to take items from a slot of {@link #getSource()}.
*
* @param slot the slot
* @param slot the slot
* @param allowed whether the slot is allowed
*/
public void setSlotAllowed(final int slot, final boolean allowed) {
@@ -0,0 +1,7 @@
/**
* {@link org.bukkit.event.Event Events} relating to inventories and the items in them.
*/
@NullMarked
package io.papermc.paper.event.inventory;
import org.jspecify.annotations.NullMarked;
@@ -7,7 +7,6 @@ import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* This event is emitted by the server when the data fixer is removing a block entity associated with a block
@@ -22,7 +21,6 @@ import org.jspecify.annotations.NullMarked;
* might be blocking on.
* Schedule large amount of work into separate thread pools.
*/
@NullMarked
public class AsyncServerDataFixerRemoveBlockEntityEvent extends Event {
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -47,33 +45,40 @@ public class AsyncServerDataFixerRemoveBlockEntityEvent extends Event {
}
/**
* {@return the key representing the no longer existing block entity type}
* Returns the key representing the no longer existing block entity type.
*
* @return the key representing the no longer existing block entity type
*/
public Key getBlockEntityType() {
return blockEntityType;
return this.blockEntityType;
}
/**
* {@return the key of the world this block entity was removed from}
* Returns the key of the world this block entity was removed from.
*
* @return the key of the world this block entity was removed from
* @see org.bukkit.Server#getWorld(Key)
*/
public Key getWorldKey() {
return worldKey;
return this.worldKey;
}
/**
* {@return the position of the block entity that was removed}
* Returns the position of the block entity that was removed.
*
* @return the position of the block entity that was removed
*/
public BlockPosition getBlockPosition() {
return blockPosition;
return this.blockPosition;
}
/**
* {@return an immutable view of the persistent data container that was attached to the removed block entity}
* Returns an immutable view of the persistent data container that was attached to the removed block entity.
*
* @return an immutable view of the persistent data container that was attached to the removed block entity
*/
public PersistentDataContainerView getPersistentDataContainerView() {
return persistentDataContainerView;
return this.persistentDataContainerView;
}
@Override
@@ -3,16 +3,17 @@ package io.papermc.paper.event.server;
import org.bukkit.event.HandlerList;
import org.bukkit.event.server.ServerEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* Called when resources such as datapacks are reloaded (e.g. /minecraft:reload)
* Called when resources such as datapacks are reloaded (e.g. /minecraft:reload).
* <p>
* Intended for use to re-register custom recipes, advancements that may be lost during a reload like this.
*/
@NullMarked
public class ServerResourcesReloadedEvent extends ServerEvent {
/**
* The handler list of this event.
*/
public static final HandlerList HANDLER_LIST = new HandlerList();
private final Cause cause;
@@ -40,8 +41,17 @@ public class ServerResourcesReloadedEvent extends ServerEvent {
return HANDLER_LIST;
}
/**
* The cause of a resource reload.
*/
public enum Cause {
/**
* The resources were reloaded by the {@code /minecraft:reload} command.
*/
COMMAND,
/**
* The resources were reloaded by a plugin.
*/
PLUGIN,
}
}
@@ -7,12 +7,10 @@ import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
/**
* This event gets called when the whitelist status of a player is changed
* This event gets called when the whitelist status of a player is changed.
*/
@NullMarked
public class WhitelistStateUpdateEvent extends Event implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -29,7 +27,7 @@ public class WhitelistStateUpdateEvent extends Event implements Cancellable {
}
/**
* Gets the player whose whitelist status is being changed
* Gets the player whose whitelist status is being changed.
*
* @return the player whose status is being changed
*/
@@ -38,7 +36,7 @@ public class WhitelistStateUpdateEvent extends Event implements Cancellable {
}
/**
* Gets the player profile whose whitelist status is being changed
* Gets the player profile whose whitelist status is being changed.
*
* @return the player profile whose status is being changed
*/
@@ -47,7 +45,7 @@ public class WhitelistStateUpdateEvent extends Event implements Cancellable {
}
/**
* Gets the status change of the player profile
* Gets the status change of the player profile.
*
* @return the whitelist status
*/
@@ -75,9 +73,16 @@ public class WhitelistStateUpdateEvent extends Event implements Cancellable {
}
/**
* Enum for the whitelist status changes
* Enum for the whitelist status changes.
*/
public enum WhitelistStatus {
ADDED, REMOVED
/**
* The player was added to the whitelist.
*/
ADDED,
/**
* The player was removed from the whitelist.
*/
REMOVED
}
}
@@ -0,0 +1,7 @@
/**
* {@link org.bukkit.event.Event Events} relating to the server.
*/
@NullMarked
package io.papermc.paper.event.server;
import org.jspecify.annotations.NullMarked;
@@ -12,7 +12,6 @@ import org.bukkit.generator.structure.Structure;
import org.bukkit.generator.structure.StructureType;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.UnmodifiableView;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
/**
@@ -28,7 +27,6 @@ import org.jspecify.annotations.Nullable;
* <li>{@link World#locateNearestStructure(Location, Structure, int, boolean)} is invoked.</li>
* </ul>
*/
@NullMarked
public class StructuresLocateEvent extends WorldEvent implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -165,6 +163,9 @@ public class StructuresLocateEvent extends WorldEvent implements Cancellable {
/**
* Result for {@link StructuresLocateEvent}.
*
* @param pos the position of the located structure
* @param structure the located structure
*/
public record Result(Position pos, Structure structure) {
@@ -6,7 +6,6 @@ import org.bukkit.World;
import org.bukkit.event.HandlerList;
import org.bukkit.event.world.WorldEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
/**
@@ -15,7 +14,6 @@ import org.jspecify.annotations.Nullable;
* If the world is in {@link World#isHardcore() hardcore}
* the resulting difficulty will always be {@link Difficulty#HARD}
*/
@NullMarked
public class WorldDifficultyChangeEvent extends WorldEvent {
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -7,20 +7,19 @@ import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.world.WorldEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
/**
* Called when a world's gamerule is changed, either by command, world options menu, or by api.
*
* @see <a href="https://minecraft.wiki/w/Game_rule#Modifying_game_rules">Modifying game rules - Minecraft wiki</a>
*/
@NullMarked
public class WorldGameRuleChangeEvent extends WorldEvent implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final @Nullable CommandSender commandSender;
protected final GameRule<?> gameRule;
private final @Nullable CommandSender commandSender;
private String value;
private boolean cancelled;
@@ -0,0 +1,7 @@
/**
* {@link org.bukkit.event.Event Events} relating to worlds.
*/
@NullMarked
package io.papermc.paper.event.world;
import org.jspecify.annotations.NullMarked;
@@ -2,9 +2,10 @@ package io.papermc.paper.inventory;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextColor;
import org.jetbrains.annotations.NotNull;
/**
* Represents the rarity of an item.
*
* @deprecated use {@link org.bukkit.inventory.ItemRarity} with {@link org.bukkit.inventory.meta.ItemMeta#getRarity()}
*/
@Deprecated(forRemoval = true, since = "1.20.5")
@@ -15,18 +16,18 @@ public enum ItemRarity {
RARE(NamedTextColor.AQUA),
EPIC(NamedTextColor.LIGHT_PURPLE);
TextColor color;
private final TextColor color;
ItemRarity(TextColor color) {
ItemRarity(final TextColor color) {
this.color = color;
}
/**
* Gets the color formatting associated with the rarity.
* @return
*
* @return the color of the rarity
*/
@NotNull
public TextColor getColor() {
return color;
return this.color;
}
}
@@ -0,0 +1,7 @@
/**
* Inventory API.
*/
@NullMarked
package io.papermc.paper.inventory;
import org.jspecify.annotations.NullMarked;
@@ -2,13 +2,11 @@ package io.papermc.paper.inventory.tooltip;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Contract;
import org.jspecify.annotations.NullMarked;
/**
* Context for computing itemstack tooltips via
* {@link org.bukkit.inventory.ItemStack#computeTooltipLines(TooltipContext, Player)}
* {@link org.bukkit.inventory.ItemStack#computeTooltipLines(TooltipContext, Player)}.
*/
@NullMarked
public interface TooltipContext {
/**
@@ -1,8 +1,6 @@
package io.papermc.paper.inventory.tooltip;
import org.jspecify.annotations.NullMarked;
@NullMarked
record TooltipContextImpl(boolean isAdvanced, boolean isCreative) implements TooltipContext {
@Override
Loaded 100 of 728 files, more files were not shown because too many files have changed in this diff. Show more