43 Commits

Author SHA1 Message Date
Blast-MC
bb21b4f18d fix server crash when eating cake (the cake was in fact, a lie) 2025-01-19 20:05:37 -05:00
Blast-MC
27799c6c25 fix bukkit item loading/upgrading 2025-01-09 02:55:55 -05:00
Blast-MC
da019d06ce fix empty portal destination kick 2025-01-04 19:21:50 -05:00
Blast-MC
d0466ffbcc fix entity loading/upgrading 2025-01-03 17:47:46 -05:00
Blast-MC
706565f1d1 fix set score kick (pt 2) 2025-01-02 11:27:46 -05:00
Blast-MC
aec635cdbf fix set score kick 2025-01-02 11:22:22 -05:00
Blast
c46dbce254 Update pr-build.yml 2024-12-31 22:40:23 -05:00
Blast
8868dca38c Update push-build.yml 2024-12-31 22:40:04 -05:00
Blast-MC
da897f9522 update eden api 2024-12-30 15:36:20 -05:00
Blast-MC
7f2307cc5f 1.21.3 2024-11-24 18:05:29 -05:00
Blast-MC
b6152ed60d 1.12.1 2024-08-11 22:46:10 -04:00
Blast-MC
9040f46126 rebuild server patches 2024-07-23 22:37:54 -04:00
Blast-MC
43c1dcb932 update upstream 2024-07-23 22:01:33 -04:00
Blast-MC
da7ff326fe 1.21 2024-06-23 20:12:32 -04:00
Blast-MC
4c2ae38401 1.20.6 2024-05-19 16:31:52 -04:00
Blast-MC
3a247683f1 fix server crash when respawning dragon 2024-02-08 20:21:07 -05:00
Blast-MC
e0e228c99c fix NPE of item in lava Cauldron 2024-02-08 17:58:05 -05:00
Blast-MC
d166d24ce4 add location to CustomBlockUpdateEvent 2024-02-08 17:57:34 -05:00
Blast-MC
31a0acb859 update upstream 2024-01-29 22:28:13 -05:00
Blast-MC
b7cfec3d53 Merge branch 'master' of github.com:ProjectEdenGG/Parchment
# Conflicts:
#	patches/server/0005-Add-origin-location-to-EntityDamageByBlockEvent.patch
2024-01-25 20:05:33 -05:00
Blast-MC
794a665f20 Fix ProjectEdenGG/Bugs#311 2024-01-25 20:04:14 -05:00
Blast-MC
046ba3260e update upstream, resolves javadoc issue 2024-01-25 20:03:31 -05:00
Griffin Kubesa
711c006e16 Merge pull request #6 from ProjectEdenGG/1.20.4
1.20.4
2024-01-21 09:14:10 -06:00
Blast-MC
39c6747e13 properly implement sidebar display values 2024-01-19 14:34:38 -05:00
Blast-MC
d204d8c9fe add sidebar utility 2024-01-15 20:55:09 -05:00
Blast-MC
4412e8b984 add CustomBlockUpdateEvent 2024-01-15 11:57:09 -05:00
Blast
358a8af2cd Update 0005-Add-origin-location-to-EntityDamageByBlockEvent.patch
Fix ProjectEdenGG/Bugs#304
2024-01-07 19:09:23 -05:00
Blast-MC
1bd783aeb1 temp remove javadoc jar as it's erroring 2023-12-15 23:46:50 -05:00
Blast-MC
999f43f448 Add block breaknaturally overload 2023-12-15 22:01:52 -05:00
Blast-MC
88ca112d35 1.20.4 2023-12-15 20:21:25 -05:00
GriffinCodes
127dae4f19 re-deploy 2023-11-13 00:33:03 -06:00
Lexi Larkin
71be6693a3 fix: bump version 2023-11-11 20:45:32 -05:00
Lexi Larkin
c7cfec78f4 feat: 1.20.2 2023-11-11 20:08:17 -05:00
Griffin Kubesa
6d85991c24 Merge pull request #5 from ProjectEdenGG/1.20.1 2023-08-07 20:48:30 -05:00
Lexi Larkin
58bfb886ca fix: exclude paper-api 2023-08-06 22:50:17 -04:00
Lexi Larkin
1f25e2f005 fix: remove nonfunctional attempt at fix 2023-08-06 22:39:37 -04:00
Lexi Larkin
3cc188ae47 fix: expose eden interfaces in API 2023-08-06 22:28:31 -04:00
Lexi Larkin
ce4157e318 Updated Upstream (Paper)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@40adc23 Fix incorrect javadoc in JarLibrary (#9513)
PaperMC/Paper@c016e03 Fix unbreakable flint and steel consumed when igniting creepers (#9509)
PaperMC/Paper@b1334b5 Mark Player.sendSignChange as deprecated (#9382)
PaperMC/Paper@2f8d9db Pathfinder hasPath should check if path is done. (#9231)
PaperMC/Paper@46a36d3 Make ExperienceOrb entities call EntitySpawnEvent (#9197)
PaperMC/Paper@24d690f Fix hopper not marking source inv as changed (#9070)
PaperMC/Paper@383f0ed Remove sign ticking (#9478)
PaperMC/Paper@d8b8f61 Configurable Region Compression Format (#8505)
PaperMC/Paper@2c54b39 Don't support hex in book title and author (#9493)
PaperMC/Paper@e19177a Rewrote Amethyst logic to throw both BlockGrowEvent and BlockSpreadEvent (#9217)
PaperMC/Paper@4283054 Add player whitelist events (#9209)
PaperMC/Paper@aa93dcf feat: add minimessage tag resolvers overload to CommandSender#sendMessage (#9505)
PaperMC/Paper@b14979e Remove isRemoved skip on .discard() (#9520)
PaperMC/Paper@1837f6c Prevent entity removals if the entity slices is receiving status updates
PaperMC/Paper@a40e48f Add cause to PlayerOpenSignEvent (#9441)
PaperMC/Paper@7d1cc6d Add Translatable interface to MusicInstrument (#9538)
PaperMC/Paper@6c7e3c5 Clarify viewers set mutability in chat events (#9525)
PaperMC/Paper@f402f89 Bump net.kyori.ansi to 1.0.2 (#9546)
PaperMC/Paper@81619a6 Fix treasure map config default (#9572)
PaperMC/Paper@13c9d3c Bump net.kyori:ansi to 1.0.3 (#9575)
PaperMC/Paper@2c55dd8 Expand use of strict advancement dim check (#9545)
PaperMC/Paper@69a8013 Fix inventorycloseevent javadocs (#9533)
PaperMC/Paper@2fa8efc Updated Upstream (Bukkit/CraftBukkit) (#9485)
PaperMC/Paper@508a295 Only erase allay memory on non-item targets (#9570)
PaperMC/Paper@31358d5 API for updating recipes on clients (#6463)
PaperMC/Paper@8fe8ca6 Add clickable version on version command (#9347)
PaperMC/Paper@d6d2b6f Only capture actual tree growth (#6464)
2023-08-06 21:36:15 -04:00
Lexi Larkin
4a430b2238 Updated Upstream (Paper)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@171ba7c Move Log4j plugins to own source set (#9428)
PaperMC/Paper@4356758 Call missing BlockDispenseEvents (#8518)
PaperMC/Paper@c0936a7 Updated Upstream (Bukkit/CraftBukkit/Spigot) (#9440)
PaperMC/Paper@12c9700 Fix ThrownEggHatchEvent#setHatching (#9448)
PaperMC/Paper@dadd8b5 Don't allow for supporting block checks to load chunks
PaperMC/Paper@48ea66e Optimize player lookups for beacons
PaperMC/Paper@d7d3f63 Use Nullable annotation for Entity source (#9435)
PaperMC/Paper@e105354 Fix incorrect new blockdata in EntityChangeBlockEvent (#9445)
PaperMC/Paper@5de0f8a Add Sign#getInteractableSideFor (#9388)
PaperMC/Paper@6b325cd Array backed synched entity data (#9460)
PaperMC/Paper@805fdd8 Add deprecations to SignSide string methods (#9467)
PaperMC/Paper@b3dc7a3 fix item meta for tadpole buckets (#9473)
PaperMC/Paper@f9473d9 Add gradle wrapper validation action
PaperMC/Paper@a3c760e Handle block state in EntityDamageByBlockEvent (#9396)
PaperMC/Paper@a60eeb8 Fix mob breaking doors not spawning particles (#9443)
PaperMC/Paper@1f8ca77 Prevent desync for poi and pistons (#9270)
PaperMC/Paper@92bc19b Fix missing item interaction cancelling case (#9427)
PaperMC/Paper@836586d Fix missing item types in SlotType for armor change event (#9379)
PaperMC/Paper@ece4fd3 Suppress Item Meta Validation Checks (#9331)
PaperMC/Paper@aefb73c Add Owner UUID api for AreaEffectCloud (#9364)
PaperMC/Paper@22ed60c Fix BanList API (#9450)
PaperMC/Paper@de3f149 Fix possible NPE on painting creation (#9391)
PaperMC/Paper@fe780d0 Add back accidentally dropped Wandering Trader patch (#9492)
PaperMC/Paper@b533905 fix 2 vanilla issues (#8940)
PaperMC/Paper@c793bd9 Allow LEFT_CLICK_AIR in 3.0->4.5 range of entity (#9211)
2023-07-17 14:01:20 -04:00
Lexi Larkin
e9072bd3a6 Updated Upstream (Paper)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@f2c1e13 Fix default permission for xp command (#9419)
PaperMC/Paper@e16fefb add 'accepted' to Done project category (#9429)
2023-07-01 15:29:17 -04:00
Lexi Larkin
b3f2c79d02 feat: shade eden-interfaces 2023-07-01 15:16:43 -04:00
Lexi Larkin
86a21a089b feat: update upstream 2023-06-30 15:19:06 -04:00
Lexi Larkin
17e63ac792 feat: 1.20.1 2023-06-30 14:54:32 -04:00
69 changed files with 2487 additions and 2768 deletions

View File

@@ -9,7 +9,7 @@ jobs:
strategy:
matrix:
java: [17]
java: [21]
fail-fast: true
steps:
@@ -42,4 +42,4 @@ jobs:
- uses: actions/upload-artifact@v3
with:
name: Parchment-PR${{ github.event.pull_request.number }}-JDK${{ matrix.java }}
path: build/libs/parchment-paperclip-*-reobf.jar
path: build/libs/parchment-paperclip-*.jar

View File

@@ -9,7 +9,7 @@ jobs:
strategy:
matrix:
java: [17]
java: [21]
fail-fast: true
steps:
@@ -40,11 +40,11 @@ jobs:
git config --global user.email "no-reply@github.com"
git config --global user.name "GitHub Actions"
./gradlew applyPatches
./gradlew createReobfPaperclipJar
./gradlew createMojmapBundlerJar
./gradlew :parchment-api:publishMavenPublicationToEdenSnapshotsRepository
./gradlew publishDevBundlePublicationToEdenSnapshotsRepository -PpublishDevBundle
- uses: actions/upload-artifact@v3
with:
name: Parchment-JDK${{ matrix.java }}
path: build/libs/parchment-paperclip-*-reobf.jar
path: build/libs/parchment-paperclip-*.jar

2
.gitignore vendored
View File

@@ -49,6 +49,7 @@ run/
/parchment-server/
/Parchment-API/
/parchment-api/
/paper-api-generator/
# Compiled class file
*.class
@@ -74,4 +75,3 @@ run/
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

View File

@@ -0,0 +1,10 @@
# You can use this file to import files from minecraft libraries into the project
# format:
# <artifactId> <fileName>
# both fully qualified and a file based syntax are accepted for <fileName>:
# authlib com/mojang/authlib/yggdrasil/YggdrasilGameProfileRepository.java
# datafixerupper com.mojang.datafixers.DataFixerBuilder
# datafixerupper com/mojang/datafixers/util/Either.java
# To import classes from the vanilla Minecraft jar use `minecraft` as the artifactId:
# minecraft net.minecraft.world.level.entity.LevelEntityGetterAdapter
# minecraft net/minecraft/world/level/entity/LevelEntityGetter.java

View File

@@ -1,4 +0,0 @@
# You can use this file to import files from vanilla into the project
# both fully qualified and a file based syntax are accepted here:
# net.minecraft.world.level.entity.LevelEntityGetterAdapter
# net/minecraft/world/level/entity/LevelEntityGetter.java

View File

@@ -3,21 +3,21 @@ import io.papermc.paperweight.util.constants.*
plugins {
java
`maven-publish`
id("com.github.johnrengelman.shadow") version "8.1.0" apply false
id("io.papermc.paperweight.patcher") version "1.5.3"
id("com.github.johnrengelman.shadow") version "8.1.1" apply false
id("io.papermc.paperweight.patcher") version "1.7.5"
}
repositories {
mavenCentral()
maven("https://papermc.io/repo/repository/maven-public/") {
maven("https://repo.papermc.io/repository/maven-public/") {
content { onlyForConfigurations(PAPERCLIP_CONFIG) }
}
}
dependencies {
remapper("net.fabricmc:tiny-remapper:0.8.6:fat")
decompiler("net.minecraftforge:forgeflower:2.0.627.2")
paperclip("io.papermc:paperclip:3.0.2")
remapper("net.fabricmc:tiny-remapper:0.10.3:fat")
decompiler("org.vineflower:vineflower:1.10.1")
paperclip("io.papermc:paperclip:3.0.3")
}
allprojects {
@@ -26,7 +26,7 @@ allprojects {
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
languageVersion.set(JavaLanguageVersion.of(21))
}
}
}
@@ -34,7 +34,7 @@ allprojects {
subprojects {
tasks.withType<JavaCompile> {
options.encoding = Charsets.UTF_8.name()
options.release.set(17)
options.release.set(21)
}
tasks.withType<Javadoc> {
options.encoding = Charsets.UTF_8.name()
@@ -45,13 +45,9 @@ subprojects {
repositories {
mavenCentral()
maven("https://papermc.io/repo/repository/maven-public/")
maven("https://repo.papermc.io/repository/maven-public/")
maven("https://sonatype.projecteden.gg/repository/maven-public/")
}
dependencies {
implementation("gg.projecteden:eden-interfaces:2.1.0-SNAPSHOT")
}
}
paperweight {
@@ -68,6 +64,15 @@ paperweight {
serverPatchDir.set(layout.projectDirectory.dir("patches/server"))
serverOutputDir.set(layout.projectDirectory.dir("parchment-server"))
}
patchTasks {
register("generatedApi") {
isBareDirectory.set(true)
upstreamDirPath.set("paper-api-generator/generated")
patchDir.set(layout.projectDirectory.dir("patches/generatedApi"))
outputDir.set(layout.projectDirectory.dir("paper-api-generator/generated"))
}
}
}
}
@@ -77,12 +82,11 @@ paperweight {
tasks.generateDevelopmentBundle {
apiCoordinates.set("gg.projecteden.parchment:parchment-api")
mojangApiCoordinates.set("io.papermc.paper:paper-mojangapi")
libraryRepositories.set(
listOf(
"https://repo.maven.apache.org/maven2/",
"https://libraries.minecraft.net/",
"https://papermc.io/repo/repository/maven-public/",
"https://repo.papermc.io/repository/maven-public/",
"https://maven.quiltmc.org/repository/release/",
"https://sonatype.projecteden.gg/repository/maven-public/"
)

View File

@@ -1,10 +1,14 @@
group = gg.projecteden.parchment
version = 1.19.4-R0.1-SNAPSHOT
version = 1.21.3-R0.1-SNAPSHOT
mcVersion = 1.19.4
paperRef = 67ca7ca471ee339c9cde858683e281fa46673a68
mcVersion = 1.21.3
paperRef = 9bc147178d62a722fb74b9157e9545a4aea72d4b
edenVersion = 2.3.0-SNAPSHOT
updatingMinecraft=true
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.vfs.watch=false
org.gradle.warning.mode=none
org.gradle.jvmargs=-Xmx4G

Binary file not shown.

View File

@@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

25
gradlew vendored
View File

@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -80,13 +80,10 @@ do
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -143,12 +140,16 @@ fi
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -193,6 +194,10 @@ if "$cygwin" || "$msys" ; then
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
@@ -205,6 +210,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.

15
gradlew.bat vendored
View File

@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal

View File

@@ -0,0 +1,28 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Lexi Larkin <lexi@qixils.dev>
Date: Sun, 6 Aug 2023 22:01:19 -0400
Subject: [PATCH] Build changes
diff --git a/build.gradle.kts b/build.gradle.kts
index e29e5024fa693baae469d47fe77b57118f14627c..7dab3328c111b9d4e06a37f25f03708870f4bab9 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -14,6 +14,9 @@ val bungeeCordChatVersion = "1.20-R0.2"
val adventureVersion = "4.17.0"
val slf4jVersion = "2.0.9"
val log4jVersion = "2.17.1"
+
+val edenVersion: String by project // Parchment
+
val apiAndDocs: Configuration by configurations.creating {
attributes {
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION))
@@ -39,6 +42,7 @@ abstract class MockitoAgentProvider : CommandLineArgumentProvider {
// Paper end - configure mockito agent that is needed in newer java versions
dependencies {
+ api("gg.projecteden:eden-interfaces:$edenVersion") // Parchment
api("com.mojang:brigadier:1.2.9") // Paper - Brigadier command api
// api dependencies are listed transitively to API consumers
api("com.google.guava:guava:32.1.2-jre")

View File

@@ -8,125 +8,83 @@ Creates new interfaces for objects that have a reference to a player, offlinepla
Also creates interfaces for objects that are like players in that they use all other interfaces and can receive Adventure messages.
diff --git a/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java b/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java
index 978813b94a5eae0afccbd3b38b463091a46b56ac..617a4b17982e3dac47480cb16046233232f288b7 100644
index 741d0e73bc635a545c94c4b1254cee8f41ba8925..24dfa7fb8d9f86626f48fdc40775f5bb7f05f3f0 100644
--- a/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java
+++ b/src/main/java/com/destroystokyo/paper/event/block/BeaconEffectEvent.java
@@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull;
/**
@@ -13,7 +13,7 @@ import org.jspecify.annotations.NullMarked;
* Called when a beacon effect is being applied to a player.
*/
@NullMarked
-public class BeaconEffectEvent extends BlockEvent implements Cancellable {
+public class BeaconEffectEvent extends BlockEvent implements Cancellable, gg.projecteden.parchment.HasPlayer { // Parchment
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private PotionEffect effect;
private static final HandlerList HANDLER_LIST = new HandlerList();
diff --git a/src/main/java/com/destroystokyo/paper/event/entity/EndermanAttackPlayerEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/EndermanAttackPlayerEvent.java
index f530a3d9314e17d1da896cac633f6a422258d9a9..08897d13a8af33ed1cd40c46b0f168e0c4ebfd4a 100644
index 34adc77de2d1f06b2b10cc26b60240c6a3ef259c..2e3dd13143e7af0b3aaa8307909fe14cee402eb3 100644
--- a/src/main/java/com/destroystokyo/paper/event/entity/EndermanAttackPlayerEvent.java
+++ b/src/main/java/com/destroystokyo/paper/event/entity/EndermanAttackPlayerEvent.java
@@ -38,7 +38,7 @@ import org.jetbrains.annotations.NotNull;
@@ -38,7 +38,7 @@ import org.jspecify.annotations.NullMarked;
* at the Enderman, according to Vanilla rules.
*
*/
@NullMarked
-public class EndermanAttackPlayerEvent extends EntityEvent implements Cancellable {
+public class EndermanAttackPlayerEvent extends EntityEvent implements Cancellable, gg.projecteden.parchment.HasPlayer { // Parchment
@NotNull private final Player player;
public EndermanAttackPlayerEvent(@NotNull Enderman entity, @NotNull Player player) {
private static final HandlerList HANDLER_LIST = new HandlerList();
diff --git a/src/main/java/com/destroystokyo/paper/event/entity/TurtleLayEggEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/TurtleLayEggEvent.java
index bcc8dba50e3a3df0206c4827bb468bf884837b8b..83b23884d67e7600a3a3cc33050606e397106020 100644
index 1492d168aa1dc538b732b0ff262074cc7c9900e6..4ec22bb3dd6674a9d56173d9abb5762a4fcfe584 100644
--- a/src/main/java/com/destroystokyo/paper/event/entity/TurtleLayEggEvent.java
+++ b/src/main/java/com/destroystokyo/paper/event/entity/TurtleLayEggEvent.java
@@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull;
/**
@@ -12,7 +12,7 @@ import org.jspecify.annotations.NullMarked;
* Fired when a Turtle lays eggs
*/
@NullMarked
-public class TurtleLayEggEvent extends EntityEvent implements Cancellable {
+public class TurtleLayEggEvent extends EntityEvent implements Cancellable, gg.projecteden.parchment.HasLocation { // Parchment
private static final HandlerList handlers = new HandlerList();
private boolean cancelled = false;
@NotNull
private static final HandlerList HANDLER_LIST = new HandlerList();
diff --git a/src/main/java/com/destroystokyo/paper/event/entity/TurtleStartDiggingEvent.java b/src/main/java/com/destroystokyo/paper/event/entity/TurtleStartDiggingEvent.java
index abeb24fccda2acfdb0dfdadacb8fe688bd97cf78..890069604ca78a9a3f3b4c5f40969a451a1b2067 100644
index a84101fb1b478f3018f283bc47d3e73a7ae5bbc8..ea24db70e9b83b8fb626840a2c1387407ffdc256 100644
--- a/src/main/java/com/destroystokyo/paper/event/entity/TurtleStartDiggingEvent.java
+++ b/src/main/java/com/destroystokyo/paper/event/entity/TurtleStartDiggingEvent.java
@@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull;
/**
@@ -12,7 +12,7 @@ import org.jspecify.annotations.NullMarked;
* Fired when a Turtle starts digging to lay eggs
*/
@NullMarked
-public class TurtleStartDiggingEvent extends EntityEvent implements Cancellable {
+public class TurtleStartDiggingEvent extends EntityEvent implements Cancellable, gg.projecteden.parchment.HasLocation { // Parchment
private static final HandlerList handlers = new HandlerList();
private boolean cancelled = false;
@NotNull private final Location location;
private static final HandlerList HANDLER_LIST = new HandlerList();
diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java
index 59ae7bc3a0a2079fe4b3a92d777aca682a58e4e3..b0cc7665e6591c71b7cd4388d028a5f8abd65e64 100644
index aea04fb357f5728195fd9c9bdcd6304a0b953c45..18c6e8b1865a958a10fc2ae4234979f1adfaedc3 100644
--- a/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java
+++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerHandshakeEvent.java
@@ -20,7 +20,7 @@ import java.util.UUID;
*
@@ -21,7 +21,7 @@ import org.jspecify.annotations.Nullable;
* <p>WARNING: TAMPERING WITH THIS EVENT CAN BE DANGEROUS</p>
*/
@NullMarked
-public class PlayerHandshakeEvent extends Event implements Cancellable {
+public class PlayerHandshakeEvent extends Event implements Cancellable, gg.projecteden.api.interfaces.OptionalUniqueId { // Parchment
private static final HandlerList HANDLERS = new HandlerList();
@NotNull private final String originalHandshake;
diff --git a/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java b/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java
index 4dcf6242c9acc62d030a94f67b78729ed29f8c85..33550df23fea251368b16dbebad27bdcb1de2e78 100644
--- a/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java
+++ b/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java
@@ -23,7 +23,7 @@ import org.jetbrains.annotations.Nullable;
* No guarantees are made about thread execution context for this event. If you need to know, check
* event.isAsync()
*/
-public class PreLookupProfileEvent extends Event {
+public class PreLookupProfileEvent extends Event implements gg.projecteden.api.interfaces.OptionalUniqueId { // Parchment
private static final HandlerList HANDLER_LIST = new HandlerList();
private static final HandlerList handlers = new HandlerList();
@NotNull private final String name;
@@ -49,11 +49,27 @@ public class PreLookupProfileEvent extends Event {
* {@link LookupProfileEvent}
*
* @return The UUID of the profile if it has already been provided by a plugin
+ * @deprecated alias of {@link #getUniqueId()} <!-- Parchment: fix inconsistent naming -->
*/
@Nullable
- public UUID getUUID() {
+ // Parchment start
+ @Deprecated
+ public final UUID getUUID() {
+ return getUniqueId();
+ }
+
+ /**
+ * If this value is left null by the completion of the event call, then the server will
+ * trigger a call to the Mojang API to look up the UUID (Network Request), and subsequently, fire a
+ * {@link LookupProfileEvent}
+ *
+ * @return The UUID of the profile if it has already been provided by a plugin
+ */
+ @Override
+ public @Nullable UUID getUniqueId() {
return uuid;
}
+ // Parchment end
/**
* Sets the UUID for this player name. This will skip the initial API call to find the players UUID.
diff --git a/src/main/java/com/destroystokyo/paper/event/server/AsyncTabCompleteEvent.java b/src/main/java/com/destroystokyo/paper/event/server/AsyncTabCompleteEvent.java
index 9be64a95c2345433b6142d611077dedadcef9f5d..e3cea810881868fb5869de72f331733e6893fcee 100644
index 0482ecf5b84ba8e0260679049f384f3449bbe7b5..b8ef784ec3b61d78ddb0f1aa6bb9712b4df9892d 100644
--- a/src/main/java/com/destroystokyo/paper/event/server/AsyncTabCompleteEvent.java
+++ b/src/main/java/com/destroystokyo/paper/event/server/AsyncTabCompleteEvent.java
@@ -47,7 +47,7 @@ import org.jetbrains.annotations.Nullable;
*
@@ -53,7 +53,7 @@ import org.jspecify.annotations.Nullable;
* Only 1 process will be allowed to provide completions, the Async Event, or the standard process.
*/
@NullMarked
-public class AsyncTabCompleteEvent extends Event implements Cancellable {
+public class AsyncTabCompleteEvent extends Event implements Cancellable, gg.projecteden.parchment.OptionalLocation { // Parchment
@NotNull private final CommandSender sender;
@NotNull private final String buffer;
private final boolean isCommand;
private static final HandlerList HANDLER_LIST = new HandlerList();
diff --git a/src/main/java/com/destroystokyo/paper/exception/ServerPluginMessageException.java b/src/main/java/com/destroystokyo/paper/exception/ServerPluginMessageException.java
index 2faef4cb358ec65e32a6aba6426f0dd7ddf90d2a..640a01478be687b089aeddad422e4bba2bea19b6 100644
--- a/src/main/java/com/destroystokyo/paper/exception/ServerPluginMessageException.java
@@ -263,10 +221,10 @@ index 0000000000000000000000000000000000000000..45410a77714ad28201520c188e280e4f
+}
diff --git a/src/main/java/gg/projecteden/parchment/OptionalLocation.java b/src/main/java/gg/projecteden/parchment/OptionalLocation.java
new file mode 100644
index 0000000000000000000000000000000000000000..23897904c6e2d6195f3613c36d77454587afd8bc
index 0000000000000000000000000000000000000000..305713e6095de2849a42ba1f4049b8715f1f907c
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/OptionalLocation.java
@@ -0,0 +1,18 @@
@@ -0,0 +1,17 @@
+package gg.projecteden.parchment;
+
+import org.bukkit.Location;
@@ -279,8 +237,7 @@ index 0000000000000000000000000000000000000000..23897904c6e2d6195f3613c36d774545
+@FunctionalInterface
+public interface OptionalLocation {
+ /**
+ * Gets a {@link Location} attached to this object if present
+ *
+ * Gets a {@link Location} attached to this object if present *
+ * @return attached location
+ */
+ @Nullable Location getLocation();
@@ -401,33 +358,33 @@ index 0000000000000000000000000000000000000000..c70ddc6f92d62d2d5baa001c9009ddd3
+ }
+}
diff --git a/src/main/java/io/papermc/paper/event/packet/PlayerChunkLoadEvent.java b/src/main/java/io/papermc/paper/event/packet/PlayerChunkLoadEvent.java
index 2c1cda1126e577a88f19071e958eddb5a38785af..39e746f0c8536642346abbb6909fd2053031d695 100644
index 2815c5802eb38e5a48f9db42b9247e24c27db134..df0a4c29e7fdb019907d47da09f0e1e2db4c9613 100644
--- a/src/main/java/io/papermc/paper/event/packet/PlayerChunkLoadEvent.java
+++ b/src/main/java/io/papermc/paper/event/packet/PlayerChunkLoadEvent.java
@@ -14,7 +14,7 @@ import org.jetbrains.annotations.NotNull;
* Should only be used for packet/clientside related stuff.
@@ -16,7 +16,7 @@ import org.jspecify.annotations.NullMarked;
* Not intended for modifying server side state.
*/
@NullMarked
-public class PlayerChunkLoadEvent extends ChunkEvent {
+public class PlayerChunkLoadEvent extends ChunkEvent implements gg.projecteden.parchment.HasPlayer { // Parchment
private static final HandlerList handlers = new HandlerList();
private final Player player;
private static final HandlerList HANDLER_LIST = new HandlerList();
diff --git a/src/main/java/io/papermc/paper/event/packet/PlayerChunkUnloadEvent.java b/src/main/java/io/papermc/paper/event/packet/PlayerChunkUnloadEvent.java
index 12163a7b0591a7d022dc7eb9ee6608a1b6c39d9b..d81c7307127b135417e06a3b244416bee34b0abe 100644
index 3ebb35b680193109cc751398675e935eed746750..6f162e907e31496ac8a1470d3fa3b844a7f4615a 100644
--- a/src/main/java/io/papermc/paper/event/packet/PlayerChunkUnloadEvent.java
+++ b/src/main/java/io/papermc/paper/event/packet/PlayerChunkUnloadEvent.java
@@ -12,7 +12,7 @@ import org.jetbrains.annotations.NotNull;
* Should only be used for packet/clientside related stuff.
@@ -14,7 +14,7 @@ import org.jspecify.annotations.NullMarked;
* Not intended for modifying server side.
*/
@NullMarked
-public class PlayerChunkUnloadEvent extends ChunkEvent {
+public class PlayerChunkUnloadEvent extends ChunkEvent implements gg.projecteden.parchment.HasPlayer { // Parchment
private static final HandlerList handlers = new HandlerList();
private final Player player;
private static final HandlerList HANDLER_LIST = new HandlerList();
diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java
index 6bbf8468bc47e82b0aeb164e49cdb73d93bae87b..1d7077f3a1be8068747aaf0665a1dee797bb4088 100644
index bdc065a486306236c7f0960718bea53bc0b0a9b6..c99fde4d0c8dc12a89015f4cccdccfe8e3dfb8f6 100644
--- a/src/main/java/org/bukkit/Location.java
+++ b/src/main/java/org/bukkit/Location.java
@@ -30,7 +30,7 @@ import org.bukkit.entity.Player;
@@ -435,13 +392,13 @@ index 6bbf8468bc47e82b0aeb164e49cdb73d93bae87b..1d7077f3a1be8068747aaf0665a1dee7
* representation by the implementation.
*/
-public class Location implements Cloneable, ConfigurationSerializable, io.papermc.paper.math.FinePosition { // Paper
+public class Location implements Cloneable, ConfigurationSerializable , io.papermc.paper.math.FinePosition, gg.projecteden.parchment.HasLocation { // Parchment
+public class Location implements Cloneable, ConfigurationSerializable, io.papermc.paper.math.FinePosition, gg.projecteden.parchment.HasLocation { // Paper // Parchment
private Reference<World> world;
private double x;
private double y;
@@ -72,6 +72,13 @@ public class Location implements Cloneable, ConfigurationSerializable, io.paperm
this.yaw = yaw;
}
@@ -38,6 +38,13 @@ public class Location implements Cloneable, ConfigurationSerializable, io.paperm
private float pitch;
private float yaw;
+ // Parchment start
+ @Override
@@ -451,76 +408,70 @@ index 6bbf8468bc47e82b0aeb164e49cdb73d93bae87b..1d7077f3a1be8068747aaf0665a1dee7
+ // Parchment end
+
/**
* Sets the world that this location resides in
* Constructs a new Location with the given coordinates
*
diff --git a/src/main/java/org/bukkit/OfflinePlayer.java b/src/main/java/org/bukkit/OfflinePlayer.java
index 69b50eee42e8c52063033705bd23a5ef5231ed83..f61ddf47ce33a4a1708e7000bb43b303e3b1a503 100644
index a028f2fe541491729856051780b33dba07832fb6..5a6aa86fda316b8591fb1653a09d9e2ff729b33f 100644
--- a/src/main/java/org/bukkit/OfflinePlayer.java
+++ b/src/main/java/org/bukkit/OfflinePlayer.java
@@ -10,7 +10,7 @@ import org.bukkit.profile.PlayerProfile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-public interface OfflinePlayer extends ServerOperator, AnimalTamer, ConfigurationSerializable {
+public interface OfflinePlayer extends ServerOperator, AnimalTamer, ConfigurationSerializable, gg.projecteden.parchment.HasOfflinePlayer, gg.projecteden.parchment.OptionalPlayer { // Parchment
/**
* Checks if this player is currently online
@@ -139,6 +139,13 @@ public interface OfflinePlayer extends ServerOperator, AnimalTamer, Configuratio
@Nullable
public Player getPlayer();
@@ -19,7 +19,14 @@ import org.jetbrains.annotations.Nullable;
* player that is stored on the disk and can, thus, be retrieved without the
* player needing to be online.
*/
-public interface OfflinePlayer extends ServerOperator, AnimalTamer, ConfigurationSerializable, io.papermc.paper.persistence.PersistentDataViewHolder { // Paper - Add Offline PDC API
+public interface OfflinePlayer extends ServerOperator, AnimalTamer, ConfigurationSerializable, io.papermc.paper.persistence.PersistentDataViewHolder, gg.projecteden.parchment.HasOfflinePlayer, gg.projecteden.parchment.OptionalPlayer { // Parchment
+
+ // Parchment start
+ @Override
+ default @org.jetbrains.annotations.NotNull OfflinePlayer getOfflinePlayer() {
+ return this;
+ }
+ // Parchment end
+
/**
* Gets the first date and time that this player was witnessed on this
* server.
* Checks if this player is currently online
diff --git a/src/main/java/org/bukkit/Raid.java b/src/main/java/org/bukkit/Raid.java
index 983a8c20a06d2b509602b27f49c090598b8ecc42..46dd8496f5a2c792ee7811e33c424e88edf8b5b3 100644
index fa98599e3eee37bf68f0e9813497c718f457485c..7af5afbef7b1559221ab6c28131ae698aa8cec76 100644
--- a/src/main/java/org/bukkit/Raid.java
+++ b/src/main/java/org/bukkit/Raid.java
@@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Represents a raid event.
*/
-public interface Raid {
+public interface Raid extends gg.projecteden.parchment.HasLocation { // Parchment
-public interface Raid extends org.bukkit.persistence.PersistentDataHolder { // Paper
+public interface Raid extends org.bukkit.persistence.PersistentDataHolder, gg.projecteden.parchment.HasLocation { // Paper // Parchment
/**
* Get whether this raid started.
diff --git a/src/main/java/org/bukkit/Vibration.java b/src/main/java/org/bukkit/Vibration.java
index bbc01e7c192ae6689c301670047ff114306c57cb..2a83ba61686caffb247f17a67af474299dae6be4 100644
index bbc01e7c192ae6689c301670047ff114306c57cb..0b2a6ed4407817df4421ae8edf46d7876864a618 100644
--- a/src/main/java/org/bukkit/Vibration.java
+++ b/src/main/java/org/bukkit/Vibration.java
@@ -74,7 +74,7 @@ public class Vibration {
@@ -74,7 +74,8 @@ public class Vibration {
}
}
- public static class BlockDestination implements Destination {
+ public static class BlockDestination implements Destination, gg.projecteden.parchment.HasLocation { // Parchment
+
private final Location block;
diff --git a/src/main/java/org/bukkit/attribute/AttributeModifier.java b/src/main/java/org/bukkit/attribute/AttributeModifier.java
index d124768378d6f0c5573f28ee815ea3886fe74868..11a00998b1cb5ee582e225553f15b1b7c1a65b2a 100644
index 027a7d3b6feb52f6c3424edc0820d29fdaf6ebae..fe33bdfd98c3a96af766cbbe5a267f4710cbff52 100644
--- a/src/main/java/org/bukkit/attribute/AttributeModifier.java
+++ b/src/main/java/org/bukkit/attribute/AttributeModifier.java
@@ -14,7 +14,7 @@ import org.jetbrains.annotations.Nullable;
@@ -20,7 +20,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Concrete implementation of an attribute modifier.
*/
-public class AttributeModifier implements ConfigurationSerializable {
+public class AttributeModifier implements ConfigurationSerializable, gg.projecteden.api.interfaces.HasUniqueId { // Parchment
-public class AttributeModifier implements ConfigurationSerializable, Keyed {
+public class AttributeModifier implements ConfigurationSerializable, Keyed, gg.projecteden.api.interfaces.HasUniqueId { // Parchment
private final UUID uuid;
private final String name;
private static final Pattern UUID_PATTERN = Pattern.compile("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$");
private final NamespacedKey key;
diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java
index 390a2a2611df35a9ea6f1eb996b47e2aa4597ff0..e7dcaf75283dd222891e4f20971716934291a672 100644
index 0efd8bb70ebdb86372022c9e12ec89f229ab3b52..ec7bb05c4fc2f0f1eb42c77dbe5e3eb6c340bdef 100644
--- a/src/main/java/org/bukkit/block/Block.java
+++ b/src/main/java/org/bukkit/block/Block.java
@@ -32,7 +32,7 @@ import org.jetbrains.annotations.Nullable;
@@ -528,15 +479,15 @@ index 390a2a2611df35a9ea6f1eb996b47e2aa4597ff0..e7dcaf75283dd222891e4f2097171693
* generation when used in cases like BlockPhysicsEvent!!!!
*/
-public interface Block extends Metadatable, Translatable, net.kyori.adventure.translation.Translatable { // Paper - translatable
+public interface Block extends Metadatable, Translatable, net.kyori.adventure.translation.Translatable, gg.projecteden.parchment.HasLocation { // Paper - translatable
+public interface Block extends Metadatable, Translatable, net.kyori.adventure.translation.Translatable, gg.projecteden.parchment.HasLocation { // Paper - translatable // Parchment
/**
* Gets the metadata for this block
diff --git a/src/main/java/org/bukkit/block/BlockState.java b/src/main/java/org/bukkit/block/BlockState.java
index 37ca7b6b0fcee8bec12026ec3715dcc47400cc11..eaf14ce470f041360082cbb0bc16247706b2cd77 100644
index 8c7c8c0e54682dc4276109d19d92394cdd4bc189..cbaf558b98f64922c5e15b1cb1f31068e8fdd501 100644
--- a/src/main/java/org/bukkit/block/BlockState.java
+++ b/src/main/java/org/bukkit/block/BlockState.java
@@ -20,7 +20,7 @@ import org.jetbrains.annotations.Nullable;
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable;
* change the state of the block and you will not know, or they may change the
* block to another type entirely, causing your BlockState to become invalid.
*/
@@ -559,25 +510,26 @@ index a39d2f1acbbd84ae0e2cf29f85594e09e55e9355..4348b8961afe7a57350856622aff8c98
public DoubleChest(@NotNull DoubleChestInventory chest) {
diff --git a/src/main/java/org/bukkit/entity/AnimalTamer.java b/src/main/java/org/bukkit/entity/AnimalTamer.java
index 2e17b2d4f759531fbe9ee8e9b00c839186af09ca..8f4a293c131cb8b63c31b410ffa211bdb42b3338 100644
index 2e17b2d4f759531fbe9ee8e9b00c839186af09ca..0cd8961afbe2e04132ec5d40dc9bbc6cab7a0f0f 100644
--- a/src/main/java/org/bukkit/entity/AnimalTamer.java
+++ b/src/main/java/org/bukkit/entity/AnimalTamer.java
@@ -4,7 +4,7 @@ import java.util.UUID;
@@ -4,7 +4,8 @@ import java.util.UUID;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-public interface AnimalTamer {
+public interface AnimalTamer extends gg.projecteden.api.interfaces.HasUniqueId { // Parchment
+
/**
* This is the name of the specified AnimalTamer.
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
index 8c58018b155c52a7b2a139f784abceb6aa00a268..dfa0366e3f46ef974f9d3397f057a6abc5c0e08c 100644
index d0ae8a94db20281d3664d74718c65234eb2e5f83..87cea10a668d3040906a4dd1fd135c2162d9617f 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
@@ -27,7 +27,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Represents a base entity in the world
@@ -31,7 +31,7 @@ import org.jetbrains.annotations.Nullable;
* Not all methods are guaranteed to work/may have side effects when
* {@link #isInWorld()} is false.
*/
-public interface Entity extends Metadatable, CommandSender, Nameable, PersistentDataHolder, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowEntity>, net.kyori.adventure.sound.Sound.Emitter { // Paper
+public interface Entity extends Metadatable, CommandSender, Nameable, PersistentDataHolder, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowEntity>, net.kyori.adventure.sound.Sound.Emitter, gg.projecteden.api.interfaces.HasUniqueId, gg.projecteden.parchment.HasLocation { // Paper // Parchment
@@ -585,7 +537,7 @@ index 8c58018b155c52a7b2a139f784abceb6aa00a268..dfa0366e3f46ef974f9d3397f057a6ab
/**
* Gets the entity's current position
diff --git a/src/main/java/org/bukkit/entity/HumanEntity.java b/src/main/java/org/bukkit/entity/HumanEntity.java
index f17ef44bc02e97ff084e5abfde8d6c6822f00d62..aae9eaa7a0e42cd9bc0a4ccf56bf056441d47c90 100644
index 488604ba1a516b477693877c74712e4a45624a8b..7f9f8d8f95e58ca702ae7e5007c53c226890d662 100644
--- a/src/main/java/org/bukkit/entity/HumanEntity.java
+++ b/src/main/java/org/bukkit/entity/HumanEntity.java
@@ -20,7 +20,15 @@ import org.jetbrains.annotations.Nullable;
@@ -593,28 +545,28 @@ index f17ef44bc02e97ff084e5abfde8d6c6822f00d62..aae9eaa7a0e42cd9bc0a4ccf56bf0564
* Represents a human entity, such as an NPC or a player
*/
-public interface HumanEntity extends LivingEntity, AnimalTamer, InventoryHolder {
+// Parchment start
+public interface HumanEntity extends LivingEntity, AnimalTamer, InventoryHolder, gg.projecteden.parchment.HasHumanEntity {
+public interface HumanEntity extends LivingEntity, AnimalTamer, InventoryHolder, gg.projecteden.parchment.HasHumanEntity { // Parchment
+
+ // Parchment start
+ @NotNull
+ @Override
+ default HumanEntity getPlayer() {
+ return this;
+ }
+// Parchment end
+ // Parchment end
// Paper start
@Override
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 8fe11fce80c3b29164b79ece8dc9ed8da6fc1790..b494ea7863a06fd9c52fba124a66d83da6432ed9 100644
index 95f0b3186e313c7fbd5c8531d52b82a69e525f94..aa21cd957cb0a4756cf0f27cef69fbd80e71c54e 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
@@ -39,7 +39,17 @@ import org.jetbrains.annotations.Nullable;
@@ -58,7 +58,17 @@ import org.jetbrains.annotations.Nullable;
/**
* Represents a player, connected or not
*/
-public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified, com.destroystokyo.paper.network.NetworkClient { // Paper
+public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified, com.destroystokyo.paper.network.NetworkClient, gg.projecteden.parchment.HasPlayer { // Paper // Parchment
-public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified, net.kyori.adventure.bossbar.BossBarViewer, com.destroystokyo.paper.network.NetworkClient { // Paper
+public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified, net.kyori.adventure.bossbar.BossBarViewer, com.destroystokyo.paper.network.NetworkClient, gg.projecteden.parchment.HasPlayer { // Paper // Parchment
+
+ // Parchment start - fix defaults
+ /**
@@ -642,7 +594,7 @@ index 691733a642b3295bbe6d484be728c77cd32803bd..a2eae7a9bad13d1ba2bd954888a03738
private boolean dropItems;
private boolean cancel;
diff --git a/src/main/java/org/bukkit/event/block/BlockCanBuildEvent.java b/src/main/java/org/bukkit/event/block/BlockCanBuildEvent.java
index a1350c0f74d445dca09eea6e10abac050bb06990..11bb6f8f7363f31061d5fd0f2e4515099ac40649 100644
index c74ac0cb004aa219ce2f761969a4bb46cb7c9160..0ef554454608f0129b764dc3d6e3d7780ddf2a11 100644
--- a/src/main/java/org/bukkit/event/block/BlockCanBuildEvent.java
+++ b/src/main/java/org/bukkit/event/block/BlockCanBuildEvent.java
@@ -19,7 +19,7 @@ import org.jetbrains.annotations.Nullable;
@@ -655,7 +607,7 @@ index a1350c0f74d445dca09eea6e10abac050bb06990..11bb6f8f7363f31061d5fd0f2e451509
protected boolean buildable;
diff --git a/src/main/java/org/bukkit/event/block/BlockDamageEvent.java b/src/main/java/org/bukkit/event/block/BlockDamageEvent.java
index cd04a0bd9d232857408b38605787016a217cb8d2..7035fe7c0f5adb981ac41804605c4fbcf57968bf 100644
index 392cde07d578d684423e1bf369af28696eb7e484..e1dacc04c73e0cabcd04d50540f3a5716550e22f 100644
--- a/src/main/java/org/bukkit/event/block/BlockDamageEvent.java
+++ b/src/main/java/org/bukkit/event/block/BlockDamageEvent.java
@@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull;
@@ -668,10 +620,10 @@ index cd04a0bd9d232857408b38605787016a217cb8d2..7035fe7c0f5adb981ac41804605c4fbc
private final Player player;
private boolean instaBreak;
diff --git a/src/main/java/org/bukkit/event/block/BlockDropItemEvent.java b/src/main/java/org/bukkit/event/block/BlockDropItemEvent.java
index 3dd4bd38e72c04e74e5787fb38ca9abd10bad06b..3783fb96cc7086bc78dc06c573a1343c3a18c3cb 100644
index 4c5ee91de162b202c2db8bf68259ad41a430125d..0d7087301c05bd801b32621e279ff69335b92660 100644
--- a/src/main/java/org/bukkit/event/block/BlockDropItemEvent.java
+++ b/src/main/java/org/bukkit/event/block/BlockDropItemEvent.java
@@ -24,7 +24,7 @@ import org.jetbrains.annotations.NotNull;
@@ -28,7 +28,7 @@ import org.jetbrains.annotations.NotNull;
* AIR in most cases. Use #getBlockState() for more Information about the broken
* block.
*/
@@ -720,10 +672,10 @@ index 4e3c406ba883aae553e8d69b6b719b872cd6096c..d0a92dc9eba0f61b596e9a388f3aa407
protected boolean cancel;
protected boolean canBuild;
diff --git a/src/main/java/org/bukkit/event/block/SignChangeEvent.java b/src/main/java/org/bukkit/event/block/SignChangeEvent.java
index c40536f781393cb39e6a1a4ba6e780713d5dc126..e4455679b37ac38bd505982ef12d323c9ff466c3 100644
index d944d67f544494355f03c5bc9afd8ea7726e6412..800db8e63bdb8c05ffdc88c3a3b0f1f268a1357e 100644
--- a/src/main/java/org/bukkit/event/block/SignChangeEvent.java
+++ b/src/main/java/org/bukkit/event/block/SignChangeEvent.java
@@ -12,7 +12,7 @@ import org.jetbrains.annotations.Nullable;
@@ -13,7 +13,7 @@ import org.jetbrains.annotations.Nullable;
* <p>
* If a Sign Change event is cancelled, the sign will not be changed.
*/
@@ -733,7 +685,7 @@ index c40536f781393cb39e6a1a4ba6e780713d5dc126..e4455679b37ac38bd505982ef12d323c
private boolean cancel = false;
private final Player player;
diff --git a/src/main/java/org/bukkit/event/entity/EntityEnterLoveModeEvent.java b/src/main/java/org/bukkit/event/entity/EntityEnterLoveModeEvent.java
index 59aab10c2d27247eb77bd71d75b5f9126aa0fb12..b42465617e83d3413ab647cd9c78212b61ca5833 100644
index 59aab10c2d27247eb77bd71d75b5f9126aa0fb12..57f89f569725289d56f1c75db258ac19b6f94f30 100644
--- a/src/main/java/org/bukkit/event/entity/EntityEnterLoveModeEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityEnterLoveModeEvent.java
@@ -13,7 +13,7 @@ import org.jetbrains.annotations.Nullable;
@@ -745,11 +697,8 @@ index 59aab10c2d27247eb77bd71d75b5f9126aa0fb12..b42465617e83d3413ab647cd9c78212b
private static final HandlerList handlers = new HandlerList();
private boolean cancel;
@@ -42,11 +42,27 @@ public class EntityEnterLoveModeEvent extends EntityEvent implements Cancellable
*
* @return The Human entity that caused the animal to enter love mode, or
@@ -44,9 +44,24 @@ public class EntityEnterLoveModeEvent extends EntityEvent implements Cancellable
* null if there wasn't one.
+ * @deprecated alias of {@link #getPlayer()} <!-- Parchment: fix inconsistent naming -->
*/
@Nullable
- public HumanEntity getHumanEntity() {
@@ -775,10 +724,10 @@ index 59aab10c2d27247eb77bd71d75b5f9126aa0fb12..b42465617e83d3413ab647cd9c78212b
/**
* Gets the amount of ticks that the animal will fall in love for.
diff --git a/src/main/java/org/bukkit/event/entity/EntityExplodeEvent.java b/src/main/java/org/bukkit/event/entity/EntityExplodeEvent.java
index 099efafa14c10910e4ed04abb1823f0c1a96b6a6..382602ca4a9a33cf238f982f77865053d38bd285 100644
index e468e55d426b8f81f87c0a08451d02b3866c226f..74f0f439aa145d9c8d1c049aee387521f34a39e9 100644
--- a/src/main/java/org/bukkit/event/entity/EntityExplodeEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityExplodeEvent.java
@@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull;
@@ -14,7 +14,7 @@ import org.jetbrains.annotations.NotNull;
* event isn't called if the {@link org.bukkit.GameRule#MOB_GRIEFING}
* is disabled as no block interaction will occur.
*/
@@ -801,15 +750,15 @@ index 71d664dd89995f088c47d17b38547d530319470c..d931ece8f35c8f01748c59d01617fd59
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
diff --git a/src/main/java/org/bukkit/event/entity/EntityPortalEnterEvent.java b/src/main/java/org/bukkit/event/entity/EntityPortalEnterEvent.java
index 6818e9f0ba32ca1a1e612703f7526b29f5a6438f..c9c4a6673fd3995bb9638b0d25fa212412cda807 100644
index 8b2caf665b9e829ceefc89bf41b192f53f3d5773..dbf52ab6f97245d1d4b2325a3e05b5047a3e7e6f 100644
--- a/src/main/java/org/bukkit/event/entity/EntityPortalEnterEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityPortalEnterEvent.java
@@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Called when an entity comes into contact with a portal
@@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull;
* Cancelling this event prevents any further processing of the portal for that tick.
* @see io.papermc.paper.event.entity.EntityInsideBlockEvent
*/
-public class EntityPortalEnterEvent extends EntityEvent {
+public class EntityPortalEnterEvent extends EntityEvent implements gg.projecteden.parchment.HasLocation { // Parchment
-public class EntityPortalEnterEvent extends EntityEvent implements org.bukkit.event.Cancellable { // Paper
+public class EntityPortalEnterEvent extends EntityEvent implements org.bukkit.event.Cancellable, gg.projecteden.parchment.HasLocation { // Parchment
private static final HandlerList handlers = new HandlerList();
private final Location location;
@@ -827,7 +776,7 @@ index 961ee511342cd3a12ff2ff74d7b4683c6753123d..892732ab5ae58ec980c4fd05a5a3dfdc
private static final HandlerList handlers = new HandlerList();
private boolean canceled;
diff --git a/src/main/java/org/bukkit/event/entity/ItemDespawnEvent.java b/src/main/java/org/bukkit/event/entity/ItemDespawnEvent.java
index 6fc66197eb2c5d59c70d8d028b7963748371edbe..dc45ec5b6ae8e2958d83a113d23ab0b1a911de3f 100644
index 2bb29fa449cd6c90b52d2786ed15b6154d591607..ce4caa5d3b0801bc7e2fd2c917a4ae6e3f054052 100644
--- a/src/main/java/org/bukkit/event/entity/ItemDespawnEvent.java
+++ b/src/main/java/org/bukkit/event/entity/ItemDespawnEvent.java
@@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull;
@@ -866,12 +815,12 @@ index cc5781f276ec0a503b1bfef19d630c85db897c2a..89b38f2ce9a355f39abc657eff49c3a5
private boolean cancelled;
private final Player player;
diff --git a/src/main/java/org/bukkit/event/inventory/FurnaceExtractEvent.java b/src/main/java/org/bukkit/event/inventory/FurnaceExtractEvent.java
index 020739697a0b535cad0b15b574f77cdabbdfa3eb..ee4fd41e66852d5d2c62222c7b884473d3f3001d 100644
index 5ffd28fd24b4477a07fc9f6a3f669a6f4da9fa26..7611905895d414eeb45a92ed0e3b6124f3dd85cd 100644
--- a/src/main/java/org/bukkit/event/inventory/FurnaceExtractEvent.java
+++ b/src/main/java/org/bukkit/event/inventory/FurnaceExtractEvent.java
@@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull;
/**
* This event is called when a player takes items out of the furnace
@@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull;
* {@link org.bukkit.block.Furnace}, {@link org.bukkit.block.Smoker}, or
* {@link org.bukkit.block.BlastFurnace}.
*/
-public class FurnaceExtractEvent extends BlockExpEvent {
+public class FurnaceExtractEvent extends BlockExpEvent implements gg.projecteden.parchment.HasPlayer { // Parchment
@@ -879,12 +828,12 @@ index 020739697a0b535cad0b15b574f77cdabbdfa3eb..ee4fd41e66852d5d2c62222c7b884473
private final Material itemType;
private final int itemAmount;
diff --git a/src/main/java/org/bukkit/event/inventory/InventoryCloseEvent.java b/src/main/java/org/bukkit/event/inventory/InventoryCloseEvent.java
index 21ad8888c0e403bfc63518502577d651c02dda05..1c59335a8f0a40162190f6fb73ffbfef0cd795d8 100644
index 4db0a07db156c61867644f50c185e63b695e2462..eb6632e2e9d247bd54e02e3a134dfdbed9aeef39 100644
--- a/src/main/java/org/bukkit/event/inventory/InventoryCloseEvent.java
+++ b/src/main/java/org/bukkit/event/inventory/InventoryCloseEvent.java
@@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Represents a player related inventory event
@@ -28,7 +28,7 @@ import org.jetbrains.annotations.NotNull;
* on the next tick. Also be aware that this is not an exhaustive list, and
* other methods could potentially create issues as well.
*/
-public class InventoryCloseEvent extends InventoryEvent {
+public class InventoryCloseEvent extends InventoryEvent implements gg.projecteden.parchment.HasHumanEntity { // Parchment
@@ -892,7 +841,7 @@ index 21ad8888c0e403bfc63518502577d651c02dda05..1c59335a8f0a40162190f6fb73ffbfef
// Paper start
private final Reason reason;
diff --git a/src/main/java/org/bukkit/event/inventory/InventoryOpenEvent.java b/src/main/java/org/bukkit/event/inventory/InventoryOpenEvent.java
index ceae092eb782698803c6c3df41267dde20ba62b2..23e35e7e65bdf2e758dc8dc980b9427b7e4163a9 100644
index 8e2afeab4c62724148e8bb0c83fb7eec569c7a0c..2843fd117151dc75c87db06915a6732277867a0c 100644
--- a/src/main/java/org/bukkit/event/inventory/InventoryOpenEvent.java
+++ b/src/main/java/org/bukkit/event/inventory/InventoryOpenEvent.java
@@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull;
@@ -903,14 +852,14 @@ index ceae092eb782698803c6c3df41267dde20ba62b2..23e35e7e65bdf2e758dc8dc980b9427b
+public class InventoryOpenEvent extends InventoryEvent implements Cancellable, gg.projecteden.parchment.HasHumanEntity { // Parchment
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private net.kyori.adventure.text.Component titleOverride; // Paper
diff --git a/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java b/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java
index fc2d9e85b65347b90bde3b0b13ccae759e33d466..6b2e64fa9c0f3c0af88797d63557c333edf69a5d 100644
index ae02788536d0c6736aba4ccf812844df4f9789f1..327558fcf2aacf0df5a62399fc510c25fcf7cb38 100644
--- a/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java
+++ b/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java
@@ -14,7 +14,7 @@ import org.jetbrains.annotations.NotNull;
* <p>
* This event is asynchronous, and not run using main thread.
@@ -18,7 +18,7 @@ import org.jetbrains.annotations.NotNull;
* Consider rendering any translatable yourself with {@link net.kyori.adventure.translation.GlobalTranslator#render}
* if the client's language is known.
*/
-public class AsyncPlayerPreLoginEvent extends Event {
+public class AsyncPlayerPreLoginEvent extends Event implements gg.projecteden.api.interfaces.HasUniqueId { // Parchment
@@ -931,10 +880,10 @@ index f6d3b817de3001f04ea4554c7c39a1290af3fd6d..44efb5cc62149b34b994eadac488a902
public PlayerEvent(@NotNull final Player who) {
diff --git a/src/main/java/org/bukkit/event/player/PlayerPreLoginEvent.java b/src/main/java/org/bukkit/event/player/PlayerPreLoginEvent.java
index 6800132c6288b4588fd02b08d26f016c38f27129..8e333a361cdee30a83e9472285dfb0b30b2e72ca 100644
index 175ed12dd1698f4d153c9acdac8340c15a427ea5..5e14dc6968de1b146b31abef19fbba1af8c68b6f 100644
--- a/src/main/java/org/bukkit/event/player/PlayerPreLoginEvent.java
+++ b/src/main/java/org/bukkit/event/player/PlayerPreLoginEvent.java
@@ -16,7 +16,7 @@ import org.jetbrains.annotations.NotNull;
@@ -23,7 +23,7 @@ import org.jetbrains.annotations.NotNull;
*/
@Deprecated
@Warning(reason = "This event causes a login thread to synchronize with the main thread")
@@ -944,19 +893,18 @@ index 6800132c6288b4588fd02b08d26f016c38f27129..8e333a361cdee30a83e9472285dfb0b3
private Result result;
private net.kyori.adventure.text.Component message; // Paper
diff --git a/src/main/java/org/bukkit/event/player/PlayerUnleashEntityEvent.java b/src/main/java/org/bukkit/event/player/PlayerUnleashEntityEvent.java
index d63bd62606763d0902ea800f0c35a1cfd07fc8ec..97bb62b616f8f08ec697c14681ffe6d89934b526 100644
index d63bd62606763d0902ea800f0c35a1cfd07fc8ec..ecca20d51f8ac6f27887c55ae2aaa428ecb1ea53 100644
--- a/src/main/java/org/bukkit/event/player/PlayerUnleashEntityEvent.java
+++ b/src/main/java/org/bukkit/event/player/PlayerUnleashEntityEvent.java
@@ -10,8 +10,7 @@ import org.jetbrains.annotations.NotNull;
@@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Called prior to an entity being unleashed due to a player's action.
*/
-public class PlayerUnleashEntityEvent extends EntityUnleashEvent implements Cancellable {
-
+public class PlayerUnleashEntityEvent extends EntityUnleashEvent implements Cancellable, gg.projecteden.parchment.HasPlayer { // Parchment
private boolean cancelled = false;
private final Player player;
diff --git a/src/main/java/org/bukkit/event/raid/RaidTriggerEvent.java b/src/main/java/org/bukkit/event/raid/RaidTriggerEvent.java
index 128e43cf12205f82f2b119a773208502cdccfdd4..ca1fed3081e2b0a3271a2dfa0f49cce78bdb8e23 100644
--- a/src/main/java/org/bukkit/event/raid/RaidTriggerEvent.java
@@ -971,12 +919,12 @@ index 128e43cf12205f82f2b119a773208502cdccfdd4..ca1fed3081e2b0a3271a2dfa0f49cce7
private static final HandlerList handlers = new HandlerList();
//
diff --git a/src/main/java/org/bukkit/event/server/TabCompleteEvent.java b/src/main/java/org/bukkit/event/server/TabCompleteEvent.java
index 4a3451af454295ac3e1b688e6665cad9fc594c82..b88cebb219577d59cc338be89c6f391d10702095 100644
index c71c122ccc4775d030688f7b8df0b4feb49136f4..107c38d38f47771111606c8788d637c565925b40 100644
--- a/src/main/java/org/bukkit/event/server/TabCompleteEvent.java
+++ b/src/main/java/org/bukkit/event/server/TabCompleteEvent.java
@@ -19,7 +19,7 @@ import org.jetbrains.annotations.NotNull;
* advised to ensure the client does not have permission for the relevant
* commands, or use {@link PlayerCommandSendEvent}.
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.NotNull;
* @apiNote Only called for bukkit API commands {@link org.bukkit.command.Command} and
* {@link org.bukkit.command.CommandExecutor} and not for brigadier commands ({@link io.papermc.paper.command.brigadier.Commands}).
*/
-public class TabCompleteEvent extends Event implements Cancellable {
+public class TabCompleteEvent extends Event implements Cancellable, gg.projecteden.parchment.OptionalLocation { // Parchment
@@ -984,7 +932,7 @@ index 4a3451af454295ac3e1b688e6665cad9fc594c82..b88cebb219577d59cc338be89c6f391d
private static final HandlerList handlers = new HandlerList();
//
diff --git a/src/main/java/org/bukkit/event/world/GenericGameEvent.java b/src/main/java/org/bukkit/event/world/GenericGameEvent.java
index 2a2a329877d8da45c2d6afecf78ce88d52635cad..22cdf3662b02fb5751ac6d913d781084cd7eee5b 100644
index fb975fefc74d8c9746cab4c02860f55654cf92f7..172699ba31d1ee0697607125d75549930288dd5b 100644
--- a/src/main/java/org/bukkit/event/world/GenericGameEvent.java
+++ b/src/main/java/org/bukkit/event/world/GenericGameEvent.java
@@ -15,7 +15,7 @@ import org.jetbrains.annotations.Nullable;
@@ -997,7 +945,7 @@ index 2a2a329877d8da45c2d6afecf78ce88d52635cad..22cdf3662b02fb5751ac6d913d781084
private static final HandlerList handlers = new HandlerList();
private final GameEvent event;
diff --git a/src/main/java/org/bukkit/event/world/StructureGrowEvent.java b/src/main/java/org/bukkit/event/world/StructureGrowEvent.java
index 7af8d6e51c824cf0592b722b834f1d4986e3cc08..c28d62fc3dc359f9ebcf926094198ee3c92467aa 100644
index 783e74bc382f0f6d24203fde7b811f588a674731..c0f863b35cc7f508a33ddcb1af9ed6c52115efdc 100644
--- a/src/main/java/org/bukkit/event/world/StructureGrowEvent.java
+++ b/src/main/java/org/bukkit/event/world/StructureGrowEvent.java
@@ -14,7 +14,7 @@ import org.jetbrains.annotations.Nullable;
@@ -1023,20 +971,20 @@ index 0d519813c12d98b28d62e6d01d7ec6e8c2dba3c3..469b9cc0c4b77844ba0317af51bd9ad8
/**
* Returns the size of the inventory
diff --git a/src/main/java/org/bukkit/inventory/InventoryView.java b/src/main/java/org/bukkit/inventory/InventoryView.java
index daca40b63e95ea33178bcb54ad45911da591ca54..e9b5206851db890d7638ce94d793fb909be20307 100644
index 5c258b6077277575daa5d96349837bdf06f42500..f8fd3590df19d4930f54c0456f9cb7bab636f227 100644
--- a/src/main/java/org/bukkit/inventory/InventoryView.java
+++ b/src/main/java/org/bukkit/inventory/InventoryView.java
@@ -14,7 +14,7 @@ import org.jetbrains.annotations.Nullable;
* contracts of certain methods, there's no guarantee that the game will work
* as it should.
@@ -9,7 +9,7 @@ import org.jetbrains.annotations.Nullable;
* Represents a view linking two inventories and a single player (whose
* inventory may or may not be one of the two).
*/
-public abstract class InventoryView {
+public abstract class InventoryView implements gg.projecteden.parchment.HasHumanEntity { // Parchment
-public interface InventoryView {
+public interface InventoryView extends gg.projecteden.parchment.HasHumanEntity { // Parchment
public static final int OUTSIDE = -999;
/**
* Represents various extra properties of certain inventory windows.
diff --git a/src/main/java/org/bukkit/loot/LootContext.java b/src/main/java/org/bukkit/loot/LootContext.java
index 71b7aa9d675e1714e286e6fd4015ead036d912e0..95e120068a7c5c96b1b8553df9cf8654ba63a325 100644
index 9c1ccaed727ec5e5dad93146bbfda798e3f536e7..b4dc13b03d8a33ac13e8af6677e1a8418edc8e20 100644
--- a/src/main/java/org/bukkit/loot/LootContext.java
+++ b/src/main/java/org/bukkit/loot/LootContext.java
@@ -11,7 +11,7 @@ import org.jetbrains.annotations.Nullable;
@@ -1048,3 +996,27 @@ index 71b7aa9d675e1714e286e6fd4015ead036d912e0..95e120068a7c5c96b1b8553df9cf8654
public static final int DEFAULT_LOOT_MODIFIER = -1;
diff --git a/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java b/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java
index 07416cc9e2b8156be2cc92d6d974b881b427fd99..4f96ecb2f03b7ad84592d874462acb54a86303c9 100644
--- a/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java
+++ b/src/main/java/com/destroystokyo/paper/event/profile/PreLookupProfileEvent.java
@@ -22,7 +22,7 @@ import org.jspecify.annotations.Nullable;
* {@link Event#isAsynchronous()}
*/
@NullMarked
-public class PreLookupProfileEvent extends Event {
+public class PreLookupProfileEvent extends Event implements gg.projecteden.api.interfaces.OptionalUniqueId { // Parchment
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -55,6 +55,10 @@ public class PreLookupProfileEvent extends Event {
return this.uuid;
}
+ public UUID getUniqueId() {
+ return this.uuid;
+ }
+
/**
* Sets the UUID for this player name. This will skip the initial API call to find the players UUID.
* <p>

View File

@@ -6,12 +6,13 @@ Subject: [PATCH] Add SoundEvent
diff --git a/src/main/java/gg/projecteden/parchment/event/sound/SoundEvent.java b/src/main/java/gg/projecteden/parchment/event/sound/SoundEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..e612cecc89b060a9c0fc882754e45c0409febb9d
index 0000000000000000000000000000000000000000..14fa1d766f49eed2907214fc536222bae9167a85
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/event/sound/SoundEvent.java
@@ -0,0 +1,382 @@
@@ -0,0 +1,359 @@
+package gg.projecteden.parchment.event.sound;
+
+import gg.projecteden.parchment.HasLocation;
+import gg.projecteden.parchment.OptionalHumanEntity;
+import net.kyori.adventure.sound.Sound;
+import org.bukkit.Location;
@@ -34,7 +35,7 @@ index 0000000000000000000000000000000000000000..e612cecc89b060a9c0fc882754e45c04
+ * Called when a sound is sent to a player.
+ * Cancelling this event will prevent the packet from sending.
+ */
+public final class SoundEvent extends Event implements Cancellable, OptionalHumanEntity {
+public final class SoundEvent extends Event implements Cancellable {
+ private static final Logger LOGGER = org.slf4j.LoggerFactory.getLogger(SoundEvent.class);
+
+ private static final org.bukkit.event.HandlerList handlers = new org.bukkit.event.HandlerList();
@@ -59,16 +60,14 @@ index 0000000000000000000000000000000000000000..e612cecc89b060a9c0fc882754e45c04
+ private @NotNull Sound sound;
+ private @NotNull Emitter emitter;
+ private boolean cancelled;
+ private long seed;
+ private @Nullable BiFunction<@NotNull SoundEvent, @NotNull Player, @Nullable Sound> soundOverrideFunction;
+ private @Nullable BiFunction<@NotNull SoundEvent, @NotNull Player, @Nullable Emitter> emitterOverrideFunction;
+
+ public SoundEvent(@Nullable HumanEntity except, @NotNull Sound sound, @NotNull Emitter emitter, long seed, @Nullable Function<Sound, Double> distanceFunction, @Nullable Function<SoundEvent, List<Player>> recipientsFunction) {
+ public SoundEvent(@Nullable HumanEntity except, @NotNull Sound sound, @NotNull Emitter emitter, @Nullable Function<Sound, Double> distanceFunction, @Nullable Function<SoundEvent, List<Player>> recipientsFunction) {
+ super(true);
+ this.except = except;
+ this.sound = Objects.requireNonNull(sound, "sound cannot be null");
+ this.emitter = Objects.requireNonNull(emitter, "emitter cannot be null");
+ this.seed = seed;
+ this.distanceFunction = Objects.requireNonNullElse(distanceFunction, DEFAULT_DISTANCE_FUNCTION);
+ this.recipientsFunction = wrapRecipientsFunction(Objects.requireNonNullElse(recipientsFunction, DEFAULT_RECIPIENTS_FUNCTION));
+ }
@@ -77,18 +76,6 @@ index 0000000000000000000000000000000000000000..e612cecc89b060a9c0fc882754e45c04
+ * Gets the player that <b>won't</b> be receiving this sound.
+ *
+ * @return player excluded from receiving this sound
+ * @deprecated use {@link #getException()} for more clarity
+ */
+ @Override
+ @Deprecated
+ public @Nullable HumanEntity getPlayer() {
+ return getException();
+ }
+
+ /**
+ * Gets the player that <b>won't</b> be receiving this sound.
+ *
+ * @return player excluded from receiving this sound
+ */
+ public @Nullable HumanEntity getException() {
+ return except;
@@ -140,24 +127,6 @@ index 0000000000000000000000000000000000000000..e612cecc89b060a9c0fc882754e45c04
+ }
+
+ /**
+ * Gets the seed used to generate the sound.
+ *
+ * @return seed used to generate the sound
+ */
+ public long getSeed() {
+ return seed;
+ }
+
+ /**
+ * Sets the seed used to generate the sound.
+ *
+ * @param seed seed used to generate the sound
+ */
+ public void setSeed(long seed) {
+ this.seed = seed;
+ }
+
+ /**
+ * Calculates the distance of the sound.
+ * <p>
+ * The distance value is dynamically calculated using a
@@ -336,7 +305,7 @@ index 0000000000000000000000000000000000000000..e612cecc89b060a9c0fc882754e45c04
+
+ private record WrappedRecipientsFunction(@NotNull Function<SoundEvent, List<Player>> wrapped) implements Function<SoundEvent, List<Player>> {
+ @Override
+ public List<Player> apply(SoundEvent event) {
+ public @NotNull List<Player> apply(@NotNull SoundEvent event) {
+ List<Player> recipients = wrapped.apply(event);
+ HumanEntity except = event.getException();
+ if (except != null) {
@@ -362,14 +331,18 @@ index 0000000000000000000000000000000000000000..e612cecc89b060a9c0fc882754e45c04
+ /**
+ * The class which determines where a sound will emit from.
+ */
+ public sealed interface Emitter permits EntityEmitter, LocationEmitter {
+ public sealed interface Emitter extends HasLocation permits EntityEmitter, LocationEmitter {
+ /**
+ * Gets the location at which the sound will be played.
+ *
+ * @return sound's location
+ * @deprecated use {@link #getLocation()} instead
+ */
+ @NotNull
+ Location location();
+ @Deprecated
+ default Location location() {
+ return getLocation();
+ }
+ }
+
+ /**
@@ -379,7 +352,7 @@ index 0000000000000000000000000000000000000000..e612cecc89b060a9c0fc882754e45c04
+ */
+ public record EntityEmitter(@NotNull Entity entity) implements Emitter {
+ @Override
+ public @NotNull Location location() {
+ public @NotNull Location getLocation() {
+ return entity.getLocation();
+ }
+ }
@@ -390,5 +363,9 @@ index 0000000000000000000000000000000000000000..e612cecc89b060a9c0fc882754e45c04
+ * @param location the location from which the sound will be played
+ */
+ public record LocationEmitter(@NotNull Location location) implements Emitter {
+ @Override
+ public @NotNull Location getLocation() {
+ return location;
+ }
+ }
+}

View File

@@ -1,54 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: lexikiq <noellekiq@gmail.com>
Date: Fri, 18 Jun 2021 14:06:43 -0400
Subject: [PATCH] Add origin location to EntityDamageByBlockEvent
diff --git a/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java b/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java
index 461727dc7f06efb3550fc370e0db5bd04ba89711..f20ac2ba1921616f346c11ef60c53aba0080728b 100644
--- a/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java
@@ -12,17 +12,43 @@ import org.jetbrains.annotations.Nullable;
*/
public class EntityDamageByBlockEvent extends EntityDamageEvent {
private final Block damager;
+ private final org.bukkit.Location location; // Parchment
public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, final double damage) {
super(damagee, cause, damage);
this.damager = damager;
+ this.location = damager != null ? damager.getLocation() : null; // Parchment
}
public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final Map<DamageModifier, Double> modifiers, @NotNull final Map<DamageModifier, ? extends Function<? super Double, Double>> modifierFunctions) {
super(damagee, cause, modifiers, modifierFunctions);
this.damager = damager;
+ this.location = damager != null ? damager.getLocation() : null; // Parchment
}
+ // Parchment start
+ public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @Nullable final org.bukkit.Location damageLocation, @NotNull final Map<DamageModifier, Double> modifiers, @NotNull final Map<DamageModifier, ? extends Function<? super Double, Double>> modifierFunctions) {
+ super(damagee, cause, modifiers, modifierFunctions);
+ this.damager = damager;
+ if (damageLocation != null)
+ this.location = damageLocation;
+ else if (damager != null)
+ this.location = damager.getLocation();
+ else
+ this.location = null;
+ }
+
+ /**
+ * Gets the location of the damage source.
+ *
+ * @return Originating location of the damage source
+ */
+ @Nullable
+ public org.bukkit.Location getLocation() {
+ return location;
+ }
+ // Parchment end
+
/**
* Returns the block that damaged the player.
*

View File

@@ -0,0 +1,61 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: lexikiq <noellekiq@gmail.com>
Date: Fri, 18 Jun 2021 14:06:43 -0400
Subject: [PATCH] Add origin location to EntityDamageByBlockEvent
diff --git a/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java b/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java
index 148c4aad384ae8e3b8b22d264a84bddfbcafdf1e..61fcdd178fa5a8f13c889a78f431d2a5529c8c43 100644
--- a/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java
@@ -20,6 +20,7 @@ import org.jetbrains.annotations.Nullable;
public class EntityDamageByBlockEvent extends EntityDamageEvent {
private final Block damager;
private final BlockState damagerState;
+ private final org.bukkit.Location location; // Parchment
@Deprecated(forRemoval = true)
public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, final double damage) {
@@ -30,19 +31,40 @@ public class EntityDamageByBlockEvent extends EntityDamageEvent {
super(damagee, cause, damageSource, damage);
this.damager = damager;
this.damagerState = damagerState;
+ this.location = damager != null ? damager.getLocation() : null; // Parchment
}
@Deprecated(forRemoval = true)
public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final Map<DamageModifier, Double> modifiers, @NotNull final Map<DamageModifier, ? extends Function<? super Double, Double>> modifierFunctions) {
- this(damager, (damager != null) ? damager.getState() : null, damagee, cause, (damager != null) ? DamageSource.builder(DamageType.GENERIC).withDamageLocation(damager.getLocation()).build() : DamageSource.builder(DamageType.GENERIC).build(), modifiers, modifierFunctions);
+ this(damager, (damager != null) ? damager.getState() : null, damagee, cause, (damager != null) ? DamageSource.builder(DamageType.GENERIC).withDamageLocation(damager.getLocation()).build() : DamageSource.builder(DamageType.GENERIC).build(), modifiers, modifierFunctions, null);
}
- public EntityDamageByBlockEvent(@Nullable final Block damager, @Nullable final BlockState damagerState, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final DamageSource damageSource, @NotNull final Map<DamageModifier, Double> modifiers, @NotNull final Map<DamageModifier, ? extends Function<? super Double, Double>> modifierFunctions) {
+ public EntityDamageByBlockEvent(@Nullable final Block damager, @Nullable final BlockState damagerState, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final DamageSource damageSource, @NotNull final Map<DamageModifier, Double> modifiers, @NotNull final Map<DamageModifier, ? extends Function<? super Double, Double>> modifierFunctions, @Nullable final org.bukkit.Location damageLocation) { // Parchment
super(damagee, cause, damageSource, modifiers, modifierFunctions);
this.damager = damager;
this.damagerState = damagerState;
+ // Parchment start
+ if (damageLocation != null)
+ this.location = damageLocation;
+ else if (damager != null)
+ this.location = damager.getLocation();
+ else
+ this.location = null;
+ // Parchment end
}
+ /**
+ * Gets the location of the damage source.
+ *
+ * @return Originating location of the damage source
+ */
+ @Nullable
+ public org.bukkit.Location getLocation() {
+ return location;
+ }
+ // Parchment end
+
+
/**
* Returns the block that damaged the player.
*

View File

@@ -6,20 +6,19 @@ Subject: [PATCH] Expanded Adventure support
Adds support for Adventure in a few places where it was previously missing.
diff --git a/src/main/java/org/bukkit/ChatColor.java b/src/main/java/org/bukkit/ChatColor.java
index ea4ceb643239c26851bacbf45fc3f2efef3bb4be..eea8e60c363b6dc14383fb7758cbf41469f76425 100644
index 918a045165cdcde264bc24082b7afebb407271de..3f912d3fbf5fdef3b95f81585d2fcf76719d2d04 100644
--- a/src/main/java/org/bukkit/ChatColor.java
+++ b/src/main/java/org/bukkit/ChatColor.java
@@ -11,8 +11,7 @@ import org.jetbrains.annotations.Nullable;
/**
* All supported color values for chat
@@ -13,7 +13,7 @@ import org.jetbrains.annotations.Nullable;
* @deprecated ChatColor has been deprecated in favor of <a href="https://docs.advntr.dev/text.html">Adventure</a> API. See {@link net.kyori.adventure.text.format.NamedTextColor} for the adventure equivalent of pre-defined text colors
*/
-@Deprecated // Paper
@Deprecated // Paper
-public enum ChatColor {
+public enum ChatColor implements net.kyori.adventure.text.format.StyleBuilderApplicable, net.kyori.adventure.text.format.TextFormat { // Parchment
/**
* Represents black
*/
@@ -182,6 +181,13 @@ public enum ChatColor {
@@ -183,6 +183,13 @@ public enum ChatColor {
public net.md_5.bungee.api.ChatColor asBungee() {
return net.md_5.bungee.api.ChatColor.MAGIC;
}
@@ -27,41 +26,13 @@ index ea4ceb643239c26851bacbf45fc3f2efef3bb4be..eea8e60c363b6dc14383fb7758cbf414
+ // Parchment start
+ @Override
+ public void styleApply(net.kyori.adventure.text.format.Style.@NotNull Builder style) {
+ style.decorate(net.kyori.adventure.text.format.TextDecoration.OBFUSCATED);
+ style.apply(net.kyori.adventure.text.format.TextDecoration.OBFUSCATED);
+ }
+ // Parchment end
},
/**
* Makes the text bold.
@@ -192,6 +198,13 @@ public enum ChatColor {
public net.md_5.bungee.api.ChatColor asBungee() {
return net.md_5.bungee.api.ChatColor.BOLD;
}
+
+ // Parchment start
+ @Override
+ public void styleApply(net.kyori.adventure.text.format.Style.@NotNull Builder style) {
+ style.decorate(net.kyori.adventure.text.format.TextDecoration.BOLD);
+ }
+ // Parchment end
},
/**
* Makes a line appear through the text.
@@ -202,6 +215,13 @@ public enum ChatColor {
public net.md_5.bungee.api.ChatColor asBungee() {
return net.md_5.bungee.api.ChatColor.STRIKETHROUGH;
}
+
+ // Parchment start
+ @Override
+ public void styleApply(net.kyori.adventure.text.format.Style.@NotNull Builder style) {
+ style.decorate(net.kyori.adventure.text.format.TextDecoration.STRIKETHROUGH);
+ }
+ // Parchment end
},
/**
* Makes the text appear underlined.
@@ -212,6 +232,13 @@ public enum ChatColor {
@@ -213,6 +220,13 @@ public enum ChatColor {
public net.md_5.bungee.api.ChatColor asBungee() {
return net.md_5.bungee.api.ChatColor.UNDERLINE;
}
@@ -69,27 +40,13 @@ index ea4ceb643239c26851bacbf45fc3f2efef3bb4be..eea8e60c363b6dc14383fb7758cbf414
+ // Parchment start
+ @Override
+ public void styleApply(net.kyori.adventure.text.format.Style.@NotNull Builder style) {
+ style.decorate(net.kyori.adventure.text.format.TextDecoration.UNDERLINED);
+ style.apply(net.kyori.adventure.text.format.TextDecoration.UNDERLINED);
+ }
+ // Parchment end
},
/**
* Makes the text italic.
@@ -222,6 +249,13 @@ public enum ChatColor {
public net.md_5.bungee.api.ChatColor asBungee() {
return net.md_5.bungee.api.ChatColor.ITALIC;
}
+
+ // Parchment start
+ @Override
+ public void styleApply(net.kyori.adventure.text.format.Style.@NotNull Builder style) {
+ style.decorate(net.kyori.adventure.text.format.TextDecoration.ITALIC);
+ }
+ // Parchment end
},
/**
* Resets all previous chat colors or formats.
@@ -232,6 +266,16 @@ public enum ChatColor {
@@ -233,6 +247,16 @@ public enum ChatColor {
public net.md_5.bungee.api.ChatColor asBungee() {
return net.md_5.bungee.api.ChatColor.RESET;
}
@@ -106,14 +63,17 @@ index ea4ceb643239c26851bacbf45fc3f2efef3bb4be..eea8e60c363b6dc14383fb7758cbf414
};
/**
@@ -264,6 +308,13 @@ public enum ChatColor {
@@ -265,6 +289,16 @@ public enum ChatColor {
return net.md_5.bungee.api.ChatColor.RESET;
};
+ // Parchment start
+ @Override
+ public void styleApply(net.kyori.adventure.text.format.Style.@NotNull Builder style) {
+ if (isColor())
+ style.color(net.kyori.adventure.text.format.TextColor.color(asBungee().getColor().getRGB()));
+ else
+ style.decorate(net.kyori.adventure.text.format.TextDecoration.valueOf(name()));
+ }
+ // Parchment end
+
@@ -121,10 +81,10 @@ index ea4ceb643239c26851bacbf45fc3f2efef3bb4be..eea8e60c363b6dc14383fb7758cbf414
* Gets the char value associated with this color
*
diff --git a/src/main/java/org/bukkit/Color.java b/src/main/java/org/bukkit/Color.java
index e088390ec3fb87eeabc73dfe90e3544980c02e5b..5d4fbb08832fd0490a9375580f909beaf941e8fa 100644
index f8edb964c4af597b03a2de06c464cc06a96b791c..3957d290c606a50b59c7c421ea7c163f4625449c 100644
--- a/src/main/java/org/bukkit/Color.java
+++ b/src/main/java/org/bukkit/Color.java
@@ -16,7 +16,7 @@ import org.jetbrains.annotations.Nullable;
@@ -17,7 +17,7 @@ import org.jetbrains.annotations.Nullable;
* but subject to change.
*/
@SerializableAs("Color")
@@ -133,7 +93,7 @@ index e088390ec3fb87eeabc73dfe90e3544980c02e5b..5d4fbb08832fd0490a9375580f909bea
private static final int BIT_MASK = 0xff;
private static final int DEFAULT_ALPHA = 255;
@@ -309,6 +309,13 @@ public final class Color implements ConfigurationSerializable {
@@ -310,6 +310,13 @@ public final class Color implements ConfigurationSerializable {
return getAlpha() << 24 | getRed() << 16 | getGreen() << 8 | getBlue();
}
@@ -148,7 +108,7 @@ index e088390ec3fb87eeabc73dfe90e3544980c02e5b..5d4fbb08832fd0490a9375580f909bea
* Gets the color as an BGR integer.
*
diff --git a/src/main/java/org/bukkit/DyeColor.java b/src/main/java/org/bukkit/DyeColor.java
index bd213cabddd8752e609544f24cfba95405726155..7e89cadecde96f9c2394446669dc4d98df391940 100644
index 47df858e095c4423c20e49e029d72f0f50d2c924..c7504e017bc57df6903a2d76ce98e9fd4c35a7cc 100644
--- a/src/main/java/org/bukkit/DyeColor.java
+++ b/src/main/java/org/bukkit/DyeColor.java
@@ -8,7 +8,7 @@ import org.jetbrains.annotations.Nullable;

View File

@@ -5,13 +5,13 @@ Subject: [PATCH] Add UnsafeValues#canPlaceItemOn
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
index b92255a9c87620f46adb140689b1cd328a476d61..3ed52d016314c01293530fa760fa5faaf59586ed 100644
index a491dc40093e19b8d1900443ad613223fd7f3119..fa22e21eb7299f601649af515b9e554e050b1ae1 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -245,4 +245,17 @@ public interface UnsafeValues {
*/
void setBiomeKey(RegionAccessor accessor, int x, int y, int z, NamespacedKey biomeKey);
// Paper end
@@ -312,4 +312,18 @@ public interface UnsafeValues {
@NotNull java.util.List<net.kyori.adventure.text.Component> computeTooltipLines(@NotNull ItemStack itemStack, @NotNull io.papermc.paper.inventory.tooltip.TooltipContext tooltipContext, @Nullable org.bukkit.entity.Player player); // Paper - expose itemstack tooltip lines
ItemStack createEmptyStack(); // Paper - proxy ItemStack
+
+ // Parchment start
+ /**
@@ -25,4 +25,5 @@ index b92255a9c87620f46adb140689b1cd328a476d61..3ed52d016314c01293530fa760fa5faa
+ */
+ java.util.concurrent.CompletableFuture<Boolean> canPlaceItemOn(@org.jetbrains.annotations.NotNull ItemStack item, @org.jetbrains.annotations.Nullable gg.projecteden.parchment.OptionalHumanEntity player, @org.jetbrains.annotations.NotNull org.bukkit.block.Block block, @org.jetbrains.annotations.NotNull org.bukkit.block.BlockFace face);
+ // Parchment end
+
}

View File

@@ -5,14 +5,13 @@ Subject: [PATCH] Expose MCUtil Executors
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 8621dba7f10ab822b5b99ce0d05da58823605cb6..5603db21993429e974b037894400caf429ceba38 100644
index f55638eb8b315864052f9fe17ab4846e5e9d8dbb..ac7bd2a77f387e72f8862e8ea5af52f39d90265a 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
@@ -2136,4 +2136,20 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
@NotNull org.bukkit.potion.PotionBrewer getPotionBrewer();
// Paper end
+
@@ -2255,6 +2255,22 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@NotNull
UnsafeValues getUnsafe();
+ // Parchment start
+ /**
+ * Gets the executor which runs tasks on an asynchronous thread pool.
@@ -28,4 +27,7 @@ index 8621dba7f10ab822b5b99ce0d05da58823605cb6..5603db21993429e974b037894400caf4
+ @NotNull
+ java.util.concurrent.Executor getMainExecutor();
+ // Parchment end
}
+
// Spigot start
public class Spigot {

View File

@@ -9,7 +9,7 @@ Will eventually (hopefully) be replaced by a more extensive Paper PR with suppor
diff --git a/src/main/java/gg/projecteden/parchment/inventory/RecipeType.java b/src/main/java/gg/projecteden/parchment/inventory/RecipeType.java
new file mode 100644
index 0000000000000000000000000000000000000000..28c01caa9d6379046f6af6612719b40459a89d17
index 0000000000000000000000000000000000000000..ea17d99c7a1d70d88e2c439399cdb376b9dedf47
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/inventory/RecipeType.java
@@ -0,0 +1,50 @@
@@ -24,15 +24,15 @@ index 0000000000000000000000000000000000000000..28c01caa9d6379046f6af6612719b404
+ */
+ CRAFTING(false),
+ /**
+ * Recipes for smelting an item inside of a furnace.
+ * Recipes for smelting an item inside a furnace.
+ */
+ SMELTING(true),
+ /**
+ * Recipes for smelting an item inside of a blasting furnace.
+ * Recipes for smelting an item inside a blasting furnace.
+ */
+ BLASTING(true),
+ /**
+ * Recipes for smelting an item inside of a smoker.
+ * Recipes for smelting an item inside a smoker.
+ */
+ SMOKING(true),
+ /**
@@ -64,12 +64,12 @@ index 0000000000000000000000000000000000000000..28c01caa9d6379046f6af6612719b404
+ }
+}
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
index 6716a1185e733f3ddf56b295f3153938f57d4229..ccf72e766e34129fc5dd874c83d966b3fff4d2bd 100644
index 7a439c99fc4c5ee17d674460c8e58a9fe0c64e02..3cddbea3553ea12b610ffb1c9ab13d6ab4c291ee 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
@@ -4007,6 +4007,36 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@Nullable
public DragonBattle getEnderDragonBattle();
@@ -52,6 +52,36 @@ import org.jetbrains.annotations.Nullable;
*/
public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient, Metadatable, PersistentDataHolder, Keyed, net.kyori.adventure.audience.ForwardingAudience { // Paper
+ // Parchment start
+ /**
@@ -101,6 +101,6 @@ index 6716a1185e733f3ddf56b295f3153938f57d4229..ccf72e766e34129fc5dd874c83d966b3
+ ItemStack smeltItem(@NotNull ItemStack toSmelt, gg.projecteden.parchment.inventory.@NotNull RecipeType recipeType);
+ // Parchment end
+
// Paper start - void damage configuration
/**
* Represents various map environment types that a world may be
*/
* Checks if void damage is enabled on this world.

View File

@@ -20,7 +20,7 @@ index 2f07efac03f4d12fd2ae9a340d34cf92a90b6cfa..a16d681d5338fdb2a974a2c67dcc0155
+ *
+ * @return True if the entity is allowed to tick.
+ */
+ public boolean canTick();
+ default boolean canTick() { return true; }
+
+ /**
+ * Sets whether the hanging entity is allowed to tick.
@@ -28,6 +28,6 @@ index 2f07efac03f4d12fd2ae9a340d34cf92a90b6cfa..a16d681d5338fdb2a974a2c67dcc0155
+ *
+ * @param tick True if the entity is allowed to tick.
+ */
+ public void setCanTick(boolean tick);
+ default void setCanTick(boolean tick) { throw new UnsupportedOperationException(); }
+ // Parchment end
}

View File

@@ -5,11 +5,11 @@ Subject: [PATCH] Add Player#getHiddenEntities API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 64734c0ca89859294bde01da3dcaee6dc1840894..205cd1d53bef3a8d18315561543f815ede791570 100644
index aa21cd957cb0a4756cf0f27cef69fbd80e71c54e..d8014eea4f4415602db7e1199a2d9ce059adefaa 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
@@ -1597,6 +1597,17 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@org.jetbrains.annotations.ApiStatus.Experimental // Paper
@@ -2137,6 +2137,17 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public boolean canSee(@NotNull Entity entity);
+ // Parchment start
@@ -19,10 +19,10 @@ index 64734c0ca89859294bde01da3dcaee6dc1840894..205cd1d53bef3a8d18315561543f815e
+ * @param plugin Plugin that has hidden entities
+ * @return a view of hidden entity UUIDs
+ */
+ @org.jetbrains.annotations.ApiStatus.Experimental
+ public java.util.@NotNull Set<java.util.UUID> getHiddenEntities(@NotNull Plugin plugin);
+ // Parchment end
+
+
// Paper start
/**
* Checks to see if this player is currently flying or not.
*
* Returns whether the {@code other} player is listed for {@code this}.

View File

@@ -1,274 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Mon, 18 Jul 2022 20:15:42 -0400
Subject: [PATCH] Add Timings Events
diff --git a/src/main/java/co/aikar/timings/Timings.java b/src/main/java/co/aikar/timings/Timings.java
index 9812d668ad945aba486fbf6d5bf83c4292cb5d03..91429282ed8f30abbb969b426b34826c6e28b75d 100644
--- a/src/main/java/co/aikar/timings/Timings.java
+++ b/src/main/java/co/aikar/timings/Timings.java
@@ -23,6 +23,8 @@
*/
package co.aikar.timings;
+import co.aikar.timings.event.TimingsModifyEvent;
+import co.aikar.timings.event.TimingsModifyEvent.Action;
import com.google.common.base.Preconditions;
import com.google.common.collect.EvictingQueue;
import com.google.common.collect.Lists;
@@ -145,8 +147,25 @@ public final class Timings {
* @param enabled Should timings be reported
*/
public static void setTimingsEnabled(boolean enabled) {
+ setTimingsEnabled(enabled, null);
+ }
+
+ /**
+ * <p>Sets whether or not the Spigot Timings system should be enabled</p>
+ *
+ * Calls a {@link TimingsModifyEvent}, if cancelled the timings will not be reset
+ *
+ * @param enabled Should timings be reported
+ * @param sender The sender asking to reset
+ */
+ public static void setTimingsEnabled(boolean enabled, CommandSender sender) {
timingsEnabled = enabled;
warnAboutDeprecationOnEnable();
+ if (sender != null) {
+ if (!new co.aikar.timings.event.TimingsModifyEvent(sender, Action.RESET).callEvent()) {
+ return;
+ }
+ }
reset();
}
diff --git a/src/main/java/co/aikar/timings/TimingsCommand.java b/src/main/java/co/aikar/timings/TimingsCommand.java
index e801e79fa57c44b2e5d359647c920f88064826f1..0cbb970c42c3a71602ccd311a13e1f874067e2ae 100644
--- a/src/main/java/co/aikar/timings/TimingsCommand.java
+++ b/src/main/java/co/aikar/timings/TimingsCommand.java
@@ -63,12 +63,14 @@ public class TimingsCommand extends BukkitCommand {
}
final String arg = args[0];
if ("on".equalsIgnoreCase(arg)) {
- Timings.setTimingsEnabled(true);
- sender.sendMessage(text("Enabled Timings & Reset"));
+ if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.ENABLE).callEvent()) {
+ Timings.setTimingsEnabled(true, sender);
+ }
return true;
} else if ("off".equalsIgnoreCase(arg)) {
- Timings.setTimingsEnabled(false);
- sender.sendMessage(text("Disabled Timings"));
+ if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.DISABLE).callEvent()) {
+ Timings.setTimingsEnabled(false, sender);
+ }
return true;
}
@@ -79,20 +81,22 @@ public class TimingsCommand extends BukkitCommand {
long now = System.currentTimeMillis();
if ("verbon".equalsIgnoreCase(arg)) {
- Timings.setVerboseTimingsEnabled(true);
- sender.sendMessage(text("Enabled Verbose Timings"));
+ if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.VERBOSE_ON).callEvent()) {
+ Timings.setVerboseTimingsEnabled(true);
+ }
return true;
} else if ("verboff".equalsIgnoreCase(arg)) {
- Timings.setVerboseTimingsEnabled(false);
- sender.sendMessage(text("Disabled Verbose Timings"));
+ if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.VERBOSE_OFF).callEvent()) {
+ Timings.setVerboseTimingsEnabled(false);
+ }
return true;
} else if ("reset".equalsIgnoreCase(arg)) {
if (now - lastResetAttempt < 30000) {
- TimingsManager.reset();
- sender.sendMessage(text("Timings reset. Please wait 5-10 minutes before using /timings report.", NamedTextColor.RED));
+ if (new co.aikar.timings.event.TimingsModifyEvent(sender, co.aikar.timings.event.TimingsModifyEvent.Action.RESET).callEvent()) {
+ TimingsManager.reset();
+ }
} else {
lastResetAttempt = now;
- sender.sendMessage(text("WARNING: Timings v2 should not be reset. If you are experiencing lag, please wait 3 minutes and then issue a report. The best timings will include 10+ minutes, with data before and after your lag period. If you really want to reset, run this command again within 30 seconds.", NamedTextColor.RED));
}
} else if (
"paste".equalsIgnoreCase(arg) ||
diff --git a/src/main/java/co/aikar/timings/TimingsReportListener.java b/src/main/java/co/aikar/timings/TimingsReportListener.java
index 3af5b8ea795311582044c712de50d29412024b77..b509aa8d2b05e913277713308e2eea46e631a5df 100644
--- a/src/main/java/co/aikar/timings/TimingsReportListener.java
+++ b/src/main/java/co/aikar/timings/TimingsReportListener.java
@@ -59,7 +59,9 @@ public class TimingsReportListener implements net.kyori.adventure.audience.Forwa
@Override
public void sendMessage(final @NotNull net.kyori.adventure.identity.Identity source, final @NotNull net.kyori.adventure.text.Component message, final @NotNull net.kyori.adventure.audience.MessageType type) {
- net.kyori.adventure.audience.ForwardingAudience.super.sendMessage(source, message, type);
+ if (new co.aikar.timings.event.TimingsMessageEvent(this.senders, message).callEvent()) {
+ net.kyori.adventure.audience.ForwardingAudience.super.sendMessage(source, message, type);
+ }
}
@NotNull
@@ -70,7 +72,9 @@ public class TimingsReportListener implements net.kyori.adventure.audience.Forwa
@Override
public void sendMessage(@NotNull String message) {
- senders.forEach((sender) -> sender.sendMessage(message));
+ if (new co.aikar.timings.event.TimingsMessageEvent(this.senders, net.kyori.adventure.text.Component.text(message)).callEvent()) {
+ senders.forEach((sender) -> sender.sendMessage(message));
+ }
}
public void addConsoleIfNeeded() {
diff --git a/src/main/java/co/aikar/timings/event/TimingsEvent.java b/src/main/java/co/aikar/timings/event/TimingsEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..df78c90859999ec18c7b8758e0f1c71281e1abe4
--- /dev/null
+++ b/src/main/java/co/aikar/timings/event/TimingsEvent.java
@@ -0,0 +1,34 @@
+package co.aikar.timings.event;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Set;
+
+public abstract class TimingsEvent extends Event {
+
+ private final Set<CommandSender> audience;
+ private static final HandlerList handlers = new HandlerList();
+
+ public TimingsEvent(Set<CommandSender> audience) {
+ super(!Bukkit.isPrimaryThread());
+ this.audience = audience;
+ }
+
+ public Set<CommandSender> getAudience() {
+ return this.audience;
+ }
+
+ @Override
+ public @NotNull HandlerList getHandlers() {
+ return handlers;
+ }
+
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+
+}
diff --git a/src/main/java/co/aikar/timings/event/TimingsGenerateReportEvent.java b/src/main/java/co/aikar/timings/event/TimingsGenerateReportEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ed7d1d4972842e93e2a9c2ffa799e6fc9136e63
--- /dev/null
+++ b/src/main/java/co/aikar/timings/event/TimingsGenerateReportEvent.java
@@ -0,0 +1,19 @@
+package co.aikar.timings.event;
+
+import org.bukkit.command.CommandSender;
+
+import java.util.Collections;
+
+public class TimingsGenerateReportEvent extends TimingsEvent {
+
+ private final String paste;
+
+ public TimingsGenerateReportEvent(CommandSender sender, String paste) {
+ super(Collections.singleton(sender));
+ this.paste = paste;
+ }
+
+ public String getPaste() {
+ return this.paste;
+ }
+}
diff --git a/src/main/java/co/aikar/timings/event/TimingsMessageEvent.java b/src/main/java/co/aikar/timings/event/TimingsMessageEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..04ec925cfa9e385e8ad4763b18570b7bf07c4007
--- /dev/null
+++ b/src/main/java/co/aikar/timings/event/TimingsMessageEvent.java
@@ -0,0 +1,33 @@
+package co.aikar.timings.event;
+
+import net.kyori.adventure.text.Component;
+import org.bukkit.command.CommandSender;
+import org.bukkit.event.Cancellable;
+
+import java.util.HashSet;
+import java.util.List;
+
+public class TimingsMessageEvent extends TimingsEvent implements Cancellable {
+
+ public Component message;
+ private boolean cancelled;
+
+ public TimingsMessageEvent(List<CommandSender> senders, Component message) {
+ super(new HashSet<>(senders));
+ this.message = message;
+ }
+
+ public Component getMessage() {
+ return this.message;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+}
diff --git a/src/main/java/co/aikar/timings/event/TimingsModifyEvent.java b/src/main/java/co/aikar/timings/event/TimingsModifyEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..1fe9bbedf23fdf7b02de02f5d184d8d956c7056b
--- /dev/null
+++ b/src/main/java/co/aikar/timings/event/TimingsModifyEvent.java
@@ -0,0 +1,40 @@
+package co.aikar.timings.event;
+
+import org.bukkit.command.CommandSender;
+import org.bukkit.event.Cancellable;
+
+import java.util.Collections;
+
+public class TimingsModifyEvent extends TimingsEvent implements Cancellable {
+
+ private final Action action;
+ private boolean cancelled = false;
+
+ public TimingsModifyEvent(CommandSender sender, Action action) {
+ super(Collections.singleton(sender));
+ this.action = action;
+ }
+
+ public Action getAction() {
+ return this.action;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return this.cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ public enum Action {
+ ENABLE,
+ DISABLE,
+ RESET,
+ VERBOSE_ON,
+ VERBOSE_OFF
+ }
+
+}

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Expanded Insomnia API methods
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 205cd1d53bef3a8d18315561543f815ede791570..bb67075d04e31865b48e8436876ecf6f342d4d8b 100644
index d8014eea4f4415602db7e1199a2d9ce059adefaa..b68feadfb631672b4b99b464fb1b6aae6e82507f 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
@@ -49,6 +49,45 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@@ -68,6 +68,45 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
@Override
@NotNull Player getPlayer();

View File

@@ -5,14 +5,14 @@ Subject: [PATCH] Add NPC to EntityType
diff --git a/src/main/java/org/bukkit/entity/EntityType.java b/src/main/java/org/bukkit/entity/EntityType.java
index ee3a3bda9a5b9cf3bcabf80ee3c653a2959fab0c..3e9bf06682373686d0c6f40defc56f23e785cd4b 100644
index c1aa59bab82aee8fd42f7149c520b45660b29082..6e1b2721b1ff69239ce6cf726c50974e76c78f1f 100644
--- a/src/main/java/org/bukkit/entity/EntityType.java
+++ b/src/main/java/org/bukkit/entity/EntityType.java
@@ -297,6 +297,7 @@ public enum EntityType implements Keyed, Translatable, net.kyori.adventure.trans
*/
LIGHTNING("lightning_bolt", LightningStrike.class, -1, false),
PLAYER("player", Player.class, -1, false),
+ NPC("npc", NPC.class, -1, true),
@@ -352,6 +352,7 @@ public enum EntityType implements Keyed, Translatable, net.kyori.adventure.trans
/**
* An unknown entity without an Entity Class
*/
+ NPC("npc", NPC.class, -1, true),
UNKNOWN(null, null, -1, false);
private final String name;

View File

@@ -5,24 +5,24 @@ Subject: [PATCH] Revert BungeeChat Deprecation
diff --git a/build.gradle.kts b/build.gradle.kts
index cad12a2632b9ebb569280441c42869685db1f31a..50014fbac3aa4f8c7c930405ca89f9cdb83b771c 100644
index 7dab3328c111b9d4e06a37f25f03708870f4bab9..eefb9b19fb76689a5e7ba86a17ef7117ad67789b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -25,7 +25,7 @@ dependencies {
// api dependencies are listed transitively to API consumers
api("com.google.guava:guava:31.1-jre")
api("com.google.code.gson:gson:2.10")
- api("net.md-5:bungeecord-chat:1.16-R0.4-deprecated+build.9") // Paper
+ api("net.md-5:bungeecord-chat:1.16-R0.4") // Parchment - revert
api("org.yaml:snakeyaml:1.33")
api("org.joml:joml:1.10.5")
// Paper start
@@ -106,7 +106,7 @@ tasks.withType<Javadoc> {
"https://javadoc.io/doc/org.yaml/snakeyaml/1.33/",
"https://javadoc.io/doc/org.jetbrains/annotations/23.0.0/", // Paper - we don't want Java 5 annotations
// Paper start
- //"https://javadoc.io/doc/net.md-5/bungeecord-chat/1.16-R0.4/", // don't link to bungee chat
+ "https://javadoc.io/doc/net.md-5/bungeecord-chat/1.16-R0.4/", // don't link to bungee chat // Parchment - revert
"https://jd.advntr.dev/api/$adventureVersion/",
"https://jd.advntr.dev/text-minimessage/$adventureVersion/",
"https://jd.advntr.dev/text-serializer-gson/$adventureVersion/",
@@ -48,7 +48,7 @@ dependencies {
api("com.google.guava:guava:32.1.2-jre")
api("com.google.code.gson:gson:2.10.1")
// Paper start - adventure
- api("net.md-5:bungeecord-chat:$bungeeCordChatVersion-deprecated+build.18") {
+ api("net.md-5:bungeecord-chat:$bungeeCordChatVersion") { // Parchment - revert
exclude("com.google.guava", "guava")
}
// Paper - adventure
@@ -172,7 +172,7 @@ tasks.withType<Javadoc> {
"https://guava.dev/releases/32.1.2-jre/api/docs/",
"https://javadoc.io/doc/org.yaml/snakeyaml/2.2/",
"https://javadoc.io/doc/org.jetbrains/annotations/$annotationsVersion/", // Paper - we don't want Java 5 annotations
- // "https://javadoc.io/doc/net.md-5/bungeecord-chat/$bungeeCordChatVersion/", // Paper - don't link to bungee chat
+ "https://javadoc.io/doc/net.md-5/bungeecord-chat/$bungeeCordChatVersion/", // Paper - don't link to bungee chat
// Paper start - add missing javadoc links
"https://javadoc.io/doc/org.joml/joml/1.10.5/index.html",
"https://www.javadoc.io/doc/com.google.code.gson/gson/2.10.1",

View File

@@ -6,7 +6,7 @@ Subject: [PATCH] Add PreEntityShootBowEvent
diff --git a/src/main/java/gg/projecteden/parchment/event/entity/PreEntityShootBowEvent.java b/src/main/java/gg/projecteden/parchment/event/entity/PreEntityShootBowEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..7368e7b039882dd629d187502c5c90d74471590e
index 0000000000000000000000000000000000000000..cd156e2d71728f8d30a12df87398875b1ec8915e
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/event/entity/PreEntityShootBowEvent.java
@@ -0,0 +1,61 @@
@@ -23,22 +23,22 @@ index 0000000000000000000000000000000000000000..7368e7b039882dd629d187502c5c90d7
+public class PreEntityShootBowEvent extends EntityEvent implements Cancellable {
+ private static final HandlerList handlers = new HandlerList();
+
+ private final ItemStack bow;
+ private final ItemStack arrow;
+ private final @NotNull ItemStack bow;
+ private final @NotNull ItemStack arrow;
+ boolean relative = true;
+ boolean cancelled = false;
+
+ public PreEntityShootBowEvent(Entity entity, ItemStack bow, ItemStack arrow) {
+ public PreEntityShootBowEvent(@NotNull Entity entity, @NotNull ItemStack bow, @NotNull ItemStack arrow) {
+ super(entity);
+ this.bow = bow;
+ this.arrow = arrow;
+ }
+
+ public ItemStack getBow() {
+ public @NotNull ItemStack getBow() {
+ return this.bow;
+ }
+
+ public ItemStack getArrow() {
+ public @NotNull ItemStack getArrow() {
+ return this.arrow;
+ }
+

View File

@@ -0,0 +1,31 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Fri, 15 Dec 2023 20:29:34 -0500
Subject: [PATCH] Add Block BreakNaturally Overload
diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java
index ec7bb05c4fc2f0f1eb42c77dbe5e3eb6c340bdef..3d07006fbab3f075aa72114773ad8e76686b0ad2 100644
--- a/src/main/java/org/bukkit/block/Block.java
+++ b/src/main/java/org/bukkit/block/Block.java
@@ -594,6 +594,20 @@ public interface Block extends Metadatable, Translatable, net.kyori.adventure.tr
*/
boolean breakNaturally(@NotNull ItemStack tool, boolean triggerEffect, boolean dropExperience);
+ // Parchment Start
+ /**
+ * Breaks the block and spawns item drops as if a player had broken it
+ * with a specific tool
+ *
+ * @param player The player to break the block as
+ * @param tool The tool or item in hand used for digging
+ * @param triggerEffect Play the block break particle effect and sound
+ * @param dropExperience drop exp if the block normally does so
+ * @return true if the block was destroyed
+ */
+ boolean breakNaturally(Player player, @NotNull ItemStack tool, boolean triggerEffect, boolean dropExperience);
+ // Parchment end
+
/**
* Causes the block to be ticked, this is different from {@link Block#randomTick()},
* in that it is usually scheduled to occur, for example

View File

@@ -0,0 +1,82 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Thu, 21 Dec 2023 20:26:53 -0500
Subject: [PATCH] Add CustomBlockUpdateEvent
diff --git a/src/main/java/gg/projecteden/parchment/event/block/CustomBlockUpdateEvent.java b/src/main/java/gg/projecteden/parchment/event/block/CustomBlockUpdateEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..f99a67efe3582038fc5500c017a1c1371022985b
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/event/block/CustomBlockUpdateEvent.java
@@ -0,0 +1,70 @@
+package gg.projecteden.parchment.event.block;
+
+import org.bukkit.block.data.BlockData;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.Event;
+import org.bukkit.Location;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+public class CustomBlockUpdateEvent extends Event implements Cancellable {
+
+ private static final HandlerList handlers = new HandlerList();
+ private boolean cancelled;
+
+ private BlockData block;
+ private UpdateType updateType;
+ private Location location;
+
+ public CustomBlockUpdateEvent(BlockData block, UpdateType updateType, Location location) {
+ this.block = block;
+ this.updateType = updateType;
+ this.location = location;
+ }
+
+ public CustomBlockUpdateEvent(BlockData block, UpdateType updateType) {
+ this.block = block;
+ this.updateType = updateType;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return this.cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ public BlockData getBlock() {
+ return block;
+ }
+
+ public UpdateType getUpdateType() {
+ return updateType;
+ }
+
+ public Location getLocation() {
+ return location;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+
+ public enum UpdateType {
+ POWERED,
+ SHAPE,
+ INSTRUMENT,
+ PITCH
+ }
+
+}

View File

@@ -0,0 +1,273 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Mon, 15 Jan 2024 16:38:52 -0500
Subject: [PATCH] Entity Data Storage
diff --git a/src/main/java/gg/projecteden/parchment/entity/EntityData.java b/src/main/java/gg/projecteden/parchment/entity/EntityData.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4b2cd54c6c0d595e67b0fa0f05a32afa40328b3
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/entity/EntityData.java
@@ -0,0 +1,140 @@
+package gg.projecteden.parchment.entity;
+
+import org.bukkit.entity.Entity;
+
+import java.util.*;
+import java.util.function.Supplier;
+
+public final class EntityData {
+ private static final Map<UUID, List<DataSlot>> PARKED = new HashMap<>();
+ private static int DATA_IDX;
+
+ private final List<EntityDataFragment<?>> data = new ArrayList<>();
+ private final Class<?> ownerType;
+ private Entity owner;
+
+ EntityData(Class<?> ownerType) {
+ this.ownerType = ownerType;
+ }
+
+ public static <T extends EntityDataFragment<E>, E extends Entity> EntityDataKey<T, E> createKey(
+ Supplier<T> generator,
+ Class<E> ownerType
+ ) {
+ return new EntityDataKey<>(ownerType, generator, EntityData.DATA_IDX++);
+ }
+
+ public static EntityData create(Entity entity) {
+ EntityData data = new EntityData(entity.getClass());
+
+ List<DataSlot> slots = EntityData.PARKED.get(entity.getUniqueId());
+ if (slots != null) {
+ for (DataSlot slot : slots) {
+ data.set(slot.idx, slot.data);
+ }
+ }
+
+ data.setOwner(entity);
+
+ return data;
+ }
+
+ public <T extends EntityDataFragment<E>, E extends Entity> T get(EntityDataKey<T, E> key) {
+ while (this.data.size() <= key.getIdx()) {
+ this.data.add(null);
+ }
+
+ T out = cast(this.data.get(key.getIdx()));
+ if (out == null) {
+ this.checkEntityType(key.ownerType);
+
+ out = key.getGenerator().get();
+ out.setOwner(cast(this.owner));
+
+ this.data.set(key.getIdx(), out);
+ }
+
+ return out;
+ }
+
+ public <T extends EntityDataFragment<E>, E extends Entity> boolean clear(EntityDataKey<T, E> key) {
+ if (this.data.size() <= key.getIdx()) {
+ return false;
+ }
+
+ this.checkEntityType(key.ownerType);
+ return this.data.set(key.getIdx(), null) != null;
+ }
+
+ public void orphan() {
+ for (EntityDataFragment<?> frag : this.data) {
+ if (frag != null) {
+ frag.onOrphan();
+ }
+ }
+
+ List<DataSlot> persist = new ArrayList<>();
+
+ for (int i = this.data.size() - 1; i >= 0; i--) {
+ EntityDataFragment<?> frag = this.data.get(i);
+ if (frag != null && frag.isPersistent()) {
+ persist.add(new DataSlot(frag, i));
+ }
+ }
+
+ if (!persist.isEmpty()) {
+ EntityData.PARKED.put(this.owner.getUniqueId(), persist);
+ }
+ }
+
+ void set(int slot, EntityDataFragment<?> data) {
+ while (this.data.size() <= slot) {
+ this.data.add(null);
+ }
+
+ this.data.set(slot, data);
+ }
+
+ void setOwner(Entity entity) {
+ Class<?> ownerType = entity.getClass();
+ if (!ownerType.equals(this.ownerType)) {
+ throw new IllegalArgumentException(String.format(
+ "Wrong entity type. (entity=%s@%s, expect=%s@%s)",
+ ownerType, ownerType.getClassLoader(),
+ this.ownerType, this.ownerType.getClassLoader()
+ ));
+ }
+
+ this.owner = entity;
+
+ for (EntityDataFragment<?> frag : this.data) {
+ if (frag != null) {
+ frag.setOwner(cast(entity));
+ }
+ }
+ }
+
+ private void checkEntityType(Class<?> ownerType) {
+ if (!ownerType.isAssignableFrom(this.ownerType)) {
+ throw new IllegalArgumentException(String.format(
+ "Incompatible entity types. (key=%s@%s, expect=%s@%s)",
+ ownerType, ownerType.getClassLoader(),
+ this.ownerType, this.ownerType.getClassLoader()
+ ));
+ }
+ }
+
+ private <S, T> T cast(S src) {
+ return (T) src;
+ }
+
+ private static final class DataSlot {
+ private final EntityDataFragment<?> data;
+ private final int idx;
+
+ private DataSlot(EntityDataFragment<?> data, int idx) {
+ this.data = data;
+ this.idx = idx;
+ }
+ }
+}
diff --git a/src/main/java/gg/projecteden/parchment/entity/EntityDataFragment.java b/src/main/java/gg/projecteden/parchment/entity/EntityDataFragment.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3d43c27a61155036e3f74e781da14ab0bc58d5f
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/entity/EntityDataFragment.java
@@ -0,0 +1,34 @@
+package gg.projecteden.parchment.entity;
+
+import org.bukkit.entity.Entity;
+
+public abstract class EntityDataFragment<E extends Entity> {
+ private E owner;
+ private boolean persistent = true;
+
+ protected EntityDataFragment() {
+ }
+
+ protected void onOwnerChange() {
+ }
+
+ protected void onOrphan() {
+ }
+
+ protected final E getOwner() {
+ return this.owner;
+ }
+
+ protected final void setPersistent(boolean persistent) {
+ this.persistent = persistent;
+ }
+
+ final boolean isPersistent() {
+ return this.persistent;
+ }
+
+ final void setOwner(E entity) {
+ this.owner = entity;
+ this.onOwnerChange();
+ }
+}
diff --git a/src/main/java/gg/projecteden/parchment/entity/EntityDataKey.java b/src/main/java/gg/projecteden/parchment/entity/EntityDataKey.java
new file mode 100644
index 0000000000000000000000000000000000000000..c52c8371b2edf4f62533ffcbc7f8d7b1dbc90777
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/entity/EntityDataKey.java
@@ -0,0 +1,27 @@
+package gg.projecteden.parchment.entity;
+
+import org.bukkit.entity.Entity;
+
+import java.util.function.Supplier;
+
+public final class EntityDataKey<T extends EntityDataFragment<E>, E extends Entity> {
+ private final Supplier<T> generator;
+ private final int idx;
+
+ final Class<E> ownerType;
+
+ EntityDataKey(Class<E> ownerType, Supplier<T> generator, int idx) {
+ this.generator = generator;
+ this.idx = idx;
+
+ this.ownerType = ownerType;
+ }
+
+ Supplier<T> getGenerator() {
+ return this.generator;
+ }
+
+ int getIdx() {
+ return this.idx;
+ }
+}
diff --git a/src/main/java/gg/projecteden/parchment/entity/EntityDataServiceKey.java b/src/main/java/gg/projecteden/parchment/entity/EntityDataServiceKey.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9f9c0d235f33925ee247ba4af56bf9f31bf7056
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/entity/EntityDataServiceKey.java
@@ -0,0 +1,30 @@
+package gg.projecteden.parchment.entity;
+
+public final class EntityDataServiceKey<S> {
+ private final Class<S> serviceType;
+ private S service;
+
+ public EntityDataServiceKey(Class<S> serviceType) {
+ this.serviceType = serviceType;
+ }
+
+ public S get() {
+ if (this.service == null) {
+ throw new IllegalStateException("Service is not initialized.");
+ }
+
+ return this.service;
+ }
+
+ public void set(S service) {
+ if (this.service != null) {
+ throw new IllegalStateException("Service is already initialized.");
+ }
+
+ if (!this.serviceType.isInstance(service)) {
+ throw new IllegalArgumentException("Value does not implement service contract.");
+ }
+
+ this.service = service;
+ }
+}
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
index 87cea10a668d3040906a4dd1fd135c2162d9617f..b8bdac918e8a49bef2bf09312eb6d71d373eb517 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
@@ -1172,4 +1172,7 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
*/
void broadcastHurtAnimation(@NotNull java.util.Collection<Player> players);
// Paper end - broadcast hurt animation
+
+ gg.projecteden.parchment.entity.EntityData getStoredEntityData();
+
}

View File

@@ -0,0 +1,361 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Mon, 15 Jan 2024 20:53:14 -0500
Subject: [PATCH] Add Sidebar Utility
diff --git a/src/main/java/gg/projecteden/parchment/sidebar/Sidebar.java b/src/main/java/gg/projecteden/parchment/sidebar/Sidebar.java
new file mode 100644
index 0000000000000000000000000000000000000000..b0c704387e566d76d097595c35d06d8e5cbe204f
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/sidebar/Sidebar.java
@@ -0,0 +1,123 @@
+package gg.projecteden.parchment.sidebar;
+
+import gg.projecteden.parchment.entity.EntityData;
+import gg.projecteden.parchment.entity.EntityDataFragment;
+import gg.projecteden.parchment.entity.EntityDataKey;
+import org.bukkit.entity.Player;
+
+import java.util.Objects;
+
+public final class Sidebar extends EntityDataFragment<Player> {
+ private static final EntityDataKey<Sidebar, Player> DATA_KEY = EntityData.createKey(Sidebar::new, Player.class);
+
+ private final SidebarBuffer[] buffer = new SidebarBuffer[2];
+
+ private final StageImpl stage = new StageImpl();
+ private final Runnable layoutListener;
+
+ private SidebarLayout layout;
+
+ private boolean visible;
+ private int back;
+
+ public static Sidebar get(Player player) {
+ Objects.requireNonNull(player);
+
+ return player.getStoredEntityData().get(Sidebar.DATA_KEY);
+ }
+
+ private Sidebar() {
+ this.buffer[0] = SidebarBufferUtilSpec.IMPL_KEY.get().create("_sidebar_l");
+ this.buffer[1] = SidebarBufferUtilSpec.IMPL_KEY.get().create("_sidebar_r");
+
+ this.layoutListener = () -> {
+ this.layout.update(this.stage);
+ this.flush();
+ };
+
+ this.setPersistent(false);
+ }
+
+ public void applyLayout(SidebarLayout layout) {
+ if (this.layout != null) {
+ this.layout.unsubscribe(this.layoutListener);
+ this.buffer[this.back].clear();
+ }
+
+ this.layout = layout;
+
+ if (layout == null) {
+ this.hide();
+ } else {
+ layout.setup(this.stage);
+ this.flush();
+
+ layout.subscribe(this.layoutListener);
+ }
+ }
+
+ private void setTitle(String title) {
+ this.buffer[this.back].setTitle(title);
+ }
+
+ private void setLine(int idx, String value, String display) {
+ if (value == null) {
+ this.buffer[this.back].clearLine(idx);
+ } else {
+ this.buffer[this.back].setLine(idx, value, display);
+ }
+ }
+
+ private void flush() {
+ SidebarBuffer front = this.buffer[this.back];
+ SidebarBuffer back = this.buffer[this.back ^ 1];
+ boolean shouldShow = !this.visible;
+
+ if (front.hasDiverged(back)) {
+ front.pushChanges();
+
+ back.sync(front);
+ this.back ^= 1;
+
+ shouldShow = true;
+ }
+
+ if (shouldShow) {
+ front.setActive();
+ this.visible = true;
+ }
+ }
+
+ private void hide() {
+ SidebarBufferUtilSpec.IMPL_KEY.get().hideSidebar(this.getOwner());
+ this.visible = false;
+ }
+
+ @Override
+ protected void onOwnerChange() {
+ this.buffer[0].setOwner(this.getOwner());
+ this.buffer[1].setOwner(this.getOwner());
+
+ if (this.visible) {
+ this.buffer[this.back ^ 1].setActive();
+ }
+ }
+
+ private final class StageImpl implements SidebarStage {
+ @Override
+ public void setTitle(String title) {
+ Sidebar.this.setTitle(title);
+ }
+
+ @Override
+ public void setLine(int line, String value) {
+ this.setLine(line, value, null);
+ }
+
+ @Override
+ public void setLine(int line, String value, String display) {
+ Sidebar.this.setLine(line, value, display);
+ }
+
+ }
+}
diff --git a/src/main/java/gg/projecteden/parchment/sidebar/SidebarBuffer.java b/src/main/java/gg/projecteden/parchment/sidebar/SidebarBuffer.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec13738dc625464d7fa41484ee44583ef82248fd
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/sidebar/SidebarBuffer.java
@@ -0,0 +1,100 @@
+package gg.projecteden.parchment.sidebar;
+
+import org.bukkit.entity.Player;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+public abstract class SidebarBuffer {
+
+ @SuppressWarnings("StringOperationCanBeSimplified")
+ private static final String AUTO_SPACE = new String();
+ protected final String name;
+ protected final int size;
+ protected final String[] liveLines;
+ protected final String[] stagedLines;
+ protected final String[] liveDisplays;
+ protected final String[] stagedDisplays;
+
+ protected String liveTitle = "";
+ protected String stagedTitle = "";
+
+ protected SidebarBuffer(String name, int size) {
+ this.name = name;
+ this.size = size;
+ this.liveLines = new String[size];
+ this.stagedLines = new String[size];
+ this.liveDisplays = new String[size];
+ this.stagedDisplays = new String[size];
+ }
+
+ protected abstract void setActive();
+
+ protected abstract void pushChanges();
+
+ protected abstract void setOwner(Player player);
+
+ protected abstract boolean checkTitle(String title);
+
+ protected abstract boolean checkLine(String line);
+
+ void setTitle(String title) {
+ this.stagedTitle = Objects.requireNonNullElse(title, "");
+ }
+
+ void setLine(int line, String value, String display) {
+ Objects.requireNonNull(value);
+ if (line < 0 || line > this.size - 1) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ this.stagedLines[line] = value;
+ this.stagedDisplays[line] = display;
+
+ for (int i = line - 1; i >= 0; i--) {
+ if (this.stagedLines[i] == null) {
+ this.stagedLines[i] = SidebarBuffer.AUTO_SPACE;
+ } else {
+ break;
+ }
+ }
+ }
+
+ void clearLine(int line) {
+ if (line < 0 || line > this.size - 1) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ this.stagedLines[line] = SidebarBuffer.AUTO_SPACE;
+
+ if (line + 1 == this.size || this.stagedLines[line + 1] == null) {
+ for (int i = line; i >= 0; i--) {
+ if (this.stagedLines[i] == SidebarBuffer.AUTO_SPACE) {
+ this.stagedLines[i] = null;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+
+ void sync(SidebarBuffer live) {
+ this.stagedTitle = live.liveTitle;
+ System.arraycopy(live.liveLines, 0, this.stagedLines, 0, this.size);
+ System.arraycopy(live.liveDisplays, 0, this.stagedDisplays, 0, this.size);
+ }
+
+ void clear() {
+ this.stagedTitle = "";
+ Arrays.fill(this.stagedLines, null);
+ Arrays.fill(this.stagedDisplays, null);
+ }
+
+ boolean hasDiverged(SidebarBuffer live) {
+ boolean out = !Objects.equals(this.stagedTitle, live.liveTitle);
+ out = out || !Arrays.equals(this.stagedLines, live.liveLines);
+ out = out || !Arrays.equals(this.stagedDisplays, live.liveDisplays);
+
+ return out;
+ }
+}
diff --git a/src/main/java/gg/projecteden/parchment/sidebar/SidebarBufferUtilSpec.java b/src/main/java/gg/projecteden/parchment/sidebar/SidebarBufferUtilSpec.java
new file mode 100644
index 0000000000000000000000000000000000000000..22239d7ea5d632f306caba0d139fe1576e85a7dc
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/sidebar/SidebarBufferUtilSpec.java
@@ -0,0 +1,12 @@
+package gg.projecteden.parchment.sidebar;
+
+import gg.projecteden.parchment.entity.EntityDataServiceKey;
+import org.bukkit.entity.Player;
+
+public interface SidebarBufferUtilSpec {
+ EntityDataServiceKey<SidebarBufferUtilSpec> IMPL_KEY = new EntityDataServiceKey<>(SidebarBufferUtilSpec.class);
+
+ SidebarBuffer create(String bufferName);
+
+ void hideSidebar(Player player);
+}
diff --git a/src/main/java/gg/projecteden/parchment/sidebar/SidebarLayout.java b/src/main/java/gg/projecteden/parchment/sidebar/SidebarLayout.java
new file mode 100644
index 0000000000000000000000000000000000000000..238d2c1338aee95b24fd31c9643e0f966fe0b79f
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/sidebar/SidebarLayout.java
@@ -0,0 +1,58 @@
+package gg.projecteden.parchment.sidebar;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * A sidebar layout. Subclasses can describe custom layouts by using the
+ * {@link #setup(SidebarStage)} and {@link #update(SidebarStage)} hooks.
+ */
+public abstract class SidebarLayout {
+ private final Set<Runnable> subscribers = new HashSet<>();
+
+ /**
+ * Pushes an update to all subscribers.
+ */
+ public final void refresh() {
+ synchronized (this.subscribers) {
+ for (Runnable s : this.subscribers) {
+ s.run();
+ }
+ }
+ }
+
+ /**
+ * Runs when the layout is first applied.
+ *
+ * <p> The provided sidebar stage may be used to create the first
+ * frame of sidebar data, which will be pushed to the client upon
+ * exit of this method.
+ *
+ * @param stage The sidebar stage. Using it outside this method will
+ * result in undefined behavior.
+ */
+ protected void setup(SidebarStage stage) {
+ }
+
+ /**
+ * Runs when a refresh is requested.
+ *
+ * <p> The provided sidebar stage may be used to update the existing
+ * sidebar data, which will be pushed to the client upon exit of
+ * this method. Sidebar data from previous hook calls will stay the
+ * same unless explicitly changed here.
+ *
+ * @param stage The sidebar stage. Using it outside this method will
+ * result in undefined behavior.
+ */
+ protected void update(SidebarStage stage) {
+ }
+
+ final void subscribe(Runnable listener) {
+ this.subscribers.add(listener);
+ }
+
+ final void unsubscribe(Runnable listener) {
+ this.subscribers.remove(listener);
+ }
+}
diff --git a/src/main/java/gg/projecteden/parchment/sidebar/SidebarStage.java b/src/main/java/gg/projecteden/parchment/sidebar/SidebarStage.java
new file mode 100644
index 0000000000000000000000000000000000000000..9e604d3b8183abe342ef5c055069f1c4b16df55c
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/sidebar/SidebarStage.java
@@ -0,0 +1,32 @@
+package gg.projecteden.parchment.sidebar;
+
+/**
+ * An abstracted sidebar stage.
+ */
+public interface SidebarStage {
+ /**
+ * Stages a new title.
+ *
+ * @param title The new title.
+ */
+ void setTitle(String title);
+
+ /**
+ * Stages a new line at the provided index.
+ *
+ * @param line The line index.
+ * @param value The new line.
+ */
+ void setLine(int line, String value);
+
+ /**
+ * Stages a new line at the provided index
+ * Uses the display as the right aligned text
+ *
+ * @param line The line index
+ * @param value The new line
+ * @param display The right aligned text
+ */
+ void setLine(int line, String value, String display);
+
+}

View File

@@ -6,10 +6,10 @@ Subject: [PATCH] Fix missing CraftMetaSkull serializedProfile
Plugins (ab)using NMS may change the "profile" field using reflections instead of the "setProfile" method, especially if they are targeted towards old Minecraft versions. This fixes the potential discrepancies and NPEs.
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
index deed77a3d44bc55681483d7f47f148b5220135f2..5b4100f0fcd29660b4738d908d2bda677f206cc4 100644
index 47c8148e6413c51ffdd30082bfb37a7fb8a73a71..fe48cb0fbf3b510b365bed06d84c0c62edd1ad19 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
@@ -131,6 +131,11 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
@@ -133,6 +133,11 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
private void setProfile(GameProfile profile) {
this.profile = profile;
@@ -21,7 +21,7 @@ index deed77a3d44bc55681483d7f47f148b5220135f2..5b4100f0fcd29660b4738d908d2bda67
this.serializedProfile = (profile == null) ? null : NbtUtils.writeGameProfile(new CompoundTag(), profile);
}
@@ -139,6 +144,7 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
@@ -141,6 +146,7 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
super.applyToItem(tag);
if (this.profile != null) {
@@ -29,7 +29,7 @@ index deed77a3d44bc55681483d7f47f148b5220135f2..5b4100f0fcd29660b4738d908d2bda67
// SPIGOT-6558: Set initial textures
tag.put(SKULL_OWNER.NBT, serializedProfile);
// Fill in textures
@@ -301,6 +307,8 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
@@ -303,6 +309,8 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
if (meta instanceof CraftMetaSkull) {
CraftMetaSkull that = (CraftMetaSkull) meta;

File diff suppressed because it is too large Load Diff

View File

@@ -4,16 +4,33 @@ Date: Sat, 19 Jun 2021 18:03:59 -0400
Subject: [PATCH] Temporary Access Transformers
diff --git a/src/main/java/net/minecraft/core/Holder.java b/src/main/java/net/minecraft/core/Holder.java
index e91c4e26c25980645941ca8fbdcc3a9d02e31063..a73a9d04dfff9d12d3e5425c867f32331a6b5996 100644
--- a/src/main/java/net/minecraft/core/Holder.java
+++ b/src/main/java/net/minecraft/core/Holder.java
@@ -138,6 +138,12 @@ public interface Holder<T> {
return new Holder.Reference<>(Holder.Reference.Type.INTRUSIVE, owner, null, value);
}
+ // Parchment start
+ public static <T> Holder.Reference<T> create(HolderOwner<T> owner, @Nullable ResourceKey<T> registryKey, @Nullable T value) {
+ return new Holder.Reference<>(Holder.Reference.Type.STAND_ALONE, owner, registryKey, value);
+ }
+ // Parchment end
+
public ResourceKey<T> key() {
if (this.key == null) {
throw new IllegalStateException("Trying to access unbound value '" + this.value + "' from registry " + this.owner);
diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java
index b0204af850ee182773ad458208cccd946ad148d5..92980f04bc1bac9924907007eb63fd04eba3875c 100644
index c816c935ecc74a811ffdffbe6ded73c06e92324a..ac457cd1479c219e1975d475a3e6bce17ae6e567 100644
--- a/src/main/java/net/minecraft/world/item/BlockItem.java
+++ b/src/main/java/net/minecraft/world/item/BlockItem.java
@@ -207,7 +207,7 @@ public class BlockItem extends Item {
}).orElse(state);
@@ -177,7 +177,7 @@ public class BlockItem extends Item {
}
}
- protected boolean canPlace(BlockPlaceContext context, BlockState state) {
+ public boolean canPlace(BlockPlaceContext context, BlockState state) { // Parchment
+ public boolean canPlace(BlockPlaceContext context, BlockState state) { // Parchment: protected -> public
Player entityhuman = context.getPlayer();
CollisionContext voxelshapecollision = entityhuman == null ? CollisionContext.empty() : CollisionContext.of(entityhuman);
// CraftBukkit start - store default return

View File

@@ -39,10 +39,10 @@ index 0000000000000000000000000000000000000000..44245b61f64e4e2eb21ac4f5e540aa9a
+ }
+}
diff --git a/src/main/java/io/papermc/paper/adventure/PaperAdventure.java b/src/main/java/io/papermc/paper/adventure/PaperAdventure.java
index ecddb6fe55e8ee1ca3b163503dd62200ce2d7d04..7d613f50cd0c6469a74529a834f30490defdaa00 100644
index f466bfdf5557c94ebee3ad609d9b6f18f86aefef..687907f2ad51dceb523994adabcf8025960aa336 100644
--- a/src/main/java/io/papermc/paper/adventure/PaperAdventure.java
+++ b/src/main/java/io/papermc/paper/adventure/PaperAdventure.java
@@ -325,6 +325,32 @@ public final class PaperAdventure {
@@ -390,6 +390,36 @@ public final class PaperAdventure {
return asVanilla(source);
}
@@ -62,137 +62,152 @@ index ecddb6fe55e8ee1ca3b163503dd62200ce2d7d04..7d613f50cd0c6469a74529a834f30490
+ };
+ }
+
+ public static java.util.Optional<net.minecraft.sounds.SoundEvent> asVanillaSound(final Key key) {
+ return net.minecraft.core.registries.BuiltInRegistries.SOUND_EVENT.getOptional(asVanilla(key));
+ public static Optional<SoundEvent> asVanillaSound(final Key key) {
+ return BuiltInRegistries.SOUND_EVENT.getOptional(asVanilla(key));
+ }
+
+ @SuppressWarnings("PatternValidation")
+ public static Key asAdventure(final ResourceLocation key) {
+ return Key.key(key.getNamespace(), key.getPath());
+ public static Optional<Holder.Reference<SoundEvent>> asSoundHolder(final net.minecraft.resources.ResourceKey<SoundEvent> key) {
+ return BuiltInRegistries.SOUND_EVENT.get(key);
+ }
+
+ public static Optional<Holder.Reference<net.minecraft.sounds.SoundEvent>> asVanillaSoundHolder(final Key key) {
+ return asSoundHolder(net.minecraft.resources.ResourceKey.create(net.minecraft.core.registries.Registries.SOUND_EVENT, asVanilla(key)));
+ }
+
+ // Parchment end
+
// NBT
public static @Nullable BinaryTagHolder asBinaryTagHolder(final @Nullable CompoundTag tag) {
public static Packet<?> asSoundPacket(final Sound sound, final double x, final double y, final double z, final long seed, @Nullable BiConsumer<Packet<?>, Float> packetConsumer) {
final ResourceLocation name = asVanilla(sound.name());
final Optional<SoundEvent> soundEvent = BuiltInRegistries.SOUND_EVENT.getOptional(name);
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..30c05db4ad0fcd5aa83cb3168ed32c7b0d205972 100644
index 957cae6ddeba9efe3b55588567ae51e8b86b6a42..f6753ed14350b1c2dd7c69e2aed8657295863547 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -1718,6 +1718,43 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.neighborUpdater.neighborChanged(state, pos, sourceBlock, sourcePos, notify);
@@ -1693,12 +1693,46 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@Override
public void playSeededSound(@Nullable Player source, double x, double y, double z, Holder<SoundEvent> sound, SoundSource category, float volume, float pitch, long seed) {
- this.server.getPlayerList().broadcast(source, x, y, z, (double) ((SoundEvent) sound.value()).getRange(volume), this.dimension(), new ClientboundSoundPacket(sound, category, x, y, z, volume, pitch, seed));
+ // Parchment start - sound event
+ CraftEventFactory.playSoundEvent(new gg.projecteden.parchment.event.sound.SoundEvent(
+ source == null ? null : source.getBukkitEntity(),
+ net.kyori.adventure.sound.Sound.sound()
+ .type(sound.unwrap().<net.kyori.adventure.key.Key>map(
+ key -> io.papermc.paper.adventure.PaperAdventure.asAdventure(key.location()),
+ soundEvent -> io.papermc.paper.adventure.PaperAdventure.asAdventure(soundEvent.location())
+ ))
+ .source(io.papermc.paper.adventure.PaperAdventure.asAdventure(category))
+ .volume(volume)
+ .pitch(pitch)
+ .seed(seed)
+ .build(),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.createEmitter(this, x, y, z),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.DISTANCE_FUNCTION,
+ null
+ ));
+ // Parchment end
}
+ public void playSeededSound(@org.jetbrains.annotations.Nullable Player except, double x, double y, double z, SoundEvent sound, SoundSource category, float volume, float pitch, long seed) {
+ // Parchment start - sound event
+ CraftEventFactory.playSoundEvent(new gg.projecteden.parchment.event.sound.SoundEvent(
+ except == null ? null : except.getBukkitEntity(),
+ net.kyori.adventure.sound.Sound.sound(
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(sound.getLocation()),
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(category),
+ volume,
+ pitch
+ ),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.createEmitter(this, x, y, z),
+ seed,
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.DISTANCE_FUNCTION,
+ null
+ ));
+ // Parchment end
+ }
+
+ @Override
+ public void playSeededSound(@org.jetbrains.annotations.Nullable Player except, Entity entity, SoundEvent sound, SoundSource category, float volume, float pitch, long seed) {
+ // Parchment start - sound event
+ CraftEventFactory.playSoundEvent(new gg.projecteden.parchment.event.sound.SoundEvent(
+ except == null ? null : except.getBukkitEntity(),
+ net.kyori.adventure.sound.Sound.sound(
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(sound.getLocation()),
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(category),
+ volume,
+ pitch
+ ),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.createEmitter(entity),
+ seed,
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.DISTANCE_FUNCTION,
+ null
+ ));
+ // Parchment end
+ }
+
@Override
public void broadcastEntityEvent(Entity entity, byte status) {
this.getChunkSource().broadcastAndSend(entity, new ClientboundEntityEventPacket(entity, status));
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
index 1d4d02f26391ac55c7631817f09d05e2769b0d29..cbcc4141c904360127780d6441a960842e661ef0 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -2270,7 +2270,19 @@ public class ServerPlayer extends Player {
public void playSeededSound(@Nullable Player source, Entity entity, Holder<SoundEvent> sound, SoundSource category, float volume, float pitch, long seed) {
- this.server.getPlayerList().broadcast(source, entity.getX(), entity.getY(), entity.getZ(), (double) ((SoundEvent) sound.value()).getRange(volume), this.dimension(), new ClientboundSoundEntityPacket(sound, category, entity, volume, pitch, seed));
+ // Parchment start - sound event
+ CraftEventFactory.playSoundEvent(new gg.projecteden.parchment.event.sound.SoundEvent(
+ source == null ? null : source.getBukkitEntity(),
+ net.kyori.adventure.sound.Sound.sound()
+ .type(sound.unwrap().<net.kyori.adventure.key.Key>map(
+ key -> io.papermc.paper.adventure.PaperAdventure.asAdventure(key.location()),
+ soundEvent -> io.papermc.paper.adventure.PaperAdventure.asAdventure(soundEvent.location())
+ ))
+ .source(io.papermc.paper.adventure.PaperAdventure.asAdventure(category))
+ .volume(volume)
+ .pitch(pitch)
+ .seed(seed)
+ .build(),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.createEmitter(entity),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.DISTANCE_FUNCTION,
+ null
+ ));
+ // Parchment end
}
@Override
public void playNotifySound(SoundEvent event, SoundSource category, float volume, float pitch) {
- this.connection.send(new ClientboundSoundPacket(BuiltInRegistries.SOUND_EVENT.wrapAsHolder(event), category, this.getX(), this.getY(), this.getZ(), volume, pitch, this.random.nextLong()));
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
index 2e8ecf3bbb9f9ceba6f896738fa1ab8e2bd0fed6..94de83a35998c82b807c6e5836d957f317dd2ceb 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -2805,7 +2805,20 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
@Override
public void playNotifySound(SoundEvent sound, SoundSource category, float volume, float pitch) {
- this.connection.send(new ClientboundSoundPacket(BuiltInRegistries.SOUND_EVENT.wrapAsHolder(sound), category, this.getX(), this.getY(), this.getZ(), volume, pitch, this.random.nextLong()));
+ // Parchment start - sound event
+ CraftEventFactory.playSoundEvent(new gg.projecteden.parchment.event.sound.SoundEvent(
+ null,
+ net.kyori.adventure.sound.Sound.sound(
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(event.getLocation()),
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(category),
+ volume,
+ pitch
+ ),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.createEmitter(level, getX(), getY(), getZ()),
+ this.random.nextLong(), sound -> 0d, soundEvent -> java.util.Collections.singletonList(getBukkitEntity())
+ net.kyori.adventure.sound.Sound.sound()
+ .type(io.papermc.paper.adventure.PaperAdventure.asAdventure(sound.location()))
+ .source(io.papermc.paper.adventure.PaperAdventure.asAdventure(category))
+ .volume(volume)
+ .pitch(pitch)
+ .seed(this.random.nextLong())
+ .build(),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.createEmitter(level(), getX(), getY(), getZ()),
+ _sound -> 0d, soundEvent -> java.util.Collections.singletonList(getBukkitEntity())
+ ));
+ // Parchment end
}
@Override
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
index c0c14766adaac855112f85a203a6163b8adfdded..d59d36c8a77524d5ac0c25a4ef1cf57f339eeda2 100644
index 30de3d1a7792c38ae946f19cb0e14637919b5001..ef10ed017ad5d06c3f34f1287a8721a33fc61ce1 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -932,7 +932,7 @@ public abstract class PlayerList {
BlockState data = worldserver1.getBlockState(blockposition);
worldserver1.setBlock(blockposition, data.setValue(net.minecraft.world.level.block.RespawnAnchorBlock.CHARGE, data.getValue(net.minecraft.world.level.block.RespawnAnchorBlock.CHARGE) - 1), 3);
@@ -876,6 +876,9 @@ public abstract class PlayerList {
isBedSpawn = true;
}
- entityplayer1.connection.send(new ClientboundSoundPacket(SoundEvents.RESPAWN_ANCHOR_DEPLETE, SoundSource.BLOCKS, (double) location.getX(), (double) location.getY(), (double) location.getZ(), 1.0F, 1.0F, worldserver1.getRandom().nextLong()));
// Paper end - Add PlayerPostRespawnEvent
+ entityplayer1.playNotifySound(SoundEvents.RESPAWN_ANCHOR_DEPLETE.value(), SoundSource.BLOCKS, 1.0F, 1.0F); // Parchment - use existing play sound method
// Paper end
+ // Paper end - Fix SPIGOT-5989
+
}
// Added from changeDimension
this.sendAllPlayerInfo(entityplayer); // Update health, etc...
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
index 0629c471d38a77c44fc1c86ccdfcb0690f61ca17..791e9f43afae265f7f32588db2d6f2092c5f32c7 100644
index 61d412c4f1ebd55661cc3f0260468e3ac0efe0bb..6b73ca4ca59e3080926155613ce10af82cd43615 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
@@ -1891,7 +1891,21 @@ public abstract class Player extends LivingEntity {
@@ -1840,9 +1840,23 @@ public abstract class Player extends LivingEntity {
}
// Paper start - send while respecting visibility
private static void sendSoundEffect(Player fromEntity, double x, double y, double z, SoundEvent soundEffect, SoundSource soundCategory, float volume, float pitch) {
fromEntity.level.playSound(fromEntity, x, y, z, soundEffect, soundCategory, volume, pitch); // This will not send the effect to the entity himself
if (fromEntity instanceof ServerPlayer) {
- ((ServerPlayer) fromEntity).connection.send(new net.minecraft.network.protocol.game.ClientboundSoundPacket(net.minecraft.core.registries.BuiltInRegistries.SOUND_EVENT.wrapAsHolder(soundEffect), soundCategory, x, y, z, volume, pitch, fromEntity.random.nextLong()));
- fromEntity.level().playSound(fromEntity, x, y, z, soundEffect, soundCategory, volume, pitch); // This will not send the effect to the entity itself
- if (fromEntity instanceof ServerPlayer serverPlayer) {
- serverPlayer.connection.send(new net.minecraft.network.protocol.game.ClientboundSoundPacket(net.minecraft.core.registries.BuiltInRegistries.SOUND_EVENT.wrapAsHolder(soundEffect), soundCategory, x, y, z, volume, pitch, fromEntity.random.nextLong()));
+ fromEntity.level().playSound(fromEntity, x, y, z, soundEffect, soundCategory, volume, pitch); // This will not send the effect to the entity himself
+ if (fromEntity instanceof ServerPlayer) {
+ // Parchment start - sound event
+ CraftEventFactory.playSoundEvent(new gg.projecteden.parchment.event.sound.SoundEvent(
+ null,
+ net.kyori.adventure.sound.Sound.sound(
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(soundEffect.getLocation()),
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(soundCategory),
+ volume,
+ pitch
+ ),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.createEmitter(fromEntity.level, x, y, z),
+ fromEntity.random.nextLong(),
+ net.kyori.adventure.sound.Sound.sound()
+ .type(io.papermc.paper.adventure.PaperAdventure.asAdventure(soundEffect.location()))
+ .source(io.papermc.paper.adventure.PaperAdventure.asAdventure(soundCategory))
+ .volume(volume)
+ .pitch(pitch)
+ .seed(fromEntity.random.nextLong())
+ .build(),
+ gg.projecteden.parchment.event.sound.ParchmentSoundEvent.createEmitter(fromEntity.level(), x, y, z),
+ sound -> 0d,
+ soundEvent -> java.util.Collections.singletonList(((ServerPlayer) fromEntity).getBukkitEntity())
+ ));
+ // Parchment end
}
}
// Paper end
// Paper end - send while respecting visibility
diff --git a/src/main/java/net/minecraft/world/entity/raid/Raid.java b/src/main/java/net/minecraft/world/entity/raid/Raid.java
index 879c3bb661e24b9682b654def57c2800f4f8ca92..78c2067b9683611ea31cfe1c95755aa9e23e5982 100644
index 11cf2d9def087b0898c828eaa21eb5f7b8811d5f..7c1332f6c2fbe615e2831911b6548310532b022e 100644
--- a/src/main/java/net/minecraft/world/entity/raid/Raid.java
+++ b/src/main/java/net/minecraft/world/entity/raid/Raid.java
@@ -538,7 +538,7 @@ public class Raid {
@@ -552,7 +552,7 @@ public class Raid {
double d2 = vec3d.z + 13.0D / d0 * (vec3d1.z - vec3d.z);
if (d0 <= 64.0D || collection.contains(entityplayer)) {
@@ -202,45 +217,34 @@ index 879c3bb661e24b9682b654def57c2800f4f8ca92..78c2067b9683611ea31cfe1c95755aa9
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index cdb8ec04f4a19ec3dbedbd5b17a7d1f3afaa238e..42b9f8d0b038a26fb3689bc0e974ceeed4de4254 100644
index e37aaf77f94b97b736cc20ef070cefdff0400188..c01ea04bc72ea7342722a463a384b1cc664c7afb 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -1945,4 +1945,53 @@ public class CraftEventFactory {
return event.callEvent();
@@ -2271,4 +2271,42 @@ public class CraftEventFactory {
return event;
}
// Paper end
// Paper end - add EntityFertilizeEggEvent
+
+ // Parchment start
+ private static net.minecraft.network.protocol.@org.jetbrains.annotations.NotNull Packet<net.minecraft.network.protocol.game.ClientGamePacketListener> handleSoundEvent(gg.projecteden.parchment.event.sound.SoundEvent event, CraftPlayer recipient) {
+ // init variables
+ net.kyori.adventure.sound.Sound sound = event.calculateSound(recipient);
+ ResourceLocation name = io.papermc.paper.adventure.PaperAdventure.asVanilla(sound.name());
+ gg.projecteden.parchment.event.sound.SoundEvent.Emitter emitter = event.calculateEmitter(recipient);
+ net.minecraft.sounds.SoundSource source = io.papermc.paper.adventure.PaperAdventure.asVanilla(sound.source());
+ float volume = sound.volume();
+ float pitch = sound.pitch();
+ long seed = event.getSeed();
+ java.util.Optional<net.minecraft.sounds.SoundEvent> soundEvent = io.papermc.paper.adventure.PaperAdventure.asVanillaSound(sound.name());
+ // handle vanilla sounds
+ if (soundEvent.isPresent()) {
+ long seed = sound.seed().orElse(0L); // TODO: random source?
+ net.minecraft.resources.ResourceKey<net.minecraft.sounds.SoundEvent> soundKey = net.minecraft.resources.ResourceKey.create(net.minecraft.core.registries.Registries.SOUND_EVENT, name);
+ net.minecraft.core.Holder.Reference<net.minecraft.sounds.SoundEvent> soundEvent = io.papermc.paper.adventure.PaperAdventure.asVanillaSoundHolder(sound.name()) // TODO: calculate event distance?
+ .orElseGet(() -> net.minecraft.core.Holder.Reference.create(net.minecraft.core.registries.BuiltInRegistries.SOUND_EVENT, soundKey, net.minecraft.sounds.SoundEvent.createFixedRangeEvent(name, (float) event.calculateDistance())));
+ if (emitter instanceof gg.projecteden.parchment.event.sound.SoundEvent.EntityEmitter entityEmitter)
+ return new net.minecraft.network.protocol.game.ClientboundSoundEntityPacket(net.minecraft.core.Holder.direct(soundEvent.get()), source, ((CraftEntity) entityEmitter.entity()).getHandle(), volume, pitch, seed);
+ return new net.minecraft.network.protocol.game.ClientboundSoundEntityPacket(soundEvent, source, ((CraftEntity) entityEmitter.entity()).getHandle(), volume, pitch, seed);
+ else if (emitter instanceof gg.projecteden.parchment.event.sound.SoundEvent.LocationEmitter locationEmitter) {
+ Location loc = locationEmitter.location();
+ return new net.minecraft.network.protocol.game.ClientboundSoundPacket(net.minecraft.core.Holder.direct(soundEvent.get()), source, loc.getX(), loc.getY(), loc.getZ(), volume, pitch, seed);
+ org.bukkit.Location loc = locationEmitter.getLocation();
+ return new net.minecraft.network.protocol.game.ClientboundSoundPacket(soundEvent, source, loc.getX(), loc.getY(), loc.getZ(), volume, pitch, seed);
+ }
+ else
+ throw new IllegalArgumentException("Unknown emitter type: " + emitter.getClass().getName());
+ }
+ // handle custom sounds
+ else {
+ return null; // ClientboundCustomSoundPacket was removed and the standard packet now supports custom sounds
+// // warn if trying to use EntityEmitter with custom sound
+// if (emitter instanceof gg.projecteden.parchment.event.sound.SoundEvent.EntityEmitter)
+// org.slf4j.LoggerFactory.getLogger("SoundEvent").warn("Sound event is using a custom sound ({}) which cannot be used with EntityEmitter. Falling back to playing at the entity's location.", sound.name().asString());
+// Vec3 pos = org.bukkit.craftbukkit.util.CraftVector.toNMS(emitter.location().toVector());
+// return new net.minecraft.network.protocol.game.ClientboundCustomSoundPacket(io.papermc.paper.adventure.PaperAdventure.asVanilla(sound.name()), source, pos, volume, pitch, seed);
+ }
+ }
+
+ public static void playSoundEvent(gg.projecteden.parchment.event.sound.SoundEvent event) {
+ org.apache.commons.lang3.Validate.notNull(event, "event");

View File

@@ -5,22 +5,20 @@ Subject: [PATCH] Add PlayerUseRespawnAnchorEvent
diff --git a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
index bcea8af63b9911c36873290e5c34567b1eeaacf4..a630bba5d7b8e5e18346cd2b8cc5d6dbc66c8a53 100644
index 9117c035d5a6ff114b028fad3380ceb1fc2b9691..c490b30531bf722b31db88aa4937d3fd777c2844 100644
--- a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java
@@ -52,23 +52,46 @@ public class RespawnAnchorBlock extends Block {
@@ -64,7 +64,33 @@ public class RespawnAnchorBlock extends Block {
@Override
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
ItemStack itemStack = player.getItemInHand(hand);
+
protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
+ // Parchment start -- PlayerUseRespawnAnchorEvent
+ org.bukkit.entity.Player bukkitPlayer = player.getBukkitEntity() instanceof org.bukkit.entity.Player ? (org.bukkit.entity.Player) player.getBukkitEntity() : null;
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(world, pos);
+ gg.projecteden.parchment.event.player.PlayerUseRespawnAnchorEvent.RespawnAnchorResult result;
+ // Parchment end
if (hand == InteractionHand.MAIN_HAND && !isRespawnFuel(itemStack) && isRespawnFuel(player.getItemInHand(InteractionHand.OFF_HAND))) {
return InteractionResult.PASS;
} else if (isRespawnFuel(itemStack) && canBeCharged(state)) {
+
if (RespawnAnchorBlock.isRespawnFuel(stack) && RespawnAnchorBlock.canBeCharged(state)) {
+ // Parchment start -- PlayerUseRespawnAnchorEvent
+ result = gg.projecteden.parchment.event.player.PlayerUseRespawnAnchorEvent.RespawnAnchorResult.CHARGE;
+ } else if (state.getValue(CHARGE) == 0) {
@@ -41,25 +39,6 @@ index bcea8af63b9911c36873290e5c34567b1eeaacf4..a630bba5d7b8e5e18346cd2b8cc5d6db
+ return InteractionResult.PASS;
+ } else if (result == gg.projecteden.parchment.event.player.PlayerUseRespawnAnchorEvent.RespawnAnchorResult.CHARGE) {
+ // Parchment end
charge(player, world, pos, state);
if (!player.getAbilities().instabuild) {
itemStack.shrink(1);
}
return InteractionResult.sidedSuccess(world.isClientSide);
- } else if (state.getValue(CHARGE) == 0) {
- return InteractionResult.PASS;
- } else if (!canSetSpawn(world)) {
- if (!world.isClientSide) {
- this.explode(state, world, pos);
- }
-
- return InteractionResult.sidedSuccess(world.isClientSide);
+ // Parchment start -- PlayerUseRespawnAnchorEvent
+ } else if (result == gg.projecteden.parchment.event.player.PlayerUseRespawnAnchorEvent.RespawnAnchorResult.EXPLODE) {
+ this.explode(state, world, pos);
+ return InteractionResult.CONSUME;
+ // Parchment end
} else {
if (!world.isClientSide) {
ServerPlayer serverPlayer = (ServerPlayer)player;
RespawnAnchorBlock.charge(player, world, pos, state);
stack.consume(1, player);
return InteractionResult.SUCCESS;

View File

@@ -5,33 +5,15 @@ Subject: [PATCH] Add origin location to EntityDamageByBlockEvent
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 42b9f8d0b038a26fb3689bc0e974ceeed4de4254..7f6266a0b4703a580571928fa4aa1a5b0caf0a39 100644
index 33daeb74cdf11c5b920e02b191eb62d5d0937f8e..8f438df5d9112460e5b1664a56688bb1c6ddc6fa 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -971,7 +971,7 @@ public class CraftEventFactory {
CraftEventFactory.entityDamage = null;
EntityDamageEvent event;
if (damager == null) {
- event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.BLOCK_EXPLOSION, modifiers, modifierFunctions);
+ event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.BLOCK_EXPLOSION, source.getEntity().getBukkitEntity().getLocation(), modifiers, modifierFunctions);
} else if (entity instanceof EnderDragon && /*PAIL FIXME ((EntityEnderDragon) entity).target == damager*/ false) {
event = new EntityDamageEvent(entity.getBukkitEntity(), DamageCause.ENTITY_EXPLOSION, modifiers, modifierFunctions);
} else {
@@ -1014,7 +1014,7 @@ public class CraftEventFactory {
return CraftEventFactory.callEntityDamageEvent(damager, entity, cause, modifiers, modifierFunctions, cancelled, source.isCritical()); // Paper - add critical damage API
} else if (source.is(DamageTypes.OUT_OF_WORLD)) {
- EntityDamageEvent event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.VOID, modifiers, modifierFunctions);
+ EntityDamageEvent event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.VOID, entity.getBukkitEntity().getLocation(), modifiers, modifierFunctions);
event.setCancelled(cancelled);
CraftEventFactory.callEvent(event);
if (!event.isCancelled()) {
@@ -1024,7 +1024,7 @@ public class CraftEventFactory {
@@ -1198,7 +1198,7 @@ public class CraftEventFactory {
}
private static EntityDamageEvent callEntityDamageEvent(Block damager, BlockState damagerState, Entity damagee, DamageCause cause, org.bukkit.damage.DamageSource bukkitDamageSource, Map<DamageModifier, Double> modifiers, Map<DamageModifier, Function<? super Double, Double>> modifierFunctions, boolean cancelled) {
- EntityDamageByBlockEvent event = new EntityDamageByBlockEvent(damager, damagerState, damagee.getBukkitEntity(), cause, bukkitDamageSource, modifiers, modifierFunctions);
+ EntityDamageByBlockEvent event = new EntityDamageByBlockEvent(damager, damagerState, damagee.getBukkitEntity(), cause, bukkitDamageSource, modifiers, modifierFunctions, bukkitDamageSource.getDamageLocation());
return CraftEventFactory.callEntityDamageEvent(event, damagee, cancelled);
}
return event;
} else if (source.is(DamageTypes.LAVA)) {
- EntityDamageEvent event = (new EntityDamageByBlockEvent(CraftEventFactory.blockDamage, entity.getBukkitEntity(), DamageCause.LAVA, modifiers, modifierFunctions));
+ EntityDamageEvent event = (new EntityDamageByBlockEvent(CraftEventFactory.blockDamage, entity.getBukkitEntity(), DamageCause.LAVA, blockDamage.getLocation(), modifiers, modifierFunctions));
event.setCancelled(cancelled);
Block damager = CraftEventFactory.blockDamage;

View File

@@ -5,12 +5,12 @@ Subject: [PATCH] Add UnsafeValues#canPlaceItemOn
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
index 64c50c52c11214740de7903e5592b8b6b2c170b3..be2739875ba1ba1a973c4a45c7e6a6996f0daf31 100644
index 507f908916cbeb592496f963b46e4c2121a7b5e3..356999f8359838f248ad0e673fef23a82a0560c8 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -618,6 +618,55 @@ public final class CraftMagicNumbers implements UnsafeValues {
@@ -702,6 +702,55 @@ public final class CraftMagicNumbers implements UnsafeValues {
}
// Paper end
// Paper end - proxy ItemStack
+ // Parchment start
+ @Override

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Add Player#setGameProfile
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
index 791e9f43afae265f7f32588db2d6f2092c5f32c7..460edabad8327acd4ba86924a220605181a97cd8 100644
index 6b73ca4ca59e3080926155613ce10af82cd43615..09ed0bd5f012ae2e34d5ed58828475577b6ab6f8 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
@@ -1509,6 +1509,12 @@ public abstract class Player extends LivingEntity {
@@ -1523,6 +1523,12 @@ public abstract class Player extends LivingEntity {
return this.gameProfile;
}

View File

@@ -5,13 +5,14 @@ Subject: [PATCH] Expose MCUtil Executors
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 2a8ad9afaa53d80d3926d9f1e1181c54aa8a849e..bc70b8d1e0954196a82e8673bc49b9438a4d838f 100644
index cac8592e3a2f438fe9ca167a4fdcd65152bbb2de..b85d19598c09a14e68fced841de2148bf6f469e0 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -2919,4 +2919,16 @@ public final class CraftServer implements Server {
@@ -3258,4 +3258,18 @@ public final class CraftServer implements Server {
this.console.addPluginAllowingSleep(plugin.getName(), value);
}
// Paper end
// Paper end - API to check if the server is sleeping
+
+
+ // Parchment start
+ @Override
@@ -24,4 +25,5 @@ index 2a8ad9afaa53d80d3926d9f1e1181c54aa8a849e..bc70b8d1e0954196a82e8673bc49b943
+ return io.papermc.paper.util.MCUtil.MAIN_EXECUTOR;
+ }
+ // Parchment end
+
}

View File

@@ -8,19 +8,10 @@ to easily get the items being dropped by any
block instead of only blocks broken by players.
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
index 4f91e4832a94c3facbc711fcae4cb5ad540a5ca0..c357e09705c5405dc8fac666fc39c993febdee50 100644
index b6d6c2cb9b227a17fb4ce42bc75f92206fbea043..43c288a4e226060a5e0cecddd941846d29ae8025 100644
--- a/src/main/java/net/minecraft/world/level/block/Block.java
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
@@ -306,7 +306,7 @@ public class Block extends BlockBehaviour implements ItemLike {
ServerLevel worldserver = lootContext.getLevel();
BlockPos blockposition = BlockPos.containing((Position) lootContext.getParameter(LootContextParams.ORIGIN));
- state.getDrops(lootContext).forEach((itemstack) -> {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callBlockDropResourcesEvent(worldserver, blockposition, state.getDrops(lootContext)).forEach((itemstack) -> { // Parchment
Block.popResource(worldserver, blockposition, itemstack);
});
state.spawnAfterBreak(worldserver, blockposition, ItemStack.EMPTY, true);
@@ -314,7 +314,7 @@ public class Block extends BlockBehaviour implements ItemLike {
@@ -292,7 +292,7 @@ public class Block extends BlockBehaviour implements ItemLike {
public static void dropResources(BlockState state, Level world, BlockPos pos) {
if (world instanceof ServerLevel) {
@@ -29,7 +20,7 @@ index 4f91e4832a94c3facbc711fcae4cb5ad540a5ca0..c357e09705c5405dc8fac666fc39c993
Block.popResource(world, pos, itemstack);
});
state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true);
@@ -324,7 +324,7 @@ public class Block extends BlockBehaviour implements ItemLike {
@@ -302,7 +302,7 @@ public class Block extends BlockBehaviour implements ItemLike {
public static void dropResources(BlockState state, LevelAccessor world, BlockPos pos, @Nullable BlockEntity blockEntity) {
if (world instanceof ServerLevel) {
@@ -38,21 +29,20 @@ index 4f91e4832a94c3facbc711fcae4cb5ad540a5ca0..c357e09705c5405dc8fac666fc39c993
Block.popResource((ServerLevel) world, pos, itemstack);
});
state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true);
@@ -351,7 +351,8 @@ public class Block extends BlockBehaviour implements ItemLike {
public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, Entity entity, ItemStack tool) {
@@ -338,7 +338,7 @@ public class Block extends BlockBehaviour implements ItemLike {
public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool, boolean dropExperience) {
// Paper end - Properly handle xp dropping
if (world instanceof ServerLevel) {
- Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, tool).forEach((itemstack1) -> {
+
+ org.bukkit.craftbukkit.event.CraftEventFactory.callBlockDropResourcesEvent(world, pos, Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, tool)).forEach((itemstack1) -> { // Parchment
Block.popResource(world, pos, itemstack1);
});
state.spawnAfterBreak((ServerLevel) world, pos, tool, true);
state.spawnAfterBreak((ServerLevel) world, pos, tool, dropExperience); // Paper - Properly handle xp dropping
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 7f6266a0b4703a580571928fa4aa1a5b0caf0a39..7681fc8163f6ac17a7d26fd6f5c5113eb634640e 100644
index 0af82fae494762fec22afbb2363d24370dbdb71b..f29ddf243147a866b2b17f41556ff3d817aedf2e 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -1993,5 +1993,19 @@ public class CraftEventFactory {
@@ -2308,5 +2308,19 @@ public class CraftEventFactory {
}
});
}

View File

@@ -215,10 +215,10 @@ index 0000000000000000000000000000000000000000..e7114e456f818d7bdd4081620f4b9b93
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 5e9055fdf411029ea2fed91acd6b981f79156418..9f719150a0369ddb76da88635e05ff701759a1ed 100644
index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..77c914fb58403f4b6c2d145664740d1fb59bb261 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -2395,4 +2395,11 @@ public class CraftWorld extends CraftRegionAccessor implements World {
@@ -2510,4 +2510,15 @@ public class CraftWorld extends CraftRegionAccessor implements World {
return this.adventure$pointers;
}
// Paper end
@@ -226,7 +226,11 @@ index 5e9055fdf411029ea2fed91acd6b981f79156418..9f719150a0369ddb76da88635e05ff70
+ // Parchment start
+ @Override
+ public ItemStack smeltItem(ItemStack toSmelt, gg.projecteden.parchment.inventory.RecipeType recipeType) {
+ return world.getRecipeManager().getRecipeFor(gg.projecteden.parchment.inventory.CraftRecipeType.asCookingRecipe(recipeType), new gg.projecteden.parchment.inventory.SingletonContainer(toSmelt), world).map(recipe -> recipe.getResultItem(world.registryAccess()).getBukkitStack()).orElse(null);
+ var optional = world.recipeAccess().getRecipeFor(gg.projecteden.parchment.inventory.CraftRecipeType.asCookingRecipe(recipeType), new net.minecraft.world.item.crafting.SingleRecipeInput(CraftItemStack.asNMSCopy(toSmelt)), world).map(recipe -> recipe.value()).orElse(null);
+ if (optional == null) {
+ return null;
+ }
+ return optional.assemble(new net.minecraft.world.item.crafting.SingleRecipeInput(CraftItemStack.asNMSCopy(toSmelt)), world.registryAccess()).asBukkitCopy();
+ }
+ // Parchment end
}

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Disable sleep status announcements
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
index 30c05db4ad0fcd5aa83cb3168ed32c7b0d205972..206bc729f24f679bed3b945b640778873699676a 100644
index f6753ed14350b1c2dd7c69e2aed8657295863547..1d614e2e4274ac24abd74dfb10c52d6624e0a9de 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -974,7 +974,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1068,7 +1068,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
}
private void announceSleepStatus() {

View File

@@ -5,27 +5,27 @@ Subject: [PATCH] Add config for ticking TIME_SINCE_REST
diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java
index 4532f3a0d74feae0a1249b53e1bfbc18a8808b32..c66db0468a9ab09cc89805e7bf7be09e7a7a1746 100644
index b1c917d65076a3805e5b78cb946753f0c101e214..7034391701ce34119c6cfc22a8dd2dec6293f63d 100644
--- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java
+++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java
@@ -259,6 +259,7 @@ public class WorldConfiguration extends ConfigurationPart {
@@ -317,6 +317,7 @@ public class WorldConfiguration extends ConfigurationPart {
}
public boolean disablePlayerCrits = false;
+ public boolean tickTimeSinceSleep = true; // Parchment
public boolean nerfPigmenFromNetherPortals = false;
public PillagerPatrols pillagerPatrols;
@Comment("Prevents merging items that are not on the same y level, preventing potential visual artifacts.")
public boolean onlyMergeItemsHorizontally = false;
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
index e428299aff0a75b8a9a82cac13429a6dc7ea7002..defe3bdf04b274f16e99c7d25e5f167480465c09 100644
index 09ed0bd5f012ae2e34d5ed58828475577b6ab6f8..e280cd56a4dc446edab97e6c48397e03edb2ca1e 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
@@ -291,7 +291,7 @@ public abstract class Player extends LivingEntity {
@@ -304,7 +304,7 @@ public abstract class Player extends LivingEntity {
this.awardStat(Stats.CROUCH_TIME);
}
- if (!this.isSleeping()) {
+ if (!this.isSleeping() && this.level.paperConfig().entities.behavior.tickTimeSinceSleep) { // Parchment
+ if (!this.isSleeping() && this.level().paperConfig().entities.behavior.tickTimeSinceSleep) { // Parchment
this.awardStat(Stats.TIME_SINCE_REST);
}
}

View File

@@ -0,0 +1,82 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Lexi <lexi@qixils.dev>
Date: Thu, 23 Jun 2022 14:41:24 -0400
Subject: [PATCH] Add HangingFrame Tick API
diff --git a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
index 799b1fc67bd16029ea26c480e21f5f51877343ab..da1ec6e15fe9525e50f2389eeea6719eb8d8882f 100644
--- a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
@@ -21,7 +21,11 @@ import org.apache.commons.lang3.Validate;
public abstract class HangingEntity extends BlockAttachedEntity {
protected static final Predicate<Entity> HANGING_ENTITY = entity -> entity instanceof HangingEntity;
+
+ private int checkInterval; { this.checkInterval = this.getId() % this.level().spigotConfig.hangingTickFrequency; } // Paper - Perf: offset item frame ticking
+ //public BlockPos pos;
protected Direction direction = Direction.SOUTH;
+ public boolean tick = true; // Parchment
protected HangingEntity(EntityType<? extends HangingEntity> type, Level world) {
super(type, world);
@@ -54,6 +58,38 @@ public abstract class HangingEntity extends BlockAttachedEntity {
protected abstract AABB calculateBoundingBox(BlockPos pos, Direction side);
@Override
+ public void tick() {
+ if (tick && !this.level().isClientSide) { // Parchment
+ this.checkBelowWorld();
+ if (this.checkInterval++ == this.level().spigotConfig.hangingTickFrequency) { // Spigot
+ this.checkInterval = 0;
+ if (!this.isRemoved() && !this.survives()) {
+ // CraftBukkit start - fire break events
+ BlockState material = this.level().getBlockState(this.blockPosition());
+ org.bukkit.event.hanging.HangingBreakEvent.RemoveCause cause;
+
+ if (!material.isAir()) {
+ // TODO: This feels insufficient to catch 100% of suffocation cases
+ cause = org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.OBSTRUCTION;
+ } else {
+ cause = org.bukkit.event.hanging.HangingBreakEvent.RemoveCause.PHYSICS;
+ }
+
+ org.bukkit.event.hanging.HangingBreakEvent event = new org.bukkit.event.hanging.HangingBreakEvent((org.bukkit.entity.Hanging) this.getBukkitEntity(), cause);
+ this.level().getCraftServer().getPluginManager().callEvent(event);
+
+ if (this.isRemoved() || event.isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DROP); // CraftBukkit - add Bukkit remove cause
+ this.dropItem((ServerLevel) this.level(), (Entity) null);
+ }
+ }
+ }
+
+ }
+
public boolean survives() {
if (!this.level().noCollision(this)) {
return false;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java
index f1e3f2b89bcd969f3c80548e165881a9b290eb53..f2d46e908ca0030da514a686763e65a57f02cf35 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java
@@ -66,4 +66,16 @@ public class CraftHanging extends CraftBlockAttachedEntity implements Hanging {
public String toString() {
return "CraftHanging";
}
+
+ // Parchment start
+ @Override
+ public boolean canTick() {
+ return this.getHandle().tick;
+ }
+
+ @Override
+ public void setCanTick(boolean tick) {
+ this.getHandle().tick = tick;
+ }
+ // Parchment end
}

View File

@@ -1,48 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Lexi <lexi@qixils.dev>
Date: Thu, 23 Jun 2022 14:41:24 -0400
Subject: [PATCH] Add HangingFrame Tick API
diff --git a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
index f7d031e9a5aa533d78a49ed6147dd47dd0f27f01..a22139bd4202237eb6977b95786b9a3647821874 100644
--- a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
@@ -42,6 +42,7 @@ public abstract class HangingEntity extends Entity {
private int checkInterval; { this.checkInterval = this.getId() % this.level.spigotConfig.hangingTickFrequency; } // Paper
public BlockPos pos;
protected Direction direction;
+ public boolean tick = true; // Parchment
protected HangingEntity(EntityType<? extends HangingEntity> type, Level world) {
super(type, world);
@@ -117,7 +118,7 @@ public abstract class HangingEntity extends Entity {
@Override
public void tick() {
- if (!this.level.isClientSide) {
+ if (tick && !this.level.isClientSide) { // Parchment
this.checkOutOfWorld();
if (this.checkInterval++ == this.level.spigotConfig.hangingTickFrequency) { // Spigot
this.checkInterval = 0;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java
index 62e11bf104b8d39ac73883e2a5d207e5f7393253..639bd33ae91ed818bda29fed776adb8c169458d7 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java
@@ -72,4 +72,16 @@ public class CraftHanging extends CraftEntity implements Hanging {
public EntityType getType() {
return EntityType.UNKNOWN;
}
+
+ // Parchment start
+ @Override
+ public boolean canTick() {
+ return this.getHandle().tick;
+ }
+
+ @Override
+ public void setCanTick(boolean tick) {
+ this.getHandle().tick = tick;
+ }
+ // Parchment end
}

View File

@@ -5,11 +5,11 @@ Subject: [PATCH] Add Player#getHiddenEntities API
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 0ae1fce0c1a2e3bfbbab756a088fc76545e263fa..4d768316f40fe6f239a8b75820d16ab8018f28f6 100644
index d0010dfd22463986bf3be9b3ee015ce92735753e..17b353b44fb15726203ecf643961a8242f2a9372 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -1903,6 +1903,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
server.getPluginManager().callEvent(new PlayerShowEntityEvent(this, entity)); // Paper
@@ -2179,6 +2179,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
this.server.getPluginManager().callEvent(new PlayerShowEntityEvent(this, entity));
}
// Paper start
+

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Big Barrels
diff --git a/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java
index 416aa989ebb18a8741cc9d605a1180ab830f6643..c48466a4d2115f4fa6121b6bcba87b838743af34 100644
index 6186e55014bbb9d5bedaa0e9d196879c55339d42..4f02184ec9aa7067f0ee20f041799d25494cb358 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/BarrelBlockEntity.java
@@ -67,7 +67,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity {
@@ -68,7 +68,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity {
public BarrelBlockEntity(BlockPos pos, BlockState state) {
super(BlockEntityType.BARREL, pos, state);
@@ -17,7 +17,7 @@ index 416aa989ebb18a8741cc9d605a1180ab830f6643..c48466a4d2115f4fa6121b6bcba87b83
this.openersCounter = new ContainerOpenersCounter() {
@Override
protected void onOpen(Level world, BlockPos pos, BlockState state) {
@@ -118,7 +118,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity {
@@ -119,7 +119,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity {
@Override
public int getContainerSize() {
@@ -26,7 +26,7 @@ index 416aa989ebb18a8741cc9d605a1180ab830f6643..c48466a4d2115f4fa6121b6bcba87b83
}
@Override
@@ -138,7 +138,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity {
@@ -139,7 +139,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity {
@Override
protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) {

View File

@@ -5,33 +5,27 @@ Subject: [PATCH] Expanded Insomnia API
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 4d768316f40fe6f239a8b75820d16ab8018f28f6..a3d3051b82b512c855fd87681a54817c32727b95 100644
index 17b353b44fb15726203ecf643961a8242f2a9372..b137889665a2e678951c631053d0f8cecd2adc95 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -76,6 +76,7 @@ import net.minecraft.server.network.ServerGamePacketListenerImpl;
import net.minecraft.server.players.UserWhiteListEntry;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntitySelector;
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
import net.minecraft.world.entity.ai.attributes.AttributeMap;
import net.minecraft.world.entity.ai.attributes.Attributes;
@@ -179,6 +180,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -218,6 +218,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
private static final boolean DISABLE_CHANNEL_LIMIT = System.getProperty("paper.disableChannelLimit") != null; // Paper - add a flag to disable the channel limit
private long lastSaveTime;
// Paper end
+ private boolean bypassesInsomnia = false; // Parchment - Insomnia api
private long lastSaveTime; // Paper - getLastPlayed replacement API
+ private boolean bypassesInsomnia = false; // Parchment - Insomnia api
+
public CraftPlayer(CraftServer server, ServerPlayer entity) {
super(server, entity);
@@ -2017,6 +2019,33 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return this;
}
@@ -3589,4 +3591,31 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundEntityEventPacket(((CraftEntity) target).getHandle(), effect.getData()));
}
// Paper end - entity effect API
+
+ // Parchment start
+ @Override
+ public boolean isInsomniac() {
+ return EntitySelector.isInsomniac.test(this.getHandle());
+ return net.minecraft.world.entity.EntitySelector.IS_INSOMNIAC.test(this.getHandle());
+ }
+
+ @Override
@@ -54,7 +48,4 @@ index 4d768316f40fe6f239a8b75820d16ab8018f28f6..a3d3051b82b512c855fd87681a54817c
+ return net.minecraft.util.Mth.clamp(this.getHandle().getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE);
+ }
+ // Parchment end
+
@Override
public ServerPlayer getHandle() {
return (ServerPlayer) entity;
}

View File

@@ -1,19 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Wed, 20 Jul 2022 05:26:25 -0400
Subject: [PATCH] Add Timings Events
diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java
index c07eb451a576811a39021f6f97103c77488fd001..58fd2d024a9de3a9a31cde948bb9fc8b68f461bc 100644
--- a/src/main/java/co/aikar/timings/TimingsExport.java
+++ b/src/main/java/co/aikar/timings/TimingsExport.java
@@ -350,6 +350,8 @@ public class TimingsExport extends Thread {
timingsURL = con.getHeaderField("Location");
listeners.sendMessage(text("View Timings Report: ", NamedTextColor.GREEN).append(text(timingsURL).clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, timingsURL))));
+ new co.aikar.timings.event.TimingsGenerateReportEvent(this.listeners, timingsURL).callEvent();
+
if (response != null && !response.isEmpty()) {
Bukkit.getLogger().log(Level.INFO, "Timing Response: " + response);
}

View File

@@ -0,0 +1,48 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Mon, 25 Jul 2022 09:11:13 -0400
Subject: [PATCH] Add spam bypass permission
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index b5d5dbc50a7b8c40739a15f164ffd08fdc534f9c..ef65deee8c878a3a6b7349b2421473ac550e4e1c 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -802,9 +802,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
public void handleCustomCommandSuggestions(ServerboundCommandSuggestionPacket packet) {
// PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async
// CraftBukkit start
- if (!this.tabSpamThrottler.isIncrementAndUnderThreshold() && !this.server.getPlayerList().isOp(this.player.getGameProfile()) && !this.server.isSingleplayerOwner(this.player.getGameProfile())) { // Paper - configurable tab spam limits
- this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - Kick event cause // Paper - add proper async disconnect
- return;
+ if (!this.getCraftPlayer().hasPermission("spam.bypass")) { // Parchment - spam bypass
+ if (!this.tabSpamThrottler.isIncrementAndUnderThreshold() && !this.server.getPlayerList().isOp(this.player.getGameProfile()) && !this.server.isSingleplayerOwner(this.player.getGameProfile())) { // Paper - configurable tab spam limits
+ this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - Kick event cause // Paper - add proper async disconnect
+ return;
+ }
}
// CraftBukkit end
// Paper start - Don't suggest if tab-complete is disabled
@@ -2559,6 +2561,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
// Spigot start - spam exclusions
private void detectRateSpam(String s) {
+ if (this.getCraftPlayer().hasPermission("spam.bypass")) return; // Parchment - spam bypass
// CraftBukkit start - replaced with thread safe throttle
for ( String exclude : org.spigotmc.SpigotConfig.spamExclusions )
{
@@ -3339,9 +3342,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
public void handlePlaceRecipe(ServerboundPlaceRecipePacket packet) {
// Paper start - auto recipe limit
if (!org.bukkit.Bukkit.isPrimaryThread()) {
- if (!this.recipeSpamPackets.isIncrementAndUnderThreshold()) {
- this.disconnectAsync(net.minecraft.network.chat.Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - kick event cause // Paper - add proper async disconnect
- return;
+ if (!this.getCraftPlayer().hasPermission("spam.bypass")) { // Parchment - spam bypass
+ if (!this.recipeSpamPackets.isIncrementAndUnderThreshold()) {
+ this.disconnectAsync(net.minecraft.network.chat.Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - kick event cause // Paper - add proper async disconnect
+ return;
+ }
}
}
// Paper end - auto recipe limit

View File

@@ -5,21 +5,20 @@ Subject: [PATCH] Disable set respawn message
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
index cbcc4141c904360127780d6441a960842e661ef0..0abb7d69f534089b06d7221327a9be282bb6006c 100644
index 94de83a35998c82b807c6e5836d957f317dd2ceb..64752d1c129b85f7a700c91e43741ac4d9bedd22 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -2220,10 +2220,10 @@ public class ServerPlayer extends Player {
angle = (float) event.getLocation().getYaw();
@@ -2769,9 +2769,10 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
forced = event.isForced();
// Paper end
-
- if (event.willNotifyPlayer() && event.getNotification() != null) { // Paper
- this.sendSystemMessage(PaperAdventure.asVanilla(event.getNotification())); // Paper
// Paper end - Add PlayerSetSpawnEvent
- if (event.willNotifyPlayer() && event.getNotification() != null) { // Paper - Add PlayerSetSpawnEvent
- this.sendSystemMessage(PaperAdventure.asVanilla(event.getNotification())); // Paper - Add PlayerSetSpawnEvent
- }
+ // Parchment
+// if (event.willNotifyPlayer() && event.getNotification() != null) { // Paper
+// this.sendSystemMessage(PaperAdventure.asVanilla(event.getNotification())); // Paper
+// }
+ /* Parchment start
+ if (event.willNotifyPlayer() && event.getNotification() != null) { // Paper
+ this.sendSystemMessage(PaperAdventure.asVanilla(event.getNotification())); // Paper
+ } Parchment end */
this.respawnPosition = pos;
this.respawnDimension = dimension;

View File

@@ -1,52 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Mon, 25 Jul 2022 09:11:13 -0400
Subject: [PATCH] Add spam bypass permission
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index 2d8488b9aa088b6d5f0c7e557b8ad0b29bc4cd88..64848434496e4897b696f975c330756befa1e9b4 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -865,16 +865,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
public void handleCustomCommandSuggestions(ServerboundCommandSuggestionPacket packet) {
// PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); // Paper - run this async
// CraftBukkit start
+ if (!this.getCraftPlayer().hasPermission("spam.bypass")) { // Parchment - spam bypass
if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper start - split and make configurable
server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause
return;
}
// Paper start
- String str = packet.getCommand(); int index = -1;
+ String str = packet.getCommand();
+ int index = -1;
if (str.length() > 64 && ((index = str.indexOf(' ')) == -1 || index >= 64)) {
server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause
return;
}
+ } // Parchment - spam bypass
// Paper end
// CraftBukkit end
// Paper start - Don't suggest if tab-complete is disabled
@@ -2547,6 +2550,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
// Spigot start - spam exclusions
private void detectRateSpam(String s) {
+ if (this.getCraftPlayer().hasPermission("spam.bypass")) return; // Parchment - spam bypass
// CraftBukkit start - replaced with thread safe throttle
boolean counted = true;
for ( String exclude : org.spigotmc.SpigotConfig.spamExclusions )
@@ -3268,10 +3272,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
public void handlePlaceRecipe(ServerboundPlaceRecipePacket packet) {
// Paper start
if (!org.bukkit.Bukkit.isPrimaryThread()) {
+ if (!this.getCraftPlayer().hasPermission("spam.bypass")) { // Parchment - spam bypass
if (recipeSpamPackets.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamLimit) {
server.scheduleOnMain(() -> this.disconnect(net.minecraft.network.chat.Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause
return;
}
+ } // Parchment - spam bypass
}
// Paper end
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel());

View File

@@ -5,40 +5,34 @@ Subject: [PATCH] Make FixLight use action bar
diff --git a/src/main/java/io/papermc/paper/command/subcommands/FixLightCommand.java b/src/main/java/io/papermc/paper/command/subcommands/FixLightCommand.java
index 7784d72ddd6db00c674e22759c00c430222c4b85..b336789b74d6d6819b38e78cb2014f61de3f004b 100644
index 85950a1aa732ab8c01ad28bec9e0de140e1a172e..e8186e9569c57bc68ac20f6fac0c90001986b5e6 100644
--- a/src/main/java/io/papermc/paper/command/subcommands/FixLightCommand.java
+++ b/src/main/java/io/papermc/paper/command/subcommands/FixLightCommand.java
@@ -24,6 +24,7 @@ import static net.kyori.adventure.text.format.NamedTextColor.BLUE;
import static net.kyori.adventure.text.format.NamedTextColor.DARK_AQUA;
import static net.kyori.adventure.text.format.NamedTextColor.GREEN;
import static net.kyori.adventure.text.format.NamedTextColor.RED;
+import static net.kyori.adventure.text.format.NamedTextColor.YELLOW;
@DefaultQualifier(NonNull.class)
public final class FixLightCommand implements PaperSubcommand {
@@ -93,17 +94,20 @@ public final class FixLightCommand implements PaperSubcommand {
lightengine.relight(chunks,
@@ -95,16 +95,22 @@ public final class FixLightCommand implements PaperSubcommand {
((StarLightLightingProvider)lightengine).starlight$serverRelightChunks(chunks,
(final ChunkPos chunkPos) -> {
++relitChunks[0];
- sender.getBukkitEntity().sendMessage(text().color(DARK_AQUA).append(
- text("Relit chunk ", BLUE), text(chunkPos.toString()),
- text(", progress: ", BLUE), text((int) (Math.round(100.0 * (double) (relitChunks[0]) / (double) pending[0])) + "%")
- text(", progress: ", BLUE), text(ONE_DECIMAL_PLACES.get().format(100.0 * (double) (relitChunks[0]) / (double) pending[0]) + "%")
+
+ sender.getBukkitEntity().sendActionBar(text().color(DARK_AQUA).append(
+ text("Relighting Chunks: ", DARK_AQUA), text(chunkPos.toString()),
+ text(" " + relitChunks[0], YELLOW),
+ text(" " + relitChunks[0], net.kyori.adventure.text.format.NamedTextColor.YELLOW),
+ text("/", DARK_AQUA),
+ text(pending[0] + " ", YELLOW),
+ text("(" + (int) (Math.round(100.0 * (double) (relitChunks[0]) / (double) pending[0])) + "%)", YELLOW)
+ text(pending[0] + " ", net.kyori.adventure.text.format.NamedTextColor.YELLOW),
+ text("(" + (int) (Math.round(100.0 * (double) (relitChunks[0]) / (double) pending[0])) + "%)", net.kyori.adventure.text.format.NamedTextColor.YELLOW)
));
},
(final int totalRelit) -> {
final long end = System.nanoTime();
final long diff = Math.round(1.0e-6 * (end - start));
+ final long diff = Math.round(1.0e-6 * (end - start));
sender.getBukkitEntity().sendMessage(text().color(DARK_AQUA).append(
- text("Relit ", BLUE), text(totalRelit),
- text(" chunks. Took ", BLUE), text(diff + "ms")
+ text("Relit ", DARK_AQUA), text(totalRelit, YELLOW),
+ text(" chunks. Took ", DARK_AQUA), text(diff + "ms", YELLOW)
- text(" chunks. Took ", BLUE), text(ONE_DECIMAL_PLACES.get().format(1.0e-6 * (end - start)) + "ms")
+
+ text("Relit ", DARK_AQUA), text(totalRelit, net.kyori.adventure.text.format.NamedTextColor.YELLOW),
+ text(" chunks. Took ", DARK_AQUA), text(diff + "ms", net.kyori.adventure.text.format.NamedTextColor.YELLOW)
));
if (done != null) {
done.run();

View File

@@ -0,0 +1,249 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Thu, 16 Mar 2023 23:11:05 -0400
Subject: [PATCH] Add PreEntityShootBowEvent
diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
index 32670a3cb4b54b66d655197e3fde834d2b2b6d34..ec0f692bfc19669797b9b355fe4028578be7a133 100644
--- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
+++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
@@ -206,6 +206,11 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
ItemStack itemstack = this.getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, Items.BOW));
ItemStack itemstack1 = this.getProjectile(itemstack);
AbstractArrow entityarrow = this.getArrow(itemstack1, pullProgress, itemstack);
+
+ // Parchment start
+ gg.projecteden.parchment.event.entity.PreEntityShootBowEvent preEvent = new gg.projecteden.parchment.event.entity.PreEntityShootBowEvent(this.getBukkitEntity(), this.getMainHandItem().asBukkitCopy(), itemstack1.asBukkitCopy());
+ if (!preEvent.callEvent()) return;
+ // Parchment end
double d0 = target.getX() - this.getX();
double d1 = target.getY(0.3333333333333333D) - entityarrow.getY();
double d2 = target.getZ() - this.getZ();
@@ -221,7 +226,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
}
if (event.getProjectile() == entityarrow.getBukkitEntity()) {
- Projectile.spawnProjectileUsingShoot(entityarrow, worldserver, itemstack1, d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - worldserver.getDifficulty().getId() * 4));
+ Projectile.spawnProjectileUsingShoot(entityarrow, worldserver, itemstack1, d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - worldserver.getDifficulty().getId() * 4), preEvent.isRelative());
}
// CraftBukkit end
}
diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
index db3aac9ba711dcd18ffc35c4a745ecaec89d0166..052125cdb7ae6aef5b247ca5509e61dd21b567a2 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
@@ -177,6 +177,10 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob {
ItemStack itemstack = this.getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, Items.BOW));
ItemStack itemstack1 = this.getProjectile(itemstack);
AbstractArrow entityarrow = ProjectileUtil.getMobArrow(this, itemstack1, pullProgress, itemstack);
+
+ gg.projecteden.parchment.event.entity.PreEntityShootBowEvent preEvent = new gg.projecteden.parchment.event.entity.PreEntityShootBowEvent(this.getBukkitEntity(), this.getMainHandItem().asBukkitCopy(), itemstack1.asBukkitCopy());
+ if (!preEvent.callEvent()) return;
+ // Parchment end
double d0 = target.getX() - this.getX();
double d1 = target.getY(0.3333333333333333D) - entityarrow.getY();
double d2 = target.getZ() - this.getZ();
@@ -192,7 +196,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob {
}
if (event.getProjectile() == entityarrow.getBukkitEntity()) {
- Projectile.spawnProjectileUsingShoot(entityarrow, worldserver, itemstack1, d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - worldserver.getDifficulty().getId() * 4));
+ Projectile.spawnProjectileUsingShoot(entityarrow, worldserver, itemstack1, d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - worldserver.getDifficulty().getId() * 4), preEvent.isRelative());
}
// Paper end - EntityShootBowEvent
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
index 571f0699772eecbe02d71845da82a142321f2142..937da68b6d9aac6ad0c37de7f9db888eb29e017b 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
@@ -164,8 +164,10 @@ public abstract class AbstractArrow extends Projectile {
}
@Override
- public void shoot(double x, double y, double z, float power, float uncertainty) {
- super.shoot(x, y, z, power, uncertainty);
+ // Parchment start
+ public void shoot(double x, double y, double z, float speed, float divergence, boolean relative) {
+ super.shoot(x, y, z, speed, divergence, relative);
+ // Parchment end
this.life = 0;
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
index 6c2d4d6f3a36ab452dfd3c33f66e54f152906639..ed9ca8381bd23336bd1859f4bdc1f18d4867ee1e 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
@@ -192,9 +192,17 @@ public abstract class Projectile extends Entity implements TraceableEntity {
}
public void shoot(double x, double y, double z, float power, float uncertainty) {
- Vec3 vec3d = this.getMovementToShoot(x, y, z, power, uncertainty);
+ // Parchment start
+ shoot(x, y, z, power, uncertainty, true);
+ }
+
+ public void shoot(double x, double y, double z, float speed, float divergence, boolean relative) {
+ // Parchment end
+ Vec3 vec3d = this.getMovementToShoot(x, y, z, speed, divergence);
- this.setDeltaMovement(vec3d);
+ if (relative) { // Parchment
+ this.setDeltaMovement(vec3d);
+ } // Parchment
this.hasImpulse = true;
double d3 = vec3d.horizontalDistance();
@@ -205,6 +213,12 @@ public abstract class Projectile extends Entity implements TraceableEntity {
}
public void shootFromRotation(Entity shooter, float pitch, float yaw, float roll, float speed, float divergence) {
+ // Parchment start
+ shootFromRotation(shooter, pitch, yaw, roll, speed, divergence, true);
+ }
+
+ public void shootFromRotation(Entity shooter, float pitch, float yaw, float roll, float speed, float divergence, boolean relative) {
+ // Parchment end
float f5 = -Mth.sin(yaw * 0.017453292F) * Mth.cos(pitch * 0.017453292F);
float f6 = -Mth.sin((pitch + roll) * 0.017453292F);
float f7 = Mth.cos(yaw * 0.017453292F) * Mth.cos(pitch * 0.017453292F);
@@ -212,7 +226,7 @@ public abstract class Projectile extends Entity implements TraceableEntity {
this.shoot((double) f5, (double) f6, (double) f7, speed, divergence);
Vec3 vec3d = shooter.getKnownMovement();
// Paper start - allow disabling relative velocity
- if (!shooter.level().paperConfig().misc.disableRelativeProjectileVelocity) {
+ if (!shooter.level().paperConfig().misc.disableRelativeProjectileVelocity && relative) {
this.setDeltaMovement(this.getDeltaMovement().add(vec3d.x, shooter.onGround() ? 0.0D : vec3d.y, vec3d.z));
}
// Paper end - allow disabling relative velocity
@@ -230,8 +244,12 @@ public abstract class Projectile extends Entity implements TraceableEntity {
}
public static <T extends Projectile> T spawnProjectileUsingShoot(Projectile.ProjectileFactory<T> creator, ServerLevel world, ItemStack projectileStack, LivingEntity shooter, double velocityX, double velocityY, double velocityZ, float power, float divergence) {
+ return Projectile.spawnProjectileUsingShoot(creator, world, projectileStack, shooter, velocityX, velocityY, velocityZ, power, divergence, true);
+ }
+
+ public static <T extends Projectile> T spawnProjectileUsingShoot(Projectile.ProjectileFactory<T> creator, ServerLevel world, ItemStack projectileStack, LivingEntity shooter, double velocityX, double velocityY, double velocityZ, float power, float divergence, boolean relative) {
return Projectile.spawnProjectile(creator.create(world, shooter, projectileStack), world, projectileStack, (iprojectile) -> {
- iprojectile.shoot(velocityX, velocityY, velocityZ, power, divergence);
+ iprojectile.shoot(velocityX, velocityY, velocityZ, power, divergence, relative);
});
}
@@ -239,12 +257,22 @@ public abstract class Projectile extends Entity implements TraceableEntity {
// Paper start - fixes and addition to spawn reason API
return spawnProjectileUsingShootDelayed(projectile, world, projectileStack, velocityX, velocityY, velocityZ, power, divergence).spawn();
}
+ public static <T extends Projectile> T spawnProjectileUsingShoot(T projectile, ServerLevel world, ItemStack projectileStack, double velocityX, double velocityY, double velocityZ, float power, float divergence, boolean relative) {
+ // Paper start - fixes and addition to spawn reason API
+ return spawnProjectileUsingShootDelayed(projectile, world, projectileStack, velocityX, velocityY, velocityZ, power, divergence, relative).spawn();
+ }
public static <T extends Projectile> Delayed<T> spawnProjectileUsingShootDelayed(T projectile, ServerLevel world, ItemStack projectileStack, double velocityX, double velocityY, double velocityZ, float power, float divergence) {
return Projectile.spawnProjectileDelayed(projectile, world, projectileStack, (iprojectile) -> {
// Paper end - fixes and addition to spawn reason API
projectile.shoot(velocityX, velocityY, velocityZ, power, divergence);
});
}
+ public static <T extends Projectile> Delayed<T> spawnProjectileUsingShootDelayed(T projectile, ServerLevel world, ItemStack projectileStack, double velocityX, double velocityY, double velocityZ, float power, float divergence, boolean relative) {
+ return Projectile.spawnProjectileDelayed(projectile, world, projectileStack, (iprojectile) -> {
+ // Paper end - fixes and addition to spawn reason API
+ projectile.shoot(velocityX, velocityY, velocityZ, power, divergence, relative);
+ });
+ }
public static <T extends Projectile> T spawnProjectile(T projectile, ServerLevel world, ItemStack projectileStack) {
return Projectile.spawnProjectile(projectile, world, projectileStack, (iprojectile) -> {
diff --git a/src/main/java/net/minecraft/world/item/BowItem.java b/src/main/java/net/minecraft/world/item/BowItem.java
index bb593209c95c9cf1f9c5d52d52fab4a33ddbabcf..768964dbc785cb78d5ef517cf88f9f8b1f6af629 100644
--- a/src/main/java/net/minecraft/world/item/BowItem.java
+++ b/src/main/java/net/minecraft/world/item/BowItem.java
@@ -37,8 +37,13 @@ public class BowItem extends ProjectileWeaponItem {
return false;
} else {
List<ItemStack> list = draw(stack, itemStack, player);
- if (world instanceof ServerLevel serverLevel && !list.isEmpty()) {
- this.shoot(serverLevel, player, player.getUsedItemHand(), stack, list, f * 3.0F, 1.0F, f == 1.0F, null);
+
+ if (!world.isClientSide() && !list.isEmpty()) {
+ // Parchment start
+ gg.projecteden.parchment.event.entity.PreEntityShootBowEvent preEvent = new gg.projecteden.parchment.event.entity.PreEntityShootBowEvent(user.getBukkitEntity(), stack.asBukkitCopy(), itemStack.asBukkitCopy());
+ if (!preEvent.callEvent()) return false;
+ // Parchment end
+ this.shoot((ServerLevel) world, player, player.getUsedItemHand(), stack, list, f * 3.0F, 1.0F, f == 1.0F, null, preEvent.isRelative());
}
world.playSound(
@@ -60,9 +65,9 @@ public class BowItem extends ProjectileWeaponItem {
@Override
protected void shootProjectile(
- LivingEntity shooter, Projectile projectile, int index, float speed, float divergence, float yaw, @Nullable LivingEntity target
+ LivingEntity shooter, Projectile projectile, int index, float speed, float divergence, float yaw, @Nullable LivingEntity target, boolean relative
) {
- projectile.shootFromRotation(shooter, shooter.getXRot(), shooter.getYRot() + yaw, 0.0F, speed, divergence);
+ projectile.shootFromRotation(shooter, shooter.getXRot(), shooter.getYRot() + yaw, 0.0F, speed, divergence, relative);
}
public static float getPowerForTime(int useTicks) {
diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java
index 52c40eafc77e50a6fd21b9a7a250cea501f11690..2eca32e58e41f15cd9453e936d19c26a1a4b588c 100644
--- a/src/main/java/net/minecraft/world/item/CrossbowItem.java
+++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java
@@ -140,7 +140,7 @@ public class CrossbowItem extends ProjectileWeaponItem {
@Override
protected void shootProjectile(
- LivingEntity shooter, Projectile projectile, int index, float speed, float divergence, float yaw, @Nullable LivingEntity target
+ LivingEntity shooter, Projectile projectile, int index, float speed, float divergence, float yaw, @Nullable LivingEntity target, boolean relative
) {
Vector3f vector3f;
if (target != null) {
@@ -201,8 +201,14 @@ public class CrossbowItem extends ProjectileWeaponItem {
) {
if (world instanceof ServerLevel serverLevel) {
ChargedProjectiles chargedProjectiles = stack.set(DataComponents.CHARGED_PROJECTILES, ChargedProjectiles.EMPTY);
+ // Parchment start
+ gg.projecteden.parchment.event.entity.PreEntityShootBowEvent preEvent = new gg.projecteden.parchment.event.entity.PreEntityShootBowEvent(shooter.getBukkitEntity(), stack.asBukkitCopy(), chargedProjectiles.getItems().get(0).asBukkitCopy());
+ if (!preEvent.callEvent()) return;
+ // TODO: handle relative flag in CrossbowAttackMob#shootCrossbowProjectile
+ // Parchment end
+
if (chargedProjectiles != null && !chargedProjectiles.isEmpty()) {
- this.shoot(serverLevel, shooter, hand, stack, chargedProjectiles.getItems(), speed, divergence, shooter instanceof Player, target);
+ this.shoot(serverLevel, shooter, hand, stack, chargedProjectiles.getItems(), speed, divergence, shooter instanceof Player, target, preEvent.isRelative());
if (shooter instanceof ServerPlayer serverPlayer) {
CriteriaTriggers.SHOT_CROSSBOW.trigger(serverPlayer, stack);
serverPlayer.awardStat(Stats.ITEM_USED.get(stack.getItem()));
diff --git a/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java b/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java
index 78ba170a83f8c026bd110eae494c52577182ed61..5ece12e41233727fbd1106d067e607810341acab 100644
--- a/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java
+++ b/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java
@@ -41,7 +41,7 @@ public abstract class ProjectileWeaponItem extends Item {
public abstract int getDefaultProjectileRange();
- protected void shoot(ServerLevel world, LivingEntity shooter, InteractionHand hand, ItemStack stack, List<ItemStack> projectiles, float speed, float divergence, boolean critical, @Nullable LivingEntity target) {
+ protected void shoot(ServerLevel world, LivingEntity shooter, InteractionHand hand, ItemStack stack, List<ItemStack> projectiles, float speed, float divergence, boolean critical, @Nullable LivingEntity target, boolean relative) {
float f2 = EnchantmentHelper.processProjectileSpread(world, stack, shooter, 0.0F);
float f3 = projectiles.size() == 1 ? 0.0F : 2.0F * f2 / (float) (projectiles.size() - 1);
float f4 = (float) ((projectiles.size() - 1) % 2) * f3 / 2.0F;
@@ -56,8 +56,9 @@ public abstract class ProjectileWeaponItem extends Item {
f5 = -f5;
// CraftBukkit start
Projectile iprojectile = this.createProjectile(world, shooter, stack, itemstack1, critical);
- this.shootProjectile(shooter, iprojectile, i, speed, divergence, f6, target);
+ this.shootProjectile(shooter, iprojectile, i, speed, divergence, f6, target, relative);
+ // CraftBukkit start
org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(shooter, stack, itemstack1, iprojectile, hand, speed, true);
if (event.isCancelled()) {
event.getProjectile().remove();
@@ -86,7 +87,7 @@ public abstract class ProjectileWeaponItem extends Item {
return 1;
}
- protected abstract void shootProjectile(LivingEntity shooter, Projectile projectile, int index, float speed, float divergence, float yaw, @Nullable LivingEntity target);
+ protected abstract void shootProjectile(LivingEntity shooter, Projectile projectile, int index, float speed, float divergence, float yaw, @Nullable LivingEntity target, boolean relative);
protected Projectile createProjectile(Level world, LivingEntity shooter, ItemStack weaponStack, ItemStack projectileStack, boolean critical) {
Item item = projectileStack.getItem();

View File

@@ -0,0 +1,19 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Sun, 19 Mar 2023 20:02:00 -0400
Subject: [PATCH] Return Displays in getTargetEntity
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index f36a075dbee2b96d01899e02460b1d8443e91749..6782f6184dedd38dfefefd48a6399cd141b00711 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -4340,7 +4340,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
Vec3 direction = this.getLookAngle();
Vec3 end = start.add(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance);
- List<Entity> entityList = this.level().getEntities(this, getBoundingBox().expandTowards(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance).inflate(1.0D, 1.0D, 1.0D), EntitySelector.NO_SPECTATORS.and(Entity::isPickable));
+ List<Entity> entityList = this.level().getEntities(this, getBoundingBox().expandTowards(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance).inflate(1.0D, 1.0D, 1.0D), EntitySelector.NO_SPECTATORS.and(entity -> entity.isPickable() || entity instanceof Display)); // Parchment - add displays
double distance = 0.0D;
net.minecraft.world.phys.EntityHitResult result = null;

View File

@@ -0,0 +1,114 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Thu, 21 Dec 2023 20:58:03 -0500
Subject: [PATCH] Add CustomBlockUpdateEvent
diff --git a/src/main/java/net/minecraft/world/level/block/NoteBlock.java b/src/main/java/net/minecraft/world/level/block/NoteBlock.java
index 6582db84c5307257f16c321453491cf24e40c9c7..eb54895ed35eb623bf93d375ff2d01a49fc2824c 100644
--- a/src/main/java/net/minecraft/world/level/block/NoteBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/NoteBlock.java
@@ -68,12 +68,14 @@ public class NoteBlock extends Block {
@Override
public BlockState getStateForPlacement(BlockPlaceContext ctx) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(this.defaultBlockState()), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.INSTRUMENT).callEvent()) return this.defaultBlockState();
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableNoteblockUpdates) return this.defaultBlockState(); // Paper - place without considering instrument
return this.setInstrument(ctx.getLevel(), ctx.getClickedPos(), this.defaultBlockState());
}
@Override
protected BlockState updateShape(BlockState state, LevelReader world, ScheduledTickAccess tickView, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource random) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.INSTRUMENT, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, (Level) world)).callEvent()) return state;
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableNoteblockUpdates) return state; // Paper - prevent noteblock instrument from updating
boolean flag = direction.getAxis() == Direction.Axis.Y;
@@ -82,6 +84,7 @@ public class NoteBlock extends Block {
@Override
protected void neighborChanged(BlockState state, Level world, BlockPos pos, Block sourceBlock, @Nullable Orientation wireOrientation, boolean notify) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(this.defaultBlockState()), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.POWERED, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, world)).callEvent()) return;
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableNoteblockUpdates) return; // Paper - prevent noteblock powered-state from updating
boolean flag1 = world.hasNeighborSignal(pos);
@@ -119,7 +122,8 @@ public class NoteBlock extends Block {
@Override
protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) {
if (!world.isClientSide) {
- if (!io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableNoteblockUpdates) state = (BlockState) state.cycle(NoteBlock.NOTE); // Paper - prevent noteblock note from updating
+ if (!io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableNoteblockUpdates ||
+ !new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(this.defaultBlockState()), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.PITCH, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, world)).callEvent()) state = (BlockState) state.cycle(NoteBlock.NOTE); // Paper - prevent noteblock note from updating
world.setBlock(pos, state, 3);
this.playNote(player, state, world, pos);
player.awardStat(Stats.TUNE_NOTEBLOCK);
diff --git a/src/main/java/net/minecraft/world/level/block/TripWireBlock.java b/src/main/java/net/minecraft/world/level/block/TripWireBlock.java
index 74cce7874809dcbce2718ec3840bb6bb3127e871..d46503c9d31877412ba4ae5a3bb22c0a444662cf 100644
--- a/src/main/java/net/minecraft/world/level/block/TripWireBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/TripWireBlock.java
@@ -68,21 +68,25 @@ public class TripWireBlock extends Block {
@Override
public BlockState getStateForPlacement(BlockPlaceContext ctx) {
- if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return this.defaultBlockState(); // Paper - place tripwire without updating
Level world = ctx.getLevel();
BlockPos blockposition = ctx.getClickedPos();
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(this.defaultBlockState()), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.SHAPE).callEvent()) return this.defaultBlockState();
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return this.defaultBlockState(); // Paper - place tripwire without updating
+
return (BlockState) ((BlockState) ((BlockState) ((BlockState) this.defaultBlockState().setValue(TripWireBlock.NORTH, this.shouldConnectTo(world.getBlockState(blockposition.north()), Direction.NORTH))).setValue(TripWireBlock.EAST, this.shouldConnectTo(world.getBlockState(blockposition.east()), Direction.EAST))).setValue(TripWireBlock.SOUTH, this.shouldConnectTo(world.getBlockState(blockposition.south()), Direction.SOUTH))).setValue(TripWireBlock.WEST, this.shouldConnectTo(world.getBlockState(blockposition.west()), Direction.WEST));
}
@Override
protected BlockState updateShape(BlockState state, LevelReader world, ScheduledTickAccess tickView, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource random) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.SHAPE, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, (Level) world)).callEvent()) return state;
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return state; // Paper - prevent tripwire from updating
return direction.getAxis().isHorizontal() ? (BlockState) state.setValue((Property) TripWireBlock.PROPERTY_BY_DIRECTION.get(direction), this.shouldConnectTo(neighborState, direction)) : super.updateShape(state, world, tickView, pos, direction, neighborPos, neighborState, random);
}
@Override
protected void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.SHAPE, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, world)).callEvent()) return;
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating
if (!oldState.is(state.getBlock())) {
this.updateSource(world, pos, state);
@@ -91,6 +95,7 @@ public class TripWireBlock extends Block {
@Override
protected void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean moved) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.SHAPE, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, world)).callEvent()) return;
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating
if (!moved && !state.is(newState.getBlock())) {
this.updateSource(world, pos, (BlockState) state.setValue(TripWireBlock.POWERED, true));
@@ -99,6 +104,7 @@ public class TripWireBlock extends Block {
@Override
public BlockState playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.SHAPE, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, world)).callEvent()) return state;
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return state; // Paper - prevent disarming tripwires
if (!world.isClientSide && !player.getMainHandItem().isEmpty() && player.getMainHandItem().is(Items.SHEARS)) {
world.setBlock(pos, (BlockState) state.setValue(TripWireBlock.DISARMED, true), 4);
@@ -109,6 +115,7 @@ public class TripWireBlock extends Block {
}
private void updateSource(Level world, BlockPos pos, BlockState state) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.SHAPE, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, world)).callEvent()) return;
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating
Direction[] aenumdirection = new Direction[]{Direction.SOUTH, Direction.WEST};
int i = aenumdirection.length;
@@ -147,6 +154,7 @@ public class TripWireBlock extends Block {
@Override
protected void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.POWERED, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, world)).callEvent()) return;
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent tripwires from detecting collision
if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (!world.isClientSide) {
@@ -158,6 +166,7 @@ public class TripWireBlock extends Block {
@Override
protected void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) {
+ if (!new gg.projecteden.parchment.event.block.CustomBlockUpdateEvent(org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), gg.projecteden.parchment.event.block.CustomBlockUpdateEvent.UpdateType.POWERED, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, world)).callEvent()) return;
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent tripwire pressed check
if ((Boolean) world.getBlockState(pos).getValue(TripWireBlock.POWERED)) {
this.checkPressed(world, pos);

View File

@@ -1,18 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-Mc <cjblanton2@gmail.com>
Date: Mon, 9 Jan 2023 19:21:16 -0500
Subject: [PATCH] Remove Unneeded Override
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
index 206bc729f24f679bed3b945b640778873699676a..e035ee2e499c6322c08ce6aa14fdebe134777fa2 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -1736,7 +1736,6 @@ public class ServerLevel extends Level implements WorldGenLevel {
// Parchment end
}
- @Override
public void playSeededSound(@org.jetbrains.annotations.Nullable Player except, Entity entity, SoundEvent sound, SoundSource category, float volume, float pitch, long seed) {
// Parchment start - sound event
CraftEventFactory.playSoundEvent(new gg.projecteden.parchment.event.sound.SoundEvent(

View File

@@ -0,0 +1,91 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Mon, 15 Jan 2024 16:39:10 -0500
Subject: [PATCH] Entity Data Storage
diff --git a/src/main/java/gg/projecteden/parchment/entity/EntityDataServices.java b/src/main/java/gg/projecteden/parchment/entity/EntityDataServices.java
new file mode 100644
index 0000000000000000000000000000000000000000..30f8fd154136d05267e8737ff04a0be45b23a35d
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/entity/EntityDataServices.java
@@ -0,0 +1,16 @@
+package gg.projecteden.parchment.entity;
+
+public class EntityDataServices {
+
+ private static boolean initialized;
+
+ public static void init() {
+ if (initialized) {
+ throw new RuntimeException("EntityData Services already initialized");
+ }
+ initialized = true;
+
+ // Initialize Services Here
+ }
+
+}
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
index 17a158ff6ce6520b69a5a0032ba4c05449dd0cf8..9309598317d361ecef658fe4de57c64ba73f36c1 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -284,6 +284,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
return false;
}
+ gg.projecteden.parchment.entity.EntityDataServices.init();
+
// CraftBukkit start
// this.setPlayerList(new DedicatedPlayerList(this, this.registries(), this.playerDataStorage)); // Spigot - moved up
this.server.loadPlugins();
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index ed5b00620527c1776722d25b1b45f1544802a341..544882862b2248d426185dd67bd217f593caef2a 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -178,6 +178,31 @@ import org.bukkit.plugin.PluginManager;
public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, ca.spottedleaf.moonrise.patches.chunk_system.entity.ChunkSystemEntity, ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity { // Paper - rewrite chunk system // Paper - optimise entity tracker
+ @javax.annotation.Nullable
+ private gg.projecteden.parchment.entity.EntityData storedEntityData;
+
+ /**
+ * Retrieves the stored EntityData for this entity
+ * @return The currently stored EntityData
+ */
+ public gg.projecteden.parchment.entity.EntityData getStoredEntityData() {
+ if (this.storedEntityData == null) {
+ this.storedEntityData = gg.projecteden.parchment.entity.EntityData.create(this.getBukkitEntity());
+ }
+ return this.storedEntityData;
+ }
+
+ /**
+ * Clears the currently stored EntityData for this entity
+ * @return the previously stored EntityData
+ */
+ public @javax.annotation.Nullable gg.projecteden.parchment.entity.EntityData clearStoredEntityData() {
+ gg.projecteden.parchment.entity.EntityData data = this.storedEntityData;
+ this.storedEntityData = null;
+
+ return data;
+ }
+
// CraftBukkit start
private static final int CURRENT_LEVEL = 2;
public boolean preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported; keep initial motion on first setPositionRotation
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
index ddabaed899c755925ad8618b78c33dacaf2126ac..134dba0bf6340772c7b3fa233dfabffd859422b2 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -1306,4 +1306,9 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
}
}
// Paper end - broadcast hurt animation
+
+ public gg.projecteden.parchment.entity.EntityData getStoredEntityData() {
+ return this.entity.getStoredEntityData();
+ }
+
}

View File

@@ -1,19 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Wed, 1 Mar 2023 22:02:23 -0500
Subject: [PATCH] Remove Hanging Entity Debug
diff --git a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
index a22139bd4202237eb6977b95786b9a3647821874..47e93f5a3e9f8a71a121be0309e1307b1241bcf7 100644
--- a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
@@ -273,7 +273,7 @@ public abstract class HangingEntity extends Entity {
BlockPos blockposition = new BlockPos(nbt.getInt("TileX"), nbt.getInt("TileY"), nbt.getInt("TileZ"));
if (!blockposition.closerThan(this.blockPosition(), 16.0D)) {
- HangingEntity.LOGGER.error("Hanging entity at invalid position: {}", blockposition);
+ //HangingEntity.LOGGER.error("Hanging entity at invalid position: {}", blockposition);
} else {
this.pos = blockposition;
}

View File

@@ -1,149 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Thu, 16 Mar 2023 23:11:05 -0400
Subject: [PATCH] Add PreEntityShootBowEvent
diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
index f2094c52196b45adfd51d8aebcc4c46b779b0925..0498d3d0cee58e10351bd8c4ce7b9a3dbc862d09 100644
--- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
+++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
@@ -199,13 +199,19 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
@Override
public void performRangedAttack(LivingEntity target, float pullProgress) {
ItemStack itemstack = this.getProjectile(this.getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, Items.BOW)));
+
+ gg.projecteden.parchment.event.entity.PreEntityShootBowEvent preEvent = new gg.projecteden.parchment.event.entity.PreEntityShootBowEvent(this.getBukkitEntity(), this.getMainHandItem().asBukkitCopy(), itemstack.asBukkitCopy());
+ if (!preEvent.callEvent()) {
+ return;
+ }
+
AbstractArrow entityarrow = this.getArrow(itemstack, pullProgress);
double d0 = target.getX() - this.getX();
double d1 = target.getY(0.3333333333333333D) - entityarrow.getY();
double d2 = target.getZ() - this.getZ();
double d3 = Math.sqrt(d0 * d0 + d2 * d2);
- entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.level.getDifficulty().getId() * 4));
+ entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.level.getDifficulty().getId() * 4), preEvent.isRelative());
// CraftBukkit start
org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), entityarrow.getPickupItem(), entityarrow, net.minecraft.world.InteractionHand.MAIN_HAND, 0.8F, true); // Paper
if (event.isCancelled()) {
diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
index 10573602c9bc73713cbd6989762d3dbb6f6fcf8c..b65c31bc257e362247855faabf49aec6347cec86 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
@@ -189,13 +189,19 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob {
@Override
public void performRangedAttack(LivingEntity target, float pullProgress) {
ItemStack itemstack = this.getProjectile(this.getItemInHand(ProjectileUtil.getWeaponHoldingHand(this, Items.BOW)));
+
+ gg.projecteden.parchment.event.entity.PreEntityShootBowEvent preEvent = new gg.projecteden.parchment.event.entity.PreEntityShootBowEvent(this.getBukkitEntity(), this.getMainHandItem().asBukkitCopy(), itemstack.asBukkitCopy());
+ if (!preEvent.callEvent()) {
+ return;
+ }
+
AbstractArrow entityarrow = ProjectileUtil.getMobArrow(this, itemstack, pullProgress);
double d0 = target.getX() - this.getX();
double d1 = target.getY(0.3333333333333333D) - entityarrow.getY();
double d2 = target.getZ() - this.getZ();
double d3 = Math.sqrt(d0 * d0 + d2 * d2);
- entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.level.getDifficulty().getId() * 4));
+ entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.level.getDifficulty().getId() * 4), preEvent.isRelative());
// Paper start
org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), entityarrow.getPickupItem(), entityarrow, target.getUsedItemHand(), 0.8F, true);
if (event.isCancelled()) {
diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
index 5d6d26cfe8f0ab68a3145214b3fc126ca7a71a66..e43357fd32866c340bf8a8cfe415529941512f22 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
@@ -129,8 +129,8 @@ public abstract class AbstractArrow extends Projectile {
}
@Override
- public void shoot(double x, double y, double z, float speed, float divergence) {
- super.shoot(x, y, z, speed, divergence);
+ public void shoot(double x, double y, double z, float speed, float divergence, boolean relative) {
+ super.shoot(x, y, z, speed, divergence, relative);
this.life = 0;
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
index 8b2a3a8482018b7db7de81bc295862f783e17ce5..bab146d88cf52e44087868a06ccdfcee67adf2b9 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
@@ -145,9 +145,15 @@ public abstract class Projectile extends Entity implements TraceableEntity {
}
public void shoot(double x, double y, double z, float speed, float divergence) {
+ shoot(x, y, z, speed, divergence, true);
+ }
+
+ public void shoot(double x, double y, double z, float speed, float divergence, boolean relative) {
Vec3 vec3d = (new Vec3(x, y, z)).normalize().add(this.random.triangle(0.0D, 0.0172275D * (double) divergence), this.random.triangle(0.0D, 0.0172275D * (double) divergence), this.random.triangle(0.0D, 0.0172275D * (double) divergence)).scale((double) speed);
- this.setDeltaMovement(vec3d);
+ if (relative) {
+ this.setDeltaMovement(vec3d);
+ }
double d3 = vec3d.horizontalDistance();
this.setYRot((float) (Mth.atan2(vec3d.x, vec3d.z) * 57.2957763671875D));
@@ -157,6 +163,10 @@ public abstract class Projectile extends Entity implements TraceableEntity {
}
public void shootFromRotation(Entity shooter, float pitch, float yaw, float roll, float speed, float divergence) {
+ this.shootFromRotation(shooter, pitch, yaw, roll, speed, divergence, true);
+ }
+
+ public void shootFromRotation(Entity shooter, float pitch, float yaw, float roll, float speed, float divergence, boolean relative) {
float f5 = -Mth.sin(yaw * 0.017453292F) * Mth.cos(pitch * 0.017453292F);
float f6 = -Mth.sin((pitch + roll) * 0.017453292F);
float f7 = Mth.cos(yaw * 0.017453292F) * Mth.cos(pitch * 0.017453292F);
@@ -164,7 +174,7 @@ public abstract class Projectile extends Entity implements TraceableEntity {
this.shoot((double) f5, (double) f6, (double) f7, speed, divergence);
Vec3 vec3d = shooter.getDeltaMovement();
- if (!shooter.level.paperConfig().misc.disableRelativeProjectileVelocity) this.setDeltaMovement(this.getDeltaMovement().add(vec3d.x, shooter.isOnGround() ? 0.0D : vec3d.y, vec3d.z)); // Paper - allow disabling relative velocity
+ if (!shooter.level.paperConfig().misc.disableRelativeProjectileVelocity && relative) this.setDeltaMovement(this.getDeltaMovement().add(vec3d.x, shooter.isOnGround() ? 0.0D : vec3d.y, vec3d.z)); // Paper - allow disabling relative velocity
}
// CraftBukkit start - call projectile hit event
diff --git a/src/main/java/net/minecraft/world/item/BowItem.java b/src/main/java/net/minecraft/world/item/BowItem.java
index 08d597db1a5345a343777a01427655e6bf2c926b..c047a2cf20a3f02b2d4a2fb71306234ccfa84429 100644
--- a/src/main/java/net/minecraft/world/item/BowItem.java
+++ b/src/main/java/net/minecraft/world/item/BowItem.java
@@ -42,9 +42,15 @@ public class BowItem extends ProjectileWeaponItem implements Vanishable {
if (!world.isClientSide) {
ArrowItem itemarrow = (ArrowItem) (itemstack1.getItem() instanceof ArrowItem ? itemstack1.getItem() : Items.ARROW);
+
+ gg.projecteden.parchment.event.entity.PreEntityShootBowEvent preEvent = new gg.projecteden.parchment.event.entity.PreEntityShootBowEvent(entityhuman.getBukkitEntity(), stack.asBukkitCopy(), itemstack1.asBukkitCopy());
+ if (!preEvent.callEvent()) {
+ return;
+ }
+
AbstractArrow entityarrow = itemarrow.createArrow(world, itemstack1, entityhuman);
- entityarrow.shootFromRotation(entityhuman, entityhuman.getXRot(), entityhuman.getYRot(), 0.0F, f * 3.0F, 1.0F);
+ entityarrow.shootFromRotation(entityhuman, entityhuman.getXRot(), entityhuman.getYRot(), 0.0F, f * 3.0F, 1.0F, preEvent.isRelative());
if (f == 1.0F) {
entityarrow.setCritArrow(true);
}
diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java
index bc4f04c2512191da3c9e1c49f0716bb9128fc754..27276ee045cb0475dcbd47130d943fcaf597d119 100644
--- a/src/main/java/net/minecraft/world/item/CrossbowItem.java
+++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java
@@ -228,6 +228,11 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable {
private static void shootProjectile(Level world, LivingEntity shooter, InteractionHand hand, ItemStack crossbow, ItemStack projectile, float soundPitch, boolean creative, float speed, float divergence, float simulated) {
if (!world.isClientSide) {
+ gg.projecteden.parchment.event.entity.PreEntityShootBowEvent preEvent = new gg.projecteden.parchment.event.entity.PreEntityShootBowEvent(shooter.getBukkitEntity(), crossbow.asBukkitCopy(), projectile.asBukkitCopy());
+ if (!preEvent.callEvent()) {
+ return;
+ }
+
boolean flag1 = projectile.is(Items.FIREWORK_ROCKET);
Object object;

View File

@@ -0,0 +1,276 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Mon, 15 Jan 2024 20:53:54 -0500
Subject: [PATCH] Add Sidebar Utility
diff --git a/src/main/java/gg/projecteden/parchment/entity/EntityDataServices.java b/src/main/java/gg/projecteden/parchment/entity/EntityDataServices.java
index 30f8fd154136d05267e8737ff04a0be45b23a35d..7091340870607605521239893b8ab763f49d7999 100644
--- a/src/main/java/gg/projecteden/parchment/entity/EntityDataServices.java
+++ b/src/main/java/gg/projecteden/parchment/entity/EntityDataServices.java
@@ -1,5 +1,8 @@
package gg.projecteden.parchment.entity;
+import gg.projecteden.parchment.sidebar.SidebarBufferUtil;
+import gg.projecteden.parchment.sidebar.SidebarBufferUtilSpec;
+
public class EntityDataServices {
private static boolean initialized;
@@ -11,6 +14,7 @@ public class EntityDataServices {
initialized = true;
// Initialize Services Here
+ SidebarBufferUtilSpec.IMPL_KEY.set(new SidebarBufferUtil());
}
}
diff --git a/src/main/java/gg/projecteden/parchment/sidebar/SidebarBufferImpl.java b/src/main/java/gg/projecteden/parchment/sidebar/SidebarBufferImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..3184478d24e6c984d4e5b5f67253f966315b298c
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/sidebar/SidebarBufferImpl.java
@@ -0,0 +1,182 @@
+package gg.projecteden.parchment.sidebar;
+
+import gg.projecteden.parchment.util.StringUtils;
+import net.minecraft.network.Connection;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.chat.numbers.BlankFormat;
+import net.minecraft.network.chat.numbers.FixedFormat;
+import net.minecraft.network.chat.numbers.NumberFormat;
+import net.minecraft.network.protocol.game.*;
+import net.minecraft.server.dedicated.DedicatedServer;
+import net.minecraft.world.scores.DisplaySlot;
+import net.minecraft.world.scores.Objective;
+import net.minecraft.world.scores.PlayerTeam;
+import net.minecraft.world.scores.Team;
+import net.minecraft.world.scores.criteria.ObjectiveCriteria;
+import org.bukkit.craftbukkit.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+
+import java.util.Objects;
+import java.util.Optional;
+
+public class SidebarBufferImpl extends SidebarBuffer {
+
+ private static final int NAME_LIMIT = 38;
+ private static final int AFFIX_LIMIT = 16;
+ private static final int SIZE = 15;
+
+ static final int SIDEBAR_SLOT = 1;
+ private final Objective objective = new Objective(DedicatedServer.getServer().getScoreboard(), this.name,
+ ObjectiveCriteria.DUMMY, Component.literal(this.stagedTitle), ObjectiveCriteria.RenderType.INTEGER,
+ false, null);
+
+ private Connection connection;
+
+ SidebarBufferImpl(String name) {
+ super(name, SidebarBufferImpl.SIZE);
+ }
+
+ protected void setActive() {
+ objective.setDisplayName(Component.literal(StringUtils.colorize(this.stagedTitle)));
+ ClientboundSetObjectivePacket packet = new ClientboundSetObjectivePacket(this.objective, ClientboundSetObjectivePacket.METHOD_CHANGE);
+ ClientboundSetDisplayObjectivePacket packet2 = new ClientboundSetDisplayObjectivePacket(DisplaySlot.SIDEBAR, this.objective);
+
+ this.connection.send(packet);
+ this.connection.send(packet2);
+ }
+
+ protected void pushChanges() {
+ if (!Objects.equals(this.liveTitle, this.stagedTitle)) {
+ this.liveTitle = this.stagedTitle;
+
+ ClientboundSetObjectivePacket packet = new ClientboundSetObjectivePacket(this.objective, ClientboundSetObjectivePacket.METHOD_CHANGE);
+
+ this.connection.send(packet);
+ }
+
+ int liveEnd = this.size;
+ for (int i = 0; i < this.size; i++) {
+ if (this.liveLines[i] == null) {
+ liveEnd = i;
+ break;
+ }
+ }
+
+ int stagedEnd = this.size;
+ for (int i = 0; i < this.size; i++) {
+ if (this.stagedLines[i] == null) {
+ stagedEnd = i;
+ break;
+ }
+ }
+
+ int maxEnd = Math.max(liveEnd, stagedEnd);
+ int liveIdx = liveEnd - maxEnd;
+ int stagedIdx = stagedEnd - maxEnd;
+
+ for (int i = 0; i < this.size; i++) {
+ String live = liveIdx >= 0 ? this.liveLines[liveIdx] : null;
+ String staged = stagedIdx >= 0 ? this.stagedLines[stagedIdx] : null;
+
+ String liveDisplay = liveIdx >= 0 ? this.liveDisplays[liveIdx] : null;
+ String stagedDisplay = stagedIdx >= 0 ? this.stagedDisplays[stagedIdx] : null;
+
+ if (!Objects.equals(live, staged) || !Objects.equals(liveDisplay, stagedDisplay)) {
+ if (live != null) {
+ this.sendDelete(live, liveEnd - liveIdx);
+ }
+
+ if (staged != null) {
+ this.sendCreate(staged, stagedEnd - stagedIdx, this.stagedDisplays[stagedIdx]);
+ }
+ }
+
+ liveIdx++;
+ stagedIdx++;
+ }
+
+ System.arraycopy(this.stagedLines, 0, this.liveLines, 0, this.size);
+ System.arraycopy(this.stagedDisplays, 0, this.liveDisplays, 0, this.size);
+ }
+
+ @Override
+ protected void setOwner(Player player) {
+ this.connection = ((CraftPlayer) player).getHandle().connection.connection;
+
+ ClientboundSetObjectivePacket packet = new ClientboundSetObjectivePacket(this.objective, ClientboundSetObjectivePacket.METHOD_ADD);
+ this.connection.send(packet);
+
+ for (int i = 0; i < this.size; i++) {
+ String live = this.liveLines[i];
+
+ if (live != null) {
+ this.sendCreate(live, i, stagedDisplays[i]);
+ }
+ }
+ }
+
+ @Override
+ protected boolean checkTitle(String line) {
+ return line.length() <= 32;
+ }
+
+ @Override
+ protected boolean checkLine(String line) {
+ return line.length() <= SidebarBufferImpl.NAME_LIMIT + SidebarBufferImpl.AFFIX_LIMIT * 2;
+ }
+
+ private void sendCreate(String value, int line, String display) {
+ String id = "\u00a7" + (char) ('\u0080' + line);
+ value = StringUtils.colorize(value);
+
+ if (value.length() > SidebarBufferImpl.NAME_LIMIT) {
+ String prefix = value.substring(0, SidebarBufferImpl.AFFIX_LIMIT);
+ String suffix = "";
+
+ value = value.substring(SidebarBufferImpl.AFFIX_LIMIT);
+
+ if (value.length() > SidebarBufferImpl.NAME_LIMIT) {
+ suffix = value.substring(SidebarBufferImpl.NAME_LIMIT);
+ value = value.substring(0, SidebarBufferImpl.NAME_LIMIT);
+ }
+
+ PlayerTeam team = new PlayerTeam(DedicatedServer.getServer().getScoreboard(), this.getTeamName(line));
+ team.setPlayerPrefix(Component.literal(prefix));
+ team.setPlayerSuffix(Component.literal(suffix));
+ team.setNameTagVisibility(Team.Visibility.NEVER);
+ team.setCollisionRule(Team.CollisionRule.NEVER);
+ team.getPlayers().add(id + value);
+ ClientboundSetPlayerTeamPacket packet = ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, true);
+
+ this.connection.send(packet);
+ }
+
+ java.util.Optional<NumberFormat> numberFormat = java.util.Optional.of((display == null || display.isEmpty() || display.isBlank()) ? BlankFormat.INSTANCE : new FixedFormat(Component.literal(StringUtils.colorize(display))));
+ ClientboundSetScorePacket packet = new ClientboundSetScorePacket(id + value, this.name, line, Optional.empty(), numberFormat);
+
+ this.connection.send(packet);
+ }
+
+ private void sendDelete(String value, int line) {
+ String id = "\u00a7" + (char) ('\u0080' + line);
+
+ value = StringUtils.colorize(value);
+
+ if (value.length() > SidebarBufferImpl.NAME_LIMIT) {
+ value = value.substring(
+ SidebarBufferImpl.AFFIX_LIMIT,
+ Math.min(value.length(), SidebarBufferImpl.AFFIX_LIMIT + SidebarBufferImpl.NAME_LIMIT)
+ );
+
+ ClientboundSetPlayerTeamPacket packet = ClientboundSetPlayerTeamPacket.createRemovePacket(DedicatedServer.getServer().getScoreboard().getPlayerTeam(this.getTeamName(line)));
+ this.connection.send(packet);
+ }
+
+ ClientboundResetScorePacket packet = new ClientboundResetScorePacket(id + value, this.name);
+ this.connection.send(packet);
+ }
+
+ private String getTeamName(int line) {
+ return this.name + "/" + Integer.toUnsignedString(line, 32);
+ }
+}
diff --git a/src/main/java/gg/projecteden/parchment/sidebar/SidebarBufferUtil.java b/src/main/java/gg/projecteden/parchment/sidebar/SidebarBufferUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..599e84adf8e480508b9c2ce87baca07e163d345e
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/sidebar/SidebarBufferUtil.java
@@ -0,0 +1,19 @@
+package gg.projecteden.parchment.sidebar;
+
+import net.minecraft.network.protocol.game.ClientboundSetDisplayObjectivePacket;
+import net.minecraft.world.scores.DisplaySlot;
+import org.bukkit.craftbukkit.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+
+public class SidebarBufferUtil implements SidebarBufferUtilSpec {
+ @Override
+ public SidebarBuffer create(String name) {
+ return new SidebarBufferImpl(name);
+ }
+
+ @Override
+ public void hideSidebar(Player player) {
+ ClientboundSetDisplayObjectivePacket packet = new ClientboundSetDisplayObjectivePacket(DisplaySlot.SIDEBAR, null);
+ ((CraftPlayer) player).getHandle().connection.send(packet);
+ }
+}
diff --git a/src/main/java/gg/projecteden/parchment/util/StringUtils.java b/src/main/java/gg/projecteden/parchment/util/StringUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f8700f43e5503d5b002368fa36d8e6a7577658f
--- /dev/null
+++ b/src/main/java/gg/projecteden/parchment/util/StringUtils.java
@@ -0,0 +1,30 @@
+package gg.projecteden.parchment.util;
+
+import net.md_5.bungee.api.ChatColor;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class StringUtils {
+
+ private static final String colorChar = "§";
+ private static final String altColorChar = "&";
+ private static final String colorCharsRegex = "[" + colorChar + altColorChar + "]";
+ private static final Pattern hexPattern = Pattern.compile(colorCharsRegex + "#[a-fA-F\\d]{6}");
+
+ public static String colorize(String input) {
+ if (input == null)
+ return null;
+
+ while (true) {
+ Matcher matcher = hexPattern.matcher(input);
+ if (!matcher.find()) break;
+
+ String color = matcher.group();
+ input = input.replace(color, ChatColor.of(color.replaceFirst(colorCharsRegex, "")).toString());
+ }
+
+ return ChatColor.translateAlternateColorCodes(altColorChar.charAt(0), input);
+ }
+
+}

View File

@@ -0,0 +1,79 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Thu, 25 Jan 2024 19:59:13 -0500
Subject: [PATCH] Add Block BreakNaturally Overload
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
index 43c288a4e226060a5e0cecddd941846d29ae8025..78726d52117105ffebd9d15b407f5e529a217900 100644
--- a/src/main/java/net/minecraft/world/level/block/Block.java
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
@@ -335,15 +339,17 @@ public class Block extends BlockBehaviour implements ItemLike {
// Paper start - Properly handle xp dropping
dropResources(state, world, pos, blockEntity, entity, tool, true);
}
- public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool, boolean dropExperience) {
+ public static List<ItemEntity> dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool, boolean dropExperience) {
// Paper end - Properly handle xp dropping
if (world instanceof ServerLevel) {
+ List<ItemEntity> itemEntities = new java.util.ArrayList<>();
org.bukkit.craftbukkit.event.CraftEventFactory.callBlockDropResourcesEvent(world, pos, Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, tool)).forEach((itemstack1) -> { // Parchment
- Block.popResource(world, pos, itemstack1);
+ itemEntities.add(Block.popResourceWithReturn(world, pos, itemstack1));
});
state.spawnAfterBreak((ServerLevel) world, pos, tool, dropExperience); // Paper - Properly handle xp dropping
+ return itemEntities;
}
-
+ return new java.util.ArrayList<>();
}
public static void popResource(Level world, BlockPos pos, ItemStack stack) {
@@ -357,6 +363,17 @@ public class Block extends BlockBehaviour implements ItemLike {
}, stack);
}
+ public static ItemEntity popResourceWithReturn(Level world, BlockPos pos, ItemStack stack) {
+ double d0 = (double) EntityType.ITEM.getHeight() / 2.0D;
+ double d1 = (double) pos.getX() + 0.5D + Mth.nextDouble(world.random, -0.25D, 0.25D);
+ double d2 = (double) pos.getY() + 0.5D + Mth.nextDouble(world.random, -0.25D, 0.25D) - d0;
+ double d3 = (double) pos.getZ() + 0.5D + Mth.nextDouble(world.random, -0.25D, 0.25D);
+
+ ItemEntity itemEntity = new ItemEntity(world, d1, d2, d3, stack);
+ Block.popResource(world, () -> itemEntity, stack);
+ return itemEntity;
+ }
+
public static void popResourceFromFace(Level world, BlockPos pos, Direction direction, ItemStack stack) {
int i = direction.getStepX();
int j = direction.getStepY();
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
index 5cb69d0b822e11a99a96aef4f59986d083b079f4..f151b805763ce5fa4b9bfacb74b0152ab3a6ae5e 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
@@ -500,6 +500,11 @@ public class CraftBlock implements Block {
@Override
public boolean breakNaturally(ItemStack item, boolean triggerEffect, boolean dropExperience) {
+ return this.breakNaturally(null, item, triggerEffect, dropExperience);
+ }
+
+ @Override
+ public boolean breakNaturally(Player player, ItemStack item, boolean triggerEffect, boolean dropExperience) {
// Paper end
// Order matters here, need to drop before setting to air so skulls can get their data
net.minecraft.world.level.block.state.BlockState iblockdata = this.getNMS();
@@ -509,7 +514,12 @@ public class CraftBlock implements Block {
// Modelled off EntityHuman#hasBlock
if (block != Blocks.AIR && (item == null || !iblockdata.requiresCorrectToolForDrops() || nmsItem.isCorrectToolForDrops(iblockdata))) {
- net.minecraft.world.level.block.Block.dropResources(iblockdata, this.world.getMinecraftWorld(), this.position, this.world.getBlockEntity(this.position), null, nmsItem, false); // Paper - Properly handle xp dropping
+ List<net.minecraft.world.entity.item.ItemEntity> itemEntities = net.minecraft.world.level.block.Block.dropResources(iblockdata, this.world.getMinecraftWorld(), this.position, this.world.getBlockEntity(this.position), null, nmsItem, false);
+
+ if (player != null) {
+ new org.bukkit.event.block.BlockDropItemEvent(this, this.getState(), player, itemEntities.stream().map(i -> (org.bukkit.entity.Item) CraftEntity.getEntity((org.bukkit.craftbukkit.CraftServer) Bukkit.getServer(), i)).toList()).callEvent();
+ }
+
// Paper start - improve Block#breanNaturally
if (triggerEffect) {
if (iblockdata.getBlock() instanceof net.minecraft.world.level.block.BaseFireBlock) {

View File

@@ -1,19 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Sun, 19 Mar 2023 20:02:00 -0400
Subject: [PATCH] Return Displays in getTargetEntity
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index dcfb71b5a53df789e366fea2080921d677549a2e..755ae62d64c15358b2f88ab6471c9046ced74a66 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -3988,7 +3988,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
Vec3 direction = this.getLookAngle();
Vec3 end = start.add(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance);
- List<Entity> entityList = level.getEntities(this, getBoundingBox().expandTowards(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance).inflate(1.0D, 1.0D, 1.0D), EntitySelector.NO_SPECTATORS.and(Entity::isPickable));
+ List<Entity> entityList = level.getEntities(this, getBoundingBox().expandTowards(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance).inflate(1.0D, 1.0D, 1.0D), EntitySelector.NO_SPECTATORS.and(entity -> entity.isPickable() || entity instanceof Display));
double distance = 0.0D;
EntityHitResult result = null;

View File

@@ -1,19 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Thu, 23 Mar 2023 18:18:43 -0400
Subject: [PATCH] Make SynchedEntityData#packAll Public
diff --git a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java
index ff7ba7a161cfed7521354bc6e3f21ba0f17f3760..8d17e503894858b9e195d70a74513dee60aa3ec3 100644
--- a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java
+++ b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java
@@ -263,7 +263,7 @@ public class SynchedEntityData {
// We need to pack all as we cannot rely on "non default values" or "dirty" ones.
// Because these values can possibly be desynced on the client.
@Nullable
- private List<SynchedEntityData.DataValue<?>> packAll() {
+ public List<SynchedEntityData.DataValue<?>> packAll() {
if (this.isEmpty()) {
return null;
}

View File

@@ -0,0 +1,19 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Sat, 4 Jan 2025 19:16:06 -0500
Subject: [PATCH] Nether Portal Kick Fix
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 544882862b2248d426185dd67bd217f593caef2a..0474a5d6a35955702ba76bdc24f5c6e77e358a90 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -1793,7 +1793,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
if (this.isAffectedByBlocks()) {
AABB axisalignedbb = this.getBoundingBox().deflate(9.999999747378752E-6D);
LongSet longset = this.visitedBlocks;
- Iterator iterator = queuedCollisionChecks.iterator();
+ Iterator iterator = new ArrayList<>(queuedCollisionChecks).iterator();
while (iterator.hasNext()) {
Entity.Movement entity_b = (Entity.Movement) iterator.next();

View File

@@ -0,0 +1,43 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Blast-MC <cjblanton2@gmail.com>
Date: Thu, 9 Jan 2025 02:35:24 -0500
Subject: [PATCH] ItemStack Retain Internal Tag on Upgrade
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
index ab616f58e35458e52fb5a94e39875a188fd6a05b..4e4bc56f8ae1cd3f6ec142e505e5c9a51ff3a378 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
@@ -755,11 +755,12 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
this.setMaxDamage(maxDamage);
}
+ CompoundTag internalTag = null;
String internal = SerializableMeta.getString(map, "internal", true);
if (internal != null) {
ByteArrayInputStream buf = new ByteArrayInputStream(Base64.getDecoder().decode(internal));
try {
- CompoundTag internalTag = NbtIo.readCompressed(buf, NbtAccounter.unlimitedHeap());
+ internalTag = NbtIo.readCompressed(buf, NbtAccounter.unlimitedHeap());
this.deserializeInternal(internalTag, map);
} catch (IOException ex) {
Logger.getLogger(CraftMetaItem.class.getName()).log(Level.SEVERE, null, ex);
@@ -825,6 +826,18 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
Logger.getLogger(CraftMetaItem.class.getName()).log(Level.SEVERE, null, ex);
}
}
+
+ if (internalTag != null) {
+ if (this.customTag == null) {
+ this.customTag = new CompoundTag();
+ }
+ for (String key: internalTag.getAllKeys()) {
+ if (this.customTag.contains(key)) {
+ continue;
+ }
+ this.customTag.put(key, internalTag.get(key));
+ }
+ }
}
void deserializeInternal(CompoundTag tag, Object context) {